index.js 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. 'use strict';
  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');
  7. module.exports = (name, opts) => {
  8. const scope = name.split('/')[0];
  9. const regUrl = registryUrl(scope);
  10. const pkgUrl = url.resolve(regUrl, encodeURIComponent(name).replace(/^%40/, '@'));
  11. const authInfo = registryAuthToken(regUrl, {recursive: true});
  12. opts = Object.assign({
  13. version: 'latest'
  14. }, opts);
  15. const headers = {
  16. accept: 'application/vnd.npm.install-v1+json; q=1.0, application/json; q=0.8, */*'
  17. };
  18. if (opts.fullMetadata) {
  19. delete headers.accept;
  20. }
  21. if (authInfo) {
  22. headers.authorization = `${authInfo.type} ${authInfo.token}`;
  23. }
  24. return got(pkgUrl, {json: true, headers})
  25. .then(res => {
  26. let data = res.body;
  27. let version = opts.version;
  28. if (opts.allVersions) {
  29. return data;
  30. }
  31. if (data['dist-tags'][version]) {
  32. data = data.versions[data['dist-tags'][version]];
  33. } else if (version) {
  34. if (!data.versions[version]) {
  35. const versions = Object.keys(data.versions);
  36. version = semver.maxSatisfying(versions, version);
  37. if (!version) {
  38. throw new Error('Version doesn\'t exist');
  39. }
  40. }
  41. data = data.versions[version];
  42. if (!data) {
  43. throw new Error('Version doesn\'t exist');
  44. }
  45. }
  46. return data;
  47. })
  48. .catch(err => {
  49. if (err.statusCode === 404) {
  50. throw new Error(`Package \`${name}\` doesn't exist`);
  51. }
  52. throw err;
  53. });
  54. };