ionic
Version:
A tool for creating and developing Ionic Framework mobile apps.
339 lines (280 loc) • 8.73 kB
JavaScript
require('colors');
var argv = require('optimist').boolean(['nohooks', 'n', 'r', 'noresources', 'nosave', 'e']).argv;
var cordova = require('cordova-lib').cordova.raw;
var exec = require('child_process').exec;
var State = require('./state');
var Q = require('q');
var log = require('./logging').logger;
var Cordova = module.exports;
Cordova.Lib = require('cordova-lib');
Cordova.runCordova = function runCordova(cmdName) {
var deferred = Q.defer();
var self = this;
var cmdArgs = (process.argv.length > 3 ? process.argv.slice(3) : []);
var cmdArg;
var x;
var y;
// backwards compatibility prior to fully wrapping cordova cmds
if (cmdName === 'platform') {
// `ionic platform <PLATFORM>` used to actually run `ionic platform add <PLATFORM>`
// if a cordova platform cmd isn't the cmd then automatically insert `add`
var hasCordovaCmd = false;
var validCommands = 'add remove rm list ls update up check'.split(' ');
for (x = 0; x < cmdArgs.length; x += 1) {
cmdArg = cmdArgs[x].toLowerCase();
for (y = 0; y < validCommands.length; y += 1) {
if (cmdArg === validCommands[y]) {
hasCordovaCmd = true;
break;
}
}
}
if (!hasCordovaCmd) {
cmdArgs.unshift('add');
}
}
// var noHook = argv.nohooks || argv.n;
// if (!noHook) {
// console.log('Adding in default Ionic hooks'.yellow.bold)
// // this.addHooks();
// // this.removeOldPluginHooks();
// } else {
// console.log('Option passed to not install default Ionic hooks'.yellow.bold)
// }
cmdArgs.unshift(cmdName);
// clean out any cmds that may confuse cordova
var cleanArgs = [];
var port = argv.port || argv.p || '';
var liveReloadPort = argv.livereloadport || argv['livereload-port'] || argv.r || '';
var ignoreCmds = '--livereload -l --consolelogs -c --serverlogs -s --port -p --livereload-port -i -r'.split(' ');
var isValdCmd;
for (x = 0; x < cmdArgs.length; x += 1) {
cmdArg = cmdArgs[x];
if (port && cmdArg === port) continue;
if (liveReloadPort && cmdArg === liveReloadPort) continue;
isValdCmd = true;
for (y = 0; y < ignoreCmds.length; y += 1) {
if (cmdArg === ignoreCmds[y]) {
isValdCmd = false;
break;
}
}
if (isValdCmd) {
// make sure --target= has double quotes around it (process.argv removes them)
if (cmdArg.indexOf('--target=') === 0 && cmdArg.indexOf('"') === -1) {
cmdArg = cmdArg.replace('--target=', '--target="') + '"';
}
cleanArgs.push(cmdArg);
}
}
var cordovaProcess = exec('cordova ' + cleanArgs.join(' '));
cordovaProcess.stdout.on('data', function(data) {
process.stdout.write(data);
});
cordovaProcess.stderr.on('data', function(data) {
if (data) {
process.stderr.write(data.toString().error.bold);
}
});
cordovaProcess.on('close', function(code) {
deferred.resolve(code);
});
if (self.isLiveReload) {
cordovaProcess.on('exit', function() {
setTimeout(function() {
// set it back to the original src after a few seconds
self.ionic.setConfigXml({
resetContent: true,
errorWhenNotFound: true
});
}, 5000);
});
process.on('exit', function() {
// verify it was set back
self.ionic.setConfigXml({
resetContent: true,
errorWhenNotFound: false
});
});
var readLine = require('readline');
if (process.platform === 'win32') {
var rl = readLine.createInterface({
input: process.stdin,
output: process.stdout
});
rl.on('SIGINT', function() {
process.emit('SIGINT');
});
}
process.on('SIGINT', function() {
process.exit();
});
}
return deferred.promise;
};
Cordova.setupLiveReload = function() {
var d = Q.defer();
log.info('Setup Live Reload');
var self = this;
var Serve = require('./serve');
var serveInstance = new Serve();
var serveTask = new serveInstance.IonicTask();
serveTask.ionic = this.ionic;
serveTask.isPlatformServe = true;
serveTask.loadSettings();
serveTask.getAddress()
.then(function() {
return serveTask.checkPorts(true, serveTask.port, serveTask.address);
})
.then(function() {
if (serveTask.runLivereload) {
return serveTask.checkPorts(false, serveTask.liveReloadPort, serveTask.address);
}
})
.then(function() {
serveTask.runLivereload = true;
serveTask.launchBrowser = false;
serveTask.launchLab = false;
serveTask.start(self.ionic);
if (self.ionic.hasFailed) return;
self.ionic.setConfigXml({
devServer: serveTask.devServer
}).then(function() {
d.resolve();
});
})
.catch(function(error) {
console.log(error);
});
return d.promise;
};
Cordova.addPlatform = function addPlatform(projectRoot, platform, savePlatform) {
log.debug('Cordova.addPlatform: ', projectRoot, platform, savePlatform);
// var opts = {
// searchpath : args.searchpath
// , noregistry : args.noregistry
// , usegit : args.usegit
// , cli_variables : cli_vars
// , browserify: args.browserify || false
// , link: args.link || false
// , save: args.save || false
// , shrinkwrap: args.shrinkwrap || false
// };
var options = {
stdio: 'pipe'
};
var originalPwd = process.env.PWD;
process.env.PWD = projectRoot;
return cordova.platform('add', [platform], options)
.then(function() {
// logging.logger.info(('Added ' + platform + ' platform').green);
process.env.PWD = originalPwd;
if (savePlatform) {
log.debug('Cordova.addPlatform call specified to save platform. Saving to package.json now.');
return State.savePlatform(projectRoot, platform);
}
});
};
Cordova.removePlatform = function removePlatform(projectRoot, platform, savePlatform) {
var options = {};
var originalPwd = process.env.PWD;
process.env.PWD = projectRoot;
return cordova.platform('remove', [platform], options)
.then(function() {
process.env.PWD = originalPwd;
if (savePlatform) {
return State.removePlatform(projectRoot, platform);
}
});
};
Cordova.runPlatform = function runPlatform(projectRoot, platform) {
var options = {
platforms: [],
options: [],
verbose: false,
silent: false,
browserify: false,
stdio: 'pipe'
};
options.platforms.push(platform);
var originalPwd = process.env.PWD;
process.env.PWD = projectRoot;
return cordova.run(options)
.then(function() {
process.env.PWD = originalPwd;
})
.catch(function(error) {
throw error;
});
};
Cordova.addPlugin = function addPlugin(projectRoot, pluginId, pluginVariables, savePlugin) {
log.debug('Cordova.addPlugin: projectRoot', projectRoot, 'pluginId', pluginId,
'pluginVariables', pluginVariables, 'savePlugin', savePlugin);
var originalPwd = process.env.PWD;
process.env.PWD = projectRoot;
// If you need to pass variables,
// target should be an array of [plugin_id, '--variable', 'VARNAME=value']
// require('cordova-lib').cordova.raw.plugin('add', target)
return cordova.plugin('add', pluginId, { stdio: 'pipe' })
.then(function() {
process.env.PWD = originalPwd;
if (savePlugin) {
State.savePlugin(projectRoot, pluginId, pluginVariables);
}
})
.catch(function(error) {
log.error('Error occurred while adding plugin: ', error);
throw error;
});
};
Cordova.removePlugin = function removePlugin(projectRoot, pluginId) {
var originalPwd = process.env.PWD;
process.env.PWD = projectRoot;
return cordova.plugin('remove', pluginId, { stdio: 'pipe' })
.then(function() {
process.env.PWD = originalPwd;
})
.catch(function(error) {
throw error;
});
};
Cordova.buildPlatform = function buildPlatform(projectRoot, platform) {
var options = {
platforms: [],
options: [],
verbose: false,
silent: false,
browserify: false,
stdio: 'pipe'
};
options.platforms.push(platform);
var originalPwd = process.env.PWD;
process.env.PWD = projectRoot;
return cordova.build(options)
.then(function() {
process.env.PWD = originalPwd;
})
.catch(function(error) {
throw error;
});
};
Cordova.preparePlatform = function preparePlatform(projectRoot, platform) {
var options = {
platforms: [],
options: [],
verbose: false,
silent: false,
browserify: false,
stdio: 'pipe'
};
options.platforms.push(platform);
var originalPwd = process.env.PWD;
process.env.PWD = projectRoot;
return cordova.prepare(options)
.then(function() {
process.env.PWD = originalPwd;
})
.catch(function(error) {
throw error;
});
};