diff --git a/.gitignore b/.gitignore index f1185067..ed5d11aa 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,10 @@ +# common +coverage node_modules *.log +.nyc_output +.tests .tmp + +# build-artifacts +dist diff --git a/.npmignore b/.npmignore new file mode 100644 index 00000000..e428f04f --- /dev/null +++ b/.npmignore @@ -0,0 +1,12 @@ +# common +coverage +node_modules +*.log +.nyc_output +.tests +.tmp + +# source/config +src +*.yml +.gitignore diff --git a/.travis.yml b/.travis.yml index cf29732c..6534e8b4 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,15 +1,15 @@ -language: node_js -node_js: -- iojs-v2 -- iojs-v1 -- '0.10' -- '0.12' sudo: false +language: node_js cache: directories: - node_modules notifications: email: false +node_js: +- iojs-v2 +- iojs-v1 +- '0.12' +- '0.10' before_install: - npm i -g npm@^2.0.0 before_script: @@ -18,6 +18,7 @@ before_script: after_success: - python travis_after_all.py - export $(cat .to_export_back) +- if [[ $BUILD_LEADER = YES ]]; then npm run coveralls; fi after_failure: - python travis_after_all.py - export $(cat .to_export_back) diff --git a/README.md b/README.md index 97ddb066..310b1a6d 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,6 @@ # semantic-release [![Build Status](https://travis-ci.org/boennemann/semantic-release.svg?branch=master)](https://travis-ci.org/boennemann/semantic-release) +[![Coverage Status](https://coveralls.io/repos/boennemann/semantic-release/badge.svg)](https://coveralls.io/r/boennemann/semantic-release) [![Dependency Status](https://david-dm.org/boennemann/semantic-release.svg)](https://david-dm.org/boennemann/semantic-release) [![devDependency Status](https://david-dm.org/boennemann/semantic-release/dev-status.svg)](https://david-dm.org/boennemann/semantic-release#info=devDependencies) diff --git a/bin/semantic-release.js b/bin/semantic-release.js index 05521a6e..d60dab52 100755 --- a/bin/semantic-release.js +++ b/bin/semantic-release.js @@ -1,13 +1,9 @@ #!/usr/bin/env node -'use strict' var readFile = require('fs').readFileSync -var abbrev = require('abbrev') var minimist = require('minimist') -var efh = require('../lib/error').standard - var argv = minimist(process.argv.slice(2), { alias: { d: 'debug', @@ -23,72 +19,26 @@ var argv = minimist(process.argv.slice(2), { } }) -var plugins = JSON.parse(readFile('./package.json')).release || {} - var npmArgv = process.env.npm_config_argv ? minimist(JSON.parse(process.env.npm_config_argv).cooked) : {_: []} +var plugins = JSON.parse(readFile('./package.json')).release || {} + +var main + +/* istanbul ignore next */ +try { + main = require('../dist/main') +} catch (e) { + require('babel/register') + main = require('../src/main') +} + if (~argv._.indexOf('pre')) { - // see src/restart.js - if (npmArgv['semantic-release-rerun']) { - if (!/semantically-released/.test(process.env.npm_package_version)) process.exit(0) - - console.log('There is something wrong with your setup, as a placeholder version is about to be released.') - console.log('Please verify that your setup is correct.') - console.log('If you think this is a problem with semantic-release please open an issue.') - process.exit(1) - } - // the `prepublish` hook is also executed when the package is installed - // in this case we abort the command and do nothing. - if ( - isAbbrev(npmArgv, 'install') || - isAbbrev(npmArgv, 'link') || - isAbbrev(npmArgv, 'pack') - ) process.exit(0) - - if (argv.debug) console.log('This is a dry run') - - console.log('Determining new version') - - var publish = false - if (isAbbrev(npmArgv, 'publish')) publish = true - - // require a correct setup during publish - if (publish && !argv.debug && !require('../src/verify')(argv)) process.exit(1) - - require('../src/pre')(argv, plugins, efh(function (result) { - if (!result) { - console.log('Nothing changed. Not publishing.') - process.exit(1) - } - - console.log('Publishing v' + result) - if (!publish) process.exit(0) - - if (argv.debug) process.exit(1) - - require('../src/restart')(efh(function () { - process.exit(1) - })) - })) -} - -if (~argv._.indexOf('post')) { - require('../src/post')(argv, plugins, efh(function () { - // see src/restart.js - if (npmArgv['semantic-release-rerun']) { - console.log('Everything is alright :) npm will now print an error message that you can safely ignore.') - } - })) -} - -if (~argv._.indexOf('setup')) { - require('../src/setup')() - console.log('"package.json" is set up properly. Now configure your CI server.') - console.log('https://github.com/boennemann/semantic-release#ci-server') -} - -function isAbbrev (argv, command) { - return argv._.some(Object.prototype.hasOwnProperty.bind(abbrev(command))) + main.pre(argv, npmArgv, plugins) +} else if (~argv._.indexOf('post')) { + main.post(argv, npmArgv, plugins) +} else if (~argv._.indexOf('setup')) { + main.setup(argv, npmArgv, plugins) } diff --git a/lib/analyzer.js b/lib/analyzer.js deleted file mode 100644 index ff6d8f8f..00000000 --- a/lib/analyzer.js +++ /dev/null @@ -1,32 +0,0 @@ -'use strict' - -var parseRawCommit = require('conventional-changelog/lib/git').parseRawCommit - -module.exports = function (commits) { - var type = null - - commits - - .map(function (commit) { - return parseRawCommit(commit.hash + '\n' + commit.message) - }) - - .filter(function (commit) { - return !!commit - }) - - .every(function (commit) { - if (commit.breaks.length) { - type = 'major' - return false - } - - if (commit.type === 'feat') type = 'minor' - - if (!type && commit.type === 'fix') type = 'patch' - - return true - }) - - return type -} diff --git a/lib/commits.js b/lib/commits.js deleted file mode 100644 index 767db814..00000000 --- a/lib/commits.js +++ /dev/null @@ -1,27 +0,0 @@ -'use strict' - -var exec = require('child_process').exec - -var efh = require('./error').efh - -module.exports = function (from, cb) { - var range = (from ? from + '..' : '') + 'HEAD' - exec( - 'git log -E --format=%H==SPLIT==%B==END== ' + range, - efh(cb)(function (stdout) { - cb(null, String(stdout).split('==END==\n') - - .filter(function (raw) { - return !!raw.trim() - }) - - .map(function (raw) { - var data = raw.split('==SPLIT==') - return { - hash: data[0], - message: data[1] - } - })) - }) - ) -} diff --git a/lib/error.js b/lib/error.js deleted file mode 100644 index 72a5b002..00000000 --- a/lib/error.js +++ /dev/null @@ -1,14 +0,0 @@ -'use strict' - -var efh = require('error-first-handler') - -module.exports = { - efh: efh, - standard: efh(function (err) { - console.log('Something went wrong:') - if (typeof err === 'string') return console.log(err) - if (err instanceof Error) return console.log(err.message, err.stack) - if (err.message) return console.log(err.message) - console.log(err) - }) -} diff --git a/lib/release-notes.js b/lib/release-notes.js deleted file mode 100644 index d1772982..00000000 --- a/lib/release-notes.js +++ /dev/null @@ -1,17 +0,0 @@ -'use strict' - -var readFile = require('fs').readFileSync - -var changelog = require('conventional-changelog') -var parseUrl = require('github-url-from-git') - -module.exports = function (cb) { - var pkg = JSON.parse(readFile('./package.json')) - var repository = pkg.repository ? parseUrl(pkg.repository.url) : null - - changelog({ - version: pkg.version, - repository: repository, - file: false - }, cb) -} diff --git a/package.json b/package.json index b4fc952e..50eff27a 100644 --- a/package.json +++ b/package.json @@ -7,6 +7,14 @@ "bugs": { "url": "https://github.com/boennemann/semantic-release/issues" }, + "config": { + "nyc": { + "exclude": [ + ".tests", + "node_modules" + ] + } + }, "dependencies": { "abbrev": "^1.0.5", "async": "^1.0.0", @@ -23,16 +31,17 @@ "semver": "^4.3.3" }, "devDependencies": { + "coveralls": "^2.11.2", "cracks": "^2.0.1", "github-release-fake-server": "^1.3.0", "lodash.defaults": "^3.0.0", "nano-uid": "^0.2.0", "nixt": "^0.4.1", "nock": "^2.2.0", + "nyc": "^2.3.0", "sinopia": "^1.0.0", - "standard": "^3.11.1", - "tap-spec": "^3.0.0", - "tape": "^4.0.0" + "standard": "^4.0.1", + "tap": "^1.2.0" }, "engines": { "iojs": "^1", @@ -43,28 +52,36 @@ "keywords": [ "author", "automation", - "release", - "publish", + "changelog", "module", "package", + "publish", + "release", "semver", - "version", - "changelog" + "version" ], "license": "MIT", - "main": "index.js", + "main": "dist/main.js", + "optionalDependencies": { + "babel": "^5.5.6" + }, + "release": { + "verification": "cracks" + }, "repository": { "type": "git", "url": "https://github.com/boennemann/semantic-release.git" }, "scripts": { + "build": "rm -rf dist && mkdir -p dist && babel src --out-dir dist", + "build:tests": "rm -rf .tests && mkdir -p .tests && babel tests --out-dir .tests", + "coverage": "nyc report", + "coveralls": "npm run coverage -- --reporter=lcovonly && cat coverage/lcov.info | coveralls", "postpublish": "./bin/semantic-release.js post", - "prepublish": "./bin/semantic-release.js pre", - "test:style": "standard", - "test:integration": "node tests | tap-spec", - "test": "./bin/test" - }, - "release": { - "verification": "cracks" + "prepublish": "npm run build && ./bin/semantic-release.js pre", + "pretest:integration": "npm run build && npm run build:tests", + "test": "./bin/test", + "test:integration": "nyc tap --no-cov .tests/{scenarios,tap}/*.js", + "test:style": "standard" } } diff --git a/src/lib/analyzer.js b/src/lib/analyzer.js new file mode 100644 index 00000000..c15b6de2 --- /dev/null +++ b/src/lib/analyzer.js @@ -0,0 +1,26 @@ +const { parseRawCommit } = require('conventional-changelog/lib/git') + +module.exports = function (commits) { + let type = null + + commits + + .map((commit) => parseRawCommit(`${commit.hash}\n${commit.message}`)) + + .filter((commit) => !!commit) + + .every((commit) => { + if (commit.breaks.length) { + type = 'major' + return false + } + + if (commit.type === 'feat') type = 'minor' + + if (!type && commit.type === 'fix') type = 'patch' + + return true + }) + + return type +} diff --git a/src/lib/commits.js b/src/lib/commits.js new file mode 100644 index 00000000..094f9538 --- /dev/null +++ b/src/lib/commits.js @@ -0,0 +1,23 @@ +const { exec } = require('child_process') + +const { efh } = require('./error') + +module.exports = function (from, cb) { + const range = (from ? from + '..' : '') + 'HEAD' + exec( + `git log -E --format=%H==SPLIT==%B==END== ${range}`, + efh(cb)((stdout) => { + cb(null, String(stdout).split('==END==\n') + + .filter((raw) => !!raw.trim()) + + .map((raw) => { + const data = raw.split('==SPLIT==') + return { + hash: data[0], + message: data[1] + } + })) + }) + ) +} diff --git a/src/lib/error.js b/src/lib/error.js new file mode 100644 index 00000000..e987adbf --- /dev/null +++ b/src/lib/error.js @@ -0,0 +1,8 @@ +exports.efh = require('error-first-handler') +exports.standard = exports.efh((err) => { + console.log('Something went wrong:') + if (typeof err === 'string') return console.log(err) + if (err instanceof Error) return console.log(err.message, err.stack) + if (err.message) return console.log(err.message) + console.log(err) +}) diff --git a/lib/npm-info.js b/src/lib/npm-info.js similarity index 57% rename from lib/npm-info.js rename to src/lib/npm-info.js index 24a10734..29a93529 100644 --- a/lib/npm-info.js +++ b/src/lib/npm-info.js @@ -1,29 +1,30 @@ -'use strict' - -var async = require('async') -var npmconf = require('npmconf') -var request = require('request') +const async = require('async') +const npmconf = require('npmconf') +const request = require('request') module.exports = function (pkgName, cb) { - var registry = process.env.npm_config_registry + const registry = process.env.npm_config_registry + async.waterfall([ npmconf.load, - function (conf, callback) { - var cred = conf.getCredentialsByURI(registry) - var reqopts = { + (conf, callback) => { + const cred = conf.getCredentialsByURI(registry) + const reqopts = { url: registry + pkgName.replace(/\//g, '%2F'), headers: {} } + if (cred.token) { - reqopts.headers.Authorization = 'Bearer ' + cred.token + reqopts.headers.Authorization = `Bearer ${cred.token}` } else if (cred.auth) { - reqopts.headers.Authorization = 'Basic ' + cred.auth + reqopts.headers.Authorization = `Basic ${cred.auth}` } + callback(null, reqopts) }, request, - function (response, body, callback) { - var res = { + (response, body, callback) => { + let res = { version: null, gitHead: null, pkg: null @@ -31,7 +32,7 @@ module.exports = function (pkgName, cb) { if (response.statusCode === 404 || !body) return callback(null, res) - var pkg = JSON.parse(body) + const pkg = JSON.parse(body) if (pkg.error) return callback(pkg.error) diff --git a/src/lib/release-notes.js b/src/lib/release-notes.js new file mode 100644 index 00000000..ee0ab381 --- /dev/null +++ b/src/lib/release-notes.js @@ -0,0 +1,15 @@ +const { readFileSync } = require('fs') + +const changelog = require('conventional-changelog') +const parseUrl = require('github-url-from-git') + +module.exports = function (cb) { + const pkg = JSON.parse(readFileSync('./package.json')) + const repository = pkg.repository ? parseUrl(pkg.repository.url) : null + + changelog({ + version: pkg.version, + repository: repository, + file: false + }, cb) +} diff --git a/src/main.js b/src/main.js new file mode 100644 index 00000000..b9143621 --- /dev/null +++ b/src/main.js @@ -0,0 +1,65 @@ +const abbrev = require('abbrev') +const efh = require('./lib/error').standard + +exports.pre = function (argv, npmArgv, plugins) { + // see src/restart.js + if (npmArgv['semantic-release-rerun']) { + if (!/semantically-released/.test(process.env.npm_package_version)) process.exit(0) + + console.log( +`There is something wrong with your setup, as a placeholder version is about to be released. +Please verify that your setup is correct. +If you think this is a problem with semantic-release please open an issue.` + ) + process.exit(1) + } + // the `prepublish` hook is also executed when the package is installed + // in this case we abort the command and do nothing. + if ( + isAbbrev(npmArgv, 'install') || + isAbbrev(npmArgv, 'link') || + isAbbrev(npmArgv, 'pack') + ) process.exit(0) + + if (argv.debug) console.log('This is a dry run') + + console.log('Determining new version') + + const publish = isAbbrev(npmArgv, 'publish') + + // require a correct setup during publish + if (publish && !argv.debug && !require('./verify')(argv)) process.exit(1) + + require('./pre')(argv, plugins, efh((result) => { + if (!result) { + console.log('Nothing changed. Not publishing.') + process.exit(1) + } + + console.log('Publishing v' + result) + if (!publish) process.exit(0) + + if (argv.debug) process.exit(1) + + require('./restart')(efh(() => process.exit(1))) + })) +} + +exports.post = function (argv, npmArgv, plugins) { + require('./post')(argv, plugins, efh(function () { + // see src/restart.js + if (npmArgv['semantic-release-rerun']) { + console.log('Everything is alright :) npm will now print an error message that you can safely ignore.') + } + })) +} + +exports.setup = function () { + require('./setup')() + console.log('"package.json" is set up properly. Now configure your CI server.') + console.log('https://github.com/boennemann/semantic-release#ci-server') +} + +function isAbbrev (argv, command) { + return argv._.some(Object.prototype.hasOwnProperty.bind(abbrev(command))) +} diff --git a/src/post.js b/src/post.js index 5a3887fb..d535f3b6 100644 --- a/src/post.js +++ b/src/post.js @@ -1,38 +1,36 @@ -'use strict' +const { readFileSync } = require('fs') +const url = require('url') -var readFile = require('fs').readFileSync -var url = require('url') +const gitHead = require('git-head') +const GitHubApi = require('github') +const parseSlug = require('parse-github-repo-url') -var gitHead = require('git-head') -var GitHubApi = require('github') -var parseSlug = require('parse-github-repo-url') - -var efh = require('../lib/error').efh +const efh = require('./lib/error').efh module.exports = function (options, plugins, cb) { - var pkg = JSON.parse(readFile('./package.json')) - var repository = pkg.repository ? pkg.repository.url : null + const pkg = JSON.parse(readFileSync('./package.json')) + const repository = pkg.repository ? pkg.repository.url : null if (!repository) return cb(new Error('Package must have a repository')) - var notesGenerator = require(plugins.notes || '../lib/release-notes') + const notesGenerator = require(plugins.notes || './lib/release-notes') - var config = options['github-url'] ? url.parse(options['github-url']) : {} + const config = options['github-url'] ? url.parse(options['github-url']) : {} - var github = new GitHubApi({ + const github = new GitHubApi({ version: '3.0.0', port: config.port, protocol: (config.protocol || '').split(':')[0] || null, host: config.hostname }) - notesGenerator(efh(cb)(function (log) { - gitHead(efh(cb)(function (hash) { - var ghRepo = parseSlug(repository) - var release = { + notesGenerator(efh(cb)((log) => { + gitHead(efh(cb)((hash) => { + const ghRepo = parseSlug(repository) + const release = { owner: ghRepo[0], repo: ghRepo[1], - tag_name: 'v' + pkg.version, + tag_name: `v${pkg.version}`, target_commitish: hash, draft: options.debug, body: log @@ -43,9 +41,7 @@ module.exports = function (options, plugins, cb) { token: options.token }) - github.releases.createRelease(release, efh(cb)(function () { - cb(null, true) - })) + github.releases.createRelease(release, efh(cb)(() => cb(null, true))) })) })) } diff --git a/src/pre.js b/src/pre.js index 67ca98d1..f40f0f4b 100644 --- a/src/pre.js +++ b/src/pre.js @@ -1,23 +1,21 @@ -'use strict' +const fs = require('fs') -var fs = require('fs') +const semver = require('semver') -var semver = require('semver') - -var getCommits = require('../lib/commits') -var npmInfo = require('../lib/npm-info') -var efh = require('../lib/error').efh +const getCommits = require('./lib/commits') +const npmInfo = require('./lib/npm-info') +const { efh } = require('./lib/error') module.exports = function (options, plugins, cb) { - var path = './package.json' - var pkg = JSON.parse(fs.readFileSync(path)) + const path = './package.json' + let pkg = JSON.parse(fs.readFileSync(path)) if (!pkg.name) return cb(new Error('Package must have a name')) - npmInfo(pkg.name, efh(cb)(function (res) { - getCommits(res.gitHead, efh(cb)(function (commits) { - var analyzer = require(plugins.analyzer || '../lib/analyzer') - var type = analyzer(commits) + npmInfo(pkg.name, efh(cb)((res) => { + getCommits(res.gitHead, efh(cb)((commits) => { + const analyzer = require(plugins.analyzer || './lib/analyzer') + let type = analyzer(commits) if (!type) return cb(null, null) @@ -28,14 +26,14 @@ module.exports = function (options, plugins, cb) { pkg.version = '1.0.0' } - var writePkg = function () { - if (!options.debug) fs.writeFileSync(path, JSON.stringify(pkg, null, 2) + '\n') + function writePkg () { + if (!options.debug) fs.writeFileSync(path, `${JSON.stringify(pkg, null, 2)}\n`) cb(null, pkg.version) } if (!plugins.verification) return writePkg() - var opts = {} + let opts = {} if (typeof plugins.verification === 'string') { opts.path = plugins.verification @@ -50,11 +48,11 @@ module.exports = function (options, plugins, cb) { opts.version = res.version opts.nextVersion = pkg.version - var verification = require(opts.path) + const verification = require(opts.path) console.log('Running verification hook...') - verification(opts, function (error, ok) { + verification(opts, (error, ok) => { if (!error && ok) return writePkg() console.log('Verification failed' + (error ? ': ' + error : '')) process.exit(1) diff --git a/src/restart.js b/src/restart.js index f542194f..2568a738 100644 --- a/src/restart.js +++ b/src/restart.js @@ -1,16 +1,14 @@ -'use strict' +const { spawn } = require('child_process') -var spawn = require('child_process').spawn - -var exports = module.exports = function (cb) { +let exports = module.exports = function (cb) { // npm loads package.json data before running the `prepublish` hook // changing the version on `prepublish` has no effect // see https://github.com/npm/npm/issues/7118 // to circumvent this behavior we are calling `npm publish` inside `prepublish` // the package.json is then loaded again and the correct version will be published - var child = spawn('npm', ['publish', '--semantic-release-rerun']) - var handler = exports.handleCloseAndExit.bind(null, cb) + const child = spawn('npm', ['publish', '--semantic-release-rerun']) + const handler = exports.handleCloseAndExit.bind(null, cb) child.stdout.pipe(process.stdout) child.stderr.pipe(process.stderr) @@ -23,8 +21,8 @@ var exports = module.exports = function (cb) { exports.handleCloseAndExit = function (cb, code, signal) { if (code === 0) return cb(null) cb({ - code: code, - signal: signal, + code, + signal, message: 'npm publish failed' }) } diff --git a/src/setup.js b/src/setup.js index 544065f5..be1d33cd 100644 --- a/src/setup.js +++ b/src/setup.js @@ -1,32 +1,33 @@ -'use strict' +const { + readFileSync, + writeFileSync +} = require('fs') -var fs = require('fs') - -var ini = require('ini') -var ghUrl = require('github-url-from-git') +const ini = require('ini') +const ghUrl = require('github-url-from-git') module.exports = function () { - var pkg = JSON.parse(fs.readFileSync('./package.json') + '') + let pkg = JSON.parse(String(readFileSync('./package.json'))) // ensure a yet unpublished version pkg.version = '0.0.0-semantically-released' // set up scripts - var pre = 'semantic-release pre' - var post = 'semantic-release post' + const pre = 'semantic-release pre' + const post = 'semantic-release post' if (!pkg.scripts) pkg.scripts = {} if (!pkg.scripts.prepublish) pkg.scripts.prepublish = pre - else if (!(new RegExp(pre).test(pkg.scripts.prepublish))) pkg.scripts.prepublish += ' && ' + pre + else if (!(new RegExp(pre).test(pkg.scripts.prepublish))) pkg.scripts.prepublish += ` && ${pre}` if (!pkg.scripts.postpublish) pkg.scripts.postpublish = post - else if (!(new RegExp(post).test(pkg.scripts.postpublish))) pkg.scripts.postpublish += ' && ' + post + else if (!(new RegExp(post).test(pkg.scripts.postpublish))) pkg.scripts.postpublish += ` && ${post}` // set up repository if (!pkg.repository || !pkg.repository.url) { - var config = ini.decode(fs.readFileSync('./.git/config') + '') - var repo = config['remote "origin"'].url + const config = ini.decode(String(readFileSync('./.git/config'))) + const repo = config['remote "origin"'].url if (repo) pkg.repository = { type: 'git', url: ghUrl(repo) } } @@ -35,8 +36,8 @@ module.exports = function () { if (!pkg.devDependencies) pkg.devDependencies = {} if (!pkg.devDependencies['semantic-release']) { - pkg.devDependencies['semantic-release'] = '^' + require('../package.json').version + pkg.devDependencies['semantic-release'] = `^${require('../package.json').version}` } - fs.writeFileSync('./package.json', JSON.stringify(pkg, null, 2) + '\n') + writeFileSync('./package.json', `${JSON.stringify(pkg, null, 2)}\n`) } diff --git a/src/verify.js b/src/verify.js index 33bd2dc9..1ac2fca7 100644 --- a/src/verify.js +++ b/src/verify.js @@ -1,22 +1,21 @@ -'use strict' +const { readFileSync } = require('fs') -var fs = require('fs') - -var exports = module.exports = function (input) { - var options = exports.verifyOptions(input) - var pkg = exports.verifyPackage() - var travis = exports.verifyTravis() +let exports = module.exports = function (input) { + const options = exports.verifyOptions(input) + const pkg = exports.verifyPackage() + const travis = exports.verifyTravis() return options && pkg && travis } exports.verifyTravis = function () { + let travis try { - var travis = fs.readFileSync('.travis.yml') + '' + travis = String(readFileSync('.travis.yml')) } catch (e) { return true } - var passed = true + let passed = true if (!/\sdeploy:/m.test(travis)) { console.error('You should configure deployments inside the ".travis.yml".') @@ -32,10 +31,11 @@ exports.verifyTravis = function () { } exports.verifyPackage = function () { - var passed = true + let passed = true + let pkg try { - var pkg = fs.readFileSync('./package.json') + '' + pkg = String(readFileSync('./package.json')) } catch (e) { console.error('You must have a "package.json" present.') passed = false diff --git a/tests/index.js b/tests/index.js deleted file mode 100644 index dc61116b..00000000 --- a/tests/index.js +++ /dev/null @@ -1,15 +0,0 @@ -'use strict' - -var test = require('tape') - -var createModule = require('./lib/create-module') - -require('./tap/npm-info')(test) -require('./scenarios/custom-analyzer')(test, createModule) -require('./scenarios/custom-verification')(test, createModule) -require('./scenarios/ignore')(test, createModule) -require('./scenarios/prepublish')(test, createModule) -require('./scenarios/postpublish')(test, createModule) -require('./scenarios/publish')(test, createModule) -require('./scenarios/verify')(test, createModule) -require('./scenarios/setup')(test, createModule) diff --git a/tests/lib/commit-to-version-test.js b/tests/lib/commit-to-version-test.js index f087ddcc..5dba11f4 100644 --- a/tests/lib/commit-to-version-test.js +++ b/tests/lib/commit-to-version-test.js @@ -1,34 +1,32 @@ -'use strict' +const fs = require('fs') +const exec = require('child_process').exec -var fs = require('fs') -var exec = require('child_process').exec - -var nixt = require('nixt') +const nixt = require('nixt') module.exports = function (t, message, version, code, name, cwd) { - t.test(name, function (t) { + t.test(name, (t) => { t.plan(3) nixt() .cwd(cwd) .env('CI', true) .env('npm_config_registry', 'http://127.0.0.1:4873/') - .exec('git commit --allow-empty -m "' + message + '"') + .exec(`git commit --allow-empty -m "${message}"`) .run('npm run prepublish') .code(code) - .stdout(/> semantic-release pre\n\nDetermining new version\n/m) - .end(function (err) { + .stdout(/semantic-release.js pre\n\nDetermining new version\n/m) + .end((err) => { t.error(err, 'nixt') - var pkg = JSON.parse(fs.readFileSync(cwd + '/package.json')) + const pkg = JSON.parse(fs.readFileSync(`${cwd}/package.json`)) t.is(pkg.version, version, 'version') if (code === 1) { return t.error(null, 'no publish') } - exec('npm publish --ignore-scripts', {cwd: cwd}, function (err) { - setTimeout(function () { + exec('npm publish --ignore-scripts', {cwd}, (err) => { + setTimeout(() => { t.error(err, 'publish') }, 300) }) diff --git a/tests/lib/create-module.js b/tests/lib/create-module.js index 3dc77e73..b07efc47 100644 --- a/tests/lib/create-module.js +++ b/tests/lib/create-module.js @@ -1,24 +1,19 @@ -'use strict' +const exec = require('child_process').exec +const join = require('path').join -var exec = require('child_process').exec -var join = require('path').join - -var efh = require('error-first-handler') -var defaults = require('lodash.defaults') -var uid = require('nano-uid')() +const efh = require('error-first-handler') +const defaults = require('lodash.defaults') +const uid = require('nano-uid')() module.exports = function (input) { - var cb = Array.prototype.pop.call(arguments) - uid.generate(5, efh(cb)(function (id) { - var pkg = defaults((typeof input === 'object' ? input : {}), { + const cb = Array.prototype.pop.call(arguments) + uid.generate(5, efh(cb)((id) => { + const pkg = defaults((typeof input === 'object' ? input : {}), { name: id, version: '0.0.0', - devDependencies: { - 'semantic-release': 'file:../../../' - }, scripts: { - prepublish: 'semantic-release pre', - postpublish: 'semantic-release post' + prepublish: '../../../bin/semantic-release.js pre', + postpublish: '../../../bin/semantic-release.js post' }, publishConfig: { registry: 'http://localhost:4873/' @@ -26,19 +21,18 @@ module.exports = function (input) { }) id = pkg.name - var cwd = join(__dirname, '../../.tmp/modules', id) + const cwd = join(__dirname, '../../.tmp/modules', id) exec( - 'mkdir ' + cwd + ' && ' + - 'cd ' + cwd + ' && ' + - 'git init && ' + - 'echo \'' + JSON.stringify(pkg, null, 2) + '\' >> package.json && ' + - 'git add . && ' + - 'git config user.email "integration@test" && ' + - 'git config user.name "Integration Test" && ' + - 'git commit -m "initial" && ' + - 'npm install' - , efh(cb)(function (stdout) { + `mkdir ${cwd} && + cd ${cwd} && + git init && + echo '${JSON.stringify(pkg, null, 2)}' >> package.json && + git add . && + git config user.email "integration@test" && + git config user.name "Integration Test" && + git commit -m "initial"` + , efh(cb)((stdout) => { cb(null, id, cwd) })) })) diff --git a/tests/lib/custom-analyzer.js b/tests/lib/custom-analyzer.js index cd548e70..5964ae69 100644 --- a/tests/lib/custom-analyzer.js +++ b/tests/lib/custom-analyzer.js @@ -1,9 +1,7 @@ -'use strict' - module.exports = function (commits) { - var type = null + let type = null - commits.every(function (commit) { + commits.every((commit) => { if (/FOO/.test(commit.message)) { type = 'major' return false diff --git a/tests/lib/custom-release-notes.js b/tests/lib/custom-release-notes.js index f9527d51..d6913c16 100644 --- a/tests/lib/custom-release-notes.js +++ b/tests/lib/custom-release-notes.js @@ -1,5 +1,3 @@ -'use strict' - module.exports = function (cb) { cb(null, 'custom log') } diff --git a/tests/lib/custom-verification.js b/tests/lib/custom-verification.js index aae19461..48432356 100644 --- a/tests/lib/custom-verification.js +++ b/tests/lib/custom-verification.js @@ -1,5 +1,3 @@ -'use strict' - module.exports = function (opts, cb) { cb(null, !(opts.commits.length % 2)) } diff --git a/tests/scenarios/custom-analyzer.js b/tests/scenarios/custom-analyzer.js index d571cb78..078afa68 100644 --- a/tests/scenarios/custom-analyzer.js +++ b/tests/scenarios/custom-analyzer.js @@ -1,23 +1,21 @@ -'use strict' +const path = require('path') -var path = require('path') +const efh = require('error-first-handler') +const test = require('tap').test -var efh = require('error-first-handler') +const createModule = require('../lib/create-module') +const commitToVersionTest = require('../lib/commit-to-version-test') -var commitToVersionTest = require('../lib/commit-to-version-test') - -module.exports = function (test, createModule) { +test('custom-analyzer', (t) => { createModule({ release: { analyzer: path.join(__dirname, '../lib/custom-analyzer') } - }, efh()(function (name, cwd) { - test('custom-analyzer', function (t) { - commitToVersionTest(t, 'HO', '0.0.0', 1, 'abort publish w/o changes', cwd) - commitToVersionTest(t, 'BAZ', '1.0.0', 0, 'release 1.0.0 if unpublished', cwd) - commitToVersionTest(t, 'BAZ', '1.0.1', 0, 'bump patch for fix', cwd) - commitToVersionTest(t, 'BAR', '1.1.0', 0, 'bump minor for feature', cwd) - commitToVersionTest(t, 'FOO', '2.0.0', 0, 'bump major for breaking change', cwd) - }) + }, efh()((name, cwd) => { + commitToVersionTest(t, 'HO', '0.0.0', 1, 'abort publish w/o changes', cwd) + commitToVersionTest(t, 'BAZ', '1.0.0', 0, 'release 1.0.0 if unpublished', cwd) + commitToVersionTest(t, 'BAZ', '1.0.1', 0, 'bump patch for fix', cwd) + commitToVersionTest(t, 'BAR', '1.1.0', 0, 'bump minor for feature', cwd) + commitToVersionTest(t, 'FOO', '2.0.0', 0, 'bump major for breaking change', cwd) })) -} +}) diff --git a/tests/scenarios/custom-verification.js b/tests/scenarios/custom-verification.js index d9b05879..a72ec7d7 100644 --- a/tests/scenarios/custom-verification.js +++ b/tests/scenarios/custom-verification.js @@ -1,45 +1,40 @@ -'use strict' +const path = require('path') -var path = require('path') +const efh = require('error-first-handler') +const nixt = require('nixt') +const test = require('tap').test -var efh = require('error-first-handler') -var nixt = require('nixt') +const createModule = require('../lib/create-module') -module.exports = function (test, createModule) { +test('custom-verification', (t) => { createModule({ release: { verification: path.join(__dirname, '../lib/custom-verification') } - }, efh()(function (name, cwd) { - test('custom-verification', function (t) { - t.test('even commit count', function (t) { - t.plan(1) - nixt() - .cwd(cwd) - .env('CI', true) - .env('npm_config_registry', 'http://127.0.0.1:4873/') - .exec('git commit --allow-empty -m "feat: commit"') - .run('npm run prepublish') - .code(0) - .end(function (err) { - t.error(err, 'nixt') - }) - }) + }, efh()((name, cwd) => { + t.test('even commit count', (t) => { + t.plan(1) + nixt() + .cwd(cwd) + .env('CI', true) + .env('npm_config_registry', 'http://127.0.0.1:4873/') + .exec('git commit --allow-empty -m "feat: commit"') + .run('npm run prepublish') + .code(0) + .end((err) => t.error(err, 'nixt')) + }) - t.test('odd commit count', function (t) { - t.plan(1) - nixt() - .cwd(cwd) - .env('CI', true) - .env('npm_config_registry', 'http://127.0.0.1:4873/') - .exec('git commit --allow-empty -m "feat: commit"') - .run('npm run prepublish') - .code(1) - .stdout(/Verification failed/) - .end(function (err) { - t.error(err, 'nixt') - }) - }) + t.test('odd commit count', (t) => { + t.plan(1) + nixt() + .cwd(cwd) + .env('CI', true) + .env('npm_config_registry', 'http://127.0.0.1:4873/') + .exec('git commit --allow-empty -m "feat: commit"') + .run('npm run prepublish') + .code(1) + .stdout(/Verification failed/) + .end((err) => t.error(err, 'nixt')) }) })) -} +}) diff --git a/tests/scenarios/ignore.js b/tests/scenarios/ignore.js index 3f5537ac..bae6fa30 100644 --- a/tests/scenarios/ignore.js +++ b/tests/scenarios/ignore.js @@ -1,37 +1,36 @@ -'use strict' +const fs = require('fs') -var fs = require('fs') +const efh = require('error-first-handler') +const nixt = require('nixt') +const test = require('tap').test -var efh = require('error-first-handler') -var nixt = require('nixt') +const createModule = require('../lib/create-module') -module.exports = function (test, createModule) { - createModule(efh()(function (name, cwd) { - test('ignore', function (t) { - ignoreTest(t, 'npm install', 'not doing anything when the module is installed') - ignoreTest(t, 'npm i', 'not doing anything when the module is installed with abbrevd command') - ignoreTest(t, 'npm link', 'not doing anything when the module is linked') - ignoreTest(t, 'npm lin', 'not doing anything when the module is linked with abbrevd command') - ignoreTest(t, 'npm pack', 'not doing anything when the module is packed') - ignoreTest(t, 'npm pa', 'not doing anything when the module is packed with abbrevd command') - }) - - function ignoreTest (t, command, name, last) { - t.test(name, function (t) { - t.plan(2) - - var pkg = fs.readFileSync(cwd + '/package.json') - - nixt() - .cwd(cwd) - .run(command) - .code(0) - .stdout(/> semantic-release pre\n$/m) - .end(function (err) { - t.is(pkg + '', fs.readFileSync(cwd + '/package.json') + '', 'package') - t.error(err, 'nixt') - }) - }) - } +test('ignore', (t) => { + createModule(efh()((name, cwd) => { + ignoreTest(t, cwd, 'npm install', 'not doing anything when the module is installed') + ignoreTest(t, cwd, 'npm i', 'not doing anything when the module is installed with abbrevd command') + ignoreTest(t, cwd, 'npm link', 'not doing anything when the module is linked') + ignoreTest(t, cwd, 'npm lin', 'not doing anything when the module is linked with abbrevd command') + ignoreTest(t, cwd, 'npm pack', 'not doing anything when the module is packed') + ignoreTest(t, cwd, 'npm pa', 'not doing anything when the module is packed with abbrevd command') })) +}) + +function ignoreTest (t, cwd, command, name) { + t.test(name, (t) => { + t.plan(2) + + const pkg = String(fs.readFileSync(cwd + '/package.json')) + + nixt() + .cwd(cwd) + .run(command) + .code(0) + .stdout(/semantic-release.js pre\n$/m) + .end((err) => { + t.is(pkg, String(fs.readFileSync(`${cwd}/package.json`)), 'package') + t.error(err, 'nixt') + }) + }) } diff --git a/tests/scenarios/postpublish.js b/tests/scenarios/postpublish.js index 302b04e9..227f483d 100644 --- a/tests/scenarios/postpublish.js +++ b/tests/scenarios/postpublish.js @@ -1,12 +1,13 @@ -'use strict' +const path = require('path') -var path = require('path') +const efh = require('error-first-handler') +const GitHubApi = require('github') +const nixt = require('nixt') +const test = require('tap').test -var efh = require('error-first-handler') -var GitHubApi = require('github') -var nixt = require('nixt') +const createModule = require('../lib/create-module') -var github = new GitHubApi({ +const github = new GitHubApi({ version: '3.0.0', port: 4343, protocol: 'http', @@ -18,50 +19,44 @@ github.authenticate({ token: '***' }) -module.exports = function (test, createModule) { +test('postpublish', (t) => { createModule({ version: '2.0.0', repository: { type: 'git', url: 'http://github.com/user/repo' } - }, efh()(function (name, cwd) { - test('postpublish', function (t) { - var base = getBase(cwd) + }, efh()((name, cwd) => { + const base = getBase(cwd) - t.test('publish new version to github releases', function (t) { - t.plan(1) + t.test('publish new version to github releases', (t) => { + t.plan(1) - base.clone() - .stdout(/> semantic-release post\n\nGenerating changelog from.*\nParsed/m) - .run('npm run postpublish') - .end(function (err) { - t.error(err, 'nixt') - }) - }) + base.clone() + .stdout(/semantic-release.js post\n\nGenerating changelog from.*\nParsed/m) + .run('npm run postpublish') + .end((err) => t.error(err, 'nixt')) + }) - t.test('publish new version (with detached HEAD) to github releases', function (t) { - t.plan(1) + t.test('publish new version (with detached HEAD) to github releases', (t) => { + t.plan(1) - base.clone() - .stdout(/> semantic-release post\n\nGenerating changelog from.*\nParsed/m) - .exec('git checkout `git rev-parse HEAD`') - .run('npm run postpublish') - .end(function (err) { - t.error(err, 'nixt') - }) - }) + base.clone() + .stdout(/semantic-release.js post\n\nGenerating changelog from.*\nParsed/m) + .exec('git checkout `git rev-parse HEAD`') + .run('npm run postpublish') + .end((err) => t.error(err, 'nixt')) + }) - t.test('correct data published', function (t) { - t.plan(4) + t.test('correct data published', (t) => { + t.plan(4) - github.releases.getRelease({ owner: 'user', repo: 'repo', id: 1}, function (err, raw) { - var res = JSON.parse(raw) - t.error(err, 'github') - t.is(res.tag_name, 'v2.0.0', 'version') - t.is(res.author.login, 'user', 'user') - t.ok(/\n\n\n#### Features\n\n\* \*\*cool:\*\*\n.*the next big thing/.test(res.body), 'body') - }) + github.releases.getRelease({ owner: 'user', repo: 'repo', id: 1}, (err, raw) => { + const res = JSON.parse(raw) + t.error(err, 'github') + t.is(res.tag_name, 'v2.0.0', 'version') + t.is(res.author.login, 'user', 'user') + t.ok(/\n\n\n#### Features\n\n\* \*\*cool:\*\*\n.*the next big thing/.test(res.body), 'body') }) }) })) @@ -75,34 +70,30 @@ module.exports = function (test, createModule) { release: { notes: path.join(__dirname, '../lib/custom-release-notes') } - }, efh()(function (name, cwd) { - test('custom-release-notes', function (t) { - var base = getBase(cwd) + }, efh()((name, cwd) => { + const base = getBase(cwd) - t.test('publish new version (with custom notes) to github releases', function (t) { - t.plan(1) + t.test('publish new version (with custom notes) to github releases', (t) => { + t.plan(1) - base.clone() - .run('npm run postpublish') - .end(function (err) { - t.error(err, 'nixt') - }) - }) + base.clone() + .run('npm run postpublish') + .end((err) => t.error(err, 'nixt')) + }) - t.test('custom notes published', function (t) { - t.plan(4) + t.test('custom notes published', (t) => { + t.plan(4) - github.releases.getRelease({ owner: 'user', repo: 'repo', id: 3}, function (err, raw) { - var res = JSON.parse(raw) - t.error(err, 'github') - t.is(res.tag_name, 'v2.0.0', 'version') - t.is(res.author.login, 'user', 'user') - t.ok(/custom log/.test(res.body), 'body') - }) + github.releases.getRelease({ owner: 'user', repo: 'repo', id: 3}, (err, raw) => { + const res = JSON.parse(raw) + t.error(err, 'github') + t.is(res.tag_name, 'v2.0.0', 'version') + t.is(res.author.login, 'user', 'user') + t.ok(/custom log/.test(res.body), 'body') }) }) })) -} +}) function getBase (cwd) { return nixt() diff --git a/tests/scenarios/prepublish.js b/tests/scenarios/prepublish.js index 22b8e112..32390411 100644 --- a/tests/scenarios/prepublish.js +++ b/tests/scenarios/prepublish.js @@ -1,17 +1,15 @@ -'use strict' +const efh = require('error-first-handler') +const test = require('tap').test -var efh = require('error-first-handler') +const createModule = require('../lib/create-module') +const commitToVersionTest = require('../lib/commit-to-version-test') -var commitToVersionTest = require('../lib/commit-to-version-test') - -module.exports = function (test, createModule) { - createModule(efh()(function (name, cwd) { - test('prepublish', function (t) { - commitToVersionTest(t, 'refactor: change', '0.0.0', 1, 'abort publish w/o changes', cwd) - commitToVersionTest(t, 'fix: change', '1.0.0', 0, 'release 1.0.0 if unpublished', cwd) - commitToVersionTest(t, 'fix: change', '1.0.1', 0, 'bump patch for fix', cwd) - commitToVersionTest(t, 'feat: change', '1.1.0', 0, 'bump minor for feature', cwd) - commitToVersionTest(t, 'fix: BREAKING CHANGE: change', '2.0.0', 0, 'bump major for breaking change', cwd) - }) +test('prepublish', (t) => { + createModule(efh()((name, cwd) => { + commitToVersionTest(t, 'refactor: change', '0.0.0', 1, 'abort publish w/o changes', cwd) + commitToVersionTest(t, 'fix: change', '1.0.0', 0, 'release 1.0.0 if unpublished', cwd) + commitToVersionTest(t, 'fix: change', '1.0.1', 0, 'bump patch for fix', cwd) + commitToVersionTest(t, 'feat: change', '1.1.0', 0, 'bump minor for feature', cwd) + commitToVersionTest(t, 'fix: BREAKING CHANGE: change', '2.0.0', 0, 'bump major for breaking change', cwd) })) -} +}) diff --git a/tests/scenarios/publish.js b/tests/scenarios/publish.js index 4826d22f..61636b86 100644 --- a/tests/scenarios/publish.js +++ b/tests/scenarios/publish.js @@ -1,37 +1,34 @@ -'use strict' +const efh = require('error-first-handler') +const nixt = require('nixt') +const test = require('tap').test -var efh = require('error-first-handler') -var nixt = require('nixt') +const createModule = require('../lib/create-module') -module.exports = function (test, createModule) { - test('publish', function (t) { - publishTest(t, 'npm publish', 'pre and post hooks work as a part of publish') - publishTest(t, 'npm pub', 'pre and post hooks work as a part of publish with abbrevd command') +test('publish', (t) => { + publishTest(t, 'npm publish', 'pre and post hooks work as a part of publish') + publishTest(t, 'npm pub', 'pre and post hooks work as a part of publish with abbrevd command') - function publishTest (t, command, testname, last) { - createModule({ - repository: { - type: 'git', - url: 'http://github.com/user/repo' - } - }, efh()(function (name, cwd) { - t.test(testname, function (t) { - t.plan(1) + function publishTest (t, command, testname, last) { + createModule({ + repository: { + type: 'git', + url: 'http://github.com/user/repo' + } + }, efh()((name, cwd) => { + t.test(testname, (t) => { + t.plan(1) - nixt() - .cwd(cwd) - .env('CI', true) - .env('GH_URL', 'http://127.0.0.1:4343/') - .env('GH_TOKEN', '***') - .exec('git commit --allow-empty -m "feat: super"') - .run(command) - .code(1) - .stdout(/Everything is alright/) - .end(function (err) { - t.error(err, 'nixt') - }) - }) - })) - } - }) -} + nixt() + .cwd(cwd) + .env('CI', true) + .env('GH_URL', 'http://127.0.0.1:4343/') + .env('GH_TOKEN', '***') + .exec('git commit --allow-empty -m "feat: super"') + .run(command) + .code(1) + .stdout(/Everything is alright/) + .end((err) => t.error(err, 'nixt')) + }) + })) + } +}) diff --git a/tests/scenarios/setup.js b/tests/scenarios/setup.js index 707c3bfd..8910ff91 100644 --- a/tests/scenarios/setup.js +++ b/tests/scenarios/setup.js @@ -1,38 +1,37 @@ -'use strict' +const join = require('path').join +const readFile = require('fs').readFileSync -var join = require('path').join -var readFile = require('fs').readFileSync +const efh = require('error-first-handler') +const nixt = require('nixt') +const test = require('tap').test -var efh = require('error-first-handler') -var nixt = require('nixt') +const createModule = require('../lib/create-module') -module.exports = function (test, createModule) { +test('setup', (t) => { createModule({ repository: {}, scripts: { postpublish: 'npm run gh-pages' } - }, efh()(function (name, cwd) { - test('setup', function (t) { - t.test('setup "package.json"', function (t) { - t.plan(5) + }, efh()((name, cwd) => { + t.test('setup "package.json"', (t) => { + t.plan(5) - nixt() - .cwd(cwd) - .exec('git remote add origin git@github.com:user/repo.git') - .run('./node_modules/.bin/semantic-release setup') - .code(0) - .end(function (err) { - t.error(err, 'nixt') + nixt() + .cwd(cwd) + .exec('git remote add origin git@github.com:user/repo.git') + .run('../../../bin/semantic-release.js setup') + .code(0) + .end((err) => { + t.error(err, 'nixt') - var pkg = JSON.parse(readFile(join(cwd, 'package.json'))) + const pkg = JSON.parse(readFile(join(cwd, 'package.json'))) - t.is(pkg.version, '0.0.0-semantically-released', 'version') - t.is(pkg.repository.url, 'https://github.com/user/repo', 'repo') - t.is(pkg.scripts.prepublish, 'semantic-release pre', 'pre') - t.is(pkg.scripts.postpublish, 'npm run gh-pages && semantic-release post', 'post') - }) - }) + t.is(pkg.version, '0.0.0-semantically-released', 'version') + t.is(pkg.repository.url, 'https://github.com/user/repo', 'repo') + t.is(pkg.scripts.prepublish, 'semantic-release pre', 'pre') + t.is(pkg.scripts.postpublish, 'npm run gh-pages && semantic-release post', 'post') + }) }) })) -} +}) diff --git a/tests/scenarios/verify.js b/tests/scenarios/verify.js index ea251de1..e6d8a191 100644 --- a/tests/scenarios/verify.js +++ b/tests/scenarios/verify.js @@ -1,50 +1,45 @@ -'use strict' +const efh = require('error-first-handler') +const nixt = require('nixt') +const test = require('tap').test -var efh = require('error-first-handler') -var nixt = require('nixt') +const createModule = require('../lib/create-module') -module.exports = function (test, createModule) { - test('verify', function (t) { - createModule({ - repository: {}, - scripts: { - prepublish: 'semantic-release pre --no-token' - } - }, efh()(function (name, cwd) { - t.test('verify package and options before publishing', function (t) { - t.plan(1) - nixt() - .cwd(cwd) - .env('CI', true) - .run('npm publish') - .stderr(new RegExp( - 'You must define a GitHub token\.\n' + - 'You must define your GitHub "repository" inside the "package.json"\.\n' + - 'You must define your "scripts" inside the "package.json"\.' - , 'm' - )) - .code(1) - .end(function (err) { - t.error(err, 'nixt') - }) - }) - })) +test('verify', (t) => { + createModule({ + repository: {}, + scripts: { + prepublish: '../../../bin/semantic-release.js pre --no-token' + } + }, efh()((name, cwd) => { + t.test('verify package and options before publishing', (t) => { + t.plan(1) + nixt() + .cwd(cwd) + .env('CI', true) + .run('npm publish') + .stderr(new RegExp( +`You must define a GitHub token\. +You must define your GitHub "repository" inside the "package.json"\. +You must define your "scripts" inside the "package.json"\.` + , 'm' + )) + .code(1) + .end((err) => t.error(err, 'nixt')) + }) + })) - createModule({ - version: '1.0.0-semantically-released' - }, efh()(function (name, cwd) { - t.test('not publishing placeholder versions', function (t) { - t.plan(1) + createModule({ + version: '1.0.0-semantically-released' + }, efh()((name, cwd) => { + t.test('not publishing placeholder versions', (t) => { + t.plan(1) - nixt() - .cwd(cwd) - .env('CI', true) - .run('npm publish --semantic-release-rerun') - .code(1) - .end(function (err) { - t.error(err, 'nixt') - }) - }) - })) - }) -} + nixt() + .cwd(cwd) + .env('CI', true) + .run('npm publish --semantic-release-rerun') + .code(1) + .end((err) => t.error(err, 'nixt')) + }) + })) +}) diff --git a/tests/tap/npm-info.js b/tests/tap/npm-info.js index fb8927e6..841fc538 100644 --- a/tests/tap/npm-info.js +++ b/tests/tap/npm-info.js @@ -1,12 +1,11 @@ -'use strict' +const test = require('tap').test +const nock = require('nock') -var nock = require('nock') +const npmInfo = require('../../dist/lib/npm-info.js') -var npmInfo = require('../../lib/npm-info.js') +const registry = 'http://registry.npmjs.org/' -var registry = 'http://registry.npmjs.org/' - -var defaultModule = { +const defaultModule = { 'dist-tags': { latest: '1.0.0' }, @@ -19,34 +18,32 @@ var defaultModule = { process.env.npm_config_registry = registry -module.exports = function (test) { - test('npm-info', function (t) { - var regMock = nock(registry, { - reqheaders: { - 'authorization': 'Bearer testtoken' - } - }) - .get('/express') - .reply(200, defaultModule) - .get('/@user%2Fmodule') - .reply(200, defaultModule) +test('npm-info', (t) => { + const regMock = nock(registry, { + reqheaders: { + 'authorization': 'Bearer testtoken' + } + }) + .get('/express') + .reply(200, defaultModule) + .get('/@user%2Fmodule') + .reply(200, defaultModule) - t.test('get unscoped module', function (t) { - t.plan(3) - npmInfo('express', function (err, info) { - t.error(err, 'error') - t.is(info.version, '1.0.0', 'version') - t.is(info.gitHead, 'HEAD', 'gitHead') - }) - }) - t.test('get scoped module', function (t) { - t.plan(3) - npmInfo('@user/module', function (err, info) { - t.error(err, 'error') - t.is(info.version, '1.0.0', 'version') - t.is(info.gitHead, 'HEAD', 'gitHead') - regMock.done() - }) + t.test('get unscoped module', (t) => { + t.plan(3) + npmInfo('express', (err, info) => { + t.error(err, 'error') + t.is(info.version, '1.0.0', 'version') + t.is(info.gitHead, 'HEAD', 'gitHead') }) }) -} + t.test('get scoped module', (t) => { + t.plan(3) + npmInfo('@user/module', (err, info) => { + t.error(err, 'error') + t.is(info.version, '1.0.0', 'version') + t.is(info.gitHead, 'HEAD', 'gitHead') + regMock.done() + }) + }) +})