diff --git a/.eslintrc.json b/.eslintrc.json index 6f67564..80db758 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -1,3 +1,10 @@ { - "extends": "airbnb-base" -} \ No newline at end of file + "extends": "airbnb-base", + "env": { + "mocha": true, + "node": true + }, + "rules": { + "no-underscore-dangle": "off" + } +} diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..1ab2749 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,11 @@ +language: node_js +notifications: + slack: theselftalk:EHiDWYYgq34Y172TrHTqA16W +node_js: + - stable +install: + - npm install +script: + - npm test +after_success: + - npm run coverage diff --git a/README.md b/README.md index 743e3ed..3b07488 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,11 @@ -# Coderoom +# Coderoom [![Build Status](https://travis-ci.org/nishant-jain-94/coderoom.svg?branch=master)](https://travis-ci.org/nishant-jain-94/coderoom) [![Coverage Status](https://coveralls.io/repos/github/nishant-jain-94/coderoom/badge.svg?branch=master)](https://coveralls.io/github/nishant-jain-94/coderoom?branch=master) A Review Utility Tool for Gitlab which facilitates in code reviewing easily. ## Install ``` -sudo npm install -g coderoom +sudo npm install -g coderoom-gitlab ``` ## Command Line Usage diff --git a/bin/coderoom.js b/bin/coderoom.js index 82a2a9d..3f24ca4 100755 --- a/bin/coderoom.js +++ b/bin/coderoom.js @@ -1,15 +1,14 @@ #!/usr/bin/env node /** - * Main CLI which is used to run the reviewer. - * @author Nishant Jain + * @fileOverview Main CLI which is used to run the reviewer. */ /* eslint no-console:off */ /* eslint global-require:off */ - +const R = require('ramda'); const usage = require('../lib/cli-usage.js'); -const configInitializer = require('../lib/config/config-initializer'); +const configInitializer = require('../lib/config/config-initializer.fp'); const arg = process.argv[process.argv.length - 1]; @@ -18,22 +17,22 @@ switch (arg) { configInitializer.initializeConfig(); break; case 'members': { - const members = require('../lib/members'); - members.load().then(membersOfGroup => console.log(membersOfGroup)); + const { getCadets } = require('../lib/members.fp'); + R.call(R.composeP(console.log, getCadets)); break; } case 'clone': { - const clone = require('../lib/clone'); - clone.cloneAllAssignments(); + const { clone } = require('../lib/clone.fp'); + R.call(clone); break; } case 'generate-insights': { - const insights = require('../lib/insights'); - insights.generateInsightsAsHTML(); + const insights = require('../lib/insights.fp'); + insights.generateInsightsAsPDF(); break; } case 'open-issue': { - const issueOpener = require('../lib/open-issue'); + const issueOpener = require('../lib/open-issues.fp'); issueOpener.openIssues(); break; } diff --git a/lib/cli-usage.js b/lib/cli-usage.js index 1975a97..5317977 100644 --- a/lib/cli-usage.js +++ b/lib/cli-usage.js @@ -1,10 +1,12 @@ /** * @fileOverview Usage Guide for Classroom - * @author Nishant Jain */ const getUsage = require('command-line-usage'); +/** + * Describes the command usage guide + */ const sections = [ { header: 'Coderoom', @@ -13,13 +15,30 @@ const sections = [ { header: 'Command List', content: [ - { name: 'help', summary: 'Displays a usage guide' }, - { name: 'version', summary: 'Displays the version of the review utility' }, - { name: 'initialize', summary: 'Initialize the repository with runtime configuration for the review utility' }, - { name: 'clone', summary: 'Clones all the assignments in the local submissions folder' }, - { name: 'members', summary: 'Lists all the members under review in the coderoom' }, - { name: 'open-issue', summary: 'Opens the issue on the repository, when executed inside a submission' }, - { name: 'generate-insights', summary: 'Generates coderoom insights' }, + { + name: 'help', + summary: 'Displays a usage guide', + }, + { + name: 'initialize', + summary: 'Initialize the repository with runtime configuration for the review utility', + }, + { + name: 'clone', + summary: 'Clones all the assignments in the local submissions folder', + }, + { + name: 'members', + summary: 'Lists all the members under review in the coderoom', + }, + { + name: 'open-issue', + summary: 'Opens the issue on the repository, when executed inside a submission', + }, + { + name: 'generate-insights', + summary: 'Generates coderoom insights', + }, ], }, ]; diff --git a/lib/clone.fp.js b/lib/clone.fp.js new file mode 100644 index 0000000..354c49c --- /dev/null +++ b/lib/clone.fp.js @@ -0,0 +1,184 @@ +/** + * @fileOverview Clones the Submissions of the cadets + */ +const R = require('ramda'); +const shell = require('shelljs'); +const Progress = require('cli-progress'); +const { getCadets } = require('./members.fp'); +const { getConfig } = require('./config/config-file.fp'); +const log = require('../logger')('coderoom:clone'); + +/** + * A progress bar to show the status of completion + */ +const progressBar = new Progress.Bar( + { + stopOnComplete: true, + format: 'Cloning Assignments [{bar}] {percentage}% | ETA: {eta}s | {value}/{total}', + }, + Progress.Presets.shades_classic, +); + +/** + * Gets a Gitlab Url from the config + * and trims the protocol substring + * @param {String} url + */ +const getUrlWithNoProtocol = R.compose( + R.replace(/^https?:\/\//i, ''), + R.slice(0, -1), + R.prop('GITLAB_URL'), + getConfig, +); + +/** + * Builds a git clone command for a given url, + * assignment and a member. This function is + * curried so that it can be partially + * applied. + * @param {String} url + * @param {String} assignment + * @param {String} member + */ +const buildCloneCmd = + R.curry((url, assignment, member) => + `git clone git@${url}:${member}/${assignment}.git ${member}`); + +/** + * Builds a clone command for a given assignment and member + * over GitlabUrl fetched from the config + * @param {String} assignment + * @param {String} member + */ +const buildCloneCmdWithGitlabUrl = R.call(buildCloneCmd, R.call(getUrlWithNoProtocol)); + +/** + * Gets the name of the Assignment from the config. + */ +const getAssignment = R.compose(R.prop('ASSIGNMENT'), getConfig); + +/** + * Build a clone command for a given member + * over the GitlabUrl and Assignment from the config + * @param {String} Member + */ +const buildCloneCmdWithGitlabUrlOverAssignment = R.call( + buildCloneCmdWithGitlabUrl, + R.call(getAssignment), +); + +/** + * Deletes All the directories(repos) in the current working directory. + */ +const deleteExistingRepos = () => shell.rm('-Rf', '*/'); + + +/** + * Initializes the Progress Bar to the total length of the members. + * And starts at 0. + * @param {*} members + */ +const startProgressBar = members => progressBar.start(members.length, 0); + +/** + * Updates the progress bar incrementally + */ +const incrementProgressBar = () => progressBar.increment(); + +/** + * Promisfies the exec command on shelljs + * @param {*} options + * @param {*} command + */ +const promisifiedShellExecCmd = (options, command) => new Promise((resolve, reject) => { + shell.exec(command, options, (code, stdout, stderr) => { + if (!code) { + resolve(code); + } else { + const error = { + command, + message: R.replace(/(\r\n|\n|\r)/gm, '', stderr), + }; + reject(error); + } + }); +}).catch(err => log.error(err)); + +/** + * Curries the exec function of the shelljs library by reversing + * the order of the variables. + * @param {object} options + * @param {string} command + */ +const curriedExecCommand = R.curry(promisifiedShellExecCmd); + +/** + * Given a member it clones the assignment in the current working directory + * @param {String} username + */ +const cloneRepo = R.compose( + R.composeP(incrementProgressBar, curriedExecCommand({ silent: true, async: true })), + buildCloneCmdWithGitlabUrlOverAssignment, +); + +/** + * Clones all the assignments of the cadets + * in the current working directory + * @param {Array} Members + */ +const cloneAllAssignments = R.compose( + R.map(cloneRepo), + R.flatten, + R.takeLast(1), + R.juxt([startProgressBar, R.identity]), + R.pluck('username'), +); + +/** + * Checks if git is installed + */ +const checkIfGitExists = () => !shell.which('git').code; + +/** + * On calling this method it throws an error that Git doesn't exists. + */ +const throwGitDoesntExists = () => { + throw Error("package 'git' could not be found. Coderoom depends on 'GIT'"); +}; + +/** + * An entry point to clone all Assignments + */ +const clone = R.ifElse( + checkIfGitExists, + R.compose( + R.composeP( + Promise.all.bind(Promise), + cloneAllAssignments, + getCadets, + ), + deleteExistingRepos, + ), + throwGitDoesntExists, +); + +module.exports = { + clone, + __private__: { + progressBar, + cloneRepo, + getAssignment, + buildCloneCmd, + startProgressBar, + checkIfGitExists, + curriedExecCommand, + deleteExistingRepos, + cloneAllAssignments, + getUrlWithNoProtocol, + throwGitDoesntExists, + incrementProgressBar, + promisifiedShellExecCmd, + buildCloneCmdWithGitlabUrl, + buildCloneCmdWithGitlabUrlOverAssignment, + }, +}; diff --git a/lib/config/.reviewrc.global b/lib/config/.reviewrc.global new file mode 100644 index 0000000..84ebcde --- /dev/null +++ b/lib/config/.reviewrc.global @@ -0,0 +1,2 @@ +REVIEWERS_NAME: 'Nishant Jain' +'https://gitlab-cts.stackroute.in/': VBJ1D55fncUyy1xMMsWT diff --git a/lib/config/config-file.fp.js b/lib/config/config-file.fp.js new file mode 100644 index 0000000..a343db7 --- /dev/null +++ b/lib/config/config-file.fp.js @@ -0,0 +1,151 @@ +/** + * @fileOverview Helper to locate and load configuration files + */ + +const R = require('ramda'); +const YAML = require('yamljs'); +const { existsSync, writeFileSync } = require('fs'); +const { getPathToGlobalConfig, getPathToLocalConfig } = require('./file-name.fp.js'); + +/** + * Loads the configuration at the given config path, if the file exists. + * If the config file doesnt exists then it runs the errorHandler + * @param {function} errorHandler + * @param {function} configFile + * @returns {Object | Error} + */ +const loadConfig = (errorHandler, configFile) => + (existsSync(configFile) ? YAML.load(configFile) : errorHandler()); + +/** + * Curried Load Config Function + * @param {function} errorHandler + * @returns {fn(configFilePath)} returns a fn which accepts a config file path + */ +const curriedLoadConfig = R.curry(loadConfig); + +/** + * Throws file not found error + * @returns { Error } + */ +const throwConfigFileNotFound = () => { + const errorMessage = 'The configuration file .reviewrc cannot be found. Use \'coderoom initialize\' command to initialize coderoom in the folder'; + throw Error(errorMessage); +}; + +/** + * Returns empty object + * @returns { Object } + */ +const returnEmptyObject = () => ({}); + +/** + * Loads the config defaulting to an Error. + * The error handler basically throws error if the config file is not found. + * @param {string} configFilePath + * @returns {Object | Error} Returns a config object or an error. + */ +const loadConfigDefaultingToError = curriedLoadConfig(throwConfigFileNotFound); + +/** + * Loads the config file defaulting to an empty object + * The error handler basically returns an empty object, if the file is not found. + * @param {string} configFilePath + * @returns {Function(configFilePath)} Returns an function which returna an object + * if the passed config file path is not found. + */ +const loadConfigDefaultingToEmptyObject = curriedLoadConfig(returnEmptyObject); + +/** + * Gets a config from the local config file path + * @returns {Object | Error} returns a config object + */ +const getConfig = R.compose(loadConfigDefaultingToError, getPathToLocalConfig); + +/** + * Gets a global config from the global config file path + * @returns {Object} returns an config Object + */ +const getGlobalConfig = R.compose(loadConfigDefaultingToEmptyObject, getPathToGlobalConfig); + +/** + * Curries Write File Sync + * @param {string} fileName + * @returns {function(data)} A function which accepts data to be written to the file. + */ +const curriedWriteFileSync = R.curry((file, data) => writeFileSync(file, data)); + +/** + * Writes to Local Config File + * @param {string} data Takes in data to be written to the local config file. + */ +const writeToLocalConfig = R.call(R.compose(curriedWriteFileSync, getPathToLocalConfig)); + +/** + * Writes to Local Config File + * @param {string} data Takes in data to be written to the global config file. + */ +const writeToGlobalConfig = R.call(R.compose(curriedWriteFileSync, getPathToGlobalConfig)); + +/** + * Takes an object and stringifies into YAML format with 2 spaces. + * @param {Object} config + * @returns {String} returns an yaml stringified string + */ +const yamlStringifyTo2Spaces = config => YAML.stringify(config, 2); + +/** + * Converts the local config object to the global config object + * @param {Object} localConfig + * @returns {Object} Global Config Object + */ +const transformToGlobalConfig = (config) => { + const transformedConfig = {}; + transformedConfig[config.GITLAB_URL] = R.prop('API_TOKEN', config); + transformedConfig.REVIEWERS_NAME = R.prop('REVIEWERS_NAME', config); + return transformedConfig; +}; + +/** + * Takes the new config object and assigns it to the old config object + * @param {Object} config + * @return {Object} returns an updated config object + */ +const updateGlobalConfig = config => Object.assign({}, getGlobalConfig(), config); + +/** + * Sets the local config in the local config file path + * @param {Object} config inputs a config object to be written to the local config file path + */ +const setConfig = R.compose(writeToLocalConfig, yamlStringifyTo2Spaces); + +/** + * Sets the Global Config in the Global Config File Path + * @param {Object} config Inputs a config object to be written to the global config file path + */ +const setGlobalConfig = R.compose( + writeToGlobalConfig, + yamlStringifyTo2Spaces, + updateGlobalConfig, + transformToGlobalConfig, +); + +module.exports = { + getConfig, + setConfig, + getGlobalConfig, + setGlobalConfig, + __private__: { + transformToGlobalConfig, + yamlStringifyTo2Spaces, + writeToGlobalConfig, + writeToLocalConfig, + curriedWriteFileSync, + loadConfigDefaultingToEmptyObject, + loadConfigDefaultingToError, + returnEmptyObject, + throwConfigFileNotFound, + curriedLoadConfig, + loadConfig, + }, +}; diff --git a/lib/config/config-file.js b/lib/config/config-file.js index 0e37259..a1b8902 100644 --- a/lib/config/config-file.js +++ b/lib/config/config-file.js @@ -1,6 +1,5 @@ /** * @fileOverview Helper to locate and load configuration files - * @author Nishant Jain */ const fs = require('fs'); diff --git a/lib/config/config-initializer.fp.js b/lib/config/config-initializer.fp.js new file mode 100644 index 0000000..41194c8 --- /dev/null +++ b/lib/config/config-initializer.fp.js @@ -0,0 +1,77 @@ +/** + * @fileOverview Config initialization wizard + */ + +const R = require('ramda'); +const inquirer = require('inquirer'); +const listGroups = require('../groups.fp'); +const { getGlobalConfig, setConfig, setGlobalConfig } = require('./config-file.fp'); +const log = require('../../logger')('Config Initializer'); + +this._getQuestions = () => { + const questions = [ + { + type: 'input', + name: 'REVIEWERS_NAME', + message: 'What is your Name?', + default: getGlobalConfig().REVIEWERS_NAME ? getGlobalConfig().REVIEWERS_NAME : 'Anthony Gonsalvis', + }, + { + type: 'input', + name: 'GITLAB_URL', + message: 'What is the url to the Gitlab Server?', + default: 'https://gitlab-cts.stackroute.in/', + }, + { + type: 'input', + name: 'API_TOKEN', + message: 'What is your Gitlab API Token?', + default: answers => (getGlobalConfig()[answers.GITLAB_URL] ? getGlobalConfig()[answers.GITLAB_URL] : ''), + validate: input => (!input ? 'API Token cannot be undefined' : true), + }, + { + type: 'checkbox', + name: 'INCLUDED_GROUPS', + message: 'Select all the teams which you would want to review?', + choices: async (answers) => { + let groups = []; + try { + const credentials = { url: answers.GITLAB_URL, token: answers.API_TOKEN }; + groups = await listGroups(credentials); + } catch (err) { + log.error(err); + } + return groups; + }, + when: (answers => !answers.api_token), + }, + { + type: 'checkbox', + name: 'EXCLUDED_GROUPS', + message: 'Select all the teams where mentors could be found?', + choices: async (answers) => { + const credentials = { url: answers.GITLAB_URL, token: answers.API_TOKEN }; + const groups = await listGroups(credentials); + return groups; + }, + when: (answers => !answers.api_token), + }, + { + type: 'input', + name: 'ASSIGNMENT', + message: 'What is the name of the assignment?', + validate: input => (!input ? 'Assignment Name cannot be empty' : true), + }, + ]; + return questions; +}; + +/** + * Ask questions on console + * @returns {Promise} The Promise with the results of the questions + */ +this._setConfigs = R.juxt([setConfig, setGlobalConfig]); +this._promptQuestions = R.compose(inquirer.prompt, this._getQuestions); +this.initializeConfig = () => R.call(R.composeP(this._setConfigs, this._promptQuestions)); + +module.exports = this; diff --git a/lib/config/config-initializer.js b/lib/config/config-initializer.js index b706fc9..1b63439 100644 --- a/lib/config/config-initializer.js +++ b/lib/config/config-initializer.js @@ -1,6 +1,5 @@ /** * @fileOverview Config initialization wizard - * @author Nishant Jain */ const fs = require('fs'); @@ -57,7 +56,7 @@ const promptQuestions = () => { }, { type: 'checkbox', - name: 'GROUPS', + name: 'INCLUDED_GROUPS', message: 'Select all the teams which you would want to review?', choices: async (answers) => { const credentials = { url: answers.GITLAB_URL, token: answers.API_TOKEN }; @@ -68,7 +67,7 @@ const promptQuestions = () => { }, { type: 'checkbox', - name: 'MENTORS', + name: 'EXCLUDED_GROUPS', message: 'Select all the teams where mentors could be found?', choices: async (answers) => { const credentials = { url: answers.GITLAB_URL, token: answers.API_TOKEN }; diff --git a/lib/config/file-name.fp.js b/lib/config/file-name.fp.js new file mode 100644 index 0000000..f4bbb63 --- /dev/null +++ b/lib/config/file-name.fp.js @@ -0,0 +1,26 @@ +/** + * @fileOverview Returns path to local and global config for the coderoom + */ + +const path = require('path'); + +const cwd = process.cwd(); +const CONFIG_FILE_NAME = '.reviewrc'; +const GLOBAL_CONFIG_FILE_NAME = '.reviewrc.global'; + +/** + * Returns the local config used for coderoom + * @returns {string} path + */ +const getPathToLocalConfig = () => path.join(cwd, CONFIG_FILE_NAME); + +/** + * Returns the global config used for coderoom + * @returns {string} path + */ +const getPathToGlobalConfig = () => path.join(__dirname, GLOBAL_CONFIG_FILE_NAME); + +module.exports = { + getPathToLocalConfig, + getPathToGlobalConfig, +}; diff --git a/lib/config/file-name.js b/lib/config/file-name.js index eb036ec..abf6cac 100644 --- a/lib/config/file-name.js +++ b/lib/config/file-name.js @@ -1,4 +1,7 @@ const CONFIG_FILE_NAME = '.reviewrc'; const GLOBAL_CONFIG_FILE_NAME = '.reviewrc.global'; -module.exports = { CONFIG_FILE_NAME, GLOBAL_CONFIG_FILE_NAME }; +module.exports = { + CONFIG_FILE_NAME, + GLOBAL_CONFIG_FILE_NAME, +}; diff --git a/lib/groups.fp.js b/lib/groups.fp.js new file mode 100644 index 0000000..30b5a6a --- /dev/null +++ b/lib/groups.fp.js @@ -0,0 +1,53 @@ +/** + * @fileOverview List all the groups on Gitlab + * @author Nishant Jain + */ + +const R = require('ramda'); +const Gitlab = require('gitlab'); +// const { promisify } = require('util'); +// const log = require('../logger')('coderoom:groups'); + +/** + * Given gitlab credentials creates a new Gitlab instance + * @param {*} credentials + */ +const getGitlabInstance = credentials => new Gitlab(credentials); + +/** + * Given a gitlab instance it fetches all the user groups + * @param {*} gitlab + */ +const listAllGroups = gitlab => new Promise((resolve, reject) => { + gitlab.groups.all(R.ifElse( + R.not, + () => reject(new Error('No Groups found')), + resolve, + )); +}); + +/** + * Given a group it transforms it to a choice + * @param {*} group + */ +const transformGroupsAsChoice = group => ({ name: group.name, value: group.id }); + +/** + * Gets all the groups as choices. + */ +const getAllGroupsAsChoices = R.compose( + R.composeP( + R.compose( + Promise.resolve.bind(Promise), + R.map(transformGroupsAsChoice), + ), + listAllGroups, + ), + getGitlabInstance, +); + +/** + * Memoizes listAllGroups so that repeated calls to listAllGroups + * returns groups from cache. + */ +module.exports = getAllGroupsAsChoices; diff --git a/lib/insights.fp.js b/lib/insights.fp.js new file mode 100644 index 0000000..9052e99 --- /dev/null +++ b/lib/insights.fp.js @@ -0,0 +1,119 @@ +/** + * @fileOverview Generates Insights as PDF document + */ +const R = require('ramda'); +const fs = require('fs'); +const path = require('path'); +const pdf = require('html-pdf'); +const shell = require('shelljs'); +const { getCadets } = require('./members.fp'); +const dateTime = require('date-time'); +const Mustache = require('mustache'); +const { getConfig } = require('./config/config-file.fp'); + +/** + * Gets the insights template from the defined path + * @returns {string} templateString + */ +const getInsightsTemplate = () => fs.readFileSync(path.join(__dirname, '../reports/templates/insights.mst'), 'utf8'); + +/** + * Gets the name of the assignment from the config + * @returns {string} assignmentName + */ +const getAssignment = R.compose(R.prop('ASSIGNMENT'), getConfig); + +/** + * Gets the list of cloned repositories + * @returns {Array} listOfClonedRepositories + */ +const getClonedRepos = () => shell.ls('-d', '*/').map(assignment => assignment).map(s => s.substring(0, s.length - 1)); + +/** + * Given a list of members it calculates the difference + * of members between both the list + * @param {Array} + * @returns {Array} + */ +const getDiffBetCadetsAndClonedRepos = R.composeP( + R.difference(R.__, R.call(getClonedRepos)), + R.map(R.prop('username')), + getCadets, +); + +/** + * Summarized the submission information + * @returns {Promise} + */ +const getSubmissionsInfo = async () => { + const defaultedMembers = await R.call(getDiffBetCadetsAndClonedRepos); + const submittedMembers = getClonedRepos(); + const submissionInfo = { + totalMembers: R.add(R.length(defaultedMembers), R.length(submittedMembers)), + totalDefaultedMembers: R.length(defaultedMembers), + totalSubmittedMembers: R.length(submittedMembers), + defaultedMembers, + submittedMembers, + assignmentName: R.call(getAssignment), + generatedOn: dateTime(), + }; + return submissionInfo; +}; + +/** + * Curries the to_html method of the Mustache. + * Takes a Mustache Template and applies the object + * onto it. + * @param {mustacheTemplate} + * @param {Object} + * @returns {html} HTML as string + */ +const curriedTemplateToHtml = R.curry((temp, data) => Mustache.to_html(temp, data)); + +/** + * Given submission info applies the submission info + * to the insights template. + * @param {SubmissionInfo} + */ +const insightsToHtml = R.call(R.compose(curriedTemplateToHtml, getInsightsTemplate)); + +/** + * Generates Insight as HTML + */ +const generateInsightsAsHTML = R.composeP( + R.compose(Promise.resolve.bind(Promise), insightsToHtml), + getSubmissionsInfo, +); + +/** + * Creates a pdf given an html string + * @param {string} outputPath Path where pdf is to be generated + * @param {string} htmlString + */ +const createPDF = R.curry((outputPath, htmlString) => + new Promise((resolve, reject) => { + pdf.create(htmlString) + .toFile(outputPath, (err, res) => { + if (err) { + reject(err); + } else { + resolve(res); + } + }); + })); + +/** + * Generates Insights as PDF + */ +const generateInsightsAsPDF = R.composeP( + R.call(createPDF, path.join(process.cwd(), 'insights.pdf')), + generateInsightsAsHTML, +); + +module.exports = { + generateInsightsAsPDF, + __private__: { + getSubmissionsInfo, + createPDF, + }, +}; diff --git a/lib/members.fp.js b/lib/members.fp.js new file mode 100644 index 0000000..70c9fb3 --- /dev/null +++ b/lib/members.fp.js @@ -0,0 +1,83 @@ +/** + * @fileOverview Loads all the Members of the group + * @author Nishant Jain + */ +const R = require('ramda'); +const request = require('request-promise-native'); +const { getConfig } = require('./config/config-file.fp'); + +/** + * Makes a request with the given parameters + * @param {Options} reqOptions + * @returns {Future} + */ +const makeRequest = reqOptions => request(reqOptions).catch(err => console.log(err)); + +/** + * Build request options + * @param {*} property + * @param {*} config + */ +const buildReqOptsWith = (property, config) => R.map(groupId => ({ + uri: `${config.GITLAB_URL}api/v3/groups/${groupId}/members`, + qs: { + private_token: config.API_TOKEN, + per_page: 1000, + }, + json: true, +}), config[property]); + +/** + * Curried Version of `buildReqOptsWith` + */ +const curriedBuildReqOptsWith = R.curry(buildReqOptsWith); +const buildReqOptsWithInclGroups = curriedBuildReqOptsWith('INCLUDED_GROUPS'); +const buildReqOptsWithExclGroups = curriedBuildReqOptsWith('EXCLUDED_GROUPS'); + +/** + * Given a group it fetches all the members from it + * @param {*} group + */ +const fetchMembers = R.compose(Promise.all.bind(Promise), R.map(makeRequest)); + +/** + * Compares two objects bases on the property username + * @param {Object} a + * @param {Object} b + */ + +const compareByUsername = (a, b) => a.username === b.username; + +/** + * Takes an array and resolves to a flattened array. + * @param {Promise} + */ +const flattenArray = R.compose(Promise.resolve.bind(Promise), R.flatten); + +/** + * Given a set of members removes members to be excluded + * @param {*} members + */ +const removeExcludedMembers = members => R.call(R.compose( + R.composeP( + Promise.resolve.bind(Promise), + R.differenceWith(compareByUsername, members), + flattenArray, + fetchMembers, + ), + buildReqOptsWithExclGroups, + getConfig, +)); + +/** + * Gets cadets from the gitlab + */ +const getCadets = R.compose( + R.composeP(removeExcludedMembers, flattenArray, fetchMembers), + buildReqOptsWithInclGroups, + getConfig, +); + +module.exports = { + getCadets, +}; diff --git a/lib/members.js b/lib/members.js index 369c921..b33325c 100644 --- a/lib/members.js +++ b/lib/members.js @@ -1,26 +1,21 @@ /** * @fileOverview Loads all the Members of the group - * @author Nishant Jain */ const _ = require('lodash'); const request = require('request-promise'); const config = require('./config/config-file'); -const { - API_TOKEN, GITLAB_URL, GROUPS, MENTORS, -} = config.load(); - /** * Get all the members of the Group * @param {[type]} groupId Refers to the Group on Gitlab * @return {[Members]} Returns a list of Members present in a Group */ -const getMembersOfGroupAsync = async (groupId) => { +const getMembersOfGroupAsync = async (gitlabUrl, apiToken, groupId) => { const options = { - uri: `${GITLAB_URL}/api/v3/groups/${groupId}/members`, + uri: `${gitlabUrl}/api/v3/groups/${groupId}/members`, qs: { - private_token: API_TOKEN, + private_token: apiToken, per_page: 1000, }, json: true, @@ -35,9 +30,18 @@ const getMembersOfGroupAsync = async (groupId) => { * @return {[Members]} Refers to all the members in all the groups */ const load = async () => { - const membersOfGroup = await Promise.all(GROUPS.map(getMembersOfGroupAsync)); + const { + API_TOKEN, + GITLAB_URL, + INCLUDED_GROUPS, + EXCLUDED_GROUPS, + } = config.load(); + const membersOfGroup = await + Promise.all(INCLUDED_GROUPS.map(getMembersOfGroupAsync.bind(null, GITLAB_URL, API_TOKEN))); const members = [].concat(...membersOfGroup); - const mentorsGroup = await Promise.all(MENTORS.map(getMembersOfGroupAsync)); + // console.log(members); + const mentorsGroup = await + Promise.all(EXCLUDED_GROUPS.map(getMembersOfGroupAsync.bind(null, GITLAB_URL, API_TOKEN))); const mentors = [].concat(...mentorsGroup); const cadets = _.differenceBy(members, mentors, 'username'); return cadets; diff --git a/lib/open-issue.js b/lib/open-issue.js index 0d4258b..0c96895 100644 --- a/lib/open-issue.js +++ b/lib/open-issue.js @@ -1,3 +1,6 @@ +/** + * @fileOverview Open Issue Page on Gitlab + */ const opn = require('opn'); const shelljs = require('shelljs'); diff --git a/lib/open-issues.fp.js b/lib/open-issues.fp.js new file mode 100644 index 0000000..45fdb8b --- /dev/null +++ b/lib/open-issues.fp.js @@ -0,0 +1,41 @@ +/** + * @fileOverview Opens the issues page of the assignment of the current user. + */ +const R = require('ramda'); +const opn = require('opn'); +const shelljs = require('shelljs'); + +/** + * Gets the remote origin from the assignment + */ +const getRemoteOriginOfAssignment = () => shelljs.exec('git config --get remote.origin.url', { silent: true }).stdout; + +/** + * Transform the ssh origin to a url + * pointing to the new issues page of + * the current assignment + * @param {string} origin + * @returns {string} urlToIssuesPage + */ +const transformRemoteOriginToUrl = origin => `http://${origin.split('@')[1].replace(':', '/').replace('.git', '')}/issues/new`; + +/** + * Curries the opn function and + * reverses the argument + * @param {target} + * @param {options} + */ +const curriedOpn = R.curry((options, target) => opn(target, options)); + +/** + * Gets the git's remote origin and opens the issues page + */ +const openIssues = R.compose( + R.call(curriedOpn, { wait: false }), + transformRemoteOriginToUrl, + getRemoteOriginOfAssignment, +); + +module.exports = { + openIssues, +}; diff --git a/logger/index.js b/logger/index.js new file mode 100644 index 0000000..5f3ae51 --- /dev/null +++ b/logger/index.js @@ -0,0 +1,3 @@ +const logger = require('./logger'); + +module.exports = logger; diff --git a/logger/logger.js b/logger/logger.js new file mode 100644 index 0000000..19a8816 --- /dev/null +++ b/logger/logger.js @@ -0,0 +1,6 @@ +const bunyan = require('bunyan'); +const bformat = require('bunyan-format'); + +const formatOut = bformat({ outputMode: 'short', levelInString: true }); + +module.exports = name => bunyan.createLogger({ name, stream: formatOut }); diff --git a/package-lock.json b/package-lock.json index 02a41cc..1ef980b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,18 +1,20 @@ { "name": "coderoom-gitlab", - "version": "1.0.0", + "version": "1.0.1", "lockfileVersion": 1, "requires": true, "dependencies": { "acorn": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.2.1.tgz", - "integrity": "sha512-jG0u7c4Ly+3QkkW18V+NRDN+4bWHdln30NL1ZL2AvFZZmQe/BfopYCtghCKKVBUSetZ4QKcyA0pY6/4Gw8Pv8w==" + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.4.1.tgz", + "integrity": "sha512-XLmq3H/BVvW6/GbxKryGxWORz1ebilSsUDlyC27bXhWGWAZWkGwS6FLHjOlwFXNFoWFQEO/Df4u0YYd0K3BQgQ==", + "dev": true }, "acorn-jsx": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", + "dev": true, "requires": { "acorn": "3.3.0" }, @@ -20,14 +22,15 @@ "acorn": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", - "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=" + "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", + "dev": true } } }, "ajv": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.1.tgz", - "integrity": "sha1-s4u4h22ehr7plJVqBOch6IskjrI=", + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", "requires": { "co": "4.6.0", "fast-deep-equal": "1.0.0", @@ -38,7 +41,8 @@ "ajv-keywords": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz", - "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=" + "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=", + "dev": true }, "ansi-escape-sequences": { "version": "4.0.0", @@ -56,15 +60,24 @@ "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true }, "ansi-styles": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", - "requires": { - "color-convert": "1.9.1" - } + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "ansicolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.2.1.tgz", + "integrity": "sha1-vgiVmQl7dKXJxKhKDNvNtivYeu8=" + }, + "ansistyles": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/ansistyles/-/ansistyles-0.1.3.tgz", + "integrity": "sha1-XeYEFb2gcbs3EnhUyGT0GyMlRTk=" }, "argparse": { "version": "1.0.9", @@ -86,6 +99,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, "requires": { "array-uniq": "1.0.3" } @@ -93,12 +107,14 @@ "array-uniq": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true }, "arrify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=" + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true }, "asn1": { "version": "0.2.3", @@ -129,21 +145,18 @@ "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dev": true, "requires": { "chalk": "1.1.3", "esutils": "2.0.2", "js-tokens": "3.0.2" }, "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" - }, "chalk": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, "requires": { "ansi-styles": "2.2.1", "escape-string-regexp": "1.0.5", @@ -151,22 +164,375 @@ "strip-ansi": "3.0.1", "supports-color": "2.0.0" } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "2.1.1" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" } } }, + "babel-core": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.0.tgz", + "integrity": "sha1-rzL3izGm/O8RnIew/Y2XU/A6C7g=", + "dev": true, + "requires": { + "babel-code-frame": "6.26.0", + "babel-generator": "6.26.1", + "babel-helpers": "6.24.1", + "babel-messages": "6.23.0", + "babel-register": "6.26.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "convert-source-map": "1.5.1", + "debug": "2.6.9", + "json5": "0.5.1", + "lodash": "4.17.5", + "minimatch": "3.0.4", + "path-is-absolute": "1.0.1", + "private": "0.1.8", + "slash": "1.0.0", + "source-map": "0.5.7" + }, + "dependencies": { + "lodash": { + "version": "4.17.5", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz", + "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==", + "dev": true + } + } + }, + "babel-generator": { + "version": "6.26.1", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", + "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", + "dev": true, + "requires": { + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "detect-indent": "4.0.0", + "jsesc": "1.3.0", + "lodash": "4.17.5", + "source-map": "0.5.7", + "trim-right": "1.0.1" + }, + "dependencies": { + "lodash": { + "version": "4.17.5", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz", + "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==", + "dev": true + } + } + }, + "babel-helper-call-delegate": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", + "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", + "dev": true, + "requires": { + "babel-helper-hoist-variables": "6.24.1", + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", + "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", + "dev": true, + "requires": { + "babel-helper-get-function-arity": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-get-function-arity": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", + "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-hoist-variables": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", + "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-regex": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz", + "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "lodash": "4.17.5" + } + }, + "babel-helpers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", + "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-messages": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-block-scoping": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", + "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "lodash": "4.17.5" + }, + "dependencies": { + "lodash": { + "version": "4.17.5", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz", + "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==", + "dev": true + } + } + }, + "babel-plugin-transform-es2015-destructuring": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", + "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", + "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", + "dev": true, + "requires": { + "babel-helper-function-name": "6.24.1", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-modules-commonjs": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz", + "integrity": "sha1-DYOUApt9xqvhqX7xgeAHWN0uXYo=", + "dev": true, + "requires": { + "babel-plugin-transform-strict-mode": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-parameters": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", + "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", + "dev": true, + "requires": { + "babel-helper-call-delegate": "6.24.1", + "babel-helper-get-function-arity": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-shorthand-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", + "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-spread": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", + "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-sticky-regex": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", + "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", + "dev": true, + "requires": { + "babel-helper-regex": "6.26.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-unicode-regex": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", + "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", + "dev": true, + "requires": { + "babel-helper-regex": "6.26.0", + "babel-runtime": "6.26.0", + "regexpu-core": "2.0.0" + } + }, + "babel-plugin-transform-strict-mode": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", + "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-preset-es2015-node": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-preset-es2015-node/-/babel-preset-es2015-node-6.1.1.tgz", + "integrity": "sha1-YLIxVwJLDP6/OmNVTLBe4DW05V8=", + "dev": true, + "requires": { + "babel-plugin-transform-es2015-destructuring": "6.23.0", + "babel-plugin-transform-es2015-function-name": "6.24.1", + "babel-plugin-transform-es2015-modules-commonjs": "6.26.0", + "babel-plugin-transform-es2015-parameters": "6.24.1", + "babel-plugin-transform-es2015-shorthand-properties": "6.24.1", + "babel-plugin-transform-es2015-spread": "6.22.0", + "babel-plugin-transform-es2015-sticky-regex": "6.24.1", + "babel-plugin-transform-es2015-unicode-regex": "6.24.1", + "semver": "5.5.0" + } + }, + "babel-register": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", + "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", + "dev": true, + "requires": { + "babel-core": "6.26.0", + "babel-runtime": "6.26.0", + "core-js": "2.5.3", + "home-or-tmp": "2.0.0", + "lodash": "4.17.5", + "mkdirp": "0.5.1", + "source-map-support": "0.4.18" + } + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "2.5.3", + "regenerator-runtime": "0.11.1" + } + }, + "babel-template": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", + "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "lodash": "4.17.5" + }, + "dependencies": { + "lodash": { + "version": "4.17.5", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz", + "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==", + "dev": true + } + } + }, + "babel-traverse": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", + "dev": true, + "requires": { + "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.9", + "globals": "9.18.0", + "invariant": "2.2.2", + "lodash": "4.17.5" + }, + "dependencies": { + "lodash": { + "version": "4.17.5", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz", + "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==", + "dev": true + } + } + }, + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "esutils": "2.0.2", + "lodash": "4.17.5", + "to-fast-properties": "1.0.3" + }, + "dependencies": { + "lodash": { + "version": "4.17.5", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz", + "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==", + "dev": true + } + } + }, + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "dev": true + }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", @@ -203,16 +569,44 @@ "concat-map": "0.0.1" } }, + "browser-stdout": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", + "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", + "dev": true + }, "builtin-modules": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", "dev": true }, + "bunyan": { + "version": "1.8.12", + "resolved": "https://registry.npmjs.org/bunyan/-/bunyan-1.8.12.tgz", + "integrity": "sha1-8VDw9nSKvdcq6uhPBEA74u8RN5c=", + "requires": { + "dtrace-provider": "0.8.6", + "moment": "2.20.1", + "mv": "2.1.1", + "safe-json-stringify": "1.0.4" + } + }, + "bunyan-format": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/bunyan-format/-/bunyan-format-0.2.1.tgz", + "integrity": "sha1-pLOw2ABwqGUnlBcmnj8A/wL7y0c=", + "requires": { + "ansicolors": "0.2.1", + "ansistyles": "0.1.3", + "xtend": "2.1.2" + } + }, "caller-path": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", + "dev": true, "requires": { "callsites": "0.2.0" } @@ -220,7 +614,8 @@ "callsites": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", - "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=" + "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", + "dev": true }, "caseless": { "version": "0.12.0", @@ -235,6 +630,24 @@ "ansi-styles": "3.2.0", "escape-string-regexp": "1.0.5", "supports-color": "4.5.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", + "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", + "requires": { + "color-convert": "1.9.1" + } + }, + "supports-color": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "requires": { + "has-flag": "2.0.0" + } + } } }, "chardet": { @@ -245,7 +658,8 @@ "circular-json": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", - "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==" + "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", + "dev": true }, "cli-character-set": { "version": "0.1.0", @@ -260,6 +674,14 @@ "restore-cursor": "1.0.1" } }, + "cli-progress": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/cli-progress/-/cli-progress-1.7.0.tgz", + "integrity": "sha512-YPymXb0VtiOZf4DwA91JiYT1jDFuoq7iZcA2KpSMqEHnQQDarHJtN1hUOk/oHiDRShw1pWy6SIyHJgb5tqpV9A==", + "requires": { + "colors": "1.1.2" + } + }, "cli-progress-bar": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cli-progress-bar/-/cli-progress-bar-1.0.1.tgz", @@ -294,6 +716,11 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, + "colors": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", + "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=" + }, "combined-stream": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", @@ -313,9 +740,9 @@ } }, "command-line-usage": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-4.0.2.tgz", - "integrity": "sha512-PpgwSX9SSZZDSTMXmVttJ9w8szzBgMma0bsVpiRfdXljLOBSmJvvxNTAP7twHIsnd6i6jEbcX/JpmAMC+FCbSQ==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-4.1.0.tgz", + "integrity": "sha512-MxS8Ad995KpdAC0Jopo/ovGIroV/m0KHwzKfXxKag6FHOkGsH8/lv5yjgablcRxCJJC0oJeUMuO/gmaq+Wq46g==", "requires": { "ansi-escape-sequences": "4.0.0", "array-back": "2.0.0", @@ -323,6 +750,12 @@ "typical": "2.6.1" } }, + "commander": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", + "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", + "dev": true + }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -338,21 +771,64 @@ "typedarray": "0.0.6" } }, + "concurrify": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/concurrify/-/concurrify-1.0.3.tgz", + "integrity": "sha512-JD6d0+A/M/IpkLVwv0lw3+tQmEbRgHRXoWs4A46zTa1oDZ2Y28HVWs+gwSzbxZ7+ZPlT4pj7XREI7Yt0U815sQ==", + "requires": { + "sanctuary-type-classes": "8.1.0", + "sanctuary-type-identifiers": "2.0.1" + } + }, "contains-path": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", "dev": true }, + "convert-source-map": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", + "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=", + "dev": true + }, + "core-js": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.3.tgz", + "integrity": "sha1-isw4NFgk8W2DZbfJtCWRaOjtYD4=", + "dev": true + }, "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, + "coveralls": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-3.0.0.tgz", + "integrity": "sha512-ZppXR9y5PraUOrf/DzHJY6gzNUhXYE3b9D43xEXs4QYZ7/Oe0Gy0CS+IPKWFfvQFXB3RG9QduaQUFehzSpGAFw==", + "dev": true, + "requires": { + "js-yaml": "3.10.0", + "lcov-parse": "0.0.10", + "log-driver": "1.2.7", + "minimist": "1.2.0", + "request": "2.83.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, "cross-spawn": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, "requires": { "lru-cache": "4.1.1", "shebang-command": "1.2.0", @@ -409,12 +885,14 @@ "deep-is": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true }, "del": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", + "dev": true, "requires": { "globby": "5.0.0", "is-path-cwd": "1.0.0", @@ -430,14 +908,42 @@ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" }, + "denque": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/denque/-/denque-1.2.3.tgz", + "integrity": "sha512-BOjyD1zPf7gqgXlXBCnCsz84cbRNfqpQNvWOUiw3Onu9s7a2afW2LyHzctoie/2KELfUoZkNHTnW02C3hCU20w==" + }, + "detect-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", + "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "dev": true, + "requires": { + "repeating": "2.0.1" + } + }, + "diff": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.4.0.tgz", + "integrity": "sha512-QpVuMTEoJMF7cKzi6bvWhRulU1fZqZnvyVQgNhPaxxuTYwyjn/j1v9falseQ/uXWwPnO56RBfwtg4h/EQXmucA==", + "dev": true + }, "doctrine": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", - "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, "requires": { - "esutils": "2.0.2", - "isarray": "1.0.0" + "esutils": "2.0.2" + } + }, + "dtrace-provider": { + "version": "0.8.6", + "resolved": "https://registry.npmjs.org/dtrace-provider/-/dtrace-provider-0.8.6.tgz", + "integrity": "sha1-QooiOv4DQl0s1tY0f99AxmkDVj0=", + "optional": true, + "requires": { + "nan": "2.8.0" } }, "ecc-jsbn": { @@ -470,34 +976,35 @@ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, "eslint": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.12.1.tgz", - "integrity": "sha512-28hOYej+NZ/R5H1yMvyKa1+bPlu+fnsIAQffK6hxXgvmXnImos2bA5XfCn5dYv2k2mrKj+/U/Z4L5ICWxC7TQw==", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.17.0.tgz", + "integrity": "sha512-AyxBUCANU/o/xC0ijGMKavo5Ls3oK6xykiOITlMdjFjrKOsqLrA7Nf5cnrDgcKrHzBirclAZt63XO7YZlVUPwA==", + "dev": true, "requires": { - "ajv": "5.5.1", + "ajv": "5.5.2", "babel-code-frame": "6.26.0", "chalk": "2.3.0", "concat-stream": "1.6.0", "cross-spawn": "5.1.0", "debug": "3.1.0", - "doctrine": "2.0.2", + "doctrine": "2.1.0", "eslint-scope": "3.7.1", - "espree": "3.5.2", + "eslint-visitor-keys": "1.0.0", + "espree": "3.5.3", "esquery": "1.0.0", - "estraverse": "4.2.0", "esutils": "2.0.2", "file-entry-cache": "2.0.0", "functional-red-black-tree": "1.0.1", "glob": "7.1.2", - "globals": "11.0.1", + "globals": "11.3.0", "ignore": "3.3.7", "imurmurhash": "0.1.4", "inquirer": "3.3.0", - "is-resolvable": "1.0.0", + "is-resolvable": "1.1.0", "js-yaml": "3.10.0", "json-stable-stringify-without-jsonify": "1.0.1", "levn": "0.3.0", - "lodash": "4.17.4", + "lodash": "4.17.5", "minimatch": "3.0.4", "mkdirp": "0.5.1", "natural-compare": "1.4.0", @@ -506,7 +1013,7 @@ "pluralize": "7.0.0", "progress": "2.0.0", "require-uncached": "1.0.3", - "semver": "5.4.1", + "semver": "5.5.0", "strip-ansi": "4.0.0", "strip-json-comments": "2.0.1", "table": "4.0.2", @@ -516,12 +1023,20 @@ "ansi-escapes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.0.0.tgz", - "integrity": "sha512-O/klc27mWNUigtv0F8NJWbLF00OcegQalkqKURWdosW08YZKi4m6CnSUSvIZG1otNJbTWhN01Hhz389DW7mvDQ==" + "integrity": "sha512-O/klc27mWNUigtv0F8NJWbLF00OcegQalkqKURWdosW08YZKi4m6CnSUSvIZG1otNJbTWhN01Hhz389DW7mvDQ==", + "dev": true + }, + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true }, "cli-cursor": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "dev": true, "requires": { "restore-cursor": "2.0.0" } @@ -530,22 +1045,22 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, "requires": { "ms": "2.0.0" } }, - "doctrine": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.0.2.tgz", - "integrity": "sha512-y0tm5Pq6ywp3qSTZ1vPgVdAnbDEoeoc5wlOHXoY1c4Wug/a7JvqHIl7BTvwodaHmejWkK/9dSb3sCYfyo/om8A==", - "requires": { - "esutils": "2.0.2" - } + "globals": { + "version": "11.3.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.3.0.tgz", + "integrity": "sha512-kkpcKNlmQan9Z5ZmgqKH/SMbSmjxQ7QjyNqfXVc8VJcoBV2UEg+sxQD15GQofGRh2hfpwUb70VC31DR7Rq5Hdw==", + "dev": true }, "inquirer": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", + "dev": true, "requires": { "ansi-escapes": "3.0.0", "chalk": "2.3.0", @@ -553,7 +1068,7 @@ "cli-width": "2.2.0", "external-editor": "2.1.0", "figures": "2.0.0", - "lodash": "4.17.4", + "lodash": "4.17.5", "mute-stream": "0.0.7", "run-async": "2.3.0", "rx-lite": "4.0.8", @@ -567,18 +1082,29 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, "requires": { - "mimic-fn": "1.1.0" + "mimic-fn": "1.2.0" } }, "restore-cursor": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, "requires": { "onetime": "2.0.1", "signal-exit": "3.0.2" } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "3.0.0" + } } } }, @@ -592,13 +1118,24 @@ } }, "eslint-import-resolver-node": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.1.tgz", - "integrity": "sha512-yUtXS15gIcij68NmXmP9Ni77AQuCN0itXbCc/jWd8C6/yKZaSNXicpC8cgvjnxVdmfsosIXrjpzFq7GcDryb6A==", + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz", + "integrity": "sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q==", "dev": true, "requires": { "debug": "2.6.9", "resolve": "1.5.0" + }, + "dependencies": { + "resolve": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz", + "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==", + "dev": true, + "requires": { + "path-parse": "1.0.5" + } + } } }, "eslint-module-utils": { @@ -621,12 +1158,30 @@ "contains-path": "0.1.0", "debug": "2.6.9", "doctrine": "1.5.0", - "eslint-import-resolver-node": "0.3.1", + "eslint-import-resolver-node": "0.3.2", "eslint-module-utils": "2.1.1", "has": "1.0.1", "lodash.cond": "4.5.2", "minimatch": "3.0.4", "read-pkg-up": "2.0.0" + }, + "dependencies": { + "doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "dev": true, + "requires": { + "esutils": "2.0.2", + "isarray": "1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + } } }, "eslint-restricted-globals": { @@ -639,29 +1194,39 @@ "version": "3.7.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz", "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", + "dev": true, "requires": { "esrecurse": "4.2.0", "estraverse": "4.2.0" } }, + "eslint-visitor-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", + "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==", + "dev": true + }, "espree": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.2.tgz", - "integrity": "sha512-sadKeYwaR/aJ3stC2CdvgXu1T16TdYN+qwCpcWbMnGJ8s0zNWemzrvb2GbD4OhmJ/fwpJjudThAlLobGbWZbCQ==", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.3.tgz", + "integrity": "sha512-Zy3tAJDORxQZLl2baguiRU1syPERAIg0L+JB2MWorORgTu/CplzvxS9WWA7Xh4+Q+eOQihNs/1o1Xep8cvCxWQ==", + "dev": true, "requires": { - "acorn": "5.2.1", + "acorn": "5.4.1", "acorn-jsx": "3.0.1" } }, "esprima": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", - "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==" + "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", + "dev": true }, "esquery": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.0.tgz", "integrity": "sha1-z7qLV9f7qT8XKYqKAGoEzaE9gPo=", + "dev": true, "requires": { "estraverse": "4.2.0" } @@ -670,6 +1235,7 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz", "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=", + "dev": true, "requires": { "estraverse": "4.2.0", "object-assign": "4.1.1" @@ -678,12 +1244,14 @@ "estraverse": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=" + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "dev": true }, "esutils": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true }, "exit-hook": { "version": "1.1.1", @@ -746,7 +1314,8 @@ "fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true }, "fd-slicer": { "version": "1.0.1", @@ -769,11 +1338,22 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", + "dev": true, "requires": { "flat-cache": "1.3.0", "object-assign": "4.1.1" } }, + "fill-keys": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/fill-keys/-/fill-keys-1.0.2.tgz", + "integrity": "sha1-mo+jb06K1jTjv2tPPIiCVRRS6yA=", + "dev": true, + "requires": { + "is-object": "1.0.1", + "merge-descriptors": "1.0.1" + } + }, "find-replace": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-1.0.3.tgz", @@ -807,6 +1387,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz", "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", + "dev": true, "requires": { "circular-json": "0.3.3", "del": "2.2.2", @@ -814,6 +1395,18 @@ "write": "0.2.1" } }, + "fluture": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/fluture/-/fluture-8.0.2.tgz", + "integrity": "sha512-RqYYwq0U+/yBOU+5qHmlNK/qZVU1xwSpRqSVDTt8SXUVhdFJuxRcda/u/YHL/BhGoJ4L3ETA9Y/OuyTF4Q5rLw==", + "requires": { + "concurrify": "1.0.3", + "denque": "1.2.3", + "inspect-f": "1.2.2", + "sanctuary-type-classes": "8.1.0", + "sanctuary-type-identifiers": "2.0.1" + } + }, "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", @@ -829,6 +1422,15 @@ "mime-types": "2.1.17" } }, + "formatio": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/formatio/-/formatio-1.2.0.tgz", + "integrity": "sha1-87IWfZBoxGmKjVH092CjmlTYGOs=", + "dev": true, + "requires": { + "samsam": "1.3.0" + } + }, "fs-extra": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-1.0.0.tgz", @@ -854,7 +1456,8 @@ "functional-red-black-tree": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=" + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true }, "getpass": { "version": "0.1.7", @@ -887,14 +1490,16 @@ } }, "globals": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.0.1.tgz", - "integrity": "sha1-Eqh7sBDlFUOWrMU14eQ/x1Ow5eg=" + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "dev": true }, "globby": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", + "dev": true, "requires": { "array-union": "1.0.2", "arrify": "1.0.1", @@ -909,6 +1514,12 @@ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" }, + "growl": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz", + "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==", + "dev": true + }, "har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", @@ -919,7 +1530,7 @@ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", "requires": { - "ajv": "5.5.1", + "ajv": "5.5.2", "har-schema": "2.0.0" } }, @@ -936,6 +1547,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, "requires": { "ansi-regex": "2.1.1" } @@ -966,11 +1578,27 @@ "sntp": "2.1.0" } }, + "he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "dev": true + }, "hoek": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.0.tgz", "integrity": "sha512-v0XCLxICi9nPfYrS9RL8HbYnXi9obYAeLbSP00BmnZwCK9+Ih9WOjoZ8YoHCoav2csqn4FOz4Orldsy2dmDwmQ==" }, + "home-or-tmp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", + "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", + "dev": true, + "requires": { + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" + } + }, "hosted-git-info": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", @@ -1003,12 +1631,14 @@ "ignore": { "version": "3.3.7", "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.7.tgz", - "integrity": "sha512-YGG3ejvBNHRqu0559EOxxNFihD0AjpvHlC/pdGKd3X3ofe+CoJkYazwNJYTNebqpPKN+VVQbh4ZFn1DivMNuHA==" + "integrity": "sha512-YGG3ejvBNHRqu0559EOxxNFihD0AjpvHlC/pdGKd3X3ofe+CoJkYazwNJYTNebqpPKN+VVQbh4ZFn1DivMNuHA==", + "dev": true }, "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true }, "inflight": { "version": "1.0.6", @@ -1025,9 +1655,9 @@ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" }, "inquirer": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-4.0.1.tgz", - "integrity": "sha512-HVU3eq/6DCt5Wkt46N6cooQBLlQy55UcmTGwMOe7XEmuxgdVjNxllS3pxrKDc8+OmNIbu+saotsCfH7m+IxHfg==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-4.0.2.tgz", + "integrity": "sha512-+f3qDNeZpkhFJ61NBA9jXDrGGhoQuqfEum9A681c9oHoIbGgVqjogKynjB/vNVP+nVu9w3FbFQ35c0ibU0MaIQ==", "requires": { "ansi-escapes": "3.0.0", "chalk": "2.3.0", @@ -1035,7 +1665,7 @@ "cli-width": "2.2.0", "external-editor": "2.1.0", "figures": "2.0.0", - "lodash": "4.17.4", + "lodash": "4.17.5", "mute-stream": "0.0.7", "run-async": "2.3.0", "rx-lite": "4.0.8", @@ -1050,6 +1680,11 @@ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.0.0.tgz", "integrity": "sha512-O/klc27mWNUigtv0F8NJWbLF00OcegQalkqKURWdosW08YZKi4m6CnSUSvIZG1otNJbTWhN01Hhz389DW7mvDQ==" }, + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, "cli-cursor": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", @@ -1063,7 +1698,7 @@ "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", "requires": { - "mimic-fn": "1.1.0" + "mimic-fn": "1.2.0" } }, "restore-cursor": { @@ -1074,14 +1709,36 @@ "onetime": "2.0.1", "signal-exit": "3.0.2" } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "3.0.0" + } } } }, + "inspect-f": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/inspect-f/-/inspect-f-1.2.2.tgz", + "integrity": "sha512-kHR/iUJ670cg9QLeoEhyzp/kqzBnPvXfzl+wE72+sOPuVv1vfXBwvWIFcr8DqnNSN44SDw9U41m4HEUSam1K2A==" + }, "interpret": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=" }, + "invariant": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", + "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=", + "dev": true, + "requires": { + "loose-envify": "1.3.1" + } + }, "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -1097,20 +1754,37 @@ "builtin-modules": "1.1.1" } }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" }, + "is-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.1.tgz", + "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA=", + "dev": true + }, "is-path-cwd": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", - "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=" + "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", + "dev": true }, "is-path-in-cwd": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz", "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=", + "dev": true, "requires": { "is-path-inside": "1.0.1" } @@ -1119,6 +1793,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "dev": true, "requires": { "path-is-inside": "1.0.2" } @@ -1129,12 +1804,10 @@ "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" }, "is-resolvable": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.0.0.tgz", - "integrity": "sha1-jfV8YeouPFAUCNEA+wE8+NbgzGI=", - "requires": { - "tryit": "1.0.3" - } + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", + "dev": true }, "is-stream": { "version": "1.1.0", @@ -1153,9 +1826,10 @@ "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" }, "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true }, "isexe": { "version": "2.0.0", @@ -1170,12 +1844,14 @@ "js-tokens": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true }, "js-yaml": { "version": "3.10.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.10.0.tgz", "integrity": "sha512-O2v52ffjLa9VeM43J4XocZE//WT9N0IiwDa3KSHH7Tu8CtH+1qM8SIZvnsTh6v+4yFy5KUY3BHUVwjpfAWsjIA==", + "dev": true, "requires": { "argparse": "1.0.9", "esprima": "4.0.0" @@ -1187,6 +1863,12 @@ "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", "optional": true }, + "jsesc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", + "dev": true + }, "json-schema": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", @@ -1200,13 +1882,20 @@ "json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=" + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true }, "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true + }, "jsonfile": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", @@ -1227,6 +1916,12 @@ "verror": "1.10.0" } }, + "just-extend": { + "version": "1.1.27", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-1.1.27.tgz", + "integrity": "sha512-mJVp13Ix6gFo3SBAy9U/kL+oeZqzlYYYLQBwXVBlVzIsZwBqGREnOro24oC/8s8aox+rJhtZ2DiQof++IrkA+g==", + "dev": true + }, "kew": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/kew/-/kew-0.7.0.tgz", @@ -1242,10 +1937,17 @@ "graceful-fs": "4.1.11" } }, + "lcov-parse": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/lcov-parse/-/lcov-parse-0.0.10.tgz", + "integrity": "sha1-GwuP+ayceIklBYK3C3ExXZ2m2aM=", + "dev": true + }, "levn": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, "requires": { "prelude-ls": "1.1.2", "type-check": "0.3.2" @@ -1282,9 +1984,9 @@ } }, "lodash": { - "version": "4.17.4", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", - "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=" + "version": "4.17.5", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz", + "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==" }, "lodash.cond": { "version": "4.5.2", @@ -1292,6 +1994,12 @@ "integrity": "sha1-9HGh2khr5g9quVXRcRVSPdHSVdU=", "dev": true }, + "lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", + "dev": true + }, "lodash.padend": { "version": "4.6.1", "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz", @@ -1302,6 +2010,12 @@ "resolved": "https://registry.npmjs.org/lodash.padstart/-/lodash.padstart-4.6.1.tgz", "integrity": "sha1-0uPuv/DZ05rVD1y9G1KnvOa7YRs=" }, + "log-driver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.7.tgz", + "integrity": "sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg==", + "dev": true + }, "log-update": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/log-update/-/log-update-1.0.2.tgz", @@ -1311,15 +2025,37 @@ "cli-cursor": "1.0.2" } }, + "lolex": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-2.3.2.tgz", + "integrity": "sha512-A5pN2tkFj7H0dGIAM6MFvHKMJcPnjZsOMvR7ujCjfgW5TbV6H9vb1PgxLtHvjqNZTHsUolz+6/WEO0N1xNx2ng==", + "dev": true + }, + "loose-envify": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", + "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", + "dev": true, + "requires": { + "js-tokens": "3.0.2" + } + }, "lru-cache": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", + "dev": true, "requires": { "pseudomap": "1.0.2", "yallist": "2.1.2" } }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "dev": true + }, "mime-db": { "version": "1.30.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", @@ -1334,9 +2070,9 @@ } }, "mimic-fn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.1.0.tgz", - "integrity": "sha1-5md4PZLonb00KBi1IwudYqZyrRg=" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" }, "minimatch": { "version": "3.0.4", @@ -1359,6 +2095,68 @@ "minimist": "0.0.8" } }, + "mocha": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.0.0.tgz", + "integrity": "sha512-ukB2dF+u4aeJjc6IGtPNnJXfeby5d4ZqySlIBT0OEyva/DrMjVm5HkQxKnHDLKEfEQBsEnwTg9HHhtPHJdTd8w==", + "dev": true, + "requires": { + "browser-stdout": "1.3.0", + "commander": "2.11.0", + "debug": "3.1.0", + "diff": "3.3.1", + "escape-string-regexp": "1.0.5", + "glob": "7.1.2", + "growl": "1.10.3", + "he": "1.1.1", + "mkdirp": "0.5.1", + "supports-color": "4.4.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "diff": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.1.tgz", + "integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==", + "dev": true + }, + "supports-color": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", + "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", + "dev": true, + "requires": { + "has-flag": "2.0.0" + } + } + } + }, + "mocha-lcov-reporter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/mocha-lcov-reporter/-/mocha-lcov-reporter-1.3.0.tgz", + "integrity": "sha1-Rpve9PivyaEWBW8HnfYYLQr7A4Q=", + "dev": true + }, + "module-not-found-error": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/module-not-found-error/-/module-not-found-error-1.0.1.tgz", + "integrity": "sha1-z4tP9PKWQGdNbN0CsOO8UjwrvcA=", + "dev": true + }, + "moment": { + "version": "2.20.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.20.1.tgz", + "integrity": "sha512-Yh9y73JRljxW5QxN08Fner68eFLxM5ynNOAw2LbIB1YAGeQzZT8QFSUvkAz609Zf+IHhhaUxqZK8dG3W/+HEvg==", + "optional": true + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -1374,10 +2172,79 @@ "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" }, + "mv": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/mv/-/mv-2.1.1.tgz", + "integrity": "sha1-rmzg1vbV4KT32JN5jQPB6pVZtqI=", + "optional": true, + "requires": { + "mkdirp": "0.5.1", + "ncp": "2.0.0", + "rimraf": "2.4.5" + }, + "dependencies": { + "glob": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", + "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", + "optional": true, + "requires": { + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "rimraf": { + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz", + "integrity": "sha1-7nEM5dk6j9uFb7Xqj/Di11k0sto=", + "optional": true, + "requires": { + "glob": "6.0.4" + } + } + } + }, + "nan": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.8.0.tgz", + "integrity": "sha1-7XFfP+neArV6XmJS2QqWZ14fCFo=", + "optional": true + }, "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "ncp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", + "integrity": "sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=", + "optional": true + }, + "nise": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/nise/-/nise-1.2.2.tgz", + "integrity": "sha512-rvxf+PSZeCKtP0DgmwMmNf1G3I6X1r4WHiP2H88PlIkOkt7mGqufdokjS8caoHBgZzVx0ee/5ytGcGHbZaUw8w==", + "dev": true, + "requires": { + "formatio": "1.2.0", + "just-extend": "1.1.27", + "lolex": "1.6.0", + "path-to-regexp": "1.7.0", + "text-encoding": "0.6.4" + }, + "dependencies": { + "lolex": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-1.6.0.tgz", + "integrity": "sha1-OpoCg0UqR9dDnnJzG54H1zhuSfY=", + "dev": true + } + } }, "normalize-package-data": { "version": "2.4.0", @@ -1387,10 +2254,1402 @@ "requires": { "hosted-git-info": "2.5.0", "is-builtin-module": "1.0.0", - "semver": "5.4.1", + "semver": "5.5.0", "validate-npm-package-license": "3.0.1" } }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "nyc": { + "version": "11.4.1", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-11.4.1.tgz", + "integrity": "sha512-5eCZpvaksFVjP2rt1r60cfXmt3MUtsQDw8bAzNqNEr4WLvUMLgiVENMf/B9bE9YAX0mGVvaGA3v9IS9ekNqB1Q==", + "requires": { + "archy": "1.0.0", + "arrify": "1.0.1", + "caching-transform": "1.0.1", + "convert-source-map": "1.5.1", + "debug-log": "1.0.1", + "default-require-extensions": "1.0.0", + "find-cache-dir": "0.1.1", + "find-up": "2.1.0", + "foreground-child": "1.5.6", + "glob": "7.1.2", + "istanbul-lib-coverage": "1.1.1", + "istanbul-lib-hook": "1.1.0", + "istanbul-lib-instrument": "1.9.1", + "istanbul-lib-report": "1.1.2", + "istanbul-lib-source-maps": "1.2.2", + "istanbul-reports": "1.1.3", + "md5-hex": "1.3.0", + "merge-source-map": "1.0.4", + "micromatch": "2.3.11", + "mkdirp": "0.5.1", + "resolve-from": "2.0.0", + "rimraf": "2.6.2", + "signal-exit": "3.0.2", + "spawn-wrap": "1.4.2", + "test-exclude": "4.1.1", + "yargs": "10.0.3", + "yargs-parser": "8.0.0" + }, + "dependencies": { + "align-text": { + "version": "0.1.4", + "bundled": true, + "requires": { + "kind-of": "3.2.2", + "longest": "1.0.1", + "repeat-string": "1.6.1" + } + }, + "amdefine": { + "version": "1.0.1", + "bundled": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true + }, + "ansi-styles": { + "version": "2.2.1", + "bundled": true + }, + "append-transform": { + "version": "0.4.0", + "bundled": true, + "requires": { + "default-require-extensions": "1.0.0" + } + }, + "archy": { + "version": "1.0.0", + "bundled": true + }, + "arr-diff": { + "version": "2.0.0", + "bundled": true, + "requires": { + "arr-flatten": "1.1.0" + } + }, + "arr-flatten": { + "version": "1.1.0", + "bundled": true + }, + "array-unique": { + "version": "0.2.1", + "bundled": true + }, + "arrify": { + "version": "1.0.1", + "bundled": true + }, + "async": { + "version": "1.5.2", + "bundled": true + }, + "babel-code-frame": { + "version": "6.26.0", + "bundled": true, + "requires": { + "chalk": "1.1.3", + "esutils": "2.0.2", + "js-tokens": "3.0.2" + } + }, + "babel-generator": { + "version": "6.26.0", + "bundled": true, + "requires": { + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "detect-indent": "4.0.0", + "jsesc": "1.3.0", + "lodash": "4.17.4", + "source-map": "0.5.7", + "trim-right": "1.0.1" + } + }, + "babel-messages": { + "version": "6.23.0", + "bundled": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-runtime": { + "version": "6.26.0", + "bundled": true, + "requires": { + "core-js": "2.5.3", + "regenerator-runtime": "0.11.1" + } + }, + "babel-template": { + "version": "6.26.0", + "bundled": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "lodash": "4.17.4" + } + }, + "babel-traverse": { + "version": "6.26.0", + "bundled": true, + "requires": { + "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.9", + "globals": "9.18.0", + "invariant": "2.2.2", + "lodash": "4.17.4" + } + }, + "babel-types": { + "version": "6.26.0", + "bundled": true, + "requires": { + "babel-runtime": "6.26.0", + "esutils": "2.0.2", + "lodash": "4.17.4", + "to-fast-properties": "1.0.3" + } + }, + "babylon": { + "version": "6.18.0", + "bundled": true + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true + }, + "brace-expansion": { + "version": "1.1.8", + "bundled": true, + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "1.8.5", + "bundled": true, + "requires": { + "expand-range": "1.8.2", + "preserve": "0.2.0", + "repeat-element": "1.1.2" + } + }, + "builtin-modules": { + "version": "1.1.1", + "bundled": true + }, + "caching-transform": { + "version": "1.0.1", + "bundled": true, + "requires": { + "md5-hex": "1.3.0", + "mkdirp": "0.5.1", + "write-file-atomic": "1.3.4" + } + }, + "camelcase": { + "version": "1.2.1", + "bundled": true, + "optional": true + }, + "center-align": { + "version": "0.1.3", + "bundled": true, + "optional": true, + "requires": { + "align-text": "0.1.4", + "lazy-cache": "1.0.4" + } + }, + "chalk": { + "version": "1.1.3", + "bundled": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "cliui": { + "version": "2.1.0", + "bundled": true, + "optional": true, + "requires": { + "center-align": "0.1.3", + "right-align": "0.1.3", + "wordwrap": "0.0.2" + }, + "dependencies": { + "wordwrap": { + "version": "0.0.2", + "bundled": true, + "optional": true + } + } + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true + }, + "commondir": { + "version": "1.0.1", + "bundled": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true + }, + "convert-source-map": { + "version": "1.5.1", + "bundled": true + }, + "core-js": { + "version": "2.5.3", + "bundled": true + }, + "cross-spawn": { + "version": "4.0.2", + "bundled": true, + "requires": { + "lru-cache": "4.1.1", + "which": "1.3.0" + } + }, + "debug": { + "version": "2.6.9", + "bundled": true, + "requires": { + "ms": "2.0.0" + } + }, + "debug-log": { + "version": "1.0.1", + "bundled": true + }, + "decamelize": { + "version": "1.2.0", + "bundled": true + }, + "default-require-extensions": { + "version": "1.0.0", + "bundled": true, + "requires": { + "strip-bom": "2.0.0" + } + }, + "detect-indent": { + "version": "4.0.0", + "bundled": true, + "requires": { + "repeating": "2.0.1" + } + }, + "error-ex": { + "version": "1.3.1", + "bundled": true, + "requires": { + "is-arrayish": "0.2.1" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "bundled": true + }, + "esutils": { + "version": "2.0.2", + "bundled": true + }, + "execa": { + "version": "0.7.0", + "bundled": true, + "requires": { + "cross-spawn": "5.1.0", + "get-stream": "3.0.0", + "is-stream": "1.1.0", + "npm-run-path": "2.0.2", + "p-finally": "1.0.0", + "signal-exit": "3.0.2", + "strip-eof": "1.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "5.1.0", + "bundled": true, + "requires": { + "lru-cache": "4.1.1", + "shebang-command": "1.2.0", + "which": "1.3.0" + } + } + } + }, + "expand-brackets": { + "version": "0.1.5", + "bundled": true, + "requires": { + "is-posix-bracket": "0.1.1" + } + }, + "expand-range": { + "version": "1.8.2", + "bundled": true, + "requires": { + "fill-range": "2.2.3" + } + }, + "extglob": { + "version": "0.3.2", + "bundled": true, + "requires": { + "is-extglob": "1.0.0" + } + }, + "filename-regex": { + "version": "2.0.1", + "bundled": true + }, + "fill-range": { + "version": "2.2.3", + "bundled": true, + "requires": { + "is-number": "2.1.0", + "isobject": "2.1.0", + "randomatic": "1.1.7", + "repeat-element": "1.1.2", + "repeat-string": "1.6.1" + } + }, + "find-cache-dir": { + "version": "0.1.1", + "bundled": true, + "requires": { + "commondir": "1.0.1", + "mkdirp": "0.5.1", + "pkg-dir": "1.0.0" + } + }, + "find-up": { + "version": "2.1.0", + "bundled": true, + "requires": { + "locate-path": "2.0.0" + } + }, + "for-in": { + "version": "1.0.2", + "bundled": true + }, + "for-own": { + "version": "0.1.5", + "bundled": true, + "requires": { + "for-in": "1.0.2" + } + }, + "foreground-child": { + "version": "1.5.6", + "bundled": true, + "requires": { + "cross-spawn": "4.0.2", + "signal-exit": "3.0.2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true + }, + "get-caller-file": { + "version": "1.0.2", + "bundled": true + }, + "get-stream": { + "version": "3.0.0", + "bundled": true + }, + "glob": { + "version": "7.1.2", + "bundled": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "glob-base": { + "version": "0.3.0", + "bundled": true, + "requires": { + "glob-parent": "2.0.0", + "is-glob": "2.0.1" + } + }, + "glob-parent": { + "version": "2.0.0", + "bundled": true, + "requires": { + "is-glob": "2.0.1" + } + }, + "globals": { + "version": "9.18.0", + "bundled": true + }, + "graceful-fs": { + "version": "4.1.11", + "bundled": true + }, + "handlebars": { + "version": "4.0.11", + "bundled": true, + "requires": { + "async": "1.5.2", + "optimist": "0.6.1", + "source-map": "0.4.4", + "uglify-js": "2.8.29" + }, + "dependencies": { + "source-map": { + "version": "0.4.4", + "bundled": true, + "requires": { + "amdefine": "1.0.1" + } + } + } + }, + "has-ansi": { + "version": "2.0.0", + "bundled": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "has-flag": { + "version": "1.0.0", + "bundled": true + }, + "hosted-git-info": { + "version": "2.5.0", + "bundled": true + }, + "imurmurhash": { + "version": "0.1.4", + "bundled": true + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true + }, + "invariant": { + "version": "2.2.2", + "bundled": true, + "requires": { + "loose-envify": "1.3.1" + } + }, + "invert-kv": { + "version": "1.0.0", + "bundled": true + }, + "is-arrayish": { + "version": "0.2.1", + "bundled": true + }, + "is-buffer": { + "version": "1.1.6", + "bundled": true + }, + "is-builtin-module": { + "version": "1.0.0", + "bundled": true, + "requires": { + "builtin-modules": "1.1.1" + } + }, + "is-dotfile": { + "version": "1.0.3", + "bundled": true + }, + "is-equal-shallow": { + "version": "0.1.3", + "bundled": true, + "requires": { + "is-primitive": "2.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "bundled": true + }, + "is-extglob": { + "version": "1.0.0", + "bundled": true + }, + "is-finite": { + "version": "1.0.2", + "bundled": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-glob": { + "version": "2.0.1", + "bundled": true, + "requires": { + "is-extglob": "1.0.0" + } + }, + "is-number": { + "version": "2.1.0", + "bundled": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "is-posix-bracket": { + "version": "0.1.1", + "bundled": true + }, + "is-primitive": { + "version": "2.0.0", + "bundled": true + }, + "is-stream": { + "version": "1.1.0", + "bundled": true + }, + "is-utf8": { + "version": "0.2.1", + "bundled": true + }, + "isarray": { + "version": "1.0.0", + "bundled": true + }, + "isexe": { + "version": "2.0.0", + "bundled": true + }, + "isobject": { + "version": "2.1.0", + "bundled": true, + "requires": { + "isarray": "1.0.0" + } + }, + "istanbul-lib-coverage": { + "version": "1.1.1", + "bundled": true + }, + "istanbul-lib-hook": { + "version": "1.1.0", + "bundled": true, + "requires": { + "append-transform": "0.4.0" + } + }, + "istanbul-lib-instrument": { + "version": "1.9.1", + "bundled": true, + "requires": { + "babel-generator": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "istanbul-lib-coverage": "1.1.1", + "semver": "5.4.1" + } + }, + "istanbul-lib-report": { + "version": "1.1.2", + "bundled": true, + "requires": { + "istanbul-lib-coverage": "1.1.1", + "mkdirp": "0.5.1", + "path-parse": "1.0.5", + "supports-color": "3.2.3" + }, + "dependencies": { + "supports-color": { + "version": "3.2.3", + "bundled": true, + "requires": { + "has-flag": "1.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "1.2.2", + "bundled": true, + "requires": { + "debug": "3.1.0", + "istanbul-lib-coverage": "1.1.1", + "mkdirp": "0.5.1", + "rimraf": "2.6.2", + "source-map": "0.5.7" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "bundled": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "istanbul-reports": { + "version": "1.1.3", + "bundled": true, + "requires": { + "handlebars": "4.0.11" + } + }, + "js-tokens": { + "version": "3.0.2", + "bundled": true + }, + "jsesc": { + "version": "1.3.0", + "bundled": true + }, + "kind-of": { + "version": "3.2.2", + "bundled": true, + "requires": { + "is-buffer": "1.1.6" + } + }, + "lazy-cache": { + "version": "1.0.4", + "bundled": true, + "optional": true + }, + "lcid": { + "version": "1.0.0", + "bundled": true, + "requires": { + "invert-kv": "1.0.0" + } + }, + "load-json-file": { + "version": "1.1.0", + "bundled": true, + "requires": { + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "strip-bom": "2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "bundled": true, + "requires": { + "p-locate": "2.0.0", + "path-exists": "3.0.0" + }, + "dependencies": { + "path-exists": { + "version": "3.0.0", + "bundled": true + } + } + }, + "lodash": { + "version": "4.17.4", + "bundled": true + }, + "longest": { + "version": "1.0.1", + "bundled": true + }, + "loose-envify": { + "version": "1.3.1", + "bundled": true, + "requires": { + "js-tokens": "3.0.2" + } + }, + "lru-cache": { + "version": "4.1.1", + "bundled": true, + "requires": { + "pseudomap": "1.0.2", + "yallist": "2.1.2" + } + }, + "md5-hex": { + "version": "1.3.0", + "bundled": true, + "requires": { + "md5-o-matic": "0.1.1" + } + }, + "md5-o-matic": { + "version": "0.1.1", + "bundled": true + }, + "mem": { + "version": "1.1.0", + "bundled": true, + "requires": { + "mimic-fn": "1.1.0" + } + }, + "merge-source-map": { + "version": "1.0.4", + "bundled": true, + "requires": { + "source-map": "0.5.7" + } + }, + "micromatch": { + "version": "2.3.11", + "bundled": true, + "requires": { + "arr-diff": "2.0.0", + "array-unique": "0.2.1", + "braces": "1.8.5", + "expand-brackets": "0.1.5", + "extglob": "0.3.2", + "filename-regex": "2.0.1", + "is-extglob": "1.0.0", + "is-glob": "2.0.1", + "kind-of": "3.2.2", + "normalize-path": "2.1.1", + "object.omit": "2.0.1", + "parse-glob": "3.0.4", + "regex-cache": "0.4.4" + } + }, + "mimic-fn": { + "version": "1.1.0", + "bundled": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "requires": { + "brace-expansion": "1.1.8" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "bundled": true + }, + "normalize-package-data": { + "version": "2.4.0", + "bundled": true, + "requires": { + "hosted-git-info": "2.5.0", + "is-builtin-module": "1.0.0", + "semver": "5.4.1", + "validate-npm-package-license": "3.0.1" + } + }, + "normalize-path": { + "version": "2.1.1", + "bundled": true, + "requires": { + "remove-trailing-separator": "1.1.0" + } + }, + "npm-run-path": { + "version": "2.0.2", + "bundled": true, + "requires": { + "path-key": "2.0.1" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true + }, + "object.omit": { + "version": "2.0.1", + "bundled": true, + "requires": { + "for-own": "0.1.5", + "is-extendable": "0.1.1" + } + }, + "once": { + "version": "1.4.0", + "bundled": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "optimist": { + "version": "0.6.1", + "bundled": true, + "requires": { + "minimist": "0.0.8", + "wordwrap": "0.0.3" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true + }, + "os-locale": { + "version": "2.1.0", + "bundled": true, + "requires": { + "execa": "0.7.0", + "lcid": "1.0.0", + "mem": "1.1.0" + } + }, + "p-finally": { + "version": "1.0.0", + "bundled": true + }, + "p-limit": { + "version": "1.1.0", + "bundled": true + }, + "p-locate": { + "version": "2.0.0", + "bundled": true, + "requires": { + "p-limit": "1.1.0" + } + }, + "parse-glob": { + "version": "3.0.4", + "bundled": true, + "requires": { + "glob-base": "0.3.0", + "is-dotfile": "1.0.3", + "is-extglob": "1.0.0", + "is-glob": "2.0.1" + } + }, + "parse-json": { + "version": "2.2.0", + "bundled": true, + "requires": { + "error-ex": "1.3.1" + } + }, + "path-exists": { + "version": "2.1.0", + "bundled": true, + "requires": { + "pinkie-promise": "2.0.1" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true + }, + "path-key": { + "version": "2.0.1", + "bundled": true + }, + "path-parse": { + "version": "1.0.5", + "bundled": true + }, + "path-type": { + "version": "1.1.0", + "bundled": true, + "requires": { + "graceful-fs": "4.1.11", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + }, + "pify": { + "version": "2.3.0", + "bundled": true + }, + "pinkie": { + "version": "2.0.4", + "bundled": true + }, + "pinkie-promise": { + "version": "2.0.1", + "bundled": true, + "requires": { + "pinkie": "2.0.4" + } + }, + "pkg-dir": { + "version": "1.0.0", + "bundled": true, + "requires": { + "find-up": "1.1.2" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "bundled": true, + "requires": { + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" + } + } + } + }, + "preserve": { + "version": "0.2.0", + "bundled": true + }, + "pseudomap": { + "version": "1.0.2", + "bundled": true + }, + "randomatic": { + "version": "1.1.7", + "bundled": true, + "requires": { + "is-number": "3.0.0", + "kind-of": "4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "bundled": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "bundled": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "bundled": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "read-pkg": { + "version": "1.1.0", + "bundled": true, + "requires": { + "load-json-file": "1.1.0", + "normalize-package-data": "2.4.0", + "path-type": "1.1.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "bundled": true, + "requires": { + "find-up": "1.1.2", + "read-pkg": "1.1.0" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "bundled": true, + "requires": { + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" + } + } + } + }, + "regenerator-runtime": { + "version": "0.11.1", + "bundled": true + }, + "regex-cache": { + "version": "0.4.4", + "bundled": true, + "requires": { + "is-equal-shallow": "0.1.3" + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "bundled": true + }, + "repeat-element": { + "version": "1.1.2", + "bundled": true + }, + "repeat-string": { + "version": "1.6.1", + "bundled": true + }, + "repeating": { + "version": "2.0.1", + "bundled": true, + "requires": { + "is-finite": "1.0.2" + } + }, + "require-directory": { + "version": "2.1.1", + "bundled": true + }, + "require-main-filename": { + "version": "1.0.1", + "bundled": true + }, + "resolve-from": { + "version": "2.0.0", + "bundled": true + }, + "right-align": { + "version": "0.1.3", + "bundled": true, + "optional": true, + "requires": { + "align-text": "0.1.4" + } + }, + "rimraf": { + "version": "2.6.2", + "bundled": true, + "requires": { + "glob": "7.1.2" + } + }, + "semver": { + "version": "5.4.1", + "bundled": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true + }, + "shebang-command": { + "version": "1.2.0", + "bundled": true, + "requires": { + "shebang-regex": "1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "bundled": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true + }, + "slide": { + "version": "1.1.6", + "bundled": true + }, + "source-map": { + "version": "0.5.7", + "bundled": true + }, + "spawn-wrap": { + "version": "1.4.2", + "bundled": true, + "requires": { + "foreground-child": "1.5.6", + "mkdirp": "0.5.1", + "os-homedir": "1.0.2", + "rimraf": "2.6.2", + "signal-exit": "3.0.2", + "which": "1.3.0" + } + }, + "spdx-correct": { + "version": "1.0.2", + "bundled": true, + "requires": { + "spdx-license-ids": "1.2.2" + } + }, + "spdx-expression-parse": { + "version": "1.0.4", + "bundled": true + }, + "spdx-license-ids": { + "version": "1.2.2", + "bundled": true + }, + "string-width": { + "version": "2.1.1", + "bundled": true, + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "bundled": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "bundled": true + }, + "strip-ansi": { + "version": "4.0.0", + "bundled": true, + "requires": { + "ansi-regex": "3.0.0" + } + } + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-bom": { + "version": "2.0.0", + "bundled": true, + "requires": { + "is-utf8": "0.2.1" + } + }, + "strip-eof": { + "version": "1.0.0", + "bundled": true + }, + "supports-color": { + "version": "2.0.0", + "bundled": true + }, + "test-exclude": { + "version": "4.1.1", + "bundled": true, + "requires": { + "arrify": "1.0.1", + "micromatch": "2.3.11", + "object-assign": "4.1.1", + "read-pkg-up": "1.0.1", + "require-main-filename": "1.0.1" + } + }, + "to-fast-properties": { + "version": "1.0.3", + "bundled": true + }, + "trim-right": { + "version": "1.0.1", + "bundled": true + }, + "uglify-js": { + "version": "2.8.29", + "bundled": true, + "optional": true, + "requires": { + "source-map": "0.5.7", + "uglify-to-browserify": "1.0.2", + "yargs": "3.10.0" + }, + "dependencies": { + "yargs": { + "version": "3.10.0", + "bundled": true, + "optional": true, + "requires": { + "camelcase": "1.2.1", + "cliui": "2.1.0", + "decamelize": "1.2.0", + "window-size": "0.1.0" + } + } + } + }, + "uglify-to-browserify": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "validate-npm-package-license": { + "version": "3.0.1", + "bundled": true, + "requires": { + "spdx-correct": "1.0.2", + "spdx-expression-parse": "1.0.4" + } + }, + "which": { + "version": "1.3.0", + "bundled": true, + "requires": { + "isexe": "2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "bundled": true + }, + "window-size": { + "version": "0.1.0", + "bundled": true, + "optional": true + }, + "wordwrap": { + "version": "0.0.3", + "bundled": true + }, + "wrap-ansi": { + "version": "2.1.0", + "bundled": true, + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1" + }, + "dependencies": { + "string-width": { + "version": "1.0.2", + "bundled": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true + }, + "write-file-atomic": { + "version": "1.3.4", + "bundled": true, + "requires": { + "graceful-fs": "4.1.11", + "imurmurhash": "0.1.4", + "slide": "1.1.6" + } + }, + "y18n": { + "version": "3.2.1", + "bundled": true + }, + "yallist": { + "version": "2.1.2", + "bundled": true + }, + "yargs": { + "version": "10.0.3", + "bundled": true, + "requires": { + "cliui": "3.2.0", + "decamelize": "1.2.0", + "find-up": "2.1.0", + "get-caller-file": "1.0.2", + "os-locale": "2.1.0", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "2.1.1", + "which-module": "2.0.0", + "y18n": "3.2.1", + "yargs-parser": "8.0.0" + }, + "dependencies": { + "cliui": { + "version": "3.2.0", + "bundled": true, + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wrap-ansi": "2.1.0" + }, + "dependencies": { + "string-width": { + "version": "1.0.2", + "bundled": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + } + } + } + } + }, + "yargs-parser": { + "version": "8.0.0", + "bundled": true, + "requires": { + "camelcase": "4.1.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "bundled": true + } + } + } + } + }, "oauth-sign": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", @@ -1399,7 +3658,13 @@ "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object-keys": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", + "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=" }, "once": { "version": "1.4.0", @@ -1426,6 +3691,7 @@ "version": "0.8.2", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "dev": true, "requires": { "deep-is": "0.1.3", "fast-levenshtein": "2.0.6", @@ -1435,16 +3701,25 @@ "wordwrap": "1.0.0" } }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, "os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" }, "p-limit": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.1.0.tgz", - "integrity": "sha1-sH/y2aXYi+yAYDWJWiurZqJ5iLw=", - "dev": true + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz", + "integrity": "sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng==", + "dev": true, + "requires": { + "p-try": "1.0.0" + } }, "p-locate": { "version": "2.0.0", @@ -1452,9 +3727,15 @@ "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", "dev": true, "requires": { - "p-limit": "1.1.0" + "p-limit": "1.2.0" } }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, "parse-json": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", @@ -1481,12 +3762,23 @@ "path-is-inside": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true }, "path-parse": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", - "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=" + "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", + "dev": true + }, + "path-to-regexp": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz", + "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=", + "dev": true, + "requires": { + "isarray": "0.0.1" + } }, "path-type": { "version": "2.0.0", @@ -1536,7 +3828,8 @@ "pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true }, "pinkie": { "version": "2.0.4", @@ -1563,12 +3856,20 @@ "pluralize": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", - "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==" + "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", + "dev": true }, "prelude-ls": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "private": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", + "dev": true }, "process-nextick-args": { "version": "1.0.7", @@ -1578,12 +3879,25 @@ "progress": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz", - "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=" + "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=", + "dev": true + }, + "proxyquire": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/proxyquire/-/proxyquire-1.8.0.tgz", + "integrity": "sha1-AtUUpb7ZhvBMuyCTrxZ0FTX3ntw=", + "dev": true, + "requires": { + "fill-keys": "1.0.2", + "module-not-found-error": "1.0.1", + "resolve": "1.1.7" + } }, "pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true }, "punycode": { "version": "1.4.1", @@ -1600,6 +3914,11 @@ "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" }, + "ramda": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.25.0.tgz", + "integrity": "sha512-GXpfrYVPwx3K7RQ6aYT8KPS8XViSXUVJT1ONhoKPE9VAleW42YE+U+8VEyGWt41EnEQW7gwecYJriTI0pKoecQ==" + }, "read-pkg": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", @@ -1644,6 +3963,13 @@ "safe-buffer": "5.1.1", "string_decoder": "1.0.3", "util-deprecate": "1.0.2" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + } } }, "rechoir": { @@ -1651,7 +3977,7 @@ "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", "requires": { - "resolve": "1.5.0" + "resolve": "1.1.7" } }, "reduce-flatten": { @@ -1659,6 +3985,61 @@ "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-1.0.1.tgz", "integrity": "sha1-JYx479FT3fk8tWEjf2EYTzaW4yc=" }, + "regenerate": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.3.tgz", + "integrity": "sha512-jVpo1GadrDAK59t/0jRx5VxYWQEDkkEKi6+HjE3joFVLfDOh9Xrdh0dF1eSq+BI/SwvTQ44gSscJ8N5zYL61sg==", + "dev": true + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true + }, + "regexpu-core": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", + "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", + "dev": true, + "requires": { + "regenerate": "1.3.3", + "regjsgen": "0.2.0", + "regjsparser": "0.1.5" + } + }, + "regjsgen": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", + "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", + "dev": true + }, + "regjsparser": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", + "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", + "dev": true, + "requires": { + "jsesc": "0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + } + } + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "1.0.2" + } + }, "request": { "version": "2.83.0", "resolved": "https://registry.npmjs.org/request/-/request-2.83.0.tgz", @@ -1685,7 +4066,7 @@ "stringstream": "0.0.5", "tough-cookie": "2.3.3", "tunnel-agent": "0.6.0", - "uuid": "3.1.0" + "uuid": "3.2.1" } }, "request-progress": { @@ -1713,30 +4094,39 @@ "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.1.tgz", "integrity": "sha1-Pu4AssWqgyOc+wTFcA2jb4HNCLY=", "requires": { - "lodash": "4.17.4" + "lodash": "4.17.5" + } + }, + "request-promise-native": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.5.tgz", + "integrity": "sha1-UoF3D2jgyXGeUWP9P6tIIhX0/aU=", + "requires": { + "request-promise-core": "1.1.1", + "stealthy-require": "1.1.1", + "tough-cookie": "2.3.3" } }, "require-uncached": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", + "dev": true, "requires": { "caller-path": "0.1.0", "resolve-from": "1.0.1" } }, "resolve": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz", - "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==", - "requires": { - "path-parse": "1.0.5" - } + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=" }, "resolve-from": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", - "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=" + "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", + "dev": true }, "restore-cursor": { "version": "1.0.1", @@ -1747,10 +4137,21 @@ "onetime": "1.1.0" } }, + "rewire": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rewire/-/rewire-3.0.2.tgz", + "integrity": "sha512-ejkkt3qYnsQ38ifc9llAAzuHiGM7kR8N5/mL3aHWgmWwet0OMFcmJB8aTsMV2PBHCWxNVTLCeRfBpEa8X2+1fw==", + "dev": true, + "requires": { + "babel-core": "6.26.0", + "babel-plugin-transform-es2015-block-scoping": "6.26.0" + } + }, "rimraf": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "dev": true, "requires": { "glob": "7.1.2" } @@ -1781,15 +4182,49 @@ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" }, + "safe-json-stringify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/safe-json-stringify/-/safe-json-stringify-1.0.4.tgz", + "integrity": "sha1-gaCY9Efku8P/MxKiQ1IbwGDvWRE=", + "optional": true + }, + "samsam": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.3.0.tgz", + "integrity": "sha512-1HwIYD/8UlOtFS3QO3w7ey+SdSDFE4HRNLZoZRYVQefrOY3l17epswImeB1ijgJFQJodIaHcwkp3r/myBjFVbg==", + "dev": true + }, + "sanctuary-type-classes": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/sanctuary-type-classes/-/sanctuary-type-classes-8.1.0.tgz", + "integrity": "sha512-rTbSmPCYeJcs+jzm9uPBWZeyp3x5CB01+N1KrS+0PbccmoM6NpQW2Nv4gkFA81/oaWT6fkaMvZ9YKJJVFV81pA==", + "requires": { + "sanctuary-type-identifiers": "1.0.0" + }, + "dependencies": { + "sanctuary-type-identifiers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/sanctuary-type-identifiers/-/sanctuary-type-identifiers-1.0.0.tgz", + "integrity": "sha1-6PNZ8AbLXmJM+4RkYD/BFGCL3p8=" + } + } + }, + "sanctuary-type-identifiers": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/sanctuary-type-identifiers/-/sanctuary-type-identifiers-2.0.1.tgz", + "integrity": "sha1-/FJM9t2Szr/LsN2VCe/xkxWaIO0=" + }, "semver": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", - "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==" + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", + "dev": true }, "shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, "requires": { "shebang-regex": "1.0.0" } @@ -1797,7 +4232,8 @@ "shebang-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true }, "shelljs": { "version": "0.7.8", @@ -1809,6 +4245,60 @@ "rechoir": "0.6.2" } }, + "should": { + "version": "13.2.1", + "resolved": "https://registry.npmjs.org/should/-/should-13.2.1.tgz", + "integrity": "sha512-l+/NwEMO+DcstsHEwPHRHzC9j4UOE3VQwJGcMWSsD/vqpqHbnQ+1iSHy64Ihmmjx1uiRPD9pFadTSc3MJtXAgw==", + "dev": true, + "requires": { + "should-equal": "2.0.0", + "should-format": "3.0.3", + "should-type": "1.4.0", + "should-type-adaptors": "1.1.0", + "should-util": "1.0.0" + } + }, + "should-equal": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/should-equal/-/should-equal-2.0.0.tgz", + "integrity": "sha512-ZP36TMrK9euEuWQYBig9W55WPC7uo37qzAEmbjHz4gfyuXrEUgF8cUvQVO+w+d3OMfPvSRQJ22lSm8MQJ43LTA==", + "dev": true, + "requires": { + "should-type": "1.4.0" + } + }, + "should-format": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/should-format/-/should-format-3.0.3.tgz", + "integrity": "sha1-m/yPdPo5IFxT04w01xcwPidxJPE=", + "dev": true, + "requires": { + "should-type": "1.4.0", + "should-type-adaptors": "1.1.0" + } + }, + "should-type": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/should-type/-/should-type-1.4.0.tgz", + "integrity": "sha1-B1bYzoRt/QmEOmlHcZ36DUz/XPM=", + "dev": true + }, + "should-type-adaptors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/should-type-adaptors/-/should-type-adaptors-1.1.0.tgz", + "integrity": "sha512-JA4hdoLnN+kebEp2Vs8eBe9g7uy0zbRo+RMcU0EsNy+R+k049Ki+N5tT5Jagst2g7EAja+euFuoXFCa8vIklfA==", + "dev": true, + "requires": { + "should-type": "1.4.0", + "should-util": "1.0.0" + } + }, + "should-util": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/should-util/-/should-util-1.0.0.tgz", + "integrity": "sha1-yYzaN0qmsZDfi6h8mInCtNtiAGM=", + "dev": true + }, "sigmund": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", @@ -1820,10 +4310,49 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" }, + "sinon": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-4.2.2.tgz", + "integrity": "sha512-BEa593xl+IkIc94nKo0O0LauQC/gQy8Gyv4DkzPwF/9DweC5phr1y+42zibCpn9abfkdHxt9r8AhD0R6u9DE/Q==", + "dev": true, + "requires": { + "diff": "3.4.0", + "formatio": "1.2.0", + "lodash.get": "4.4.2", + "lolex": "2.3.2", + "nise": "1.2.2", + "supports-color": "5.1.0", + "type-detect": "4.0.8" + }, + "dependencies": { + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "dev": true + }, + "supports-color": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.1.0.tgz", + "integrity": "sha512-Ry0AwkoKjDpVKK4sV4h6o3UJmNRbjYm2uXhwfj3J56lMVdvnUNqzQVRztOOMGQ++w1K/TjNDFvpJk0F/LoeBCQ==", + "dev": true, + "requires": { + "has-flag": "2.0.0" + } + } + } + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true + }, "slice-ansi": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", + "dev": true, "requires": { "is-fullwidth-code-point": "2.0.0" } @@ -1908,6 +4437,21 @@ "hoek": "4.2.0" } }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-support": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "dev": true, + "requires": { + "source-map": "0.5.7" + } + }, "spdx-correct": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", @@ -1961,6 +4505,21 @@ "requires": { "is-fullwidth-code-point": "2.0.0", "strip-ansi": "4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "3.0.0" + } + } } }, "string_decoder": { @@ -1977,18 +4536,12 @@ "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=" }, "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, "requires": { - "ansi-regex": "3.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" - } + "ansi-regex": "2.1.1" } }, "strip-bom": { @@ -2000,25 +4553,25 @@ "strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true }, "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", - "requires": { - "has-flag": "2.0.0" - } + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true }, "table": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz", "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==", + "dev": true, "requires": { - "ajv": "5.5.1", + "ajv": "5.5.2", "ajv-keywords": "2.1.1", "chalk": "2.3.0", - "lodash": "4.17.4", + "lodash": "4.17.5", "slice-ansi": "1.0.0", "string-width": "2.1.1" } @@ -2054,10 +4607,17 @@ } } }, + "text-encoding": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/text-encoding/-/text-encoding-0.6.4.tgz", + "integrity": "sha1-45mpgiV6J22uQou5KEXLcb3CbRk=", + "dev": true + }, "text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true }, "throttleit": { "version": "1.0.0", @@ -2083,6 +4643,12 @@ "os-tmpdir": "1.0.2" } }, + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "dev": true + }, "tough-cookie": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.3.tgz", @@ -2091,10 +4657,11 @@ "punycode": "1.4.1" } }, - "tryit": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tryit/-/tryit-1.0.3.tgz", - "integrity": "sha1-OTvnMKlEb9Hq1tpZoBQwjzbCics=" + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", + "dev": true }, "tunnel-agent": { "version": "0.6.0", @@ -2114,10 +4681,17 @@ "version": "0.3.2", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, "requires": { "prelude-ls": "1.1.2" } }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true + }, "typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", @@ -2146,9 +4720,9 @@ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, "uuid": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", - "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==" + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", + "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==" }, "validate-npm-package-license": { "version": "3.0.1", @@ -2181,7 +4755,8 @@ "wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true }, "wordwrapjs": { "version": "3.0.0", @@ -2201,14 +4776,24 @@ "version": "0.2.1", "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", + "dev": true, "requires": { "mkdirp": "0.5.1" } }, + "xtend": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", + "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=", + "requires": { + "object-keys": "0.4.0" + } + }, "yallist": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true }, "yamljs": { "version": "0.3.0", diff --git a/package.json b/package.json index 37429ed..35998a2 100644 --- a/package.json +++ b/package.json @@ -1,12 +1,16 @@ { "name": "coderoom-gitlab", - "version": "1.0.0", + "version": "1.0.1", "description": "A Review Utility Tool which facilitates in code reviewing easily.", "bin": { "coderoom": "./bin/coderoom.js" }, "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" + "lint-fix": "node_modules/.bin/eslint --fix .", + "lint": "node_modules/.bin/eslint .", + "pretest": "npm run lint", + "test": "node_modules/.bin/mocha --recursive tests", + "coverage": "node_modules/.bin/nyc npm test && nyc report --reporter=text-lcov | coveralls" }, "author": "Nishant Jain", "license": "ISC", @@ -19,26 +23,42 @@ "email": "nishantkumarajain@gmail.com" }, "dependencies": { + "bunyan": "^1.8.12", + "bunyan-format": "^0.2.1", "chalk": "^2.3.0", + "cli-progress": "^1.7.0", "cli-progress-bar": "^1.0.1", "command-line-args": "^4.0.7", "command-line-usage": "^4.0.2", "date-time": "^2.1.0", - "eslint": "^4.12.1", + "fluture": "^8.0.2", "gitlab": "^1.7.1", "has-flag": "^2.0.0", "html-pdf": "^2.2.0", "inquirer": "^4.0.1", "lodash": "^4.17.4", "mustache": "^2.3.0", + "nyc": "^11.4.1", "opn": "^5.2.0", + "ramda": "^0.25.0", "request": "^2.83.0", "request-promise": "^4.2.2", + "request-promise-native": "^1.0.5", "shelljs": "^0.7.8", "yamljs": "^0.3.0" }, "devDependencies": { + "babel-preset-es2015-node": "^6.1.1", + "babel-register": "^6.26.0", + "coveralls": "^3.0.0", + "eslint": "^4.17.0", "eslint-config-airbnb-base": "^12.1.0", - "eslint-plugin-import": "^2.8.0" + "eslint-plugin-import": "^2.8.0", + "mocha": "^5.0.0", + "mocha-lcov-reporter": "^1.3.0", + "proxyquire": "^1.8.0", + "rewire": "^3.0.2", + "should": "^13.2.1", + "sinon": "^4.2.2" } } diff --git a/reports/templates/insights.mst b/reports/templates/insights.mst index 96b7484..8b879f9 100644 --- a/reports/templates/insights.mst +++ b/reports/templates/insights.mst @@ -29,11 +29,11 @@ Total Members Submitted Assignment - {{totalMembersSubmittedAssignment}} + {{totalSubmittedMembers}} Total Members Yet to Submit Assignment - {{totalMembersYetToSubmitAssignment}} + {{totalDefaultedMembers}} @@ -45,11 +45,11 @@ - {{#listOfMembersSubmittedAssignments}} + {{#submittedMembers}} - {{name}} + {{.}} - {{/listOfMembersSubmittedAssignments}} + {{/submittedMembers}}

Members Yet to Complete Assignment

@@ -60,11 +60,11 @@ - {{#listOfMembersYetToSubmitAssignment}} + {{#defaultedMembers}} - {{name}} + {{.}} - {{/listOfMembersYetToSubmitAssignment}} + {{/defaultedMembers}} diff --git a/tests/fixtures/cadets.json b/tests/fixtures/cadets.json new file mode 100644 index 0000000..065cd03 --- /dev/null +++ b/tests/fixtures/cadets.json @@ -0,0 +1,18 @@ +[ + { + "id": 1, + "username": "raymond_smith", + "name": "Raymond Smith", + "state": "active", + "created_at": "2012-10-22T14:13:35Z", + "access_level": 30 + }, + { + "id": 2, + "username": "john_doe", + "name": "John Doe", + "state": "active", + "created_at": "2012-10-22T14:13:35Z", + "access_level": 30 + } +] diff --git a/tests/fixtures/gitlab-groups-none.js b/tests/fixtures/gitlab-groups-none.js new file mode 100644 index 0000000..fb848cb --- /dev/null +++ b/tests/fixtures/gitlab-groups-none.js @@ -0,0 +1,19 @@ +/** + * @fileOverview Creates a fake Gitlab class + * with the intent to fake groups.all + * method of the original gitlab package. + * This groups.all methods returns no groups. + */ +const sinon = require('sinon'); + +class Gitlab { + constructor(credentials) { + this.credentials = credentials; + this.allGroupsStub = sinon.stub().yields(null); + this.groups = { + all: this.allGroupsStub, + }; + } +} + +module.exports = Gitlab; diff --git a/tests/fixtures/gitlab-groups.js b/tests/fixtures/gitlab-groups.js new file mode 100644 index 0000000..da8c229 --- /dev/null +++ b/tests/fixtures/gitlab-groups.js @@ -0,0 +1,19 @@ +/** + * @fileOverview Creates a fake Gitlab class + * with the intent to fake groups.all + * method of the original gitlab package. + */ +const sinon = require('sinon'); +const groups = require('./groups.json'); + +class Gitlab { + constructor(credentials) { + this.credentials = credentials; + this.allGroupsStub = sinon.stub().yields(groups); + this.groups = { + all: this.allGroupsStub, + }; + } +} + +module.exports = Gitlab; diff --git a/tests/fixtures/groups.json b/tests/fixtures/groups.json new file mode 100644 index 0000000..8910525 --- /dev/null +++ b/tests/fixtures/groups.json @@ -0,0 +1,14 @@ +[ + { + "id": 1, + "name": "Foobar Group", + "path": "foo-bar", + "description": "An interesting group" + }, + { + "id": 2, + "name": "Foobaz Group", + "path": "foo-baz", + "description": "Yet another interesting group" + } +] diff --git a/tests/fixtures/html-pdf.js b/tests/fixtures/html-pdf.js new file mode 100644 index 0000000..6058831 --- /dev/null +++ b/tests/fixtures/html-pdf.js @@ -0,0 +1,27 @@ +/** + * @fileOverview Fixture for html pdf + */ +const R = require('ramda'); +const sinon = require('sinon'); + +function HtmlPDF() { + this.createStub = sinon.stub(); + this.toFileStub = sinon.stub(); + this.x = 'v'; + this.create = (htmlString) => { + R.call(this.createStub, htmlString); + this.htmlString = htmlString; + return this; + }; + + this.toFile = (outputPath, cb) => { + R.call(this.toFileStub, outputPath, cb); + if (outputPath) { + cb(null, ''); + } else { + cb(new Error('The output path doesnt exists'), null); + } + }; +} + +module.exports = new HtmlPDF(); diff --git a/tests/fixtures/load-config.json b/tests/fixtures/load-config.json new file mode 100644 index 0000000..a87ce10 --- /dev/null +++ b/tests/fixtures/load-config.json @@ -0,0 +1,12 @@ +{ + "REVIEWERS_NAME": "Anthony Gonsalvis", + "API_TOKEN": "pKZosz1ke344Hzgxkv4E", + "GITLAB_URL": "https://gitlab-cts.stackroute.in/", + "INCLUDED_GROUPS": [ + 162 + ], + "EXCLUDED_GROUPS": [ + 163 + ], + "ASSIGNMENT": "BootstrapAssignment" +} diff --git a/tests/fixtures/opn.js b/tests/fixtures/opn.js new file mode 100644 index 0000000..0e22839 --- /dev/null +++ b/tests/fixtures/opn.js @@ -0,0 +1,11 @@ +/** + * @fileOverview Fixture for opn package + */ +const sinon = require('sinon'); + +/** + * Stubs the open function of the opn npm package + */ +const opn = sinon.stub().returns({ pageOpened: true }); + +module.exports = opn; diff --git a/tests/fixtures/progressBar.js b/tests/fixtures/progressBar.js new file mode 100644 index 0000000..2178e8a --- /dev/null +++ b/tests/fixtures/progressBar.js @@ -0,0 +1,20 @@ +/** + * @fileOverview Fixture for ProgressBar + */ +const sinon = require('sinon'); + +class Bar { + constructor() { + this.startStub = sinon.stub().returns(Promise.resolve('started')); + this.incrementStub = sinon.stub().returns(Promise.resolve('incremented')); + this.start = this.startStub; + this.increment = this.incrementStub; + } +} + +// Wraps Bar under the progress namespace +const Progress = { + Bar, +}; + +module.exports = Progress; diff --git a/tests/fixtures/request-members.js b/tests/fixtures/request-members.js new file mode 100644 index 0000000..ef82e4a --- /dev/null +++ b/tests/fixtures/request-members.js @@ -0,0 +1,12 @@ +/** + * @fileOverview Fixure for the request module + */ +const sinon = require('sinon'); +const cadets = require('../fixtures/cadets.json'); + +/** + * Fakes the request module with a stub + */ +const request = sinon.stub().returns(Promise.resolve(cadets)); + +module.exports = request; diff --git a/tests/fixtures/shell.js b/tests/fixtures/shell.js new file mode 100644 index 0000000..4c9c74b --- /dev/null +++ b/tests/fixtures/shell.js @@ -0,0 +1,12 @@ +/** + * @fileOverview Fixture to list + * directories in shelljs npm package + */ +const R = require('ramda'); +const cadets = require('./cadets.json'); + +const ls = () => R.map(cadet => `${cadet.username}/`, cadets); + +module.exports = { + ls, +}; diff --git a/tests/lib/cli-usage.js b/tests/lib/cli-usage.js new file mode 100644 index 0000000..9ea9a07 --- /dev/null +++ b/tests/lib/cli-usage.js @@ -0,0 +1,24 @@ +/** + * @fileOverview Unit tests cli-usage of coderoom + */ +const R = require('ramda'); +const should = require('should'); +const proxyquire = require('proxyquire'); + +/** + * Stubs the commandline with an identity function + */ +const commandLineUsageStub = R.identity; + +const proxiedCliUsage = proxyquire('../../lib/cli-usage', { + 'command-line-usage': commandLineUsageStub, +}); + +describe('cli-usage', () => { + it('should get the cli-usage of coderoom', () => { + should.exist(proxiedCliUsage); + proxiedCliUsage.should.be.an.instanceOf(Array); + proxiedCliUsage.length.should.be.exactly(2); + proxiedCliUsage[1].content.length.should.be.exactly(6); + }); +}); diff --git a/tests/lib/clone.fp.js b/tests/lib/clone.fp.js new file mode 100644 index 0000000..1f67e74 --- /dev/null +++ b/tests/lib/clone.fp.js @@ -0,0 +1,174 @@ +const R = require('ramda'); +const sinon = require('sinon'); +const should = require('should'); +const proxyquire = require('proxyquire'); + +const cadets = require('../fixtures/cadets.json'); +const config = require('../fixtures/load-config.json'); +const progressBar = require('../fixtures/progressBar'); + +const cloneCMD = 'git clone git@gitlab-cts.stackroute.in:Anthony.Gonsalvis/BootstrapAssignment.git Anthony.Gonsalvis'; + +const errorStub = sinon.stub(); + +const cloneScript = proxyquire('../../lib/clone.fp.js', { + './members.fp': { + getCadets: () => Promise.resolve(cadets), + }, + './config/config-file.fp': { + getConfig: () => config, + }, + shelljs: { + exec: (command, options, cb) => { + if (R.equals(command, cloneCMD)) { + cb(0); + } else { + cb(1, null, 'Couldnt clone the repository due no access rights'); + } + }, + rm: () => 0, + which: R.T, + }, + '../logger': () => ({ + error: errorStub, + }), + 'cli-progress': progressBar, +}); + +describe('Clone', () => { + it('`getAssignment` should be able to get the assignment', () => { + const assignment = R.call(cloneScript.__private__.getAssignment); + should.exist(assignment); + assignment.should.be.exactly('BootstrapAssignment'); + }); + + it('`buildCloneCmd` should return a command to clone repositories', () => { + const { buildCloneCmd } = cloneScript.__private__; + const cmd = R.call(buildCloneCmd, 'gitlab-cts.stackroute.in', 'BootstrapAssignment', 'Anthony.Gonsalvis'); + should.exist(cmd); + cmd.should.be.exactly(cloneCMD); + }); + + it('`buildCloneCmdWithGitlabUrl` should return a git clone command', () => { + const { buildCloneCmdWithGitlabUrl } = cloneScript.__private__; + const cmd = R.call(buildCloneCmdWithGitlabUrl, 'BootstrapAssignment', 'Anthony.Gonsalvis'); + should.exist(cmd); + cmd.should.be.exactly(cloneCMD); + }); + + it('`buildCloneCmdWithGitlabUrlOverAssignment` should return a cmd to clone git repository', () => { + const { buildCloneCmdWithGitlabUrlOverAssignment } = cloneScript.__private__; + const cmd = R.call(buildCloneCmdWithGitlabUrlOverAssignment, 'Anthony.Gonsalvis'); + should.exist(cmd); + cmd.should.be.exactly(cloneCMD); + }); + + it('`getUrlWithNoProtocol` should return a url removing the protcol substring', () => { + const { getUrlWithNoProtocol } = cloneScript.__private__; + const url = R.call(getUrlWithNoProtocol, 'https://gitlab-cts.stackroute.in/'); + should.exist(url); + url.should.be.exactly('gitlab-cts.stackroute.in'); + }); + + it('`throwGitDoesntExists`', () => { + const { throwGitDoesntExists } = cloneScript.__private__; + try { + R.call(throwGitDoesntExists); + } catch (err) { + should.exist(err); + err.message.should.be.exactly("package 'git' could not be found. Coderoom depends on 'GIT'"); + } + }); + + it('`promisifiedShellExecCmd` should exec the command and return its result', (done) => { + const { promisifiedShellExecCmd } = cloneScript.__private__; + const exec = R.call(promisifiedShellExecCmd, {}, cloneCMD); + exec.then((code) => { + should.exist(code); + code.should.be.exactly(0); + done(); + }); + }); + + it('`promisifiedShellExecCmd` should throw error and', (done) => { + const { promisifiedShellExecCmd } = cloneScript.__private__; + R.call(promisifiedShellExecCmd, {}, `${cloneCMD}/`) + .then(() => { + console.log(errorStub.args); + sinon.assert.calledOnce(errorStub); + done(); + }); + }); + + it('`curriedExecCommand` should exec the command and return its result', (done) => { + const { curriedExecCommand } = cloneScript.__private__; + const exec = R.call(curriedExecCommand, {}, cloneCMD); + + exec.then((code) => { + should.exist(code); + code.should.exactly(0); + done(); + }); + }); + + it('`deleteExistingRepos` deletes all the repos', () => { + const { deleteExistingRepos } = cloneScript.__private__; + const exitCode = R.call(deleteExistingRepos); + should.exist(exitCode); + exitCode.should.be.exactly(0); + }); + + it('`checkIfGitExists` checks if the git exists', () => { + const { checkIfGitExists } = cloneScript.__private__; + const exitCode = R.call(checkIfGitExists); + should.exist(exitCode); + exitCode.should.be.exactly(true); + }); + + it('`cloneAllAssignments` should clone a repository', (done) => { + const { cloneAllAssignments, progressBar: progressBarStub } = cloneScript.__private__; + const exitCode = R.call(cloneAllAssignments, cadets); + Promise.all(exitCode).then(() => { + sinon.assert.calledOnce(progressBarStub.startStub); + sinon.assert.calledTwice(progressBarStub.incrementStub); + progressBarStub.startStub.reset(); + progressBarStub.incrementStub.reset(); + done(); + }); + }); + + it('`startProgressBar` should start the progressBar', () => { + const { startProgressBar, progressBar: progressBarStub } = cloneScript.__private__; + R.call(startProgressBar, cadets); + sinon.assert.calledOnce(progressBarStub.startStub); + progressBarStub.startStub.reset(); + }); + + it('`incrementProgressBar` should increment the progress bar', () => { + const { incrementProgressBar, progressBar: progressBarStub } = cloneScript.__private__; + R.call(incrementProgressBar); + sinon.assert.calledOnce(progressBarStub.incrementStub); + progressBarStub.incrementStub.reset(); + }); + + it('`cloneRepo` should clone a repository for a user', (done) => { + const { cloneRepo, progressBar: progressBarStub } = cloneScript.__private__; + const exit = R.call(cloneRepo, 'Anthony.Gonsalvis'); + exit.then(() => { + sinon.assert.calledOnce(progressBarStub.incrementStub); + progressBarStub.incrementStub.reset(); + done(); + }); + }); + + it('`clone` should get all the cadets and clone all the repositories', (done) => { + const { clone } = cloneScript; + const { progressBar: progressBarStub } = cloneScript.__private__; + const exit = R.call(clone); + exit.then(() => { + sinon.assert.calledOnce(progressBarStub.startStub); + sinon.assert.calledTwice(progressBarStub.incrementStub); + done(); + }); + }); +}); diff --git a/tests/lib/config/config-file.fp.js b/tests/lib/config/config-file.fp.js new file mode 100644 index 0000000..43d11f4 --- /dev/null +++ b/tests/lib/config/config-file.fp.js @@ -0,0 +1,182 @@ +/** + * @fileOverview Unit Tests for configFile + * @author Nishant Jain + */ + +const R = require('ramda'); +const path = require('path'); +const sinon = require('sinon'); +const should = require('should'); +const proxyquire = require('proxyquire'); +const configFile = require('../../../lib/config/config-file.fp'); +const mockConfig = require('../..//fixtures/load-config.json'); + +const { + returnEmptyObject, + throwConfigFileNotFound, + yamlStringifyTo2Spaces, + transformToGlobalConfig, +} = configFile.__private__; + +const getGlobalMockConfig = () => { + const mockGlobalConfig = { + REVIEWERS_NAME: 'Anthony Gonsalvis', + 'https://gitlab-cts.stackroute.in/': 'pKZosz1ke344Hzgxkv4E', + }; + return mockGlobalConfig; +}; + +describe('lib/config/config-file', () => { + it('`.returnEmptyObject` Should return empty object', () => { + const obj = returnEmptyObject(); + should.exist(obj); + obj.should.be.empty(); + }); + + it('`throwConfigFileNotFound` should throwConfigFileNotFound', () => { + try { + throwConfigFileNotFound(); + } catch (err) { + should.exist(err); + err.should.have.property('message'); + err.message.should.be.exactly("The configuration file .reviewrc cannot be found. Use 'coderoom initialize' command to initialize coderoom in the folder"); + } + }); + + it('`yamlStringifyTo2Spaces` should convert a config into yaml format', () => { + const config = { foo: 'bar' }; + const yamlStringifiedConfig = yamlStringifyTo2Spaces(config); + should.exist(yamlStringifiedConfig); + yamlStringifiedConfig.should.be.an.instanceOf(String); + yamlStringifiedConfig.should.be.exactly('foo: bar\n'); + }); + + it('`loadConfig` should load the config object from the supplied configFile', () => { + const yamlLoadStub = () => mockConfig; + const proxifiedConfig = proxyquire('../../../lib/config/config-file.fp', { + yamljs: { + load: yamlLoadStub, + }, + }); + const errorHandler = () => ({}); + const configFilePath = path.join(process.cwd(), 'lib/config/.reviewrc.global'); + const { loadConfig } = proxifiedConfig.__private__; + const loadedConfig = R.call(loadConfig, errorHandler, configFilePath); + should.exist(loadedConfig); + loadedConfig.should.be.exactly(mockConfig); + loadedConfig.should.be.an.instanceOf(Object); + }); + + it('`loadConfig` should execute `errorHandler` incase of configFile not found', () => { + const yamlLoadStub = () => null; + const proxifiedConfig = proxyquire('../../../lib/config/config-file.fp', { + yamljs: { + load: yamlLoadStub, + }, + }); + const errorHandler = () => ({}); + const configFilePath = path.join(process.cwd(), 'lib/config/.reviewrc'); + const { loadConfig } = proxifiedConfig.__private__; + const loadedConfig = R.call(loadConfig, errorHandler, configFilePath); + should.exist(loadedConfig); + loadedConfig.should.be.empty(); + loadedConfig.should.an.instanceOf(Object); + }); + + it('`loadConfigDefaultingToEmptyObject` should return empty object incase of config file not found and should return config if the config file is present', () => { + const yamlLoadStub = () => mockConfig; + const proxifiedConfig = proxyquire('../../../lib/config/config-file.fp', { + yamljs: { + load: yamlLoadStub, + }, + }); + const wrongConfigFilePath = path.join(process.cwd(), 'lib/config/.reviewrc'); + const { loadConfigDefaultingToEmptyObject } = proxifiedConfig.__private__; + const loadedConfigInCaseOfFileNotFound = R.call( + loadConfigDefaultingToEmptyObject, + wrongConfigFilePath, + ); + should.exist(loadedConfigInCaseOfFileNotFound); + loadedConfigInCaseOfFileNotFound.should.be.empty(); + loadedConfigInCaseOfFileNotFound.should.be.an.instanceOf(Object); + const configFilePath = path.join(process.cwd(), 'lib/config/.reviewrc.global'); + const loadedConfig = R.call(loadConfigDefaultingToEmptyObject, configFilePath); + should.exist(loadedConfig); + loadedConfig.should.not.be.empty(); + loadedConfig.should.be.exactly(mockConfig); + loadedConfig.should.be.an.instanceOf(Object); + }); + + it('`loadConfigDefaultingToError` should return the config if the config file path is found and throw error if its not found', () => { + const yamlLoadStub = () => mockConfig; + const proxifiedConfig = proxyquire('../../../lib/config/config-file.fp', { + yamljs: { + load: yamlLoadStub, + }, + }); + const wrongConfigFilePath = path.join(process.cwd(), 'lib/config/.reviewrc'); + const { loadConfigDefaultingToError } = proxifiedConfig.__private__; + try { + R.call( + loadConfigDefaultingToError, + wrongConfigFilePath, + ); + } catch (err) { + should.exist(err); + err.message.should.be.exactly('The configuration file .reviewrc cannot be found. Use \'coderoom initialize\' command to initialize coderoom in the folder'); + } + const configFilePath = path.join(process.cwd(), 'lib/config/.reviewrc.global'); + const loadedConfig = R.call(loadConfigDefaultingToError, configFilePath); + should.exist(loadedConfig); + loadedConfig.should.be.exactly(mockConfig); + }); + + it('should transformLocalConfig', () => { + const transformedConfig = transformToGlobalConfig(mockConfig); + should.exist(transformedConfig); + transformedConfig.should.not.be.empty(); + transformedConfig.should.have.property('REVIEWERS_NAME', 'Anthony Gonsalvis'); + transformedConfig.should.have.property('https://gitlab-cts.stackroute.in/', 'pKZosz1ke344Hzgxkv4E'); + }); + + it('should get and set config', () => { + const yamlMockConfigStringified = yamlStringifyTo2Spaces(mockConfig); + const writeFileSyncStub = sinon.stub().returns(yamlMockConfigStringified); + const proxifiedConfig = proxyquire('../../../lib/config/config-file.fp', { + fs: { + existsSync: () => true, + writeFileSync: writeFileSyncStub, + }, + yamljs: { + load: () => mockConfig, + }, + }); + const writtenConfig = R.call(proxifiedConfig.setConfig, mockConfig); + should.exist(writtenConfig); + writtenConfig.should.be.exactly(yamlMockConfigStringified); + const fetchedConfig = R.call(proxifiedConfig.getConfig); + should.exist(fetchedConfig); + fetchedConfig.should.be.exactly(mockConfig); + }); + + it('should get and set global config', () => { + const config = getGlobalMockConfig(); + const yamlMockConfigStringified = yamlStringifyTo2Spaces(config); + const writeFileSyncStub = sinon.stub().returns(yamlMockConfigStringified); + const proxifiedConfig = proxyquire('../../../lib/config/config-file.fp', { + fs: { + existsSync: () => true, + writeFileSync: writeFileSyncStub, + }, + yamljs: { + load: () => mockConfig, + }, + }); + const writtenConfig = R.call(proxifiedConfig.setGlobalConfig, mockConfig); + should.exist(writtenConfig); + writtenConfig.should.be.exactly(yamlMockConfigStringified); + const fetchedConfig = R.call(proxifiedConfig.getGlobalConfig); + should.exist(fetchedConfig); + fetchedConfig.should.exactly(mockConfig); + }); +}); diff --git a/tests/lib/config/config-initializer.fp.js b/tests/lib/config/config-initializer.fp.js new file mode 100644 index 0000000..eaf84b9 --- /dev/null +++ b/tests/lib/config/config-initializer.fp.js @@ -0,0 +1,83 @@ +const R = require('ramda'); +const sinon = require('sinon'); +const should = require('should'); +const proxyquire = require('proxyquire'); +const mockConfig = require('../../fixtures/load-config.json'); + +const configInitializer = proxyquire('../../../lib/config/config-initializer.fp', { + inquirer: { + prompt: questions => Promise.resolve(questions), + }, + './config-file.fp': { + getGlobalConfig: () => { + const mockGlobalConfig = { + REVIEWERS_NAME: 'Nishant Jain', + 'https://gitlab-cts.stackroute.in/': 'pKZosz1ke344Hzgxkv4E', + }; + return mockGlobalConfig; + }, + setConfig: config => config, + setGlobalConfig: config => config, + }, +}); + +const { + _getQuestions, + _setConfigs, + _promptQuestions, +} = configInitializer; + +const getExpectedQuestionNames = () => { + const expectedQuestionNames = [ + 'REVIEWERS_NAME', + 'GITLAB_URL', + 'API_TOKEN', + 'INCLUDED_GROUPS', + 'EXCLUDED_GROUPS', + 'ASSIGNMENT', + ]; + return expectedQuestionNames; +}; + +describe('Config Initializer', () => { + it('getQuestions should get Questions', () => { + const questions = _getQuestions(); + const questionNames = questions.map(question => question.name); + const expectedQuestionNames = getExpectedQuestionNames(); + should.exist(questionNames); + questionNames.should.be.an.Array(); + questionNames.length.should.be.exactly(expectedQuestionNames.length); + questionNames.should.eql(expectedQuestionNames); + }); + + it('promptQuestions Should prompt questions', () => { + const expectedQuestionNames = getExpectedQuestionNames(); + const getQuestionNames = questions => questions.map(question => question.name); + const assertExpectedQuestionNames = questionNames => + questionNames.should.eql(expectedQuestionNames); + R.composeP(assertExpectedQuestionNames, getQuestionNames, _promptQuestions)(); + }); + + it('setConfigs should call setConfig and setGlobalConfig', () => { + const configs = _setConfigs(mockConfig); + configs.should.be.an.Array(); + configs.length.should.be.exactly(2); + configs[0].should.be.exactly(mockConfig); + configs[1].should.be.exactly(mockConfig); + }); + + it('initializeConfig should call setConfigs and promptQuestions', (done) => { + const setConfigStub = sinon.stub(configInitializer, '_setConfigs').resolves(mockConfig); + const promptQuestionsStub = sinon.stub(configInitializer, '_promptQuestions').resolves(mockConfig); + const assertSetConfigsIsCalled = () => setConfigStub.called.should.be.true(); + const assertPromptQuestionsIsCalled = () => promptQuestionsStub.called.should.be.true(); + const callDone = () => done(); + const composeSequence = [ + callDone, + assertPromptQuestionsIsCalled, + assertSetConfigsIsCalled, + configInitializer.initializeConfig, + ]; + R.call(R.composeP(...composeSequence)); + }); +}); diff --git a/tests/lib/config/file-name.fp.js b/tests/lib/config/file-name.fp.js new file mode 100644 index 0000000..9687720 --- /dev/null +++ b/tests/lib/config/file-name.fp.js @@ -0,0 +1,30 @@ +/** + * @fileOverview Unit tests for file-name.fp.js + * @author Nishant Jain + */ +const path = require('path'); +const should = require('should'); +const { + getPathToLocalConfig, + getPathToGlobalConfig, +} = require('../../../lib/config/file-name.fp'); + +describe('lib/config/file-name.js', () => { + it('Should return path to the global config', () => { + const cwd = process.cwd(); + const expectedGlobalPath = path.join(cwd, 'lib/config/.reviewrc.global'); + const globalPath = getPathToGlobalConfig(); + should.exist(globalPath); + globalPath.should.equal(expectedGlobalPath); + globalPath.should.be.an.instanceOf(String); + }); + + it('Should return path to the local config', () => { + const cwd = process.cwd(); + const expectedLocalPath = path.join(cwd, '.reviewrc'); + const localPath = getPathToLocalConfig(); + should.exist(localPath); + localPath.should.be.an.instanceOf(String); + localPath.should.equal(expectedLocalPath); + }); +}); diff --git a/tests/lib/groups.fp.js b/tests/lib/groups.fp.js new file mode 100644 index 0000000..faaa40a --- /dev/null +++ b/tests/lib/groups.fp.js @@ -0,0 +1,32 @@ +const R = require('ramda'); +const should = require('should'); +const proxyquire = require('proxyquire'); +const proxiedGitlab = require('../fixtures/gitlab-groups'); +const proxiedGitlabWithNoGroups = require('../fixtures/gitlab-groups-none'); + +describe('Groups', () => { + it('should load all the groups as choices', (done) => { + const groupLoader = proxyquire('../../lib/groups.fp.js', { + gitlab: proxiedGitlab, + }); + const load = R.call(groupLoader, { url: 'http://gitlab-cts.stackroute.in', token: 'ThisIsAToken' }); + load.then((groups) => { + should.exist(groups); + groups.should.be.a.instanceOf(Array); + groups[0].should.have.properties(['name', 'value']); + done(); + }); + }); + + it('should throw an error if the groups doesnt exists', (done) => { + const groupLoader = proxyquire('../../lib/groups.fp.js', { + gitlab: proxiedGitlabWithNoGroups, + }); + const load = R.call(groupLoader, { url: 'http://gitlab-cts.stackroute.in', token: 'ThisIsAToken' }); + load.catch((err) => { + should.exist(err); + err.message.should.be.exactly('No Groups found'); + done(); + }); + }); +}); diff --git a/tests/lib/insights.fp.js b/tests/lib/insights.fp.js new file mode 100644 index 0000000..fbe04a7 --- /dev/null +++ b/tests/lib/insights.fp.js @@ -0,0 +1,71 @@ +/** + * @fileOvervier Unit Tests for Insights + */ +const R = require('ramda'); +const sinon = require('sinon'); +const should = require('should'); +const proxyquire = require('proxyquire'); +const htmlPDFFixture = require('../fixtures/html-pdf'); +const shellJSFixture = require('../fixtures/shell.js'); +const cadetsFixtures = require('../fixtures/cadets.json'); +const configFixtures = require('../fixtures/load-config.json'); + +const insights = proxyquire('../../lib/insights.fp', { + 'html-pdf': { + create: htmlPDFFixture.create, + }, + './members.fp': { + getCadets: () => Promise.resolve(cadetsFixtures), + }, + './config/config-file.fp': { + getConfig: () => configFixtures, + }, + shelljs: shellJSFixture, +}); + +describe('Insights', () => { + it('Should get the submission info', (done) => { + const { getSubmissionsInfo } = insights.__private__; + const submissionInfoP = R.call(getSubmissionsInfo); + const submissionInfoProps = [ + 'totalMembers', + 'totalDefaultedMembers', + 'totalSubmittedMembers', + 'defaultedMembers', + 'submittedMembers', + 'generatedOn', + 'assignmentName', + ]; + submissionInfoP.then((submissionInfo) => { + should.exist(submissionInfo); + submissionInfo.should.have.properties(submissionInfoProps); + submissionInfo.totalMembers.should.be.exactly(2); + submissionInfo.totalDefaultedMembers.should.be.exactly(0); + submissionInfo.totalSubmittedMembers.should.be.exactly(2); + submissionInfo.defaultedMembers.should.be.empty(); + submissionInfo.submittedMembers.should.not.be.empty(); + submissionInfo.assignmentName.should.be.exactly('BootstrapAssignment'); + done(); + }); + }); + + it('should generateInsightsAsPDF', (done) => { + const generatedPDF = R.call(insights.generateInsightsAsPDF); + generatedPDF.then(() => { + sinon.assert.calledOnce(htmlPDFFixture.createStub); + sinon.assert.calledOnce(htmlPDFFixture.toFileStub); + done(); + }); + }); +}); + +describe('createPDF', () => { + it('Should throw an exception in the absence of an exception if the outputpath is not right', (done) => { + const { createPDF } = insights.__private__; + R.call(createPDF, null, 'This is a body').catch((err) => { + should.exist(err); + err.message.should.be.exactly('The output path doesnt exists'); + done(); + }); + }); +}); diff --git a/tests/lib/members.fp.js b/tests/lib/members.fp.js new file mode 100644 index 0000000..14fb36f --- /dev/null +++ b/tests/lib/members.fp.js @@ -0,0 +1,39 @@ +/** + * @fileOverview Unit tests getCadets for members.fp.js + */ + +const should = require('should'); +const proxyquire = require('proxyquire'); +const config = require('../fixtures/load-config.json'); +const proxiedRequest = require('../fixtures/request-members'); + +/** + * Requires getCadets by mocking + * 1. getConfig present in the config-file + * by mock config. + * 2. request-promise-native by request-members + * which returns cadets + */ +const { getCadets } = proxyquire('../../lib/members.fp', { + './config/config-file.fp': { + getConfig: () => config, + }, + 'request-promise-native': proxiedRequest, +}); + +describe('members', () => { + it('should getCadets', (done) => { + const cadetsP = getCadets(); + cadetsP.then((cadets) => { + should.exist(cadets); + cadets.should.be.an.instanceOf(Array); + /** + * Since proxied request libary returns same + * list of cadets for both included and excluded groups, + * the list should be empty. + */ + cadets.should.be.empty(); + done(); + }); + }); +}); diff --git a/tests/lib/members.js b/tests/lib/members.js new file mode 100644 index 0000000..c061bef --- /dev/null +++ b/tests/lib/members.js @@ -0,0 +1,58 @@ +/* eslint no-underscore-dangle: ["error", { "allow": ["__set__"] }] */ + +const should = require('should'); +const rewire = require('rewire'); +const sinon = require('sinon'); + +const members = rewire('../../lib/members.js'); + +describe('members', () => { + before(() => { + // Create a mock config object + const mockConfig = { + load: () => ({ + API_TOKEN: 'pKZosz1ke344Hzgxkv4E', + GITLAB_URL: 'https://gitlab-cts.stackroute.in/', + INCLUDED_GROUPS: [ + 162, + ], + EXCLUDED_GROUPS: [ + 163, + ], + }), + }; + + const getMembersOfGroupAsyncStubResults = { + cadets: new Promise(r => r([ + { + name: 'Cadet Foo Bar', + username: 'Cadet.Foo.Bar', + }, + ])), + mentors: new Promise(r => r([ + { + name: 'Mentor Foo Bar', + username: 'Mentor.Foo.Bar', + }, + ])), + }; + + const getMembersOfGroupAsyncStub = sinon.stub(); + + getMembersOfGroupAsyncStub.withArgs('https://gitlab-cts.stackroute.in/', 'pKZosz1ke344Hzgxkv4E', 162).returns(getMembersOfGroupAsyncStubResults.cadets); + + getMembersOfGroupAsyncStub.withArgs('https://gitlab-cts.stackroute.in/', 'pKZosz1ke344Hzgxkv4E', 163).returns(getMembersOfGroupAsyncStubResults.mentors); + + members.__set__('config', mockConfig); + members.__set__('getMembersOfGroupAsync', getMembersOfGroupAsyncStub); + }); + + it('Should load all the members of the group', async () => { + const cadets = await members.load(); + should.exist(cadets); + cadets.should.be.an.instanceOf(Array); + cadets.length.should.be.exactly(1); + cadets[0].should.have.property('name', 'Cadet Foo Bar'); + cadets[0].should.have.property('username', 'Cadet.Foo.Bar'); + }); +}); diff --git a/tests/lib/open-issues.fp.js b/tests/lib/open-issues.fp.js new file mode 100644 index 0000000..5e062f1 --- /dev/null +++ b/tests/lib/open-issues.fp.js @@ -0,0 +1,31 @@ +/** + * @fileOverview Unit Test for open issues + */ +const R = require('ramda'); +const sinon = require('sinon'); +const should = require('should'); +const proxyquire = require('proxyquire'); +const proxiedOpn = require('../fixtures/opn.js'); + +/** + * Creates a stub function to get the git + * remote origin url. + */ +const stubbedExec = sinon.stub().returns({ + stdout: 'git@gitlab-cts.stackroute.in:Anthony.Gonsalvis/BootstrapAssignment.git', +}); + +const { openIssues } = proxyquire('../../lib/open-issues.fp.js', { + opn: proxiedOpn, + shelljs: { + exec: stubbedExec, + }, +}); + +describe('Open Issues', () => { + it('should open the issues page', () => { + const result = R.call(openIssues); + should.exist(result); + result.pageOpened.should.be.exactly(true); + }); +}); diff --git a/yarn.lock b/yarn.lock index 9d44387..33854a1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -120,7 +120,7 @@ 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.22.0, babel-code-frame@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" dependencies: @@ -128,6 +128,122 @@ babel-code-frame@^6.22.0: esutils "^2.0.2" js-tokens "^3.0.2" +babel-core@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.0.tgz#af32f78b31a6fcef119c87b0fd8d9753f03a0bb8" + dependencies: + babel-code-frame "^6.26.0" + babel-generator "^6.26.0" + babel-helpers "^6.24.1" + babel-messages "^6.23.0" + babel-register "^6.26.0" + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + convert-source-map "^1.5.0" + debug "^2.6.8" + json5 "^0.5.1" + lodash "^4.17.4" + minimatch "^3.0.4" + path-is-absolute "^1.0.1" + private "^0.1.7" + slash "^1.0.0" + source-map "^0.5.6" + +babel-generator@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.0.tgz#ac1ae20070b79f6e3ca1d3269613053774f20dc5" + dependencies: + babel-messages "^6.23.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + detect-indent "^4.0.0" + jsesc "^1.3.0" + lodash "^4.17.4" + source-map "^0.5.6" + trim-right "^1.0.1" + +babel-helpers@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +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-transform-es2015-block-scoping@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f" + dependencies: + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" + +babel-register@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" + dependencies: + babel-core "^6.26.0" + babel-runtime "^6.26.0" + core-js "^2.5.0" + home-or-tmp "^2.0.0" + lodash "^4.17.4" + mkdirp "^0.5.1" + source-map-support "^0.4.15" + +babel-runtime@^6.22.0, babel-runtime@^6.26.0: + 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-template@^6.24.1, babel-template@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" + dependencies: + babel-runtime "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + lodash "^4.17.4" + +babel-traverse@^6.26.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@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" + balanced-match@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" @@ -161,6 +277,10 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" +browser-stdout@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.0.tgz#f351d32969d32fa5d7a5567154263d928ae3bd1f" + 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" @@ -230,6 +350,12 @@ cli-progress-bar@^1.0.1: lodash.padstart "^4.6.1" log-update "^1.0.2" +cli-progress@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/cli-progress/-/cli-progress-1.7.0.tgz#401cdfeacc1a34afc281b4bdf88829236724c92f" + dependencies: + colors "^1.1.2" + cli-width@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" @@ -248,6 +374,10 @@ color-name@^1.1.1: version "1.1.3" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" +colors@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" + 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" @@ -271,6 +401,10 @@ command-line-usage@^4.0.2: table-layout "^0.4.2" typical "^2.6.1" +commander@2.11.0: + version "2.11.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563" + concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" @@ -283,10 +417,25 @@ concat-stream@1.6.0, concat-stream@^1.6.0: readable-stream "^2.2.2" typedarray "^0.0.6" +concurrify@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/concurrify/-/concurrify-1.0.3.tgz#591f4675271b5ee5b90ef209eadda37b782e735b" + dependencies: + sanctuary-type-classes "^8.0.0" + sanctuary-type-identifiers "^2.0.0" + contains-path@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" +convert-source-map@^1.5.0: + version "1.5.1" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5" + +core-js@^2.4.0, core-js@^2.5.0: + version "2.5.3" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.3.tgz#8acc38345824f16d8365b7c9b4259168e8ed603e" + 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" @@ -317,7 +466,7 @@ date-time@^2.1.0: dependencies: time-zone "^1.0.0" -debug@*, debug@^3.0.1: +debug@*, debug@3.1.0, debug@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" dependencies: @@ -353,6 +502,24 @@ delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" +denque@^1.1.1: + version "1.2.3" + resolved "https://registry.yarnpkg.com/denque/-/denque-1.2.3.tgz#98c50c8dd8cdfae318cc5859cc8ee3da0f9b0cc2" + +detect-indent@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" + dependencies: + repeating "^2.0.0" + +diff@3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/diff/-/diff-3.3.1.tgz#aa8567a6eed03c531fc89d3f711cd0e5259dec75" + +diff@^3.1.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-3.4.0.tgz#b1d85507daf3964828de54b37d0d73ba67dda56c" + doctrine@1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" @@ -360,9 +527,9 @@ doctrine@1.5.0: esutils "^2.0.2" isarray "^1.0.0" -doctrine@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.0.2.tgz#68f96ce8efc56cc42651f1faadb4f175273b0075" +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" dependencies: esutils "^2.0.2" @@ -382,7 +549,7 @@ es6-promise@^4.0.3: version "4.1.1" resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.1.1.tgz#8811e90915d9a0dba36274f0b242dbda78f9c92a" -escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: +escape-string-regexp@1.0.5, 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" @@ -432,21 +599,25 @@ eslint-scope@^3.7.1: esrecurse "^4.1.0" estraverse "^4.1.1" -eslint@^4.12.1: - version "4.12.1" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.12.1.tgz#5ec1973822b4a066b353770c3c6d69a2a188e880" +eslint-visitor-keys@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" + +eslint@^4.17.0: + version "4.17.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.17.0.tgz#dc24bb51ede48df629be7031c71d9dc0ee4f3ddf" dependencies: ajv "^5.3.0" babel-code-frame "^6.22.0" chalk "^2.1.0" concat-stream "^1.6.0" cross-spawn "^5.1.0" - debug "^3.0.1" - doctrine "^2.0.2" + debug "^3.1.0" + doctrine "^2.1.0" eslint-scope "^3.7.1" + eslint-visitor-keys "^1.0.0" espree "^3.5.2" esquery "^1.0.0" - estraverse "^4.2.0" esutils "^2.0.2" file-entry-cache "^2.0.0" functional-red-black-tree "^1.0.1" @@ -498,7 +669,7 @@ esrecurse@^4.1.0: estraverse "^4.1.0" object-assign "^4.0.1" -estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: +estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1: version "4.2.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" @@ -570,6 +741,13 @@ file-entry-cache@^2.0.0: flat-cache "^1.2.1" object-assign "^4.0.1" +fill-keys@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/fill-keys/-/fill-keys-1.0.2.tgz#9a8fa36f4e8ad634e3bf6b4f3c8882551452eb20" + dependencies: + is-object "~1.0.1" + merge-descriptors "~1.0.0" + find-replace@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/find-replace/-/find-replace-1.0.3.tgz#b88e7364d2d9c959559f388c66670d6130441fa0" @@ -599,6 +777,16 @@ flat-cache@^1.2.1: graceful-fs "^4.1.2" write "^0.2.1" +fluture@^8.0.2: + version "8.0.2" + resolved "https://registry.yarnpkg.com/fluture/-/fluture-8.0.2.tgz#015f8b36b994188fb33d3bfa0da327b520a5e047" + dependencies: + concurrify "^1.0.0" + denque "^1.1.1" + inspect-f "^1.2.0" + sanctuary-type-classes "^8.0.0" + sanctuary-type-identifiers "^2.0.0" + forever-agent@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" @@ -611,6 +799,12 @@ form-data@~2.3.1: combined-stream "^1.0.5" mime-types "^2.1.12" +formatio@1.2.0, formatio@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/formatio/-/formatio-1.2.0.tgz#f3b2167d9068c4698a8d51f4f760a39a54d818eb" + dependencies: + samsam "1.x" + fs-extra@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-1.0.0.tgz#cd3ce5f7e7cb6145883fcae3191e9877f8587950" @@ -644,7 +838,7 @@ gitlab@^1.7.1: debug "*" slumber "0.9.0" -glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.2: +glob@7.1.2, glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.2: version "7.1.2" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" dependencies: @@ -667,6 +861,10 @@ globals@^11.0.1: version "11.0.1" resolved "https://registry.yarnpkg.com/globals/-/globals-11.0.1.tgz#12a87bb010e5154396acc535e1e43fc753b0e5e8" +globals@^9.18.0: + version "9.18.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" + globby@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" @@ -686,6 +884,10 @@ graceful-fs@~1.2.0: version "1.2.3" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-1.2.3.tgz#15a4806a57547cb2d2dbf27f42e89a8c3451b364" +growl@1.10.3: + version "1.10.3" + resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.3.tgz#1926ba90cf3edfe2adb4927f5880bc22c66c790f" + har-schema@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" @@ -729,10 +931,21 @@ hawk@~6.0.2: hoek "4.x.x" sntp "2.x.x" +he@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd" + hoek@4.x.x: version "4.2.0" resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.0.tgz#72d9d0754f7fe25ca2d01ad8f8f9a9449a89526d" +home-or-tmp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.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" @@ -816,10 +1029,20 @@ inquirer@^4.0.1: strip-ansi "^4.0.0" through "^2.3.6" +inspect-f@^1.2.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/inspect-f/-/inspect-f-1.2.2.tgz#7572803dc59099850e51d5c94f3d7962df10e46d" + interpret@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.1.0.tgz#7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614" +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" + is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" @@ -830,10 +1053,20 @@ is-builtin-module@^1.0.0: dependencies: builtin-modules "^1.0.0" +is-finite@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" + dependencies: + number-is-nan "^1.0.0" + is-fullwidth-code-point@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" +is-object@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.1.tgz#8952688c5ec2ffd6b03ecc85e769e02903083470" + 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" @@ -872,6 +1105,10 @@ is-wsl@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" +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: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" @@ -884,7 +1121,7 @@ isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" -js-tokens@^3.0.2: +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" @@ -899,6 +1136,10 @@ jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" +jsesc@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" + 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" @@ -915,6 +1156,10 @@ 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.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" + jsonfile@^2.1.0: version "2.4.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" @@ -930,6 +1175,10 @@ jsprim@^1.2.2: json-schema "0.2.3" verror "1.10.0" +just-extend@^1.1.26: + version "1.1.27" + resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-1.1.27.tgz#ec6e79410ff914e472652abfa0e603c03d60e905" + kew@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/kew/-/kew-0.7.0.tgz#79d93d2d33363d6fdd2970b335d9141ad591d79b" @@ -967,6 +1216,10 @@ lodash.cond@^4.3.0: version "4.5.2" resolved "https://registry.yarnpkg.com/lodash.cond/-/lodash.cond-4.5.2.tgz#f471a1da486be60f6ab955d17115523dd1d255d5" +lodash.get@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" + lodash.padend@^4.6.1: version "4.6.1" resolved "https://registry.yarnpkg.com/lodash.padend/-/lodash.padend-4.6.1.tgz#53ccba047d06e158d311f45da625f4e49e6f166e" @@ -986,6 +1239,20 @@ log-update@^1.0.2: 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" + +lolex@^2.2.0: + version "2.3.2" + resolved "https://registry.yarnpkg.com/lolex/-/lolex-2.3.2.tgz#85f9450425103bf9e7a60668ea25dc43274ca807" + +loose-envify@^1.0.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" + dependencies: + js-tokens "^3.0.0" + lru-cache@2: version "2.7.3" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.7.3.tgz#6d4524e8b955f95d4f5b58851ce21dd72fb4e952" @@ -997,6 +1264,10 @@ lru-cache@^4.0.1: pseudomap "^1.0.2" yallist "^2.1.2" +merge-descriptors@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + mime-db@~1.30.0: version "1.30.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.30.0.tgz#74c643da2dd9d6a45399963465b26d5ca7d71f01" @@ -1034,12 +1305,31 @@ mkdirp@0.5.0: dependencies: minimist "0.0.8" -mkdirp@^0.5.1: +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" +mocha@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-5.0.0.tgz#cccac988b0bc5477119cba0e43de7af6d6ad8f4e" + dependencies: + browser-stdout "1.3.0" + commander "2.11.0" + debug "3.1.0" + diff "3.3.1" + escape-string-regexp "1.0.5" + glob "7.1.2" + growl "1.10.3" + he "1.1.1" + mkdirp "0.5.1" + supports-color "4.4.0" + +module-not-found-error@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/module-not-found-error/-/module-not-found-error-1.0.1.tgz#cf8b4ff4f29640674d6cdd02b0e3bc523c2bbdc0" + ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" @@ -1056,6 +1346,16 @@ natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" +nise@^1.2.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/nise/-/nise-1.2.2.tgz#9aa5edb500da38035884106e3c571341bc68b2c1" + dependencies: + formatio "^1.2.0" + just-extend "^1.1.26" + lolex "^1.6.0" + path-to-regexp "^1.7.0" + text-encoding "^0.6.4" + 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" @@ -1065,6 +1365,10 @@ normalize-package-data@^2.3.2: semver "2 || 3 || 4 || 5" validate-npm-package-license "^3.0.1" +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.2: version "0.8.2" resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" @@ -1106,7 +1410,11 @@ optionator@^0.8.2: type-check "~0.3.2" wordwrap "~1.0.0" -os-tmpdir@~1.0.2: +os-homedir@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + +os-tmpdir@^1.0.1, os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" @@ -1136,7 +1444,7 @@ 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: +path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" @@ -1148,6 +1456,12 @@ 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" @@ -1204,6 +1518,10 @@ prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" +private@^0.1.7: + version "0.1.8" + resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" + process-nextick-args@~1.0.6: version "1.0.7" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" @@ -1216,6 +1534,14 @@ progress@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f" +proxyquire@^1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/proxyquire/-/proxyquire-1.8.0.tgz#02d514a5bed986f04cbb2093af16741535f79edc" + dependencies: + fill-keys "^1.0.2" + module-not-found-error "^1.0.0" + resolve "~1.1.7" + pseudomap@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" @@ -1232,6 +1558,10 @@ querystring@0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" +ramda@^0.25.0: + version "0.25.0" + resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.25.0.tgz#8fdf68231cffa90bc2f9460390a0cb74a29b29a9" + 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" @@ -1269,6 +1599,16 @@ reduce-flatten@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/reduce-flatten/-/reduce-flatten-1.0.1.tgz#258c78efd153ddf93cb561237f61184f3696e327" +regenerator-runtime@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" + +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-progress@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/request-progress/-/request-progress-2.0.1.tgz#5d36bb57961c673aa5b788dbc8141fdf23b44e08" @@ -1281,6 +1621,14 @@ request-promise-core@1.1.1: dependencies: lodash "^4.13.1" +request-promise-native@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.5.tgz#5281770f68e0c9719e5163fd3fab482215f4fda5" + dependencies: + request-promise-core "1.1.1" + stealthy-require "^1.1.0" + tough-cookie ">=2.3.3" + request-promise@^4.2.2: version "4.2.2" resolved "https://registry.yarnpkg.com/request-promise/-/request-promise-4.2.2.tgz#d1ea46d654a6ee4f8ee6a4fea1018c22911904b4" @@ -1334,6 +1682,10 @@ resolve@^1.1.6, resolve@^1.2.0: dependencies: path-parse "^1.0.5" +resolve@~1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" + restore-cursor@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541" @@ -1348,6 +1700,13 @@ restore-cursor@^2.0.0: onetime "^2.0.0" signal-exit "^3.0.2" +rewire@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rewire/-/rewire-3.0.2.tgz#25e5413c4f1676eb3247d1884198b3a265408bbd" + dependencies: + babel-core "^6.26.0" + babel-plugin-transform-es2015-block-scoping "^6.26.0" + rimraf@^2.2.8: version "2.6.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" @@ -1374,6 +1733,24 @@ 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" +samsam@1.x: + version "1.3.0" + resolved "https://registry.yarnpkg.com/samsam/-/samsam-1.3.0.tgz#8d1d9350e25622da30de3e44ba692b5221ab7c50" + +sanctuary-type-classes@^8.0.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/sanctuary-type-classes/-/sanctuary-type-classes-8.1.0.tgz#5761c38f0c1e05a36e44d4650153d6141f5efebe" + dependencies: + sanctuary-type-identifiers "1.0.x" + +sanctuary-type-identifiers@1.0.x: + version "1.0.0" + resolved "https://registry.yarnpkg.com/sanctuary-type-identifiers/-/sanctuary-type-identifiers-1.0.0.tgz#e8f359f006cb5e624cfb8464603fc114608bde9f" + +sanctuary-type-identifiers@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/sanctuary-type-identifiers/-/sanctuary-type-identifiers-2.0.1.tgz#fc524cf6dd92cebfcbb0dd9509eff193159a20ed" + "semver@2 || 3 || 4 || 5", semver@^5.3.0: version "5.4.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" @@ -1396,6 +1773,44 @@ shelljs@^0.7.8: interpret "^1.0.0" rechoir "^0.6.2" +should-equal@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/should-equal/-/should-equal-2.0.0.tgz#6072cf83047360867e68e98b09d71143d04ee0c3" + dependencies: + should-type "^1.4.0" + +should-format@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/should-format/-/should-format-3.0.3.tgz#9bfc8f74fa39205c53d38c34d717303e277124f1" + dependencies: + should-type "^1.3.0" + should-type-adaptors "^1.0.1" + +should-type-adaptors@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/should-type-adaptors/-/should-type-adaptors-1.1.0.tgz#401e7f33b5533033944d5cd8bf2b65027792e27a" + dependencies: + should-type "^1.3.0" + should-util "^1.0.0" + +should-type@^1.3.0, should-type@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/should-type/-/should-type-1.4.0.tgz#0756d8ce846dfd09843a6947719dfa0d4cff5cf3" + +should-util@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/should-util/-/should-util-1.0.0.tgz#c98cda374aa6b190df8ba87c9889c2b4db620063" + +should@^13.2.1: + version "13.2.1" + resolved "https://registry.yarnpkg.com/should/-/should-13.2.1.tgz#84e6ebfbb145c79e0ae42307b25b3f62dcaf574e" + dependencies: + should-equal "^2.0.0" + should-format "^3.0.3" + should-type "^1.4.0" + should-type-adaptors "^1.0.1" + should-util "^1.0.0" + sigmund@~1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590" @@ -1404,6 +1819,22 @@ signal-exit@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" +sinon@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/sinon/-/sinon-4.2.2.tgz#e039ab27bdb426fc61363c380726e996a2e2c620" + dependencies: + diff "^3.1.0" + formatio "1.2.0" + lodash.get "^4.4.2" + lolex "^2.2.0" + nise "^1.2.0" + supports-color "^5.1.0" + type-detect "^4.0.5" + +slash@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" + slice-ansi@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d" @@ -1426,6 +1857,16 @@ sntp@2.x.x: dependencies: hoek "4.x.x" +source-map-support@^0.4.15: + 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@^0.5.6: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + spdx-correct@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40" @@ -1499,6 +1940,12 @@ strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" +supports-color@4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.4.0.tgz#883f7ddabc165142b2a61427f3352ded195d1a3e" + dependencies: + has-flag "^2.0.0" + supports-color@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" @@ -1509,6 +1956,12 @@ supports-color@^4.0.0: dependencies: has-flag "^2.0.0" +supports-color@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.1.0.tgz#058a021d1b619f7ddf3980d712ea3590ce7de3d5" + dependencies: + has-flag "^2.0.0" + table-layout@^0.4.2: version "0.4.2" resolved "https://registry.yarnpkg.com/table-layout/-/table-layout-0.4.2.tgz#10e9043c142a1e2d155da7257e478f0ef4981786" @@ -1537,6 +1990,10 @@ test-value@^2.1.0: array-back "^1.0.3" typical "^2.6.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" @@ -1559,12 +2016,20 @@ tmp@^0.0.33: dependencies: os-tmpdir "~1.0.2" +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" + tough-cookie@>=2.3.3, 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.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" + tryit@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/tryit/-/tryit-1.0.3.tgz#393be730a9446fd1ead6da59a014308f36c289cb" @@ -1585,6 +2050,10 @@ type-check@~0.3.2: dependencies: prelude-ls "~1.1.2" +type-detect@^4.0.5: + version "4.0.7" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.7.tgz#862bd2cf6058ad92799ff5a5b8cf7b6cec726198" + typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"