UNPKG

jackson

Version:

Jackson, the web application framework

193 lines (172 loc) 6.82 kB
// Generated by CoffeeScript 1.9.3 (function() { var CLI, addClassHelpers, clone, extend, fs, jacksonVersion, minimist, open, paramCase, pascalCase, path, ref, snakeCase, spawn, slice = [].slice, hasProp = {}.hasOwnProperty; fs = require('fs'); path = require('path'); spawn = require('child_process').spawn; minimist = require('minimist'); pascalCase = require('pascal-case'); snakeCase = require('snake-case'); paramCase = require('param-case'); open = require('open'); ref = require('./util'), extend = ref.extend, clone = ref.clone, addClassHelpers = ref.addClassHelpers, jacksonVersion = ref.jacksonVersion; CLI = (function() { addClassHelpers(CLI); function CLI(app, argv) { this.app = app; this.argv = argv || process.argv.slice(2); this.args = minimist(this.argv); this.commands = clone(this.jacksonCommands); if (this.app) { extend(this.commands, this.appCommands); } } CLI.prototype.run = function() { var arg, command, handler, params, ref1, ref2, value; ref1 = this.args._, command = ref1[0], params = 2 <= ref1.length ? slice.call(ref1, 1) : []; ref2 = this.args; for (arg in ref2) { if (!hasProp.call(ref2, arg)) continue; value = ref2[arg]; if (value === true && !command) { if (this.commands[arg]) { command = arg; } } } command || (command = 'default'); handler = this.handler(command); if (handler) { handler.apply(this, params); return true; } else { this.handler('missing').apply(this, this.args._); return false; } }; CLI.prototype.printUsage = function() { var command, usage; command = arguments[0], usage = 2 <= arguments.length ? slice.call(arguments, 1) : []; return console.log.apply(console, ["usage:", "jack".yellow, command.yellow].concat(slice.call(usage))); }; CLI.prototype.handler = function(command) { var handler; handler = this.commands[command]; while (typeof handler === 'string') { handler = this.commands[handler]; } return handler; }; CLI.prototype.jacksonCommands = { "default": 'help', missing: 'help', h: 'help', help: function() { var appHelp, jacksonHelp, versionString; versionString = "Jackson v" + jacksonVersion; console.log(Array(versionString.length + 1).join("-")); console.log(versionString); console.log(Array(versionString.length + 1).join("-")); console.log(); jacksonHelp = "Jackson commands:\n " + 'new'.yellow + ": Create a new Jackson project\n usage: jack new MyApp"; appHelp = "Application commands:\n " + 'server'.yellow + ": Start the web server (alias 's')\n --port=1234 - Listen on a port (default, alias '-p')\n --host=localhost - Bind to a specific host when listening on a port\n --socket=/path/to/socket - Listen on a socket\n\n --open - Open the URL in your default web browser after listening\n\n " + 'repl'.yellow + ": Start a REPL (alias 'r')"; if (this.app) { console.log(jacksonHelp); console.log(""); return console.log(appHelp); } else { return console.log(jacksonHelp); } }, "new": function(applicationName, directory) { var copyFiles, install, skelDir, vars; if (!applicationName) { this.printUsage("new", "MyApp".white, "[directory]"); return; } directory || (directory = path.join(process.cwd(), snakeCase(applicationName))); vars = { APPLICATION_NAME: pascalCase(applicationName), PACKAGE_NAME: paramCase(applicationName), JACKSON_VERSION: jacksonVersion }; if (!fs.existsSync(directory) || !fs.statSync(directory).isDirectory()) { fs.mkdirSync(directory); } copyFiles = function(source, dest) { var contents, destPath, fileName, i, len, name, ref1, results, sourcePath, value; ref1 = fs.readdirSync(source); results = []; for (i = 0, len = ref1.length; i < len; i++) { fileName = ref1[i]; sourcePath = path.join(source, fileName); destPath = path.join(dest, fileName); if (fs.statSync(sourcePath).isDirectory()) { if (!fs.existsSync(destPath)) { fs.mkdirSync(destPath); } results.push(copyFiles(sourcePath, destPath)); } else { console.log("Copying".yellow, sourcePath.white, "=>".yellow, destPath.white); contents = fs.readFileSync(sourcePath).toString(); for (name in vars) { if (!hasProp.call(vars, name)) continue; value = vars[name]; contents = contents.split("$" + name + "$").join(value); } results.push(fs.writeFileSync(destPath, contents.trim())); } } return results; }; skelDir = __dirname + '/../skel/' + (this.args.js ? 'js' : 'coffee'); copyFiles(skelDir, directory); console.log(); console.log("Running npm install..."); install = spawn("npm", ["install"], { cwd: directory, stdio: ['ignore', 'ignore', 'ignore'] }); return install.on('close', function(status) { console.log(""); if (status === 0) { return console.log("New application " + vars.APPLICATION_NAME.yellow + " created in " + directory.yellow); } else { console.log("Error during npm install".red); return console.log("The new application has been left in " + directory + " for you to investigate"); } }); }, v: 'version', version: function() { return console.log("Jackson v" + jacksonVersion); } }; CLI.prototype.appCommands = { "default": 'server', s: 'server', server: function() { var bindOn, socketOrPort; socketOrPort = this.args.socket || parseInt(this.args.port || this.args.p) || 1234; bindOn = this.args.host; return this.app.listen(socketOrPort, bindOn, (function(_this) { return function(port, host) { if (_this.args.open && typeof socketOrPort === 'number') { host || (host = "localhost"); return open("http://" + host + ":" + port + "/"); } }; })(this)); }, c: 'repl', r: 'repl', repl: function() { return this.app.startRepl(); } }; return CLI; })(); module.exports = CLI; }).call(this);