Skip to content

Commit a2f36d7

Browse files
authored
feat: basic support for shorts (#50)
1 parent 724df10 commit a2f36d7

File tree

2 files changed

+76
-6
lines changed

2 files changed

+76
-6
lines changed

index.js

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -113,14 +113,20 @@ const parseArgs = (
113113
ArrayPrototypeSlice(argv, ++pos)
114114
);
115115
return result;
116-
} else if (
117-
StringPrototypeCharAt(arg, 1) !== '-'
118-
) { // Look for shortcodes: -fXzy
119-
throw new ERR_NOT_IMPLEMENTED('shortcodes');
116+
} else if (StringPrototypeCharAt(arg, 1) !== '-') {
117+
// Look for shortcodes: -fXzy
118+
if (arg.length > 2) {
119+
throw new ERR_NOT_IMPLEMENTED('short option groups');
120+
}
121+
122+
arg = StringPrototypeCharAt(arg, 1); // short
123+
if (options.short && options.short[arg])
124+
arg = options.short[arg]; // now long!
125+
// ToDo: later code tests for `=` in arg and wrong for shorts
126+
} else {
127+
arg = StringPrototypeSlice(arg, 2); // remove leading --
120128
}
121129

122-
arg = StringPrototypeSlice(arg, 2); // remove leading --
123-
124130
if (StringPrototypeIncludes(arg, '=')) {
125131
// Store option=value same way independent of `withValue` as:
126132
// - looks like a value, store as a value

test/index.js

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,70 @@ const { parseArgs } = require('../index.js');
66

77
// Test results are as we expect
88

9+
test('when short option used as flag then stored as flag', function(t) {
10+
const passedArgs = ['-f'];
11+
const expected = { flags: { f: true }, values: { f: undefined }, positionals: [] };
12+
const args = parseArgs(passedArgs);
13+
14+
t.deepEqual(args, expected);
15+
16+
t.end();
17+
});
18+
19+
test('when short option used as flag before positional then stored as flag and positional (and not value)', function(t) {
20+
const passedArgs = ['-f', 'bar'];
21+
const expected = { flags: { f: true }, values: { f: undefined }, positionals: [ 'bar' ] };
22+
const args = parseArgs(passedArgs);
23+
24+
t.deepEqual(args, expected);
25+
26+
t.end();
27+
});
28+
29+
test('when short option withValue used with value then stored as value', function(t) {
30+
const passedArgs = ['-f', 'bar'];
31+
const passedOptions = { withValue: ['f'] };
32+
const expected = { flags: { f: true }, values: { f: 'bar' }, positionals: [] };
33+
const args = parseArgs(passedArgs, passedOptions);
34+
35+
t.deepEqual(args, expected);
36+
37+
t.end();
38+
});
39+
40+
test('when short option listed in short used as flag then long option stored as flag', function(t) {
41+
const passedArgs = ['-f'];
42+
const passedOptions = { short: { f: 'foo' } };
43+
const expected = { flags: { foo: true }, values: { foo: undefined }, positionals: [] };
44+
const args = parseArgs(passedArgs, passedOptions);
45+
46+
t.deepEqual(args, expected);
47+
48+
t.end();
49+
});
50+
51+
test('when short option listed in short and long listed in withValue and used with value then long option stored as value', function(t) {
52+
const passedArgs = ['-f', 'bar'];
53+
const passedOptions = { short: { f: 'foo' }, withValue: ['foo'] };
54+
const expected = { flags: { foo: true }, values: { foo: 'bar' }, positionals: [] };
55+
const args = parseArgs(passedArgs, passedOptions);
56+
57+
t.deepEqual(args, expected);
58+
59+
t.end();
60+
});
61+
62+
test('when short option withValue used without value then stored as flag', function(t) {
63+
const passedArgs = ['-f'];
64+
const passedOptions = { withValue: ['f'] };
65+
const expected = { flags: { f: true }, values: { f: undefined }, positionals: [] };
66+
const args = parseArgs(passedArgs, passedOptions);
67+
68+
t.deepEqual(args, expected);
69+
70+
t.end();
71+
});
72+
973
test('Everything after a bare `--` is considered a positional argument', function(t) {
1074
const passedArgs = ['--', 'barepositionals', 'mopositionals'];
1175
const expected = { flags: {}, values: {}, positionals: ['barepositionals', 'mopositionals'] };

0 commit comments

Comments
 (0)