@@ -14,69 +14,73 @@ const UnpublishConfig = figgyPudding({
1414module . exports = unpublish
1515function unpublish ( spec , opts ) {
1616 opts = UnpublishConfig ( opts )
17- spec = npa ( spec )
18- const pkgUri = spec . escapedName
19- return npmFetch . json ( pkgUri , opts . concat ( {
20- query : { write : true }
21- } ) ) . then ( pkg => {
22- if ( ! spec . rawSpec || spec . rawSpec === '*' ) {
23- return npmFetch ( `${ pkgUri } /-rev/${ pkg . _rev } ` , opts . concat ( {
24- method : 'DELETE' ,
25- ignoreBody : true
26- } ) )
27- } else {
28- const version = spec . rawSpec
29- const allVersions = pkg . versions || { }
30- const versionPublic = allVersions [ version ]
31- let dist
32- if ( versionPublic ) {
33- dist = allVersions [ version ] . dist
34- }
35- delete allVersions [ version ]
36- // if it was the only version, then delete the whole package.
37- if ( ! Object . keys ( allVersions ) . length ) {
17+ return new opts . Promise ( resolve => resolve ( ) ) . then ( ( ) => {
18+ spec = npa ( spec )
19+ // NOTE: spec is used to pick the appropriate registry/auth combo.
20+ opts = opts . concat ( { spec } )
21+ const pkgUri = spec . escapedName
22+ return npmFetch . json ( pkgUri , opts . concat ( {
23+ query : { write : true }
24+ } ) ) . then ( pkg => {
25+ if ( ! spec . rawSpec || spec . rawSpec === '*' ) {
3826 return npmFetch ( `${ pkgUri } /-rev/${ pkg . _rev } ` , opts . concat ( {
3927 method : 'DELETE' ,
4028 ignoreBody : true
4129 } ) )
42- } else if ( versionPublic ) {
43- const latestVer = pkg [ 'dist-tags' ] . latest
44- Object . keys ( pkg [ 'dist-tags' ] ) . forEach ( tag => {
45- if ( pkg [ 'dist-tags' ] [ tag ] === version ) {
46- delete pkg [ 'dist-tags' ] [ tag ]
47- }
48- } )
49-
50- if ( latestVer === version ) {
51- pkg [ 'dist-tags' ] . latest = Object . keys (
52- allVersions
53- ) . sort ( semver . compareLoose ) . pop ( )
30+ } else {
31+ const version = spec . rawSpec
32+ const allVersions = pkg . versions || { }
33+ const versionPublic = allVersions [ version ]
34+ let dist
35+ if ( versionPublic ) {
36+ dist = allVersions [ version ] . dist
5437 }
38+ delete allVersions [ version ]
39+ // if it was the only version, then delete the whole package.
40+ if ( ! Object . keys ( allVersions ) . length ) {
41+ return npmFetch ( `${ pkgUri } /-rev/${ pkg . _rev } ` , opts . concat ( {
42+ method : 'DELETE' ,
43+ ignoreBody : true
44+ } ) )
45+ } else if ( versionPublic ) {
46+ const latestVer = pkg [ 'dist-tags' ] . latest
47+ Object . keys ( pkg [ 'dist-tags' ] ) . forEach ( tag => {
48+ if ( pkg [ 'dist-tags' ] [ tag ] === version ) {
49+ delete pkg [ 'dist-tags' ] [ tag ]
50+ }
51+ } )
5552
56- delete pkg . _revisions
57- delete pkg . _attachments
58- // Update packument with removed versions
59- return npmFetch ( `${ pkgUri } /-rev/${ pkg . _rev } ` , opts . concat ( {
60- method : 'PUT' ,
61- body : pkg ,
62- ignoreBody : true
63- } ) ) . then ( ( ) => {
64- // Remove the tarball itself
65- return npmFetch . json ( pkgUri , opts . concat ( {
66- query : { write : true }
67- } ) ) . then ( ( { _rev, _id } ) => {
68- const tarballUrl = url . parse ( dist . tarball ) . pathname . substr ( 1 )
69- return npmFetch ( `${ tarballUrl } /-rev/${ _rev } ` , opts . concat ( {
70- method : 'DELETE' ,
71- ignoreBody : true
72- } ) )
53+ if ( latestVer === version ) {
54+ pkg [ 'dist-tags' ] . latest = Object . keys (
55+ allVersions
56+ ) . sort ( semver . compareLoose ) . pop ( )
57+ }
58+
59+ delete pkg . _revisions
60+ delete pkg . _attachments
61+ // Update packument with removed versions
62+ return npmFetch ( `${ pkgUri } /-rev/${ pkg . _rev } ` , opts . concat ( {
63+ method : 'PUT' ,
64+ body : pkg ,
65+ ignoreBody : true
66+ } ) ) . then ( ( ) => {
67+ // Remove the tarball itself
68+ return npmFetch . json ( pkgUri , opts . concat ( {
69+ query : { write : true }
70+ } ) ) . then ( ( { _rev, _id } ) => {
71+ const tarballUrl = url . parse ( dist . tarball ) . pathname . substr ( 1 )
72+ return npmFetch ( `${ tarballUrl } /-rev/${ _rev } ` , opts . concat ( {
73+ method : 'DELETE' ,
74+ ignoreBody : true
75+ } ) )
76+ } )
7377 } )
74- } )
78+ }
79+ }
80+ } , err => {
81+ if ( err . code !== 'E404' ) {
82+ throw err
7583 }
76- }
77- } , err => {
78- if ( err . code !== 'E404' ) {
79- throw err
80- }
81- } )
84+ } )
85+ } ) . then ( ( ) => true )
8286}
0 commit comments