From a0903a584255868165ddb6c100b3305fba9c6629 Mon Sep 17 00:00:00 2001 From: Anoop M D Date: Wed, 1 Feb 2023 21:21:21 +0530 Subject: [PATCH] fix: fixed many bugs (too many to count :) ) --- .../components/CodeEditor/StyledWrapper.js | 10 +++++ .../src/components/CodeEditor/index.js | 1 + .../components/RunnerResults/StyledWrapper.js | 3 ++ .../src/components/RunnerResults/index.js | 27 +++++++----- .../VariablesTable/StyledWrapper.js | 6 +-- .../VariablesView/VariablesTable/index.js | 26 +++++++++++- .../src/components/VariablesView/index.js | 2 +- .../src/pageComponents/Index/index.js | 2 + .../providers/App/useCollectionTreeSync.js | 9 +++- .../ReduxStore/slices/collections/actions.js | 1 + .../ReduxStore/slices/collections/index.js | 9 +++- .../bruno-electron/src/app/collections.js | 4 +- .../bruno-electron/src/ipc/network/index.js | 30 ++++++++++--- .../src/ipc/network/interpolate-vars.js | 42 ++++++++----------- 14 files changed, 123 insertions(+), 49 deletions(-) diff --git a/packages/bruno-app/src/components/CodeEditor/StyledWrapper.js b/packages/bruno-app/src/components/CodeEditor/StyledWrapper.js index 6cb0188ee..26f7a3ddb 100644 --- a/packages/bruno-app/src/components/CodeEditor/StyledWrapper.js +++ b/packages/bruno-app/src/components/CodeEditor/StyledWrapper.js @@ -6,12 +6,22 @@ const StyledWrapper = styled.div` border: solid 1px ${(props) => props.theme.codemirror.border}; } + .CodeMirror-overlayscroll-horizontal div, .CodeMirror-overlayscroll-vertical div { + background: #d2d7db; + } + textarea.cm-editor { position: relative; } // Todo: dark mode temporary fix // Clean this + .CodeMirror.cm-s-monokai { + .CodeMirror-overlayscroll-horizontal div, .CodeMirror-overlayscroll-vertical div { + background: #444444; + } + } + .cm-s-monokai span.cm-property, .cm-s-monokai span.cm-attribute { color: #9cdcfe !important; } diff --git a/packages/bruno-app/src/components/CodeEditor/index.js b/packages/bruno-app/src/components/CodeEditor/index.js index d7f986a6b..fe9ad2cb0 100644 --- a/packages/bruno-app/src/components/CodeEditor/index.js +++ b/packages/bruno-app/src/components/CodeEditor/index.js @@ -43,6 +43,7 @@ export default class CodeEditor extends React.Component { foldGutter: true, gutters: ['CodeMirror-linenumbers', 'CodeMirror-foldgutter'], readOnly: this.props.readOnly, + scrollbarStyle: "overlay", theme: this.props.theme === 'dark' ? 'monokai' : 'default', extraKeys: { 'Cmd-Enter': () => { diff --git a/packages/bruno-app/src/components/RunnerResults/StyledWrapper.js b/packages/bruno-app/src/components/RunnerResults/StyledWrapper.js index f50209856..0178b90d7 100644 --- a/packages/bruno-app/src/components/RunnerResults/StyledWrapper.js +++ b/packages/bruno-app/src/components/RunnerResults/StyledWrapper.js @@ -6,6 +6,9 @@ const Wrapper = styled.div` color: ${(props) => props.theme.textLink}; } } + .danger { + color: ${(props) => props.theme.colors.text.danger}; + } .test-summary { color: ${(props) => props.theme.tabs.active.border}; diff --git a/packages/bruno-app/src/components/RunnerResults/index.js b/packages/bruno-app/src/components/RunnerResults/index.js index 8794390da..77eb179b8 100644 --- a/packages/bruno-app/src/components/RunnerResults/index.js +++ b/packages/bruno-app/src/components/RunnerResults/index.js @@ -32,17 +32,19 @@ export default function RunnerResults({collection}) { item.pathname = info.pathname; item.relativePath = getRelativePath(collection.pathname, info.pathname); - if(item.testResults) { - const failed = item.testResults.filter((result) => result.status === 'fail'); + if(item.status !== "error") { + if(item.testResults) { + const failed = item.testResults.filter((result) => result.status === 'fail'); - item.testStatus = failed.length ? 'fail' : 'pass'; - } else { - item.testStatus = 'pass'; + item.testStatus = failed.length ? 'fail' : 'pass'; + } else { + item.testStatus = 'pass'; + } } }); - const passedRequests = items.filter((item) => item.testStatus === 'pass'); - const failedRequests = items.filter((item) => item.testStatus === 'fail'); + const passedRequests = items.filter((item) => item.status !== "error" && item.testStatus === 'pass'); + const failedRequests = items.filter((item) => item.status !== "error" && item.testStatus === 'fail'); return ( @@ -61,14 +63,14 @@ export default function RunnerResults({collection}) {
- {item.testStatus === 'pass' ? ( + {item.status !== "error" && item.testStatus === 'pass' ? ( ) : ( )} - {item.relativePath} - {item.status !== "completed" ? ( + {item.relativePath} + {(item.status !== "error" && item.status !== "completed") ? ( ) : ( setSelectedItem(item)}> @@ -81,6 +83,11 @@ export default function RunnerResults({collection}) { )}
+ {item.status == "error" ? ( +
+ {item.error} +
+ ) : null }
    {item.testResults ? item.testResults.map((result) => ( diff --git a/packages/bruno-app/src/components/VariablesView/VariablesTable/StyledWrapper.js b/packages/bruno-app/src/components/VariablesView/VariablesTable/StyledWrapper.js index 3551b5652..b22e1c1e4 100644 --- a/packages/bruno-app/src/components/VariablesView/VariablesTable/StyledWrapper.js +++ b/packages/bruno-app/src/components/VariablesView/VariablesTable/StyledWrapper.js @@ -6,12 +6,12 @@ const StyledWrapper = styled.div` } .variable-name{ - width:100px; + min-width:180px; } .variable-value { - max-width: 500px; - inline-size: 500px; + max-width: 600px; + inline-size: 600px; overflow-wrap: break-word; } ` diff --git a/packages/bruno-app/src/components/VariablesView/VariablesTable/index.js b/packages/bruno-app/src/components/VariablesView/VariablesTable/index.js index 733be81b1..162ba9798 100644 --- a/packages/bruno-app/src/components/VariablesView/VariablesTable/index.js +++ b/packages/bruno-app/src/components/VariablesView/VariablesTable/index.js @@ -1,10 +1,24 @@ import React from 'react'; +import forOwn from 'lodash/forOwn'; +import cloneDeep from 'lodash/cloneDeep'; +import { uuid } from 'utils/common'; import StyledWrapper from './StyledWrapper'; -const VariablesTable = ({ variables }) => { +const VariablesTable = ({ variables, collectionVariables }) => { + const collectionVars = []; + + forOwn(cloneDeep(collectionVariables), (value, key) => { + collectionVars.push({ + uid: uuid(), + name: key, + value: value + }); + }); + return (
    +
    Environment Variables
    {(variables && variables.length) ? variables.map((variable) => { return (
    @@ -13,6 +27,16 @@ const VariablesTable = ({ variables }) => {
    ); }) : null} + +
    Collection Variables
    + {(collectionVars && collectionVars.length) ? collectionVars.map((variable) => { + return ( +
    +
    {variable.name}
    +
    {variable.value}
    +
    + ); + }) : null}
    ); diff --git a/packages/bruno-app/src/components/VariablesView/index.js b/packages/bruno-app/src/components/VariablesView/index.js index b2331edf7..d32c71f4b 100644 --- a/packages/bruno-app/src/components/VariablesView/index.js +++ b/packages/bruno-app/src/components/VariablesView/index.js @@ -34,7 +34,7 @@ const VariablesView = ({collection}) => { handleClose={() => setPopOverOpen(false)} >
    - {(enabledVariables && enabledVariables.length) ? : 'No variables found'} + {(enabledVariables && enabledVariables.length) ? : 'No variables found'}
    )} diff --git a/packages/bruno-app/src/pageComponents/Index/index.js b/packages/bruno-app/src/pageComponents/Index/index.js index 73d281c6c..f2620052d 100644 --- a/packages/bruno-app/src/pageComponents/Index/index.js +++ b/packages/bruno-app/src/pageComponents/Index/index.js @@ -8,11 +8,13 @@ import { useSelector } from 'react-redux'; import StyledWrapper from './StyledWrapper'; import 'codemirror/theme/material.css'; import 'codemirror/theme/monokai.css'; +import 'codemirror/addon/scroll/simplescrollbars.css'; const SERVER_RENDERED = typeof navigator === 'undefined' || global['PREVENT_CODEMIRROR_RENDER'] === true; if (!SERVER_RENDERED) { require('codemirror/mode/javascript/javascript'); require('codemirror/mode/xml/xml'); + require('codemirror/addon/scroll/simplescrollbars'); require('codemirror/addon/edit/matchbrackets'); require('codemirror/addon/fold/brace-fold'); require('codemirror/addon/fold/foldgutter'); diff --git a/packages/bruno-app/src/providers/App/useCollectionTreeSync.js b/packages/bruno-app/src/providers/App/useCollectionTreeSync.js index a3e312be7..ae394a9eb 100644 --- a/packages/bruno-app/src/providers/App/useCollectionTreeSync.js +++ b/packages/bruno-app/src/providers/App/useCollectionTreeSync.js @@ -82,8 +82,13 @@ const useCollectionTreeSync = () => { toast.success('Collection is already opened'); }; - const _displayError = (message) => { - toast.error(message || 'Something went wrong!'); + const _displayError = (error) => { + if(typeof error === "string") { + return toast.error(error || 'Something went wrong!'); + } + if(typeof message === "object") { + return toast.error(error.message || 'Something went wrong!'); + } }; const _httpRequestSent = (val) => { diff --git a/packages/bruno-app/src/providers/ReduxStore/slices/collections/actions.js b/packages/bruno-app/src/providers/ReduxStore/slices/collections/actions.js index 3e589fba5..b39e985ec 100644 --- a/packages/bruno-app/src/providers/ReduxStore/slices/collections/actions.js +++ b/packages/bruno-app/src/providers/ReduxStore/slices/collections/actions.js @@ -1,6 +1,7 @@ import path from 'path'; import toast from 'react-hot-toast'; import trim from 'lodash/trim'; +import get from 'lodash/get'; import filter from 'lodash/filter'; import { uuid } from 'utils/common'; import cloneDeep from 'lodash/cloneDeep'; 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 55542ac95..300059310 100644 --- a/packages/bruno-app/src/providers/ReduxStore/slices/collections/index.js +++ b/packages/bruno-app/src/providers/ReduxStore/slices/collections/index.js @@ -888,7 +888,7 @@ export const collectionsSlice = createSlice({ } }, runFolderEvent: (state, action) => { - const { collectionUid, folderUid, itemUid, type } = action.payload; + const { collectionUid, folderUid, itemUid, type, error } = action.payload; const collection = findCollectionByUid(state.collections, collectionUid); if (collection) { @@ -920,6 +920,13 @@ export const collectionsSlice = createSlice({ const item = collection.runnerResult.items.find((i) => i.uid === request.uid); item.testResults = action.payload.testResults; } + + if(type === 'error') { + const item = collection.runnerResult.items.find((i) => i.uid === request.uid); + item.error = action.payload.error; + item.responseReceived = action.payload.responseReceived; + item.status = "error"; + } } } } diff --git a/packages/bruno-electron/src/app/collections.js b/packages/bruno-electron/src/app/collections.js index 870b1f5e7..66c40ff2e 100644 --- a/packages/bruno-electron/src/app/collections.js +++ b/packages/bruno-electron/src/app/collections.js @@ -74,7 +74,9 @@ const openCollection = async (win, watcher, collectionPath, options = {}) => { ipcMain.emit('main:collection-opened', win, collectionPath, uid); } catch(err) { if(!options.dontSendDisplayErrors) { - win.webContents.send('main:display-error', err.message || 'An error occured while opening the local collection'); + win.webContents.send('main:display-error', { + error: err.message || 'An error occured while opening the local collection' + }); } } } else { diff --git a/packages/bruno-electron/src/ipc/network/index.js b/packages/bruno-electron/src/ipc/network/index.js index 35cfd2068..f816e72f0 100644 --- a/packages/bruno-electron/src/ipc/network/index.js +++ b/packages/bruno-electron/src/ipc/network/index.js @@ -257,6 +257,9 @@ const registerNetworkIpc = (mainWindow, watcher, lastOpenedCollections) => { itemUid }; + let timeStart; + let timeEnd; + try { mainWindow.webContents.send('main:run-folder-event', { type: 'request-queued', @@ -305,9 +308,9 @@ const registerNetworkIpc = (mainWindow, watcher, lastOpenedCollections) => { ...eventData }); - const timeStart = Date.now(); + timeStart = Date.now(); const response = await axios(request); - const timeEnd = Date.now(); + timeEnd = Date.now(); if(request.script && request.script.length) { let script = request.script + '\n if (typeof onResponse === "function") {onResponse(__brunoResponse);}'; @@ -346,9 +349,27 @@ const registerNetworkIpc = (mainWindow, watcher, lastOpenedCollections) => { } }); } catch (error) { + let responseReceived = {}; + let duration = 0; + + if(timeStart && timeEnd) { + duration = timeEnd - timeStart; + } + + if(error && error.response) { + responseReceived = { + status: error.response.status, + statusText: error.response.statusText, + headers: Object.entries(error.response.headers), + duration: duration, + size: error.response.headers['content-length'] || getSize(error.response.data), + data: error.response.data, + } + } mainWindow.webContents.send('main:run-folder-event', { type: 'error', - error, + error: error ? error.message : 'An error occurred while running the request', + responseReceived: responseReceived, ...eventData }); } @@ -356,8 +377,7 @@ const registerNetworkIpc = (mainWindow, watcher, lastOpenedCollections) => { } catch (error) { mainWindow.webContents.send('main:run-folder-event', { type: 'error', - error, - ...eventData + error }); } }); diff --git a/packages/bruno-electron/src/ipc/network/interpolate-vars.js b/packages/bruno-electron/src/ipc/network/interpolate-vars.js index f6f496a47..cc3753abe 100644 --- a/packages/bruno-electron/src/ipc/network/interpolate-vars.js +++ b/packages/bruno-electron/src/ipc/network/interpolate-vars.js @@ -27,35 +27,27 @@ const interpolateVars = (request, envVars = {}, collectionVariables ={}) => { request.headers[key] = interpolate(value); }); + if(request.headers["content-type"] === "application/json") { + if(typeof request.data === "object") { + try { + let parsed = JSON.stringify(request.data); + parsed = interpolate(parsed); + request.data = JSON.parse(parsed); + } catch (err) { + } + } + + if(typeof request.data === "string") { + if(request.data.length) { + request.data = interpolate(request.data); + } + } + } + each(request.params, (param) => { param.value = interpolate(param.value); }); - // Todo: Make interpolation work with body mode json - const mode = get(request, 'body.mode'); - switch (mode) { - case 'text': { - request.body.text = interpolate(request.body.text); - break; - } - case 'xml': { - request.body.text = interpolate(request.body.text); - break; - } - case 'multipartForm': { - each(request.body.multipartForm, (param) => { - param.value = interpolate(param.value); - }); - break; - } - case 'formUrlEncoded': { - each(request.body.formUrlEncoded, (param) => { - param.value = interpolate(param.value); - }); - break; - } - } - return request; };