Skip to content

Commit bb23517

Browse files
committed
view: stop using npm-registry-client
1 parent 11c07b3 commit bb23517

File tree

2 files changed

+123
-108
lines changed

2 files changed

+123
-108
lines changed

lib/view.js

Lines changed: 122 additions & 107 deletions
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,19 @@ const BB = require('bluebird')
88
const byteSize = require('byte-size')
99
const color = require('ansicolors')
1010
const columns = require('cli-columns')
11+
const config = require('./config/figgy-config.js')
12+
const log = require('npmlog')
13+
const fetch = require('npm-registry-fetch')
14+
const npa = require('npm-package-arg')
15+
const npm = require('./npm.js')
16+
const path = require('path')
17+
const readJson = require('read-package-json')
1118
const relativeDate = require('tiny-relative-date')
19+
const semver = require('semver')
1220
const style = require('ansistyles')
13-
var npm = require('./npm.js')
14-
var readJson = require('read-package-json')
15-
var log = require('npmlog')
16-
var util = require('util')
17-
var semver = require('semver')
18-
var mapToRegistry = require('./utils/map-to-registry.js')
19-
var npa = require('npm-package-arg')
20-
var path = require('path')
21-
var usage = require('./utils/usage')
21+
const usage = require('./utils/usage')
22+
const util = require('util')
23+
const validateName = require('validate-npm-package-name')
2224

2325
view.usage = usage(
2426
'view',
@@ -32,31 +34,25 @@ view.completion = function (opts, cb) {
3234
return cb()
3335
}
3436
// have the package, get the fields.
35-
var tag = npm.config.get('tag')
36-
mapToRegistry(opts.conf.argv.remain[2], npm.config, function (er, uri, auth) {
37-
if (er) return cb(er)
38-
39-
npm.registry.get(uri, { auth: auth }, function (er, d) {
40-
if (er) return cb(er)
41-
var dv = d.versions[d['dist-tags'][tag]]
42-
var fields = []
43-
d.versions = Object.keys(d.versions).sort(semver.compareLoose)
44-
fields = getFields(d).concat(getFields(dv))
45-
cb(null, fields)
46-
})
47-
})
37+
const tag = npm.config.get('tag')
38+
const spec = npa(opts.conf.argv.remain[2])
39+
return fetch.json(spec.escapedName, config({spec})).then(d => {
40+
const dv = d.versions[d['dist-tags'][tag]]
41+
d.versions = Object.keys(d.versions).sort(semver.compareLoose)
42+
return getFields(d).concat(getFields(dv))
43+
}).nodeify(cb)
4844

4945
function getFields (d, f, pref) {
5046
f = f || []
5147
if (!d) return f
5248
pref = pref || []
5349
Object.keys(d).forEach(function (k) {
5450
if (k.charAt(0) === '_' || k.indexOf('.') !== -1) return
55-
var p = pref.concat(k).join('.')
51+
const p = pref.concat(k).join('.')
5652
f.push(p)
5753
if (Array.isArray(d[k])) {
5854
d[k].forEach(function (val, i) {
59-
var pi = p + '[' + i + ']'
55+
const pi = p + '[' + i + ']'
6056
if (val && typeof val === 'object') getFields(val, f, [p])
6157
else f.push(pi)
6258
})
@@ -76,28 +72,28 @@ function view (args, silent, cb) {
7672

7773
if (!args.length) args = ['.']
7874

79-
var pkg = args.shift()
80-
var nv
75+
const pkg = args.shift()
76+
let nv
8177
if (/^[.]@/.test(pkg)) {
8278
nv = npa.resolve(null, pkg.slice(2))
8379
} else {
8480
nv = npa(pkg)
8581
}
86-
var name = nv.name
87-
var local = (name === '.' || !name)
82+
const name = nv.name
83+
const local = (name === '.' || !name)
8884

8985
if (npm.config.get('global') && local) {
9086
return cb(new Error('Cannot use view command in global mode.'))
9187
}
9288

9389
if (local) {
94-
var dir = npm.prefix
90+
const dir = npm.prefix
9591
readJson(path.resolve(dir, 'package.json'), function (er, d) {
9692
d = d || {}
9793
if (er && er.code !== 'ENOENT' && er.code !== 'ENOTDIR') return cb(er)
9894
if (!d.name) return cb(new Error('Invalid package.json'))
9995

100-
var p = d.name
96+
const p = d.name
10197
nv = npa(p)
10298
if (pkg && ~pkg.indexOf('@')) {
10399
nv.rawSpec = pkg.split('@')[pkg.indexOf('@')]
@@ -112,72 +108,91 @@ function view (args, silent, cb) {
112108

113109
function fetchAndRead (nv, args, silent, cb) {
114110
// get the data about this package
115-
var name = nv.name
116-
var version = nv.rawSpec || npm.config.get('tag')
117-
118-
mapToRegistry(name, npm.config, function (er, uri, auth) {
119-
if (er) return cb(er)
120-
121-
npm.registry.get(uri, { auth: auth }, function (er, data) {
122-
if (er) return cb(er)
123-
if (data['dist-tags'] && data['dist-tags'][version]) {
124-
version = data['dist-tags'][version]
125-
}
126-
127-
if (data.time && data.time.unpublished) {
128-
var u = data.time.unpublished
129-
er = new Error('Unpublished by ' + u.name + ' on ' + u.time)
130-
er.statusCode = 404
131-
er.code = 'E404'
132-
er.pkgid = data._id
133-
return cb(er, data)
111+
const name = nv.name
112+
let version = nv.rawSpec || npm.config.get('tag')
113+
114+
return fetch.json(name, config({
115+
spec: nv,
116+
'prefer-online': true
117+
})).catch(err => {
118+
// TODO - this should probably go into pacote, but the tests expect it.
119+
if (err.code === 'E404') {
120+
err.message = `'${nv.name}' is not in the npm registry.`
121+
const validated = validateName(nv.name)
122+
if (!validated.validForNewPackages) {
123+
err.message += '\n'
124+
err.message += (validated.errors || []).join('\n')
125+
err.message += (validated.warnings || []).join('\n')
126+
} else {
127+
err.message += '\nYou should bug the author to publish it'
128+
err.message += '\n(or use the name yourself!)'
129+
err.message += '\n'
130+
err.message += '\nNote that you can also install from a'
131+
err.message += '\ntarball, folder, http url, or git url.'
134132
}
133+
}
134+
throw err
135+
}).then(data => {
136+
if (data['dist-tags'] && data['dist-tags'][version]) {
137+
version = data['dist-tags'][version]
138+
}
135139

136-
var results = []
137-
var error = null
138-
var versions = data.versions || {}
139-
data.versions = Object.keys(versions).sort(semver.compareLoose)
140-
if (!args.length) args = ['']
141-
142-
// remove readme unless we asked for it
143-
if (args.indexOf('readme') === -1) {
144-
delete data.readme
145-
}
140+
if (data.time && data.time.unpublished) {
141+
const u = data.time.unpublished
142+
let er = new Error('Unpublished by ' + u.name + ' on ' + u.time)
143+
er.statusCode = 404
144+
er.code = 'E404'
145+
er.pkgid = data._id
146+
throw er
147+
}
146148

147-
Object.keys(versions).forEach(function (v) {
148-
if (semver.satisfies(v, version, true)) {
149-
args.forEach(function (args) {
150-
// remove readme unless we asked for it
151-
if (args.indexOf('readme') !== -1) {
152-
delete versions[v].readme
153-
}
154-
results.push(showFields(data, versions[v], args))
155-
})
156-
}
157-
})
158-
var retval = results.reduce(reducer, {})
149+
const results = []
150+
let error = null
151+
const versions = data.versions || {}
152+
data.versions = Object.keys(versions).sort(semver.compareLoose)
153+
if (!args.length) args = ['']
159154

160-
if (args.length === 1 && args[0] === '') {
161-
retval = cleanBlanks(retval)
162-
log.silly('cleanup', retval)
163-
}
155+
// remove readme unless we asked for it
156+
if (args.indexOf('readme') === -1) {
157+
delete data.readme
158+
}
164159

165-
if (error || silent) {
166-
cb(error, retval)
167-
} else if (
168-
!npm.config.get('json') &&
169-
args.length === 1 &&
170-
args[0] === ''
171-
) {
172-
data.version = version
173-
BB.all(results.map((v) => prettyView(data, v[Object.keys(v)[0]][''])))
174-
.nodeify(cb)
175-
.then(() => retval)
176-
} else {
177-
printData(retval, data._id, cb.bind(null, error, retval))
160+
Object.keys(versions).forEach(function (v) {
161+
if (semver.satisfies(v, version, true)) {
162+
args.forEach(function (args) {
163+
// remove readme unless we asked for it
164+
if (args.indexOf('readme') !== -1) {
165+
delete versions[v].readme
166+
}
167+
results.push(showFields(data, versions[v], args))
168+
})
178169
}
179170
})
180-
})
171+
let retval = results.reduce(reducer, {})
172+
173+
if (args.length === 1 && args[0] === '') {
174+
retval = cleanBlanks(retval)
175+
log.silly('cleanup', retval)
176+
}
177+
178+
if (silent) {
179+
} else if (error) {
180+
throw error
181+
} else if (
182+
!npm.config.get('json') &&
183+
args.length === 1 &&
184+
args[0] === ''
185+
) {
186+
data.version = version
187+
return BB.all(
188+
results.map((v) => prettyView(data, v[Object.keys(v)[0]]['']))
189+
).then(() => retval)
190+
} else {
191+
return BB.fromNode(cb => {
192+
printData(retval, data._id, cb)
193+
}).then(() => retval)
194+
}
195+
}).nodeify(cb)
181196
}
182197

183198
function prettyView (packument, manifest) {
@@ -312,7 +327,7 @@ function prettyView (packument, manifest) {
312327
}
313328

314329
function cleanBlanks (obj) {
315-
var clean = {}
330+
const clean = {}
316331
Object.keys(obj).forEach(function (version) {
317332
clean[version] = obj[version]['']
318333
})
@@ -334,7 +349,7 @@ function reducer (l, r) {
334349

335350
// return whatever was printed
336351
function showFields (data, version, fields) {
337-
var o = {}
352+
const o = {}
338353
;[data, version].forEach(function (s) {
339354
Object.keys(s).forEach(function (k) {
340355
o[k] = s[k]
@@ -344,18 +359,18 @@ function showFields (data, version, fields) {
344359
}
345360

346361
function search (data, fields, version, title) {
347-
var field
348-
var tail = fields
362+
let field
363+
const tail = fields
349364
while (!field && fields.length) field = tail.shift()
350365
fields = [field].concat(tail)
351-
var o
366+
let o
352367
if (!field && !tail.length) {
353368
o = {}
354369
o[version] = {}
355370
o[version][title] = data
356371
return o
357372
}
358-
var index = field.match(/(.+)\[([^\]]+)\]$/)
373+
let index = field.match(/(.+)\[([^\]]+)\]$/)
359374
if (index) {
360375
field = index[1]
361376
index = index[2]
@@ -369,10 +384,10 @@ function search (data, fields, version, title) {
369384
if (data.length === 1) {
370385
return search(data[0], fields, version, title)
371386
}
372-
var results = []
387+
let results = []
373388
data.forEach(function (data, i) {
374-
var tl = title.length
375-
var newt = title.substr(0, tl - fields.join('.').length - 1) +
389+
const tl = title.length
390+
const newt = title.substr(0, tl - fields.join('.').length - 1) +
376391
'[' + i + ']' + [''].concat(fields).join('.')
377392
results.push(search(data, fields.slice(), version, newt))
378393
})
@@ -396,18 +411,18 @@ function search (data, fields, version, title) {
396411
}
397412

398413
function printData (data, name, cb) {
399-
var versions = Object.keys(data)
400-
var msg = ''
401-
var msgJson = []
402-
var includeVersions = versions.length > 1
403-
var includeFields
414+
const versions = Object.keys(data)
415+
let msg = ''
416+
let msgJson = []
417+
const includeVersions = versions.length > 1
418+
let includeFields
404419

405420
versions.forEach(function (v) {
406-
var fields = Object.keys(data[v])
421+
const fields = Object.keys(data[v])
407422
includeFields = includeFields || (fields.length > 1)
408423
if (npm.config.get('json')) msgJson.push({})
409424
fields.forEach(function (f) {
410-
var d = cleanup(data[v][f])
425+
let d = cleanup(data[v][f])
411426
if (fields.length === 1 && npm.config.get('json')) {
412427
msgJson[msgJson.length - 1][f] = d
413428
}
@@ -431,7 +446,7 @@ function printData (data, name, cb) {
431446

432447
if (npm.config.get('json')) {
433448
if (msgJson.length && Object.keys(msgJson[0]).length === 1) {
434-
var k = Object.keys(msgJson[0])[0]
449+
const k = Object.keys(msgJson[0])[0]
435450
msgJson = msgJson.map(function (m) { return m[k] })
436451
}
437452

@@ -465,7 +480,7 @@ function cleanup (data) {
465480
data.versions = Object.keys(data.versions || {})
466481
}
467482

468-
var keys = Object.keys(data)
483+
let keys = Object.keys(data)
469484
keys.forEach(function (d) {
470485
if (d.charAt(0) === '_') delete data[d]
471486
else if (typeof data[d] === 'object') data[d] = cleanup(data[d])

test/tap/view.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ test('npm view . with no published package', function (t) {
9797
], { cwd: t3dir }, function (err, code, stdout, stderr) {
9898
t.ifError(err, 'view command finished successfully')
9999
t.equal(code, 1, 'exit not ok')
100-
t.similar(stderr, /version not found/m)
100+
t.similar(stderr, /not in the npm registry/m)
101101
t.end()
102102
})
103103
})

0 commit comments

Comments
 (0)