diff --git a/.eslintrc b/.eslintrc index 5248af3..ca3c940 100644 --- a/.eslintrc +++ b/.eslintrc @@ -1,3 +1,3 @@ { - "extends": "groupon/node4" + "extends": "groupon/node6" } diff --git a/.gitignore b/.gitignore index b25e39c..80d33bd 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,4 @@ -/yarn.lock -/package-lock.json +/.nyc_output node_modules/ /tmp npm-debug.log diff --git a/.travis.yml b/.travis.yml index 2dd7ef0..387043a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,12 +1,14 @@ language: node_js node_js: - - 4.6.1 - - 6.11.5 - - 8.9.0 + - 6.14.3 + - 8.11.3 + - 10.5.0 deploy: - provider: script script: ./bin/nlm.js release skip_cleanup: true 'on': branch: master - node: 8.9.0 + node: 10.5.0 +before_install: + - npm i -g npm@^6 diff --git a/lib/cli.js b/lib/cli.js index d4a1046..454e129 100644 --- a/lib/cli.js +++ b/lib/cli.js @@ -97,6 +97,7 @@ if (argv.version) { } else { const cwd = process.cwd(); const packageJsonFile = path.join(cwd, 'package.json'); + // eslint-disable-next-line import/no-dynamic-require const pkg = require(packageJsonFile); command(cwd, pkg, pkg.nlm ? _.merge({}, pkg.nlm, argv) : argv) .catch(prettyPrintErrorAndExit) diff --git a/lib/git/commits.js b/lib/git/commits.js index 396f305..b7c60d4 100644 --- a/lib/git/commits.js +++ b/lib/git/commits.js @@ -40,7 +40,7 @@ const run = require('../run'); const SEPARATOR = '---nlm-split---'; const GIT_LOG_FORMAT = `--format=%H %P\n%B${SEPARATOR}`; -const PR_MERGE_PATTERN = /^Merge pull request #(\d+) from ([^/]+)\/([\S]+)/; +const PR_MERGE_PATTERN = /^Merge pull request #(\d+) from ([^\/]+)\/([\S]+)/; function parseCommit(commit) { const metaEndIdx = commit.indexOf('\n'); @@ -54,14 +54,14 @@ function parseCommit(commit) { const parentSha = meta.shift() || null; const data = commitParser.sync(message, { - issuePrefixes: ['#', 'https?://\\w[\\w.-]*[\\w/-]+?'], + issuePrefixes: ['#', 'https?://[\\w\\.-/]*[-/]+'], }); const prMatch = message.match(PR_MERGE_PATTERN); if (prMatch) { const prId = prMatch[1]; data.type = 'pr'; data.pullId = prId; - data.references.push({ + Object.assign(data.references[0], { action: 'Merges', owner: prMatch[2], repository: null, diff --git a/lib/git/ensure-tag.js b/lib/git/ensure-tag.js index 31814e8..b7bb85d 100644 --- a/lib/git/ensure-tag.js +++ b/lib/git/ensure-tag.js @@ -52,12 +52,12 @@ function fetchTag(cwd, tag) { function ensureTag(cwd, tag) { if (tag === 'v0.0.0') { // There is no such thing (most likely) - return undefined; + return null; } const tagFile = path.join(cwd, '.git', 'refs', 'tags', tag); try { - fs.readFileSync(tagFile); + return fs.readFileSync(tagFile); } catch (error) { if (error.code !== 'ENOENT') { throw error; diff --git a/lib/github/setup-labels.js b/lib/github/setup-labels.js index 0ad0a13..39c6b16 100644 --- a/lib/github/setup-labels.js +++ b/lib/github/setup-labels.js @@ -42,7 +42,7 @@ const REQUIRED_LABELS = [ ]; function findMissingLabels(labels) { - return _.reject(REQUIRED_LABELS, function exists(label) { + return _.reject(REQUIRED_LABELS, label => { return _.find(labels, { name: label.name }); }); } diff --git a/lib/license/index.js b/lib/license/index.js index a46423c..91bb53f 100644 --- a/lib/license/index.js +++ b/lib/license/index.js @@ -48,7 +48,7 @@ const COMMENT_TYPES = { getLicenseHeader: function getLicenseHeader(licenseText) { const body = licenseText .split('\n') - .map(function prefixLine(line) { + .map(line => { return ` ${`* ${line}`.trim()}`; }) .join('\n'); @@ -78,7 +78,7 @@ function collectFiles(cwd, whitelist, optionalExclude) { return Bluebird.map(whitelist || ['.'], scanDirectory) .then(_.flatten) - .map(function loadFile(relFilename) { + .map(relFilename => { const filename = path.join(cwd, relFilename); return Bluebird.props({ filename: filename, @@ -103,7 +103,7 @@ function addMissingLicenseHeaders(licenseText, files) { '.coffee': COMMENT_TYPES['.coffee'].getLicenseHeader(licenseText), }; return files - .map(function buildLicenseHeader(file) { + .map(file => { file.licenseHeader = licenseHeaders[path.extname(file.filename)]; return file; }) @@ -114,7 +114,7 @@ function addMissingLicenseHeaders(licenseText, files) { function getLicenseText(cwd) { return readFileAsync(path.join(cwd, 'LICENSE'), 'utf8') .then(_.trim) - .catch(function catchNotFound(error) { + .catch(error => { if (error.code === 'ENOENT') { return null; } diff --git a/lib/run.js b/lib/run.js index 2ae8f99..4ad9f68 100644 --- a/lib/run.js +++ b/lib/run.js @@ -40,17 +40,17 @@ const _ = require('lodash'); module.exports = function run(command, args, options) { debug(command, args, _.omit(options, 'env')); - return new Bluebird(function resolveExec(resolve, reject) { + return new Bluebird((resolve, reject) => { function onExecDone(error, stdout) { if (error) return reject(error); - resolve(stdout); + return resolve(stdout); } const child = childProcess.execFile(command, args, options, onExecDone); - child.stdout.on('data', function forwardStdOut(chunk) { + child.stdout.on('data', chunk => { debug('stdout', chunk.toString().trim()); }); - child.stderr.on('data', function forwardStdErr(chunk) { + child.stderr.on('data', chunk => { debug('stderr', chunk.toString().trim()); }); }); diff --git a/lib/steps/changelog.js b/lib/steps/changelog.js index 4dffd99..4181872 100644 --- a/lib/steps/changelog.js +++ b/lib/steps/changelog.js @@ -44,7 +44,7 @@ function addPullRequestCommits(pkg, commits, pr) { github.pull.get(pr.pullId), github.pull.commits(pr.pullId), ]) - .spread(function expandCommitInfo(info, prCommits) { + .spread((info, prCommits) => { pr.author = { name: info.user.login, href: info.user.html_url, @@ -52,11 +52,11 @@ function addPullRequestCommits(pkg, commits, pr) { pr.href = info.html_url; pr.title = info.title || info.header; const shas = (pr.shas = _.map(prCommits, 'sha')); - pr.commits = commits.filter(function isPartOfPR(commit) { + pr.commits = commits.filter(commit => { return shas.indexOf(commit.sha) !== -1; }); }) - .catch(function handle404(err) { + .catch(err => { if (err.statusCode !== 404) throw err; // If the PR doesn't exist, handle it gracefully. pr.commits = pr.shas = null; @@ -65,7 +65,7 @@ function addPullRequestCommits(pkg, commits, pr) { function removePRCommits(commits, prs) { const prShas = _.flatten(_.map(prs, 'shas')); - return _.filter(commits, function isNotInAnyPR(commit) { + return _.filter(commits, commit => { return commit.type !== 'pr' && prShas.indexOf(commit.sha) === -1; }); } @@ -74,16 +74,14 @@ function extractBreakingChanges(commit) { if (!commit.notes || !commit.notes.length) { return []; } - return _.filter(commit.notes, { title: 'BREAKING CHANGE' }).map( - function buildChangeNote(note) { - return { text: note.text, commit: commit }; - } - ); + return _.filter(commit.notes, { title: 'BREAKING CHANGE' }).map(note => { + return { text: note.text, commit: commit }; + }); } function removeInvalidPRs(prs) { // Warning: We're doing something evil here and mutate the input array. - const filtered = prs.filter(function allCommitsFound(pr) { + const filtered = prs.filter(pr => { return pr.shas && pr.shas.length === pr.commits.length; }); prs.length = filtered.length; @@ -152,7 +150,7 @@ function generateChangeLog(cwd, pkg, options) { } function formatPR(pr) { - const changes = pr.commits.map(formatCommit).map(function withDashes(line) { + const changes = pr.commits.map(formatCommit).map(line => { return ` - ${line}`; }); @@ -172,7 +170,7 @@ function generateChangeLog(cwd, pkg, options) { const changes = prs .map(formatPR) .concat(orphans.map(formatCommit)) - .map(function star(line) { + .map(line => { return `* ${line}`; }); @@ -184,7 +182,7 @@ function generateChangeLog(cwd, pkg, options) { .then(_.partial(removePRCommits, commits, prs)) .then(formatCommits) .then(prependBreakingChanges) - .then(function setChangelog(changelog) { + .then(changelog => { options.changelog = changelog; return changelog; }); diff --git a/lib/steps/pending-changes.js b/lib/steps/pending-changes.js index 971c334..2ad81ef 100644 --- a/lib/steps/pending-changes.js +++ b/lib/steps/pending-changes.js @@ -89,7 +89,7 @@ function normalizeReferences(meta, commit) { function getPendingChanges(cwd, pkg, options) { const meta = parseRepository(pkg.repository); - return getCommits(cwd, `v${pkg.version}`).then(function setCommits(commits) { + return getCommits(cwd, `v${pkg.version}`).then(commits => { options.commits = commits.map(_.partial(normalizeReferences, meta)); }); } diff --git a/lib/steps/publish-to-npm.js b/lib/steps/publish-to-npm.js index d69bb81..ba3d607 100644 --- a/lib/steps/publish-to-npm.js +++ b/lib/steps/publish-to-npm.js @@ -72,7 +72,7 @@ function checkPublishRequired(cwd, pkg, options) { cwd: cwd, env: options.npmEnv, }) - .then(function parseNpmList(content) { + .then(content => { // If we get an empty response, we'll assume it was not found. if (content.trim() === '') { return 'publish'; @@ -87,7 +87,7 @@ function checkPublishRequired(cwd, pkg, options) { } return 'none'; }) - .catch(function handle404(error) { + .catch(error => { if (error.message.indexOf('ERR! 404') !== -1) { return 'publish'; } @@ -176,7 +176,7 @@ function publishToNPM(cwd, pkg, options) { checkPublishRequired(cwd, pkg, options), getCurrentCommit(cwd), ]) - .spread(function checkAndPublish(publishRequired, currentCommit) { + .spread((publishRequired, currentCommit) => { if (currentCommit !== `v${pkg.version}`) { console.log( '[nlm] Skipping publish, not a version commit:', @@ -204,7 +204,7 @@ function publishToNPM(cwd, pkg, options) { return null; } }) - .finally(function removeTmpRcFile() { + .finally(() => { fs.unlinkSync(rcFile); }); } diff --git a/lib/steps/tag-pr.js b/lib/steps/tag-pr.js index b9dbe22..66578de 100644 --- a/lib/steps/tag-pr.js +++ b/lib/steps/tag-pr.js @@ -50,21 +50,19 @@ function tagPullRequest(cwd, pkg, options) { return null; } const github = Github.forRepository(pkg.repository); - return github.labels - .listByIssue(options.pr) - .then(function checkAndChangeLabels(labels) { - const releaseType = options.releaseType; - const name = `semver-${releaseType}`; - if (_.find(labels, { name: name })) { - debug('Already tagged with %j', name); - return null; - } - const newLabels = _.map(labels, 'name') - .filter(nonSemverTag) - .concat(name); + return github.labels.listByIssue(options.pr).then(labels => { + const releaseType = options.releaseType; + const name = `semver-${releaseType}`; + if (_.find(labels, { name: name })) { + debug('Already tagged with %j', name); + return null; + } + const newLabels = _.map(labels, 'name') + .filter(nonSemverTag) + .concat(name); - debug('Tagging %s', options.pr, newLabels); - return github.labels.setForIssue(options.pr, newLabels); - }); + debug('Tagging %s', options.pr, newLabels); + return github.labels.setForIssue(options.pr, newLabels); + }); } module.exports = tagPullRequest; diff --git a/lib/steps/version-commit.js b/lib/steps/version-commit.js index 937e991..b70a013 100644 --- a/lib/steps/version-commit.js +++ b/lib/steps/version-commit.js @@ -85,7 +85,7 @@ function createVersionCommit(cwd, pkg, options) { return addFiles(cwd) .then(_.partial(commit, cwd, `v${pkg.version}`)) .then(_.partial(getHEAD, cwd)) - .then(function setVersionCommitSha(output) { + .then(output => { options.versionCommitSha = output.trim(); return options.versionCommitSha; }); diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..e76d701 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1980 @@ +{ + "name": "nlm", + "version": "3.3.1", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "JSONStream": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.4.tgz", + "integrity": "sha512-Y7vfi3I5oMOYIr+WxV8NZxDSwcbNgzdKYsTNInmycOq9bUYwGg9ryu57Wg5NLmCjqdFPNUmpMBo3kSJN9tCbXg==", + "requires": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + } + }, + "acorn": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", + "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", + "dev": true + }, + "acorn-jsx": { + "version": "3.0.1", + "resolved": "http://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", + "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", + "dev": true, + "requires": { + "acorn": "^3.0.4" + }, + "dependencies": { + "acorn": { + "version": "3.3.0", + "resolved": "http://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", + "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", + "dev": true + } + } + }, + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "dev": true, + "requires": { + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" + } + }, + "ajv-keywords": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz", + "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=", + "dev": true + }, + "ansi-escapes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", + "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==", + "dev": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=" + }, + "array-union": { + "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.1" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "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=" + }, + "assertive": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/assertive/-/assertive-2.4.1.tgz", + "integrity": "sha512-A+OwJQ+eeVE51SG8pO94sUNfVBW7GH8Z65hLJhR1QpjLS02weO6PStiDJsBi7yi0D4LjL0x58VFN/6rAm9jpfg==", + "dev": true, + "requires": { + "lodash": "^4.6.1" + } + }, + "babel-code-frame": { + "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": { + "chalk": { + "version": "1.1.3", + "resolved": "http://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.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "bluebird": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.2.tgz", + "integrity": "sha512-dhHTWMI7kMx5whMQntl7Vr9C6BvV10lFXDAasnqnrMYhXVCzzk6IO9Fo2L75jXHT07WrOngL1WDXOp+yYS91Yg==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "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=" + }, + "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" + } + }, + "callsites": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", + "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", + "dev": true + }, + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" + }, + "camelcase-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", + "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=", + "requires": { + "camelcase": "^4.1.0", + "map-obj": "^2.0.0", + "quick-lru": "^1.0.0" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "chardet": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", + "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", + "dev": true + }, + "circular-json": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", + "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", + "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" + } + }, + "cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "dev": true + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "commander": { + "version": "2.15.1", + "resolved": "http://registry.npmjs.org/commander/-/commander-2.15.1.tgz", + "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "contains-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", + "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", + "dev": true + }, + "conventional-commits-parser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.0.0.tgz", + "integrity": "sha512-GWh71U26BLWgMykCp+VghZ4s64wVbtseECcKQ/PvcPZR2cUnz+FUc2J9KjxNl7/ZbCxST8R03c9fc+Vi0umS9Q==", + "requires": { + "JSONStream": "^1.0.4", + "is-text-path": "^1.0.0", + "lodash": "^4.2.1", + "meow": "^4.0.0", + "split2": "^2.0.0", + "through2": "^2.0.0", + "trim-off-newlines": "^1.0.0" + } + }, + "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=" + }, + "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.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "requires": { + "array-find-index": "^1.0.1" + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + }, + "decamelize-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", + "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", + "requires": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "dependencies": { + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=" + } + } + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" + }, + "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=", + "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", + "is-path-in-cwd": "^1.0.0", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "rimraf": "^2.2.8" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, + "doctrine": { + "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" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "eslint": { + "version": "4.19.1", + "resolved": "http://registry.npmjs.org/eslint/-/eslint-4.19.1.tgz", + "integrity": "sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ==", + "dev": true, + "requires": { + "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.1.0", + "doctrine": "^2.1.0", + "eslint-scope": "^3.7.1", + "eslint-visitor-keys": "^1.0.0", + "espree": "^3.5.4", + "esquery": "^1.0.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", + "ignore": "^3.3.3", + "imurmurhash": "^0.1.4", + "inquirer": "^3.0.6", + "is-resolvable": "^1.0.0", + "js-yaml": "^3.9.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.4", + "minimatch": "^3.0.2", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.2", + "path-is-inside": "^1.0.2", + "pluralize": "^7.0.0", + "progress": "^2.0.0", + "regexpp": "^1.0.1", + "require-uncached": "^1.0.3", + "semver": "^5.3.0", + "strip-ansi": "^4.0.0", + "strip-json-comments": "~2.0.1", + "table": "4.0.2", + "text-table": "~0.2.0" + }, + "dependencies": { + "debug": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.5.tgz", + "integrity": "sha512-D61LaDQPQkxJ5AUM2mbSJRbPkNs/TmdmOeLAi1hgDkpDfIfetSrjmWhccwtuResSwMbACjx/xXQofvM9CE/aeg==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } + } + }, + "eslint-config-groupon": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/eslint-config-groupon/-/eslint-config-groupon-6.1.1.tgz", + "integrity": "sha512-9nfrMKwGcWHtvN85qeEfsOd04ui2YlvXrwMpZelHEvpUJnlTkW685pdFM4TPLHJP2MvXdSy8PGNbTt/EfPw7Ig==", + "dev": true + }, + "eslint-import-resolver-node": { + "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" + } + }, + "eslint-module-utils": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.2.0.tgz", + "integrity": "sha1-snA2LNiLGkitMIl2zn+lTphBF0Y=", + "dev": true, + "requires": { + "debug": "^2.6.8", + "pkg-dir": "^1.0.0" + } + }, + "eslint-plugin-import": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.14.0.tgz", + "integrity": "sha512-FpuRtniD/AY6sXByma2Wr0TXvXJ4nA/2/04VPlfpmUDPOpOY264x+ILiwnrk/k4RINgDAyFZByxqPUbSQ5YE7g==", + "dev": true, + "requires": { + "contains-path": "^0.1.0", + "debug": "^2.6.8", + "doctrine": "1.5.0", + "eslint-import-resolver-node": "^0.3.1", + "eslint-module-utils": "^2.2.0", + "has": "^1.0.1", + "lodash": "^4.17.4", + "minimatch": "^3.0.3", + "read-pkg-up": "^2.0.0", + "resolve": "^1.6.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" + } + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "http://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "requires": { + "pify": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "requires": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" + } + } + } + }, + "eslint-plugin-mocha": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-4.12.1.tgz", + "integrity": "sha512-hxWtYHvLA0p/PKymRfDYh9Mxt5dYkg2Goy1vZDarTEEYfELP9ksga7kKG1NUKSQy27C8Qjc7YrSWTLUhOEOksA==", + "dev": true, + "requires": { + "ramda": "^0.25.0" + } + }, + "eslint-plugin-node": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-5.2.1.tgz", + "integrity": "sha512-xhPXrh0Vl/b7870uEbaumb2Q+LxaEcOQ3kS1jtIXanBAwpMre1l5q/l2l/hESYJGEFKuI78bp6Uw50hlpr7B+g==", + "dev": true, + "requires": { + "ignore": "^3.3.6", + "minimatch": "^3.0.4", + "resolve": "^1.3.3", + "semver": "5.3.0" + }, + "dependencies": { + "semver": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", + "dev": true + } + } + }, + "eslint-plugin-prettier": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-2.7.0.tgz", + "integrity": "sha512-CStQYJgALoQBw3FsBzH0VOVDRnJ/ZimUlpLm226U8qgqYJfPOY/CPK6wyRInMxh73HSKg5wyRwdS4BVYYHwokA==", + "dev": true, + "requires": { + "fast-diff": "^1.1.1", + "jest-docblock": "^21.0.0" + } + }, + "eslint-scope": { + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.3.tgz", + "integrity": "sha512-W+B0SvF4gamyCTmUc+uITPY0989iXVfKvhwtmJocTaYoc/3khEHmEmvfY/Gn9HA9VV75jrQECsHizkNw1b68FA==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "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.4", + "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz", + "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==", + "dev": true, + "requires": { + "acorn": "^5.5.0", + "acorn-jsx": "^3.0.0" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "esquery": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", + "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", + "dev": true, + "requires": { + "estraverse": "^4.0.0" + } + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "dev": true, + "requires": { + "estraverse": "^4.1.0" + } + }, + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "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=", + "dev": true + }, + "external-editor": { + "version": "2.2.0", + "resolved": "http://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", + "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", + "dev": true, + "requires": { + "chardet": "^0.4.0", + "iconv-lite": "^0.4.17", + "tmp": "^0.0.33" + } + }, + "fast-deep-equal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", + "dev": true + }, + "fast-diff": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.1.2.tgz", + "integrity": "sha512-KaJUt+M9t1qaIteSvjc6P3RbMdXsNhK61GRftR6SNxqmhthcd9MGIi4T+o0jD8LUSpSnSKXE20nLtJ3fOHxQig==", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-entry-cache": { + "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.2.1", + "object-assign": "^4.0.1" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "requires": { + "locate-path": "^2.0.0" + } + }, + "flat-cache": { + "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.1", + "del": "^2.0.2", + "graceful-fs": "^4.1.2", + "write": "^0.2.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "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=", + "dev": true + }, + "glob": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", + "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "globals": { + "version": "11.8.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.8.0.tgz", + "integrity": "sha512-io6LkyPVuzCHBSQV9fmOwxZkUk6nIaGmxheLDgmuFv89j0fm2aqDbIXKAGfzCMHqz3HLF2Zf8WSG6VqMh2qFmA==", + "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.1", + "arrify": "^1.0.0", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "dependencies": { + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "gofer": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/gofer/-/gofer-3.6.0.tgz", + "integrity": "sha512-To3jKjsiAr0q1Ll2kIMpwkU3n/ietyKFZXoJKXPn5gWgMHGpq71VKfFwCd3En7JuMZmwVs65o5iaz8NIbkgePg==", + "requires": { + "bluebird": "^3.3.3", + "debug": "^2.2.0", + "lodash": "^4.6.1", + "qs": "^6.1.0", + "url": "^0.11.0" + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" + }, + "growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-ansi": { + "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.0.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "dev": true + }, + "hosted-git-info": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", + "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==" + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", + "dev": true + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indent-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", + "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" + }, + "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.0.0", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^2.0.4", + "figures": "^2.0.0", + "lodash": "^4.3.0", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rx-lite": "^4.0.8", + "rx-lite-aggregates": "^4.0.8", + "string-width": "^2.1.0", + "strip-ansi": "^4.0.0", + "through": "^2.3.6" + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + }, + "is-builtin-module": { + "version": "1.0.0", + "resolved": "http://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "requires": { + "builtin-modules": "^1.0.0" + } + }, + "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=", + "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=", + "dev": true + }, + "is-path-in-cwd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", + "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", + "dev": true, + "requires": { + "is-path-inside": "^1.0.0" + } + }, + "is-path-inside": { + "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.1" + } + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" + }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", + "dev": true + }, + "is-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", + "dev": true + }, + "is-text-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", + "integrity": "sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4=", + "requires": { + "text-extensions": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "jest-docblock": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-21.2.0.tgz", + "integrity": "sha512-5IZ7sY9dBAYSV+YjQ0Ovb540Ku7AO9Z5o2Cg789xj167iQuZ2cG+z0f3Uct6WeYLbU6aQiM2pCs7sZ+4dotydw==", + "dev": true + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true + }, + "js-yaml": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", + "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" + }, + "json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", + "dev": true + }, + "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=", + "dev": true + }, + "jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=" + }, + "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" + } + }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" + }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "requires": { + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" + } + }, + "lru-cache": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", + "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "map-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", + "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=" + }, + "meow": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.1.tgz", + "integrity": "sha512-xcSBHD5Z86zaOc+781KrupuHAzeGXSLtiAOmBsiLDiPSaYSB6hdew2ng9EBAnZ62jagG9MHAOdxpDi/lWBFJ/A==", + "requires": { + "camelcase-keys": "^4.0.0", + "decamelize-keys": "^1.0.0", + "loud-rejection": "^1.0.0", + "minimist": "^1.1.3", + "minimist-options": "^3.0.1", + "normalize-package-data": "^2.3.4", + "read-pkg-up": "^3.0.0", + "redent": "^2.0.0", + "trim-newlines": "^2.0.0" + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + }, + "minimist-options": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz", + "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==", + "requires": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0" + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + } + } + }, + "mocha": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.2.0.tgz", + "integrity": "sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ==", + "dev": true, + "requires": { + "browser-stdout": "1.3.1", + "commander": "2.15.1", + "debug": "3.1.0", + "diff": "3.5.0", + "escape-string-regexp": "1.0.5", + "glob": "7.1.2", + "growl": "1.10.5", + "he": "1.1.1", + "minimatch": "3.0.4", + "mkdirp": "0.5.1", + "supports-color": "5.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" + } + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "dev": true + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "requires": { + "hosted-git-info": "^2.1.4", + "is-builtin-module": "^1.0.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "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.0.0" + } + }, + "optionator": { + "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.4", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "wordwrap": "~1.0.0" + } + }, + "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=", + "dev": true + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "requires": { + "p-limit": "^1.1.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=" + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "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=", + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "requires": { + "pify": "^3.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "^2.0.0" + } + }, + "pkg-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", + "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", + "dev": true, + "requires": { + "find-up": "^1.0.0" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + } + } + }, + "pluralize": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", + "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=", + "dev": true + }, + "prettier": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.14.3.tgz", + "integrity": "sha512-qZDVnCrnpsRJJq5nSsiHCE3BYMED2OtsI+cmzIzF1QIfqm5ALf8tEJcO27zV1gKNKRPdhjO0dNWnrzssDQ1tFg==", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" + }, + "progress": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz", + "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=", + "dev": true + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" + }, + "quick-lru": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", + "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=" + }, + "ramda": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.25.0.tgz", + "integrity": "sha512-GXpfrYVPwx3K7RQ6aYT8KPS8XViSXUVJT1ONhoKPE9VAleW42YE+U+8VEyGWt41EnEQW7gwecYJriTI0pKoecQ==", + "dev": true + }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + } + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + } + }, + "read-pkg-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^3.0.0" + } + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "redent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", + "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=", + "requires": { + "indent-string": "^3.0.0", + "strip-indent": "^2.0.0" + } + }, + "regexpp": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-1.1.0.tgz", + "integrity": "sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw==", + "dev": true + }, + "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.0" + } + }, + "resolve": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz", + "integrity": "sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==", + "dev": true, + "requires": { + "path-parse": "^1.0.5" + } + }, + "resolve-from": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", + "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", + "dev": true + }, + "restore-cursor": { + "version": "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.0", + "signal-exit": "^3.0.2" + } + }, + "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.0.5" + }, + "dependencies": { + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } + } + }, + "run-async": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", + "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "dev": true, + "requires": { + "is-promise": "^2.1.0" + } + }, + "rx-lite": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", + "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", + "dev": true + }, + "rx-lite-aggregates": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", + "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", + "dev": true, + "requires": { + "rx-lite": "*" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "semver": { + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.1.tgz", + "integrity": "sha512-PqpAxfrEhlSUWge8dwIp4tZnQ25DIOthpiaHNIthsjEFQD6EvqUKUDM7L8O2rShkFccYo1VjJR0coWfNkCubRw==" + }, + "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" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" + }, + "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" + } + }, + "spdx-correct": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.1.tgz", + "integrity": "sha512-hxSPZbRZvSDuOvADntOElzJpenIR7wXJkuoUcUtS0erbgt2fgeaoPIYretfKpslMhfFDY4k0MZ2F5CUzhBsSvQ==", + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", + "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==" + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.1.tgz", + "integrity": "sha512-TfOfPcYGBB5sDuPn3deByxPhmfegAhpDYKSOXZQN81Oyrrif8ZCodOLzK3AesELnCx03kikhyDwh0pfvvQvF8w==" + }, + "split2": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-2.2.0.tgz", + "integrity": "sha512-RAb22TG39LhI31MbreBgIuKiIKhVsawfTgEGqKHTK87aG+ul/PB8Sqoi3I7kVdRWiCfrKxK3uo4/YUkpNvhPbw==", + "requires": { + "through2": "^2.0.2" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "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" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + } + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" + }, + "strip-indent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", + "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=" + }, + "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=" + }, + "supports-color": { + "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.2.3", + "ajv-keywords": "^2.1.0", + "chalk": "^2.1.0", + "lodash": "^4.17.4", + "slice-ansi": "1.0.0", + "string-width": "^2.1.1" + } + }, + "text-extensions": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.8.0.tgz", + "integrity": "sha512-mVzjRxuWnDKs/qH1rbOJEVHLlSX9kty9lpi7lMvLgU9S74mQ8/Ozg9UPcKxShh0qG2NZ+NyPOPpcZU4C1Eld9A==" + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "http://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + }, + "through2": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", + "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "requires": { + "readable-stream": "^2.1.5", + "xtend": "~4.0.1" + } + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "trim-newlines": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", + "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=" + }, + "trim-off-newlines": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz", + "integrity": "sha1-n5up2e+odkw4dpi8v+sshI8RrbM=" + }, + "type-check": { + "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" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "write": { + "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": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + } + } +} diff --git a/package.json b/package.json index 72e2939..1dc67ae 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,10 @@ "test": "mocha", "posttest": "./bin/nlm.js verify" }, + "engines": { + "yarn": "0.0.0", + "npm": "^6.0.0" + }, "nlm": { "license": { "files": [ @@ -28,23 +32,24 @@ }, "dependencies": { "bluebird": "^3.3.3", - "conventional-commits-parser": "~0.1.2", + "conventional-commits-parser": "^3.0.0", "debug": "^2.2.0", "glob": "^6.0.1", "gofer": "^3.2.0", - "lodash": "^4.6.1", + "lodash": "^4.17.11", "minimist": "^1.2.0", - "rc": "^1.1.5", + "rc": "^1.2.8", "semver": "^5.1.0" }, "devDependencies": { "assertive": "^2.1.0", "eslint": "^4.7.1", - "eslint-config-groupon": "^5.0.0", + "eslint-config-groupon": "^6.0.0", "eslint-plugin-import": "^2.8.0", + "eslint-plugin-mocha": "^4.12.1", "eslint-plugin-node": "^5.1.1", "eslint-plugin-prettier": "^2.2.0", - "mocha": "^3.1.2", + "mocha": "^5.2.0", "prettier": "^1.6.1" }, "author": { diff --git a/test/commands/verify.test.js b/test/commands/verify.test.js index 58363dc..796fdce 100644 --- a/test/commands/verify.test.js +++ b/test/commands/verify.test.js @@ -41,43 +41,43 @@ const withFixture = require('../fixture'); const CLI_PATH = require.resolve('../../lib/cli'); -describe('nlm verify', function() { - describe('in non-git directory', function() { +describe('nlm verify', () => { + describe('in non-git directory', () => { const dirname = withFixture('non-git'); const output = {}; - before(function() { + before(() => { return run(process.execPath, [CLI_PATH, 'verify'], { cwd: dirname, env: _.assign({}, process.env, { GH_TOKEN: '', }), - }).then(function(stdout) { + }).then(stdout => { output.stdout = stdout; }); }); - it('ignores directories that are not git repos', function() { + it('ignores directories that are not git repos', () => { assert.equal('', output.stdout); }); }); - describe('in git directory', function() { + describe('in git directory', () => { const dirname = withFixture('released'); const output = {}; - before(function() { + before(() => { return run(process.execPath, [CLI_PATH, 'verify'], { cwd: dirname, env: _.assign({}, process.env, { GH_TOKEN: '', }), - }).then(function(stdout) { + }).then(stdout => { output.stdout = stdout; }); }); - it('reports the change type', function() { + it('reports the change type', () => { assert.include('Changes are "none"', output.stdout); }); }); diff --git a/test/fixture.js b/test/fixture.js index 696d2de..a0fd9fd 100644 --- a/test/fixture.js +++ b/test/fixture.js @@ -39,15 +39,15 @@ function withFixture(name) { const dirname = path.join(__dirname, '..', 'tmp', name); const script = path.join(__dirname, 'fixtures', name); - before('remove fixture directory', function rmDir(done) { + before('remove fixture directory', done => { execFile('rm', ['-rf', dirname], done); }); - before('create fixture directory', function createDir(done) { + before('create fixture directory', done => { execFile('mkdir', ['-p', dirname], done); }); - before('running fixture setup', function runFixture(done) { + before('running fixture setup', done => { execFile( script, [script], @@ -61,7 +61,7 @@ function withFixture(name) { GIT_COMMITTER_EMAIL: 'rdev@example.com', }, }, - function logErrorDetails(error, stdout, stderr) { + (error, stdout, stderr) => { if (error) { process.stdout.write(`${stdout}\n`); process.stderr.write(`${stderr}\n`); @@ -71,7 +71,7 @@ function withFixture(name) { ); }); - after('remove fixture directory', function removeFixture(done) { + after('remove fixture directory', done => { execFile('rm', ['-rf', dirname], done); }); diff --git a/test/git/commits.test.js b/test/git/commits.test.js index f685087..d17cc91 100644 --- a/test/git/commits.test.js +++ b/test/git/commits.test.js @@ -39,22 +39,22 @@ const getCommits = require('../../lib/git/commits'); const withFixture = require('../fixture'); -describe('getCommits', function() { - describe('with an empty project', function() { +describe('getCommits', () => { + describe('with an empty project', () => { const dirname = withFixture('empty-project'); - it('returns an empty list', function() { - return getCommits(dirname).then(function(commits) { + it('returns an empty list', () => { + return getCommits(dirname).then(commits => { assert.deepEqual([], commits); }); }); }); - describe('with invalid commits', function() { + describe('with invalid commits', () => { const dirname = withFixture('invalid-commit'); - it('returns the commit with type=null', function() { - return getCommits(dirname).then(function(commits) { + it('returns the commit with type=null', () => { + return getCommits(dirname).then(commits => { assert.equal(2, commits.length); assert.equal(null, commits[0].type); assert.equal("This ain't no valid commit message", commits[0].header); @@ -63,17 +63,17 @@ describe('getCommits', function() { }); }); - describe('issue and ticket links', function() { + describe('issue and ticket links', () => { const dirname = withFixture('ticket-commits'); let allCommits = null; - before('fetch al commits', function() { - return getCommits(dirname).then(function(commits) { + before('fetch al commits', () => { + return getCommits(dirname).then(commits => { allCommits = commits; }); }); - it('includes links to github for #123 style', function() { + it('includes links to github for #123 style', () => { const commit = _.find(allCommits, { subject: 'Short' }); assert.equal(1, commit.references.length); const ref = commit.references[0]; @@ -84,7 +84,7 @@ describe('getCommits', function() { assert.equal('#42', ref.raw); }); - it('includes links to github for x/y#123 style', function() { + it('includes links to github for x/y#123 style', () => { const commit = _.find(allCommits, { subject: 'Repo' }); assert.equal(1, commit.references.length); const ref = commit.references[0]; @@ -95,7 +95,7 @@ describe('getCommits', function() { assert.equal('riley/thing#13', ref.raw); }); - it('includes links to github for full public github urls', function() { + it('includes links to github for full public github urls', () => { const commit = _.find(allCommits, { subject: 'Full' }); assert.equal(1, commit.references.length); const ref = commit.references[0]; @@ -105,7 +105,7 @@ describe('getCommits', function() { assert.equal('https://github.com/open/source/issues/13', ref.raw); }); - it('includes links to github for full GHE urls', function() { + it('includes links to github for full GHE urls', () => { const commit = _.find(allCommits, { subject: 'GHE' }); assert.equal(1, commit.references.length); const ref = commit.references[0]; @@ -115,7 +115,7 @@ describe('getCommits', function() { assert.equal('https://github.example.com/some/thing/issues/72', ref.raw); }); - it('includes links to jira', function() { + it('includes links to jira', () => { const commit = _.find(allCommits, { subject: 'Jira' }); assert.equal(1, commit.references.length); const ref = commit.references[0]; @@ -126,27 +126,27 @@ describe('getCommits', function() { }); }); - describe('with multiple commits', function() { + describe('with multiple commits', () => { const dirname = withFixture('multiple-commits'); let allCommits = null; - before('fetch al commits', function() { - return getCommits(dirname).then(function(commits) { + before('fetch al commits', () => { + return getCommits(dirname).then(commits => { allCommits = commits; }); }); - it('returns all three commits, plus one merge commit', function() { + it('returns all three commits, plus one merge commit', () => { assert.equal(4, allCommits.length); }); - it('returns commits in order', function() { + it('returns commits in order', () => { assert.equal('Do stuff', allCommits[0].subject); assert.equal('Adding second', allCommits[1].subject); assert.equal('Changed more stuff', allCommits[2].subject); }); - it('includes parentSha', function() { + it('includes parentSha', () => { assert.equal('is null for first commit', null, allCommits[0].parentSha); assert.equal( 'points to the immediate parent for other commits', @@ -155,7 +155,7 @@ describe('getCommits', function() { ); }); - it('includes notes for breaking changes', function() { + it('includes notes for breaking changes', () => { const note = allCommits[1].notes[0]; assert.equal('BREAKING CHANGE', note.title); assert.equal( @@ -168,24 +168,24 @@ describe('getCommits', function() { ); }); - it('includes merge commit info', function() { + it('includes merge commit info', () => { const merge = allCommits[3]; assert.equal(merge.type, 'pr'); assert.equal(merge.references[0].action, 'Merges'); assert.equal(merge.references[0].issue, '119'); }); - describe('when starting from v0.0.0', function() { - it('returns everything from the beginning', function() { - return getCommits(dirname, 'v0.0.0').then(function(commits) { + describe('when starting from v0.0.0', () => { + it('returns everything from the beginning', () => { + return getCommits(dirname, 'v0.0.0').then(commits => { assert.equal(allCommits.length, commits.length); }); }); }); - describe('when starting from the first commit', function() { - it('only returns the last two', function() { - return getCommits(dirname, allCommits[0].sha).then(function(commits) { + describe('when starting from the first commit', () => { + it('only returns the last two', () => { + return getCommits(dirname, allCommits[0].sha).then(commits => { assert.deepEqual(allCommits.slice(1), commits); }); }); diff --git a/test/git/verify-clean.test.js b/test/git/verify-clean.test.js index d6acfd5..762ea21 100644 --- a/test/git/verify-clean.test.js +++ b/test/git/verify-clean.test.js @@ -42,28 +42,28 @@ function unexpected() { throw new Error('Should have failed'); } -describe('verifyClean', function() { - describe('with an empty project', function() { +describe('verifyClean', () => { + describe('with an empty project', () => { const dirname = withFixture('empty-project'); - it('returns true', function() { + it('returns true', () => { return verifyClean(dirname).then(assert.expect); }); }); - describe('with committed changes', function() { + describe('with committed changes', () => { const dirname = withFixture('fix-commit'); - it('returns true', function() { + it('returns true', () => { return verifyClean(dirname).then(assert.expect); }); }); - describe('with uncommitted or unstaged changes', function() { + describe('with uncommitted or unstaged changes', () => { const dirname = withFixture('dirty-checkout'); - it('reports the files in question', function() { - return verifyClean(dirname).then(unexpected, function(error) { + it('reports the files in question', () => { + return verifyClean(dirname).then(unexpected, error => { assert.include('M index.js', error.message); assert.include('?? untracked.js', error.message); }); diff --git a/test/github/parse-repository.test.js b/test/github/parse-repository.test.js index 9538087..1ed9b11 100644 --- a/test/github/parse-repository.test.js +++ b/test/github/parse-repository.test.js @@ -42,8 +42,8 @@ function checkParsed(expected, name) { assert.deepEqual(expected, result); } -describe('parseRepository', function() { - describe('github.com', function() { +describe('parseRepository', () => { + describe('github.com', () => { const expected = { baseUrl: 'https://api.github.com', htmlBase: 'https://github.com', @@ -51,7 +51,7 @@ describe('parseRepository', function() { repository: 'myproject', }; - it('understands ssh urls', function() { + it('understands ssh urls', () => { [ 'git+ssh://git@github.com/myname/myproject', 'git+ssh://git@github.com/myname/myproject.git', @@ -60,25 +60,25 @@ describe('parseRepository', function() { ].forEach(_.partial(checkParsed, expected)); }); - it('understands https urls', function() { + it('understands https urls', () => { [ 'https://github.com/myname/myproject', 'https://github.com/myname/myproject.git', ].forEach(_.partial(checkParsed, expected)); }); - it('understands git urls', function() { + it('understands git urls', () => { [ 'git://github.com/myname/myproject', 'git://github.com/myname/myproject.git', ].forEach(_.partial(checkParsed, expected)); }); - it('understands npm-style shorthands', function() { + it('understands npm-style shorthands', () => { ['myname/myproject'].forEach(_.partial(checkParsed, expected)); }); - it('accepts dotted repositories', function() { + it('accepts dotted repositories', () => { ['myname/myproject.js.git', 'myname/myproject.js'].forEach( _.partial( checkParsed, @@ -88,7 +88,7 @@ describe('parseRepository', function() { }); }); - describe('Github Enterprise', function() { + describe('Github Enterprise', () => { const expected = { baseUrl: 'https://ghe.mycorp.com/api/v3', htmlBase: 'https://ghe.mycorp.com', @@ -96,7 +96,7 @@ describe('parseRepository', function() { repository: 'myproject', }; - it('understands ssh urls', function() { + it('understands ssh urls', () => { [ 'git@ghe.mycorp.com:myname/myproject', 'git@ghe.mycorp.com:myname/myproject.git', @@ -105,14 +105,14 @@ describe('parseRepository', function() { ].forEach(_.partial(checkParsed, expected)); }); - it('understands https urls', function() { + it('understands https urls', () => { [ 'https://ghe.mycorp.com/myname/myproject', 'https://ghe.mycorp.com/myname/myproject.git', ].forEach(_.partial(checkParsed, expected)); }); - it('understands git urls', function() { + it('understands git urls', () => { [ 'git://ghe.mycorp.com/myname/myproject', 'git://ghe.mycorp.com/myname/myproject.git', diff --git a/test/github/setup-labels.test.js b/test/github/setup-labels.test.js index 73d5d51..fa3f509 100644 --- a/test/github/setup-labels.test.js +++ b/test/github/setup-labels.test.js @@ -39,18 +39,21 @@ const setupLabels = require('../../lib/github/setup-labels'); const packageJSON = require('../../package.json'); -describe('setupLabels', function() { - describe('self-test', function() { +describe('setupLabels', () => { + describe('self-test', () => { if (!process.env.GH_TOKEN) { - return it('skipping, no GH_TOKEN'); + it('skipping, no GH_TOKEN'); + return null; } const github = Github.forRepository(packageJSON.repository); - it('finds no missing labels for nlm', function() { - return setupLabels(github).then(function(addedLabels) { + it('finds no missing labels for nlm', () => { + return setupLabels(github).then(addedLabels => { assert.deepEqual([], addedLabels); }); }); + + return null; }); }); diff --git a/test/license/index.test.js b/test/license/index.test.js index 94713f0..a20a42b 100644 --- a/test/license/index.test.js +++ b/test/license/index.test.js @@ -40,26 +40,26 @@ const addLicenseHeaders = require('../../lib/license'); const withFixture = require('../fixture'); -describe('addLicenseHeaders', function() { - it('does not try to add additional headers to nlm', function() { - return addLicenseHeaders(process.cwd(), ['lib', 'test']).then(function( - changedFiles - ) { - assert.deepEqual([], changedFiles); - }); +describe('addLicenseHeaders', () => { + it('does not try to add additional headers to nlm', () => { + return addLicenseHeaders(process.cwd(), ['lib', 'test']).then( + changedFiles => { + assert.deepEqual([], changedFiles); + } + ); }); - describe('without a LICENSE file', function() { + describe('without a LICENSE file', () => { const dirname = withFixture('fix-commit'); - it('does nothing', function() { - return addLicenseHeaders(dirname).then(function(changedFiles) { + it('does nothing', () => { + return addLicenseHeaders(dirname).then(changedFiles => { assert.deepEqual([], changedFiles); }); }); }); - describe('with a file w/o license header', function() { + describe('with a file w/o license header', () => { const dirname = withFixture('fix-commit'); const filename = `${dirname}/index.js`; @@ -67,17 +67,17 @@ describe('addLicenseHeaders', function() { const licenseHeader = '/*\n * IMPORTANT\n *\n * LEGAL\n * STUFF HERE!\n */\n'; - before('write license file', function() { + before('write license file', () => { fs.writeFileSync(`${dirname}/LICENSE`, licenseText); }); - before('returns the absolute filename', function() { - return addLicenseHeaders(dirname).then(function(changedFiles) { + before('returns the absolute filename', () => { + return addLicenseHeaders(dirname).then(changedFiles => { assert.deepEqual([filename], changedFiles); }); }); - it('writes out a file with a license header', function() { + it('writes out a file with a license header', () => { const content = fs.readFileSync(filename, 'utf8'); assert.include(licenseHeader, content); assert.expect( diff --git a/test/steps/changelog.test.js b/test/steps/changelog.test.js index 4408e8e..9b118ae 100644 --- a/test/steps/changelog.test.js +++ b/test/steps/changelog.test.js @@ -40,8 +40,8 @@ function withFakeGithub() { const httpCalls = []; let server; - before(function(done) { - server = require('http').createServer(function(req, res) { + before(done => { + server = require('http').createServer((req, res) => { httpCalls.push({ method: req.method, url: req.url, @@ -98,24 +98,24 @@ function withFakeGithub() { server.listen(3000, done); }); - after(function(done) { + after(done => { server.close(done); }); return httpCalls; } -describe('generateChangeLog', function() { - it('can create an empty changelog', function() { +describe('generateChangeLog', () => { + it('can create an empty changelog', () => { const pkg = { repository: 'usr/proj' }; const commits = []; const options = { commits: commits }; - return generateChangeLog(null, pkg, options).then(function(changelog) { + return generateChangeLog(null, pkg, options).then(changelog => { assert.equal('', changelog); }); }); - it('links to github issues and jira tickets', function() { + it('links to github issues and jira tickets', () => { const pkg = { repository: 'usr/proj' }; const commits = [ { @@ -154,7 +154,7 @@ describe('generateChangeLog', function() { const options = { commits: commits }; const href0 = `https://github.com/usr/proj/commit/${commits[0].sha}`; const href1 = `https://github.com/usr/proj/commit/${commits[1].sha}`; - return generateChangeLog(null, pkg, options).then(function(changelog) { + return generateChangeLog(null, pkg, options).then(changelog => { const lines = changelog.split('\n'); assert.equal( `* [\`1234567\`](${href0}) **fix:** Stop doing the wrong thing - see: ` + @@ -170,7 +170,7 @@ describe('generateChangeLog', function() { }); }); - it('can create a changelog for two commits', function() { + it('can create a changelog for two commits', () => { const pkg = { repository: 'usr/proj' }; const commits = [ { @@ -187,7 +187,7 @@ describe('generateChangeLog', function() { const options = { commits: commits }; const href0 = `https://github.com/usr/proj/commit/${commits[0].sha}`; const href1 = `https://github.com/usr/proj/commit/${commits[1].sha}`; - return generateChangeLog(null, pkg, options).then(function(changelog) { + return generateChangeLog(null, pkg, options).then(changelog => { assert.equal( [ `* [\`1234567\`](${href0}) **fix:** Stop doing the wrong thing`, @@ -198,7 +198,7 @@ describe('generateChangeLog', function() { }); }); - it('puts breaking changes ahead of everything else', function() { + it('puts breaking changes ahead of everything else', () => { const pkg = { repository: 'usr/proj' }; const commits = [ { @@ -221,7 +221,7 @@ describe('generateChangeLog', function() { const options = { commits: commits }; const href0 = `https://github.com/usr/proj/commit/${commits[0].sha}`; const href1 = `https://github.com/usr/proj/commit/${commits[1].sha}`; - return generateChangeLog(null, pkg, options).then(function(changelog) { + return generateChangeLog(null, pkg, options).then(changelog => { assert.equal( [ '#### Breaking Changes', @@ -240,7 +240,7 @@ describe('generateChangeLog', function() { }); }); - describe('pull request commits', function() { + describe('pull request commits', () => { const httpCalls = withFakeGithub(); const pkg = { repository: 'http://127.0.0.1:3000/usr/proj' }; const commits = [ @@ -264,23 +264,23 @@ describe('generateChangeLog', function() { const options = { commits: commits }; let changelog = null; - before('generateChangeLog', function() { - return generateChangeLog(null, pkg, options).then(function(_changelog) { + before('generateChangeLog', () => { + return generateChangeLog(null, pkg, options).then(_changelog => { changelog = _changelog; }); }); - it('calls out to github to get PR info', function() { + it('calls out to github to get PR info', () => { assert.equal(2, httpCalls.length); }); - it('groups commits by pull request', function() { + it('groups commits by pull request', () => { assert.include('* PR #1 Title', changelog); assert.include(' - [`1234567`]', changelog); }); }); - describe('with an invalid PR', function() { + describe('with an invalid PR', () => { const httpCalls = withFakeGithub(); const pkg = { repository: 'http://127.0.0.1:3000/usr/proj' }; const commits = [ @@ -301,7 +301,7 @@ describe('generateChangeLog', function() { pullId: '2', }, ]; - const sloppyCommits = commits.map(function(commit) { + const sloppyCommits = commits.map(commit => { if (commit.type === 'pr') return commit; return { sha: commit.sha, header: commit.subject }; }); @@ -309,36 +309,36 @@ describe('generateChangeLog', function() { let changelog = null; let sloppyChangelog = null; - before('generateChangeLog', function() { - return generateChangeLog(null, pkg, options).then(function(_changelog) { + before('generateChangeLog', () => { + return generateChangeLog(null, pkg, options).then(_changelog => { changelog = _changelog; }); }); - before('generateSloppyChangeLog', function() { + before('generateSloppyChangeLog', () => { return generateChangeLog(null, pkg, { commits: sloppyCommits }).then( - function(_changelog) { + _changelog => { sloppyChangelog = _changelog; } ); }); - it('calls out to github to get PR info', function() { + it('calls out to github to get PR info', () => { assert.equal(4, httpCalls.length); }); - it('ignores the PR', function() { + it('ignores the PR', () => { assert.notInclude('* PR #2 Title', changelog); assert.include('* [`1234567`]', changelog); }); - it('handles poorly formatted commit messages too', function() { + it('handles poorly formatted commit messages too', () => { assert.include(') Stop doing the wrong thing\n', sloppyChangelog); assert.include(') Do more things', sloppyChangelog); }); }); - describe('with a missing PR', function() { + describe('with a missing PR', () => { const httpCalls = withFakeGithub(); const pkg = { repository: 'http://127.0.0.1:3000/usr/proj' }; const commits = [ @@ -362,17 +362,17 @@ describe('generateChangeLog', function() { const options = { commits: commits }; let changelog = null; - before('generateChangeLog', function() { - return generateChangeLog(null, pkg, options).then(function(_changelog) { + before('generateChangeLog', () => { + return generateChangeLog(null, pkg, options).then(_changelog => { changelog = _changelog; }); }); - it('calls out to github to get PR info', function() { + it('calls out to github to get PR info', () => { assert.equal(2, httpCalls.length); }); - it('ignores the PR', function() { + it('ignores the PR', () => { assert.include('* [`1234567`]', changelog); }); }); diff --git a/test/steps/pending-changes.test.js b/test/steps/pending-changes.test.js index 0e255f8..716900b 100644 --- a/test/steps/pending-changes.test.js +++ b/test/steps/pending-changes.test.js @@ -39,7 +39,7 @@ const getPendingChanges = require('../../lib/steps/pending-changes'); const withFixture = require('../fixture'); -describe('getPendingChanges', function() { +describe('getPendingChanges', () => { const dirname = withFixture('ticket-commits'); const pkg = { version: '0.0.0', @@ -47,15 +47,15 @@ describe('getPendingChanges', function() { }; const options = {}; - before('create version commit', function() { + before('create version commit', () => { return getPendingChanges(dirname, pkg, options); }); - it('adds the commits to the options', function() { + it('adds the commits to the options', () => { assert.hasType(Array, options.commits); }); - it('resolves commit references', function() { + it('resolves commit references', () => { const commit = _.find(options.commits, { subject: 'Jira' }); assert.equal(1, commit.references.length); const ref = commit.references[0]; @@ -63,7 +63,7 @@ describe('getPendingChanges', function() { assert.equal('https://jira.atlassian.com/browse/REPO-2001', ref.href); }); - it('truncates full urls to same repo', function() { + it('truncates full urls to same repo', () => { const commit = _.find(options.commits, { subject: 'Truncate' }); assert.equal(1, commit.references.length); const ref = commit.references[0]; @@ -71,7 +71,7 @@ describe('getPendingChanges', function() { assert.equal('https://github.com/usr/proj/issues/44', ref.href); }); - it('builds nice references to sibling repos', function() { + it('builds nice references to sibling repos', () => { const commit = _.find(options.commits, { subject: 'Full' }); assert.equal(1, commit.references.length); const ref = commit.references[0]; @@ -79,7 +79,7 @@ describe('getPendingChanges', function() { assert.equal('https://github.com/open/source/issues/13', ref.href); }); - it('expands short-style refs', function() { + it('expands short-style refs', () => { const commit = _.find(options.commits, { subject: 'Short' }); assert.equal(1, commit.references.length); const ref = commit.references[0]; @@ -87,7 +87,7 @@ describe('getPendingChanges', function() { assert.equal('https://github.com/usr/proj/issues/42', ref.href); }); - it('supports refs to other Github instances', function() { + it('supports refs to other Github instances', () => { const commit = _.find(options.commits, { subject: 'GHE' }); assert.equal(1, commit.references.length); const ref = commit.references[0]; diff --git a/test/steps/publish-to-npm.test.js b/test/steps/publish-to-npm.test.js index c672d4b..46bcb45 100644 --- a/test/steps/publish-to-npm.test.js +++ b/test/steps/publish-to-npm.test.js @@ -30,6 +30,8 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* eslint-disable import/no-dynamic-require */ + 'use strict'; const assert = require('assertive'); @@ -43,8 +45,8 @@ function withFakeRegistry() { const httpCalls = []; let server; - before(function(done) { - server = require('http').createServer(function(req, res) { + before(done => { + server = require('http').createServer((req, res) => { httpCalls.push({ method: req.method, url: req.url, @@ -55,20 +57,20 @@ function withFakeRegistry() { return res.end('{}'); } res.statusCode = 200; - res.end('{"ok":true}'); + return res.end('{"ok":true}'); }); server.listen(3000, done); }); - after(function(done) { + after(done => { server.close(done); }); return httpCalls; } -describe('publishToNpm', function() { - describe('with NPM_USERNAME etc.', function() { +describe('publishToNpm', () => { + describe('with NPM_USERNAME etc.', () => { const dirname = withFixture('released'); const httpCalls = withFakeRegistry(); @@ -82,7 +84,7 @@ describe('publishToNpm', function() { npmPasswordBase64: new Buffer('passw0rd').toString('base64'), npmEmail: 'robin@example.com', npmToken: '', - }).then(function() { + }).then(() => { assert.deepEqual( { method: 'PUT', @@ -110,14 +112,14 @@ describe('publishToNpm', function() { ); } - describe('with NPM_TOKEN etc.', function() { + describe('with NPM_TOKEN etc.', () => { const dirname = withFixture('released'); const httpCalls = withFakeRegistry(); it('uses a bearer token', function() { this.timeout(4000); const pkg = require(`${dirname}/package.json`); - return publishToNpm(dirname, pkg, getTokenOptions()).then(function() { + return publishToNpm(dirname, pkg, getTokenOptions()).then(() => { assert.deepEqual( { method: 'PUT', @@ -130,34 +132,34 @@ describe('publishToNpm', function() { }); }); - describe('without --commmit', function() { + describe('without --commmit', () => { const dirname = withFixture('released'); const httpCalls = withFakeRegistry(); - it('makes no http calls', function() { + it('makes no http calls', () => { const opts = getTokenOptions({ commit: false }); return publishToNpm( dirname, require(`${dirname}/package.json`), opts - ).then(function() { + ).then(() => { assert.deepEqual([], httpCalls); }); }); }); - describe('if the package is set to private', function() { + describe('if the package is set to private', () => { const dirname = withFixture('released'); const httpCalls = withFakeRegistry(); - it('makes no http calls', function() { + it('makes no http calls', () => { const pkg = _.defaults( { private: true, }, require(`${dirname}/package.json`) ); - return publishToNpm(dirname, pkg, getTokenOptions()).then(function() { + return publishToNpm(dirname, pkg, getTokenOptions()).then(() => { assert.deepEqual([], httpCalls); }); }); diff --git a/test/steps/release-info.test.js b/test/steps/release-info.test.js index 0dbd195..5592f57 100644 --- a/test/steps/release-info.test.js +++ b/test/steps/release-info.test.js @@ -40,23 +40,23 @@ const determineReleaseInfo = require('../../lib/steps/release-info'); const withFixture = require('../fixture'); -describe('determineReleaseInfo', function() { - it('returns "none" for an empty list of commits', function() { +describe('determineReleaseInfo', () => { + it('returns "none" for an empty list of commits', () => { assert.equal('none', determineReleaseInfo([])); }); - describe('with invalid commit messages', function() { + describe('with invalid commit messages', () => { const dirname = withFixture('invalid-commit'); let commits = []; - before('load commits', function() { - return getCommits(dirname).then(function(results) { + before('load commits', () => { + return getCommits(dirname).then(results => { commits = results; }); }); - it('rejects them with a helpful message', function() { - const error = assert.throws(function() { + it('rejects them with a helpful message', () => { + const error = assert.throws(() => { determineReleaseInfo(commits); }); @@ -93,8 +93,8 @@ describe('determineReleaseInfo', function() { ); }); - describe('with --acceptInvalidCommits', function() { - it('is cautious and considers it "major"', function() { + describe('with --acceptInvalidCommits', () => { + it('is cautious and considers it "major"', () => { assert.equal('major', determineReleaseInfo(commits, true)); }); }); diff --git a/test/steps/version-commit.test.js b/test/steps/version-commit.test.js index b1f5bb0..240e00a 100644 --- a/test/steps/version-commit.test.js +++ b/test/steps/version-commit.test.js @@ -41,7 +41,7 @@ const createVersionCommit = require('../../lib/steps/version-commit'); const withFixture = require('../fixture'); -describe('createVersionCommit', function() { +describe('createVersionCommit', () => { const dirname = withFixture('multiple-commits'); const pkg = { name: 'some-package', @@ -52,28 +52,28 @@ describe('createVersionCommit', function() { changelog: '* New stuff\n* Interesting features', }; - before('commits with the original author', function(done) { - execFile('git', ['show'], { cwd: dirname }, function(err, stdout) { + before('commits with the original author', done => { + execFile('git', ['show'], { cwd: dirname }, (err, stdout) => { if (err) return done(err); assert.include('Author: Robin Developer ', stdout); - done(); + return done(); }); }); - before('create version commit', function() { + before('create version commit', () => { return createVersionCommit(dirname, pkg, options); }); - it('writes the correct HEAD sha', function() { + it('writes the correct HEAD sha', () => { const HEAD = fs.readFileSync(`${dirname}/.git/refs/heads/master`, 'utf8'); assert.equal(HEAD.trim(), options.versionCommitSha); }); - it('commits with the proper user', function(done) { - execFile('git', ['show'], { cwd: dirname }, function(err, stdout) { + it('commits with the proper user', done => { + execFile('git', ['show'], { cwd: dirname }, (err, stdout) => { if (err) return done(err); assert.include('Author: nlm ', stdout); - done(); + return done(); }); }); });