UNPKG

3.64 kBJavaScriptView Raw
1module.exports = distTag
2
3var log = require("npmlog")
4var npa = require("npm-package-arg")
5var semver = require("semver")
6
7var npm = require("./npm.js")
8var mapToRegistry = require("./utils/map-to-registry.js")
9var readLocalPkg = require("./utils/read-local-package.js")
10
11distTag.usage = "npm dist-tag add <pkg>@<version> [<tag>]"
12 + "\nnpm dist-tag rm <pkg> <tag>"
13 + "\nnpm dist-tag ls [<pkg>]"
14
15distTag.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
27function 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
41function 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
83function 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
114function 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
134function 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}