cleverstack-cli
Version:
Command line interface for CleverTech's CleverStack
200 lines (161 loc) • 4.77 kB
JavaScript
var path = require( 'path' )
, Promise = require( 'bluebird' )
, async = require( 'async' )
, semver = require( 'semver' )
, _ = require( 'lodash' )
, request = require( 'request' )
, utils = require( path.join( __dirname, 'utils' ) );
var _keywordRequired = ['cleverstack module', 'cleverstack-module', 'cleverstack seed', 'cleverstack-seed'];
function searchNPMRegistry ( queries ) {
var def = Promise.defer( )
, repos = [];
async.each( queries, function ( q, next ) {
var search = q.split( '@' );
if (typeof search[1] === "undefined") {
search[1] = '*';
}
request( {
url: 'http://registry.npmjs.org/' + encodeURIComponent( search[ 0 ] ),
json: true
},
function ( err, response, res ) {
if (!!err || (res.error && res.error === "not_found")) {
return next( );
}
var versions = Object.keys( res.versions );
var maxVersion = semver.maxSatisfying( versions, search[1] );
var pkg = res.versions[maxVersion];
if (typeof pkg === "undefined") {
return next( );
}
if (_.intersection( pkg.keywords, _keywordRequired ).length > 0) {
if (typeof pkg.repository === "object" && pkg.repository.hasOwnProperty( 'url' )) {
pkg.homepage = pkg.repository.url;
}
repos.push( pkg );
}
next( );
} );
}, function ( err ) {
if (!!err) {
return def.reject( err );
}
def.resolve( repos );
} );
return def.promise;
}
var list = exports.list = function ( ) {
var def = Promise.defer( );
request.get( {
url: 'https://registry.npmjs.org/-/_view/byKeyword?startkey=["cleverstack"]&endkey=["cleverstack",{}]&group_level=2',
json: true
},
function ( err, res, body ) {
var rows = body.rows.map( function ( r ) {
return r.key[1];
} );
searchNPMRegistry( rows ).then( function ( response ) {
def.resolve( response );
} )
.catch( function ( err ) {
def.reject( err );
} );
} );
return def.promise;
}
var searchNPM = exports.npm = function ( queries ) {
var def = Promise.defer( );
utils.info( 'Searching through NPM packages...' );
if (queries.length < 1) {
list( ).then( function ( res ) {
def.resolve( res )
} )
.catch( function ( err ) {
def.reject( err );
} );
} else {
searchNPMRegistry( queries ).then( function ( res ) {
def.resolve( res );
} )
.catch( function ( err ) {
def.reject( err );
} );
}
return def.promise;
}
function listBower( ) {
var def = Promise.defer( )
, repos = [ ];
utils.info( 'Searching through Bower packages' );
request( {
url: 'https://bower-component-list.herokuapp.com/keyword/cleverstack',
json: true
},
function ( err, res, body ) {
async.each( body, function ( module, next ) {
request( {
url: 'https://bower.herokuapp.com/packages/' + encodeURIComponent( module.name ),
json: true
},
function ( e, response, bower ) {
if (!bower || !bower.url) {
return next( );
}
module.url = bower.url;
repos.push( module );
next( );
} );
}, function ( ) {
def.resolve( repos );
} );
} );
return def.promise;
}
var searchBower = exports.bower = function ( query ) {
var def = Promise.defer( );
utils.info( 'Searching through Bower packages for ' + query + '...' );
request( {
url: 'https://bower.herokuapp.com/packages/' + encodeURIComponent( query ),
json: true
},
function ( e, response, bower ) {
if (!!e) {
return def.reject( e );
}
def.resolve( bower );
} );
return def.promise;
}
var aggregate = exports.aggregate = function ( args ) {
var def = Promise.defer( )
, all = [];
all.push( searchNPM( args ) );
all.push( listBower( ) );
args.forEach( function ( arg ) {
all.push( searchBower( arg ) );
} );
Promise.all( all ).then( function ( results ) {
var npm = results[0].map( function ( r ) { r.type = 'backend'; return r; } )
, keys = results[1]
, repos = [];
results.shift( );
results.shift( );
( args.length < 1 ? results[0] : results ).filter( function ( res ) {
return typeof res === "object" && res.hasOwnProperty( 'url' );
} ).forEach( function ( rep ) {
var cleverStackBower = _.find( keys, function ( key ) {
return key.name === rep.name;
} );
if (cleverStackBower) {
rep = _.merge( cleverStackBower, rep );
rep.type = 'frontend';
repos.push( rep );
}
} );
def.resolve( [ npm, repos ] );
} )
.catch( function ( err ) {
def.reject( err );
} );
return def.promise;
}