You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

154 lines
3.7 KiB

'use strict';
const Base = require('./base');
const downloads = require('../plugins/downloads');
/**
* Repo constructor. Create an instance of an npm repo by repo name.
*
* ```js
* const repo = new Repo('micromatch');
* ```
*
* @param {String} `name` Name of the npm repo to get information about.
* @name Repo
* @api public
*/
class Repo extends Base {
constructor(name) {
super();
this.name = name;
this.use(downloads());
}
/**
* Get the repo's published package.json.
*
* ```js
* repo.package()
* .then(function(pkg) {
* console.log(pkg);
* }, function(err) {
* console.error(err);
* });
* ```
* @return {Promise} Returns the package.json object when promise resolves.
* @name .package
* @api public
*/
async package(version = 'latest') {
let key = `pkg-${version}`;
if (!this.cache.has(key)) {
let registry = new this.Registry();
let results = await registry.get(this.name);
let pkg = version === 'all'
? results
: (results.versions[version] || results.versions[results['dist-tags'][version]]);
this.cache.set(key, pkg);
}
return this.cache.get(key);
}
/**
* Get the repo's published package.json value for the specified version.
*
* ```js
* repo.version('0.2.0')
* .then(function(pkg) {
* console.log(pkg);
* }, function(err) {
* console.error(err);
* });
* ```
* @param {String} `version` Specific version to retrieve.
* @return {Promise} Returns the package.json object for the specified version when promise resolves.
* @name .version
* @api public
*/
async version(version) {
let pkg = await this.package('all');
if (pkg['dist-tags'][version]) {
version = pkg['dist-tags'][version];
}
if (!pkg.versions[version]) {
return {};
}
return pkg.versions[version];
}
/**
* Get the repo's dependencies for the specified version.
*
* ```js
* repo.dependencies()
* .then(function(dependencies) {
* console.log(dependencies);
* }, function(err) {
* console.error(err);
* });
* ```
* @param {String} `version` Specific version to retrieve. Defaults to `latest`.
* @return {Promise} Returns the dependencies object for the specified version when promise resolves.
* @name .dependencies
* @api public
*/
dependencies(version) {
return this.prop('dependencies', version);
}
/**
* Get the repo's devDependencies for the specified version.
*
* ```js
* repo.devDependencies()
* .then(function(devDependencies) {
* console.log(devDependencies);
* }, function(err) {
* console.error(err);
* });
* ```
* @param {String} `version` Specific version to retrieve. Defaults to `latest`.
* @return {Promise} Returns the devDependencies object for the specified version when promise resolves.
* @name .devDependencies
* @api public
*/
devDependencies(version) {
return this.prop('devDependencies', version);
}
/**
* Get the specified property from the repo's package.json for the specified version.
*
* ```js
* repo.prop('author')
* .then(function(author) {
* console.log(author);
* }, function(err) {
* console.error(err);
* });
* ```
* @param {String} `prop` Name of the property to get.
* @param {String} `version` Specific version to retrieve. Defaults to `latest`.
* @return {Promise} Returns the property for the specified version when promise resolves.
* @name .prop
* @api public
*/
async prop(prop, version = 'latest') {
let pkg = await this.version(version);
return pkg[prop];
}
}
/**
* Exposes `Repo`
*/
module.exports = Repo;