-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathnpm.js
More file actions
70 lines (50 loc) · 1.87 KB
/
npm.js
File metadata and controls
70 lines (50 loc) · 1.87 KB
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
'use strict';
const Somever = require('@hapi/somever');
const { Service } = require('@hapipal/schmervice');
const Helpers = require('../helpers');
module.exports = class Npm extends Service {
packageName(pkg, version) {
if (!pkg.scopedBegin) {
return pkg.name;
}
if (version === 'latest' || Somever.version(version).compare(pkg.scopedBegin) >= 0) {
return `@hapipal/${pkg.name}`;
}
return pkg.name;
}
async version(pkg) {
const pkgName = this.packageName(pkg, 'latest');
const url = `https://registry.npmjs.org/${pkgName}/latest`;
const { payload } = await Helpers.http.get(url, { json: true });
return payload.version;
}
async versions(pkg) {
const getVersions = async (name) => {
const url = `https://registry.npmjs.org/${name}`;
const { payload } = await Helpers.http.get(url, { json: true });
return Object.keys(payload.versions);
};
const pkgName = pkg.name;
const maybeScopedPkgName = this.packageName(pkg, 'latest');
const versions = await Promise.all([
getVersions(pkgName),
pkgName !== maybeScopedPkgName ? getVersions(maybeScopedPkgName) : []
]);
const byVersionDescending = (a, b) => Somever.version(b).compare(a);
return versions.flat().sort(byVersionDescending);
}
static get caching() {
return {
version: {
expiresIn: 15 * Helpers.time.oneMinuteInMs,
generateTimeout: Helpers.time.oneMinuteInMs,
generateKey: (pkg) => pkg.name
},
versions: {
expiresIn: 15 * Helpers.time.oneMinuteInMs,
generateTimeout: Helpers.time.oneMinuteInMs,
generateKey: (pkg) => pkg.name
}
};
}
};