refactor: use one config object instead of passing arguments to plugins on their own
This commit does a lot but it's all connected and tries to make everything more extensible and future proof.
1. CLI arguments and options from the "package.json" are no longer treated as two different things. You can now pass options either way.
BREAKING CHANGE: cli arguments are now normalized to camelCase, so e.g. `options['github-url']` is now `options.githubUrl`
2. Plugins no longer receive config they need one by one, but in one huge object. This way it's easier to pass more info in the future w/o breaking existing plugins that rely on the position of the callback in the arguments array.
BREAKING CHANGE: Plugins now need to read their passed options from one huge config object.
Old:
```js
module.exports = function (pluginConfig, foo, bar, cb) {…}
```
New:
```js
// ES5
module.exports = function(pluginConfig, config, cb) {
var foo = config.foo
var bar = config.bar
…
}
// ES6
module.exports = function (pluginConfig, {foo, bar}, cb) {…}
```
This commit is contained in:
@@ -7,7 +7,7 @@ const commits = proxyquire('../../dist/lib/commits', {
|
||||
|
||||
test('commits since last release', (t) => {
|
||||
t.test('get all commits', (tt) => {
|
||||
commits({}, (err, commits) => {
|
||||
commits({lastRelease: {}}, (err, commits) => {
|
||||
tt.error(err)
|
||||
tt.is(commits.length, 2, 'all commits')
|
||||
tt.is(commits[0].hash, 'hash-one', 'parsed hash')
|
||||
@@ -18,7 +18,7 @@ test('commits since last release', (t) => {
|
||||
})
|
||||
|
||||
t.test('get commits since hash', (tt) => {
|
||||
commits({gitHead: 'hash'}, (err, commits) => {
|
||||
commits({lastRelease: {gitHead: 'hash'}}, (err, commits) => {
|
||||
tt.error(err)
|
||||
tt.is(commits.length, 1, 'specified commits')
|
||||
tt.is(commits[0].hash, 'hash-one', 'parsed hash')
|
||||
|
||||
+16
-21
@@ -4,7 +4,7 @@ const test = require('tap').test
|
||||
require('../mocks/registry')
|
||||
const lastRelease = require('../../dist/lib/last-release')
|
||||
|
||||
const npmConfig = {
|
||||
const npm = {
|
||||
registry: 'http://registry.npmjs.org/',
|
||||
tag: 'latest'
|
||||
}
|
||||
@@ -14,10 +14,9 @@ test('last release from registry', (t) => {
|
||||
|
||||
t.test('get release from package name', (tt) => {
|
||||
lastRelease({
|
||||
name: 'available'
|
||||
},
|
||||
npmConfig,
|
||||
(err, release) => {
|
||||
pkg: {name: 'available'},
|
||||
npm
|
||||
}, (err, release) => {
|
||||
tt.error(err)
|
||||
tt.is(release.version, '1.33.7', 'version')
|
||||
tt.is(release.gitHead, 'HEAD', 'gitHead')
|
||||
@@ -29,10 +28,9 @@ test('last release from registry', (t) => {
|
||||
|
||||
t.test('get release from a tagged package\'s name', (tt) => {
|
||||
lastRelease({
|
||||
name: 'tagged'
|
||||
},
|
||||
defaults({tag: 'foo'}, npmConfig),
|
||||
(err, release) => {
|
||||
pkg: {name: 'tagged'},
|
||||
npm: defaults({tag: 'foo'}, npm)
|
||||
}, (err, release) => {
|
||||
tt.error(err)
|
||||
tt.is(release.version, '0.8.15', 'version')
|
||||
tt.is(release.gitHead, 'bar', 'gitHead')
|
||||
@@ -44,10 +42,9 @@ test('last release from registry', (t) => {
|
||||
|
||||
t.test('get error from an untagged package\'s name', (tt) => {
|
||||
lastRelease({
|
||||
name: 'untagged'
|
||||
},
|
||||
defaults({tag: 'bar'}, npmConfig),
|
||||
(err) => {
|
||||
pkg: {name: 'untagged'},
|
||||
npm: defaults({tag: 'bar'}, npm)
|
||||
}, (err) => {
|
||||
tt.is(err.code, 'ENODISTTAG', 'error')
|
||||
|
||||
tt.end()
|
||||
@@ -56,10 +53,9 @@ test('last release from registry', (t) => {
|
||||
|
||||
t.test('get release from scoped package name', (tt) => {
|
||||
lastRelease({
|
||||
name: '@scoped/available'
|
||||
},
|
||||
npmConfig,
|
||||
(err, release) => {
|
||||
pkg: {name: '@scoped/available'},
|
||||
npm
|
||||
}, (err, release) => {
|
||||
tt.error(err)
|
||||
tt.is(release.version, '1.33.7', 'version')
|
||||
tt.is(release.gitHead, 'HEAD', 'gitHead')
|
||||
@@ -71,10 +67,9 @@ test('last release from registry', (t) => {
|
||||
|
||||
t.test('get nothing from not yet published package name', (tt) => {
|
||||
lastRelease({
|
||||
name: 'unavailable'
|
||||
},
|
||||
npmConfig,
|
||||
(err, release) => {
|
||||
pkg: {name: 'unavailable'},
|
||||
npm
|
||||
}, (err, release) => {
|
||||
tt.error(err)
|
||||
tt.is(release.version, undefined, 'no version')
|
||||
|
||||
|
||||
+18
-10
@@ -9,14 +9,10 @@ const post = proxyquire('../../dist/post', {
|
||||
|
||||
const pkg = {
|
||||
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')
|
||||
}
|
||||
const plugins = {generateNotes: (pkg, cb) => cb(null, 'the log')}
|
||||
|
||||
const defaultRelease = {
|
||||
owner: 'whats',
|
||||
@@ -29,7 +25,11 @@ const defaultRelease = {
|
||||
|
||||
test('full post run', (t) => {
|
||||
t.test('in debug mode w/o token', (tt) => {
|
||||
post(pkg, {debug: true}, plugins, (err, published, release) => {
|
||||
post({
|
||||
options: {debug: true},
|
||||
pkg,
|
||||
plugins
|
||||
}, (err, published, release) => {
|
||||
tt.error(err)
|
||||
tt.is(published, false)
|
||||
tt.match(release, defaults({draft: true}, defaultRelease))
|
||||
@@ -38,8 +38,12 @@ test('full post run', (t) => {
|
||||
})
|
||||
})
|
||||
|
||||
t.test('in debug mode w token', (tt) => {
|
||||
post(pkg, {debug: true, 'github-token': 'yo'}, plugins, (err, published, release) => {
|
||||
t.test('in debug mode w/token', (tt) => {
|
||||
post({
|
||||
options: {debug: true, githubToken: 'yo'},
|
||||
pkg,
|
||||
plugins
|
||||
}, (err, published, release) => {
|
||||
tt.error(err)
|
||||
tt.is(published, true)
|
||||
tt.match(release, defaults({draft: true}, defaultRelease))
|
||||
@@ -49,7 +53,11 @@ test('full post run', (t) => {
|
||||
})
|
||||
|
||||
t.test('production', (tt) => {
|
||||
post(pkg, {'github-token': 'yo'}, plugins, (err, published, release) => {
|
||||
post({
|
||||
options: {githubToken: 'yo'},
|
||||
pkg,
|
||||
plugins
|
||||
}, (err, published, release) => {
|
||||
tt.error(err)
|
||||
tt.is(published, true)
|
||||
tt.match(release, defaultRelease)
|
||||
|
||||
+9
-11
@@ -11,7 +11,7 @@ const plugins = {
|
||||
analyzeCommits: (commits, cb) => cb(null, 'major')
|
||||
}
|
||||
|
||||
const npmConfig = {
|
||||
const npm = {
|
||||
registry: 'http://registry.npmjs.org/',
|
||||
tag: 'latest'
|
||||
|
||||
@@ -22,11 +22,10 @@ test('full pre run', (t) => {
|
||||
tt.plan(3)
|
||||
|
||||
pre({
|
||||
name: 'available'
|
||||
},
|
||||
npmConfig,
|
||||
plugins,
|
||||
(err, release) => {
|
||||
npm,
|
||||
pkg: {name: 'available'},
|
||||
plugins
|
||||
}, (err, release) => {
|
||||
tt.error(err)
|
||||
tt.is(release.type, 'major')
|
||||
tt.is(release.version, '2.0.0')
|
||||
@@ -37,11 +36,10 @@ test('full pre run', (t) => {
|
||||
tt.plan(3)
|
||||
|
||||
pre({
|
||||
name: 'unavailable'
|
||||
},
|
||||
npmConfig,
|
||||
plugins,
|
||||
(err, release) => {
|
||||
npm,
|
||||
pkg: {name: 'unavailable'},
|
||||
plugins
|
||||
}, (err, release) => {
|
||||
tt.error(err)
|
||||
tt.is(release.type, 'initial')
|
||||
tt.is(release.version, '1.0.0')
|
||||
|
||||
+14
-12
@@ -7,12 +7,12 @@ test('get type from commits', (t) => {
|
||||
tt.plan(2)
|
||||
|
||||
type({
|
||||
analyzeCommits: (commits, cb) => cb(null, 'major')
|
||||
}, [{
|
||||
hash: '0',
|
||||
message: 'a'
|
||||
}], {
|
||||
version: '1.0.0'
|
||||
commits: [{
|
||||
hash: '0',
|
||||
message: 'a'
|
||||
}],
|
||||
lastRelease: {version: '1.0.0'},
|
||||
plugins: {analyzeCommits: (config, cb) => cb(null, 'major')}
|
||||
}, (err, type) => {
|
||||
tt.error(err)
|
||||
tt.is(type, 'major')
|
||||
@@ -23,9 +23,10 @@ test('get type from commits', (t) => {
|
||||
tt.plan(1)
|
||||
|
||||
type({
|
||||
analyzeCommits: (commits, cb) => cb(null, null)
|
||||
}, [], {},
|
||||
(err) => {
|
||||
commits: [],
|
||||
lastRelease: {},
|
||||
plugins: {analyzeCommits: (config, cb) => cb(null, null)}
|
||||
}, (err) => {
|
||||
tt.is(err.code, 'ENOCHANGE')
|
||||
})
|
||||
})
|
||||
@@ -34,9 +35,10 @@ test('get type from commits', (t) => {
|
||||
tt.plan(2)
|
||||
|
||||
type({
|
||||
analyzeCommits: (commits, cb) => cb(null, 'major')
|
||||
}, [], {},
|
||||
(err, type) => {
|
||||
commits: [],
|
||||
lastRelease: {},
|
||||
plugins: {analyzeCommits: (config, cb) => cb(null, 'major')}
|
||||
}, (err, type) => {
|
||||
tt.error(err)
|
||||
tt.is(type, 'initial')
|
||||
})
|
||||
|
||||
+26
-23
@@ -5,32 +5,35 @@ const verify = require('../../dist/lib/verify')
|
||||
test('verify pkg, options and env', (t) => {
|
||||
t.test('dry run verification', (tt) => {
|
||||
const noErrors = verify({
|
||||
name: 'package',
|
||||
repository: {
|
||||
url: 'http://github.com/whats/up.git'
|
||||
options: {debug: true},
|
||||
pkg: {
|
||||
name: 'package',
|
||||
repository: {
|
||||
url: 'http://github.com/whats/up.git'
|
||||
}
|
||||
}
|
||||
}, {
|
||||
debug: true
|
||||
}, {})
|
||||
})
|
||||
|
||||
tt.is(noErrors.length, 0)
|
||||
|
||||
const errors = verify({}, {
|
||||
debug: true
|
||||
}, {})
|
||||
const errors = verify({
|
||||
options: {debug: true},
|
||||
pkg: {}
|
||||
})
|
||||
|
||||
tt.is(errors.length, 2)
|
||||
tt.is(errors[0].code, 'ENOPKGNAME')
|
||||
tt.is(errors[1].code, 'ENOPKGREPO')
|
||||
|
||||
const errors2 = verify({
|
||||
name: 'package',
|
||||
repository: {
|
||||
url: 'lol'
|
||||
options: {debug: true},
|
||||
pkg: {
|
||||
name: 'package',
|
||||
repository: {
|
||||
url: 'lol'
|
||||
}
|
||||
}
|
||||
}, {
|
||||
debug: true
|
||||
}, {})
|
||||
})
|
||||
|
||||
tt.is(errors2.length, 1)
|
||||
tt.is(errors2[0].code, 'EMALFORMEDPKGREPO')
|
||||
@@ -40,19 +43,19 @@ test('verify pkg, options and env', (t) => {
|
||||
|
||||
t.test('publish verification', (tt) => {
|
||||
const noErrors = verify({
|
||||
name: 'package',
|
||||
repository: {
|
||||
url: 'http://github.com/whats/up.git'
|
||||
env: {NPM_TOKEN: 'yo'},
|
||||
options: {githubToken: 'sup'},
|
||||
pkg: {
|
||||
name: 'package',
|
||||
repository: {
|
||||
url: 'http://github.com/whats/up.git'
|
||||
}
|
||||
}
|
||||
}, {
|
||||
'github-token': 'sup'
|
||||
}, {
|
||||
NPM_TOKEN: 'yo'
|
||||
})
|
||||
|
||||
tt.is(noErrors.length, 0)
|
||||
|
||||
const errors = verify({}, {}, {})
|
||||
const errors = verify({env: {}, options: {}, pkg: {}})
|
||||
|
||||
tt.is(errors.length, 4)
|
||||
tt.is(errors[0].code, 'ENOPKGNAME')
|
||||
|
||||
Reference in New Issue
Block a user