From 25cb545ea3a1f169554e308ccc74e20fe5a8f9c6 Mon Sep 17 00:00:00 2001 From: Christoph Witzko Date: Mon, 25 May 2015 00:15:15 +0200 Subject: [PATCH 1/3] feat(npm-info): support private modules closes #28 --- lib/npm-info.js | 55 ++++++++++++++++++++++++++++++------------------- package.json | 2 ++ 2 files changed, 36 insertions(+), 21 deletions(-) diff --git a/lib/npm-info.js b/lib/npm-info.js index a773b3a7..b861796d 100644 --- a/lib/npm-info.js +++ b/lib/npm-info.js @@ -1,28 +1,41 @@ '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) + callback(null, { + url: registry + pkgName.replace(/\//g, '%2F'), + headers: { + 'Authorization': cred.token ? 'Bearer ' + cred.token : null + } + }) + }, + 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..2f4737a4 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" From d0032de73710dfdd90e3f3ecefe23e86deadbaf2 Mon Sep 17 00:00:00 2001 From: Christoph Witzko Date: Tue, 26 May 2015 20:58:04 +0200 Subject: [PATCH 2/3] test(npm-info): support private modules --- package.json | 3 ++- tests/.npmrc | 1 + tests/index.js | 1 + tests/tap/npm-info.js | 52 +++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 tests/tap/npm-info.js diff --git a/package.json b/package.json index 2f4737a4..b4fc952e 100644 --- a/package.json +++ b/package.json @@ -28,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() + }) + }) + }) +} From 25828960bce78dd5559c86f4fc40134a7a54e976 Mon Sep 17 00:00:00 2001 From: Christoph Witzko Date: Wed, 27 May 2015 18:55:58 +0200 Subject: [PATCH 3/3] fix(npm-info): support basic auth --- lib/npm-info.js | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/lib/npm-info.js b/lib/npm-info.js index b861796d..24a10734 100644 --- a/lib/npm-info.js +++ b/lib/npm-info.js @@ -10,12 +10,16 @@ module.exports = function (pkgName, cb) { npmconf.load, function (conf, callback) { var cred = conf.getCredentialsByURI(registry) - callback(null, { + var reqopts = { url: registry + pkgName.replace(/\//g, '%2F'), - headers: { - 'Authorization': cred.token ? 'Bearer ' + cred.token : null - } - }) + 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) {