#!/usr/bin/env node "use strict"; var program = require('commander') var semver = require('semver') var fs = require('fs.extra') var zlib = require('zlib') var tar = require('tar') var path = require('path') var debug = require('debug')('mosaic') var mosaic = require('../lib/mosaic') program .usage('[options] :family/:name/:version') .option('--keep -k', 'Keep package.tgz') program.on('--help', function() { console.log(' Examples') console.log('') console.log(' $ mo install mosaics/pagination/1.0.0') console.log(' $ mo install mosaics/pagination') console.log('') }) program.parse(process.argv) var MOPATH_PATTERN = /([^\/]+)\/([^\/]+)\/((?:\d+\.){2}\d+)$/ var mopath = program.args[0] || '' var parts = mopath.match(MOPATH_PATTERN) if (!mopath || !parts) { process.stdout.write(program.helpInformation()) program.emit('--help') process.exit() } var family = parts[1] var name = parts[2] var version = parts[3] if (fs.existsSync(mopath)) { var question = "Mosaic exists, reinstall? (y/n): " var handler = function(ok) { if (ok) { install(mopath, 'Mosaic reinstalled!') } else { process.exit(0) } } program.confirm(question, handler) } else if (family && name && version && semver.valid(version)) { install(mopath, 'Mosaic installed!') } function install(fpath, msg){ var req = mosaic.agent().get(mosaic.remote(fpath + '.tgz'), function(res) { if (res.statusCode === 404) { mosaic.fatal(404) mosaic.fatal(res.text) } else if (res.statusCode === 200 && res.text && res.text.indexOf('统一登录中心') >= 0) { res.req.url = req.url mosaic.login(res).done(function() { install(fpath, msg) }) } else { debug('mkdir ' + fpath) fs.mkdirp(fpath) debug('extract ' + fpath) res .pipe(zlib.Gunzip()) .pipe(tar.Extract({ path: fpath, strip: 1 })) .on('end', function() { if (!program.keep) { var pkg = path.join(fpath, 'package.tgz') debug('remove ' + pkg) fs.unlinkSync(pkg) } mosaic.log('success', msg) process.exit(0) }) } }, true) }