cliHelp.js 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. var template = require('./template');
  2. var each = require('./each');
  3. var map = require('./map');
  4. var rpad = require('./rpad');
  5. var ansiColor = require('./ansiColor');
  6. var toArr = require('./toArr');
  7. var cloneDeep = require('./cloneDeep');
  8. var strWidth = require('./strWidth');
  9. var max = require('./max');
  10. exports = function(data) {
  11. data = cloneDeep(data);
  12. data.usage = toArr(data.usage);
  13. if (data.commands) {
  14. var cmdNameWidths = map(data.commands, function(command) {
  15. return strWidth(command.name);
  16. });
  17. data.maxNameWidth = max.apply(null, cmdNameWidths);
  18. return helpTpl(data);
  19. }
  20. each(data.options, function(option) {
  21. option.name =
  22. (option.shorthand ? '-' + option.shorthand + ', ' : ' ') +
  23. '--' +
  24. option.name;
  25. });
  26. var optNameWidths = map(data.options, function(option) {
  27. return strWidth(option.name);
  28. });
  29. data.maxNameWidth = max.apply(null, optNameWidths);
  30. return cmdTpl(data);
  31. };
  32. var tplUtil = {
  33. each: each
  34. };
  35. tplUtil.rpad = function(text, len) {
  36. return rpad(text, len, ' ');
  37. };
  38. each(['yellow', 'green', 'cyan', 'red', 'white', 'magenta'], function(color) {
  39. tplUtil[color] = function(text) {
  40. return ansiColor[color](text);
  41. };
  42. });
  43. var cmdTpl = template(
  44. [
  45. 'Usage:',
  46. '',
  47. "<% util.each(usage, function (value) { %> <%=util.cyan(name)%> <%=value%><%='\\n'%><% }); %>",
  48. '<% if (options) { %>Options:',
  49. '',
  50. "<% util.each(options, function (option) { %> <%=util.yellow(util.rpad(option.name, maxNameWidth))%> <%=option.desc%><%='\\n'%><% }); %>",
  51. '<% } %>Description:',
  52. '',
  53. ' <%=desc%>'
  54. ].join('\n'),
  55. tplUtil
  56. );
  57. var helpTpl = template(
  58. [
  59. 'Usage:',
  60. '',
  61. "<% util.each(usage, function (value) { %> <%=util.cyan(name)%> <%=value%><%='\\n'%><% }); %>",
  62. 'Commands:',
  63. '',
  64. "<% util.each(commands, function (command) { %> <%=util.yellow(util.rpad(command.name, maxNameWidth))%> <%=command.desc%><%='\\n'%><% }); %>",
  65. "Run '<%=util.cyan(name + ' help <command>')%>' for more information on a specific command"
  66. ].join('\n'),
  67. tplUtil
  68. );
  69. module.exports = exports;