parse.js 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. 'use strict';
  2. var parse = require('../');
  3. var test = require('tape');
  4. test('parse args', function (t) {
  5. t.deepEqual(
  6. parse(['--no-moo']),
  7. { moo: false, _: [] },
  8. 'no'
  9. );
  10. t.deepEqual(
  11. parse(['-v', 'a', '-v', 'b', '-v', 'c']),
  12. { v: ['a', 'b', 'c'], _: [] },
  13. 'multi'
  14. );
  15. t.end();
  16. });
  17. test('comprehensive', function (t) {
  18. t.deepEqual(
  19. parse([
  20. '--name=meowmers', 'bare', '-cats', 'woo',
  21. '-h', 'awesome', '--multi=quux',
  22. '--key', 'value',
  23. '-b', '--bool', '--no-meep', '--multi=baz',
  24. '--', '--not-a-flag', 'eek',
  25. ]),
  26. {
  27. c: true,
  28. a: true,
  29. t: true,
  30. s: 'woo',
  31. h: 'awesome',
  32. b: true,
  33. bool: true,
  34. key: 'value',
  35. multi: ['quux', 'baz'],
  36. meep: false,
  37. name: 'meowmers',
  38. _: ['bare', '--not-a-flag', 'eek'],
  39. }
  40. );
  41. t.end();
  42. });
  43. test('flag boolean', function (t) {
  44. var argv = parse(['-t', 'moo'], { boolean: 't' });
  45. t.deepEqual(argv, { t: true, _: ['moo'] });
  46. t.deepEqual(typeof argv.t, 'boolean');
  47. t.end();
  48. });
  49. test('flag boolean value', function (t) {
  50. var argv = parse(['--verbose', 'false', 'moo', '-t', 'true'], {
  51. boolean: ['t', 'verbose'],
  52. default: { verbose: true },
  53. });
  54. t.deepEqual(argv, {
  55. verbose: false,
  56. t: true,
  57. _: ['moo'],
  58. });
  59. t.deepEqual(typeof argv.verbose, 'boolean');
  60. t.deepEqual(typeof argv.t, 'boolean');
  61. t.end();
  62. });
  63. test('newlines in params', function (t) {
  64. var args = parse(['-s', 'X\nX']);
  65. t.deepEqual(args, { _: [], s: 'X\nX' });
  66. // reproduce in bash:
  67. // VALUE="new
  68. // line"
  69. // node program.js --s="$VALUE"
  70. args = parse(['--s=X\nX']);
  71. t.deepEqual(args, { _: [], s: 'X\nX' });
  72. t.end();
  73. });
  74. test('strings', function (t) {
  75. var s = parse(['-s', '0001234'], { string: 's' }).s;
  76. t.equal(s, '0001234');
  77. t.equal(typeof s, 'string');
  78. var x = parse(['-x', '56'], { string: 'x' }).x;
  79. t.equal(x, '56');
  80. t.equal(typeof x, 'string');
  81. t.end();
  82. });
  83. test('stringArgs', function (t) {
  84. var s = parse([' ', ' '], { string: '_' })._;
  85. t.same(s.length, 2);
  86. t.same(typeof s[0], 'string');
  87. t.same(s[0], ' ');
  88. t.same(typeof s[1], 'string');
  89. t.same(s[1], ' ');
  90. t.end();
  91. });
  92. test('empty strings', function (t) {
  93. var s = parse(['-s'], { string: 's' }).s;
  94. t.equal(s, '');
  95. t.equal(typeof s, 'string');
  96. var str = parse(['--str'], { string: 'str' }).str;
  97. t.equal(str, '');
  98. t.equal(typeof str, 'string');
  99. var letters = parse(['-art'], {
  100. string: ['a', 't'],
  101. });
  102. t.equal(letters.a, '');
  103. t.equal(letters.r, true);
  104. t.equal(letters.t, '');
  105. t.end();
  106. });
  107. test('string and alias', function (t) {
  108. var x = parse(['--str', '000123'], {
  109. string: 's',
  110. alias: { s: 'str' },
  111. });
  112. t.equal(x.str, '000123');
  113. t.equal(typeof x.str, 'string');
  114. t.equal(x.s, '000123');
  115. t.equal(typeof x.s, 'string');
  116. var y = parse(['-s', '000123'], {
  117. string: 'str',
  118. alias: { str: 's' },
  119. });
  120. t.equal(y.str, '000123');
  121. t.equal(typeof y.str, 'string');
  122. t.equal(y.s, '000123');
  123. t.equal(typeof y.s, 'string');
  124. var z = parse(['-s123'], {
  125. alias: { str: ['s', 'S'] },
  126. string: ['str'],
  127. });
  128. t.deepEqual(
  129. z,
  130. { _: [], s: '123', S: '123', str: '123' },
  131. 'opt.string works with multiple aliases'
  132. );
  133. t.end();
  134. });
  135. test('slashBreak', function (t) {
  136. t.same(
  137. parse(['-I/foo/bar/baz']),
  138. { I: '/foo/bar/baz', _: [] }
  139. );
  140. t.same(
  141. parse(['-xyz/foo/bar/baz']),
  142. { x: true, y: true, z: '/foo/bar/baz', _: [] }
  143. );
  144. t.end();
  145. });
  146. test('alias', function (t) {
  147. var argv = parse(['-f', '11', '--zoom', '55'], {
  148. alias: { z: 'zoom' },
  149. });
  150. t.equal(argv.zoom, 55);
  151. t.equal(argv.z, argv.zoom);
  152. t.equal(argv.f, 11);
  153. t.end();
  154. });
  155. test('multiAlias', function (t) {
  156. var argv = parse(['-f', '11', '--zoom', '55'], {
  157. alias: { z: ['zm', 'zoom'] },
  158. });
  159. t.equal(argv.zoom, 55);
  160. t.equal(argv.z, argv.zoom);
  161. t.equal(argv.z, argv.zm);
  162. t.equal(argv.f, 11);
  163. t.end();
  164. });
  165. test('nested dotted objects', function (t) {
  166. var argv = parse([
  167. '--foo.bar', '3', '--foo.baz', '4',
  168. '--foo.quux.quibble', '5', '--foo.quux.o_O',
  169. '--beep.boop',
  170. ]);
  171. t.same(argv.foo, {
  172. bar: 3,
  173. baz: 4,
  174. quux: {
  175. quibble: 5,
  176. o_O: true,
  177. },
  178. });
  179. t.same(argv.beep, { boop: true });
  180. t.end();
  181. });