fury-bower-resolver
Version:
Install private Bower packages from Gemfury
80 lines (64 loc) • 2.38 kB
JavaScript
var reqPromise = require('request-promise');
var Promise = require("bluebird");
var url = require('url');
// Defaults & constants
var FURY_REGISTRY = 'https://bower.fury.io';
var FURY_SRC_PREFIX = 'fury://';
// Gemfury registry client
function Fury(bower) {
// Retrieve FuryResolver configuration
var fury = this.config = bower.config.furyResolver || {};
this.auth = process.env["FURY_TOKEN"] || fury.authToken;
this.registryUrl = fury.registry || FURY_REGISTRY;
// Auto-locate packages in a specified account
this.locateInAccount = fury.locateInAccount;
this.accountPackageNames = null;
}
// Request fury:// as https://bower.fury.io/...
Fury.prototype.sourceRequest = function(source, version) {
var fUrl = url.parse(this.registryUrl);
var src = url.parse(source);
// Start with https://bower.fury.io/<acct>/packages
fUrl.pathname = src.hostname + "/packages";
// (Optional) Add package/version, if specified
if(src.pathname) {
fUrl.pathname += src.pathname;
if(version) fUrl.pathname += "/" + version;
}
// (Optional) Add Gemfury authentication
if(this.auth) fUrl.auth = this.auth + ":";
// Let's go!
return reqPromise({ url: url.format(fUrl), json: true })
};
// Return whether the current account has named package
Fury.prototype.matchPromise = function(source) {
var isFury = this.isFuryURI(source);
// Use URI matching if auto-locate is disabled
if(isFury || !this.locateInAccount) {
return Promise.resolve(isFury);
}
// Match package in cached or fetched name list
if(this.accountPackageNames) {
var isMatch = this.accountPackageNames.indexOf(source) >= 0;
return Promise.resolve(isMatch);
} else {
return this.sourceRequest(this.buildURI()).then(function(packages) {
return packages.map(function(p) { return p['name']; });
}).then(function(names) {
this.accountPackageNames = names;
return names.indexOf(source) >= 0;
}.bind(this));
}
};
// Check if the source is a fury:// URI
Fury.prototype.isFuryURI = function(source) {
return source.indexOf(FURY_SRC_PREFIX) === 0;
}
// Build fury:// URI from array of arguments
Fury.prototype.buildURI = function() {
var parts = Array.prototype.slice.call(arguments);
parts[0] = parts[0] || this.locateInAccount;
return FURY_SRC_PREFIX + parts.join('/');
}
// Unleash the Fury!!!
module.exports = Fury;