gapp
Version:
Automate Development
364 lines (329 loc) • 9.24 kB
JavaScript
module.exports = (function() {
const yeoman = require('yeoman-environment');
const env = yeoman.createEnv();
const args = process.argv;
const fs = require('fs');
const request = require('request');
const search = require('node-modules');
const package_names = require("all-the-package-names");
const argv = require('yargs').argv;
const shell = require('shelljs');
const exec = shell.exec;
const npmCheck = require('npm-check');
const global_dir = require('global-modules');
const express = require('express')
const app = express()
const modules_installed = function() {
return npmCheck({ global: true })
.then(function(modules) {
return modules.get('packages');
});
};
var genran = false;
function npmInstallPackage(deps, opts, cb) {
if (!cb) {
cb = opts
opts = {}
}
deps = Array.isArray(deps) ? deps : [deps]
opts = opts || opts
cb = cb || noop
var args = []
if (opts.save) args.push('--save')
if (opts.saveDev) args.push('--save-dev')
if (opts.global) args.push('-g')
if (opts.silent === false) {
deps.forEach(function(dep) {
process.stdout.write('pkg: ' + dep + '\n')
})
}
var cliArgs = ['npm i'].concat(args, deps).join(' ')
exec(cliArgs, function(err, name) {
if (err) return cb(err)
cb()
})
}
function npmUnInstallPackage(deps, opts, cb) {
if (!cb) {
cb = opts
opts = {}
}
deps = Array.isArray(deps) ? deps : [deps]
opts = opts || opts
cb = cb || noop
var args = []
if (opts.global) args.push('-g')
if (opts.silent === false) {
deps.forEach(function(dep) {
process.stdout.write('pkg: ' + dep + '\n')
})
}
var cliArgs = ['npm uninstall'].concat(args, deps).join(' ')
exec(cliArgs, function(err, name) {
if (err) return cb(err)
cb()
})
}
function noop() {}
function runGenerator(ran) {
var isgen = false;
var modules = modules_installed();
var generator = argv.gen;
var hasyo = false;
if (!ran) {
console.log("Let's go! Gapp generator started!");
modules.then(function(response) {
for (var i = 0; i < response.length; i++) {
if (response[i].moduleName == 'generator-' + generator) {
try {
env.register(require.resolve(global_dir + '/generator-' + generator + '/generators/app'), 'npm:app');
env.run('npm:app');
genran = true;
} catch (e) {
try {
env.register(require.resolve(global_dir + '/generator-' + generator + '/app'), 'npm:app');
env.run('npm:app');
genran = true;
} catch (e) {
console.log("Doesn't look like " + argv.gen + " is installed! Let's install it and try to run it!");
genran = false;
}
}
} else if (response.length - 1 == i) {
if (!genran) {
runGenerator(true);
}
}
if (response[i].moduleName == 'yo') {
hasyo = true;
}
}
if (!hasyo) {
npmInstallPackage('yo', { global: true }, function(err) {});
}
});
} else {
npmInstallPackage('generator-' + generator, { global: true }, function(err) {
if (!err) {
try {
env.register(require.resolve(global_dir + '/generator-' + generator + '/generators/app'), 'npm:app');
env.run('npm:app');
} catch (e) {
try {
env.register(require.resolve(global_dir + '/generator-' + generator + '/app'), 'npm:app');
env.run('npm:app');
genran = true;
} catch (e) {
console.log(e)
}
}
} else {
console.log(err);
}
});
}
}
function conditional(args) {
if (argv._.length) {
var if_return,
if_statement,
else_return,
elseif_return,
elseif_statement,
if_statement,
else_return,
conditional_if,
conditional_if_else;
var statement = argv._.join(' ');
var converted_statment = statement.replace(/if/g, '-f').replace(/then/g, '-t').replace(/else/g, '-e');
var end_statement = '';
try {
if_statement = converted_statment.match("-f (.*) -t (.*) -e-f")[1];
if_statement = '"' + if_statement.split(' ')[0] + '" ' + if_statement.split(' ')[1] + ' "' + if_statement.split(' ')[2] + '"';
if_return = converted_statment.match("-t (.*) -e-f")[1];
} catch (e) {
try {
if_statement = converted_statment.match("-f (.*) -t (.*)")[1];
if_return = converted_statment.match("-t (.*)")[1];
if_statement = '"' + if_statement.split(' ')[0] + '" ' + if_statement.split(' ')[1] + ' "' + if_statement.split(' ')[2] + '"';
} catch (e) {}
}
try {
elseif_statement = converted_statment.match("-e-f (.*) -t (.*) -e")[1];
elseif_return = converted_statment.match("-e-f (.*) -t (.*) -e")[2];
elseif_statement = '"' + elseif_statement.split(' ')[0] + '" ' + elseif_statement.split(' ')[1] + ' "' + elseif_statement.split(' ')[2] + '"';
} catch (e) {
try {
elseif_statement = converted_statment.match("-e-f (.*) -t (.*)")[1];
elseif_return = converted_statment.match("-e-f (.*) -t (.*)")[2];
elseif_statement = '"' + elseif_statement.split(' ')[0] + '" ' + elseif_statement.split(' ')[1] + ' "' + elseif_statement.split(' ')[2] + '"';
} catch (e) {}
}
try {
else_return = converted_statment.match("-e (.*)")[1];
} catch (e) {}
return (eval(if_statement) ? shell.exec(if_return) : (eval(elseif_statement) ? shell.exec(elseif_return) : (eval(else_return != undefined) ? shell.exec(else_return) : false)))
}
}
function uninstall() {
if (argv.u) {
var package_opts = {};
if (!argv.l) {
package_opts.global = true;
}
if (package_names.includes(argv.u)) {
console.log('Uninstalling ' + argv.u);
npmUnInstallPackage(argv.u, package_opts, function(err) {
if (err) {
throw err;
} else {
console.log('Finished uninstalling ' + argv.u);
}
});
} else {
console.log("That module doesn't exist!")
}
}
}
function install() {
if (argv.i || argv.g || argv.s) {
var package_name;
var package_opts = {};
if (argv.i && argv.i != true) {
package_name = argv.i;
} else if (argv.g && argv.g != true) {
package_name = argv.g;
package_opts.global = true;
} else if (argv.s && argv.s != true) {
package_name = argv.s;
package_opts.save = true;
} else if (argv.d && argv.d != true) {
package_name = argv.d;
package_opts.saveDev = true;
} else {
package_name = argv.i;
package_opts.save = true;
}
if (package_names.includes(package_name)) {
console.log('Installing ' + package_name);
npmInstallPackage(package_name, package_opts, function(err) {
if (err) {
throw err;
} else {
console.log('Finished installing ' + package_name);
}
});
} else {
console.log("That module doesn't exist!")
}
}
}
function run() {
if (argv.r) {
var strings = '';
if (argv._.length) {
strings = argv._.join(' ');
}
console.log('Running ' + argv.r + ' ' + strings);
var proc = shell.exec(argv.r + ' ' + strings);
}
}
function generator() {
if (argv.gen) {
runGenerator();
}
}
function serve() {
if (argv.serve) {
var PORT;
if (argv.p) {
PORT = parseInt(argv.p);
} else {
PORT = 3000;
}
if (!argv.m && !argv.file) {
console.log("Message or file required. eg. gapp --serve / --type get --m 'Hey I'm at the get route!' or gapp --serve / --type [get, post, delete, put] --file app/index.html --static app/public");
} else {
if (argv.type === 'get') {
app.get(argv.serve, function(req, res) {
if (argv.file) {
res.sendFile(process.cwd() + '/' + argv.file);
} else {
res.send(argv.m);
}
});
} else if (argv.type === 'post') {
app.post(argv.serve, function(req, res) {
if (argv.file) {
res.sendFile(process.cwd() + '/' + argv.file);
} else {
res.send(argv.m);
}
});
} else if (argv.type === 'delete') {
app.delete(argv.serve, function(req, res) {
if (argv.file) {
res.sendFile(process.cwd() + '/' + argv.file);
} else {
res.send(argv.m);
}
});
} else if (argv.type === 'put') {
app.put(argv.serve, function(req, res) {
if (argv.file) {
res.sendFile(process.cwd() + '/' + argv.file);
} else {
res.send(argv.m);
}
});
} else {
app.get(argv.serve, function(req, res) {
if (argv.file) {
res.sendFile(process.cwd() + '/' + argv.file);
} else {
res.send(argv.m);
}
});
}
if (argv.static) {
app.use(express.static(process.cwd() + '/' + argv.static))
}
app.listen(PORT, function() {
console.log('Listening on port 3000!')
});
}
} else {
console.log("Please specify a directory to serve!")
}
}
var gapp = {
generator: generator,
serve: serve,
install: install,
uninstall: uninstall,
run: run,
conditional: conditional
};
function map() {
if (argv._.length) {
gapp.conditional();
}
if (argv.serve) {
gapp.serve();
}
if (argv.i || argv.g || argv.s) {
gapp.install();
}
if (argv.u) {
gapp.uninstall();
}
if (argv.r) {
gapp.run();
}
if (argv.gen) {
gapp.generator();
}
}
return map();
})();