2 const url = require('url');
3 const got = require('got');
4 const registryUrl = require('registry-url');
5 const registryAuthToken = require('registry-auth-token');
6 const semver = require('semver');
8 module.exports = (name, opts) => {
9 const scope = name.split('/')[0];
10 const regUrl = registryUrl(scope);
11 const pkgUrl = url.resolve(regUrl, encodeURIComponent(name).replace(/^%40/, '@'));
12 const authInfo = registryAuthToken(regUrl, {recursive: true});
14 opts = Object.assign({
19 accept: 'application/vnd.npm.install-v1+json; q=1.0, application/json; q=0.8, */*'
22 if (opts.fullMetadata) {
23 delete headers.accept;
27 headers.authorization = `${authInfo.type} ${authInfo.token}`;
30 return got(pkgUrl, {json: true, headers})
33 let version = opts.version;
35 if (opts.allVersions) {
39 if (data['dist-tags'][version]) {
40 data = data.versions[data['dist-tags'][version]];
42 if (!data.versions[version]) {
43 const versions = Object.keys(data.versions);
44 version = semver.maxSatisfying(versions, version);
47 throw new Error('Version doesn\'t exist');
51 data = data.versions[version];
54 throw new Error('Version doesn\'t exist');
61 if (err.statusCode === 404) {
62 throw new Error(`Package \`${name}\` doesn't exist`);