From f432df0e0fb88f5c50476417a9ad40e28e96329d Mon Sep 17 00:00:00 2001 From: Gleb Bahmutov Date: Wed, 18 Nov 2015 17:04:39 -0500 Subject: [PATCH] feat(exact): checking exact versions works --- bin/exact-semver.js | 14 ++++++++++++-- package.json | 26 ++++++++++++++++++++++--- src/is-strict-semver-spec.js | 37 ++++++++++++++++++++++++++++++++++++ src/is-strict-semver.js | 8 ++++++++ src/make-exact-spec.js | 32 +++++++++++++++++++++++++++++++ src/make-exact.js | 17 +++++++++++++++++ 6 files changed, 129 insertions(+), 5 deletions(-) create mode 100644 src/is-strict-semver-spec.js create mode 100644 src/is-strict-semver.js create mode 100644 src/make-exact-spec.js create mode 100644 src/make-exact.js diff --git a/bin/exact-semver.js b/bin/exact-semver.js index b2ff923..ab82bf7 100644 --- a/bin/exact-semver.js +++ b/bin/exact-semver.js @@ -1,10 +1,12 @@ #!/usr/bin/env node var exists = require('fs').existsSync; +var load = require('fs').readFileSync; +var save = require('fs').writeFileSync; var join = require('path').join; var pkgFilename = join(process.cwd(), 'package.json'); -function checkPackageExists() { +function verifyPackageExists() { if (!exists(pkgFilename)) { /* eslint no-console:0 */ console.error('WARNING: cannot find package.json in the current folder'); @@ -12,4 +14,12 @@ function checkPackageExists() { } } -checkPackageExists(); +verifyPackageExists(); + +var pkg = JSON.parse(load(pkgFilename)); +var makeExact = require('../src/make-exact'); +var needSaving = makeExact(pkg); +if (needSaving) { + save(pkgFilename, JSON.stringify(pkg, null, 2) + '\n'); + console.log('saved exact semver numbers in %s', pkgFilename); +} diff --git a/package.json b/package.json index 0b2abed..1620794 100644 --- a/package.json +++ b/package.json @@ -4,9 +4,11 @@ "main": "index.js", "version": "0.0.0-semantic-release", "scripts": { - "test": "echo \"Error: no test specified\" && exit 1", - "lint": "eslint bin/*.js", - "semantic-release": "semantic-release pre && npm publish && semantic-release post" + "test": "mocha src/*-spec.js", + "watch": "mocha src/*-spec.js --watch", + "lint": "eslint bin/*.js src/*.js", + "semantic-release": "semantic-release pre && npm publish && semantic-release post", + "commit": "commit-wizard" }, "repository": { "type": "git", @@ -28,6 +30,24 @@ "homepage": "https://github.com/bahmutov/exact-semver#readme", "devDependencies": { "eslint": "1.9.0", + "lazy-ass": "1.0.0", + "mocha": "2.3.4", + "pre-git": "1.2.11", "semantic-release": "^4.3.5" + }, + "config": { + "pre-git": { + "commit-msg": "validate-commit-msg", + "pre-commit": [], + "pre-push": [], + "post-commit": [], + "post-merge": [] + } + }, + "czConfig": { + "path": "node_modules/cz-conventional-changelog" + }, + "dependencies": { + "check-more-types": "2.1.2" } } diff --git a/src/is-strict-semver-spec.js b/src/is-strict-semver-spec.js new file mode 100644 index 0000000..a178751 --- /dev/null +++ b/src/is-strict-semver-spec.js @@ -0,0 +1,37 @@ +var la = require('lazy-ass'); +var check = require('check-more-types'); + +describe('is-strict-semver', function () { + var isStrictSemver = require('./is-strict-semver'); + + it('is a function', function () { + la(check.fn(isStrictSemver)); + }); + + it('passes strict versions', function () { + la(isStrictSemver('0.1.0')); + la(isStrictSemver('1.1.0')); + la(isStrictSemver('1.1.20')); + la(isStrictSemver('10.1.0')); + }); + + it('fails fuzzy chars', function () { + la(!isStrictSemver('~0.1.0'), '~'); + la(!isStrictSemver('^0.1.0'), '^'); + }); + + it('fails wildcards', function () { + la(!isStrictSemver('0.1.*'), '* patch'); + la(!isStrictSemver('0.*.0'), '* minor'); + la(!isStrictSemver('*.1.2'), '* major'); + }); + + it('fails on missing numbers', function () { + la(!isStrictSemver('1'), 'major only'); + la(!isStrictSemver('1.0'), 'minor'); + }); + + it('fails on tags', function () { + la(!isStrictSemver('1.0.0-foo')); + }); +}); diff --git a/src/is-strict-semver.js b/src/is-strict-semver.js new file mode 100644 index 0000000..114498e --- /dev/null +++ b/src/is-strict-semver.js @@ -0,0 +1,8 @@ +function isStrictSemver(version) { + // TODO use check-more-types when available + // https://github.com/kensho/check-more-types/issues/31 + var pattern = /^[0-9]+\.[0-9]+\.[0-9]+$/; + return pattern.test(version); +} + +module.exports = isStrictSemver; diff --git a/src/make-exact-spec.js b/src/make-exact-spec.js new file mode 100644 index 0000000..5693ab5 --- /dev/null +++ b/src/make-exact-spec.js @@ -0,0 +1,32 @@ +var la = require('lazy-ass'); +var check = require('check-more-types'); + +describe('make exact', function () { + var makeExact = require('./make-exact'); + + it('is a function', function () { + la(check.fn(makeExact)); + }); + + it('returns false if there are no dependencies', function () { + var needSaving = makeExact({}); + la(!needSaving); + }); + + it('returns false if empty dependencies', function () { + var needSaving = makeExact({ + dependencies: {} + }); + la(!needSaving); + }); + + it('returns false is exact semver', function () { + var needSaving = makeExact({ + dependencies: { + foo: '1.0.2', + bar: '2.0.1' + } + }); + la(!needSaving); + }); +}); diff --git a/src/make-exact.js b/src/make-exact.js new file mode 100644 index 0000000..5c0efcd --- /dev/null +++ b/src/make-exact.js @@ -0,0 +1,17 @@ +var isStrictSemver = require('./is-strict-semver'); + +function makeExact(pkg) { + var needSaving; + if (pkg.dependencies) { + Object.keys(pkg.dependencies).forEach(function (name) { + var version = pkg.dependencies[name]; + if (!isStrictSemver(version)) { + version = toExact(version); + pkg.dependencies[name] = version; + needSaving = true; + } + }); + } +} + +module.exports = makeExact;