diff --git a/lib/npm-info.js b/lib/npm-info.js index a773b3a7..24a10734 100644 --- a/lib/npm-info.js +++ b/lib/npm-info.js @@ -1,28 +1,45 @@ 'use strict' +var async = require('async') +var npmconf = require('npmconf') var request = require('request') -var efh = require('./error').efh - module.exports = function (pkgName, cb) { - var encodedPkgName = pkgName.replace(/\//g, '%2F') - request(process.env.npm_config_registry + encodedPkgName, efh(cb)(function (response, body) { - var res = { - version: null, - gitHead: null, - pkg: null + var registry = process.env.npm_config_registry + async.waterfall([ + npmconf.load, + function (conf, callback) { + var cred = conf.getCredentialsByURI(registry) + var reqopts = { + url: registry + pkgName.replace(/\//g, '%2F'), + headers: {} + } + if (cred.token) { + reqopts.headers.Authorization = 'Bearer ' + cred.token + } else if (cred.auth) { + reqopts.headers.Authorization = 'Basic ' + cred.auth + } + callback(null, reqopts) + }, + request, + function (response, body, callback) { + var res = { + version: null, + gitHead: null, + pkg: null + } + + if (response.statusCode === 404 || !body) return callback(null, res) + + var pkg = JSON.parse(body) + + if (pkg.error) return callback(pkg.error) + + res.version = pkg['dist-tags'].latest + res.gitHead = pkg.versions[res.version].gitHead + res.pkg = pkg + + callback(null, res) } - - if (response.statusCode === 404 || !body) return cb(null, res) - - var pkg = JSON.parse(body) - - if (pkg.error) return cb(pkg.error) - - res.version = pkg['dist-tags'].latest - res.gitHead = pkg.versions[res.version].gitHead - res.pkg = pkg - - cb(null, res) - })) + ], cb) } diff --git a/package.json b/package.json index c299f424..b4fc952e 100644 --- a/package.json +++ b/package.json @@ -9,6 +9,7 @@ }, "dependencies": { "abbrev": "^1.0.5", + "async": "^1.0.0", "conventional-changelog": "0.0.17", "error-first-handler": "^1.0.1", "git-head": "^1.2.1", @@ -16,6 +17,7 @@ "github-url-from-git": "^1.4.0", "ini": "^1.3.2", "minimist": "^1.1.0", + "npmconf": "^2.1.2", "parse-github-repo-url": "^1.0.0", "request": "^2.53.0", "semver": "^4.3.3" @@ -26,8 +28,9 @@ "lodash.defaults": "^3.0.0", "nano-uid": "^0.2.0", "nixt": "^0.4.1", + "nock": "^2.2.0", "sinopia": "^1.0.0", - "standard": "^3.2.1", + "standard": "^3.11.1", "tap-spec": "^3.0.0", "tape": "^4.0.0" }, diff --git a/tests/.npmrc b/tests/.npmrc index 1f4e0034..4e4947db 100644 --- a/tests/.npmrc +++ b/tests/.npmrc @@ -1,3 +1,4 @@ _auth=dGVzdDpmb28= email=test@example.com registry=http://127.0.0.1:4873/ +//registry.npmjs.org/:_authToken=testtoken diff --git a/tests/index.js b/tests/index.js index 0ac096cb..dc61116b 100644 --- a/tests/index.js +++ b/tests/index.js @@ -4,6 +4,7 @@ var test = require('tape') var createModule = require('./lib/create-module') +require('./tap/npm-info')(test) require('./scenarios/custom-analyzer')(test, createModule) require('./scenarios/custom-verification')(test, createModule) require('./scenarios/ignore')(test, createModule) diff --git a/tests/tap/npm-info.js b/tests/tap/npm-info.js new file mode 100644 index 00000000..fb8927e6 --- /dev/null +++ b/tests/tap/npm-info.js @@ -0,0 +1,52 @@ +'use strict' + +var nock = require('nock') + +var npmInfo = require('../../lib/npm-info.js') + +var registry = 'http://registry.npmjs.org/' + +var defaultModule = { + 'dist-tags': { + latest: '1.0.0' + }, + versions: { + '1.0.0': { + gitHead: 'HEAD' + } + } +} + +process.env.npm_config_registry = registry + +module.exports = function (test) { + test('npm-info', function (t) { + var regMock = nock(registry, { + reqheaders: { + 'authorization': 'Bearer testtoken' + } + }) + .get('/express') + .reply(200, defaultModule) + .get('/@user%2Fmodule') + .reply(200, defaultModule) + + t.test('get unscoped module', function (t) { + t.plan(3) + npmInfo('express', function (err, info) { + t.error(err, 'error') + t.is(info.version, '1.0.0', 'version') + t.is(info.gitHead, 'HEAD', 'gitHead') + }) + }) + t.test('get scoped module', function (t) { + t.plan(3) + npmInfo('@user/module', function (err, info) { + t.error(err, 'error') + t.is(info.version, '1.0.0', 'version') + t.is(info.gitHead, 'HEAD', 'gitHead') + regMock.done() + }) + }) + }) +}