UNPKG

xena

Version:

eXtended Elasticsearch Node Angular - Create applications using Hapi, Elasticsearch, Node.js, AngularJS

121 lines (103 loc) 3.1 kB
'use strict'; var _ = require('lodash'); var program = require('commander'); var Promise = require('bluebird'); var fs = Promise.promisifyAll(require('fs')); var path = require('path'); var inquirer = require('inquirer'); var chalk = require('chalk'); var shell = require('shelljs'); var mappingAnswers = {}; var appname = process.cwd(); function createFile(file, str) { fs.writeFile(file, str); console.log(chalk.green('\u2713 ') + 'creating file: ' + chalk.blue(file)); } function readTpl(file) { var str = fs.readFileSync(path.join(__dirname, '../templates/', file), {encoding: 'utf8'}); var tpl = _.template(str, { imports: { _: _ } }); return tpl(mappingAnswers); } function createMapping(answers) { var file = appname + '/server/api/' + answers.mapping + '/' + answers.mapping + '.mapping.json'; return Promise.try(function() { return shell.test('-e', file); }) .then(function(exists) { if (exists) return console.log(chalk.red('This mapping already exists.')); if (!shell.test('-e', appname + '/server/api/' + answers.mapping)) { shell.mkdir('-p', appname + '/server/api/' + answers.mapping); shell.chmod(755, appname + '/server/api/' + answers.mapping); console.log(chalk.green('\u2731 ') + 'creating directory: ' + chalk.blue(appname + '/server/api/' + answers.mapping)); console.log(''); } createFile(appname + '/server/api/' + answers.mapping + '/' + answers.mapping + '.mapping.json', readTpl('server/api/endpoint/_.mapping.json') ); }) .catch(function(err) { console.log(chalk.red('Don\'t die Gabrielle!')); throw new Error(err.stack); }) .return('') .tap(function() { console.log(''); }) ; } function parseFields(fields) { var aFields = []; for (var i = 0, l = fields.length; i < l; i++) { var field = fields[i].split(':'); aFields.push({ name: field[0], type: field[1] }); } return aFields; } function mapping(name, fields, options) { var questions = [ { type: 'input', name: 'mapping', message: 'What is the name of the mapping?', when: function() { return !name; } }, { type: 'input', name: 'fields', message: 'What are the fields for this mapping? (the syntax to declare a field is field:type, ex: name:string, each field separated by a space)', when: function() { return !fields || !fields.length; } } ]; if (name) { mappingAnswers.mapping = name; } if (fields && fields.length) { mappingAnswers.fields = parseFields(fields); } if (questions.length) { return inquirer.prompt(questions, function(answers) { answers.fields = parseFields(answers.fields.split(' ')); _.extend(mappingAnswers, answers); return createMapping(mappingAnswers); }); } return createMapping(mappingAnswers); }; module.exports = program .command('mapping [name] [fields...]') .alias('m') .description('Generate a mapping file') .action(mapping) ;