From 587e3cfe5d1144c0d0f7472ea9a4c6c37971504c Mon Sep 17 00:00:00 2001 From: pooja-bruno Date: Thu, 26 Jun 2025 15:52:17 +0530 Subject: [PATCH 01/14] add: script error card in collection runner --- .../RunnerResults/ResponsePane/index.js | 31 +++- .../src/components/RunnerResults/index.jsx | 10 +- .../ReduxStore/slices/collections/index.js | 27 +++ .../bruno-electron/src/ipc/network/index.js | 157 +++++++++++++----- 4 files changed, 178 insertions(+), 47 deletions(-) diff --git a/packages/bruno-app/src/components/RunnerResults/ResponsePane/index.js b/packages/bruno-app/src/components/RunnerResults/ResponsePane/index.js index 21f02406e..76a65d0cd 100644 --- a/packages/bruno-app/src/components/RunnerResults/ResponsePane/index.js +++ b/packages/bruno-app/src/components/RunnerResults/ResponsePane/index.js @@ -1,4 +1,4 @@ -import React, { useState } from 'react'; +import React, { useState, useEffect } from 'react'; import get from 'lodash/get'; import classnames from 'classnames'; import { safeStringifyJSON } from 'utils/common'; @@ -12,17 +12,28 @@ import TestResultsLabel from 'components/ResponsePane/TestResultsLabel'; import StyledWrapper from './StyledWrapper'; import SkippedRequest from 'components/ResponsePane/SkippedRequest'; import RunnerTimeline from 'components/ResponsePane/RunnerTimeline'; +import ScriptError from 'components/ResponsePane/ScriptError'; +import ScriptErrorIcon from 'components/ResponsePane/ScriptErrorIcon'; const ResponsePane = ({ rightPaneWidth, item, collection }) => { const [selectedTab, setSelectedTab] = useState('response'); + const [showScriptErrorCard, setShowScriptErrorCard] = useState(false); const { requestSent, responseReceived, testResults, assertionResults, preRequestTestResults, postResponseTestResults, error } = item; + useEffect(() => { + if (item?.preRequestScriptErrorMessage || item?.postResponseScriptErrorMessage || item?.testScriptErrorMessage) { + setShowScriptErrorCard(true); + } + }, [item?.preRequestScriptErrorMessage, item?.postResponseScriptErrorMessage, item?.testScriptErrorMessage]); + const headers = get(item, 'responseReceived.headers', []); const status = get(item, 'responseReceived.status', 0); const size = get(item, 'responseReceived.size', 0); const duration = get(item, 'responseReceived.duration', 0); + const hasScriptError = item?.preRequestScriptErrorMessage || item?.postResponseScriptErrorMessage || item?.testScriptErrorMessage; + const selectTab = (tab) => setSelectedTab(tab); const getTabPanel = (tab) => { @@ -99,12 +110,28 @@ const ResponsePane = ({ rightPaneWidth, item, collection }) => { />
+ {hasScriptError && !showScriptErrorCard && ( + setShowScriptErrorCard(true)} + /> + )}
-
{getTabPanel(selectedTab)}
+
+ {hasScriptError && showScriptErrorCard && ( + setShowScriptErrorCard(false)} + /> + )} +
+ {getTabPanel(selectedTab)} +
+
); }; diff --git a/packages/bruno-app/src/components/RunnerResults/index.jsx b/packages/bruno-app/src/components/RunnerResults/index.jsx index cbf099e5b..b35d366a6 100644 --- a/packages/bruno-app/src/components/RunnerResults/index.jsx +++ b/packages/bruno-app/src/components/RunnerResults/index.jsx @@ -27,7 +27,10 @@ const allTestsPassed = (item) => { item.testStatus === 'pass' && item.assertionStatus === 'pass' && item.preRequestTestStatus === 'pass' && - item.postResponseTestStatus === 'pass'; + item.postResponseTestStatus === 'pass' && + !item.preRequestScriptErrorMessage && + !item.postResponseScriptErrorMessage && + !item.testScriptErrorMessage; }; const anyTestFailed = (item) => { @@ -35,7 +38,10 @@ const anyTestFailed = (item) => { item.testStatus === 'fail' || item.assertionStatus === 'fail' || item.preRequestTestStatus === 'fail' || - item.postResponseTestStatus === 'fail'; + item.postResponseTestStatus === 'fail' || + item.preRequestScriptErrorMessage || + item.postResponseScriptErrorMessage || + item.testScriptErrorMessage; }; export default function RunnerResults({ collection }) { diff --git a/packages/bruno-app/src/providers/ReduxStore/slices/collections/index.js b/packages/bruno-app/src/providers/ReduxStore/slices/collections/index.js index 9139ec599..55945a853 100644 --- a/packages/bruno-app/src/providers/ReduxStore/slices/collections/index.js +++ b/packages/bruno-app/src/providers/ReduxStore/slices/collections/index.js @@ -2177,6 +2177,33 @@ export const collectionsSlice = createSlice({ item.status = 'skipped'; item.responseReceived = action.payload.responseReceived; } + + if (type === 'post-response-script-execution') { + const item = collection.runnerResult.items.findLast((i) => i.uid === request.uid); + if (action.payload.errorMessage) { + item.postResponseScriptErrorMessage = action.payload.errorMessage; + } else { + item.postResponseScriptErrorMessage = null; + } + } + + if (type === 'test-script-execution') { + const item = collection.runnerResult.items.findLast((i) => i.uid === request.uid); + if (action.payload.errorMessage) { + item.testScriptErrorMessage = action.payload.errorMessage; + } else { + item.testScriptErrorMessage = null; + } + } + + if (type === 'pre-request-script-execution') { + const item = collection.runnerResult.items.findLast((i) => i.uid === request.uid); + if (action.payload.errorMessage) { + item.preRequestScriptErrorMessage = action.payload.errorMessage; + } else { + item.preRequestScriptErrorMessage = null; + } + } } }, resetCollectionRunner: (state, action) => { diff --git a/packages/bruno-electron/src/ipc/network/index.js b/packages/bruno-electron/src/ipc/network/index.js index aa70ab8c6..490fc2535 100644 --- a/packages/bruno-electron/src/ipc/network/index.js +++ b/packages/bruno-electron/src/ipc/network/index.js @@ -1032,18 +1032,49 @@ const registerNetworkIpc = (mainWindow) => { const requestUid = uuid(); try { - const preRequestScriptResult = await runPreRequest( - request, - requestUid, - envVars, - collectionPath, - collection, - collectionUid, - runtimeVariables, - processEnvVars, - scriptingConfig, - runRequestByItemPathname - ); + let preRequestScriptResult; + try { + preRequestScriptResult = await runPreRequest( + request, + requestUid, + envVars, + collectionPath, + collection, + collectionUid, + runtimeVariables, + processEnvVars, + scriptingConfig, + runRequestByItemPathname + ); + + // Send pre-request test results if available + if (preRequestScriptResult?.results) { + mainWindow.webContents.send('main:run-folder-event', { + type: 'test-results-pre-request', + preRequestTestResults: preRequestScriptResult.results, + ...eventData + }); + } + + mainWindow.webContents.send('main:run-folder-event', { + type: 'pre-request-script-execution', + ...eventData, + errorMessage: null, + }); + } catch (error) { + console.error('Pre-request script error:', error); + + // Format a more readable error message + const errorMessage = error?.message || 'An error occurred in pre-request script'; + + mainWindow.webContents.send('main:run-folder-event', { + type: 'pre-request-script-execution', + ...eventData, + errorMessage: errorMessage, + }); + + throw error; + } if (preRequestScriptResult?.nextRequestName !== undefined) { nextRequestName = preRequestScriptResult.nextRequestName; @@ -1053,15 +1084,6 @@ const registerNetworkIpc = (mainWindow) => { stopRunnerExecution = true; } - // Send pre-request test results if available - if (preRequestScriptResult?.results) { - mainWindow.webContents.send('main:run-folder-event', { - type: 'test-results-pre-request', - preRequestTestResults: preRequestScriptResult.results, - ...eventData - }); - } - if (preRequestScriptResult?.skipRequest) { mainWindow.webContents.send('main:run-folder-event', { type: 'runner-request-skipped', @@ -1200,19 +1222,39 @@ const registerNetworkIpc = (mainWindow) => { } } - const postResponseScriptResult = await runPostResponse( - request, - response, - requestUid, - envVars, - collectionPath, - collection, - collectionUid, - runtimeVariables, - processEnvVars, - scriptingConfig, - runRequestByItemPathname - ); + let postResponseScriptResult; + try { + postResponseScriptResult = await runPostResponse( + request, + response, + requestUid, + envVars, + collectionPath, + collection, + collectionUid, + runtimeVariables, + processEnvVars, + scriptingConfig, + runRequestByItemPathname + ); + + mainWindow.webContents.send('main:run-folder-event', { + type: 'post-response-script-execution', + ...eventData, + errorMessage: null, + }); + } catch (error) { + console.error('Post-response script error:', error); + + // Format a more readable error message + const errorMessage = error?.message || 'An error occurred in post-response script'; + + mainWindow.webContents.send('main:run-folder-event', { + type: 'post-response-script-execution', + ...eventData, + errorMessage: errorMessage, + }); + } if (postResponseScriptResult?.nextRequestName !== undefined) { nextRequestName = postResponseScriptResult.nextRequestName; @@ -1255,9 +1297,12 @@ const registerNetworkIpc = (mainWindow) => { const testFile = get(request, 'tests'); const collectionName = collection?.name if (typeof testFile === 'string') { + let testResults = null; + let testError = null; + try { const testRuntime = new TestRuntime({ runtime: scriptingConfig?.runtime }); - const testResults = await testRuntime.runTests( + testResults = await testRuntime.runTests( decomment(testFile), request, response, @@ -1292,30 +1337,56 @@ const registerNetworkIpc = (mainWindow) => { }); collection.globalEnvironmentVariables = testResults.globalEnvironmentVariables; - } catch (testError) { + } catch (error) { + testError = error; - if (testError.partialResults && testError.partialResults.results.length > 0) { - + if (error.partialResults) { + testResults = error.partialResults; + } else { + testResults = { + request, + envVariables: envVars, + runtimeVariables, + globalEnvironmentVariables: request?.globalEnvironmentVariables || {}, + results: [], + nextRequestName: null + }; + } + + if (testResults && testResults.results.length > 0) { // Send the partial test results mainWindow.webContents.send('main:run-folder-event', { type: 'test-results', - testResults: testError.partialResults.results, + testResults: testResults.results, ...eventData }); mainWindow.webContents.send('main:script-environment-update', { - envVariables: testError.partialResults.envVariables, - runtimeVariables: testError.partialResults.runtimeVariables, + envVariables: testResults.envVariables, + runtimeVariables: testResults.runtimeVariables, collectionUid }); mainWindow.webContents.send('main:global-environment-variables-update', { - globalEnvironmentVariables: testError.partialResults.globalEnvironmentVariables + globalEnvironmentVariables: testResults.globalEnvironmentVariables }); - collection.globalEnvironmentVariables = testError.partialResults.globalEnvironmentVariables; + collection.globalEnvironmentVariables = testResults.globalEnvironmentVariables; } } + + const testScriptExecutionEvent = { + type: 'test-script-execution', + ...eventData, + errorMessage: null, + } + + if (testError) { + const errorMessage = testError?.message || 'An error occurred in test script'; + testScriptExecutionEvent.errorMessage = errorMessage; + } + + mainWindow.webContents.send('main:run-folder-event', testScriptExecutionEvent); } } catch (error) { mainWindow.webContents.send('main:run-folder-event', { From cab75f75432903597fdcdc84eed44ee38d614237 Mon Sep 17 00:00:00 2001 From: pooja-bruno Date: Fri, 27 Jun 2025 14:30:17 +0530 Subject: [PATCH 02/14] improvements --- .../bruno-electron/src/ipc/network/index.js | 211 ++++++++---------- 1 file changed, 94 insertions(+), 117 deletions(-) diff --git a/packages/bruno-electron/src/ipc/network/index.js b/packages/bruno-electron/src/ipc/network/index.js index 490fc2535..42f3bfaf8 100644 --- a/packages/bruno-electron/src/ipc/network/index.js +++ b/packages/bruno-electron/src/ipc/network/index.js @@ -398,6 +398,19 @@ const registerNetworkIpc = (mainWindow) => { }); }; + const notifyScriptExecution = ({ + channel, // 'main:run-request-event' | 'main:run-folder-event' + basePayload, // request-level or runner-level identifiers + scriptType, // 'pre-request' | 'post-response' | 'test' + error // optional Error + }) => { + mainWindow.webContents.send(channel, { + type: `${scriptType}-script-execution`, + ...basePayload, + errorMessage: error ? (error.message || `An error occurred in ${scriptType.replace('-', ' ')} script`) : null + }); + }; + const runPreRequest = async ( request, requestUid, @@ -594,9 +607,10 @@ const registerNetworkIpc = (mainWindow) => { request.signal = abortController.signal; saveCancelToken(cancelTokenUid, abortController); - + let preRequestScriptResult = null; + let preRequestError = null; try { - const preRequestScriptResult = await runPreRequest( + preRequestScriptResult = await runPreRequest( request, requestUid, envVars, @@ -608,34 +622,29 @@ const registerNetworkIpc = (mainWindow) => { scriptingConfig, runRequestByItemPathname ); - - if (preRequestScriptResult?.results) { - mainWindow.webContents.send('main:run-request-event', { - type: 'test-results-pre-request', - results: preRequestScriptResult.results, - itemUid: item.uid, - requestUid, - collectionUid - }); - } - - !runInBackground && mainWindow.webContents.send('main:run-request-event', { - type: 'pre-request-script-execution', - requestUid, - collectionUid, - itemUid: item.uid, - errorMessage: null, - }); - } catch (error) { - !runInBackground && mainWindow.webContents.send('main:run-request-event', { - type: 'pre-request-script-execution', - requestUid, - collectionUid, + preRequestError = error; + } + + if (preRequestScriptResult?.results) { + mainWindow.webContents.send('main:run-request-event', { + type: 'test-results-pre-request', + results: preRequestScriptResult.results, itemUid: item.uid, - errorMessage: error?.message || 'An error occurred in pre-request script', + requestUid, + collectionUid }); - return Promise.reject(error); + } + + !runInBackground && notifyScriptExecution({ + channel: 'main:run-request-event', + basePayload: { requestUid, collectionUid, itemUid: item.uid }, + scriptType: 'pre-request', + error: preRequestError + }); + + if (preRequestError) { + return Promise.reject(preRequestError); } const axiosInstance = await configureRequest( collectionUid, @@ -734,8 +743,10 @@ const registerNetworkIpc = (mainWindow) => { mainWindow.webContents.send('main:cookies-update', safeParseJSON(safeStringifyJSON(domainsWithCookies))); + let postResponseScriptResult = null; + let postResponseError = null; try { - const postResponseScriptResult = await runPostResponse( + postResponseScriptResult = await runPostResponse( request, response, requestUid, @@ -748,38 +759,28 @@ const registerNetworkIpc = (mainWindow) => { scriptingConfig, runRequestByItemPathname ); - - if (postResponseScriptResult?.results) { - mainWindow.webContents.send('main:run-request-event', { - type: 'test-results-post-response', - results: postResponseScriptResult.results, - itemUid: item.uid, - requestUid, - collectionUid - }); - } - !runInBackground && mainWindow.webContents.send('main:run-request-event', { - type: 'post-response-script-execution', - requestUid, - collectionUid, - errorMessage: null, - itemUid: item.uid, - }); } catch (error) { console.error('Post-response script error:', error); - - // Format a more readable error message - const errorMessage = error?.message || 'An error occurred in post-response script'; - - !runInBackground && mainWindow.webContents.send('main:run-request-event', { - type: 'post-response-script-execution', - requestUid, - errorMessage, - collectionUid, + postResponseError = error; + } + + if (postResponseScriptResult?.results) { + mainWindow.webContents.send('main:run-request-event', { + type: 'test-results-post-response', + results: postResponseScriptResult.results, itemUid: item.uid, + requestUid, + collectionUid }); } + !runInBackground && notifyScriptExecution({ + channel: 'main:run-request-event', + basePayload: { requestUid, collectionUid, itemUid: item.uid }, + scriptType: 'post-response', + error: postResponseError + }); + // run assertions const assertions = get(request, 'assertions'); if (assertions) { @@ -861,19 +862,12 @@ const registerNetworkIpc = (mainWindow) => { collection.globalEnvironmentVariables = testResults.globalEnvironmentVariables; - const testScriptExecutionEvent = { - type: 'test-script-execution', - requestUid, - collectionUid, - itemUid: item.uid, - errorMessage: null, - } - - if (testError) { - const errorMessage = testError?.message || 'An error occurred in test script'; - testScriptExecutionEvent.errorMessage = errorMessage; - } - !runInBackground && mainWindow.webContents.send('main:run-request-event', testScriptExecutionEvent); + !runInBackground && notifyScriptExecution({ + channel: 'main:run-request-event', + basePayload: { requestUid, collectionUid, itemUid: item.uid }, + scriptType: 'test', + error: testError + }); } return { @@ -1033,6 +1027,7 @@ const registerNetworkIpc = (mainWindow) => { try { let preRequestScriptResult; + let preRequestError = null; try { preRequestScriptResult = await runPreRequest( request, @@ -1046,34 +1041,28 @@ const registerNetworkIpc = (mainWindow) => { scriptingConfig, runRequestByItemPathname ); - - // Send pre-request test results if available - if (preRequestScriptResult?.results) { - mainWindow.webContents.send('main:run-folder-event', { - type: 'test-results-pre-request', - preRequestTestResults: preRequestScriptResult.results, - ...eventData - }); - } - - mainWindow.webContents.send('main:run-folder-event', { - type: 'pre-request-script-execution', - ...eventData, - errorMessage: null, - }); } catch (error) { console.error('Pre-request script error:', error); + preRequestError = error; + } - // Format a more readable error message - const errorMessage = error?.message || 'An error occurred in pre-request script'; - + if (preRequestScriptResult?.results) { mainWindow.webContents.send('main:run-folder-event', { - type: 'pre-request-script-execution', - ...eventData, - errorMessage: errorMessage, + type: 'test-results-pre-request', + preRequestTestResults: preRequestScriptResult.results, + ...eventData }); - - throw error; + } + + notifyScriptExecution({ + channel: 'main:run-folder-event', + basePayload: eventData, + scriptType: 'pre-request', + error: preRequestError + }); + + if (preRequestError) { + throw preRequestError; } if (preRequestScriptResult?.nextRequestName !== undefined) { @@ -1223,6 +1212,7 @@ const registerNetworkIpc = (mainWindow) => { } let postResponseScriptResult; + let postResponseError = null; try { postResponseScriptResult = await runPostResponse( request, @@ -1237,25 +1227,18 @@ const registerNetworkIpc = (mainWindow) => { scriptingConfig, runRequestByItemPathname ); - - mainWindow.webContents.send('main:run-folder-event', { - type: 'post-response-script-execution', - ...eventData, - errorMessage: null, - }); } catch (error) { console.error('Post-response script error:', error); - - // Format a more readable error message - const errorMessage = error?.message || 'An error occurred in post-response script'; - - mainWindow.webContents.send('main:run-folder-event', { - type: 'post-response-script-execution', - ...eventData, - errorMessage: errorMessage, - }); + postResponseError = error; } + notifyScriptExecution({ + channel: 'main:run-folder-event', + basePayload: eventData, + scriptType: 'post-response', + error: postResponseError + }); + if (postResponseScriptResult?.nextRequestName !== undefined) { nextRequestName = postResponseScriptResult.nextRequestName; } @@ -1375,18 +1358,12 @@ const registerNetworkIpc = (mainWindow) => { } } - const testScriptExecutionEvent = { - type: 'test-script-execution', - ...eventData, - errorMessage: null, - } - - if (testError) { - const errorMessage = testError?.message || 'An error occurred in test script'; - testScriptExecutionEvent.errorMessage = errorMessage; - } - - mainWindow.webContents.send('main:run-folder-event', testScriptExecutionEvent); + notifyScriptExecution({ + channel: 'main:run-folder-event', + basePayload: eventData, + scriptType: 'test', + error: testError + }); } } catch (error) { mainWindow.webContents.send('main:run-folder-event', { From 47bedec590c60cfb48a883ae410a5918fdf5cea0 Mon Sep 17 00:00:00 2001 From: pooja-bruno Date: Fri, 27 Jun 2025 16:45:53 +0530 Subject: [PATCH 03/14] add: script error console in cli --- .../src/components/RunnerResults/index.jsx | 10 +- .../src/runner/run-single-request.js | 94 +++++++------ .../bruno-js/src/runtime/script-runtime.js | 123 +++++++++--------- 3 files changed, 116 insertions(+), 111 deletions(-) diff --git a/packages/bruno-app/src/components/RunnerResults/index.jsx b/packages/bruno-app/src/components/RunnerResults/index.jsx index b35d366a6..cbf099e5b 100644 --- a/packages/bruno-app/src/components/RunnerResults/index.jsx +++ b/packages/bruno-app/src/components/RunnerResults/index.jsx @@ -27,10 +27,7 @@ const allTestsPassed = (item) => { item.testStatus === 'pass' && item.assertionStatus === 'pass' && item.preRequestTestStatus === 'pass' && - item.postResponseTestStatus === 'pass' && - !item.preRequestScriptErrorMessage && - !item.postResponseScriptErrorMessage && - !item.testScriptErrorMessage; + item.postResponseTestStatus === 'pass'; }; const anyTestFailed = (item) => { @@ -38,10 +35,7 @@ const anyTestFailed = (item) => { item.testStatus === 'fail' || item.assertionStatus === 'fail' || item.preRequestTestStatus === 'fail' || - item.postResponseTestStatus === 'fail' || - item.preRequestScriptErrorMessage || - item.postResponseScriptErrorMessage || - item.testScriptErrorMessage; + item.postResponseTestStatus === 'fail'; }; export default function RunnerResults({ collection }) { diff --git a/packages/bruno-cli/src/runner/run-single-request.js b/packages/bruno-cli/src/runner/run-single-request.js index 50aaf823b..8cd54206e 100644 --- a/packages/bruno-cli/src/runner/run-single-request.js +++ b/packages/bruno-cli/src/runner/run-single-request.js @@ -495,29 +495,33 @@ const runSingleRequest = async function ( const responseScriptFile = get(request, 'script.res'); if (responseScriptFile?.length) { const scriptRuntime = new ScriptRuntime({ runtime: scriptingConfig?.runtime }); - const result = await scriptRuntime.runResponseScript( - decomment(responseScriptFile), - request, - response, - envVariables, - runtimeVariables, - collectionPath, - null, - processEnvVars, - scriptingConfig, - runSingleRequestByPathname, - collectionName - ); - if (result?.nextRequestName !== undefined) { - nextRequestName = result.nextRequestName; - } + try { + const result = await scriptRuntime.runResponseScript( + decomment(responseScriptFile), + request, + response, + envVariables, + runtimeVariables, + collectionPath, + null, + processEnvVars, + scriptingConfig, + runSingleRequestByPathname, + collectionName + ); + if (result?.nextRequestName !== undefined) { + nextRequestName = result.nextRequestName; + } - if (result?.stopExecution) { - shouldStopRunnerExecution = true; - } + if (result?.stopExecution) { + shouldStopRunnerExecution = true; + } - postResponseTestResults = result?.results || []; - logResults(postResponseTestResults, 'Post-Response Tests'); + postResponseTestResults = result?.results || []; + logResults(postResponseTestResults, 'Post-Response Tests'); + } catch (error) { + logResults(error); + } } let assertionResults = []; @@ -539,30 +543,34 @@ const runSingleRequest = async function ( const testFile = get(request, 'tests'); if (typeof testFile === 'string') { const testRuntime = new TestRuntime({ runtime: scriptingConfig?.runtime }); - const result = await testRuntime.runTests( - decomment(testFile), - request, - response, - envVariables, - runtimeVariables, - collectionPath, - null, - processEnvVars, - scriptingConfig, - runSingleRequestByPathname, - collectionName - ); - testResults = get(result, 'results', []); + try { + const result = await testRuntime.runTests( + decomment(testFile), + request, + response, + envVariables, + runtimeVariables, + collectionPath, + null, + processEnvVars, + scriptingConfig, + runSingleRequestByPathname, + collectionName + ); + testResults = get(result, 'results', []); - if (result?.nextRequestName !== undefined) { - nextRequestName = result.nextRequestName; + if (result?.nextRequestName !== undefined) { + nextRequestName = result.nextRequestName; + } + + if (result?.stopExecution) { + shouldStopRunnerExecution = true; + } + + logResults(testResults, 'Tests'); + } catch (error) { + logResults(error); } - - if (result?.stopExecution) { - shouldStopRunnerExecution = true; - } - - logResults(testResults, 'Tests'); } diff --git a/packages/bruno-js/src/runtime/script-runtime.js b/packages/bruno-js/src/runtime/script-runtime.js index a18c94917..3d1b0ec30 100644 --- a/packages/bruno-js/src/runtime/script-runtime.js +++ b/packages/bruno-js/src/runtime/script-runtime.js @@ -260,69 +260,65 @@ class ScriptRuntime { context.bru.runRequest = runRequestByItemPathname; } - if (this.runtime === 'quickjs') { - await executeQuickJsVmAsync({ - script: script, - context: context, - collectionPath - }); + let scriptError = null; - return { - response, - envVariables: cleanJson(envVariables), - runtimeVariables: cleanJson(runtimeVariables), - globalEnvironmentVariables: cleanJson(globalEnvironmentVariables), - results: cleanJson(__brunoTestResults.getResults()), - nextRequestName: bru.nextRequest, - skipRequest: bru.skipRequest, - stopExecution: bru.stopExecution - }; + try { + if (this.runtime === 'quickjs') { + await executeQuickJsVmAsync({ + script: script, + context: context, + collectionPath + }); + } else { + // default runtime is vm2 + const vm = new NodeVM({ + sandbox: context, + require: { + context: 'sandbox', + builtin: [ "*" ], + external: true, + root: [collectionPath, ...additionalContextRootsAbsolute], + mock: { + // node libs + path, + stream, + util, + url, + http, + https, + punycode, + zlib, + // 3rd party libs + ajv, + 'ajv-formats': addFormats, + atob, + btoa, + lodash, + moment, + uuid, + nanoid, + axios, + 'node-fetch': fetch, + 'crypto-js': CryptoJS, + 'xml2js': xml2js, + cheerio, + tv4, + ...whitelistedModules, + fs: allowScriptFilesystemAccess ? fs : undefined, + 'node-vault': NodeVault + } + } + }); + + const asyncVM = vm.run(`module.exports = async () => { ${script} }`, path.join(collectionPath, 'vm.js')); + await asyncVM(); + } + } catch (error) { + scriptError = error; + console.error('Post-response script execution error:', error); } - // default runtime is vm2 - const vm = new NodeVM({ - sandbox: context, - require: { - context: 'sandbox', - builtin: [ "*" ], - external: true, - root: [collectionPath, ...additionalContextRootsAbsolute], - mock: { - // node libs - path, - stream, - util, - url, - http, - https, - punycode, - zlib, - // 3rd party libs - ajv, - 'ajv-formats': addFormats, - atob, - btoa, - lodash, - moment, - uuid, - nanoid, - axios, - 'node-fetch': fetch, - 'crypto-js': CryptoJS, - 'xml2js': xml2js, - cheerio, - tv4, - ...whitelistedModules, - fs: allowScriptFilesystemAccess ? fs : undefined, - 'node-vault': NodeVault - } - } - }); - - const asyncVM = vm.run(`module.exports = async () => { ${script} }`, path.join(collectionPath, 'vm.js')); - await asyncVM(); - - return { + const result = { response, envVariables: cleanJson(envVariables), runtimeVariables: cleanJson(runtimeVariables), @@ -332,6 +328,13 @@ class ScriptRuntime { skipRequest: bru.skipRequest, stopExecution: bru.stopExecution }; + + if (scriptError) { + scriptError.partialResults = result; + throw scriptError; + } + + return result; } } From cb880840a2eb1e3622c7659bd548de4b80ca1351 Mon Sep 17 00:00:00 2001 From: pooja-bruno Date: Fri, 27 Jun 2025 16:54:20 +0530 Subject: [PATCH 04/14] add: error indicator in test tab --- .../src/components/RequestPane/HttpRequestPane/index.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/bruno-app/src/components/RequestPane/HttpRequestPane/index.js b/packages/bruno-app/src/components/RequestPane/HttpRequestPane/index.js index 126613504..6a4dfb071 100644 --- a/packages/bruno-app/src/components/RequestPane/HttpRequestPane/index.js +++ b/packages/bruno-app/src/components/RequestPane/HttpRequestPane/index.js @@ -164,7 +164,11 @@ const HttpRequestPane = ({ item, collection }) => {
selectTab('tests')}> Tests - {tests && tests.length > 0 && } + {tests && tests.length > 0 && ( + item.testScriptErrorMessage ? + : + + )}
selectTab('docs')}> Docs From 7f7b4e1c324a30b4918a5381b432adab95884b8c Mon Sep 17 00:00:00 2001 From: pooja-bruno Date: Mon, 30 Jun 2025 12:09:04 +0530 Subject: [PATCH 05/14] improvements --- .../components/CollectionSettings/index.js | 10 +------ .../src/components/FolderSettings/index.js | 10 +------ .../src/components/Indicators/index.js | 15 +++++++++++ .../RequestPane/HttpRequestPane/index.js | 26 ++++--------------- 4 files changed, 22 insertions(+), 39 deletions(-) create mode 100644 packages/bruno-app/src/components/Indicators/index.js diff --git a/packages/bruno-app/src/components/CollectionSettings/index.js b/packages/bruno-app/src/components/CollectionSettings/index.js index a4d011be3..8c639256b 100644 --- a/packages/bruno-app/src/components/CollectionSettings/index.js +++ b/packages/bruno-app/src/components/CollectionSettings/index.js @@ -15,17 +15,9 @@ import Test from './Tests'; import Presets from './Presets'; import StyledWrapper from './StyledWrapper'; import Vars from './Vars/index'; -import DotIcon from 'components/Icons/Dot'; +import { ContentIndicator } from 'components/Indicators'; import Overview from './Overview/index'; -const ContentIndicator = () => { - return ( - - - - ); -}; - const CollectionSettings = ({ collection }) => { const dispatch = useDispatch(); const tab = collection.settingsSelectedTab; diff --git a/packages/bruno-app/src/components/FolderSettings/index.js b/packages/bruno-app/src/components/FolderSettings/index.js index 621ae6815..6aa1e4b57 100644 --- a/packages/bruno-app/src/components/FolderSettings/index.js +++ b/packages/bruno-app/src/components/FolderSettings/index.js @@ -9,17 +9,9 @@ import StyledWrapper from './StyledWrapper'; import Vars from './Vars'; import Documentation from './Documentation'; import Auth from './Auth'; -import DotIcon from 'components/Icons/Dot'; +import { ContentIndicator } from 'components/Indicators'; import get from 'lodash/get'; -const ContentIndicator = () => { - return ( - - - - ); -}; - const FolderSettings = ({ collection, folder }) => { const dispatch = useDispatch(); let tab = 'headers'; diff --git a/packages/bruno-app/src/components/Indicators/index.js b/packages/bruno-app/src/components/Indicators/index.js new file mode 100644 index 000000000..c7f7d158d --- /dev/null +++ b/packages/bruno-app/src/components/Indicators/index.js @@ -0,0 +1,15 @@ +import React from 'react'; +import DotIcon from 'components/Icons/Dot'; + +// base indicator – add extra tailwind/utility classes through `colorClass` + +const DotIndicator = ({ colorClass = '' }) => ( + + + +); + +export const ContentIndicator = () => ; +export const ErrorIndicator = () => ; + +export default ContentIndicator; \ No newline at end of file diff --git a/packages/bruno-app/src/components/RequestPane/HttpRequestPane/index.js b/packages/bruno-app/src/components/RequestPane/HttpRequestPane/index.js index 6a4dfb071..8bfb6d5a3 100644 --- a/packages/bruno-app/src/components/RequestPane/HttpRequestPane/index.js +++ b/packages/bruno-app/src/components/RequestPane/HttpRequestPane/index.js @@ -7,7 +7,6 @@ import RequestHeaders from 'components/RequestPane/RequestHeaders'; import RequestBody from 'components/RequestPane/RequestBody'; import RequestBodyMode from 'components/RequestPane/RequestBody/RequestBodyMode'; import Auth from 'components/RequestPane/Auth'; -import DotIcon from 'components/Icons/Dot'; import Vars from 'components/RequestPane/Vars'; import Assertions from 'components/RequestPane/Assertions'; import Script from 'components/RequestPane/Script'; @@ -17,22 +16,7 @@ import { find, get } from 'lodash'; import Documentation from 'components/Documentation/index'; import HeightBoundContainer from 'ui/HeightBoundContainer'; import { useEffect } from 'react'; - -const ContentIndicator = () => { - return ( - - - - ); -}; - -const ErrorIndicator = () => { - return ( - - - - ); -}; +import { ContentIndicator, ErrorIndicator } from 'components/Indicators'; const HttpRequestPane = ({ item, collection }) => { const dispatch = useDispatch(); @@ -153,8 +137,8 @@ const HttpRequestPane = ({ item, collection }) => {
selectTab('script')}> Script {(script.req || script.res) && ( - item.preRequestScriptErrorMessage || item.postResponseScriptErrorMessage ? - : + item.preRequestScriptErrorMessage || item.postResponseScriptErrorMessage ? + : )}
@@ -165,8 +149,8 @@ const HttpRequestPane = ({ item, collection }) => {
selectTab('tests')}> Tests {tests && tests.length > 0 && ( - item.testScriptErrorMessage ? - : + item.testScriptErrorMessage ? + : )}
From d39ccd2195640960070ec2192bedcbd16908f359 Mon Sep 17 00:00:00 2001 From: pooja-bruno Date: Mon, 30 Jun 2025 12:09:27 +0530 Subject: [PATCH 06/14] rm: comments --- packages/bruno-app/src/components/Indicators/index.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/bruno-app/src/components/Indicators/index.js b/packages/bruno-app/src/components/Indicators/index.js index c7f7d158d..4acaeb946 100644 --- a/packages/bruno-app/src/components/Indicators/index.js +++ b/packages/bruno-app/src/components/Indicators/index.js @@ -1,8 +1,6 @@ import React from 'react'; import DotIcon from 'components/Icons/Dot'; -// base indicator – add extra tailwind/utility classes through `colorClass` - const DotIndicator = ({ colorClass = '' }) => ( From c96042c53fef8aaffcad8e349ed714781fa821f2 Mon Sep 17 00:00:00 2001 From: pooja-bruno Date: Mon, 30 Jun 2025 13:07:37 +0530 Subject: [PATCH 07/14] fix: testResult code --- .../bruno-electron/src/ipc/network/index.js | 65 +++++++------------ 1 file changed, 22 insertions(+), 43 deletions(-) diff --git a/packages/bruno-electron/src/ipc/network/index.js b/packages/bruno-electron/src/ipc/network/index.js index 42f3bfaf8..a2fbef705 100644 --- a/packages/bruno-electron/src/ipc/network/index.js +++ b/packages/bruno-electron/src/ipc/network/index.js @@ -1298,28 +1298,6 @@ const registerNetworkIpc = (mainWindow) => { runRequestByItemPathname, collectionName ); - - if (testResults?.nextRequestName !== undefined) { - nextRequestName = testResults.nextRequestName; - } - - mainWindow.webContents.send('main:run-folder-event', { - type: 'test-results', - testResults: testResults.results, - ...eventData - }); - - mainWindow.webContents.send('main:script-environment-update', { - envVariables: testResults.envVariables, - runtimeVariables: testResults.runtimeVariables, - collectionUid - }); - - mainWindow.webContents.send('main:global-environment-variables-update', { - globalEnvironmentVariables: testResults.globalEnvironmentVariables - }); - - collection.globalEnvironmentVariables = testResults.globalEnvironmentVariables; } catch (error) { testError = error; @@ -1335,29 +1313,30 @@ const registerNetworkIpc = (mainWindow) => { nextRequestName: null }; } - - if (testResults && testResults.results.length > 0) { - // Send the partial test results - mainWindow.webContents.send('main:run-folder-event', { - type: 'test-results', - testResults: testResults.results, - ...eventData - }); - - mainWindow.webContents.send('main:script-environment-update', { - envVariables: testResults.envVariables, - runtimeVariables: testResults.runtimeVariables, - collectionUid - }); - - mainWindow.webContents.send('main:global-environment-variables-update', { - globalEnvironmentVariables: testResults.globalEnvironmentVariables - }); - - collection.globalEnvironmentVariables = testResults.globalEnvironmentVariables; - } } + if (testResults?.nextRequestName !== undefined) { + nextRequestName = testResults.nextRequestName; + } + + mainWindow.webContents.send('main:run-folder-event', { + type: 'test-results', + testResults: testResults.results, + ...eventData + }); + + mainWindow.webContents.send('main:script-environment-update', { + envVariables: testResults.envVariables, + runtimeVariables: testResults.runtimeVariables, + collectionUid + }); + + mainWindow.webContents.send('main:global-environment-variables-update', { + globalEnvironmentVariables: testResults.globalEnvironmentVariables + }); + + collection.globalEnvironmentVariables = testResults.globalEnvironmentVariables; + notifyScriptExecution({ channel: 'main:run-folder-event', basePayload: eventData, From cff4f5457bea97db7896e19274b3b5c4d1207e24 Mon Sep 17 00:00:00 2001 From: pooja-bruno Date: Mon, 30 Jun 2025 13:46:06 +0530 Subject: [PATCH 08/14] fix: sending script error --- .../src/providers/ReduxStore/slices/collections/index.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/bruno-app/src/providers/ReduxStore/slices/collections/index.js b/packages/bruno-app/src/providers/ReduxStore/slices/collections/index.js index 55945a853..227c61709 100644 --- a/packages/bruno-app/src/providers/ReduxStore/slices/collections/index.js +++ b/packages/bruno-app/src/providers/ReduxStore/slices/collections/index.js @@ -2062,6 +2062,10 @@ export const collectionsSlice = createSlice({ if (['sending', 'received'].includes(item.requestState)) return; item.requestState = 'queued'; item.cancelTokenUid = cancelTokenUid; + // Clear previous script error messages when a new request starts + item.preRequestScriptErrorMessage = null; + item.postResponseScriptErrorMessage = null; + item.testScriptErrorMessage = null; } if (type === 'request-sent') { From b441e1648e05604212657ee51112b939cd029f35 Mon Sep 17 00:00:00 2001 From: pooja-bruno Date: Mon, 30 Jun 2025 14:48:43 +0530 Subject: [PATCH 09/14] add: type in indicator --- .../src/components/CollectionSettings/index.js | 12 ++++++------ .../src/components/FolderSettings/index.js | 8 ++++---- .../bruno-app/src/components/Indicators/index.js | 12 +++++++----- .../RequestPane/HttpRequestPane/index.js | 16 ++++++++-------- 4 files changed, 25 insertions(+), 23 deletions(-) diff --git a/packages/bruno-app/src/components/CollectionSettings/index.js b/packages/bruno-app/src/components/CollectionSettings/index.js index 8c639256b..5eeed7e38 100644 --- a/packages/bruno-app/src/components/CollectionSettings/index.js +++ b/packages/bruno-app/src/components/CollectionSettings/index.js @@ -15,7 +15,7 @@ import Test from './Tests'; import Presets from './Presets'; import StyledWrapper from './StyledWrapper'; import Vars from './Vars/index'; -import { ContentIndicator } from 'components/Indicators'; +import Indicator from 'components/Indicators'; import Overview from './Overview/index'; const CollectionSettings = ({ collection }) => { @@ -147,26 +147,26 @@ const CollectionSettings = ({ collection }) => {
setTab('auth')}> Auth - {authMode !== 'none' && } + {authMode !== 'none' && }
setTab('script')}> Script - {hasScripts && } + {hasScripts && }
setTab('tests')}> Tests - {hasTests && } + {hasTests && }
setTab('presets')}> Presets
setTab('proxy')}> Proxy - {Object.keys(proxyConfig).length > 0 && } + {Object.keys(proxyConfig).length > 0 && }
setTab('clientCert')}> Client Certificates - {clientCertConfig.length > 0 && } + {clientCertConfig.length > 0 && }
{getTabPanel(tab)}
diff --git a/packages/bruno-app/src/components/FolderSettings/index.js b/packages/bruno-app/src/components/FolderSettings/index.js index 6aa1e4b57..79d4a9826 100644 --- a/packages/bruno-app/src/components/FolderSettings/index.js +++ b/packages/bruno-app/src/components/FolderSettings/index.js @@ -9,7 +9,7 @@ import StyledWrapper from './StyledWrapper'; import Vars from './Vars'; import Documentation from './Documentation'; import Auth from './Auth'; -import { ContentIndicator } from 'components/Indicators'; +import Indicator from 'components/Indicators'; import get from 'lodash/get'; const FolderSettings = ({ collection, folder }) => { @@ -83,11 +83,11 @@ const FolderSettings = ({ collection, folder }) => {
setTab('script')}> Script - {hasScripts && } + {hasScripts && }
setTab('test')}> Test - {hasTests && } + {hasTests && }
setTab('vars')}> Vars @@ -95,7 +95,7 @@ const FolderSettings = ({ collection, folder }) => {
setTab('auth')}> Auth - {hasAuth && } + {hasAuth && }
setTab('docs')}> Docs diff --git a/packages/bruno-app/src/components/Indicators/index.js b/packages/bruno-app/src/components/Indicators/index.js index 4acaeb946..3933cacb2 100644 --- a/packages/bruno-app/src/components/Indicators/index.js +++ b/packages/bruno-app/src/components/Indicators/index.js @@ -1,13 +1,15 @@ import React from 'react'; import DotIcon from 'components/Icons/Dot'; -const DotIndicator = ({ colorClass = '' }) => ( - +const Indicator = ({ type = 'default' }) => ( + ); -export const ContentIndicator = () => ; -export const ErrorIndicator = () => ; -export default ContentIndicator; \ No newline at end of file +export default Indicator; \ No newline at end of file diff --git a/packages/bruno-app/src/components/RequestPane/HttpRequestPane/index.js b/packages/bruno-app/src/components/RequestPane/HttpRequestPane/index.js index 8bfb6d5a3..63054f4ff 100644 --- a/packages/bruno-app/src/components/RequestPane/HttpRequestPane/index.js +++ b/packages/bruno-app/src/components/RequestPane/HttpRequestPane/index.js @@ -16,7 +16,7 @@ import { find, get } from 'lodash'; import Documentation from 'components/Documentation/index'; import HeightBoundContainer from 'ui/HeightBoundContainer'; import { useEffect } from 'react'; -import { ContentIndicator, ErrorIndicator } from 'components/Indicators'; +import Indicator from 'components/Indicators'; const HttpRequestPane = ({ item, collection }) => { const dispatch = useDispatch(); @@ -120,7 +120,7 @@ const HttpRequestPane = ({ item, collection }) => {
selectTab('body')}> Body - {body.mode !== 'none' && } + {body.mode !== 'none' && }
selectTab('headers')}> Headers @@ -128,7 +128,7 @@ const HttpRequestPane = ({ item, collection }) => {
selectTab('auth')}> Auth - {auth.mode !== 'none' && } + {auth.mode !== 'none' && }
selectTab('vars')}> Vars @@ -138,8 +138,8 @@ const HttpRequestPane = ({ item, collection }) => { Script {(script.req || script.res) && ( item.preRequestScriptErrorMessage || item.postResponseScriptErrorMessage ? - : - + : + )}
selectTab('assert')}> @@ -150,13 +150,13 @@ const HttpRequestPane = ({ item, collection }) => { Tests {tests && tests.length > 0 && ( item.testScriptErrorMessage ? - : - + : + )}
selectTab('docs')}> Docs - {docs && docs.length > 0 && } + {docs && docs.length > 0 && }
{focusedTab.requestPaneTab === 'body' ? (
From 054bf1cd1940d58b5779f0ff3748cd30116d5f45 Mon Sep 17 00:00:00 2001 From: pooja-bruno Date: Mon, 30 Jun 2025 15:28:31 +0530 Subject: [PATCH 10/14] fix: error console --- .../src/runner/run-single-request.js | 4 +- .../bruno-js/src/runtime/script-runtime.js | 123 +++++++++--------- packages/bruno-js/src/runtime/test-runtime.js | 1 - 3 files changed, 62 insertions(+), 66 deletions(-) diff --git a/packages/bruno-cli/src/runner/run-single-request.js b/packages/bruno-cli/src/runner/run-single-request.js index 8cd54206e..a7a0c3ca3 100644 --- a/packages/bruno-cli/src/runner/run-single-request.js +++ b/packages/bruno-cli/src/runner/run-single-request.js @@ -520,7 +520,7 @@ const runSingleRequest = async function ( postResponseTestResults = result?.results || []; logResults(postResponseTestResults, 'Post-Response Tests'); } catch (error) { - logResults(error); + console.error('Post-response script execution error:', error); } } @@ -569,7 +569,7 @@ const runSingleRequest = async function ( logResults(testResults, 'Tests'); } catch (error) { - logResults(error); + console.error('Test script execution error:', error); } } diff --git a/packages/bruno-js/src/runtime/script-runtime.js b/packages/bruno-js/src/runtime/script-runtime.js index 3d1b0ec30..a18c94917 100644 --- a/packages/bruno-js/src/runtime/script-runtime.js +++ b/packages/bruno-js/src/runtime/script-runtime.js @@ -260,65 +260,69 @@ class ScriptRuntime { context.bru.runRequest = runRequestByItemPathname; } - let scriptError = null; + if (this.runtime === 'quickjs') { + await executeQuickJsVmAsync({ + script: script, + context: context, + collectionPath + }); - try { - if (this.runtime === 'quickjs') { - await executeQuickJsVmAsync({ - script: script, - context: context, - collectionPath - }); - } else { - // default runtime is vm2 - const vm = new NodeVM({ - sandbox: context, - require: { - context: 'sandbox', - builtin: [ "*" ], - external: true, - root: [collectionPath, ...additionalContextRootsAbsolute], - mock: { - // node libs - path, - stream, - util, - url, - http, - https, - punycode, - zlib, - // 3rd party libs - ajv, - 'ajv-formats': addFormats, - atob, - btoa, - lodash, - moment, - uuid, - nanoid, - axios, - 'node-fetch': fetch, - 'crypto-js': CryptoJS, - 'xml2js': xml2js, - cheerio, - tv4, - ...whitelistedModules, - fs: allowScriptFilesystemAccess ? fs : undefined, - 'node-vault': NodeVault - } - } - }); - - const asyncVM = vm.run(`module.exports = async () => { ${script} }`, path.join(collectionPath, 'vm.js')); - await asyncVM(); - } - } catch (error) { - scriptError = error; - console.error('Post-response script execution error:', error); + return { + response, + envVariables: cleanJson(envVariables), + runtimeVariables: cleanJson(runtimeVariables), + globalEnvironmentVariables: cleanJson(globalEnvironmentVariables), + results: cleanJson(__brunoTestResults.getResults()), + nextRequestName: bru.nextRequest, + skipRequest: bru.skipRequest, + stopExecution: bru.stopExecution + }; } - const result = { + // default runtime is vm2 + const vm = new NodeVM({ + sandbox: context, + require: { + context: 'sandbox', + builtin: [ "*" ], + external: true, + root: [collectionPath, ...additionalContextRootsAbsolute], + mock: { + // node libs + path, + stream, + util, + url, + http, + https, + punycode, + zlib, + // 3rd party libs + ajv, + 'ajv-formats': addFormats, + atob, + btoa, + lodash, + moment, + uuid, + nanoid, + axios, + 'node-fetch': fetch, + 'crypto-js': CryptoJS, + 'xml2js': xml2js, + cheerio, + tv4, + ...whitelistedModules, + fs: allowScriptFilesystemAccess ? fs : undefined, + 'node-vault': NodeVault + } + } + }); + + const asyncVM = vm.run(`module.exports = async () => { ${script} }`, path.join(collectionPath, 'vm.js')); + await asyncVM(); + + return { response, envVariables: cleanJson(envVariables), runtimeVariables: cleanJson(runtimeVariables), @@ -328,13 +332,6 @@ class ScriptRuntime { skipRequest: bru.skipRequest, stopExecution: bru.stopExecution }; - - if (scriptError) { - scriptError.partialResults = result; - throw scriptError; - } - - return result; } } diff --git a/packages/bruno-js/src/runtime/test-runtime.js b/packages/bruno-js/src/runtime/test-runtime.js index 163ca9aad..2088a5cb7 100644 --- a/packages/bruno-js/src/runtime/test-runtime.js +++ b/packages/bruno-js/src/runtime/test-runtime.js @@ -177,7 +177,6 @@ class TestRuntime { } } catch (error) { scriptError = error; - console.error('Test script execution error:', error); } const result = { From b83657cbd96623b9b2250eb22ac9ee8f806d13c1 Mon Sep 17 00:00:00 2001 From: pooja-bruno Date: Mon, 30 Jun 2025 15:47:35 +0530 Subject: [PATCH 11/14] improve: runFolderEvent --- .../src/providers/ReduxStore/slices/collections/index.js | 6 ------ 1 file changed, 6 deletions(-) diff --git a/packages/bruno-app/src/providers/ReduxStore/slices/collections/index.js b/packages/bruno-app/src/providers/ReduxStore/slices/collections/index.js index 227c61709..1b96179bd 100644 --- a/packages/bruno-app/src/providers/ReduxStore/slices/collections/index.js +++ b/packages/bruno-app/src/providers/ReduxStore/slices/collections/index.js @@ -2186,8 +2186,6 @@ export const collectionsSlice = createSlice({ const item = collection.runnerResult.items.findLast((i) => i.uid === request.uid); if (action.payload.errorMessage) { item.postResponseScriptErrorMessage = action.payload.errorMessage; - } else { - item.postResponseScriptErrorMessage = null; } } @@ -2195,8 +2193,6 @@ export const collectionsSlice = createSlice({ const item = collection.runnerResult.items.findLast((i) => i.uid === request.uid); if (action.payload.errorMessage) { item.testScriptErrorMessage = action.payload.errorMessage; - } else { - item.testScriptErrorMessage = null; } } @@ -2204,8 +2200,6 @@ export const collectionsSlice = createSlice({ const item = collection.runnerResult.items.findLast((i) => i.uid === request.uid); if (action.payload.errorMessage) { item.preRequestScriptErrorMessage = action.payload.errorMessage; - } else { - item.preRequestScriptErrorMessage = null; } } } From b461de9aaf09d4f074a51aa2cfdeafe54566ae2e Mon Sep 17 00:00:00 2001 From: pooja-bruno Date: Mon, 30 Jun 2025 16:04:06 +0530 Subject: [PATCH 12/14] improve --- .../providers/ReduxStore/slices/collections/index.js | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/packages/bruno-app/src/providers/ReduxStore/slices/collections/index.js b/packages/bruno-app/src/providers/ReduxStore/slices/collections/index.js index 1b96179bd..696f054f4 100644 --- a/packages/bruno-app/src/providers/ReduxStore/slices/collections/index.js +++ b/packages/bruno-app/src/providers/ReduxStore/slices/collections/index.js @@ -2184,23 +2184,17 @@ export const collectionsSlice = createSlice({ if (type === 'post-response-script-execution') { const item = collection.runnerResult.items.findLast((i) => i.uid === request.uid); - if (action.payload.errorMessage) { - item.postResponseScriptErrorMessage = action.payload.errorMessage; - } + item.postResponseScriptErrorMessage = action.payload.errorMessage; } if (type === 'test-script-execution') { const item = collection.runnerResult.items.findLast((i) => i.uid === request.uid); - if (action.payload.errorMessage) { - item.testScriptErrorMessage = action.payload.errorMessage; - } + item.testScriptErrorMessage = action.payload.errorMessage; } if (type === 'pre-request-script-execution') { const item = collection.runnerResult.items.findLast((i) => i.uid === request.uid); - if (action.payload.errorMessage) { - item.preRequestScriptErrorMessage = action.payload.errorMessage; - } + item.preRequestScriptErrorMessage = action.payload.errorMessage; } } }, From 837a152a9631f29290e34f133fd61ef574557b98 Mon Sep 17 00:00:00 2001 From: pooja-bruno Date: Tue, 1 Jul 2025 15:49:37 +0530 Subject: [PATCH 13/14] change name of Indicator component --- .../src/components/CollectionSettings/index.js | 12 ++++++------ .../src/components/FolderSettings/index.js | 8 ++++---- .../RequestPane/HttpRequestPane/index.js | 16 ++++++++-------- .../{Indicators => StatusDot}/index.js | 4 ++-- 4 files changed, 20 insertions(+), 20 deletions(-) rename packages/bruno-app/src/components/{Indicators => StatusDot}/index.js (76%) diff --git a/packages/bruno-app/src/components/CollectionSettings/index.js b/packages/bruno-app/src/components/CollectionSettings/index.js index 5eeed7e38..415ff4bfa 100644 --- a/packages/bruno-app/src/components/CollectionSettings/index.js +++ b/packages/bruno-app/src/components/CollectionSettings/index.js @@ -15,7 +15,7 @@ import Test from './Tests'; import Presets from './Presets'; import StyledWrapper from './StyledWrapper'; import Vars from './Vars/index'; -import Indicator from 'components/Indicators'; +import StatusDot from 'components/StatusDot'; import Overview from './Overview/index'; const CollectionSettings = ({ collection }) => { @@ -147,26 +147,26 @@ const CollectionSettings = ({ collection }) => {
setTab('auth')}> Auth - {authMode !== 'none' && } + {authMode !== 'none' && }
setTab('script')}> Script - {hasScripts && } + {hasScripts && }
setTab('tests')}> Tests - {hasTests && } + {hasTests && }
setTab('presets')}> Presets
setTab('proxy')}> Proxy - {Object.keys(proxyConfig).length > 0 && } + {Object.keys(proxyConfig).length > 0 && }
setTab('clientCert')}> Client Certificates - {clientCertConfig.length > 0 && } + {clientCertConfig.length > 0 && }
{getTabPanel(tab)}
diff --git a/packages/bruno-app/src/components/FolderSettings/index.js b/packages/bruno-app/src/components/FolderSettings/index.js index 79d4a9826..063747807 100644 --- a/packages/bruno-app/src/components/FolderSettings/index.js +++ b/packages/bruno-app/src/components/FolderSettings/index.js @@ -9,7 +9,7 @@ import StyledWrapper from './StyledWrapper'; import Vars from './Vars'; import Documentation from './Documentation'; import Auth from './Auth'; -import Indicator from 'components/Indicators'; +import StatusDot from 'components/StatusDot'; import get from 'lodash/get'; const FolderSettings = ({ collection, folder }) => { @@ -83,11 +83,11 @@ const FolderSettings = ({ collection, folder }) => {
setTab('script')}> Script - {hasScripts && } + {hasScripts && }
setTab('test')}> Test - {hasTests && } + {hasTests && }
setTab('vars')}> Vars @@ -95,7 +95,7 @@ const FolderSettings = ({ collection, folder }) => {
setTab('auth')}> Auth - {hasAuth && } + {hasAuth && }
setTab('docs')}> Docs diff --git a/packages/bruno-app/src/components/RequestPane/HttpRequestPane/index.js b/packages/bruno-app/src/components/RequestPane/HttpRequestPane/index.js index 63054f4ff..6be64a43c 100644 --- a/packages/bruno-app/src/components/RequestPane/HttpRequestPane/index.js +++ b/packages/bruno-app/src/components/RequestPane/HttpRequestPane/index.js @@ -16,7 +16,7 @@ import { find, get } from 'lodash'; import Documentation from 'components/Documentation/index'; import HeightBoundContainer from 'ui/HeightBoundContainer'; import { useEffect } from 'react'; -import Indicator from 'components/Indicators'; +import StatusDot from 'components/StatusDot'; const HttpRequestPane = ({ item, collection }) => { const dispatch = useDispatch(); @@ -120,7 +120,7 @@ const HttpRequestPane = ({ item, collection }) => {
selectTab('body')}> Body - {body.mode !== 'none' && } + {body.mode !== 'none' && }
selectTab('headers')}> Headers @@ -128,7 +128,7 @@ const HttpRequestPane = ({ item, collection }) => {
selectTab('auth')}> Auth - {auth.mode !== 'none' && } + {auth.mode !== 'none' && }
selectTab('vars')}> Vars @@ -138,8 +138,8 @@ const HttpRequestPane = ({ item, collection }) => { Script {(script.req || script.res) && ( item.preRequestScriptErrorMessage || item.postResponseScriptErrorMessage ? - : - + : + )}
selectTab('assert')}> @@ -150,13 +150,13 @@ const HttpRequestPane = ({ item, collection }) => { Tests {tests && tests.length > 0 && ( item.testScriptErrorMessage ? - : - + : + )}
selectTab('docs')}> Docs - {docs && docs.length > 0 && } + {docs && docs.length > 0 && }
{focusedTab.requestPaneTab === 'body' ? (
diff --git a/packages/bruno-app/src/components/Indicators/index.js b/packages/bruno-app/src/components/StatusDot/index.js similarity index 76% rename from packages/bruno-app/src/components/Indicators/index.js rename to packages/bruno-app/src/components/StatusDot/index.js index 3933cacb2..d5c090efe 100644 --- a/packages/bruno-app/src/components/Indicators/index.js +++ b/packages/bruno-app/src/components/StatusDot/index.js @@ -1,7 +1,7 @@ import React from 'react'; import DotIcon from 'components/Icons/Dot'; -const Indicator = ({ type = 'default' }) => ( +const StatusDot = ({ type = 'default' }) => ( ( ); -export default Indicator; \ No newline at end of file +export default StatusDot; \ No newline at end of file From bf93e136b63b085e663d6535ddd845241573d624 Mon Sep 17 00:00:00 2001 From: pooja-bruno Date: Wed, 2 Jul 2025 13:22:27 +0530 Subject: [PATCH 14/14] mv: error msg null in initRunRequestEvent --- .../src/providers/ReduxStore/slices/collections/index.js | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/packages/bruno-app/src/providers/ReduxStore/slices/collections/index.js b/packages/bruno-app/src/providers/ReduxStore/slices/collections/index.js index 696f054f4..9e2a8a907 100644 --- a/packages/bruno-app/src/providers/ReduxStore/slices/collections/index.js +++ b/packages/bruno-app/src/providers/ReduxStore/slices/collections/index.js @@ -2033,6 +2033,9 @@ export const collectionsSlice = createSlice({ item.requestState = null; item.requestUid = requestUid; item.requestStartTime = Date.now(); + item.preRequestScriptErrorMessage = null; + item.postResponseScriptErrorMessage = null; + item.testScriptErrorMessage = null; }, runRequestEvent: (state, action) => { const { itemUid, collectionUid, type, requestUid } = action.payload; @@ -2062,10 +2065,6 @@ export const collectionsSlice = createSlice({ if (['sending', 'received'].includes(item.requestState)) return; item.requestState = 'queued'; item.cancelTokenUid = cancelTokenUid; - // Clear previous script error messages when a new request starts - item.preRequestScriptErrorMessage = null; - item.postResponseScriptErrorMessage = null; - item.testScriptErrorMessage = null; } if (type === 'request-sent') {