11/* eslint-disable standard/no-callback-literal */
22module . exports = distTag
33
4- var log = require ( 'npmlog' )
5- var npa = require ( 'npm-package-arg' )
6- var semver = require ( 'semver' )
7-
8- var npm = require ( './npm.js' )
9- var mapToRegistry = require ( './utils/map-to-registry.js' )
10- var readLocalPkg = require ( './utils/read-local-package.js' )
11- var usage = require ( './utils/usage' )
12- var output = require ( './utils/output.js' )
4+ const BB = require ( 'bluebird' )
5+
6+ const figgyPudding = require ( 'figgy-pudding' )
7+ const log = require ( 'npmlog' )
8+ const npa = require ( 'libnpm/parse-arg' )
9+ const npmConfig = require ( './config/figgy-config.js' )
10+ const output = require ( './utils/output.js' )
11+ const otplease = require ( './utils/otplease.js' )
12+ const readLocalPkg = BB . promisify ( require ( './utils/read-local-package.js' ) )
13+ const regFetch = require ( 'libnpm/fetch' )
14+ const semver = require ( 'semver' )
15+ const usage = require ( './utils/usage' )
16+
17+ const DistTagOpts = figgyPudding ( {
18+ tag : { }
19+ } )
1320
1421distTag . usage = usage (
1522 'dist-tag' ,
@@ -30,130 +37,127 @@ distTag.completion = function (opts, cb) {
3037 }
3138}
3239
33- function distTag ( args , cb ) {
34- var cmd = args . shift ( )
35- switch ( cmd ) {
36- case 'add' : case 'a' : case 'set' : case 's' :
37- return add ( args [ 0 ] , args [ 1 ] , cb )
38- case 'rm' : case 'r' : case 'del' : case 'd' : case 'remove' :
39- return remove ( args [ 1 ] , args [ 0 ] , cb )
40- case 'ls' : case 'l' : case 'sl' : case 'list' :
41- return list ( args [ 0 ] , cb )
42- default :
43- return list ( cmd , cb )
44- }
40+ function UsageError ( ) {
41+ throw Object . assign ( new Error ( 'Usage:\n' + distTag . usage ) , {
42+ code : 'EUSAGE'
43+ } )
4544}
4645
47- function add ( spec , tag , cb ) {
48- var thing = npa ( spec || '' )
49- var pkg = thing . name
50- var version = thing . rawSpec
51- var t = ( tag || npm . config . get ( 'tag' ) ) . trim ( )
46+ function distTag ( [ cmd , pkg , tag ] , cb ) {
47+ const opts = DistTagOpts ( npmConfig ( ) )
48+ return BB . try ( ( ) => {
49+ switch ( cmd ) {
50+ case 'add' : case 'a' : case 'set' : case 's' :
51+ return add ( pkg , tag , opts )
52+ case 'rm' : case 'r' : case 'del' : case 'd' : case 'remove' :
53+ return remove ( pkg , tag , opts )
54+ case 'ls' : case 'l' : case 'sl' : case 'list' :
55+ return list ( pkg , opts )
56+ default :
57+ if ( ! pkg ) {
58+ return list ( cmd , opts )
59+ } else {
60+ UsageError ( )
61+ }
62+ }
63+ } ) . then (
64+ x => cb ( null , x ) ,
65+ err => {
66+ if ( err . code === 'EUSAGE' ) {
67+ cb ( err . message )
68+ } else {
69+ cb ( err )
70+ }
71+ }
72+ )
73+ }
5274
53- log . verbose ( 'dist-tag add' , t , 'to' , pkg + '@' + version )
75+ function add ( spec , tag , opts ) {
76+ spec = npa ( spec || '' )
77+ const version = spec . rawSpec
78+ const t = ( tag || opts . tag ) . trim ( )
5479
55- if ( ! pkg || ! version || ! t ) return cb ( 'Usage:\n' + distTag . usage )
80+ log . verbose ( 'dist-tag add' , t , 'to' , spec . name + '@' + version )
81+
82+ if ( ! spec || ! version || ! t ) UsageError ( )
5683
5784 if ( semver . validRange ( t ) ) {
58- var er = new Error ( 'Tag name must not be a valid SemVer range: ' + t )
59- return cb ( er )
85+ throw new Error ( 'Tag name must not be a valid SemVer range: ' + t )
6086 }
6187
62- fetchTags ( pkg , function ( er , tags ) {
63- if ( er ) return cb ( er )
64-
88+ return fetchTags ( spec , opts ) . then ( tags => {
6589 if ( tags [ t ] === version ) {
6690 log . warn ( 'dist-tag add' , t , 'is already set to version' , version )
67- return cb ( )
91+ return
6892 }
6993 tags [ t ] = version
70-
71- mapToRegistry ( pkg , npm . config , function ( er , uri , auth , base ) {
72- var params = {
73- 'package' : pkg ,
74- distTag : t ,
75- version : version ,
76- auth : auth
77- }
78-
79- npm . registry . distTags . add ( base , params , function ( er ) {
80- if ( er ) return cb ( er )
81-
82- output ( '+' + t + ': ' + pkg + '@' + version )
83- cb ( )
84- } )
94+ const url = `/-/package/${ spec . escapedName } /dist-tags/${ encodeURIComponent ( t ) } `
95+ const reqOpts = opts . concat ( {
96+ method : 'PUT' ,
97+ body : JSON . stringify ( version ) ,
98+ headers : {
99+ 'content-type' : 'application/json'
100+ } ,
101+ spec
102+ } )
103+ return otplease ( reqOpts , reqOpts => regFetch ( url , reqOpts ) ) . then ( ( ) => {
104+ output ( `+${ t } : ${ spec . name } @${ version } ` )
85105 } )
86106 } )
87107}
88108
89- function remove ( tag , pkg , cb ) {
90- log . verbose ( 'dist-tag del' , tag , 'from' , pkg )
91-
92- fetchTags ( pkg , function ( er , tags ) {
93- if ( er ) return cb ( er )
109+ function remove ( spec , tag , opts ) {
110+ spec = npa ( spec || '' )
111+ log . verbose ( 'dist-tag del' , tag , 'from' , spec . name )
94112
113+ return fetchTags ( spec , opts ) . then ( tags => {
95114 if ( ! tags [ tag ] ) {
96- log . info ( 'dist-tag del' , tag , 'is not a dist-tag on' , pkg )
97- return cb ( new Error ( tag + ' is not a dist-tag on ' + pkg ) )
115+ log . info ( 'dist-tag del' , tag , 'is not a dist-tag on' , spec . name )
116+ throw new Error ( tag + ' is not a dist-tag on ' + spec . name )
98117 }
99-
100- var version = tags [ tag ]
118+ const version = tags [ tag ]
101119 delete tags [ tag ]
102-
103- mapToRegistry ( pkg , npm . config , function ( er , uri , auth , base ) {
104- var params = {
105- 'package' : pkg ,
106- distTag : tag ,
107- auth : auth
108- }
109-
110- npm . registry . distTags . rm ( base , params , function ( er ) {
111- if ( er ) return cb ( er )
112-
113- output ( '-' + tag + ': ' + pkg + '@' + version )
114- cb ( )
115- } )
120+ const url = `/-/package/${ spec . escapedName } /dist-tags/${ encodeURIComponent ( tag ) } `
121+ const reqOpts = opts . concat ( {
122+ method : 'DELETE'
123+ } )
124+ return otplease ( reqOpts , reqOpts => regFetch ( url , reqOpts ) ) . then ( ( ) => {
125+ output ( `-${ tag } : ${ spec . name } @${ version } ` )
116126 } )
117127 } )
118128}
119129
120- function list ( pkg , cb ) {
121- if ( ! pkg ) {
122- return readLocalPkg ( function ( er , pkg ) {
123- if ( er ) return cb ( er )
124- if ( ! pkg ) return cb ( distTag . usage )
125- list ( pkg , cb )
130+ function list ( spec , opts ) {
131+ if ( ! spec ) {
132+ return readLocalPkg ( ) . then ( pkg => {
133+ if ( ! pkg ) { UsageError ( ) }
134+ return list ( pkg , opts )
126135 } )
127136 }
137+ spec = npa ( spec )
128138
129- fetchTags ( pkg , function ( er , tags ) {
130- if ( er ) {
131- log . error ( 'dist-tag ls' , "Couldn't get dist-tag data for" , pkg )
132- return cb ( er )
133- }
134- var msg = Object . keys ( tags ) . map ( function ( k ) {
135- return k + ': ' + tags [ k ]
136- } ) . sort ( ) . join ( '\n' )
139+ return fetchTags ( spec , opts ) . then ( tags => {
140+ var msg = Object . keys ( tags ) . map ( k => `${ k } : ${ tags [ k ] } ` ) . sort ( ) . join ( '\n' )
137141 output ( msg )
138- cb ( er , tags )
142+ return tags
143+ } , err => {
144+ log . error ( 'dist-tag ls' , "Couldn't get dist-tag data for" , spec )
145+ throw err
139146 } )
140147}
141148
142- function fetchTags ( pkg , cb ) {
143- mapToRegistry ( pkg , npm . config , function ( er , uri , auth , base ) {
144- if ( er ) return cb ( er )
145-
146- var params = {
147- 'package' : pkg ,
148- auth : auth
149- }
150- npm . registry . distTags . fetch ( base , params , function ( er , tags ) {
151- if ( er ) return cb ( er )
152- if ( ! tags || ! Object . keys ( tags ) . length ) {
153- return cb ( new Error ( 'No dist-tags found for ' + pkg ) )
154- }
155-
156- cb ( null , tags )
149+ function fetchTags ( spec , opts ) {
150+ return regFetch . json (
151+ `/-/package/${ spec . escapedName } /dist-tags` ,
152+ opts . concat ( {
153+ 'prefer-online' : true ,
154+ spec
157155 } )
156+ ) . then ( data => {
157+ if ( data && typeof data === 'object' ) delete data . _etag
158+ if ( ! data || ! Object . keys ( data ) . length ) {
159+ throw new Error ( 'No dist-tags found for ' + spec . name )
160+ }
161+ return data
158162 } )
159163}
0 commit comments