Skip to content
This repository was archived by the owner on Aug 11, 2022. It is now read-only.

Commit dc51810

Browse files
committed
add 'npm dist-tag {add,del,list}'
1 parent b5b0e3c commit dc51810

5 files changed

Lines changed: 361 additions & 9 deletions

File tree

‎lib/dist-tag.js‎

Lines changed: 151 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,151 @@
1+
module.exports = distTag
2+
3+
var log = require("npmlog")
4+
var npa = require("npm-package-arg")
5+
var semver = require("semver")
6+
7+
var npm = require("./npm.js")
8+
var mapToRegistry = require("./utils/map-to-registry.js")
9+
var readLocalPkg = require("./utils/read-local-package.js")
10+
11+
distTag.usage = "npm dist-tag add <pkg>@<version> [<tag>]"
12+
+ "\nnpm dist-tag rm <pkg> <tag>"
13+
+ "\nnpm dist-tag ls [<pkg>]"
14+
15+
distTag.completion = function (opts, cb) {
16+
var argv = opts.conf.argv.remain
17+
if (argv.length === 2) {
18+
return cb(null, ["add", "rm", "ls"])
19+
}
20+
21+
switch (argv[2]) {
22+
default:
23+
return cb()
24+
}
25+
}
26+
27+
function distTag (args, cb) {
28+
var cmd = args.shift()
29+
switch (cmd) {
30+
case "add": case "a": case "set": case "s":
31+
return add(args[0], args[1], cb)
32+
case "rm": case "r": case "del": case "d": case "remove":
33+
return remove(args[1], args[0], cb)
34+
case "ls": case "l": case "sl": case "list":
35+
return list(args[0], cb)
36+
default:
37+
return cb("Usage:\n"+distTag.usage)
38+
}
39+
}
40+
41+
function add (spec, tag, cb) {
42+
var thing = npa(spec || "")
43+
var pkg = thing.name
44+
var version = thing.rawSpec
45+
var t = (tag || npm.config.get("tag")).trim()
46+
47+
log.verbose("dist-tag add", t, "to", pkg+"@"+version)
48+
49+
if (!pkg || !version || !t) return cb("Usage:\n"+distTag.usage)
50+
51+
if (semver.validRange(t)) {
52+
var er = new Error("Tag name must not be a valid SemVer range: " + t)
53+
return cb(er)
54+
}
55+
56+
fetchTags(pkg, function (er, tags) {
57+
if (er) return cb(er)
58+
59+
if (tags[t] === version) {
60+
log.warn("dist-tag add", t, "is already set to version", version)
61+
return cb()
62+
}
63+
tags[t] = version
64+
65+
mapToRegistry(pkg, npm.config, function (er, uri, auth, base) {
66+
var params = {
67+
package : pkg,
68+
distTag : t,
69+
version : version,
70+
auth : auth
71+
}
72+
73+
npm.registry.distTags.add(base, params, function (er) {
74+
if (er) return cb(er)
75+
76+
console.log("+"+t+": "+pkg+"@"+version)
77+
cb()
78+
})
79+
})
80+
})
81+
}
82+
83+
function remove (tag, pkg, cb) {
84+
log.verbose("dist-tag del", tag, "from", pkg)
85+
86+
fetchTags(pkg, function (er, tags) {
87+
if (er) return cb(er)
88+
89+
if (!tags[tag]) {
90+
log.info("dist-tag del", tag, "is not a dist-tag on", pkg)
91+
return cb(new Error(tag+" is not a dist-tag on "+pkg))
92+
}
93+
94+
var version = tags[tag]
95+
delete tags[tag]
96+
97+
mapToRegistry(pkg, npm.config, function (er, uri, auth, base) {
98+
var params = {
99+
package : pkg,
100+
distTag : tag,
101+
auth : auth
102+
}
103+
104+
npm.registry.distTags.rm(base, params, function (er) {
105+
if (er) return cb(er)
106+
107+
console.log("-"+tag+": "+pkg+"@"+version)
108+
cb()
109+
})
110+
})
111+
})
112+
}
113+
114+
function list (pkg, cb) {
115+
if (!pkg) return readLocalPkg(function (er, pkg) {
116+
if (er) return cb(er)
117+
if (!pkg) return cb(distTag.usage)
118+
list(pkg, cb)
119+
})
120+
121+
fetchTags(pkg, function (er, tags) {
122+
if (er) {
123+
log.error("dist-tag ls", "Couldn't get dist-tag data for", pkg)
124+
return cb(er)
125+
}
126+
var msg = Object.keys(tags).map(function (k) {
127+
return k+": "+tags[k]
128+
}).sort().join("\n")
129+
console.log(msg)
130+
cb(er, tags)
131+
})
132+
}
133+
134+
function fetchTags (pkg, cb) {
135+
mapToRegistry(pkg, npm.config, function (er, uri, auth, base) {
136+
if (er) return cb(er)
137+
138+
var params = {
139+
package : pkg,
140+
auth : auth
141+
}
142+
npm.registry.distTags.fetch(base, params, function (er, tags) {
143+
if (er) return cb(er)
144+
if (!tags || !Object.keys(tags).length) {
145+
return cb(new Error("No dist-tags found for " + pkg))
146+
}
147+
148+
cb(null, tags)
149+
})
150+
})
151+
}

‎lib/npm.js‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ var commandCache = {}
6767
, "isntall" : "install"
6868
, "up" : "update"
6969
, "c" : "config"
70+
, "dist-tags" : "dist-tag"
7071
, "info" : "view"
7172
, "show" : "view"
7273
, "find" : "search"
@@ -132,6 +133,7 @@ var commandCache = {}
132133
, "prefix"
133134
, "bin"
134135
, "whoami"
136+
, "dist-tag"
135137

136138
, "test"
137139
, "stop"

‎lib/owner.js‎

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ owner.usage = "npm owner add <username> <pkg>"
66

77
var npm = require("./npm.js")
88
, log = require("npmlog")
9-
, readJson = require("read-package-json")
109
, mapToRegistry = require("./utils/map-to-registry.js")
10+
, readLocalPkg = require("./utils/read-local-package.js")
1111

1212
owner.completion = function (opts, cb) {
1313
var argv = opts.conf.argv.remain
@@ -252,14 +252,6 @@ function mutate (pkg, user, mutation, cb) {
252252
}
253253
}
254254

255-
function readLocalPkg (cb) {
256-
if (npm.config.get("global")) return cb()
257-
var path = require("path")
258-
readJson(path.resolve(npm.prefix, "package.json"), function (er, d) {
259-
return cb(er, d && d.name)
260-
})
261-
}
262-
263255
function unknown (action, cb) {
264256
cb("Usage: \n" + owner.usage)
265257
}

‎lib/utils/read-local-package.js‎

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
exports = module.exports = readLocalPkg
2+
3+
var npm = require("../npm.js")
4+
, readJson = require("read-package-json")
5+
6+
function readLocalPkg (cb) {
7+
if (npm.config.get("global")) return cb()
8+
var path = require("path")
9+
readJson(path.resolve(npm.prefix, "package.json"), function (er, d) {
10+
return cb(er, d && d.name)
11+
})
12+
}

0 commit comments

Comments
 (0)