jay-depot/turnpike

View on GitHub
bin/turnpike.js

Summary

Maintainability
B
4 hrs
Test Coverage
#!/usr/bin/env node
/**
 * Turnpike.JS command line utility.
 */
var path = require('path');
var fs = require('fs-extra');
var bindir = path.dirname(module.filename);
var moddir = path.normalize(bindir + '/..');
var turnpike;
var cmdln = require('cmdln');
var util = require('util');

try {
  turnpike = require(path.join(process.cwd(), 'node_modules', 'turnpike'));
}
catch (e) {
  turnpike = require(moddir);
}

turnpike.config.initialize();

function Turnpike() {
  cmdln.Cmdln.call(this, {
    'name': 'turnpike',
    'desc': 'turnpike command-line utility. Generate projects and project components or start a server',
    'options': [
      {names: ['help', 'h'], type: 'bool', help: 'Print help and exit.'},
      {names: ['version', 'v'], type: 'bool', help: 'Print version and exit.'}
    ]
  });
} util.inherits(Turnpike, cmdln.Cmdln);

Turnpike.prototype.do_drive = function(subcmd, opts, args, cb) {
  var turnpike;
  try {
    turnpike = require(path.join(process.cwd(), 'node_modules', 'turnpike'));
  }
  catch (e) {
    console.error('Could not load turnpike from ./node_modules.' +
      ' Make sure the current directory is a Turnpike project, and you have run npm install');
    process.exit(1);
  }
  turnpike.server.drive();
};

Turnpike.prototype.do_drive.help = (
  'Run project in current directory in production mode\n'
  + '\n'
  + 'Usage:\n'
  + '{{name}} drive\n'
  + '\n'
  + '\n'
  );

Turnpike.prototype.do_testdrive = function(subcmd, opts, args, cb) {
  var turnpike;
  try {
    turnpike = require(path.join(process.cwd(), 'node_modules', 'turnpike'));
  }
  catch (e) {
    console.error('Could not load turnpike from node_modules.' +
      ' Make sure the current directory is a Turnpike project, and you have run npm install');
    process.exit(1);
  }
  console.log("Starting a test drive on port " + turnpike.config.port);
  turnpike.config.testing = true;
  this.do_drive(subcmd, opts, args, cb);
};

Turnpike.prototype.do_testdrive.help = (
  'Run project in current directory in testing mode\n'
  + '\n'
  + 'Usage:\n'
  + '{{name}} testdrive\n'
  + '\n'
  + '\n'
);

Turnpike.prototype.do_create = TurnpikeCreate;

Turnpike.prototype.init = function (opts, args, cb) {
  if (opts.version) {
    console.log(turnpike.config.turnpike.version);
    return cb(false);
  }
  cmdln.Cmdln.prototype.init.apply(this, arguments);
};

function TurnpikeCreate() {
  cmdln.Cmdln.call(this, {
    'name': 'turnpike create',
    'desc': 'Create a new project, or a new access ruleset, collection, controller, or view in the current project',
    'options': []
  });
} util.inherits(TurnpikeCreate, cmdln.Cmdln);

TurnpikeCreate.prototype.do_project = function(subcmd, opts, name, cb) {
  var project = {};
  var pkg = {};
  var turnpike_pkg = fs.readJsonSync(path.join(moddir, 'package.json'));
  var config = {};

  if (name.length < 1) {
    console.log("Usage: turnpike create project <Project Name>");
    process.exit(1);
  }

  project.name = name.join(' ');
  project.dir = name.join('-').toLowerCase();

  if (fs.existsSync(project.dir)) {
    console.log("Error: directory " + project.dir + " already exists. Not modified.");
    process.exit(2);
  }

  console.log('creating project: ' + project.name + ' in ' + project.dir);
  fs.copySync(bindir + '/skeletons/project', project.dir);
  pkg = fs.readJsonSync(path.join(project.dir, 'package.json'));
  config = fs.readJsonSync(path.join(project.dir, 'config.json'));

  pkg.name = project.dir;
  pkg.version = '0.0.1';
  pkg.main = 'app.js';
  pkg.dependencies = pkg.dependencies || {};
  pkg.dependencies.turnpike = turnpike_pkg.version

  fs.writeJsonSync(path.join(project.dir, 'package.json'), pkg);
  config.sitename = project.name;
  fs.writeJsonSync(path.join(project.dir, 'config.json'), config);
  console.log('Your new project, ' + project.name + ', was created in ' +
    path.normalize(project.dir) +
    ' You may now enter that directory, run npm install, and start your server by running turnpike drive.');
  cb();
};

TurnpikeCreate.prototype.do_project.help = (
  'Creates a skeleton project of the given name in the current directory.\n'
    + '\n'
    + 'Usage:\n'
    + '{{name}} create project <Project Name>\n'
    + '\n'
    + '\n'
  );

TurnpikeCreate.prototype.do_access = function(subcmd, options, args, cb) {
  var template;
  var output;

  if (args.length !== 1) {
    console.log('Usage: turnpike create access <controller>\n');
    process.exit(1);
  }

  template = _.template(fs.readFileSync(path.join(bindir, 'skeletons', 'access', 'template.ejs'),
    {'encoding': 'utf8'}));

  output = template({
    'name': args[0]
  });

  fs.writeFileSync(path.join('application', 'access', args + '.js'), output);
  cb();
};

TurnpikeCreate.prototype.do_access.help = (
  'Creates an access ruleset scaffold for the given controller.\n'
    + '\n'
    + 'Usage:\n'
    + '{{name}} create access <controller>\n'
    + '\n'
    + '\n'
  );

TurnpikeCreate.prototype.do_view = function(subcmd, options, args, cb) {
  if (name.length < 1) {
    console.error('You asked me to create a view, but did not give a name');
    process.exit(2);
  }
  else if (name.length === 1 && name[0].toLowerCase() === 'for') {
    console.error('You asked me to create a view for a model, but did not give a name');
    process.exit(2);
  }
  else {
    var create_view = require('./support/create_view').create_view;
    create_view(name, path.join(bindir, 'skeletons'));
  }
};

if (require.main === module) {
  cmdln.main(new Turnpike(), {showErrStack: true});
}

/*
program
  .command('create <type> <name>')
  .description('create a new project')
  .action(function(type, name) {
    var targets = {};

    name = name.split(' ');

    targets.controller = function(attachModel) {
      var template,
        output,
        name = name[0];

      attachModel = attachModel || false;
      template = _.template(fs.readFileSync(path.join(bindir, 'skeletons', 'controller', 'template.ejs'), {'encoding': 'utf8'}));

      output = template({
        'name': name,
        'attachModel': attachModel
      });

      fs.writeFileSync(path.join('application', 'controllers', name + '.js'), output);
    };

    targets.collection = function() {};


    if (typeof targets[type] === "function") {
      targets[type]();
    }
  });

program.parse(process.argv);

/*
handler.verify = function(target, modifiers) {
  var targets = {};

  targets.routes = require('./support/verify_routes');

  if (typeof targets[target] === "function") {
    targets[target]();
  }
};
*/