From 6947860204ab7c45681fae3579189fe2903889de Mon Sep 17 00:00:00 2001 From: Anoop M D Date: Tue, 7 Feb 2023 01:18:18 +0530 Subject: [PATCH] feat: made bru lang parser more robust to optional newlines and whitespaces --- packages/bruno-lang/v2/src/bruToJson.js | 4 +- packages/bruno-lang/v2/src/jsonToBru.js | 4 +- .../bruno-lang/v2/tests/dictionary.spec.js | 1 + packages/bruno-lang/v2/tests/script.spec.js | 38 +++++++++++++++++++ packages/bruno-lang/v2/tests/text.spec.js | 20 ---------- 5 files changed, 44 insertions(+), 23 deletions(-) create mode 100644 packages/bruno-lang/v2/tests/script.spec.js delete mode 100644 packages/bruno-lang/v2/tests/text.spec.js diff --git a/packages/bruno-lang/v2/src/bruToJson.js b/packages/bruno-lang/v2/src/bruToJson.js index f0881e08d..2f88ca91a 100644 --- a/packages/bruno-lang/v2/src/bruToJson.js +++ b/packages/bruno-lang/v2/src/bruToJson.js @@ -30,13 +30,15 @@ const grammar = ohm.grammar(`Bru { nl = "\\r"? "\\n" st = " " | "\\t" + stnl = st | nl tagend = nl "}" + optionalnl = ~tagend nl validkey = ~(st | ":") any validvalue = ~nl any // Dictionary Blocks dictionary = st* "{" pairlist? tagend - pairlist = nl* pair (~tagend nl pair)* (~tagend space)* + pairlist = optionalnl* pair (~tagend nl pair)* (~tagend space)* pair = st* key st* ":" st* value? st* key = ~tagend validkey* value = ~tagend validvalue* diff --git a/packages/bruno-lang/v2/src/jsonToBru.js b/packages/bruno-lang/v2/src/jsonToBru.js index 3b576faf4..9d56fa7e2 100644 --- a/packages/bruno-lang/v2/src/jsonToBru.js +++ b/packages/bruno-lang/v2/src/jsonToBru.js @@ -103,7 +103,7 @@ ${indentString(body.xml)} `; } - if(body && body.formUrlEncoded) { + if(body && body.formUrlEncoded && body.formUrlEncoded.length) { bru += `body:form-urlencoded {`; if(enabled(body.formUrlEncoded).length) { bru += `\n${indentString(enabled(body.formUrlEncoded).map(item => `${item.name}: ${item.value}`).join('\n'))}`; @@ -116,7 +116,7 @@ ${indentString(body.xml)} bru += '\n}\n\n'; } - if(body && body.multipartForm) { + if(body && body.multipartForm && body.multipartForm.length) { bru += `body:multipart-form {`; if(enabled(body.multipartForm).length) { bru += `\n${indentString(enabled(body.multipartForm).map(item => `${item.name}: ${item.value}`).join('\n'))}`; diff --git a/packages/bruno-lang/v2/tests/dictionary.spec.js b/packages/bruno-lang/v2/tests/dictionary.spec.js index fe258635a..27b2f9015 100644 --- a/packages/bruno-lang/v2/tests/dictionary.spec.js +++ b/packages/bruno-lang/v2/tests/dictionary.spec.js @@ -81,6 +81,7 @@ headers { const input = ` headers { content-type: application/json + Authorization: JWT secret }`; diff --git a/packages/bruno-lang/v2/tests/script.spec.js b/packages/bruno-lang/v2/tests/script.spec.js new file mode 100644 index 000000000..c68ddf2e4 --- /dev/null +++ b/packages/bruno-lang/v2/tests/script.spec.js @@ -0,0 +1,38 @@ +/** + * This test file is used to test the text parser. + */ +const parser = require("../src/bruToJson"); + +describe("script parser", () => { + it("should parse request script", () => { + const input = ` +script:req { + $req.setHeader('Content-Type', 'application/json'); +} +`; + + const output = parser(input); + const expected = { + "script": { + "req": "$req.setHeader('Content-Type', 'application/json');" + } + }; + expect(output).toEqual(expected); + }); + + it("should parse response script", () => { + const input = ` +script:res { + expect(response.status).to.equal(200); +} +`; + + const output = parser(input); + const expected = { + "script": { + "res": "expect(response.status).to.equal(200);" + } + }; + expect(output).toEqual(expected); + }); +}); diff --git a/packages/bruno-lang/v2/tests/text.spec.js b/packages/bruno-lang/v2/tests/text.spec.js deleted file mode 100644 index 50959dc37..000000000 --- a/packages/bruno-lang/v2/tests/text.spec.js +++ /dev/null @@ -1,20 +0,0 @@ -/** - * This test file is used to test the text parser. - */ -const parser = require("../src/bruToJson"); - -describe("script parser", () => { - it("should parse script body", () => { - const input = ` -script { - function onResponse(request, response) { - expect(response.status).to.equal(200); - } -} -`; - - const output = parser(input); - const expected = "function onResponse(request, response) {\n expect(response.status).to.equal(200);\n}"; - expect(output.script).toEqual(expected); - }); -});