Merge branch 'caribou' into greenkeeper-tap-4.0.0

This commit is contained in:
Stephan Bönnemann 2015-12-31 15:16:38 +01:00
commit bb63f9de41
29 changed files with 474 additions and 461 deletions

7
.gitignore vendored
View File

@ -1,14 +1,9 @@
# common
coverage coverage
node_modules node_modules
test/registry/couch test/registry/couch
test/registry/data test/registry/data
test/tmp
*.log *.log
*.dump *.dump
.DS_Store .DS_Store
.nyc_output .nyc_output
.test
.tmp
# build-artifacts
dist

View File

@ -1,18 +0,0 @@
# common
coverage
node_modules
test/registry/couch
test/registry/data
*.log
*.dump
.DS_Store
.nyc_output
.test
.tmp
# source/config
src
*.yml
.gitignore
.editorconfig
.npmrc

View File

@ -6,10 +6,9 @@ cache:
notifications: notifications:
email: false email: false
node_js: node_js:
- v5 - 5
- v4 - 4
- iojs-v2 - iojs
- iojs-v1
- '0.12' - '0.12'
- '0.10' - '0.10'
before_install: before_install:
@ -19,3 +18,5 @@ before_script:
after_success: after_success:
- npm run coverage:upload - npm run coverage:upload
- npm run semantic-release - npm run semantic-release
services:
- couchdb

View File

@ -257,9 +257,7 @@ It is indeed a great idea because it _forces_ you to follow best practices. If y
### Why should I trust `semantic-release` with my releases? ### Why should I trust `semantic-release` with my releases?
`semantic-release` has a full unit- and integration-test-suite that tests _actual_ `npm` publishes against the [npm-registry-couchapp](https://github.com/npm/npm-registry-couchapp/) on node.js `^0.10`, `^0.12` and io.js `^1`, `^2`. A new version wont get published if it doesnt pass on all these engines. `semantic-release` has a full unit- and integration-test-suite that tests _actual_ `npm` publishes against the [npm-registry-couchapp](https://github.com/npm/npm-registry-couchapp/) on all major node.js versions from `^0.10` on. A new version wont get published if it doesnt pass on all these engines.
Note: Currently integration-tests dont run on Travis CI. If you know stuff about npm/Travis/Couch: Please help!
## Badge ## Badge

View File

@ -1,13 +1,163 @@
#!/usr/bin/env node #!/usr/bin/env node
/* istanbul ignore next */ var fs = require('fs')
try { var path = require('path')
require('../dist') var url = require('url')
} catch (err) {
if (err.code === 'MODULE_NOT_FOUND') { var _ = require('lodash')
require('babel/register') var log = require('npmlog')
require('../src') var nopt = require('nopt')
} else { var npmconf = require('npmconf')
console.log(err) var normalizeData = require('normalize-package-data')
}
log.heading = 'semantic-release'
var env = process.env
var pkg = JSON.parse(fs.readFileSync('./package.json'))
normalizeData(pkg)
var knownOptions = {
branch: String,
debug: Boolean,
'github-token': String,
'github-url': String,
'analyze-commits': [path, String],
'generate-notes': [path, String],
'verify-conditions': [path, String],
'verify-release': [path, String]
} }
var options = _.defaults(
_.mapKeys(nopt(knownOptions), function (value, key) {
return _.camelCase(key)
}),
pkg.release,
{
branch: 'master',
fallbackTags: {
next: 'latest'
},
debug: !env.CI,
githubToken: env.GH_TOKEN || env.GITHUB_TOKEN,
githubUrl: env.GH_URL
}
)
var plugins = require('../src/lib/plugins')(options)
npmconf.load({}, function (err, conf) {
if (err) {
log.error('init', 'Failed to load npm config.', err)
process.exit(1)
}
var npm = {
auth: {
token: env.NPM_TOKEN
},
loglevel: conf.get('loglevel'),
registry: require('../src/lib/get-registry')(pkg, conf),
tag: (pkg.publishConfig || {}).tag || conf.get('tag') || 'latest'
}
// normalize trailing slash
npm.registry = url.format(url.parse(npm.registry))
log.level = npm.loglevel
var config = {
env: env,
pkg: pkg,
options: options,
plugins: plugins,
npm: npm
}
var hide = {}
if (options.githubToken) hide.githubToken = '***'
log.verbose('init', 'options:', _.assign({}, options, hide))
log.verbose('init', 'Verifying config.')
var errors = require('../src/lib/verify')(config)
errors.forEach(function (err) {
log.error('init', err.message + ' ' + err.code)
})
if (errors.length) process.exit(1)
if (options.argv.remain[0] === 'pre') {
log.verbose('pre', 'Running pre-script.')
log.verbose('pre', 'Veriying conditions.')
plugins.verifyConditions(config, function (err) {
if (err) {
log[options.debug ? 'warn' : 'error']('pre', err.message)
if (!options.debug) process.exit(1)
}
var nerfDart = require('nerf-dart')(npm.registry)
var wroteNpmRc = false
if (env.NPM_OLD_TOKEN && env.NPM_EMAIL) {
// Using the old auth token format is not considered part of the public API
// This might go away anytime (i.e. once we have a better testing strategy)
conf.set('_auth', '${NPM_OLD_TOKEN}', 'project')
conf.set('email', '${NPM_EMAIL}', 'project')
wroteNpmRc = true
} else if (env.NPM_TOKEN) {
conf.set(nerfDart + ':_authToken', '${NPM_TOKEN}', 'project')
wroteNpmRc = true
}
conf.save('project', function (err) {
if (err) return log.error('pre', 'Failed to save npm config.', err)
if (wroteNpmRc) log.verbose('pre', 'Wrote authToken to .npmrc.')
require('../src/pre')(config, function (err, release) {
if (err) {
log.error('pre', 'Failed to determine new version.')
var args = ['pre', (err.code ? err.code + ' ' : '') + err.message]
if (err.stack) args.push(err.stack)
log.error.apply(log, args)
process.exit(1)
}
var message = 'Determined version ' + release.version + ' as "' + npm.tag + '".'
log.verbose('pre', message)
if (options.debug) {
log.error('pre', message + ' Not publishing in debug mode.', release)
process.exit(1)
}
try {
var shrinkwrap = JSON.parse(fs.readFileSync('./npm-shrinkwrap.json'))
shrinkwrap.version = release.version
fs.writeFileSync('./npm-shrinkwrap.json', JSON.stringify(shrinkwrap, null, 2))
log.verbose('pre', 'Wrote version ' + release.version + 'to npm-shrinkwrap.json.')
} catch (e) {
log.silly('pre', 'Couldn\'t find npm-shrinkwrap.json.')
}
fs.writeFileSync('./package.json', JSON.stringify(_.assign(pkg, {
version: release.version
}), null, 2))
log.verbose('pre', 'Wrote version ' + release.version + ' to package.json.')
})
})
})
} else if (options.argv.remain[0] === 'post') {
log.verbose('post', 'Running post-script.')
require('../src/post')(config, function (err, published, release) {
if (err) {
log.error('post', 'Failed to publish release notes.', err)
process.exit(1)
}
log.verbose('post', (published ? 'Published' : 'Generated') + ' release notes.', release)
})
} else {
log.error('post', 'Command "' + options.argv.remain[0] + '" not recognized. User either "pre" or "post"')
}
})

View File

@ -1,21 +1,14 @@
{ {
"name": "semantic-release", "name": "semantic-release",
"description": "automated semver compliant package publishing", "description": "automated semver compliant package publishing",
"version": "0.0.0-placeholder",
"author": "Stephan Bönnemann <stephan@boennemann.me> (http://boennemann.me)", "author": "Stephan Bönnemann <stephan@boennemann.me> (http://boennemann.me)",
"bin": { "bin": {
"semantic-release": "./bin/semantic-release.js" "semantic-release": "bin/semantic-release.js"
}, },
"bugs": { "bugs": {
"url": "https://github.com/semantic-release/semantic-release/issues" "url": "https://github.com/semantic-release/semantic-release/issues"
}, },
"config": {
"nyc": {
"exclude": [
".test",
"node_modules"
]
}
},
"czConfig": { "czConfig": {
"path": "node_modules/cz-conventional-changelog/" "path": "node_modules/cz-conventional-changelog/"
}, },
@ -40,7 +33,6 @@
"semver": "^5.0.3" "semver": "^5.0.3"
}, },
"devDependencies": { "devDependencies": {
"babel": "^5.8.21",
"coveralls": "^2.11.4", "coveralls": "^2.11.4",
"cz-conventional-changelog": "^1.1.4", "cz-conventional-changelog": "^1.1.4",
"mkdirp": "^0.5.1", "mkdirp": "^0.5.1",
@ -49,7 +41,7 @@
"npm-registry-couchapp": "^2.6.11", "npm-registry-couchapp": "^2.6.11",
"nyc": "^5.0.0", "nyc": "^5.0.0",
"proxyquire": "^1.7.3", "proxyquire": "^1.7.3",
"rimraf": "^2.4.3", "rimraf": "^2.5.0",
"standard": "^5.3.0", "standard": "^5.3.0",
"tap": "^4.0.0" "tap": "^4.0.0"
}, },
@ -70,7 +62,11 @@
"version" "version"
], ],
"license": "MIT", "license": "MIT",
"main": "dist/index.js", "main": "bin/semantic-release.js",
"files": [
"bin",
"src"
],
"publishConfig": { "publishConfig": {
"tag": "next" "tag": "next"
}, },
@ -82,17 +78,12 @@
"url": "git+https://github.com/semantic-release/semantic-release.git" "url": "git+https://github.com/semantic-release/semantic-release.git"
}, },
"scripts": { "scripts": {
"build": "rimraf dist && mkdirp dist && babel src --out-dir dist",
"coverage": "nyc report", "coverage": "nyc report",
"coverage:upload": "npm run coverage -- --reporter=lcovonly && coveralls < coverage/lcov.info", "coverage:upload": "npm run coverage -s -- --reporter=text-lcov | coveralls",
"prepublish": "npm run build", "pretest": "standard",
"pretest:integration": "npm run build && npm run test:build", "semantic-release": "./bin/semantic-release.js pre && npm publish && ./bin/semantic-release.js post",
"pretest:unit": "npm run build && npm run test:build", "test": "npm run test:unit && npm run test:integration",
"semantic-release": "./bin/semantic-release.js pre && npm dedupe && npm publish && ./bin/semantic-release.js post", "test:integration": "tap --no-cov test/scenarios/*.js",
"test": "npm run test:style && npm run test:unit", "test:unit": "nyc tap --no-cov test/specs/*.js"
"test:build": "rimraf .test && mkdirp .test && babel test --out-dir .test",
"test:integration": "tap --no-cov .test/scenarios/*.js",
"test:style": "standard",
"test:unit": "nyc tap --no-cov .test/specs/*.js"
} }
} }

View File

@ -1,150 +0,0 @@
const { readFileSync, writeFileSync } = require('fs')
const path = require('path')
const url = require('url')
const _ = require('lodash')
const log = require('npmlog')
const nopt = require('nopt')
const npmconf = require('npmconf')
const normalizeData = require('normalize-package-data')
log.heading = 'semantic-release'
const env = process.env
const pkg = normalizeData(readFileSync('./package.json'))
const knownOptions = {
branch: String,
debug: Boolean,
'github-token': String,
'github-url': String,
'analyze-commits': [path, String],
'generate-notes': [path, String],
'verify-conditions': [path, String],
'verify-release': [path, String]
}
const options = _.defaults(
_.mapKeys(nopt(knownOptions), (value, key) => _.camelCase(key)),
pkg.release,
{
branch: 'master',
fallbackTags: {
next: 'latest'
},
debug: !env.CI,
githubToken: env.GH_TOKEN || env.GITHUB_TOKEN,
githubUrl: env.GH_URL
}
)
const plugins = require('./lib/plugins')(options)
npmconf.load({}, (err, conf) => {
if (err) {
log.error('init', 'Failed to load npm config.', err)
process.exit(1)
}
let npm = {
auth: {
token: env.NPM_TOKEN
},
loglevel: conf.get('loglevel'),
registry: require('./lib/get-registry')(pkg, conf),
tag: (pkg.publishConfig || {}).tag || conf.get('tag') || 'latest'
}
// normalize trailing slash
npm.registry = url.format(url.parse(npm.registry))
log.level = npm.loglevel
const config = {env, pkg, options, plugins, npm}
let hide = {}
if (options.githubToken) hide.githubToken = '***'
log.verbose('init', 'options:', _.assign({}, options, hide))
log.verbose('init', 'Verifying config.')
const errors = require('./lib/verify')(config)
errors.forEach((err) => log.error('init', `${err.message} ${err.code}`))
if (errors.length) process.exit(1)
if (options.argv.remain[0] === 'pre') {
log.verbose('pre', 'Running pre-script.')
log.verbose('pre', 'Veriying conditions.')
plugins.verifyConditions(config, (err) => {
if (err) {
log[options.debug ? 'warn' : 'error']('pre', err.message)
if (!options.debug) process.exit(1)
}
const nerfDart = require('nerf-dart')(npm.registry)
let wroteNpmRc = false
if (env.NPM_TOKEN) {
conf.set(`${nerfDart}:_authToken`, '${NPM_TOKEN}', 'project')
wroteNpmRc = true
} else if (env.NPM_OLD_TOKEN && env.NPM_EMAIL) {
// Using the old auth token format is not considered part of the public API
// This might go away anytime (i.e. once we have a better testing strategy)
conf.set('_auth', '${NPM_OLD_TOKEN}', 'project')
conf.set('email', '${NPM_EMAIL}', 'project')
wroteNpmRc = true
}
conf.save('project', (err) => {
if (err) return log.error('pre', 'Failed to save npm config.', err)
if (wroteNpmRc) log.verbose('pre', 'Wrote authToken to .npmrc.')
require('./pre')(config, (err, release) => {
if (err) {
log.error('pre', 'Failed to determine new version.')
const args = ['pre', (err.code ? `${err.code} ` : '') + err.message]
if (err.stack) args.push(err.stack)
log.error(...args)
process.exit(1)
}
const message = `Determined version ${release.version} as "${npm.tag}".`
log.verbose('pre', message)
if (options.debug) {
log.error('pre', `${message} Not publishing in debug mode.`, release)
process.exit(1)
}
try {
let shrinkwrap = JSON.parse(readFileSync('./npm-shrinkwrap.json'))
shrinkwrap.version = release.version
writeFileSync('./npm-shrinkwrap.json', JSON.stringify(shrinkwrap, null, 2))
log.verbose('pre', `Wrote version ${release.version} to npm-shrinkwrap.json.`)
} catch (e) {
log.silly('pre', `Couldn't find npm-shrinkwrap.json.`)
}
writeFileSync('./package.json', JSON.stringify(_.assign(pkg, {
version: release.version
}), null, 2))
log.verbose('pre', `Wrote version ${release.version} to package.json.`)
})
})
})
} else if (options.argv.remain[0] === 'post') {
log.verbose('post', 'Running post-script.')
require('./post')(config, (err, published, release) => {
if (err) {
log.error('post', 'Failed to publish release notes.', err)
process.exit(1)
}
log.verbose('post', `${published ? 'Published' : 'Generated'} release notes.`, release)
})
} else {
log.error('post', `Command "${options.argv.remain[0]}" not recognized. User either "pre" or "post"`)
}
})

View File

@ -1,39 +1,43 @@
const { exec } = require('child_process') var exec = require('child_process').exec
const log = require('npmlog') var log = require('npmlog')
const SemanticReleaseError = require('@semantic-release/error') var SemanticReleaseError = require('@semantic-release/error')
module.exports = function ({lastRelease, options}, cb) { module.exports = function (config, cb) {
const branch = options.branch var lastRelease = config.lastRelease
const from = lastRelease.gitHead var options = config.options
const range = (from ? from + '..' : '') + 'HEAD' var branch = options.branch
var from = lastRelease.gitHead
var range = (from ? from + '..' : '') + 'HEAD'
if (!from) return extract() if (!from) return extract()
exec(`git branch --contains ${from}`, (err, stdout) => { exec('git branch --contains ' + from, function (err, stdout) {
let inHistory = false var inHistory = false
let branches var branches
if (!err && stdout) { if (!err && stdout) {
branches = stdout.split('\n') branches = stdout.split('\n')
.map((result) => { .map(function (result) {
if (branch === result.replace('*', '').trim()) { if (branch === result.replace('*', '').trim()) {
inHistory = true inHistory = true
return null return null
} }
return result.trim() return result.trim()
}) })
.filter(branch => !!branch) .filter(function (branch) {
return !!branch
})
} }
if (!inHistory) { if (!inHistory) {
log.error('commits', log.error('commits',
`The commit the last release of this package was derived from is not in the direct history of the "${branch}" branch. 'The commit the last release of this package was derived from is not in the direct history of the "' + branch + '" branch.\n' +
This means semantic-release can not extract the commits between now and then. 'This means semantic-release can not extract the commits between now and then.\n' +
This is usually caused by force pushing, releasing from an unrelated branch, or using an already existing package name. 'This is usually caused by force pushing, releasing from an unrelated branch, or using an already existing package name.\n' +
You can recover from this error by publishing manually or restoring the commit "${from}".` + (branches && branches.length 'You can recover from this error by publishing manually or restoring the commit "' + from + '".' + (branches && branches.length
? `\nHere is a list of branches that still contain the commit in question: \n * ${branches.join('\n * ')}` ? '\nHere is a list of branches that still contain the commit in question: \n * ' + branches.join('\n * ')
: '' : ''
)) ))
return cb(new SemanticReleaseError('Commit not in history', 'ENOTINHISTORY')) return cb(new SemanticReleaseError('Commit not in history', 'ENOTINHISTORY'))
@ -44,16 +48,18 @@ You can recover from this error by publishing manually or restoring the commit "
function extract () { function extract () {
exec( exec(
`git log -E --format=%H==SPLIT==%B==END== ${range}`, 'git log -E --format=%H==SPLIT==%B==END== ' + range,
(err, stdout) => { function (err, stdout) {
if (err) return cb(err) if (err) return cb(err)
cb(null, String(stdout).split('==END==\n') cb(null, String(stdout).split('==END==\n')
.filter((raw) => !!raw.trim()) .filter(function (raw) {
return !!raw.trim()
})
.map((raw) => { .map(function (raw) {
const data = raw.split('==SPLIT==') var data = raw.split('==SPLIT==')
return { return {
hash: data[0], hash: data[0],
message: data[1] message: data[1]

View File

@ -3,8 +3,8 @@ module.exports = function (pkg, conf) {
if (pkg.name[0] !== '@') return conf.get('registry') || 'https://registry.npmjs.org/' if (pkg.name[0] !== '@') return conf.get('registry') || 'https://registry.npmjs.org/'
const scope = pkg.name.split('/')[0] var scope = pkg.name.split('/')[0]
const scopedRegistry = conf.get(`${scope}/registry`) var scopedRegistry = conf.get(scope + '/registry')
if (scopedRegistry) return scopedRegistry if (scopedRegistry) return scopedRegistry

View File

@ -1,14 +1,14 @@
const relative = require('require-relative') var relative = require('require-relative')
const series = require('run-series') var series = require('run-series')
let exports = module.exports = function (options) { var exports = module.exports = function (options) {
var plugins = { var plugins = {
analyzeCommits: exports.normalize(options.analyzeCommits, '@semantic-release/commit-analyzer'), analyzeCommits: exports.normalize(options.analyzeCommits, '@semantic-release/commit-analyzer'),
generateNotes: exports.normalize(options.generateNotes, '@semantic-release/release-notes-generator'), generateNotes: exports.normalize(options.generateNotes, '@semantic-release/release-notes-generator'),
getLastRelease: exports.normalize(options.getLastRelease, '@semantic-release/last-release-npm') getLastRelease: exports.normalize(options.getLastRelease, '@semantic-release/last-release-npm')
} }
;['verifyConditions', 'verifyRelease'].forEach((plugin) => { ;['verifyConditions', 'verifyRelease'].forEach(function (plugin) {
if (!Array.isArray(options[plugin])) { if (!Array.isArray(options[plugin])) {
plugins[plugin] = exports.normalize( plugins[plugin] = exports.normalize(
options[plugin], options[plugin],
@ -20,7 +20,7 @@ let exports = module.exports = function (options) {
} }
plugins[plugin] = function (pluginOptions, cb) { plugins[plugin] = function (pluginOptions, cb) {
var tasks = options[plugin].map((step) => { var tasks = options[plugin].map(function (step) {
return exports.normalize(step, './plugin-noop').bind(null, pluginOptions) return exports.normalize(step, './plugin-noop').bind(null, pluginOptions)
}) })

View File

@ -1,9 +1,10 @@
const SemanticReleaseError = require('@semantic-release/error') var SemanticReleaseError = require('@semantic-release/error')
module.exports = function (config, cb) { module.exports = function (config, cb) {
const { plugins, lastRelease } = config var plugins = config.plugins
var lastRelease = config.lastRelease
plugins.analyzeCommits(config, (err, type) => { plugins.analyzeCommits(config, function (err, type) {
if (err) return cb(err) if (err) return cb(err)
if (!type) { if (!type) {

View File

@ -1,9 +1,12 @@
const parseSlug = require('parse-github-repo-url') var parseSlug = require('parse-github-repo-url')
const SemanticReleaseError = require('@semantic-release/error') var SemanticReleaseError = require('@semantic-release/error')
module.exports = function ({pkg, options, env}) { module.exports = function (config) {
let errors = [] var pkg = config.pkg
var options = config.options
var env = config.env
var errors = []
if (!pkg.name) { if (!pkg.name) {
errors.push(new SemanticReleaseError( errors.push(new SemanticReleaseError(

View File

@ -1,32 +1,34 @@
const url = require('url') var url = require('url')
const gitHead = require('git-head') var gitHead = require('git-head')
const GitHubApi = require('github') var GitHubApi = require('github')
const parseSlug = require('parse-github-repo-url') var parseSlug = require('parse-github-repo-url')
module.exports = function (config, cb) { module.exports = function (config, cb) {
const { pkg, options, plugins } = config var pkg = config.pkg
const ghConfig = options.githubUrl ? url.parse(options.githubUrl) : {} var options = config.options
var plugins = config.plugins
var ghConfig = options.githubUrl ? url.parse(options.githubUrl) : {}
const github = new GitHubApi({ var github = new GitHubApi({
version: '3.0.0', version: '3.0.0',
port: ghConfig.port, port: ghConfig.port,
protocol: (ghConfig.protocol || '').split(':')[0] || null, protocol: (ghConfig.protocol || '').split(':')[0] || null,
host: ghConfig.hostname host: ghConfig.hostname
}) })
plugins.generateNotes(config, (err, log) => { plugins.generateNotes(config, function (err, log) {
if (err) return cb(err) if (err) return cb(err)
gitHead((err, hash) => { gitHead(function (err, hash) {
if (err) return cb(err) if (err) return cb(err)
const ghRepo = parseSlug(pkg.repository.url) var ghRepo = parseSlug(pkg.repository.url)
const release = { var release = {
owner: ghRepo[0], owner: ghRepo[0],
repo: ghRepo[1], repo: ghRepo[1],
name: `v${pkg.version}`, name: 'v' + pkg.version,
tag_name: `v${pkg.version}`, tag_name: 'v' + pkg.version,
target_commitish: hash, target_commitish: hash,
draft: !!options.debug, draft: !!options.debug,
body: log body: log
@ -41,7 +43,7 @@ module.exports = function (config, cb) {
token: options.githubToken token: options.githubToken
}) })
github.releases.createRelease(release, (err) => { github.releases.createRelease(release, function (err) {
if (err) return cb(err) if (err) return cb(err)
cb(null, true, release) cb(null, true, release)

View File

@ -1,32 +1,32 @@
const _ = require('lodash') var _ = require('lodash')
const auto = require('run-auto') var auto = require('run-auto')
const semver = require('semver') var semver = require('semver')
const getCommits = require('./lib/commits') var getCommits = require('./lib/commits')
const getType = require('./lib/type') var getType = require('./lib/type')
module.exports = function (config, cb) { module.exports = function (config, cb) {
const { plugins } = config var plugins = config.plugins
auto({ auto({
lastRelease: plugins.getLastRelease.bind(null, config), lastRelease: plugins.getLastRelease.bind(null, config),
commits: ['lastRelease', (cb, results) => { commits: ['lastRelease', function (cb, results) {
getCommits(_.assign({ getCommits(_.assign({
lastRelease: results.lastRelease lastRelease: results.lastRelease
}, config), }, config),
cb) cb)
}], }],
type: ['commits', 'lastRelease', (cb, results) => { type: ['commits', 'lastRelease', function (cb, results) {
getType(_.assign({ getType(_.assign({
commits: results.commits, commits: results.commits,
lastRelease: results.lastRelease lastRelease: results.lastRelease
}, config), }, config),
cb) cb)
}] }]
}, (err, results) => { }, function (err, results) {
if (err) return cb(err) if (err) return cb(err)
const nextRelease = { var nextRelease = {
type: results.type, type: results.type,
version: results.type === 'initial' version: results.type === 'initial'
? '1.0.0' ? '1.0.0'
@ -36,8 +36,8 @@ module.exports = function (config, cb) {
plugins.verifyRelease(_.assign({ plugins.verifyRelease(_.assign({
commits: results.commits, commits: results.commits,
lastRelease: results.lastRelease, lastRelease: results.lastRelease,
nextRelease nextRelease: nextRelease
}, config), (err) => { }, config), function (err) {
if (err) return cb(err) if (err) return cb(err)
cb(null, nextRelease) cb(null, nextRelease)
}) })

View File

@ -1,4 +1,4 @@
const nixt = require('nixt') var nixt = require('nixt')
module.exports = function (cwd, uri) { module.exports = function (cwd, uri) {
return nixt() return nixt()
@ -7,8 +7,6 @@ module.exports = function (cwd, uri) {
.env('NPM_EMAIL', 'integration@test.com') .env('NPM_EMAIL', 'integration@test.com')
.env('GH_TOKEN', 'ghtoken') .env('GH_TOKEN', 'ghtoken')
.env('CI', 'true') .env('CI', 'true')
.env('TRAVIS', 'true')
.env('TRAVIS_BRANCH', 'master')
.env('npm_config_registry', uri) .env('npm_config_registry', uri)
.clone() .clone()
} }

View File

@ -1,40 +1,31 @@
const { exec } = require('child_process') var exec = require('child_process').exec
const { join } = require('path') var join = require('path').join
const { writeFileSync } = require('fs') var writeFileSync = require('fs').writeFileSync
const mkdirp = require('mkdirp') var mkdirp = require('mkdirp')
module.exports = function (name, cb) { module.exports = function (name, registry, cb) {
const cwd = join(__dirname, '../tmp', name) var cwd = join(__dirname, '../tmp', name)
mkdirp.sync(cwd) mkdirp.sync(cwd)
writeFileSync(join(cwd, '.npmrc'), `
//localhost:1337/registry/_design/app/_rewrite/:username=integration
//localhost:1337/registry/_design/app/_rewrite/:email=integration@test.com`, null, 2)
writeFileSync(join(cwd, 'package.json'), JSON.stringify({ writeFileSync(join(cwd, 'package.json'), JSON.stringify({
name, name: name,
repository: { repository: {
url: 'git+https://github.com/semantic-release/test' url: 'git+https://github.com/semantic-release/test'
}, },
_npmUser: { release: {
name: 'integration', verifyConditions: '../../../src/lib/plugin-noop'
email: 'integration@test.com' }
},
maintainers: [{
name: 'integration',
email: 'integration@test.com'
}]
}, null, 2)) }, null, 2))
exec(` exec(
git init && 'git init && ' +
git config user.email "integration@test" && 'git config user.email "integration@test" && ' +
git config user.name "Integration Test" && 'git config user.name "Integration Test" && ' +
git add . && 'git add . && ' +
git commit -m "chore: root"` 'git commit -m "chore: root"'
, {cwd}, (err, stdout, stderr) => { , {cwd: cwd}, function (err, stdout, stderr) {
if (err) { if (err) {
console.log(stdout, stderr) console.log(stdout, stderr)
return cb(err) return cb(err)

View File

@ -4,10 +4,10 @@ const rawCommits = [
] ]
module.exports = { module.exports = {
exec: (command, cb) => { exec: function (command, cb) {
if (/contains/.test(command)) { if (/contains/.test(command)) {
if (/notinhistory/.test(command)) return cb(new Error()) if (/notinhistory/.test(command)) return cb(new Error())
return cb(null, `whatever\nmaster\n`) return cb(null, 'whatever\nmaster\n')
} }
cb( cb(

View File

@ -1,6 +1,12 @@
module.exports = () => ({ module.exports = function () {
authenticate: () => true, return {
releases: { authenticate: function () {
createRelease: (release, cb) => cb(null) return true
},
releases: {
createRelease: function (release, cb) {
cb(null)
}
}
} }
}) }

View File

@ -1,12 +1,11 @@
const { exec } = require('child_process') var exec = require('child_process').exec
const { join } = require('path')
const opts = { var opts = {
cwd: join(__dirname, '../../test/registry') cwd: __dirname
} }
module.exports = { module.exports = {
start: exec.bind(null, './start.sh', opts), start: exec.bind(null, './start.sh', opts),
stop: exec.bind(null, './stop.sh', opts), stop: exec.bind(null, './stop.sh', opts),
uri: 'http://localhost:15986/registry/_design/app/_rewrite/' uri: 'http://localhost:' + (process.env.TRAVIS === 'true' ? 5984 : 15986) + '/registry/_design/app/_rewrite/'
} }

View File

@ -7,25 +7,29 @@ cd $(dirname $0)
mkdir -p couch mkdir -p couch
# start couchdb as a background process, load local config, specify writable logfiles
if [[ $TRAVIS = true ]] if [[ $TRAVIS = true ]]
then then
echo 'starting couch with sudo' COUCH=http://admin:password@127.0.0.1:5984
sudo couchdb -b -a local.ini -p couch/pid -o couch/stdout.log -e couch/stderr.log
curl -X PUT http://127.0.0.1:5984/_config/admins/admin -d '"password"'
curl -X PUT $COUCH/_config/couchdb/delayed_commits -d '"false"'
curl -X PUT $COUCH/_config/couch_httpd_auth/users_db_public -d '"true"'
curl -X PUT $COUCH/_config/couch_httpd_auth/public_fields -d '"appdotnet, avatar, avatarMedium, avatarLarge, date, email, fields, freenode, fullname, github, homepage, name, roles, twitter, type, _id, _rev"'
curl -X PUT $COUCH/_config/httpd/secure_rewrites -d '"false"'
else else
COUCH=http://admin:password@127.0.0.1:15986
couchdb -b -a local.ini -p couch/pid -o couch/stdout.log -e couch/stderr.log couchdb -b -a local.ini -p couch/pid -o couch/stdout.log -e couch/stderr.log
# wait for couch to start
sleep 1
fi fi
# wait for couch to start
sleep 5
COUCH=http://admin:password@127.0.0.1:15986
# create "registry" database # create "registry" database
curl -X PUT $COUCH/registry curl -X PUT $COUCH/registry
# create sample npm user # create sample npm user
curl -X PUT $COUCH/_users/org.couchdb.user:integration -H Content-Type:application/json --data-binary '{"_id": "org.couchdb.user:integration","name": "integration","roles": [],"type": "user","password": "suchsecure","email": "integration@test.com"}' curl -X PUT $COUCH/_users/org.couchdb.user:integration -H Content-Type:application/json --data-binary '{"_id": "org.couchdb.user:integration", "name": "integration", "roles": [], "type": "user", "password": "suchsecure", "email": "integration@test.com"}'
# npm-registry-couchpp needs this variable set to run # npm-registry-couchpp needs this variable set to run
export DEPLOY_VERSION=nope export DEPLOY_VERSION=nope

View File

@ -8,5 +8,6 @@ cd $(dirname $0)
cat couch/{couch,stdout,stderr}.log cat couch/{couch,stdout,stderr}.log
cat couch/pid | xargs kill
rm -rf couch rm -rf couch
rm -rf data rm -rf data

View File

@ -1,30 +1,27 @@
const { join } = require('path') var join = require('path').join
const { test, tearDown } = require('tap') var tap = require('tap')
const rimraf = require('rimraf') var rimraf = require('rimraf')
const registry = require('../registry') var registry = require('../registry')
const testModule = require('../lib/test-module') var testModule = require('../lib/test-module')
const baseScenario = require('../lib/base-scenario') var baseScenario = require('../lib/base-scenario')
test('change version', (t) => { var tearDown = tap.tearDown
var test = tap.test
test('change version', {bail: process.env.TRAVIS === 'true'}, function (t) {
t.plan(7) t.plan(7)
registry.start((err) => { registry.start(function (err, stdout, stderr) {
t.error(err, 'registry started') t.error(err, 'registry started')
if (err) { if (err) return t.end()
t.end()
t.bailout('registry not started')
}
testModule('change-version', (err, cwd) => { testModule('change-version', registry.uri, function (err, cwd) {
t.error(err, 'test-module created') t.error(err, 'test-module created')
if (err) { if (err) return t.end()
t.end()
t.bailout('test-module not created')
}
t.test('no version', (tt) => { t.test('no version', function (tt) {
tt.plan(1) tt.plan(1)
baseScenario(cwd, registry.uri) baseScenario(cwd, registry.uri)
@ -35,7 +32,7 @@ test('change version', (t) => {
.end(tt.error) .end(tt.error)
}) })
t.test('initial version', (tt) => { t.test('initial version', function (tt) {
tt.plan(1) tt.plan(1)
baseScenario(cwd, registry.uri) baseScenario(cwd, registry.uri)
@ -47,7 +44,7 @@ test('change version', (t) => {
.end(tt.error) .end(tt.error)
}) })
t.test('patch version', (tt) => { t.test('patch version', function (tt) {
tt.plan(1) tt.plan(1)
baseScenario(cwd, registry.uri) baseScenario(cwd, registry.uri)
@ -59,7 +56,7 @@ test('change version', (t) => {
.end(tt.error) .end(tt.error)
}) })
t.test('feature version', (tt) => { t.test('feature version', function (tt) {
tt.plan(1) tt.plan(1)
baseScenario(cwd, registry.uri) baseScenario(cwd, registry.uri)
@ -71,7 +68,7 @@ test('change version', (t) => {
.end(tt.error) .end(tt.error)
}) })
t.test('breaking version', (tt) => { t.test('breaking version', function (tt) {
tt.plan(1) tt.plan(1)
baseScenario(cwd, registry.uri) baseScenario(cwd, registry.uri)
@ -86,10 +83,11 @@ test('change version', (t) => {
}) })
}) })
tearDown(() => { tearDown(function () {
if (process.env.TRAVIS === 'true') return
function cb (err, stdout, stderr) { function cb (err, stdout, stderr) {
if (err) console.log(err) if (err) console.log(err)
if (stdout) console.log(stdout)
if (stderr) console.log(stderr) if (stderr) console.log(stderr)
} }

View File

@ -1,13 +1,16 @@
const test = require('tap').test var test = require('tap').test
const proxyquire = require('proxyquire') var proxyquire = require('proxyquire')
const commits = proxyquire('../../dist/lib/commits', { var commits = proxyquire('../../src/lib/commits', {
'npmlog': {
error: function () {}
},
'child_process': require('../mocks/child-process') 'child_process': require('../mocks/child-process')
}) })
test('commits since last release', (t) => { test('commits since last release', function (t) {
t.test('get all commits', (tt) => { t.test('get all commits', function (tt) {
commits({lastRelease: {}, options: {branch: 'master'}}, (err, commits) => { commits({lastRelease: {}, options: {branch: 'master'}}, function (err, commits) {
tt.error(err) tt.error(err)
tt.is(commits.length, 2, 'all commits') tt.is(commits.length, 2, 'all commits')
tt.is(commits[0].hash, 'hash-one', 'parsed hash') tt.is(commits[0].hash, 'hash-one', 'parsed hash')
@ -17,8 +20,8 @@ test('commits since last release', (t) => {
}) })
}) })
t.test('get commits since hash', (tt) => { t.test('get commits since hash', function (tt) {
commits({lastRelease: {gitHead: 'hash'}, options: {branch: 'master'}}, (err, commits) => { commits({lastRelease: {gitHead: 'hash'}, options: {branch: 'master'}}, function (err, commits) {
tt.error(err) tt.error(err)
tt.is(commits.length, 1, 'specified commits') tt.is(commits.length, 1, 'specified commits')
tt.is(commits[0].hash, 'hash-one', 'parsed hash') tt.is(commits[0].hash, 'hash-one', 'parsed hash')
@ -28,8 +31,8 @@ test('commits since last release', (t) => {
}) })
}) })
t.test('get commits since hash', (tt) => { t.test('get commits since hash', function (tt) {
commits({lastRelease: {gitHead: 'notinhistory'}, options: {branch: 'notmaster'}}, (err, commits) => { commits({lastRelease: {gitHead: 'notinhistory'}, options: {branch: 'notmaster'}}, function (err, commits) {
tt.ok(err) tt.ok(err)
tt.is(err.code, 'ENOTINHISTORY') tt.is(err.code, 'ENOTINHISTORY')
tt.end() tt.end()

View File

@ -1,8 +1,8 @@
const test = require('tap').test const test = require('tap').test
const getRegistry = require('../../dist/lib/get-registry') const getRegistry = require('../../src/lib/get-registry')
test('get correct registry', (t) => { test('get correct registry', function (t) {
t.is(getRegistry({ t.is(getRegistry({
name: 'publish-config', name: 'publish-config',
publishConfig: { publishConfig: {
@ -10,20 +10,34 @@ test('get correct registry', (t) => {
}}, }},
{}), 'a') {}), 'a')
t.is(getRegistry({name: 'normal'}, {get: () => 'b'}), 'b') t.is(getRegistry({name: 'normal'}, {
get: function () {
return 'b'
}
}), 'b')
t.is(getRegistry({name: 'normal'}, {get: () => null}), 'https://registry.npmjs.org/') t.is(getRegistry({name: 'normal'}, {
get: function () {
return null
}
}), 'https://registry.npmjs.org/')
t.is(getRegistry({name: '@scoped/foo'}, { t.is(getRegistry({name: '@scoped/foo'}, {
get: (input) => input === '@scoped/registry' ? 'c' : 'd' get: function (input) {
return input === '@scoped/registry' ? 'c' : 'd'
}
}), 'c') }), 'c')
t.is(getRegistry({name: '@scoped/bar'}, { t.is(getRegistry({name: '@scoped/bar'}, {
get: () => 'e' get: function () {
return 'e'
}
}), 'e') }), 'e')
t.is(getRegistry({name: '@scoped/baz'}, { t.is(getRegistry({name: '@scoped/baz'}, {
get: () => null get: function () {
return null
}
}), 'https://registry.npmjs.org/') }), 'https://registry.npmjs.org/')
t.end() t.end()

View File

@ -1,11 +1,11 @@
const test = require('tap').test var test = require('tap').test
const plugins = require('../../dist/lib/plugins') var plugins = require('../../src/lib/plugins')
test('export plugins', (t) => { test('export plugins', function (t) {
t.plan(5) t.plan(5)
const defaultPlugins = plugins({}) var defaultPlugins = plugins({})
t.is(typeof defaultPlugins.analyzeCommits, 'function') t.is(typeof defaultPlugins.analyzeCommits, 'function')
t.is(typeof defaultPlugins.generateNotes, 'function') t.is(typeof defaultPlugins.generateNotes, 'function')
@ -14,51 +14,51 @@ test('export plugins', (t) => {
t.is(typeof defaultPlugins.getLastRelease, 'function') t.is(typeof defaultPlugins.getLastRelease, 'function')
}) })
test('plugin pipelines', (t) => { test('plugin pipelines', function (t) {
t.plan(3) t.plan(3)
t.test('get all results', (tt) => { t.test('get all results', function (tt) {
const pipelinePlugins = plugins({ var pipelinePlugins = plugins({
verifyRelease: [ verifyRelease: [
'./dist/lib/plugin-noop', './src/lib/plugin-noop',
'./.test/mocks/plugin-result-a', './test/mocks/plugin-result-a',
'./.test/mocks/plugin-result-b' './test/mocks/plugin-result-b'
] ]
}) })
pipelinePlugins.verifyRelease({}, (err, results) => { pipelinePlugins.verifyRelease({}, function (err, results) {
tt.error(err) tt.error(err)
tt.same(results, [undefined, 'a', 'b']) tt.same(results, [undefined, 'a', 'b'])
tt.end() tt.end()
}) })
}) })
t.test('get first error', (tt) => { t.test('get first error', function (tt) {
const pipelinePlugins = plugins({ var pipelinePlugins = plugins({
verifyConditions: [ verifyConditions: [
'./dist/lib/plugin-noop', './src/lib/plugin-noop',
'./.test/mocks/plugin-error-a', './test/mocks/plugin-error-a',
'./.test/mocks/plugin-error-b' './test/mocks/plugin-error-b'
] ]
}) })
pipelinePlugins.verifyConditions({}, (err) => { pipelinePlugins.verifyConditions({}, function (err) {
tt.is(err.message, 'a') tt.is(err.message, 'a')
tt.end() tt.end()
}) })
}) })
t.test('get error and only results before', (tt) => { t.test('get error and only results before', function (tt) {
const pipelinePlugins = plugins({ var pipelinePlugins = plugins({
verifyRelease: [ verifyRelease: [
'./dist/lib/plugin-noop', './src/lib/plugin-noop',
'./.test/mocks/plugin-result-a', './test/mocks/plugin-result-a',
'./.test/mocks/plugin-error-b', './test/mocks/plugin-error-b',
'./.test/mocks/plugin-result-b' './test/mocks/plugin-result-b'
] ]
}) })
pipelinePlugins.verifyRelease({}, (err, results) => { pipelinePlugins.verifyRelease({}, function (err, results) {
tt.is(err.message, 'b') tt.is(err.message, 'b')
tt.same(results, [undefined, 'a', undefined]) tt.same(results, [undefined, 'a', undefined])
tt.end() tt.end()
@ -66,18 +66,18 @@ test('plugin pipelines', (t) => {
}) })
}) })
test('normalize and load plugin', (t) => { test('normalize and load plugin', function (t) {
t.test('load from string', (tt) => { t.test('load from string', function (tt) {
const plugin = plugins.normalize('./dist/lib/plugin-noop') var plugin = plugins.normalize('./src/lib/plugin-noop')
tt.is(typeof plugin, 'function') tt.is(typeof plugin, 'function')
tt.end() tt.end()
}) })
t.test('load from object', (tt) => { t.test('load from object', function (tt) {
const plugin = plugins.normalize({ var plugin = plugins.normalize({
path: './dist/lib/plugin-noop' path: './src/lib/plugin-noop'
}) })
tt.is(typeof plugin, 'function') tt.is(typeof plugin, 'function')
@ -85,8 +85,8 @@ test('normalize and load plugin', (t) => {
tt.end() tt.end()
}) })
t.test('load from object', (tt) => { t.test('load from fallback', function (tt) {
const plugin = plugins.normalize(null, '../../dist/lib/plugin-noop') var plugin = plugins.normalize(null, '../../src/lib/plugin-noop')
tt.is(typeof plugin, 'function') tt.is(typeof plugin, 'function')

View File

@ -1,20 +1,24 @@
const { defaults } = require('lodash') var defaults = require('lodash').defaults
const test = require('tap').test var test = require('tap').test
const proxyquire = require('proxyquire') var proxyquire = require('proxyquire')
const post = proxyquire('../../dist/post', { var post = proxyquire('../../src/post', {
'git-head': require('../mocks/git-head'), 'git-head': require('../mocks/git-head'),
github: require('../mocks/github') github: require('../mocks/github')
}) })
const pkg = { var pkg = {
version: '1.0.0', version: '1.0.0',
repository: {url: 'http://github.com/whats/up.git'} repository: {url: 'http://github.com/whats/up.git'}
} }
const plugins = {generateNotes: (pkg, cb) => cb(null, 'the log')} var plugins = {
generateNotes: function (pkg, cb) {
cb(null, 'the log')
}
}
const defaultRelease = { var defaultRelease = {
owner: 'whats', owner: 'whats',
repo: 'up', repo: 'up',
name: 'v1.0.0', name: 'v1.0.0',
@ -23,13 +27,13 @@ const defaultRelease = {
body: 'the log' body: 'the log'
} }
test('full post run', (t) => { test('full post run', function (t) {
t.test('in debug mode w/o token', (tt) => { t.test('in debug mode w/o token', function (tt) {
post({ post({
options: {debug: true}, options: {debug: true},
pkg, pkg: pkg,
plugins plugins: plugins
}, (err, published, release) => { }, function (err, published, release) {
tt.error(err) tt.error(err)
tt.is(published, false) tt.is(published, false)
tt.match(release, defaults({draft: true}, defaultRelease)) tt.match(release, defaults({draft: true}, defaultRelease))
@ -38,12 +42,12 @@ test('full post run', (t) => {
}) })
}) })
t.test('in debug mode w/token', (tt) => { t.test('in debug mode w/token', function (tt) {
post({ post({
options: {debug: true, githubToken: 'yo'}, options: {debug: true, githubToken: 'yo'},
pkg, pkg: pkg,
plugins plugins: plugins
}, (err, published, release) => { }, function (err, published, release) {
tt.error(err) tt.error(err)
tt.is(published, true) tt.is(published, true)
tt.match(release, defaults({draft: true}, defaultRelease)) tt.match(release, defaults({draft: true}, defaultRelease))
@ -52,12 +56,12 @@ test('full post run', (t) => {
}) })
}) })
t.test('production', (tt) => { t.test('production', function (tt) {
post({ post({
options: {githubToken: 'yo'}, options: {githubToken: 'yo'},
pkg, pkg: pkg,
plugins plugins: plugins
}, (err, published, release) => { }, function (err, published, release) {
tt.error(err) tt.error(err)
tt.is(published, true) tt.is(published, true)
tt.match(release, defaultRelease) tt.match(release, defaultRelease)

View File

@ -1,55 +1,59 @@
const test = require('tap').test var test = require('tap').test
const proxyquire = require('proxyquire') var proxyquire = require('proxyquire')
require('../mocks/registry') require('../mocks/registry')
const pre = proxyquire('../../dist/pre', { var pre = proxyquire('../../src/pre', {
'./lib/commits': proxyquire('../../dist/lib/commits', { './lib/commits': proxyquire('../../src/lib/commits', {
'child_process': require('../mocks/child-process') 'child_process': require('../mocks/child-process')
}) })
}) })
const versions = { var versions = {
available: '1.0.0' available: '1.0.0'
} }
const plugins = { var plugins = {
verifyRelease: (release, cb) => cb(null, release), verifyRelease: function (release, cb) {
analyzeCommits: (commits, cb) => cb(null, 'major'), cb(null, release)
getLastRelease: ({ pkg }, cb) => { },
cb(null, {version: versions[pkg.name] || null, gitHead: 'HEAD'}) analyzeCommits: function (commits, cb) {
cb(null, 'major')
},
getLastRelease: function (config, cb) {
cb(null, {version: versions[config.pkg.name] || null, gitHead: 'HEAD'})
} }
} }
const npm = { var npm = {
registry: 'http://registry.npmjs.org/', registry: 'http://registry.npmjs.org/',
tag: 'latest' tag: 'latest'
} }
test('full pre run', (t) => { test('full pre run', function (t) {
t.test('increase version', (tt) => { t.test('increase version', function (tt) {
tt.plan(3) tt.plan(3)
pre({ pre({
options: {branch: 'master'}, options: {branch: 'master'},
npm, npm: npm,
pkg: {name: 'available'}, pkg: {name: 'available'},
plugins plugins: plugins
}, (err, release) => { }, function (err, release) {
tt.error(err) tt.error(err)
tt.is(release.type, 'major') tt.is(release.type, 'major')
tt.is(release.version, '2.0.0') tt.is(release.version, '2.0.0')
}) })
}) })
t.test('increase version', (tt) => { t.test('increase version', function (tt) {
tt.plan(3) tt.plan(3)
pre({ pre({
options: {branch: 'master'}, options: {branch: 'master'},
npm, npm: npm,
pkg: {name: 'unavailable'}, pkg: {name: 'unavailable'},
plugins plugins: plugins
}, (err, release) => { }, function (err, release) {
tt.error(err) tt.error(err)
tt.is(release.type, 'initial') tt.is(release.type, 'initial')
tt.is(release.version, '1.0.0') tt.is(release.version, '1.0.0')

View File

@ -1,9 +1,9 @@
const test = require('tap').test var test = require('tap').test
const type = require('../../dist/lib/type') var type = require('../../src/lib/type')
test('get type from commits', (t) => { test('get type from commits', function (t) {
t.test('get type from plugin', (tt) => { t.test('get type from plugin', function (tt) {
tt.plan(2) tt.plan(2)
type({ type({
@ -12,33 +12,45 @@ test('get type from commits', (t) => {
message: 'a' message: 'a'
}], }],
lastRelease: {version: '1.0.0'}, lastRelease: {version: '1.0.0'},
plugins: {analyzeCommits: (config, cb) => cb(null, 'major')} plugins: {
}, (err, type) => { analyzeCommits: function (config, cb) {
cb(null, 'major')
}
}
}, function (err, type) {
tt.error(err) tt.error(err)
tt.is(type, 'major') tt.is(type, 'major')
}) })
}) })
t.test('error when no changes', (tt) => { t.test('error when no changes', function (tt) {
tt.plan(1) tt.plan(1)
type({ type({
commits: [], commits: [],
lastRelease: {}, lastRelease: {},
plugins: {analyzeCommits: (config, cb) => cb(null, null)} plugins: {
}, (err) => { analyzeCommits: function (config, cb) {
cb(null, null)
}
}
}, function (err) {
tt.is(err.code, 'ENOCHANGE') tt.is(err.code, 'ENOCHANGE')
}) })
}) })
t.test('initial version', (tt) => { t.test('initial version', function (tt) {
tt.plan(2) tt.plan(2)
type({ type({
commits: [], commits: [],
lastRelease: {}, lastRelease: {},
plugins: {analyzeCommits: (config, cb) => cb(null, 'major')} plugins: {
}, (err, type) => { analyzeCommits: function (config, cb) {
cb(null, 'major')
}
}
}, function (err, type) {
tt.error(err) tt.error(err)
tt.is(type, 'initial') tt.is(type, 'initial')
}) })

View File

@ -1,10 +1,10 @@
const test = require('tap').test var test = require('tap').test
const verify = require('../../dist/lib/verify') var verify = require('../../src/lib/verify')
test('verify pkg, options and env', (t) => { test('verify pkg, options and env', function (t) {
t.test('dry run verification', (tt) => { t.test('dry run verification', function (tt) {
const noErrors = verify({ var noErrors = verify({
options: {debug: true}, options: {debug: true},
pkg: { pkg: {
name: 'package', name: 'package',
@ -16,7 +16,7 @@ test('verify pkg, options and env', (t) => {
tt.is(noErrors.length, 0) tt.is(noErrors.length, 0)
const errors = verify({ var errors = verify({
options: {debug: true}, options: {debug: true},
pkg: {} pkg: {}
}) })
@ -25,7 +25,7 @@ test('verify pkg, options and env', (t) => {
tt.is(errors[0].code, 'ENOPKGNAME') tt.is(errors[0].code, 'ENOPKGNAME')
tt.is(errors[1].code, 'ENOPKGREPO') tt.is(errors[1].code, 'ENOPKGREPO')
const errors2 = verify({ var errors2 = verify({
options: {debug: true}, options: {debug: true},
pkg: { pkg: {
name: 'package', name: 'package',
@ -41,8 +41,8 @@ test('verify pkg, options and env', (t) => {
tt.end() tt.end()
}) })
t.test('publish verification', (tt) => { t.test('publish verification', function (tt) {
const noErrors = verify({ var noErrors = verify({
env: {NPM_TOKEN: 'yo'}, env: {NPM_TOKEN: 'yo'},
options: {githubToken: 'sup'}, options: {githubToken: 'sup'},
pkg: { pkg: {
@ -55,7 +55,7 @@ test('verify pkg, options and env', (t) => {
tt.is(noErrors.length, 0) tt.is(noErrors.length, 0)
const errors = verify({env: {}, options: {}, pkg: {}}) var errors = verify({env: {}, options: {}, pkg: {}})
tt.is(errors.length, 4) tt.is(errors.length, 4)
tt.is(errors[0].code, 'ENOPKGNAME') tt.is(errors[0].code, 'ENOPKGNAME')