appc-cli-ios
Version:
create an ios native project
114 lines (99 loc) • 2.97 kB
JavaScript
var path = require('path'),
fs = require('fs-extra'),
exec = require('child_process').exec;
var TYPE = require('../appc').TYPE,
optsMap = require('../appc').OPTS_MAP,
LANG,
ID;
module.exports = {
type: TYPE,
subtype: 'app',
name: 'iOS Mobile App',
fields: function(appc) {
return [
ID,
LANG
];
},
command: function(program, appc) {
ID = appc.fields.id();
LANG = language();
program.option(ID.flags, ID.description);
program.option(LANG.flags, LANG.description);
},
execute: _new
};
function language() {
return {
type: 'list',
name: 'language',
choices: ['Swift','Objective-C'],
default: 'Swift',
message: 'Which language do you want to support?',
flags: '--language <language>',
description: 'language to support',
};
}
function _new(appc, args, opts, callback) {
var appDir = opts.workspace ? path.join(opts.workspace, 'app') :
path.join(process.cwd(), opts.name);
function generate() {
if (opts.language === 'Swift') {
generateProject(appc, 'swift', appDir, opts.name, opts.id, opts.author, !!opts.workspace, callback);
}
else {
generateProject(appc, 'objc', appDir, opts.name, opts.id, opts.author, !!opts.workspace, callback);
}
}
if (opts.author) {
generate();
}
else {
appc.fields.findAuthor(function(err,author){
opts.author = author;
generate();
});
}
}
/**
* TODO:
*
* - download APS iOS SDK if not found
* - register app and get APS keys
* - insert APS keys below
*/
function generateProject(appc, lang, dir, name, id, author, isWorkspace, callback) {
// generate templates
var templateDir = path.join(__dirname,'..','templates','Appcelerator.framework');
//TODO: download framework
var targetDir = path.join(dir, 'Appcelerator.framework');
fs.ensureDir(targetDir);
// copy in the framework first
appc.generate.copyTemplates(templateDir,targetDir,name,id,author,function(err){
if (err) { return callback(err); }
templateDir = path.join(__dirname,'..','templates',lang);
appc.generate.copyTemplates(templateDir,dir,name,id,author,function(err){
if (err) { return callback(err); }
// remove these directories
var dirs = [
path.join(dir,name+'.xcodeproj','xcuserdata'),
path.join(dir,name+'.xcodeproj','project.xcworkspace','xcuserdata')
];
dirs.forEach(function(dn){
if (fs.existsSync(dn)) {
appc.wrench.rmdirSyncRecursive(dn);
}
});
// replace APPC_APS_KEY
var sourceFn = path.join(dir,'Source','AppDelegate.'+(lang=='swift' ? lang : 'm'));
var sourceBuf = fs.readFileSync(sourceFn).toString();
sourceBuf = sourceBuf.replace('APPC_APS_KEY','APPC_APS_KEY_HERE'); //FIXME
fs.writeFileSync(sourceFn, sourceBuf);
// write this project to the workspace manifest
callback && isWorkspace && appc.core.writeManifest(path.dirname(dir), { 'app': dir });
var p = path.join(dir, name+'.xcodeproj');
// open up the xcode project
callback && exec('open "'+p+'"', callback);
});
});
}