UNPKG

nap-cli

Version:

a new package cli

224 lines (206 loc) 7.6 kB
var http = require('http'); var MAC = require('getmac'); var pkg = require('../package.json'); var fs = require('fs-extra'); var path = require('path'); var clc = require('cli-color'); var jszip = require('node-zip'); var child = require('child_process'); var Resolvemodules = {}; module.exports = function(name, options){ var modulename = name; var doSave = false; var moduleversion = ''; if ( options.save ){ modulename = options.save; doSave = true; } if ( options.which ){ moduleversion = options.which; } var querys = {}; var pather = require('./me'); if ( fs.existsSync(pather) ){ var c = require(pather); querys.guid = c.guid; querys.token = c.token; } MAC.getMac(function(err, macAddress){ if (err){ querys.mac = ''; }else{ querys.mac = macAddress; } if ( moduleversion ){ querys.version = moduleversion; }else{ querys.version = 'lastest'; } querys.name = modulename; Resolvemodules = {}; var mist = null; if ( !modulename ){ return installAll(querys, process.cwd(), options); } console.log(clc.red('➜ Getting modules from remote ......')); getModule(querys, process.cwd(), options, function(err){ if ( err ){ console.log(clc.red('➜ ' + err.message)) }else{ var j = 0; for ( var i in Resolvemodules ){ if ( j === 0 ){ console.log(clc.magenta('+ ' + i + '@' + Resolvemodules[i])); mist = { name: i, version: Resolvemodules[i], dir: 'node_modules/' + i } }else{ console.log(clc.yellow(' - ' + i + '@' + Resolvemodules[i])); } j++; } if ( mist ){ if ( doSave ){ var pct = path.resolve(process.cwd(), 'package.json'); if ( fs.existsSync(pct) ){ var dck = require(pct); if ( !dck.napDependencies ){ dck.napDependencies = {}; } dck.napDependencies[mist.name] = '^' + mist.version; fs.writeFileSync(pct, JSON.stringify(dck, null, 2)); } } if ( !options.npm ){ var worker = path.resolve(process.cwd(), 'node_modules', modulename); child.execSync('npm install --registry=https://registry.npm.taobao.org', {cwd: worker}); console.log(clc.green('➜ ' + mist.name + '@' + mist.version + ' : ' + mist.dir)); //var result = child.spawnSync('npm', ['install', '--registry=https://registry.npm.taobao.org'], {stdio: 'inherit', cwd: worker}); //if (result.status == 0) { // console.log(clc.green('➜ ' + mist.name + '@' + mist.version + ' : ' + mist.dir)); //} }else{ console.log(clc.green('➜ ' + mist.name + '@' + mist.version + ' : ' + mist.dir)); } } } }); }); }; function getModule(querys, dir, options, callback){ var querystrings = []; var url = pkg.remotehost + '/install'; for ( var i in querys ){ querystrings.push(i + '=' + querys[i]); } url += '?' + querystrings.join('&'); http.get(url, function(res){ var body = []; res.on('data', function(chunk){ body.push(chunk); }); res.on('end', function(){ if (res.statusCode === 200){ body = Buffer.concat(body); savePackage(body, dir, querys, options, callback); }else{ var ret = JSON.parse(body); callback(ret); } }); }).on('error', callback); } function savePackage(body, dir, querys, options, callback){ var zip = new jszip(); zip.load(body); var dpkg = JSON.parse(zip.file('package.json').asText()); var nodemoduledir = path.resolve(dir, 'node_modules'); if ( !fs.existsSync(nodemoduledir) ){ fs.mkdirSync(nodemoduledir); } var moduledir = path.resolve(nodemoduledir, dpkg.name); if ( !fs.existsSync(moduledir) ){ fs.mkdirSync(moduledir); } var fls = zip.file(/.+/); var pm = function(p){ return path.resolve(moduledir, p); }; fls.forEach(function(file){ file = file.name; var buf = zip.file(file).asNodeBuffer(); fs.outputFileSync(pm(file), buf); }); if ( !Resolvemodules[dpkg.name] ){ Resolvemodules[dpkg.name] = dpkg.version; } var deps = dpkg.napDependencies; if ( deps ){ var keys = Object.keys(deps); if ( keys.length ){ resolveDeps(0, keys, deps, querys, moduledir, options, callback); }else{ callback(null); } }else{ callback(null); } } function resolveDeps(i, keys, deps, querys, dir, options, callback){ var name = keys[i]; var version = deps[keys[i]]; if ( name && version ){ if ( version === '*' ){ version = 'lastest'; }else{ version = version.replace(/^\D+/, ''); } querys.name = name; querys.version = version; getModule(querys, dir, options, function(err){ if ( err ){ callback(err); }else{ if ( !options.npm ){ var worker = path.resolve(dir, 'node_modules', name); child.execSync('npm install --registry=https://registry.npm.taobao.org', {cwd: worker}); resolveDeps(++i, keys, deps, querys, dir, options, callback); //var result = child.spawnSync('npm', ['install', '--registry=https://registry.npm.taobao.org'], {stdio: 'inherit', cwd: worker}); //if (result.status == 0) { // resolveDeps(++i, keys, deps, querys, dir, options, callback); //} }else{ resolveDeps(++i, keys, deps, querys, dir, options, callback); } } }) }else{ callback(null); } } function installAll(querys, dir, options){ var pct = path.resolve(process.cwd(), 'package.json'); if ( fs.existsSync(pct) ){ var dck = require(pct); if ( !dck.napDependencies ){ return console.log(clc.red('➜ Nothing to install!')); } var total = Object.keys(dck.napDependencies); if ( total.length ){ resolveDeps(0, total, dck.napDependencies, querys, dir, options, function(err){ if ( err ){ return console.log(clc.red('➜ ' + err.message)); } for ( var i in Resolvemodules ){ console.log(clc.magenta('+ ' + i + '@' + Resolvemodules[i])); } }); }else{ console.log(clc.red('➜ Nothing to install!')); } }else{ console.log(clc.red('➜ Nothing to install!')); } }