Skip to content

Commit

Permalink
Fixes #15 Support content after nested quotes. Add tests, simplify te…
Browse files Browse the repository at this point in the history
…st format
  • Loading branch information
Cellule committed Apr 14, 2019
1 parent 9ca69c2 commit 7d9b897
Show file tree
Hide file tree
Showing 2 changed files with 77 additions and 86 deletions.
12 changes: 6 additions & 6 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,13 @@ module.exports = parseArgsStringToArgv;
module.exports.parseArgsStringToArgv = parseArgsStringToArgv;

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

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

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

Expand Down
151 changes: 71 additions & 80 deletions test/Index.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,20 @@ describe("SHOULD", function() {
describe("Process ", function() {
var util = require("../index");

function parseAndValidate(value, expectedResult, tryWithSingleQuotes) {
var results = util.parseArgsStringToArgv(value);
expect(results.length).toBe(expectedResult.length);
for (var i = 0; i < results.length; ++i) {
expect(results[i]).toEqual(expectedResult[i]);
}
if (tryWithSingleQuotes) {
var expectedWithSingleQuotes = expectedResult.map(function(r) {
return r.replace(/"/g, "'");
});
parseAndValidate(value.replace(/"/g, "'"), expectedWithSingleQuotes, false);
}
}

it("an arguments array correctly with file and env", function(done) {
var results = util.parseArgsStringToArgv("-test", "node", "testing.js");
expect(results.length).toBe(3);
Expand All @@ -20,128 +34,105 @@ describe("Process ", function() {
});

it("an arguments array correctly without file and env", function(done) {
var results = util.parseArgsStringToArgv("-test");
expect(results.length).toBe(1);
expect(results[0]).toEqual("-test");
parseAndValidate("-test", ["-test"]);
done();
});

it("a single key", function(done) {
var results = util.parseArgsStringToArgv("-test");
expect(results.length).toBe(1);
expect(results[0]).toEqual("-test");
parseAndValidate("-test", ["-test"]);
done();
});

it("a single key with a value", function(done) {
var results = util.parseArgsStringToArgv("-test testing");
expect(results.length).toBe(2);
expect(results[0]).toEqual("-test");
expect(results[1]).toEqual("testing");
parseAndValidate("-test testing", ["-test", "testing"]);
done();
});

it("a single key=value", function(done) {
var results = util.parseArgsStringToArgv("-test=testing");
expect(results.length).toBe(1);
expect(results[0]).toEqual("-test=testing");
parseAndValidate("-test=testing", ["-test=testing"]);
done();
});

it("a single value with double quotes", function(done) {
var results = util.parseArgsStringToArgv('"test quotes"');
expect(results.length).toBe(1);
expect(results[0]).toEqual("test quotes");
it("a single value with quotes", function(done) {
parseAndValidate('"test quotes"', ["test quotes"], true);
done();
});

it("a single value with single quotes", function(done) {
var results = util.parseArgsStringToArgv("'test quotes'");
expect(results.length).toBe(1);
expect(results[0]).toEqual("test quotes");
it("a single value with empty quotes", function(done) {
parseAndValidate('""', [""], true);
done();
});

it("a single value with empty double quotes", function(done) {
var results = util.parseArgsStringToArgv('""');
expect(results.length).toBe(1);
expect(results[0]).toEqual("");
it("a complex string with quotes", function(done) {
parseAndValidate('-testing test -valid=true --quotes "test quotes"', [
"-testing",
"test",
"-valid=true",
"--quotes",
"test quotes",
], true);
done();
});

it("a single value with empty single quotes", function(done) {
var results = util.parseArgsStringToArgv("''");
expect(results.length).toBe(1);
expect(results[0]).toEqual("");
it("a complex string with empty quotes", function(done) {
parseAndValidate('-testing test -valid=true --quotes ""', [
"-testing",
"test",
"-valid=true",
"--quotes",
"",
], true);
done();
});

it("a complex string with double quotes", function(done) {
var results = util.parseArgsStringToArgv('-testing test -valid=true --quotes "test quotes"');
expect(results.length).toBe(5);
expect(results[0]).toEqual("-testing");
expect(results[1]).toEqual("test");
expect(results[2]).toEqual("-valid=true");
expect(results[3]).toEqual("--quotes");
expect(results[4]).toEqual("test quotes");
done();
});

it("a complex string with single quotes", function(done) {
var results = util.parseArgsStringToArgv("-testing test -valid=true --quotes 'test quotes'");
expect(results.length).toBe(5);
expect(results[0]).toEqual("-testing");
expect(results[1]).toEqual("test");
expect(results[2]).toEqual("-valid=true");
expect(results[3]).toEqual("--quotes");
expect(results[4]).toEqual("test quotes");
it("a complex string with nested quotes", function(done) {
parseAndValidate('--title "Peter\'s Friends" --name \'Phil "The Power" Taylor\'', [
"--title",
"Peter's Friends",
"--name",
'Phil "The Power" Taylor',
]);
done();
});

it("a complex string with empty double quotes", function(done) {
var results = util.parseArgsStringToArgv('-testing test -valid=true --quotes ""');
expect(results.length).toBe(5);
expect(results[0]).toEqual("-testing");
expect(results[1]).toEqual("test");
expect(results[2]).toEqual("-valid=true");
expect(results[3]).toEqual("--quotes");
expect(results[4]).toEqual("");
it("a complex key value with quotes", function(done) {
parseAndValidate('--name=\'Phil Taylor\' --title="Peter\'s Friends"', [
"--name='Phil Taylor'",
'--title="Peter\'s Friends"',
]);
done();
});

it("a complex string with empty single quotes", function(done) {
var results = util.parseArgsStringToArgv("-testing test -valid=true --quotes ''");
expect(results.length).toBe(5);
expect(results[0]).toEqual("-testing");
expect(results[1]).toEqual("test");
expect(results[2]).toEqual("-valid=true");
expect(results[3]).toEqual("--quotes");
expect(results[4]).toEqual("");
it("a complex key value with nested quotes", function(done) {
parseAndValidate('--name=\'Phil "The Power" Taylor\'', [
'--name=\'Phil "The Power" Taylor\''
]);
done();
});

it("a complex string with nested quotes", function(done) {
var results = util.parseArgsStringToArgv('--title "Peter\'s Friends" --name \'Phil "The Power" Taylor\'');
expect(results.length).toBe(4);
expect(results[0]).toEqual("--title");
expect(results[1]).toEqual("Peter's Friends");
expect(results[2]).toEqual("--name");
expect(results[3]).toEqual('Phil "The Power" Taylor');
it("nested quotes with no spaces", function(done) {
parseAndValidate('jake run:silent["echo 1"] --trace', [
"jake",
'run:silent["echo 1"]',
"--trace",
], true);
done();
});

it("a complex key value with quotes", function(done) {
var results = util.parseArgsStringToArgv('--name=\'Phil Taylor\' --title="Peter\'s Friends"');
expect(results.length).toBe(2);
expect(results[0]).toEqual("--name='Phil Taylor'");
expect(results[1]).toEqual('--title="Peter\'s Friends"');
it("multiple nested quotes with no spaces", function(done) {
parseAndValidate('jake run:silent["echo 1"]["echo 2"] --trace', [
"jake",
'run:silent["echo 1"]["echo 2"]',
"--trace",
], true);
done();
});

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

0 comments on commit 7d9b897

Please sign in to comment.