UNPKG

yeoman-generator

Version:

Rails-inspired generator system that provides scaffolding for your apps

150 lines (123 loc) 3.12 kB
'use strict'; var path = require('path'); var fs = require('fs'); var _ = require('lodash'); var table = require('text-table'); /** * @mixin * @alias actions/help */ var help = module.exports; /** * Tries to get the description from a USAGE file one folder above the * source root otherwise uses a default description. */ help.help = function help() { var filepath = path.join(this.sourceRoot(), '../USAGE'); var exists = fs.existsSync(filepath); var out = [ 'Usage:', ' ' + this.usage(), '' ]; // build options if (Object.keys(this._options).length) { out = out.concat([ 'Options:', this.optionsHelp(), '' ]); } // build arguments if (this._arguments.length) { out = out.concat([ 'Arguments:', this.argumentsHelp(), '' ]); } // append USAGE file is any if (exists) { out.push(fs.readFileSync(filepath, 'utf8')); } return out.join('\n'); }; function formatArg(argItem) { var arg = '<' + argItem.name + '>'; if (!argItem.config.required) { arg = '[' + arg + ']'; } return arg; } /** * Output usage information for this given generator, depending on its arguments, * options or hooks. */ help.usage = function usage() { var options = Object.keys(this._options).length ? '[options]' : ''; var name = ' ' + this.options.namespace; var args = ''; if (this._arguments.length) { args = this._arguments.map(formatArg).join(' '); } name = name.replace(/^yeoman:/, ''); var out = 'yo' + name + ' ' + options + ' ' + args; if (this.description) { out += '\n\n' + this.description; } return out; }; /** * Simple setter for custom `description` to append on help output. * * @param {String} description */ help.desc = function desc(description) { this.description = description || ''; return this; }; /** * Get help text for arguments * @returns {String} Text of options in formatted table */ help.argumentsHelp = function argumentsHelp() { var rows = this._arguments.map(function (arg) { var config = arg.config; return [ '', arg.name ? arg.name : '', config.desc ? '# ' + config.desc : '', config.type ? 'Type: ' + config.type.name : '', 'Required: ' + config.required ]; }); return table(rows); }; /** * Get help text for options * @returns {String} Text of options in formatted table */ help.optionsHelp = function optionsHelp() { var options = _.reject(this._options, function (el) { return el.hide; }); var hookOpts = this._hooks.map(function (hook) { return hook.generator && hook.generator._options; }).reduce(function (a, b) { a = a.concat(b); return a; }, []).filter(function (opts) { return opts && opts.name !== 'help'; }); var rows = options.concat(hookOpts).map(function (opt) { var defaults = opt.defaults; return [ '', opt.alias ? '-' + opt.alias + ', ' : '', '--' + opt.name, opt.desc ? '# ' + opt.desc : '', defaults == null || defaults === '' ? '' : 'Default: ' + defaults ]; }); return table(rows); };