From 9b83cd7b84e237a0a9bf258dcda2c9f7d1a7905d Mon Sep 17 00:00:00 2001 From: Pragadesh-45 Date: Mon, 16 Dec 2024 12:01:42 +0530 Subject: [PATCH 01/16] fix: update condition for renaming items in Windows OS --- packages/bruno-electron/src/ipc/collection.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/bruno-electron/src/ipc/collection.js b/packages/bruno-electron/src/ipc/collection.js index d1ff7c3f9..c1ad96900 100644 --- a/packages/bruno-electron/src/ipc/collection.js +++ b/packages/bruno-electron/src/ipc/collection.js @@ -350,7 +350,7 @@ const registerRendererEventHandlers = (mainWindow, watcher, lastOpenedCollection ipcMain.handle('renderer:rename-item', async (event, oldPath, newPath, newName) => { const tempDir = path.join(os.tmpdir(), `temp-folder-${Date.now()}`); const parentDir = path.dirname(oldPath); - const isWindowsOSAndNotWSLAndItemHasSubDirectories = isWindowsOS() && !isWSLPath(oldPath) && hasSubDirectories(oldPath); + const isWindowsOSAndNotWSLAndItemHasSubDirectories = isDirectory(oldPath) && isWindowsOS() && !isWSLPath(oldPath) && hasSubDirectories(oldPath); let parentDirUnwatched = false; let parentDirRewatched = false; From a5096ce413e1f808c0e857e958ef9aa3d5de888b Mon Sep 17 00:00:00 2001 From: lohxt1 Date: Mon, 16 Dec 2024 14:51:02 +0530 Subject: [PATCH 02/16] revert: rename-item watcher fix -- tbd --- packages/bruno-electron/src/ipc/collection.js | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/packages/bruno-electron/src/ipc/collection.js b/packages/bruno-electron/src/ipc/collection.js index d1ff7c3f9..519da8b37 100644 --- a/packages/bruno-electron/src/ipc/collection.js +++ b/packages/bruno-electron/src/ipc/collection.js @@ -349,10 +349,10 @@ const registerRendererEventHandlers = (mainWindow, watcher, lastOpenedCollection // rename item ipcMain.handle('renderer:rename-item', async (event, oldPath, newPath, newName) => { const tempDir = path.join(os.tmpdir(), `temp-folder-${Date.now()}`); - const parentDir = path.dirname(oldPath); + // const parentDir = path.dirname(oldPath); const isWindowsOSAndNotWSLAndItemHasSubDirectories = isWindowsOS() && !isWSLPath(oldPath) && hasSubDirectories(oldPath); - let parentDirUnwatched = false; - let parentDirRewatched = false; + // let parentDirUnwatched = false; + // let parentDirRewatched = false; try { // Normalize paths if they are WSL paths @@ -376,8 +376,8 @@ const registerRendererEventHandlers = (mainWindow, watcher, lastOpenedCollection moveRequestUid(bruFile, newBruFilePath); } - watcher.unlinkItemPathInWatcher(parentDir); - parentDirUnwatched = true; + // watcher.unlinkItemPathInWatcher(parentDir); + // parentDirUnwatched = true; /** * If it is windows OS @@ -396,8 +396,8 @@ const registerRendererEventHandlers = (mainWindow, watcher, lastOpenedCollection } else { await fs.renameSync(oldPath, newPath); } - watcher.addItemPathInWatcher(parentDir); - parentDirRewatched = true; + // watcher.addItemPathInWatcher(parentDir); + // parentDirRewatched = true; return newPath; } @@ -424,9 +424,9 @@ const registerRendererEventHandlers = (mainWindow, watcher, lastOpenedCollection } catch (error) { // in case an error occurs during the rename file operations after unlinking the parent dir // and the rewatch fails, we need to add it back to watcher - if (parentDirUnwatched && !parentDirRewatched) { - watcher.addItemPathInWatcher(parentDir); - } + // if (parentDirUnwatched && !parentDirRewatched) { + // watcher.addItemPathInWatcher(parentDir); + // } // in case the rename file operations fails, and we see that the temp dir exists // and the old path does not exist, we need to restore the data from the temp dir to the old path From 0ad0af041b066b8ea57729ec81a42a6a012c6f7b Mon Sep 17 00:00:00 2001 From: lohxt1 Date: Mon, 16 Dec 2024 18:46:16 +0530 Subject: [PATCH 03/16] fix: validations updates --- packages/bruno-app/src/utils/collections/index.js | 4 ++-- packages/bruno-app/src/utils/common/index.js | 2 +- packages/bruno-app/src/utils/importers/common.js | 4 ++-- packages/bruno-electron/src/store/global-environments.js | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/bruno-app/src/utils/collections/index.js b/packages/bruno-app/src/utils/collections/index.js index 3a691e53f..e28bc0d13 100644 --- a/packages/bruno-app/src/utils/collections/index.js +++ b/packages/bruno-app/src/utils/collections/index.js @@ -797,8 +797,8 @@ export const getGlobalEnvironmentVariables = ({ globalEnvironments, activeGlobal const environment = globalEnvironments?.find(env => env?.uid === activeGlobalEnvironmentUid); if (environment) { each(environment.variables, (variable) => { - if (variable.name && variable.value && variable.enabled) { - variables[variable.name] = variable.value; + if (variable.name && variable.enabled) { + variables[variable.name] = variable.value || ''; } }); } diff --git a/packages/bruno-app/src/utils/common/index.js b/packages/bruno-app/src/utils/common/index.js index 1244966b7..10ca09e50 100644 --- a/packages/bruno-app/src/utils/common/index.js +++ b/packages/bruno-app/src/utils/common/index.js @@ -173,4 +173,4 @@ export const generateUidBasedOnHash = (str) => { return `${hash}`.padEnd(21, '0'); }; -export const stringifyIfNot = v => typeof v === 'string' ? v : String(v); +export const stringifyIfNot = v => typeof v === 'string' ? v : ''; diff --git a/packages/bruno-app/src/utils/importers/common.js b/packages/bruno-app/src/utils/importers/common.js index c99048419..88c4c7872 100644 --- a/packages/bruno-app/src/utils/importers/common.js +++ b/packages/bruno-app/src/utils/importers/common.js @@ -79,9 +79,9 @@ export const transformItemsInCollection = (collection) => { // from 5 feb 2024, multipartFormData needs to have a type // this was introduced when we added support for file uploads // below logic is to make older collection exports backward compatible - let multipartFormData = _.get(item, 'request.body.multipartForm'); + let multipartFormData = get(item, 'request.body.multipartForm'); if (multipartFormData) { - _.each(multipartFormData, (form) => { + each(multipartFormData, (form) => { if (!form.type) { form.type = 'text'; } diff --git a/packages/bruno-electron/src/store/global-environments.js b/packages/bruno-electron/src/store/global-environments.js index e8c03c434..2f9c1b309 100644 --- a/packages/bruno-electron/src/store/global-environments.js +++ b/packages/bruno-electron/src/store/global-environments.js @@ -18,7 +18,7 @@ class GlobalEnvironmentsStore { return globalEnvironments?.map(env => { const variables = env.variables?.map(v => ({ ...v, - value: v?.secret ? (this.isValidValue(v.value) ? encryptString(v.value) : '') : v?.value + value: v?.secret ? (this.isValidValue(v.value) ? encryptString(v.value) : '') : (v?.value || '') })) || []; return { @@ -32,7 +32,7 @@ class GlobalEnvironmentsStore { return globalEnvironments?.map(env => { const variables = env.variables?.map(v => ({ ...v, - value: v?.secret ? (this.isValidValue(v.value) ? decryptString(v.value) : '') : v?.value + value: v?.secret ? (this.isValidValue(v.value) ? decryptString(v.value) : '') : (v?.value || '') })) || []; return { From 7a8d1624d1c24e9a30369f41d747098a874778c5 Mon Sep 17 00:00:00 2001 From: lohxt1 Date: Mon, 16 Dec 2024 22:09:10 +0530 Subject: [PATCH 04/16] fix: updates --- .../src/providers/ReduxStore/slices/global-environments.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/bruno-app/src/providers/ReduxStore/slices/global-environments.js b/packages/bruno-app/src/providers/ReduxStore/slices/global-environments.js index 77f469125..def88f2b6 100644 --- a/packages/bruno-app/src/providers/ReduxStore/slices/global-environments.js +++ b/packages/bruno-app/src/providers/ReduxStore/slices/global-environments.js @@ -191,7 +191,7 @@ export const globalEnvironmentsUpdateEvent = ({ globalEnvironmentVariables }) => // update existing values variables = variables?.map?.(variable => ({ ...variable, - value: stringifyIfNot(globalEnvironmentVariables?.[variable?.name]) + value: globalEnvironmentVariables?.[variable?.name] })); // add new env values @@ -201,7 +201,7 @@ export const globalEnvironmentsUpdateEvent = ({ globalEnvironmentVariables }) => variables.push({ uid: uuid(), name: key, - value: stringifyIfNot(value), + value, type: 'text', secret: false, enabled: true From e44dcad01ae1e70e16529c768e67372ff144178a Mon Sep 17 00:00:00 2001 From: lohxt1 Date: Mon, 16 Dec 2024 22:13:26 +0530 Subject: [PATCH 05/16] fix: updates --- packages/bruno-app/src/utils/collections/index.js | 2 +- packages/bruno-app/src/utils/common/index.js | 2 +- packages/bruno-electron/src/store/global-environments.js | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/bruno-app/src/utils/collections/index.js b/packages/bruno-app/src/utils/collections/index.js index e28bc0d13..d770c60a3 100644 --- a/packages/bruno-app/src/utils/collections/index.js +++ b/packages/bruno-app/src/utils/collections/index.js @@ -798,7 +798,7 @@ export const getGlobalEnvironmentVariables = ({ globalEnvironments, activeGlobal if (environment) { each(environment.variables, (variable) => { if (variable.name && variable.enabled) { - variables[variable.name] = variable.value || ''; + variables[variable.name] = variable.value; } }); } diff --git a/packages/bruno-app/src/utils/common/index.js b/packages/bruno-app/src/utils/common/index.js index 10ca09e50..1244966b7 100644 --- a/packages/bruno-app/src/utils/common/index.js +++ b/packages/bruno-app/src/utils/common/index.js @@ -173,4 +173,4 @@ export const generateUidBasedOnHash = (str) => { return `${hash}`.padEnd(21, '0'); }; -export const stringifyIfNot = v => typeof v === 'string' ? v : ''; +export const stringifyIfNot = v => typeof v === 'string' ? v : String(v); diff --git a/packages/bruno-electron/src/store/global-environments.js b/packages/bruno-electron/src/store/global-environments.js index 2f9c1b309..e8c03c434 100644 --- a/packages/bruno-electron/src/store/global-environments.js +++ b/packages/bruno-electron/src/store/global-environments.js @@ -18,7 +18,7 @@ class GlobalEnvironmentsStore { return globalEnvironments?.map(env => { const variables = env.variables?.map(v => ({ ...v, - value: v?.secret ? (this.isValidValue(v.value) ? encryptString(v.value) : '') : (v?.value || '') + value: v?.secret ? (this.isValidValue(v.value) ? encryptString(v.value) : '') : v?.value })) || []; return { @@ -32,7 +32,7 @@ class GlobalEnvironmentsStore { return globalEnvironments?.map(env => { const variables = env.variables?.map(v => ({ ...v, - value: v?.secret ? (this.isValidValue(v.value) ? decryptString(v.value) : '') : (v?.value || '') + value: v?.secret ? (this.isValidValue(v.value) ? decryptString(v.value) : '') : v?.value })) || []; return { From f871bc0fa28d0a1219ef3d078209eff18fdc854f Mon Sep 17 00:00:00 2001 From: Anoop M D Date: Tue, 17 Dec 2024 13:46:48 +0530 Subject: [PATCH 06/16] feat: setup script --- package.json | 3 +- scripts/setup.js | 95 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 97 insertions(+), 1 deletion(-) create mode 100644 scripts/setup.js diff --git a/package.json b/package.json index ebe1af53f..2c46fdd2c 100644 --- a/package.json +++ b/package.json @@ -30,6 +30,7 @@ "ts-jest": "^29.0.5" }, "scripts": { + "setup": "node ./scripts/setup.js", "dev": "concurrently --kill-others \"npm run dev:web\" \"npm run dev:electron\"", "dev:web": "npm run dev --workspace=packages/bruno-app", "build:web": "npm run build --workspace=packages/bruno-app", @@ -51,6 +52,6 @@ "prepare": "husky install" }, "overrides": { - "rollup":"3.29.5" + "rollup": "3.29.5" } } diff --git a/scripts/setup.js b/scripts/setup.js new file mode 100644 index 000000000..47d679098 --- /dev/null +++ b/scripts/setup.js @@ -0,0 +1,95 @@ +const { execSync } = require('child_process'); +const fs = require('fs'); +const path = require('path'); + +const icons = { + clean: '๐Ÿงน', + delete: '๐Ÿ—‘๏ธ', + install: '๐Ÿ“ฆ', + build: '๐Ÿ”จ', + success: 'โœ…', + error: 'โŒ', + working: 'โšก' +}; + +const execCommand = (command, description) => { + try { + console.log(`\n${icons.working} ${description}...`); + execSync(command, { stdio: 'inherit' }); + console.log(`${icons.success} ${description} completed`); + } catch (error) { + console.error(`${icons.error} ${description} failed`); + throw error; + } +}; + +const glob = function (startPath, pattern) { + let results = []; + + // Ensure start path exists + if (!fs.existsSync(startPath)) { + return results; + } + + const files = fs.readdirSync(startPath); + for (const file of files) { + const filename = path.join(startPath, file); + const stat = fs.lstatSync(filename); + + // If directory, recurse into it + if (stat.isDirectory()) { + // Skip node_modules recursion to avoid unnecessary deep scanning + if (file === 'node_modules') { + if (file === pattern) { + results.push(filename); + } + continue; + } + results = results.concat(glob(filename, pattern)); + } + + // If file matches pattern, add to results + if (file === pattern) { + results.push(filename); + } + } + + return results; +}; + +async function setup() { + try { + // Clean up node_modules (if exists) + console.log(`\n${icons.clean} Cleaning up node_modules directories...`); + const nodeModulesPaths = glob('.', 'node_modules'); + for (const dir of nodeModulesPaths) { + console.log(`${icons.delete} Removing ${dir}`); + fs.rmSync(dir, { recursive: true, force: true }); + } + + // Install dependencies + execCommand('npm i --legacy-peer-deps', 'Installing dependencies'); + + // Build packages + execCommand('npm run build:graphql-docs', 'Building graphql-docs'); + execCommand('npm run build:bruno-query', 'Building bruno-query'); + execCommand('npm run build:bruno-common', 'Building bruno-common'); + + // Bundle JS sandbox libraries + execCommand( + 'npm run sandbox:bundle-libraries --workspace=packages/bruno-js', + 'Bundling JS sandbox libraries' + ); + + console.log(`\n${icons.success} Setup completed successfully!\n`); + } catch (error) { + console.error(`\n${icons.error} Setup failed:`); + console.error(error); + process.exit(1); + } +} + +setup().catch(error => { + console.error(error); + process.exit(1); +}); From aea25842ce394c870586a7c4e48e28c78a940989 Mon Sep 17 00:00:00 2001 From: Pooja Belaramani Date: Wed, 18 Dec 2024 15:01:06 +0530 Subject: [PATCH 07/16] fix: string json response error --- .../src/components/ResponsePane/QueryResult/index.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/bruno-app/src/components/ResponsePane/QueryResult/index.js b/packages/bruno-app/src/components/ResponsePane/QueryResult/index.js index e9acd1f5c..69f14248d 100644 --- a/packages/bruno-app/src/components/ResponsePane/QueryResult/index.js +++ b/packages/bruno-app/src/components/ResponsePane/QueryResult/index.js @@ -27,7 +27,11 @@ const formatResponse = (data, mode, filter) => { let isValidJSON = false; try { - isValidJSON = typeof JSON.parse(JSON.stringify(data)) === 'object'; + if (typeof data === 'string') { + isValidJSON = true; + } else { + isValidJSON = typeof JSON.parse(JSON.stringify(data)) === 'object'; + } } catch (error) { console.log('Error parsing JSON: ', error.message); } From 236bc48d98b5157785504d85d27e571dcd684569 Mon Sep 17 00:00:00 2001 From: Pooja Belaramani Date: Mon, 23 Dec 2024 12:11:46 +0530 Subject: [PATCH 08/16] fix: null data response --- .../bruno-app/src/components/ResponsePane/QueryResult/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/bruno-app/src/components/ResponsePane/QueryResult/index.js b/packages/bruno-app/src/components/ResponsePane/QueryResult/index.js index 69f14248d..8adf506a1 100644 --- a/packages/bruno-app/src/components/ResponsePane/QueryResult/index.js +++ b/packages/bruno-app/src/components/ResponsePane/QueryResult/index.js @@ -20,7 +20,7 @@ const formatResponse = (data, mode, filter) => { } if (data === null) { - return data; + return 'null'; } if (mode.includes('json')) { From 582e8e5eaca97ec84d409ed1139f8d5a52ec3ccd Mon Sep 17 00:00:00 2001 From: Pooja Belaramani Date: Mon, 23 Dec 2024 13:36:58 +0530 Subject: [PATCH 09/16] fix: condition --- .../src/components/ResponsePane/QueryResult/index.js | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/packages/bruno-app/src/components/ResponsePane/QueryResult/index.js b/packages/bruno-app/src/components/ResponsePane/QueryResult/index.js index 8adf506a1..927b13314 100644 --- a/packages/bruno-app/src/components/ResponsePane/QueryResult/index.js +++ b/packages/bruno-app/src/components/ResponsePane/QueryResult/index.js @@ -27,11 +27,8 @@ const formatResponse = (data, mode, filter) => { let isValidJSON = false; try { - if (typeof data === 'string') { - isValidJSON = true; - } else { - isValidJSON = typeof JSON.parse(JSON.stringify(data)) === 'object'; - } + isValidJSON = + typeof JSON.parse(JSON.stringify(data)) === 'object' || typeof JSON.parse(JSON.stringify(data)) === 'string'; } catch (error) { console.log('Error parsing JSON: ', error.message); } From f8711a91d95674e9eb634096ba860f7c4f6bded0 Mon Sep 17 00:00:00 2001 From: pooja-bruno Date: Mon, 23 Dec 2024 17:29:06 +0530 Subject: [PATCH 10/16] fix: plain text curl data (#3677) --- packages/bruno-app/src/utils/curl/curl-to-json.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/bruno-app/src/utils/curl/curl-to-json.js b/packages/bruno-app/src/utils/curl/curl-to-json.js index 48c33bb0a..c1398ab14 100644 --- a/packages/bruno-app/src/utils/curl/curl-to-json.js +++ b/packages/bruno-app/src/utils/curl/curl-to-json.js @@ -57,7 +57,7 @@ function getDataString(request) { console.error('Failed to parse JSON data:', error); return { data: request.data.toString() }; } - } else if (contentType && contentType.includes('application/xml')) { + } else if (contentType && (contentType.includes('application/xml') || contentType.includes('text/plain'))) { return { data: request.data }; } @@ -174,14 +174,14 @@ const curlToJson = (curlCommand) => { } if (request.auth) { - if(request.auth.mode === 'basic'){ + if (request.auth.mode === 'basic') { requestJson.auth = { mode: 'basic', basic: { username: repr(request.auth.basic?.username), password: repr(request.auth.basic?.password) } - } + }; } } From 9a2d8bfff3ed6ef5b932ab8f3041fcdb16939fdd Mon Sep 17 00:00:00 2001 From: Pooja Belaramani Date: Fri, 27 Dec 2024 11:12:46 +0530 Subject: [PATCH 11/16] adding quotes in text response --- .../src/components/ResponsePane/QueryResult/index.js | 5 ++--- packages/bruno-electron/src/ipc/network/index.js | 5 ++++- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/packages/bruno-app/src/components/ResponsePane/QueryResult/index.js b/packages/bruno-app/src/components/ResponsePane/QueryResult/index.js index 927b13314..81bcaca7e 100644 --- a/packages/bruno-app/src/components/ResponsePane/QueryResult/index.js +++ b/packages/bruno-app/src/components/ResponsePane/QueryResult/index.js @@ -27,14 +27,13 @@ const formatResponse = (data, mode, filter) => { let isValidJSON = false; try { - isValidJSON = - typeof JSON.parse(JSON.stringify(data)) === 'object' || typeof JSON.parse(JSON.stringify(data)) === 'string'; + isValidJSON = typeof JSON.parse(JSON.stringify(data)) === 'object' } catch (error) { console.log('Error parsing JSON: ', error.message); } if (!isValidJSON && typeof data === 'string') { - return data; + return JSON.stringify(data); } if (filter) { diff --git a/packages/bruno-electron/src/ipc/network/index.js b/packages/bruno-electron/src/ipc/network/index.js index 9e37c8289..479cb0d04 100644 --- a/packages/bruno-electron/src/ipc/network/index.js +++ b/packages/bruno-electron/src/ipc/network/index.js @@ -366,7 +366,10 @@ const parseDataFromResponse = (response, disableParsingResponseJson = false) => // Filter out ZWNBSP character // https://gist.github.com/antic183/619f42b559b78028d1fe9e7ae8a1352d data = data.replace(/^\uFEFF/, ''); - if (!disableParsingResponseJson) { + if ( + !disableParsingResponseJson + && !(data.startsWith("\"") && data.endsWith("\"")) // a quoated string is also a vaild json but we want to show it as a quoated string only (parsing removes the quoates) + ) { data = JSON.parse(data); } } catch { } From 54d8fbc478621459d448bbceb5059b896373af86 Mon Sep 17 00:00:00 2001 From: Pooja Belaramani Date: Fri, 27 Dec 2024 11:16:26 +0530 Subject: [PATCH 12/16] rm: json stringfy from json string data res --- .../bruno-app/src/components/ResponsePane/QueryResult/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/bruno-app/src/components/ResponsePane/QueryResult/index.js b/packages/bruno-app/src/components/ResponsePane/QueryResult/index.js index 81bcaca7e..b6b8d751d 100644 --- a/packages/bruno-app/src/components/ResponsePane/QueryResult/index.js +++ b/packages/bruno-app/src/components/ResponsePane/QueryResult/index.js @@ -33,7 +33,7 @@ const formatResponse = (data, mode, filter) => { } if (!isValidJSON && typeof data === 'string') { - return JSON.stringify(data); + return data; } if (filter) { From b6b4b7362fb6decf407fdc81a11d527ecfe5d4c7 Mon Sep 17 00:00:00 2001 From: Pooja Belaramani Date: Fri, 27 Dec 2024 15:51:06 +0530 Subject: [PATCH 13/16] fix: condition --- packages/bruno-electron/src/ipc/network/index.js | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/packages/bruno-electron/src/ipc/network/index.js b/packages/bruno-electron/src/ipc/network/index.js index 479cb0d04..6685e95ab 100644 --- a/packages/bruno-electron/src/ipc/network/index.js +++ b/packages/bruno-electron/src/ipc/network/index.js @@ -365,14 +365,17 @@ const parseDataFromResponse = (response, disableParsingResponseJson = false) => try { // Filter out ZWNBSP character // https://gist.github.com/antic183/619f42b559b78028d1fe9e7ae8a1352d + + // a quoated string is also a vaild json but we want to show it as a quoated string only (parsing removes the quoates) data = data.replace(/^\uFEFF/, ''); - if ( - !disableParsingResponseJson - && !(data.startsWith("\"") && data.endsWith("\"")) // a quoated string is also a vaild json but we want to show it as a quoated string only (parsing removes the quoates) - ) { + if ( !disableParsingResponseJson && ! (typeof data === 'string' && data.startsWith("\"") && data.endsWith("\""))) { + data = JSON.parse(data); + } { data = JSON.parse(data); } - } catch { } + } catch { + console.log('Failed to parse response data as JSON'); + } return { data, dataBuffer }; }; From 767db7573092bb537eac663d6cd1319d51c81f14 Mon Sep 17 00:00:00 2001 From: Pooja Belaramani Date: Fri, 27 Dec 2024 16:10:57 +0530 Subject: [PATCH 14/16] update: comment --- packages/bruno-electron/src/ipc/network/index.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/bruno-electron/src/ipc/network/index.js b/packages/bruno-electron/src/ipc/network/index.js index 6685e95ab..84f49d07b 100644 --- a/packages/bruno-electron/src/ipc/network/index.js +++ b/packages/bruno-electron/src/ipc/network/index.js @@ -366,12 +366,10 @@ const parseDataFromResponse = (response, disableParsingResponseJson = false) => // Filter out ZWNBSP character // https://gist.github.com/antic183/619f42b559b78028d1fe9e7ae8a1352d - // a quoated string is also a vaild json but we want to show it as a quoated string only (parsing removes the quoates) + // If the response is a string and starts and ends with double quotes, it's a stringified JSON and should not be parsed data = data.replace(/^\uFEFF/, ''); if ( !disableParsingResponseJson && ! (typeof data === 'string' && data.startsWith("\"") && data.endsWith("\""))) { data = JSON.parse(data); - } { - data = JSON.parse(data); } } catch { console.log('Failed to parse response data as JSON'); From 43e892f9b0bf0d83f9e1e4360a535b88d39d573d Mon Sep 17 00:00:00 2001 From: lohxt1 Date: Fri, 27 Dec 2024 16:50:12 +0530 Subject: [PATCH 15/16] fix: cli multipart --- packages/bruno-cli/src/runner/prepare-request.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/bruno-cli/src/runner/prepare-request.js b/packages/bruno-cli/src/runner/prepare-request.js index 21cf17bd1..0ed866760 100644 --- a/packages/bruno-cli/src/runner/prepare-request.js +++ b/packages/bruno-cli/src/runner/prepare-request.js @@ -136,8 +136,7 @@ const prepareRequest = (item = {}, collection = {}) => { if (request.body.mode === 'multipartForm') { axiosRequest.headers['content-type'] = 'multipart/form-data'; const enabledParams = filter(request.body.multipartForm, (p) => p.enabled); - const collectionPath = process.cwd(); - axiosRequest.data = createFormData(enabledParams, collectionPath); + axiosRequest.data = enabledParams; } if (request.body.mode === 'graphql') { From 795cd196f2d2c6aa4aaf9f2781d09a32202b2c9f Mon Sep 17 00:00:00 2001 From: lohxt1 Date: Mon, 30 Dec 2024 10:46:12 +0530 Subject: [PATCH 16/16] fix: multipart tests --- .../collection/echo/echo multipart.bru | 2 ++ .../multipart/mixed-content-types.bru | 24 ------------------- 2 files changed, 2 insertions(+), 24 deletions(-) delete mode 100644 packages/bruno-tests/collection/multipart/mixed-content-types.bru diff --git a/packages/bruno-tests/collection/echo/echo multipart.bru b/packages/bruno-tests/collection/echo/echo multipart.bru index 1edb2ca8a..09176d74f 100644 --- a/packages/bruno-tests/collection/echo/echo multipart.bru +++ b/packages/bruno-tests/collection/echo/echo multipart.bru @@ -11,6 +11,7 @@ post { } body:multipart-form { + foo: {"bar":"baz"} @contentType(application/json--test) form-data-key: {{form-data-key}} form-data-stringified-object: {{form-data-stringified-object}} file: @file(bruno.png) @@ -19,6 +20,7 @@ body:multipart-form { assert { res.body: contains form-data-value res.body: contains {"foo":123} + res.body: contains Content-Type: application/json--test } script:pre-request { diff --git a/packages/bruno-tests/collection/multipart/mixed-content-types.bru b/packages/bruno-tests/collection/multipart/mixed-content-types.bru deleted file mode 100644 index 29ed04ba1..000000000 --- a/packages/bruno-tests/collection/multipart/mixed-content-types.bru +++ /dev/null @@ -1,24 +0,0 @@ -meta { - name: mixed-content-types - type: http - seq: 1 -} - -post { - url: {{host}}/api/multipart/mixed-content-types - body: multipartForm - auth: none -} - -body:multipart-form { - param1: test - param2: {"test":"i am json"} @contentType(application/json) - param3: @file(multipart/small.png) -} - -assert { - res.status: eq 200 - res.body.find(p=>p.name === 'param1').contentType: isUndefined - res.body.find(p=>p.name === 'param2').contentType: eq application/json - res.body.find(p=>p.name === 'param3').contentType: eq image/png -}