generator-angular-material-fullstack
Version:
Yeoman generator for creating MEAN stack applications, using MongoDB, Express, AngularJS, and Node
300 lines (261 loc) • 11 kB
JavaScript
'use strict';
var util = require('util');
var yeoman = require('yeoman-generator');
var childProcess = require('child_process');
var chalk = require('chalk');
var path = require('path');
var exec = childProcess.exec;
var spawn = childProcess.spawn;
var Generator = module.exports = function Generator() {
yeoman.generators.Base.apply(this, arguments);
this.sourceRoot(path.join(__dirname, './templates'));
try {
this.appname = require(path.join(process.cwd(), 'bower.json')).name;
} catch (e) {
this.appname = path.basename(process.cwd());
}
this.appname = this._.slugify(this.appname).split('-').join('');
this.filters = this.config.get('filters') || {};
};
util.inherits(Generator, yeoman.generators.NamedBase);
Generator.prototype.askForName = function askForName() {
var done = this.async();
var prompts = [{
name: 'deployedName',
message: 'Name to deploy as:',
default: this.appname
}];
this.prompt(prompts, function (props) {
this.deployedName = this._.slugify(props.deployedName).split('-').join('');
done();
}.bind(this));
};
Generator.prototype.checkInstallation = function checkInstallation() {
if(this.abort) return;
var done = this.async();
exec('rhc --version', function (err) {
if (err) {
this.log.error('OpenShift\'s rhc command line interface is not available. ' +
'You can install it via RubyGems with: gem install rhc');
this.abort = true;
}
done();
}.bind(this));
};
Generator.prototype.gitInit = function gitInit() {
if(this.abort) return;
var done = this.async();
this.log(chalk.bold('Initializing deployment repo'));
this.mkdir('dist');
exec('git init', { cwd: 'dist' }, function (err, stdout, stderr) {
this.log(stdout);
done();
}.bind(this));
};
Generator.prototype.gitRemoteCheck = function gitRemoteCheck() {
this.openshift_remote_exists = false;
if(this.abort || typeof this.dist_repo_url !== 'undefined') return;
var done = this.async();
this.log(chalk.bold("\nChecking for an existing git remote named '"+'openshift'+"'..."));
exec('git remote -v', { cwd: 'dist' }, function (err, stdout, stderr) {
var lines = stdout.split('\n');
var dist_repo = '';
if (err && stderr.search('DL is deprecated') === -1) {
this.log.error(err);
} else {
var repo_url_finder = new RegExp('openshift'+"[ ]*");
lines.forEach(function(line) {
if(line.search(repo_url_finder) === 0 && dist_repo === '') {
var dist_repo_detailed = line.slice(line.match(repo_url_finder)[0].length);
dist_repo = dist_repo_detailed.slice(0, dist_repo_detailed.length - 7);
}});
if (dist_repo !== ''){
console.log("Found an existing git remote for this app: "+dist_repo);
this.dist_repo_url = dist_repo;
this.openshift_remote_exists = true;
} else {
console.log('No existing remote found.');
}
}
done();
}.bind(this));
};
Generator.prototype.rhcAppShow = function rhcAppShow() {
if(this.abort || typeof this.dist_repo_url !== 'undefined') return;
var done = this.async();
this.log(chalk.bold("\nChecking for an existing OpenShift hosting environment..."));
var child = exec('rhc app show '+this.deployedName+' --noprompt', { cwd: 'dist' }, function (err, stdout, stderr) {
var lines = stdout.split('\n');
var dist_repo = '';
// Unauthenticated
if (stdout.search('Not authenticated') >= 0 || stdout.search('Invalid characters found in login') >= 0) {
this.log.error('Error: Not authenticated. Run "rhc setup" to login to your OpenShift account and try again.');
this.abort = true;
}
// No remote found
else if (stdout.search('not found.') < 0) {
console.log('No existing app found.');
}
// Error
else if (err && stderr.search('DL is deprecated') === -1) {
this.log.error(err);
}
// Remote found
else {
this.log(stdout);
var repo_url_finder = / *Git URL: */;
lines.forEach(function(line) {
if(line.search(repo_url_finder) === 0) {
dist_repo = line.slice(line.match(repo_url_finder)[0].length);
console.log("Found an existing git remote for this app: "+dist_repo);
}});
if (dist_repo !== '') this.dist_repo_url = dist_repo;
}
done();
}.bind(this));
};
Generator.prototype.rhcAppCreate = function rhcAppCreate() {
if(this.abort || typeof this.dist_repo_url !== 'undefined') return;
var done = this.async();
this.log(chalk.bold("\nCreating your OpenShift hosting environment, this may take a couple minutes..."));
var child = exec('rhc app create '+this.deployedName+' nodejs-0.10 mongodb-2.4 -s --noprompt --no-git NODE_ENV=production', { cwd: 'dist' }, function (err, stdout, stderr) {
var lines = stdout.split('\n');
this.log(stdout);
if (stdout.search('Not authenticated') >= 0 || stdout.search('Invalid characters found in login') >= 0) {
this.log.error('Error: Not authenticated. Run "rhc setup" to login to your OpenShift account and try again.');
this.abort = true;
} else if (err && stderr.search('DL is deprecated') === -1) {
this.log.error(err);
} else {
var dist_repo = '';
var repo_url_finder = / *Git remote: */;
lines.forEach(function(line) {
if(line.search(repo_url_finder) === 0) {
dist_repo = line.slice(line.match(repo_url_finder)[0].length);
}});
if (dist_repo !== '') this.dist_repo_url = dist_repo;
if(this.dist_repo_url !== undefined) {
this.log("New remote git repo at: "+this.dist_repo_url);
}
}
done();
}.bind(this));
child.stdout.on('data', function(data) {
this.log(data.toString());
}.bind(this));
};
Generator.prototype.gitRemoteAdd = function gitRemoteAdd() {
if(this.abort || typeof this.dist_repo_url === 'undefined' || this.openshift_remote_exists) return;
var done = this.async();
this.log(chalk.bold("\nAdding remote repo url: "+this.dist_repo_url));
var child = exec('git remote add '+'openshift'+' '+this.dist_repo_url, { cwd: 'dist' }, function (err, stdout, stderr) {
if (err) {
this.log.error(err);
} else {
this.openshift_remote_exists = true;
}
done();
}.bind(this));
child.stdout.on('data', function(data) {
this.log(data.toString());
}.bind(this));
};
Generator.prototype.enableOpenShiftHotDeploy = function enableOpenshiftHotDeploy() {
if(this.abort || !this.openshift_remote_exists ) return;
var done = this.async();
this.log(chalk.bold("\nEnabling HotDeploy for OpenShift"));
this.copy('hot_deploy', 'dist/.openshift/markers/hot_deploy');
this.conflicter.resolve(function (err) {
done();
});
};
Generator.prototype.gruntBuild = function gruntBuild() {
if(this.abort || !this.openshift_remote_exists ) return;
var done = this.async();
this.log(chalk.bold('\nBuilding dist folder, please wait...'));
var child = exec('grunt build', function (err, stdout) {
if (err) {
this.log.error(err);
}
done();
}.bind(this));
child.stdout.on('data', function(data) {
this.log(data.toString());
}.bind(this));
};
Generator.prototype.gitCommit = function gitInit() {
if(this.abort || !this.openshift_remote_exists ) return;
var done = this.async();
this.log(chalk.bold('\nAdding files for initial commit'));
var child = exec('git add -A && git commit -m "Initial commit"', { cwd: 'dist' }, function (err, stdout, stderr) {
if (stdout.search('nothing to commit') >= 0) {
this.log('Re-pushing the existing "dist" build...');
} else if (err) {
this.log.error(err);
} else {
this.log(chalk.green('Done, without errors.'));
}
done();
}.bind(this));
child.stdout.on('data', function(data) {
this.log(data.toString());
}.bind(this));
};
Generator.prototype.gitForcePush = function gitForcePush() {
if (this.abort || !this.openshift_remote_exists) return;
var done = this.async();
this.log(chalk.bold("\nUploading your initial application code.\n This may take " + chalk.cyan('several minutes') + " depending on your connection speed..."));
var push = spawn('git', ['push', '-f', 'openshift', 'master'], {cwd: 'dist'});
var error = null;
push.stderr.on('data', function (data) {
var output = data.toString();
this.log.error(output);
}.bind(this));
push.stdout.on('data', function (data) {
var output = data.toString();
this.log.stdin(output);
}.bind(this));
push.on('exit', function (code) {
if (code !== 0) {
this.abort = true;
return done();
}
done();
}.bind(this));
};
Generator.prototype.restartApp = function restartApp() {
if(this.abort || !this.openshift_remote_exists ) return;
this.log(chalk.bold("\nRestarting your openshift app.\n"));
var child = exec('rhc app restart -a ' + this.deployedName, function(err, stdout, stderr) {
var host_url = '';
var hasWarning = false;
var before_hostname = this.dist_repo_url.indexOf('@') + 1;
var after_hostname = this.dist_repo_url.length - ( 'openshift'.length + 12 );
host_url = 'http://' + this.dist_repo_url.slice(before_hostname, after_hostname) + 'com';
if(this.filters.facebookAuth) {
this.log(chalk.yellow('You will need to set environment variables for facebook auth:\n\t' +
chalk.bold('rhc set-env FACEBOOK_ID=id -a ' + this.deployedName + '\n\t') +
chalk.bold('rhc set-env FACEBOOK_SECRET=secret -a ' + this.deployedName + '\n')));
hasWarning = true;
}
if(this.filters.googleAuth) {
this.log(chalk.yellow('You will need to set environment variables for google auth:\n\t' +
chalk.bold('rhc set-env GOOGLE_ID=id -a ' + this.deployedName + '\n\t') +
chalk.bold('rhc set-env GOOGLE_SECRET=secret -a ' + this.deployedName + '\n')));
hasWarning = true;
}
if(this.filters.twitterAuth) {
this.log(chalk.yellow('You will need to set environment variables for twitter auth:\n\t' +
chalk.bold('rhc set-env TWITTER_ID=id -a ' + this.deployedName + '\n\t') +
chalk.bold('rhc set-env TWITTER_SECRET=secret -a ' + this.deployedName + '\n')));
hasWarning = true;
}
this.log(chalk.green('\nYour app should now be live at \n\t' + chalk.bold(host_url)));
if(hasWarning) {
this.log(chalk.green('\nYou may need to address the issues mentioned above and restart the server for the app to work correctly \n\t' +
'rhc app-restart -a ' + this.deployedName));
}
this.log(chalk.yellow('After app modification run\n\t' + chalk.bold('grunt build') +
'\nThen deploy with\n\t' + chalk.bold('grunt buildcontrol:openshift')));
}.bind(this));
};