-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathinfo.js
72 lines (61 loc) · 1.76 KB
/
info.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
'use strict';
var extend = require('extend');
var format = require('util').format;
var request = require('./request');
var util = require('./util');
var debug = require('debug')('spm-client:info');
/*
info(args, config)
* args
* name: the package name
* version: the package version
* config: see client.config
*/
module.exports = function* info(args, config) {
args = extend({}, require('./config')(), config, args);
// name@tag
if (args.version && args.version.indexOf('.') === -1) {
args.tag = args.version;
delete args.version;
}
var req = {};
if (args.version) {
req.url = format('%s/repository/%s/%s/', args.registry, args.name, args.version);
} else {
req.url = format('%s/repository/%s/', args.registry, args.name);
}
req.method = 'GET';
req.json = true;
debug('get package info %s@%s~%s url %s',
args.name, args.version || '-', args.tag || '-', req.url);
var res = yield* request(req);
util.errorHandle(req, res);
var body = args.tag ? getPackageWithTag(res.body, args) : getPackage(res.body, args);
if (!body) {
var err = new Error('no matched package ' + args.name + (args.tag ? ' ~ ' + args.tag : ''));
err.statusCode = res.statusCode;
throw err;
}
debug('response body %j', body);
return body;
};
function getPackageWithTag(body, args) {
var version = Object.keys(body.packages)
.filter(function(version) {
return body.packages[version].tag === args.tag;
})
.sort(function(a, b){
return a < b;
})[0];
if (!version) return null;
return body.packages[version];
}
function getPackage(body, args) {
if (!body.packages) return body;
if (args.version) {
debug('get package version %s', args.version);
return body.packages[args.version];
} else {
return body;
}
}