@redux-multipurpose/angular-cli
Version:
A multipurpose redux tools angular cli
110 lines (98 loc) • 3.6 kB
JavaScript
;
const chalk = require('chalk');
const nodePlop = require('node-plop');
const fs = require('fs');
const defaultChoosingMessage = chalk.blue('[PLOP]') + ' Please choose a generator.';
module.exports = (function () {
function getHelpMessage(generator) {
const maxLen = Math.max(...generator.prompts.map(prompt => prompt.name.length));
console.log([
'',
chalk.bold('Options:'),
...generator.prompts.map(prompt =>
' --' + prompt.name +
' '.repeat(maxLen - prompt.name.length + 2) +
chalk.dim(prompt.help ? prompt.help : prompt.message)
)
].join('\n'));
}
function chooseOptionFromList(plopList, message) {
const plop = nodePlop();
const generator = plop.setGenerator('choose', {
prompts: [{
type: 'list',
name: 'generator',
message: message || defaultChoosingMessage,
choices: plopList.map(function (p) {
return {
name: p.name + chalk.gray(!!p.description ? ' - ' + p.description : ''),
value: p.name
};
})
}]
});
return generator.runPrompts().then(results => results.generator);
}
function displayHelpScreen() {
console.log([
'',
chalk.bold('Usage:'),
' $ plop ' + chalk.dim('Select from a list of available generators'),
' $ plop <name> ' + chalk.dim('Run a generator registered under that name'),
' $ plop <name> [input] ' + chalk.dim('Run the generator with input data to bypass prompts'),
'',
chalk.bold('Options:'),
' -h, --help ' + chalk.dim('Show this help display'),
' -t, --show-type-names ' + chalk.dim('Show type names instead of abbreviations'),
' -i, --init ' + chalk.dim('Generate a basic plopfile.js'),
' -v, --version ' + chalk.dim('Print current version'),
' -f, --force ' + chalk.dim('Run the generator forcefully'),
'',
chalk.dim(' ------------------------------------------------------'),
chalk.dim(' ⚠ danger waits for those who venture below the line'),
'',
chalk.dim(' --plopfile Path to the plopfile'),
chalk.dim(' --cwd Directory from which relative paths are calculated against while locating the plopfile'),
chalk.dim(' --require String or array of modules to require before running plop'),
chalk.dim(' --dest Output to this directory instead of the plopfile\'s parent directory'),
'',
chalk.bold('Examples:'),
' $ ' + chalk.blue('plop'),
' $ ' + chalk.blue('plop component'),
' $ ' + chalk.blue('plop component "name of component"'),
'',
].join('\n'));
}
function createInitPlopfile(force = false){
var initString = 'module.exports = function (plop) {\n\n' +
'\tplop.setGenerator(\'basics\', {\n' +
'\t\tdescription: \'this is a skeleton plopfile\',\n' +
'\t\tprompts: [],\n' +
'\t\tactions: []\n' +
'\t});\n\n' +
'};';
if (fs.existsSync(process.cwd() + '/plopfile.js') && force === false) {
throw Error('"plopfile.js" already exists at this location.');
}
fs.writeFileSync(process.cwd() + '/plopfile.js', initString);
}
const typeDisplay = {
'function': chalk.yellow('->'),
'add': chalk.green('++'),
'addMany': chalk.green('+!'),
'modify': `${chalk.green('+')}${chalk.red('-')}`,
'append': chalk.green('_+'),
'skip': chalk.green('--')
};
const typeMap = (name, noMap) => {
const dimType = chalk.dim(name);
return (noMap ? dimType : typeDisplay[name] || dimType);
};
return {
chooseOptionFromList,
displayHelpScreen,
createInitPlopfile,
typeMap,
getHelpMessage
};
})();