2018-06-05 07:15:21 +00:00
const fs = require ( '../core/fs.js' ) ;
const { PerformanceObserver , performance } = require ( 'perf_hooks' ) ;
2018-06-13 13:40:19 +00:00
const PluginManager = require ( 'live-plugin-manager-git-fix' ) . PluginManager ;
2018-06-05 07:15:21 +00:00
require ( 'colors' ) ;
const _ = require ( 'underscore' ) ;
2018-04-20 21:17:49 +00:00
2017-07-05 22:26:44 +00:00
class Npm {
constructor ( options ) {
this . logger = options . logger ;
2018-06-13 13:16:54 +00:00
this . packageName = options . packageName ;
this . version = options . version ;
2017-07-05 22:26:44 +00:00
}
2018-06-13 13:16:54 +00:00
get packagePath ( ) {
if ( typeof this . _packagePath == 'undefined' ) {
this . _packagePath = './.embark/versions/' + this . packageName + '/' + this . version + '/' ;
}
return this . _packagePath ;
}
get pluginManager ( ) {
if ( typeof this . _pluginManager == 'undefined' ) {
this . _pluginManager = new PluginManager ( { pluginsPath : this . packagePath } ) ;
}
return this . _pluginManager ;
}
2018-04-20 21:17:49 +00:00
2018-06-13 13:16:54 +00:00
getPackageVersion ( packageName , version , callback ) {
2018-04-20 21:17:49 +00:00
2018-06-13 13:16:54 +00:00
if ( fs . existsSync ( this . packagePath + packageName ) ) {
return callback ( null , this . packagePath + packageName ) ;
2018-04-20 23:45:57 +00:00
}
2018-06-13 13:16:54 +00:00
this . logger . info ( _ _ ( "Downloading and installing {{packageName}} {{version}}..." , { packageName : packageName , version : version } ) ) ;
2018-06-05 07:15:21 +00:00
const obsMeasure = new PerformanceObserver ( ( items ) => {
let entry ;
let strDuration ;
// find any download ongoing measurements we've made
entry = _ . last ( _ . where ( items . getEntries ( ) , { name : downloadOngoing } ) ) ;
if ( entry ) {
// ongoing performance mark
2018-06-13 13:16:54 +00:00
strDuration = _ _ ( 'Downloading and installing {{packageName}} {{version}}... ({{duration}}ms elapsed)' , { packageName : packageName , version : version , duration : entry . duration } ) ;
2018-06-05 07:15:21 +00:00
}
else {
// otherwise, find our download complete measurement
entry = _ . last ( _ . where ( items . getEntries ( ) , { name : downloadComplete } ) ) ;
if ( entry ) {
2018-06-13 13:16:54 +00:00
strDuration = _ _ ( 'Finished downloading and installing {{packageName}} {{version}} in {{duration}}ms' , { packageName : packageName , version : version , duration : entry . duration } ) ;
2018-06-05 07:15:21 +00:00
performance . clearMarks ( ) ;
}
}
// log our measurement and make it red if it has taken too long
if ( entry && strDuration ) {
2018-06-06 02:04:30 +00:00
if ( entry . duration > 4000 ) {
2018-06-05 07:15:21 +00:00
strDuration = strDuration . red ;
}
this . logger . info ( strDuration ) ;
}
} ) ;
obsMeasure . observe ( { entryTypes : [ 'measure' ] } ) ;
// define mark and measurement names
let startMark = 'downloadStart' + packageName + version ;
let ongoingMark = 'downloadOngoingMark' + packageName + version ;
let downloadOngoing = 'downloadOngoing' + packageName + version ;
let endMark = 'downloadEnd' + packageName + version ;
let downloadComplete = 'downloadComplete' + packageName + version ;
// mark our start time
performance . mark ( startMark ) ;
// function that continually updates the console to show user that we're downloading a library
let intOngoingDownload = setInterval (
function ( ) {
performance . mark ( ongoingMark ) ;
performance . measure ( downloadOngoing , startMark , ongoingMark ) ;
} , 750 ) ;
// do the package download/install
2018-06-13 13:16:54 +00:00
this . pluginManager . install ( packageName , version ) . then ( ( result ) => {
// if(packageName === 'solc'){
// async.each(Object.keys(result.dependencies), function(dependency, cb){
// console.log('getting dependency: ' + dependency + ' ' + result.dependencies[dependency]);
// self.pluginManager.install(dependency, result.dependencies[dependency]).then(() => {
// console.log('installed ' + dependency + ' ' + result.dependencies[dependency]);
// cb();
// })
// .catch(cb);
// }, function(err){
// // stop updating console for ongoing download
// clearInterval(intOngoingDownload);
// performance.mark(endMark);
// performance.measure(downloadComplete, startMark, endMark);
// if(err){
// self.logger.error(err);
// return callback(err);
// }else{
// return callback(null, result.location, self.pluginManager);
// }
// });
// }
// else{
// stop updating console for ongoing download
clearInterval ( intOngoingDownload ) ;
performance . mark ( endMark ) ;
performance . measure ( downloadComplete , startMark , endMark ) ;
callback ( null , result . location ) ;
//}
2018-04-20 23:52:51 +00:00
} ) . catch ( callback ) ;
2017-07-02 17:33:11 +00:00
}
2017-07-05 22:26:44 +00:00
}
2017-07-02 17:33:11 +00:00
2017-07-05 22:26:44 +00:00
module . exports = Npm ;