Skip to content

Commit 7d9b897

Browse files
committed
Fixes #15 Support content after nested quotes. Add tests, simplify test format
1 parent 9ca69c2 commit 7d9b897

File tree

2 files changed

+77
-86
lines changed

2 files changed

+77
-86
lines changed

index.js

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,13 @@ module.exports = parseArgsStringToArgv;
44
module.exports.parseArgsStringToArgv = parseArgsStringToArgv;
55

66
function parseArgsStringToArgv(value, env, file) {
7-
// ([^\s'"]+(['"])([^\2]*?)\2) Match `text"quotes text"`
7+
// ([^\s'"]([^\s'"]*(['"])([^\3]*?)\3)+[^\s'"]*) Matches nested quotes until the first space outside of quotes
88

9-
// [^\s'"] or Match if not a space ' or "
9+
// [^\s'"]+ or Match if not a space ' or "
1010

11-
// (['"])([^\4]*?)\4 or Match "quoted text" without quotes
12-
// `\2` and `\4` are a backreference to the quote style (' or ") captured
13-
var myRegexp = /([^\s'"]+(['"])([^\2]*?)\2)|[^\s'"]+|(['"])([^\4]*?)\4/gi;
11+
// (['"])([^\5]*?)\5 or Match "quoted text" without quotes
12+
// `\3` and `\5` are a backreference to the quote style (' or ") captured
13+
var myRegexp = /([^\s'"]([^\s'"]*(['"])([^\3]*?)\3)+[^\s'"]*)|[^\s'"]+|(['"])([^\5]*?)\5/gi;
1414
var myString = value;
1515
var myArray = [
1616
];
@@ -27,7 +27,7 @@ function parseArgsStringToArgv(value, env, file) {
2727
if (match !== null) {
2828
// Index 1 in the array is the captured group if it exists
2929
// Index 0 is the matched text, which we use if no captured group exists
30-
myArray.push(firstString(match[1], match[5], match[0]));
30+
myArray.push(firstString(match[1], match[6], match[0]));
3131
}
3232
} while (match !== null);
3333

test/Index.spec.js

Lines changed: 71 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,20 @@ describe("SHOULD", function() {
1010
describe("Process ", function() {
1111
var util = require("../index");
1212

13+
function parseAndValidate(value, expectedResult, tryWithSingleQuotes) {
14+
var results = util.parseArgsStringToArgv(value);
15+
expect(results.length).toBe(expectedResult.length);
16+
for (var i = 0; i < results.length; ++i) {
17+
expect(results[i]).toEqual(expectedResult[i]);
18+
}
19+
if (tryWithSingleQuotes) {
20+
var expectedWithSingleQuotes = expectedResult.map(function(r) {
21+
return r.replace(/"/g, "'");
22+
});
23+
parseAndValidate(value.replace(/"/g, "'"), expectedWithSingleQuotes, false);
24+
}
25+
}
26+
1327
it("an arguments array correctly with file and env", function(done) {
1428
var results = util.parseArgsStringToArgv("-test", "node", "testing.js");
1529
expect(results.length).toBe(3);
@@ -20,128 +34,105 @@ describe("Process ", function() {
2034
});
2135

2236
it("an arguments array correctly without file and env", function(done) {
23-
var results = util.parseArgsStringToArgv("-test");
24-
expect(results.length).toBe(1);
25-
expect(results[0]).toEqual("-test");
37+
parseAndValidate("-test", ["-test"]);
2638
done();
2739
});
2840

2941
it("a single key", function(done) {
30-
var results = util.parseArgsStringToArgv("-test");
31-
expect(results.length).toBe(1);
32-
expect(results[0]).toEqual("-test");
42+
parseAndValidate("-test", ["-test"]);
3343
done();
3444
});
3545

3646
it("a single key with a value", function(done) {
37-
var results = util.parseArgsStringToArgv("-test testing");
38-
expect(results.length).toBe(2);
39-
expect(results[0]).toEqual("-test");
40-
expect(results[1]).toEqual("testing");
47+
parseAndValidate("-test testing", ["-test", "testing"]);
4148
done();
4249
});
4350

4451
it("a single key=value", function(done) {
45-
var results = util.parseArgsStringToArgv("-test=testing");
46-
expect(results.length).toBe(1);
47-
expect(results[0]).toEqual("-test=testing");
52+
parseAndValidate("-test=testing", ["-test=testing"]);
4853
done();
4954
});
5055

51-
it("a single value with double quotes", function(done) {
52-
var results = util.parseArgsStringToArgv('"test quotes"');
53-
expect(results.length).toBe(1);
54-
expect(results[0]).toEqual("test quotes");
56+
it("a single value with quotes", function(done) {
57+
parseAndValidate('"test quotes"', ["test quotes"], true);
5558
done();
5659
});
5760

58-
it("a single value with single quotes", function(done) {
59-
var results = util.parseArgsStringToArgv("'test quotes'");
60-
expect(results.length).toBe(1);
61-
expect(results[0]).toEqual("test quotes");
61+
it("a single value with empty quotes", function(done) {
62+
parseAndValidate('""', [""], true);
6263
done();
6364
});
6465

65-
it("a single value with empty double quotes", function(done) {
66-
var results = util.parseArgsStringToArgv('""');
67-
expect(results.length).toBe(1);
68-
expect(results[0]).toEqual("");
66+
it("a complex string with quotes", function(done) {
67+
parseAndValidate('-testing test -valid=true --quotes "test quotes"', [
68+
"-testing",
69+
"test",
70+
"-valid=true",
71+
"--quotes",
72+
"test quotes",
73+
], true);
6974
done();
7075
});
7176

72-
it("a single value with empty single quotes", function(done) {
73-
var results = util.parseArgsStringToArgv("''");
74-
expect(results.length).toBe(1);
75-
expect(results[0]).toEqual("");
77+
it("a complex string with empty quotes", function(done) {
78+
parseAndValidate('-testing test -valid=true --quotes ""', [
79+
"-testing",
80+
"test",
81+
"-valid=true",
82+
"--quotes",
83+
"",
84+
], true);
7685
done();
7786
});
7887

79-
it("a complex string with double quotes", function(done) {
80-
var results = util.parseArgsStringToArgv('-testing test -valid=true --quotes "test quotes"');
81-
expect(results.length).toBe(5);
82-
expect(results[0]).toEqual("-testing");
83-
expect(results[1]).toEqual("test");
84-
expect(results[2]).toEqual("-valid=true");
85-
expect(results[3]).toEqual("--quotes");
86-
expect(results[4]).toEqual("test quotes");
87-
done();
88-
});
89-
90-
it("a complex string with single quotes", function(done) {
91-
var results = util.parseArgsStringToArgv("-testing test -valid=true --quotes 'test quotes'");
92-
expect(results.length).toBe(5);
93-
expect(results[0]).toEqual("-testing");
94-
expect(results[1]).toEqual("test");
95-
expect(results[2]).toEqual("-valid=true");
96-
expect(results[3]).toEqual("--quotes");
97-
expect(results[4]).toEqual("test quotes");
88+
it("a complex string with nested quotes", function(done) {
89+
parseAndValidate('--title "Peter\'s Friends" --name \'Phil "The Power" Taylor\'', [
90+
"--title",
91+
"Peter's Friends",
92+
"--name",
93+
'Phil "The Power" Taylor',
94+
]);
9895
done();
9996
});
10097

101-
it("a complex string with empty double quotes", function(done) {
102-
var results = util.parseArgsStringToArgv('-testing test -valid=true --quotes ""');
103-
expect(results.length).toBe(5);
104-
expect(results[0]).toEqual("-testing");
105-
expect(results[1]).toEqual("test");
106-
expect(results[2]).toEqual("-valid=true");
107-
expect(results[3]).toEqual("--quotes");
108-
expect(results[4]).toEqual("");
98+
it("a complex key value with quotes", function(done) {
99+
parseAndValidate('--name=\'Phil Taylor\' --title="Peter\'s Friends"', [
100+
"--name='Phil Taylor'",
101+
'--title="Peter\'s Friends"',
102+
]);
109103
done();
110104
});
111105

112-
it("a complex string with empty single quotes", function(done) {
113-
var results = util.parseArgsStringToArgv("-testing test -valid=true --quotes ''");
114-
expect(results.length).toBe(5);
115-
expect(results[0]).toEqual("-testing");
116-
expect(results[1]).toEqual("test");
117-
expect(results[2]).toEqual("-valid=true");
118-
expect(results[3]).toEqual("--quotes");
119-
expect(results[4]).toEqual("");
106+
it("a complex key value with nested quotes", function(done) {
107+
parseAndValidate('--name=\'Phil "The Power" Taylor\'', [
108+
'--name=\'Phil "The Power" Taylor\''
109+
]);
120110
done();
121111
});
122112

123-
it("a complex string with nested quotes", function(done) {
124-
var results = util.parseArgsStringToArgv('--title "Peter\'s Friends" --name \'Phil "The Power" Taylor\'');
125-
expect(results.length).toBe(4);
126-
expect(results[0]).toEqual("--title");
127-
expect(results[1]).toEqual("Peter's Friends");
128-
expect(results[2]).toEqual("--name");
129-
expect(results[3]).toEqual('Phil "The Power" Taylor');
113+
it("nested quotes with no spaces", function(done) {
114+
parseAndValidate('jake run:silent["echo 1"] --trace', [
115+
"jake",
116+
'run:silent["echo 1"]',
117+
"--trace",
118+
], true);
130119
done();
131120
});
132121

133-
it("a complex key value with quotes", function(done) {
134-
var results = util.parseArgsStringToArgv('--name=\'Phil Taylor\' --title="Peter\'s Friends"');
135-
expect(results.length).toBe(2);
136-
expect(results[0]).toEqual("--name='Phil Taylor'");
137-
expect(results[1]).toEqual('--title="Peter\'s Friends"');
122+
it("multiple nested quotes with no spaces", function(done) {
123+
parseAndValidate('jake run:silent["echo 1"]["echo 2"] --trace', [
124+
"jake",
125+
'run:silent["echo 1"]["echo 2"]',
126+
"--trace",
127+
], true);
138128
done();
139129
});
140130

141-
it("a complex key value with nested quotes", function(done) {
142-
var results = util.parseArgsStringToArgv('--name=\'Phil "The Power" Taylor\'');
143-
expect(results.length).toBe(1);
144-
expect(results[0]).toEqual('--name=\'Phil "The Power" Taylor\'');
131+
it("complex multiple nested quotes", function(done) {
132+
parseAndValidate('cli value("echo")[\'grep\']+"Peter\'s Friends"', [
133+
"cli",
134+
'value("echo")[\'grep\']+"Peter\'s Friends"',
135+
]);
145136
done();
146137
});
147138
});

0 commit comments

Comments
 (0)