Skip to content
This repository was archived by the owner on Nov 25, 2017. It is now read-only.

Commit 374215e

Browse files
ariporadboennemann
authored andcommitted
1 parent c568a5e commit 374215e

File tree

8 files changed

+230
-1
lines changed

8 files changed

+230
-1
lines changed

.editorconfig

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
root = true
2+
3+
[*]
4+
end_of_line = lf
5+
insert_final_newline = true
6+
indent_style = space
7+
indent_size = 2
8+
trim_trailing_whitespace = true
9+
10+
[*.md]
11+
trim_trailing_whitespace = false

.gitignore

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
# common
2+
coverage
3+
node_modules
4+
*.log
5+
*.dump
6+
.DS_Store
7+
.nyc_output
8+
.test
9+
.tmp
10+
11+
# build-artifacts
12+
dist

.npmignore

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
# common
2+
coverage
3+
node_modules
4+
*.log
5+
*.dump
6+
.DS_Store
7+
.nyc_output
8+
.test
9+
.tmp
10+
11+
# source/config
12+
src
13+
*.yml
14+
.gitignore
15+
.editorconfig
16+
.npmrc

README.md

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,7 @@
1-
# last-release-npm
1+
# semantic-release last-release-npm
2+
[![npm version](https://badge.fury.io/js/%40semantic-release%2Flast-release-npm.svg)](http://badge.fury.io/js/%40semantic-release%2Flast-release-npm)
3+
[![Build Status](https://travis-ci.org/semantic-release/last-release-npm.svg?branch=master)](https://travis-ci.org/semantic-release/last-release-npm)
4+
[![Coverage Status](https://coveralls.io/repos/semantic-release/last-release-npm/badge.svg)](https://coveralls.io/r/semantic-release/last-release-npm)
5+
[![Dependency Status](https://david-dm.org/semantic-release/last-release-npm.svg)](https://david-dm.org/semantic-release/last-release-npm)
6+
[![devDependency Status](https://david-dm.org/semantic-release/last-release-npm/dev-status.svg)](https://david-dm.org/semantic-release/last-release-npm#info=devDependencies)
7+
[![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg?style=flat)](https://github.com/feross/standard)

package.json

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
{
2+
"name": "@semantic-release/last-release-npm",
3+
"description": "determine the version of the last release via the npm registry",
4+
"author": "Stephan Bönnemann <stephan@boennemann.me> (http://boennemann.me)",
5+
"bugs": {
6+
"url": "https://github.com/semantic-release/last-release-npm/issues"
7+
},
8+
"config": {
9+
"nyc": {
10+
"exclude": [
11+
".test",
12+
"node_modules"
13+
]
14+
}
15+
},
16+
"dependencies": {
17+
"@semantic-release/error": "^1.0.0",
18+
"npm-registry-client": "^6.5.1",
19+
"npmlog": "^1.2.1"
20+
},
21+
"devDependencies": {
22+
"babel": "^5.8.21",
23+
"coveralls": "^2.11.2",
24+
"lodash": "^3.10.1",
25+
"mkdirp": "^0.5.1",
26+
"nock": "^2.10.0",
27+
"nyc": "^3.0.0",
28+
"rimraf": "^2.4.2",
29+
"standard": "^4.2.1",
30+
"tap": "^1.3.2"
31+
},
32+
"homepage": "https://github.com/semantic-release/last-release-npm#readme",
33+
"keywords": [
34+
"npm",
35+
"registry",
36+
"semantic-release",
37+
"version"
38+
],
39+
"license": "MIT",
40+
"main": "dist/index.js",
41+
"repository": {
42+
"type": "git",
43+
"url": "git+https://github.com/semantic-release/last-release-npm.git"
44+
},
45+
"scripts": {
46+
"build": "rimraf dist && mkdirp dist && babel src --out-dir dist",
47+
"build:tests": "rimraf .test && mkdirp .test && babel test --out-dir .test",
48+
"coverage": "nyc report",
49+
"coverage:upload": "npm run coverage -- --reporter=text-lcov | coveralls",
50+
"pretest:suite": "npm run build && npm run build:tests",
51+
"test": "npm run test:style && npm run test:suite",
52+
"test:style": "standard",
53+
"test:suite": "nyc tap --no-cov .test/specs/*.js"
54+
}
55+
}

src/index.js

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
const SemanticReleaseError = require('@semantic-release/error')
2+
3+
const npmlog = require('npmlog')
4+
const RegClient = require('npm-registry-client')
5+
6+
module.exports = function (pluginConfig, {pkg, npm, plugins}, cb) {
7+
npmlog.level = npm.loglevel || 'error'
8+
const client = new RegClient({log: npmlog})
9+
10+
client.get(`${npm.registry}${pkg.name.replace('/', '%2F')}`, {
11+
auth: npm.auth
12+
}, (err, data) => {
13+
if (err && err.statusCode === 404) return cb(null, {})
14+
if (err) return cb(err)
15+
16+
const version = data['dist-tags'][npm.tag]
17+
18+
if (!version) return cb(new SemanticReleaseError(`There is no release with the dist-tag "${npm.tag}" yet. Tag a version first.`, 'ENODISTTAG'))
19+
20+
cb(null, {
21+
version,
22+
gitHead: data.versions[version].gitHead
23+
})
24+
})
25+
}

test/mocks/registry.js

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
const nock = require('nock')
2+
3+
const availableModule = {
4+
'dist-tags': {
5+
latest: '1.33.7',
6+
foo: '0.8.15'
7+
},
8+
versions: {
9+
'0.8.15': {
10+
gitHead: 'bar'
11+
},
12+
'1.33.7': {
13+
gitHead: 'HEAD'
14+
}
15+
}
16+
}
17+
18+
module.exports = nock('http://registry.npmjs.org')
19+
.get('/available')
20+
.reply(200, availableModule)
21+
.get('/tagged')
22+
.reply(200, availableModule)
23+
.get('/untagged')
24+
.reply(200, availableModule)
25+
.get('/@scoped%2Favailable')
26+
.reply(200, availableModule)
27+
.get('/unavailable')
28+
.reply(404, {})

test/specs/index.js

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
const { defaults } = require('lodash')
2+
const test = require('tap').test
3+
4+
require('../mocks/registry')
5+
const lastRelease = require('../../')
6+
7+
const npm = {
8+
registry: 'http://registry.npmjs.org/',
9+
tag: 'latest'
10+
}
11+
12+
test('last release from registry', (t) => {
13+
t.plan(5)
14+
15+
t.test('get release from package name', (tt) => {
16+
lastRelease({}, {
17+
pkg: {name: 'available'},
18+
npm
19+
}, (err, release) => {
20+
tt.error(err)
21+
tt.is(release.version, '1.33.7', 'version')
22+
tt.is(release.gitHead, 'HEAD', 'gitHead')
23+
24+
tt.end()
25+
})
26+
})
27+
28+
t.test('get release from a tagged package\'s name', (tt) => {
29+
lastRelease({}, {
30+
pkg: {name: 'tagged'},
31+
npm: defaults({tag: 'foo'}, npm)
32+
}, (err, release) => {
33+
tt.error(err)
34+
tt.is(release.version, '0.8.15', 'version')
35+
tt.is(release.gitHead, 'bar', 'gitHead')
36+
37+
tt.end()
38+
})
39+
})
40+
41+
t.test('get error from an untagged package\'s name', (tt) => {
42+
lastRelease({}, {
43+
pkg: {name: 'untagged'},
44+
npm: defaults({tag: 'bar'}, npm)
45+
}, (err) => {
46+
tt.is(err.code, 'ENODISTTAG', 'error')
47+
48+
tt.end()
49+
})
50+
})
51+
52+
t.test('get release from scoped package name', (tt) => {
53+
lastRelease({}, {
54+
pkg: {name: '@scoped/available'},
55+
npm
56+
}, (err, release) => {
57+
tt.error(err)
58+
tt.is(release.version, '1.33.7', 'version')
59+
tt.is(release.gitHead, 'HEAD', 'gitHead')
60+
61+
tt.end()
62+
})
63+
})
64+
65+
t.test('get nothing from not yet published package name', (tt) => {
66+
lastRelease({}, {
67+
pkg: {name: 'unavailable'},
68+
npm
69+
}, (err, release) => {
70+
tt.error(err)
71+
tt.is(release.version, undefined, 'no version')
72+
73+
tt.end()
74+
})
75+
})
76+
})

0 commit comments

Comments
 (0)