ionic
Version:
A tool for creating and developing Ionic Framework mobile apps.
277 lines (232 loc) • 6.86 kB
JavaScript
var fs = require('fs'),
path = require('path'),
shelljs = require('shelljs'),
os = require('os'),
argv = require('optimist').argv,
IonicProject = require('./project'),
Task = require('./task').Task,
IonicStats = require('./stats').IonicStats,
semver = require('semver');
var requirements = {
node: '>=0.10.33',
cordova: '>=4.2.0'
}
var IonicTask = function() {};
IonicTask.prototype = new Task();
// http://en.wikipedia.org/wiki/Darwin_%28operating_system%29#Release_history
IonicTask.prototype.getMacInfo = function() {
//Need to get:
//Look up for what version (Yosemite, Mavericks, Mountain Lion)
//What version of Xcode
var macVersion = 'Yosemite';
switch(os.release()) {
case '14.0.0':
macVersion = 'Yosemite';
break;
case '13.0.0':
case '13.1.0':
case '13.2.0':
case '13.3.0':
case '13.4.0':
macVersion = 'Mavericks';
break;
case '12.0.0':
case '12.5.0':
macVersion = 'Mountain Lion';
break;
case '11.4.2':
macVersion = 'Lion';
break;
case '10.8':
macVersion = 'Snow Leopard';
break;
}
return 'Mac OS X ' + macVersion;
// console.log('Mac OS X', macVersion);
}
IonicTask.prototype.getCordovaInfo = function(info) {
var command = 'cordova -v';
var result = shelljs.exec(command, { silent: true });
if(result.code != 0) {
info.cordova = 'Not installed';
return;
}
info.cordova = result.output.replace('\n', '');
}
IonicTask.prototype.getXcodeInfo = function() {
var result = shelljs.exec('/usr/bin/xcodebuild -version', { silent: true });
if(result.code != 0) {
return 'Not installed';
}
var version = result.output.replace(/\n/g, ' ')
return version;
}
IonicTask.prototype.getIosSimInfo = function() {
var result = shelljs.exec('ios-sim --version', { silent: true });
if(result.code != 0) {
return 'Not installed';
}
var version = result.output.replace(/\n/g, ' ')
return version;
}
IonicTask.prototype.getIosDeployInfo = function() {
var result = shelljs.exec('ios-deploy --version', { silent: true });
if(result.code != 0) {
return 'Not installed';
}
var version = result.output.replace(/\n/g, ' ')
return version;
}
IonicTask.prototype.getIonicVersions = function(info) {
var ionicCliVersion = require('../../package.json').version;
info.ionic_cli = ionicCliVersion;
try {
var ionicVersionFile = require(path.resolve('www/lib/ionic/version.json'));
var ionicVersion = ionicVersionFile.version;
info.ionic = ionicVersion;
} catch (ex) {}
}
// Windows XP 5.1.2600
// Windows Server 2003 5.2.3790
// Windows Vista
// Windows Server 2008 6.0.6000
// Windows Vista, SP2 6.0.6002
// Windows 7
// Windows Server 2008 R2 6.1.7600
// Windows 7 SP1
// Windows Server 2008 R2 SP1 6.1.7601
// Windows 8
// Windows Server 2012 6.2.9200
// Windows 8.1
// Windows Server 2012 R2 6.3.9600
// Windows 10 Technical Preview 6.4.9841
IonicTask.prototype.getWindowsEnvironmentInfo = function() {
// Windows version reference
// http://en.wikipedia.org/wiki/Ver_%28command%29
var version = os.release();
var windowsVersion = null;
switch(version) {
case '5.1.2600':
windowsVersion = 'Windows XP';
break;
case '6.0.6000':
windowsVersion = 'Windows Vista';
break;
case '6.0.6002':
windowsVersion = 'Windows Vista SP2';
break;
case '6.1.7600':
windowsVersion = 'Windows 7';
break;
case '6.1.7601':
windowsVersion = 'Windows 7 SP1';
break;
case '6.2.9200':
windowsVersion = 'Windows 8';
break;
case '6.3.9600':
windowsVersion = 'Windows 8.1';
break;
}
return windowsVersion;
}
IonicTask.prototype.getLinuxEnvironmentInfo = function() {
var result = shelljs.exec('lsb_release -id', { silent: true });
return result.output.replace(/\n/g, ' ')
}
//http://stackoverflow.com/questions/6551006/get-my-os-from-the-node-js-shell
IonicTask.prototype.getOsEnvironment = function(info) {
var self = this;
switch(os.type()) {
case 'Darwin':
info.os = self.getMacInfo();
info.xcode = self.getXcodeInfo();
info.ios_sim = self.getIosSimInfo();
info.ios_deploy = self.getIosDeployInfo();
break;
case 'Windows_NT':
info.os = self.getWindowsEnvironmentInfo();
break;
case 'Linux':
info.os = self.getLinuxEnvironmentInfo();
break;
}
}
IonicTask.prototype.getNodeVersion = function(info) {
var command = 'node -v';
var result = shelljs.exec(command, { silent: true } );
info.node = result.output.replace('\n','');
}
IonicTask.prototype.gatherInfo = function() {
var self = this;
var info = {};
//For macs we want:
//Mac version, xcode version (if installed)
//For windows
//Windows version
//For all
// Android SDK info
// Cordova CLI info
// Ionic CLI version
// Ionic version
// var info = {
// cordova: 'CLI v3.5.0',
// os: 'Mac OSX Yosemite',
// xcode: 'Xcode 6.1.1',
// ionic: '1.0.0-beta.13',
// ionic_cli: '1.3.0'
// };
self.getIonicVersions(info);
self.getNodeVersion(info);
self.getOsEnvironment(info);
self.getCordovaInfo(info);
// self.printJavaInformation();
return info;
}
IonicTask.prototype.printInfo = function(info) {
console.log('\nYour system information:\n');
console.log('OS:', info.os);
console.log('Node Version:', info.node);
console.log('Cordova CLI:', info.cordova);
if (info.ionic) {
console.log('Ionic Version:', info.ionic);
}
console.log('Ionic CLI Version:', info.ionic_cli);
if(info.xcode) {
console.log('Xcode version:', info.xcode);
}
if(info.ios_sim) {
console.log('ios-sim version:', info.ios_sim);
}
if(info.ios_deploy) {
console.log('ios-deploy version:', info.ios_deploy);
}
console.log('\n');
}
IonicTask.prototype.checkRuntime = function checkRuntime() {
var info = this.gatherInfo();
var validRuntime = true;
try {
if(!semver.satisfies(info.node, requirements.node)) {
var updateMessage = ['Please update your Node runtime to version >=', requirements.node].join(' ');
console.log(updateMessage.red.bold);
validRuntime = false;
}
if(!semver.satisfies(info.cordova, requirements.cordova)) {
var updateMessage = ['Please update your Cordova CLI to version >=', requirements.cordova, '`npm install -g cordova`'].join(' ')
console.log(updateMessage.red.bold);
validRuntime = false;
}
} catch(ex) {
console.log('There was an error checking your runtime environment: ', ex)
}
return validRuntime;
}
IonicTask.prototype.run = function(ionic) {
var info = this.gatherInfo();
this.ionic = ionic;
this.printInfo(info);
this.checkRuntime();
IonicStats.t();
}
exports.IonicTask = IonicTask;