diff --git a/lib/type/analyze.js b/lib/type/analyze.js new file mode 100644 index 00000000..966bb833 --- /dev/null +++ b/lib/type/analyze.js @@ -0,0 +1,20 @@ +'use strict' + +module.exports = function (commits) { + var type = null + + commits.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/type/commits.js b/lib/type/commits.js new file mode 100644 index 00000000..5cbe98e1 --- /dev/null +++ b/lib/type/commits.js @@ -0,0 +1,14 @@ +'use strict' + +var git = require('conventional-changelog/lib/git') + +module.exports = function (cb) { + git.latestTag(function (err, from) { + if (err) return cb(err) + + git.getCommits({from: from}, function (err, commits) { + if (err) return cb(err) + cb(null, commits) + }) + }) +} diff --git a/lib/type/index.js b/lib/type/index.js new file mode 100644 index 00000000..e17115ae --- /dev/null +++ b/lib/type/index.js @@ -0,0 +1,12 @@ +'use strict' + +var commits = require('./commits') +var analyze = require('./analyze') + +module.exports = function (cb) { + commits(function (err, commits) { + if (err) return cb(err) + + cb(null, analyze(commits)) + }) +} diff --git a/lib/version.js b/lib/version.js new file mode 100644 index 00000000..bc0d0a14 --- /dev/null +++ b/lib/version.js @@ -0,0 +1,18 @@ +'use strict' + +var exec = require('child_process').exec +var unlink = require('fs').unlinkSync + +module.exports = function (pkg, cb) { + if (!pkg.name) return cb('Package must have a name') + + exec('npm show ' + pkg.name + ' version', function(err, stdout, stderr) { + if (err) unlink('./npm-debug.log') + + if (err && /is not in the npm registry/m.test(stderr)) return cb(null, null, true) + + if (err) return cb(err) + + cb(null, stdout.trim()) + }) +} diff --git a/src/pre.js b/src/pre.js new file mode 100644 index 00000000..4ecdf919 --- /dev/null +++ b/src/pre.js @@ -0,0 +1,26 @@ +'use strict' + +var fs = require('fs') + +var semver = require('semver') + +var type = require('../lib/type') +var version = require('../lib/version') + +module.exports = function (options, cb) { + type(function (err, type) { + if (err) return cb(err) + if (!type) return cb(null, null) + + var path = './package.json' + var pkg = JSON.parse(fs.readFileSync(path)) + version(pkg, function (err, version, unpublished) { + if (err) return cb(err) + + pkg.version = unpublished ? '1.0.0' : semver.inc(version, type) + if (!options.debug) fs.writeFileSync(path, JSON.stringify(pkg, null, 2)) + + cb(null, pkg.version) + }) + }) +}