parseArgs.js 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. var defaults = require('./defaults');
  2. var toNum = require('./toNum');
  3. var invert = require('./invert');
  4. var toBool = require('./toBool');
  5. exports = function(args, opts) {
  6. opts = opts || {};
  7. defaults(opts, defOpts);
  8. var names = opts.names;
  9. var shorthands = invert(opts.shorthands);
  10. var remain = [];
  11. var ret = {
  12. remain: remain
  13. };
  14. var name;
  15. var type;
  16. for (var i = 0, len = args.length; i < len; i++) {
  17. var arg = args[i];
  18. var nextArg = args[i + 1];
  19. var match = arg.match(regDoubleDash);
  20. if (match) {
  21. name = match[1];
  22. type = names[name];
  23. if (!type) {
  24. remain.push(arg);
  25. } else if (nextArg && !regDashStart.test(nextArg)) {
  26. setArg(name, nextArg);
  27. i++;
  28. } else if (type === 'boolean') {
  29. setArg(name, true);
  30. i++;
  31. }
  32. continue;
  33. }
  34. match = arg.match(regSingleDash);
  35. if (match) {
  36. var letters = match[1];
  37. for (var j = 0; j < letters.length; j++) {
  38. var letter = letters[j];
  39. name = shorthands[letter];
  40. if (!name) continue;
  41. type = names[name];
  42. if (type === 'boolean') setArg(shorthands[letter], true);
  43. }
  44. continue;
  45. }
  46. remain.push(arg);
  47. }
  48. function setArg(name, val) {
  49. var type = names[name];
  50. switch (type) {
  51. case 'number':
  52. val = toNum(val);
  53. break;
  54. case 'boolean':
  55. val = toBool(val);
  56. break;
  57. default:
  58. break;
  59. }
  60. ret[name] = val;
  61. }
  62. return ret;
  63. };
  64. var defOpts = {
  65. names: {},
  66. shorthands: {}
  67. };
  68. var regDoubleDash = /^--(.+)/;
  69. var regSingleDash = /^-([^-]+)/;
  70. var regDashStart = /^-/;
  71. module.exports = exports;