You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
125 lines
2.7 KiB
125 lines
2.7 KiB
'use strict';
|
|
const path = require('path');
|
|
const fs = require('fs');
|
|
const _ = require('lodash');
|
|
const table = require('text-table');
|
|
|
|
/**
|
|
* @mixin
|
|
* @alias actions/help
|
|
*/
|
|
const help = module.exports;
|
|
|
|
/**
|
|
* Tries to get the description from a USAGE file one folder above the
|
|
* source root otherwise uses a default description
|
|
*
|
|
* @return {String} Help message of the generator
|
|
*/
|
|
help.help = function() {
|
|
const filepath = path.resolve(this.sourceRoot(), '../USAGE');
|
|
const exists = fs.existsSync(filepath);
|
|
|
|
let out = ['Usage:', ' ' + this.usage(), ''];
|
|
|
|
// Build options
|
|
if (Object.keys(this._options).length > 0) {
|
|
out = out.concat(['Options:', this.optionsHelp(), '']);
|
|
}
|
|
|
|
// Build arguments
|
|
if (this._arguments.length > 0) {
|
|
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(config) {
|
|
let arg = `<${config.name}>`;
|
|
|
|
if (!config.required) {
|
|
arg = `[${arg}]`;
|
|
}
|
|
|
|
return arg;
|
|
}
|
|
|
|
/**
|
|
* Output usage information for this given generator, depending on its arguments
|
|
* or options
|
|
*
|
|
* @return {String} Usage information of the generator
|
|
*/
|
|
help.usage = function() {
|
|
const options = Object.keys(this._options).length ? '[options]' : '';
|
|
let name = this.options.namespace;
|
|
let args = '';
|
|
|
|
if (this._arguments.length > 0) {
|
|
args = this._arguments.map(formatArg).join(' ') + ' ';
|
|
}
|
|
|
|
name = name.replace(/^yeoman:/, '');
|
|
let out = `yo ${name} ${args}${options}`;
|
|
|
|
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(description) {
|
|
this.description = description || '';
|
|
return this;
|
|
};
|
|
|
|
/**
|
|
* Get help text for arguments
|
|
* @returns {String} Text of options in formatted table
|
|
*/
|
|
help.argumentsHelp = function() {
|
|
const rows = this._arguments.map(config => {
|
|
return [
|
|
'',
|
|
config.name ? config.name : '',
|
|
config.description ? `# ${config.description}` : '',
|
|
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() {
|
|
const options = _.reject(this._options, x => x.hide);
|
|
|
|
const rows = options.map(opt => {
|
|
return [
|
|
'',
|
|
opt.alias ? `-${opt.alias}, ` : '',
|
|
`--${opt.name}`,
|
|
opt.description ? `# ${opt.description}` : '',
|
|
opt.default !== undefined && opt.default !== '' ? 'Default: ' + opt.default : ''
|
|
];
|
|
});
|
|
|
|
return table(rows);
|
|
};
|
|
|