From 60e613fac8d39b7e3e90796e070df37a7f37ef91 Mon Sep 17 00:00:00 2001 From: Anoop M D Date: Sat, 14 Jan 2023 20:21:54 +0530 Subject: [PATCH] feat: bruno lang support parsing headers in .bru file --- packages/bruno-lang/src/headers-tag.js | 54 +++++++++++++++++++ packages/bruno-lang/src/index.js | 19 ++----- .../bruno-lang/tests/fixtures/request.bru | 8 ++- packages/bruno-lang/tests/parser.spec.js | 17 ++++++ 4 files changed, 83 insertions(+), 15 deletions(-) create mode 100644 packages/bruno-lang/src/headers-tag.js diff --git a/packages/bruno-lang/src/headers-tag.js b/packages/bruno-lang/src/headers-tag.js new file mode 100644 index 000000000..5441bd00a --- /dev/null +++ b/packages/bruno-lang/src/headers-tag.js @@ -0,0 +1,54 @@ +const { + sequenceOf, + whitespace, + optionalWhitespace, + choice, + endOfInput, + everyCharUntil, + between, + digit, + many, + regex, + sepBy +} = require("arcsecond"); + +const newline = regex(/^\r?\n/); +const newLineOrEndOfInput = choice([newline, endOfInput]); + +const begin = sequenceOf([ + regex(/^headers[^\S\r\n]*/), + newline +]); + +const end = sequenceOf([ + regex(/^\/headers[^\S\r\n]*/), + newLineOrEndOfInput +]); +const key = everyCharUntil(whitespace); +const value = everyCharUntil(whitespace); + +const line = sequenceOf([ + optionalWhitespace, + digit, + whitespace, + key, + whitespace, + value, + newLineOrEndOfInput +]).map(([_, enabled, __, key, ___, value]) => { + return { + "enabled": enabled, + "key": key, + "value": value + }; +}); + +const lines = many(line); +const headersLines = sepBy(newline)(lines); +const headersTag = between(begin)(end)(headersLines).map(([headers]) => { + return { + headers + }; +}); + +module.exports = headersTag; diff --git a/packages/bruno-lang/src/index.js b/packages/bruno-lang/src/index.js index 90d99f67d..d36b72254 100644 --- a/packages/bruno-lang/src/index.js +++ b/packages/bruno-lang/src/index.js @@ -1,6 +1,4 @@ const { - sepBy, - regex, many, choice, anyChar @@ -8,21 +6,13 @@ const { const inlineTag = require('./inline-tag'); const paramsTag = require('./params-tag'); +const headersTag = require('./headers-tag'); const bruToJson = (fileContents) => { - const newline = regex(/^\r?\n/); - const line = inlineTag; - const lines = many(line); - // const parser = sepBy(newline)(lines); - - let parser = choice([ - sepBy(newline)(lines), - paramsTag - ]); - - parser = many(choice([ + const parser = many(choice([ inlineTag, paramsTag, + headersTag, anyChar ])); @@ -42,7 +32,8 @@ const bruToJson = (fileContents) => { name: parsed.name, method: parsed.method, url: parsed.url, - params: parsed.params + params: parsed.params, + headers: parsed.headers } }; diff --git a/packages/bruno-lang/tests/fixtures/request.bru b/packages/bruno-lang/tests/fixtures/request.bru index 4bd08096b..bc23ddf9e 100644 --- a/packages/bruno-lang/tests/fixtures/request.bru +++ b/packages/bruno-lang/tests/fixtures/request.bru @@ -9,4 +9,10 @@ params 1 apiKey secret 1 numbers 998877665 1 message hello -/params \ No newline at end of file +/params + +headers + 1 content-type application/json + 1 accept-language en-US,en;q=0.9,hi;q=0.8 + 0 transaction-id {{transactionId}} +/headers \ No newline at end of file diff --git a/packages/bruno-lang/tests/parser.spec.js b/packages/bruno-lang/tests/parser.spec.js index 0a171bde1..f282b5f3d 100644 --- a/packages/bruno-lang/tests/parser.spec.js +++ b/packages/bruno-lang/tests/parser.spec.js @@ -32,6 +32,23 @@ describe('bruToJson', () => { "key": "message", "value": "hello" } + ], + "headers": [ + { + "enabled": "1", + "key": "content-type", + "value": "application/json" + }, + { + "enabled": "1", + "key": "accept-language", + "value": "en-US,en;q=0.9,hi;q=0.8" + }, + { + "enabled": "0", + "key": "transaction-id", + "value": "{{transactionId}}" + } ] }); });