index.js 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. "use strict";
  2. var __importDefault = (this && this.__importDefault) || function (mod) {
  3. return (mod && mod.__esModule) ? mod : { "default": mod };
  4. };
  5. const lodash_1 = require("lodash");
  6. const microargs_1 = __importDefault(require("microargs"));
  7. const path_1 = __importDefault(require("path"));
  8. class CLIError extends Error {
  9. }
  10. function optionToString(optionName) {
  11. return optionName.length === 1 ? `-${optionName}` : `--${optionName}`;
  12. }
  13. function optionsToString(optionsKeys) {
  14. return optionsKeys.map(optionToString).join(" ");
  15. }
  16. function printHelp(scriptName, annotations, logger) {
  17. if (lodash_1.isEmpty(annotations)) {
  18. logger.log("Documentation not found");
  19. return null;
  20. }
  21. const { description, params, options } = annotations;
  22. const extra = lodash_1.omit(annotations, ["description", "params", "options"]);
  23. const usageOptions = lodash_1.isEmpty(options) ? "" : "[options]";
  24. const usageParams = !Array.isArray(params) || lodash_1.isEmpty(params) ? "" : `[${params.join(" ")}]`;
  25. logger.log(`Usage: ${path_1.default.basename(scriptName)} ${usageOptions} ${usageParams}\n`);
  26. if (description) {
  27. logger.log(`${description}\n`);
  28. }
  29. if (!lodash_1.isEmpty(options)) {
  30. logger.log("Options:\n");
  31. lodash_1.forEach(options, (value, key) => {
  32. logger.log(` ${lodash_1.padEnd(optionToString(key), 12)}${value}`);
  33. });
  34. }
  35. lodash_1.forEach(extra, (value, key) => {
  36. logger.log(`\n${lodash_1.capitalize(key)}:\n`);
  37. logger.log(`${value}\n`);
  38. });
  39. }
  40. const Cli = (argv, annotations = {}, help = printHelp, logger = console) => {
  41. return (callback) => {
  42. const { params, options } = microargs_1.default(argv.slice(2));
  43. const scriptName = path_1.default.basename(argv[1]);
  44. if (lodash_1.isString(annotations)) {
  45. annotations = {
  46. description: annotations
  47. };
  48. }
  49. if (options.help) {
  50. return help(scriptName, annotations, logger);
  51. }
  52. const annotatedOptionsKeys = (annotations &&
  53. annotations.options &&
  54. Object.keys(annotations.options)) ||
  55. [];
  56. const optionsKeys = Object.keys(options);
  57. const illegalOptionsKeys = lodash_1.difference(optionsKeys, annotatedOptionsKeys);
  58. if (annotatedOptionsKeys.length && illegalOptionsKeys.length) {
  59. const msg = `Illegal option: ${optionsToString(illegalOptionsKeys)}\n` +
  60. `Available options: ${optionsToString(annotatedOptionsKeys)}\n` +
  61. `Type "${scriptName} --help" for more information`;
  62. throw new CLIError(msg);
  63. }
  64. return callback(options, ...params);
  65. };
  66. };
  67. Cli.CliError = CLIError;
  68. module.exports = Cli;
  69. //# sourceMappingURL=index.js.map