@@ -8,17 +8,19 @@ const BB = require('bluebird')
8
8
const byteSize = require ( 'byte-size' )
9
9
const color = require ( 'ansicolors' )
10
10
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' )
11
18
const relativeDate = require ( 'tiny-relative-date' )
19
+ const semver = require ( 'semver' )
12
20
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' )
22
24
23
25
view . usage = usage (
24
26
'view' ,
@@ -32,31 +34,25 @@ view.completion = function (opts, cb) {
32
34
return cb ( )
33
35
}
34
36
// 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 )
48
44
49
45
function getFields ( d , f , pref ) {
50
46
f = f || [ ]
51
47
if ( ! d ) return f
52
48
pref = pref || [ ]
53
49
Object . keys ( d ) . forEach ( function ( k ) {
54
50
if ( k . charAt ( 0 ) === '_' || k . indexOf ( '.' ) !== - 1 ) return
55
- var p = pref . concat ( k ) . join ( '.' )
51
+ const p = pref . concat ( k ) . join ( '.' )
56
52
f . push ( p )
57
53
if ( Array . isArray ( d [ k ] ) ) {
58
54
d [ k ] . forEach ( function ( val , i ) {
59
- var pi = p + '[' + i + ']'
55
+ const pi = p + '[' + i + ']'
60
56
if ( val && typeof val === 'object' ) getFields ( val , f , [ p ] )
61
57
else f . push ( pi )
62
58
} )
@@ -76,28 +72,28 @@ function view (args, silent, cb) {
76
72
77
73
if ( ! args . length ) args = [ '.' ]
78
74
79
- var pkg = args . shift ( )
80
- var nv
75
+ const pkg = args . shift ( )
76
+ let nv
81
77
if ( / ^ [ . ] @ / . test ( pkg ) ) {
82
78
nv = npa . resolve ( null , pkg . slice ( 2 ) )
83
79
} else {
84
80
nv = npa ( pkg )
85
81
}
86
- var name = nv . name
87
- var local = ( name === '.' || ! name )
82
+ const name = nv . name
83
+ const local = ( name === '.' || ! name )
88
84
89
85
if ( npm . config . get ( 'global' ) && local ) {
90
86
return cb ( new Error ( 'Cannot use view command in global mode.' ) )
91
87
}
92
88
93
89
if ( local ) {
94
- var dir = npm . prefix
90
+ const dir = npm . prefix
95
91
readJson ( path . resolve ( dir , 'package.json' ) , function ( er , d ) {
96
92
d = d || { }
97
93
if ( er && er . code !== 'ENOENT' && er . code !== 'ENOTDIR' ) return cb ( er )
98
94
if ( ! d . name ) return cb ( new Error ( 'Invalid package.json' ) )
99
95
100
- var p = d . name
96
+ const p = d . name
101
97
nv = npa ( p )
102
98
if ( pkg && ~ pkg . indexOf ( '@' ) ) {
103
99
nv . rawSpec = pkg . split ( '@' ) [ pkg . indexOf ( '@' ) ]
@@ -112,72 +108,91 @@ function view (args, silent, cb) {
112
108
113
109
function fetchAndRead ( nv , args , silent , cb ) {
114
110
// 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.'
134
132
}
133
+ }
134
+ throw err
135
+ } ) . then ( data => {
136
+ if ( data [ 'dist-tags' ] && data [ 'dist-tags' ] [ version ] ) {
137
+ version = data [ 'dist-tags' ] [ version ]
138
+ }
135
139
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
+ }
146
148
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 = [ '' ]
159
154
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
+ }
164
159
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
+ } )
178
169
}
179
170
} )
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 )
181
196
}
182
197
183
198
function prettyView ( packument , manifest ) {
@@ -312,7 +327,7 @@ function prettyView (packument, manifest) {
312
327
}
313
328
314
329
function cleanBlanks ( obj ) {
315
- var clean = { }
330
+ const clean = { }
316
331
Object . keys ( obj ) . forEach ( function ( version ) {
317
332
clean [ version ] = obj [ version ] [ '' ]
318
333
} )
@@ -334,7 +349,7 @@ function reducer (l, r) {
334
349
335
350
// return whatever was printed
336
351
function showFields ( data , version , fields ) {
337
- var o = { }
352
+ const o = { }
338
353
; [ data , version ] . forEach ( function ( s ) {
339
354
Object . keys ( s ) . forEach ( function ( k ) {
340
355
o [ k ] = s [ k ]
@@ -344,18 +359,18 @@ function showFields (data, version, fields) {
344
359
}
345
360
346
361
function search ( data , fields , version , title ) {
347
- var field
348
- var tail = fields
362
+ let field
363
+ const tail = fields
349
364
while ( ! field && fields . length ) field = tail . shift ( )
350
365
fields = [ field ] . concat ( tail )
351
- var o
366
+ let o
352
367
if ( ! field && ! tail . length ) {
353
368
o = { }
354
369
o [ version ] = { }
355
370
o [ version ] [ title ] = data
356
371
return o
357
372
}
358
- var index = field . match ( / ( .+ ) \[ ( [ ^ \] ] + ) \] $ / )
373
+ let index = field . match ( / ( .+ ) \[ ( [ ^ \] ] + ) \] $ / )
359
374
if ( index ) {
360
375
field = index [ 1 ]
361
376
index = index [ 2 ]
@@ -369,10 +384,10 @@ function search (data, fields, version, title) {
369
384
if ( data . length === 1 ) {
370
385
return search ( data [ 0 ] , fields , version , title )
371
386
}
372
- var results = [ ]
387
+ let results = [ ]
373
388
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 ) +
376
391
'[' + i + ']' + [ '' ] . concat ( fields ) . join ( '.' )
377
392
results . push ( search ( data , fields . slice ( ) , version , newt ) )
378
393
} )
@@ -396,18 +411,18 @@ function search (data, fields, version, title) {
396
411
}
397
412
398
413
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
404
419
405
420
versions . forEach ( function ( v ) {
406
- var fields = Object . keys ( data [ v ] )
421
+ const fields = Object . keys ( data [ v ] )
407
422
includeFields = includeFields || ( fields . length > 1 )
408
423
if ( npm . config . get ( 'json' ) ) msgJson . push ( { } )
409
424
fields . forEach ( function ( f ) {
410
- var d = cleanup ( data [ v ] [ f ] )
425
+ let d = cleanup ( data [ v ] [ f ] )
411
426
if ( fields . length === 1 && npm . config . get ( 'json' ) ) {
412
427
msgJson [ msgJson . length - 1 ] [ f ] = d
413
428
}
@@ -431,7 +446,7 @@ function printData (data, name, cb) {
431
446
432
447
if ( npm . config . get ( 'json' ) ) {
433
448
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 ]
435
450
msgJson = msgJson . map ( function ( m ) { return m [ k ] } )
436
451
}
437
452
@@ -465,7 +480,7 @@ function cleanup (data) {
465
480
data . versions = Object . keys ( data . versions || { } )
466
481
}
467
482
468
- var keys = Object . keys ( data )
483
+ let keys = Object . keys ( data )
469
484
keys . forEach ( function ( d ) {
470
485
if ( d . charAt ( 0 ) === '_' ) delete data [ d ]
471
486
else if ( typeof data [ d ] === 'object' ) data [ d ] = cleanup ( data [ d ] )
0 commit comments