From 7267ba64851ef2714e1b1c72b0a5d5de3218a431 Mon Sep 17 00:00:00 2001 From: Its-treason <39559178+Its-treason@users.noreply.github.com> Date: Sun, 22 Oct 2023 21:54:17 +0200 Subject: [PATCH 1/9] feat(#682): Enforce environment variable strictness --- .../EnvironmentVariables/StyledWrapper.js | 6 +- .../EnvironmentVariables/index.js | 210 +++++++++--------- .../EnvironmentVariables/reducer.js | 52 ----- 3 files changed, 113 insertions(+), 155 deletions(-) delete mode 100644 packages/bruno-app/src/components/Environments/EnvironmentSettings/EnvironmentList/EnvironmentDetails/EnvironmentVariables/reducer.js diff --git a/packages/bruno-app/src/components/Environments/EnvironmentSettings/EnvironmentList/EnvironmentDetails/EnvironmentVariables/StyledWrapper.js b/packages/bruno-app/src/components/Environments/EnvironmentSettings/EnvironmentList/EnvironmentDetails/EnvironmentVariables/StyledWrapper.js index 64b11b25c..7eec1394c 100644 --- a/packages/bruno-app/src/components/Environments/EnvironmentSettings/EnvironmentList/EnvironmentDetails/EnvironmentVariables/StyledWrapper.js +++ b/packages/bruno-app/src/components/Environments/EnvironmentSettings/EnvironmentList/EnvironmentDetails/EnvironmentVariables/StyledWrapper.js @@ -13,10 +13,12 @@ const Wrapper = styled.div` padding: 4px 10px; &:nth-child(1), - &:nth-child(4), - &:nth-child(5) { + &:nth-child(4) { width: 70px; } + &:nth-child(5) { + width: 40px; + } &:nth-child(2) { width: 25%; diff --git a/packages/bruno-app/src/components/Environments/EnvironmentSettings/EnvironmentList/EnvironmentDetails/EnvironmentVariables/index.js b/packages/bruno-app/src/components/Environments/EnvironmentSettings/EnvironmentList/EnvironmentDetails/EnvironmentVariables/index.js index 748626768..6ac7f8e4c 100644 --- a/packages/bruno-app/src/components/Environments/EnvironmentSettings/EnvironmentList/EnvironmentDetails/EnvironmentVariables/index.js +++ b/packages/bruno-app/src/components/Environments/EnvironmentSettings/EnvironmentList/EnvironmentDetails/EnvironmentVariables/index.js @@ -1,68 +1,79 @@ -import React, { useReducer } from 'react'; +import React from 'react'; import toast from 'react-hot-toast'; import cloneDeep from 'lodash/cloneDeep'; import { IconTrash } from '@tabler/icons'; import { useTheme } from 'providers/Theme'; import { useDispatch } from 'react-redux'; import { saveEnvironment } from 'providers/ReduxStore/slices/collections/actions'; -import reducer from './reducer'; import SingleLineEditor from 'components/SingleLineEditor'; import StyledWrapper from './StyledWrapper'; +import { useFormik } from 'formik'; +import * as Yup from 'yup'; +import { uuid } from 'utils/common'; const EnvironmentVariables = ({ environment, collection }) => { const dispatch = useDispatch(); const { storedTheme } = useTheme(); - const [state, reducerDispatch] = useReducer(reducer, { hasChanges: false, variables: environment.variables || [] }); - const { variables, hasChanges } = state; - const saveChanges = () => { - dispatch(saveEnvironment(cloneDeep(variables), environment.uid, collection.uid)) - .then(() => { - toast.success('Changes saved successfully'); - reducerDispatch({ - type: 'CHANGES_SAVED' - }); + const formik = useFormik({ + enableReinitialize: true, + initialValues: environment.variables || [], + validationSchema: Yup.array().of( + Yup.object({ + enabled: Yup.boolean(), + name: Yup.string() + .required('Name cannot be empty') + .matches(/^[^\d]\w*$/, 'Name contains invalid characters') + .trim(), + secret: Yup.boolean(), + type: Yup.string(), + uid: Yup.string(), + value: Yup.string().trim() }) - .catch(() => toast.error('An error occurred while saving the changes')); + ), + onSubmit: (values) => { + if (!formik.dirty) { + toast.error('Nothing to save'); + return; + } + + dispatch(saveEnvironment(cloneDeep(values), environment.uid, collection.uid)) + .then(() => { + toast.success('Changes saved successfully'); + formik.resetForm({ values }); + }) + .catch(() => toast.error('An error occurred while saving the changes')); + } + }); + + const ErrorMessage = ({ name }) => { + const meta = formik.getFieldMeta(name); + console.log(name, meta); + if (!meta.error) { + return null; + } + + return ( + + ); }; const addVariable = () => { - reducerDispatch({ - type: 'ADD_VAR' - }); + const newVariable = { + uid: uuid(), + name: '', + value: '', + type: 'text', + secret: false, + enabled: true + }; + formik.setFieldValue(formik.values.length, newVariable, false); }; - const handleVarChange = (e, _variable, type) => { - const variable = cloneDeep(_variable); - switch (type) { - case 'name': { - variable.name = e.target.value; - break; - } - case 'value': { - variable.value = e.target.value; - break; - } - case 'enabled': { - variable.enabled = e.target.checked; - break; - } - case 'secret': { - variable.secret = e.target.checked; - break; - } - } - reducerDispatch({ - type: 'UPDATE_VAR', - variable - }); - }; - - const handleRemoveVars = (variable) => { - reducerDispatch({ - type: 'DELETE_VAR', - variable - }); + const handleRemoveVar = (id) => { + formik.setValues(formik.values.filter((variable) => variable.uid !== id)); }; return ( @@ -78,55 +89,57 @@ const EnvironmentVariables = ({ environment, collection }) => { - {variables && variables.length - ? variables.map((variable, index) => { - return ( - - - handleVarChange(e, variable, 'enabled')} - /> - - - handleVarChange(e, variable, 'name')} - /> - - - handleVarChange({ target: { value: newValue } }, variable, 'value')} - collection={collection} - /> - - - handleVarChange(e, variable, 'secret')} - /> - - - - - - ); - }) - : null} + {formik.values.map((variable, index) => ( + + + + + + + + + + formik.setFieldValue(`${index}.value`, newValue, true)} + /> + + + + + + + + + ))} @@ -137,12 +150,7 @@ const EnvironmentVariables = ({ environment, collection }) => {
-
diff --git a/packages/bruno-app/src/components/Environments/EnvironmentSettings/EnvironmentList/EnvironmentDetails/EnvironmentVariables/reducer.js b/packages/bruno-app/src/components/Environments/EnvironmentSettings/EnvironmentList/EnvironmentDetails/EnvironmentVariables/reducer.js deleted file mode 100644 index a5aa3e0c1..000000000 --- a/packages/bruno-app/src/components/Environments/EnvironmentSettings/EnvironmentList/EnvironmentDetails/EnvironmentVariables/reducer.js +++ /dev/null @@ -1,52 +0,0 @@ -import produce from 'immer'; -import find from 'lodash/find'; -import filter from 'lodash/filter'; -import { uuid } from 'utils/common'; - -const reducer = (state, action) => { - switch (action.type) { - case 'ADD_VAR': { - return produce(state, (draft) => { - draft.variables.push({ - uid: uuid(), - name: '', - value: '', - type: 'text', - secret: false, - enabled: true - }); - draft.hasChanges = true; - }); - } - - case 'UPDATE_VAR': { - return produce(state, (draft) => { - const variable = find(draft.variables, (v) => v.uid === action.variable.uid); - variable.name = action.variable.name; - variable.value = action.variable.value; - variable.enabled = action.variable.enabled; - variable.secret = action.variable.secret; - draft.hasChanges = true; - }); - } - - case 'DELETE_VAR': { - return produce(state, (draft) => { - draft.variables = filter(draft.variables, (v) => v.uid !== action.variable.uid); - draft.hasChanges = true; - }); - } - - case 'CHANGES_SAVED': { - return produce(state, (draft) => { - draft.hasChanges = false; - }); - } - - default: { - return state; - } - } -}; - -export default reducer; From 45126c99ab7861cf0d8c2b50193fb6190d99a677 Mon Sep 17 00:00:00 2001 From: Max Heidinger Date: Fri, 20 Oct 2023 14:37:15 +0200 Subject: [PATCH 2/9] feat: add loading local graphql schema file --- .../RequestPane/GraphQLRequestPane/index.js | 37 ++------ .../GraphQLRequestPane/useGraphqlSchema.js | 60 ------------- .../RequestPane/GraphQLSchemaActions/index.js | 70 +++++++++++++++ .../GraphQLSchemaActions/useGraphqlSchema.js | 89 +++++++++++++++++++ packages/bruno-electron/src/ipc/collection.js | 18 +++- 5 files changed, 181 insertions(+), 93 deletions(-) delete mode 100644 packages/bruno-app/src/components/RequestPane/GraphQLRequestPane/useGraphqlSchema.js create mode 100644 packages/bruno-app/src/components/RequestPane/GraphQLSchemaActions/index.js create mode 100644 packages/bruno-app/src/components/RequestPane/GraphQLSchemaActions/useGraphqlSchema.js diff --git a/packages/bruno-app/src/components/RequestPane/GraphQLRequestPane/index.js b/packages/bruno-app/src/components/RequestPane/GraphQLRequestPane/index.js index 98845b55b..288e66a84 100644 --- a/packages/bruno-app/src/components/RequestPane/GraphQLRequestPane/index.js +++ b/packages/bruno-app/src/components/RequestPane/GraphQLRequestPane/index.js @@ -1,8 +1,7 @@ -import React, { useEffect } from 'react'; +import React, { useEffect, useState } from 'react'; import find from 'lodash/find'; import get from 'lodash/get'; import classnames from 'classnames'; -import { IconRefresh, IconLoader2, IconBook, IconDownload } from '@tabler/icons'; import { useSelector, useDispatch } from 'react-redux'; import { updateRequestPaneTab } from 'providers/ReduxStore/slices/tabs'; import QueryEditor from 'components/RequestPane/QueryEditor'; @@ -16,10 +15,9 @@ import Tests from 'components/RequestPane/Tests'; import { useTheme } from 'providers/Theme'; import { updateRequestGraphqlQuery } from 'providers/ReduxStore/slices/collections'; import { sendRequest, saveRequest } from 'providers/ReduxStore/slices/collections/actions'; -import { findEnvironmentInCollection } from 'utils/collections'; -import useGraphqlSchema from './useGraphqlSchema'; import StyledWrapper from './StyledWrapper'; import Documentation from 'components/Documentation/index'; +import GraphQLSchemaActions from '../GraphQLSchemaActions/index'; const GraphQLRequestPane = ({ item, collection, leftPaneWidth, onSchemaLoad, toggleDocs, handleGqlClickReference }) => { const dispatch = useDispatch(); @@ -29,25 +27,11 @@ const GraphQLRequestPane = ({ item, collection, leftPaneWidth, onSchemaLoad, tog const variables = item.draft ? get(item, 'draft.request.body.graphql.variables') : get(item, 'request.body.graphql.variables'); - const url = item.draft ? get(item, 'draft.request.url') : get(item, 'request.url'); const { storedTheme } = useTheme(); - - const environment = findEnvironmentInCollection(collection, collection.activeEnvironmentUid); - - const request = item.draft ? item.draft.request : item.request; - - let { schema, loadSchema, isLoading: isSchemaLoading } = useGraphqlSchema(url, environment, request, collection); - - const loadGqlSchema = () => { - if (!isSchemaLoading) { - loadSchema(); - } - }; + const [schema, setSchema] = useState(null); useEffect(() => { - if (onSchemaLoad) { - onSchemaLoad(schema); - } + onSchemaLoad(schema); }, [schema]); const onQueryChange = (value) => { @@ -163,18 +147,7 @@ const GraphQLRequestPane = ({ item, collection, leftPaneWidth, onSchemaLoad, tog
selectTab('docs')}> Docs
-
-
- {isSchemaLoading ? : null} - {!isSchemaLoading && !schema ? : null} - {!isSchemaLoading && schema ? : null} - Schema -
-
- - Docs -
-
+
{getTabPanel(focusedTab.requestPaneTab)}
diff --git a/packages/bruno-app/src/components/RequestPane/GraphQLRequestPane/useGraphqlSchema.js b/packages/bruno-app/src/components/RequestPane/GraphQLRequestPane/useGraphqlSchema.js deleted file mode 100644 index c824c5751..000000000 --- a/packages/bruno-app/src/components/RequestPane/GraphQLRequestPane/useGraphqlSchema.js +++ /dev/null @@ -1,60 +0,0 @@ -import { useState } from 'react'; -import toast from 'react-hot-toast'; -import { buildClientSchema } from 'graphql'; -import { fetchGqlSchema } from 'utils/network'; -import { simpleHash } from 'utils/common'; - -const schemaHashPrefix = 'bruno.graphqlSchema'; - -const useGraphqlSchema = (endpoint, environment, request, collection) => { - const localStorageKey = `${schemaHashPrefix}.${simpleHash(endpoint)}`; - const [error, setError] = useState(null); - const [isLoading, setIsLoading] = useState(false); - const [schema, setSchema] = useState(() => { - try { - const saved = localStorage.getItem(localStorageKey); - if (!saved) { - return null; - } - return buildClientSchema(JSON.parse(saved)); - } catch { - localStorage.setItem(localStorageKey, null); - return null; - } - }); - - const loadSchema = () => { - setIsLoading(true); - fetchGqlSchema(endpoint, environment, request, collection) - .then((res) => { - if (!res || res.status !== 200) { - return Promise.reject(new Error(res.statusText)); - } - return res.data; - }) - .then((s) => { - if (s && s.data) { - setSchema(buildClientSchema(s.data)); - setIsLoading(false); - localStorage.setItem(localStorageKey, JSON.stringify(s.data)); - toast.success('GraphQL Schema loaded successfully'); - } else { - return Promise.reject(new Error('An error occurred while introspecting schema')); - } - }) - .catch((err) => { - setIsLoading(false); - setError(err); - toast.error(`Error occurred while loading GraphQL Schema: ${err.message}`); - }); - }; - - return { - isLoading, - schema, - loadSchema, - error - }; -}; - -export default useGraphqlSchema; diff --git a/packages/bruno-app/src/components/RequestPane/GraphQLSchemaActions/index.js b/packages/bruno-app/src/components/RequestPane/GraphQLSchemaActions/index.js new file mode 100644 index 000000000..954efebf7 --- /dev/null +++ b/packages/bruno-app/src/components/RequestPane/GraphQLSchemaActions/index.js @@ -0,0 +1,70 @@ +import React, { useEffect, useRef, forwardRef } from 'react'; +import useGraphqlSchema from './useGraphqlSchema'; +import { IconBook, IconDownload, IconLoader2, IconCheckmark } from '@tabler/icons'; +import get from 'lodash/get'; +import { findEnvironmentInCollection } from 'utils/collections'; +import Dropdown from '../../Dropdown'; + +const GraphQLSchemaActions = ({ item, collection, onSchemaLoad, toggleDocs }) => { + const url = item.draft ? get(item, 'draft.request.url') : get(item, 'request.url'); + const environment = findEnvironmentInCollection(collection, collection.activeEnvironmentUid); + const request = item.draft ? item.draft.request : item.request; + + let { + schema, + schemaSource, + loadSchema, + isLoading: isSchemaLoading + } = useGraphqlSchema(url, environment, request, collection); + + useEffect(() => { + if (onSchemaLoad) { + onSchemaLoad(schema); + } + }, [schema]); + + const schemaDropdownTippyRef = useRef(); + const onSchemaDropdownCreate = (ref) => (schemaDropdownTippyRef.current = ref); + + const MenuIcon = forwardRef((props, ref) => { + return ( +
+ {isSchemaLoading && } + {!isSchemaLoading && schema && } + {!isSchemaLoading && !schema && } + Schema +
+ ); + }); + + return ( +
+
+ + Docs +
+ } placement="bottom-start"> +
{ + schemaDropdownTippyRef.current.hide(); + loadSchema('introspection'); + }} + > + {schema && schemaSource === 'introspection' ? 'Refresh from Introspection' : 'Load from Introspection'} +
+
{ + schemaDropdownTippyRef.current.hide(); + loadSchema('file'); + }} + > + Load from File +
+
+
+ ); +}; + +export default GraphQLSchemaActions; diff --git a/packages/bruno-app/src/components/RequestPane/GraphQLSchemaActions/useGraphqlSchema.js b/packages/bruno-app/src/components/RequestPane/GraphQLSchemaActions/useGraphqlSchema.js new file mode 100644 index 000000000..0a5f2bd01 --- /dev/null +++ b/packages/bruno-app/src/components/RequestPane/GraphQLSchemaActions/useGraphqlSchema.js @@ -0,0 +1,89 @@ +import { useState } from 'react'; +import toast from 'react-hot-toast'; +import { buildClientSchema } from 'graphql'; +import { fetchGqlSchema } from 'utils/network'; +import { simpleHash } from 'utils/common'; + +const schemaHashPrefix = 'bruno.graphqlSchema'; + +const useGraphqlSchema = (endpoint, environment, request, collection) => { + const { ipcRenderer } = window; + const localStorageKey = `${schemaHashPrefix}.${simpleHash(endpoint)}`; + const [error, setError] = useState(null); + const [isLoading, setIsLoading] = useState(false); + const [schemaSource, setSchemaSource] = useState(''); + const [schema, setSchema] = useState(() => { + try { + const saved = localStorage.getItem(localStorageKey); + if (!saved) { + return null; + } + return buildClientSchema(JSON.parse(saved)); + } catch { + localStorage.setItem(localStorageKey, null); + return null; + } + }); + + const loadSchemaFromIntrospection = async () => { + const response = await fetchGqlSchema(endpoint, environment, request, collection); + if (!response) { + throw new Error('Introspection query failed'); + } + if (response.status !== 200) { + throw new Error(response.statusText); + } + const data = response.data?.data; + if (!data) { + throw new Error('No data returned from introspection query'); + } + setSchemaSource('introspection'); + return data; + }; + + const loadSchemaFromFile = async () => { + const schemaContent = await ipcRenderer.invoke('renderer:load-gql-schema-file'); + if (!schemaContent) { + setIsLoading(false); + return; + } + setSchemaSource('file'); + return schemaContent.data; + }; + + const loadSchema = async (schemaSource) => { + if (isLoading) { + return; + } + + setIsLoading(true); + + try { + let data; + if (schemaSource === 'file') { + data = await loadSchemaFromFile(); + } else { + // fallback to introspection if source is unknown + data = await loadSchemaFromIntrospection(); + } + setSchema(buildClientSchema(data)); + localStorage.setItem(localStorageKey, JSON.stringify(data)); + toast.success('GraphQL Schema loaded successfully'); + } catch (err) { + setError(err); + toast.error(`Error occurred while loading GraphQL Schema: ${err.message}`); + } + + setIsLoading(false); + }; + + return { + isLoading, + schema, + schemaSource, + loadSchema, + error + }; +}; + +export default useGraphqlSchema; diff --git a/packages/bruno-electron/src/ipc/collection.js b/packages/bruno-electron/src/ipc/collection.js index ab92d50bd..be6afbeab 100644 --- a/packages/bruno-electron/src/ipc/collection.js +++ b/packages/bruno-electron/src/ipc/collection.js @@ -1,7 +1,7 @@ const _ = require('lodash'); const fs = require('fs'); const path = require('path'); -const { ipcMain, shell } = require('electron'); +const { ipcMain, shell, dialog } = require('electron'); const { envJsonToBru, bruToJson, jsonToBru, jsonToCollectionBru } = require('../bru'); const { @@ -461,6 +461,22 @@ const registerRendererEventHandlers = (mainWindow, watcher, lastOpenedCollection ipcMain.handle('renderer:open-devtools', async () => { mainWindow.webContents.openDevTools(); }); + + ipcMain.handle('renderer:load-gql-schema-file', async () => { + try { + const { filePaths } = await dialog.showOpenDialog(mainWindow, { + properties: ['openFile'] + }); + if (filePaths.length === 0) { + return; + } + + const jsonData = fs.readFileSync(filePaths[0], 'utf8'); + return JSON.parse(jsonData); + } catch (err) { + return Promise.reject(new Error('Failed to load GraphQL schema file')); + } + }); }; const registerMainEventHandlers = (mainWindow, watcher, lastOpenedCollections) => { From 3c9e91334959b088dee3cc56829992bd945b0cdb Mon Sep 17 00:00:00 2001 From: areebniyas Date: Thu, 26 Oct 2023 00:48:05 +0530 Subject: [PATCH 3/9] merge development and contributing doc --- contributing.md | 54 ++++++++++++++++++ .../contributing/contributing_de.md | 54 ++++++++++++++++++ .../contributing/contributing_fr.md | 54 ++++++++++++++++++ .../contributing/contributing_ru.md | 54 ++++++++++++++++++ .../contributing/contributing_tr.md | 0 .../contributing/contributing_ua.md | 54 ++++++++++++++++++ docs/development.md | 55 ------------------- docs/development_de.md | 55 ------------------- docs/development_fr.md | 55 ------------------- docs/development_ru.md | 55 ------------------- docs/development_ua.md | 55 ------------------- readme_de.md => docs/readme/readme_de.md | 0 readme_fr.md => docs/readme/readme_fr.md | 0 readme_ru.md => docs/readme/readme_ru.md | 0 readme_tr.md => docs/readme/readme_tr.md | 0 readme_ua.md => docs/readme/readme_ua.md | 0 16 files changed, 270 insertions(+), 275 deletions(-) rename contributing_de.md => docs/contributing/contributing_de.md (54%) rename contributing_fr.md => docs/contributing/contributing_fr.md (56%) rename contributing_ru.md => docs/contributing/contributing_ru.md (55%) rename contributing_tr.md => docs/contributing/contributing_tr.md (100%) rename contributing_ua.md => docs/contributing/contributing_ua.md (55%) delete mode 100644 docs/development.md delete mode 100644 docs/development_de.md delete mode 100644 docs/development_fr.md delete mode 100644 docs/development_ru.md delete mode 100644 docs/development_ua.md rename readme_de.md => docs/readme/readme_de.md (100%) rename readme_fr.md => docs/readme/readme_fr.md (100%) rename readme_ru.md => docs/readme/readme_ru.md (100%) rename readme_tr.md => docs/readme/readme_tr.md (100%) rename readme_ua.md => docs/readme/readme_ua.md (100%) diff --git a/contributing.md b/contributing.md index e2a558cce..55fedf0f7 100644 --- a/contributing.md +++ b/contributing.md @@ -35,3 +35,57 @@ Please reference [development.md](docs/development.md) for instructions on runni - Example: feature/dark-mode - bugfix/[bug name]: This branch should contain only bug fixes for a specific bug - Example bugfix/bug-1 + +## Development + +Bruno is being developed as a desktop app. You need to load the app by running the Next.js app in one terminal and then run the electron app in another terminal. + +### Dependencies + +- NodeJS v18 + +### Local Development + +```bash +# use nodejs 18 version +nvm use + +# install deps +npm i --legacy-peer-deps + +# build graphql docs +npm run build:graphql-docs + +# build bruno query +npm run build:bruno-query + +# run next app (terminal 1) +npm run dev:web + +# run electron app (terminal 2) +npm run dev:electron +``` + +### Troubleshooting + +You might encounter a `Unsupported platform` error when you run `npm install`. To fix this, you will need to delete `node_modules` and `package-lock.json` and run `npm install`. This should install all the necessary packages needed to run the app. + +```shell +# Delete node_modules in sub-directories +find ./ -type d -name "node_modules" -print0 | while read -d $'\0' dir; do + rm -rf "$dir" +done + +# Delete package-lock in sub-directories +find . -type f -name "package-lock.json" -delete +``` + +### Testing + +```bash +# bruno-schema +npm test --workspace=packages/bruno-schema + +# bruno-lang +npm test --workspace=packages/bruno-lang +``` diff --git a/contributing_de.md b/docs/contributing/contributing_de.md similarity index 54% rename from contributing_de.md rename to docs/contributing/contributing_de.md index 26b1ffb6a..fca88c609 100644 --- a/contributing_de.md +++ b/docs/contributing/contributing_de.md @@ -35,3 +35,57 @@ Eine Anleitung zum Ausführen einer lokalen Entwicklungsumgebung findest Du in [ - Beispiel: feature/dark-mode - bugfix/[bug name]: Dieser Branch soll ausschließlich Bugfixes für einen bestimmten Bug enthalten - Beispiel: bugfix/bug-1 + +## Entwicklung + +Bruno wird als Desktop-Anwendung entwickelt. Um die App zu starten, musst Du zuerst die Next.js App in einem Terminal ausführen und anschließend in einem anderen Terminal die Electron-App. + +### Abhängigkeiten + +- NodeJS v18 + +### Lokales Entwickeln + +```bash +# use nodejs 18 version +nvm use + +# install deps +npm i --legacy-peer-deps + +# build graphql docs +npm run build:graphql-docs + +# build bruno query +npm run build:bruno-query + +# run next app (terminal 1) +npm run dev:web + +# run electron app (terminal 2) +npm run dev:electron +``` + +### Troubleshooting + +Es kann sein, dass Du einen `Unsupported platform`-Fehler bekommst, wenn Du `npm install` ausführst. Um dies zu beheben, musst Du `node_modules` und `package-lock.json` löschen und `npm install` erneut ausführen. Dies sollte alle notwendigen Pakete installieren, die zum Ausführen der Anwendung benötigt werden. + +```shell +# Delete node_modules in sub-directories +find ./ -type d -name "node_modules" -print0 | while read -d $'\0' dir; do + rm -rf "$dir" +done + +# Delete package-lock in sub-directories +find . -type f -name "package-lock.json" -delete +``` + +### Testen + +```bash +# bruno-schema +npm test --workspace=packages/bruno-schema + +# bruno-lang +npm test --workspace=packages/bruno-lang +``` diff --git a/contributing_fr.md b/docs/contributing/contributing_fr.md similarity index 56% rename from contributing_fr.md rename to docs/contributing/contributing_fr.md index d775083f1..f00a331c6 100644 --- a/contributing_fr.md +++ b/docs/contributing/contributing_fr.md @@ -35,3 +35,57 @@ Veuillez vous référez à la [documentation de développement](docs/development - Exemple: feature/dark-mode - bugfix/[bug name]: Cette branche devrait contenir seulement une solution pour pour une bogue spécifique - Exemple: bugfix/bug-1 + +## Développement + +Bruno est développé comme une application de _lourde_. Vous devez charger l'application en démarrant nextjs dans un terminal, puis démarre l'application Electron dans un autre terminal. + +### Dépendances + +- NodeJS v18 + +### Développement local + +```bash +# use nodejs 18 version +nvm use + +# install deps +npm i --legacy-peer-deps + +# build graphql docs +npm run build:graphql-docs + +# build bruno query +npm run build:bruno-query + +# run next app (terminal 1) +npm run dev:web + +# run electron app (terminal 2) +npm run dev:electron +``` + +### Dépannage + +Vous pourriez rencontrer une error `Unsupported platform` pendant le lancement de `npm install`. Pour résoudre cela, veuillez supprimer le répertoire `node_modules`, le fichier `package-lock.json` et lancer à nouveau `npm install`. Cela devrait isntaller tous les paquets nécessaires pour lancer l'application. + +```shell +# Delete node_modules in sub-directories +find ./ -type d -name "node_modules" -print0 | while read -d $'\0' dir; do + rm -rf "$dir" +done + +# Delete package-lock in sub-directories +find . -type f -name "package-lock.json" -delete +``` + +### Tests + +```bash +# bruno-schema +npm test --workspace=packages/bruno-schema + +# bruno-lang +npm test --workspace=packages/bruno-lang +``` diff --git a/contributing_ru.md b/docs/contributing/contributing_ru.md similarity index 55% rename from contributing_ru.md rename to docs/contributing/contributing_ru.md index 62fc5d03e..63e737f01 100644 --- a/contributing_ru.md +++ b/docs/contributing/contributing_ru.md @@ -35,3 +35,57 @@ Bruno построен с использованием Next.js и React. Мы т - Пример: feature/dark-mode - bugfix/[название ошибки]: Эта ветка должна содержать только исправления для конкретной ошибки - Пример bugfix/bug-1 + +## Разработка + +Bruno разрабатывается как десктопное приложение. Необходимо загрузить приложение, запустив приложение Next.js в одном терминале, а затем запустить приложение electron в другом терминале. + +### Зависимости + +- NodeJS v18 + +### Локальная разработка + +```bash +# используйте nodejs 18 версии +nvm use + +# установите зависимости +npm i --legacy-peer-deps + +# билд документации по graphql +npm run build:graphql-docs + +# билд bruno query +npm run build:bruno-query + +# запустить next приложение ( терминал 1 ) +npm run dev:web + +# запустить приложение electron ( терминал 2 ) +npm run dev:electron +``` + +### Устранение неисправностей + +При запуске `npm install` может возникнуть ошибка `Unsupported platform`. Чтобы исправить это, необходимо удалить `node_modules` и `package-lock.json` и запустить `npm install`. В результате будут установлены все пакеты, необходимые для работы приложения. + +```shell +# Удаление node_modules в подкаталогах +find ./ -type d -name "node_modules" -print0 | while read -d $'\0' dir; do + rm -rf "$dir" +done + +# Удаление package-lock в подкаталогах +find . -type f -name "package-lock.json" -delete +``` + +### Тестирование + +```bash +# bruno-schema +npm test --workspace=packages/bruno-schema + +# bruno-lang +npm test --workspace=packages/bruno-lang +``` diff --git a/contributing_tr.md b/docs/contributing/contributing_tr.md similarity index 100% rename from contributing_tr.md rename to docs/contributing/contributing_tr.md diff --git a/contributing_ua.md b/docs/contributing/contributing_ua.md similarity index 55% rename from contributing_ua.md rename to docs/contributing/contributing_ua.md index de7f3f4e9..8b563f3eb 100644 --- a/contributing_ua.md +++ b/docs/contributing/contributing_ua.md @@ -35,3 +35,57 @@ Bruno побудований на Next.js та React. Також для деск - Приклад: feature/dark-mode - bugfix/[назва баґу]: Така гілка має містити лише виправлення конкретного багу - Приклад: bugfix/bug-1 + +## Розробка + +Bruno розробляється як декстопний застосунок. Вам потрібно запустити Next.js в одній сесії терміналу, та запустити застосунок Electron в іншій сесії терміналу. + +### Залежності + +- NodeJS v18 + +### Локальна розробка + +```bash +# Використовуйте nodejs 18-ї версії +nvm use + +# встановіть залежності +npm i --legacy-peer-deps + +# зберіть документацію graphql +npm run build:graphql-docs + +# зберіть bruno query +npm run build:bruno-query + +# запустіть додаток next (термінал 1) +npm run dev:web + +# запустіть додаток електрон (термінал 2) +npm run dev:electron +``` + +### Усунення несправностей + +Ви можете зтикнутись із помилкою `Unsupported platform` коли запускаєте `npm install`. Щоб усунути цю проблему, вам потрібно видалити `node_modules` та `package-lock.json`, і тоді запустити `npm install`. Це має встановити всі потрібні для запуску додатку пекеджі. + +```shell +# Видаліть node_modules в піддиректоріях +find ./ -type d -name "node_modules" -print0 | while read -d $'\0' dir; do + rm -rf "$dir" +done + +# Видаліть package-lock в піддиректоріях +find . -type f -name "package-lock.json" -delete +``` + +### Тестування + +```bash +# bruno-schema +npm test --workspace=packages/bruno-schema + +# bruno-lang +npm test --workspace=packages/bruno-lang +``` diff --git a/docs/development.md b/docs/development.md deleted file mode 100644 index af4d5d4a9..000000000 --- a/docs/development.md +++ /dev/null @@ -1,55 +0,0 @@ -**English** | [Українська](/docs/development_ua.md) | [Русский](/docs/development_ru.md) | [Deutsch](/docs/development_de.md) | [Français](/docs/development_fr.md) - -## Development - -Bruno is being developed as a desktop app. You need to load the app by running the Next.js app in one terminal and then run the electron app in another terminal. - -### Dependencies - -- NodeJS v18 - -### Local Development - -```bash -# use nodejs 18 version -nvm use - -# install deps -npm i --legacy-peer-deps - -# build graphql docs -npm run build:graphql-docs - -# build bruno query -npm run build:bruno-query - -# run next app (terminal 1) -npm run dev:web - -# run electron app (terminal 2) -npm run dev:electron -``` - -### Troubleshooting - -You might encounter a `Unsupported platform` error when you run `npm install`. To fix this, you will need to delete `node_modules` and `package-lock.json` and run `npm install`. This should install all the necessary packages needed to run the app. - -```shell -# Delete node_modules in sub-directories -find ./ -type d -name "node_modules" -print0 | while read -d $'\0' dir; do - rm -rf "$dir" -done - -# Delete package-lock in sub-directories -find . -type f -name "package-lock.json" -delete -``` - -### Testing - -```bash -# bruno-schema -npm test --workspace=packages/bruno-schema - -# bruno-lang -npm test --workspace=packages/bruno-lang -``` diff --git a/docs/development_de.md b/docs/development_de.md deleted file mode 100644 index 0a30383aa..000000000 --- a/docs/development_de.md +++ /dev/null @@ -1,55 +0,0 @@ -[English](/docs/development.md) | [Українська](/docs/development_ua.md) | [Русский](/docs/development_ru.md) | **Deutsch** | [Français](/docs/development_fr.md) - -## Entwicklung - -Bruno wird als Desktop-Anwendung entwickelt. Um die App zu starten, musst Du zuerst die Next.js App in einem Terminal ausführen und anschließend in einem anderen Terminal die Electron-App. - -### Abhängigkeiten - -- NodeJS v18 - -### Lokales Entwickeln - -```bash -# use nodejs 18 version -nvm use - -# install deps -npm i --legacy-peer-deps - -# build graphql docs -npm run build:graphql-docs - -# build bruno query -npm run build:bruno-query - -# run next app (terminal 1) -npm run dev:web - -# run electron app (terminal 2) -npm run dev:electron -``` - -### Troubleshooting - -Es kann sein, dass Du einen `Unsupported platform`-Fehler bekommst, wenn Du `npm install` ausführst. Um dies zu beheben, musst Du `node_modules` und `package-lock.json` löschen und `npm install` erneut ausführen. Dies sollte alle notwendigen Pakete installieren, die zum Ausführen der Anwendung benötigt werden. - -```shell -# Delete node_modules in sub-directories -find ./ -type d -name "node_modules" -print0 | while read -d $'\0' dir; do - rm -rf "$dir" -done - -# Delete package-lock in sub-directories -find . -type f -name "package-lock.json" -delete -``` - -### Testen - -```bash -# bruno-schema -npm test --workspace=packages/bruno-schema - -# bruno-lang -npm test --workspace=packages/bruno-lang -``` diff --git a/docs/development_fr.md b/docs/development_fr.md deleted file mode 100644 index 4a5e69446..000000000 --- a/docs/development_fr.md +++ /dev/null @@ -1,55 +0,0 @@ -[English](/docs/development.md) | [Українська](/docs/development_ua.md) | [Русский](/docs/development_ru.md) | [Deutsch](/docs/development_de.md) | **Français** - -## Développement - -Bruno est développé comme une application de _lourde_. Vous devez charger l'application en démarrant nextjs dans un terminal, puis démarre l'application Electron dans un autre terminal. - -### Dépendances - -- NodeJS v18 - -### Développement local - -```bash -# use nodejs 18 version -nvm use - -# install deps -npm i --legacy-peer-deps - -# build graphql docs -npm run build:graphql-docs - -# build bruno query -npm run build:bruno-query - -# run next app (terminal 1) -npm run dev:web - -# run electron app (terminal 2) -npm run dev:electron -``` - -### Dépannage - -Vous pourriez rencontrer une error `Unsupported platform` pendant le lancement de `npm install`. Pour résoudre cela, veuillez supprimer le répertoire `node_modules`, le fichier `package-lock.json` et lancer à nouveau `npm install`. Cela devrait isntaller tous les paquets nécessaires pour lancer l'application. - -```shell -# Delete node_modules in sub-directories -find ./ -type d -name "node_modules" -print0 | while read -d $'\0' dir; do - rm -rf "$dir" -done - -# Delete package-lock in sub-directories -find . -type f -name "package-lock.json" -delete -``` - -### Tests - -```bash -# bruno-schema -npm test --workspace=packages/bruno-schema - -# bruno-lang -npm test --workspace=packages/bruno-lang -``` diff --git a/docs/development_ru.md b/docs/development_ru.md deleted file mode 100644 index be1aa8875..000000000 --- a/docs/development_ru.md +++ /dev/null @@ -1,55 +0,0 @@ -[English](/docs/development.md) | [Українська](/docs/development_ua.md) | **Русский** | [Deutsch](/docs/development_de.md) | [Français](/docs/development_fr.md) - -## Разработка - -Bruno разрабатывается как десктопное приложение. Необходимо загрузить приложение, запустив приложение Next.js в одном терминале, а затем запустить приложение electron в другом терминале. - -### Зависимости - -- NodeJS v18 - -### Локальная разработка - -```bash -# используйте nodejs 18 версии -nvm use - -# установите зависимости -npm i --legacy-peer-deps - -# билд документации по graphql -npm run build:graphql-docs - -# билд bruno query -npm run build:bruno-query - -# запустить next приложение ( терминал 1 ) -npm run dev:web - -# запустить приложение electron ( терминал 2 ) -npm run dev:electron -``` - -### Устранение неисправностей - -При запуске `npm install` может возникнуть ошибка `Unsupported platform`. Чтобы исправить это, необходимо удалить `node_modules` и `package-lock.json` и запустить `npm install`. В результате будут установлены все пакеты, необходимые для работы приложения. - -```shell -# Удаление node_modules в подкаталогах -find ./ -type d -name "node_modules" -print0 | while read -d $'\0' dir; do - rm -rf "$dir" -done - -# Удаление package-lock в подкаталогах -find . -type f -name "package-lock.json" -delete -``` - -### Тестирование - -```bash -# bruno-schema -npm test --workspace=packages/bruno-schema - -# bruno-lang -npm test --workspace=packages/bruno-lang -``` diff --git a/docs/development_ua.md b/docs/development_ua.md deleted file mode 100644 index c7de38f78..000000000 --- a/docs/development_ua.md +++ /dev/null @@ -1,55 +0,0 @@ -[English](/docs/development.md) | **Українська** | [Русский](/docs/development_ru.md) | [Deutsch](/docs/development_de.md) | [Français](/docs/development_fr.md) - -## Розробка - -Bruno розробляється як декстопний застосунок. Вам потрібно запустити Next.js в одній сесії терміналу, та запустити застосунок Electron в іншій сесії терміналу. - -### Залежності - -- NodeJS v18 - -### Локальна розробка - -```bash -# Використовуйте nodejs 18-ї версії -nvm use - -# встановіть залежності -npm i --legacy-peer-deps - -# зберіть документацію graphql -npm run build:graphql-docs - -# зберіть bruno query -npm run build:bruno-query - -# запустіть додаток next (термінал 1) -npm run dev:web - -# запустіть додаток електрон (термінал 2) -npm run dev:electron -``` - -### Усунення несправностей - -Ви можете зтикнутись із помилкою `Unsupported platform` коли запускаєте `npm install`. Щоб усунути цю проблему, вам потрібно видалити `node_modules` та `package-lock.json`, і тоді запустити `npm install`. Це має встановити всі потрібні для запуску додатку пекеджі. - -```shell -# Видаліть node_modules в піддиректоріях -find ./ -type d -name "node_modules" -print0 | while read -d $'\0' dir; do - rm -rf "$dir" -done - -# Видаліть package-lock в піддиректоріях -find . -type f -name "package-lock.json" -delete -``` - -### Тестування - -```bash -# bruno-schema -npm test --workspace=packages/bruno-schema - -# bruno-lang -npm test --workspace=packages/bruno-lang -``` diff --git a/readme_de.md b/docs/readme/readme_de.md similarity index 100% rename from readme_de.md rename to docs/readme/readme_de.md diff --git a/readme_fr.md b/docs/readme/readme_fr.md similarity index 100% rename from readme_fr.md rename to docs/readme/readme_fr.md diff --git a/readme_ru.md b/docs/readme/readme_ru.md similarity index 100% rename from readme_ru.md rename to docs/readme/readme_ru.md diff --git a/readme_tr.md b/docs/readme/readme_tr.md similarity index 100% rename from readme_tr.md rename to docs/readme/readme_tr.md diff --git a/readme_ua.md b/docs/readme/readme_ua.md similarity index 100% rename from readme_ua.md rename to docs/readme/readme_ua.md From 827df18c627e5ad1b0ffeb01f409136c585e6819 Mon Sep 17 00:00:00 2001 From: Its-treason <39559178+Its-treason@users.noreply.github.com> Date: Wed, 25 Oct 2023 23:13:37 +0200 Subject: [PATCH 4/9] feat(#682): Add validation for request vars & dynamic vars --- .../EnvironmentVariables/index.js | 2 +- .../RequestPane/Vars/VarsTable/index.js | 17 +++++++++-- .../src/components/RequestPane/Vars/index.js | 30 ------------------- packages/bruno-js/src/bru.js | 14 +++++++++ 4 files changed, 30 insertions(+), 33 deletions(-) diff --git a/packages/bruno-app/src/components/Environments/EnvironmentSettings/EnvironmentList/EnvironmentDetails/EnvironmentVariables/index.js b/packages/bruno-app/src/components/Environments/EnvironmentSettings/EnvironmentList/EnvironmentDetails/EnvironmentVariables/index.js index 6ac7f8e4c..dfd93be33 100644 --- a/packages/bruno-app/src/components/Environments/EnvironmentSettings/EnvironmentList/EnvironmentDetails/EnvironmentVariables/index.js +++ b/packages/bruno-app/src/components/Environments/EnvironmentSettings/EnvironmentList/EnvironmentDetails/EnvironmentVariables/index.js @@ -23,7 +23,7 @@ const EnvironmentVariables = ({ environment, collection }) => { enabled: Yup.boolean(), name: Yup.string() .required('Name cannot be empty') - .matches(/^[^\d]\w*$/, 'Name contains invalid characters') + .matches(/^(?!\d)\w*$/, 'Name contains invalid characters') .trim(), secret: Yup.boolean(), type: Yup.string(), diff --git a/packages/bruno-app/src/components/RequestPane/Vars/VarsTable/index.js b/packages/bruno-app/src/components/RequestPane/Vars/VarsTable/index.js index 6ee760978..77785e47a 100644 --- a/packages/bruno-app/src/components/RequestPane/Vars/VarsTable/index.js +++ b/packages/bruno-app/src/components/RequestPane/Vars/VarsTable/index.js @@ -8,6 +8,7 @@ import { sendRequest, saveRequest } from 'providers/ReduxStore/slices/collection import SingleLineEditor from 'components/SingleLineEditor'; import Tooltip from 'components/Tooltip'; import StyledWrapper from './StyledWrapper'; +import toast from 'react-hot-toast'; const VarsTable = ({ item, collection, vars, varType }) => { const dispatch = useDispatch(); @@ -29,7 +30,19 @@ const VarsTable = ({ item, collection, vars, varType }) => { const _var = cloneDeep(v); switch (type) { case 'name': { - _var.name = e.target.value; + const value = e.target.value; + + if (/^(?!\d).*$/.test(value) === false) { + toast.error('Variable names must not start with a number!'); + return; + } + + if (/^\w*$/.test(value) === false) { + toast.error('Variable contains invalid character! Variables must only contain alpha-numeric characters.'); + return; + } + + _var.name = value; break; } case 'value': { @@ -88,7 +101,7 @@ const VarsTable = ({ item, collection, vars, varType }) => { {vars && vars.length - ? vars.map((_var, index) => { + ? vars.map((_var) => { return ( diff --git a/packages/bruno-app/src/components/RequestPane/Vars/index.js b/packages/bruno-app/src/components/RequestPane/Vars/index.js index b63c08801..500ebb25b 100644 --- a/packages/bruno-app/src/components/RequestPane/Vars/index.js +++ b/packages/bruno-app/src/components/RequestPane/Vars/index.js @@ -1,42 +1,12 @@ import React from 'react'; import get from 'lodash/get'; -import { useDispatch } from 'react-redux'; -import { updateRequestScript, updateResponseScript } from 'providers/ReduxStore/slices/collections'; -import { sendRequest, saveRequest } from 'providers/ReduxStore/slices/collections/actions'; -import { useTheme } from 'providers/Theme'; import VarsTable from './VarsTable'; import StyledWrapper from './StyledWrapper'; const Vars = ({ item, collection }) => { - const dispatch = useDispatch(); const requestVars = item.draft ? get(item, 'draft.request.vars.req') : get(item, 'request.vars.req'); const responseVars = item.draft ? get(item, 'draft.request.vars.res') : get(item, 'request.vars.res'); - const { storedTheme } = useTheme(); - - const onRequestScriptEdit = (value) => { - dispatch( - updateRequestScript({ - script: value, - itemUid: item.uid, - collectionUid: collection.uid - }) - ); - }; - - const onResponseScriptEdit = (value) => { - dispatch( - updateResponseScript({ - script: value, - itemUid: item.uid, - collectionUid: collection.uid - }) - ); - }; - - const onRun = () => dispatch(sendRequest(item, collection.uid)); - const onSave = () => dispatch(saveRequest(item.uid, collection.uid)); - return (
diff --git a/packages/bruno-js/src/bru.js b/packages/bruno-js/src/bru.js index 3cd9e8f5f..5eaae4cca 100644 --- a/packages/bruno-js/src/bru.js +++ b/packages/bruno-js/src/bru.js @@ -59,10 +59,24 @@ class Bru { throw new Error('Key is required'); } + if (/^(?!\d)\w*$/.test(key) === false) { + throw new Error( + `Variable name: "${key}" contains invalid characters!` + + ' Names must only contain alpha-numeric characters and cannot start with a digit.' + ); + } + this.collectionVariables[key] = value; } getVar(key) { + if (/^(?!\d)\w*$/.test(key) === false) { + throw new Error( + `Variable name: "${key}" contains invalid characters!` + + ' Names must only contain alpha-numeric characters and cannot start with a digit.' + ); + } + return this.collectionVariables[key]; } } From d52163ceb38799c753733440ef814a86ebe4dec5 Mon Sep 17 00:00:00 2001 From: Its-treason <39559178+Its-treason@users.noreply.github.com> Date: Wed, 25 Oct 2023 23:30:31 +0200 Subject: [PATCH 5/9] test: Fix failing test 'should parse the json file' --- packages/bruno-lang/v2/tests/fixtures/request.bru | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/bruno-lang/v2/tests/fixtures/request.bru b/packages/bruno-lang/v2/tests/fixtures/request.bru index 22168b194..813a519b6 100644 --- a/packages/bruno-lang/v2/tests/fixtures/request.bru +++ b/packages/bruno-lang/v2/tests/fixtures/request.bru @@ -66,7 +66,7 @@ body:sparql { body:form-urlencoded { apikey: secret - numbers: +91998877665 + numbers: %2B91998877665 ~message: hello } From 7fa68731d250ad8d2faf4f2d5efed915fa509307 Mon Sep 17 00:00:00 2001 From: DaPutzy <9727551+DaPutzy@users.noreply.github.com> Date: Wed, 25 Oct 2023 23:16:28 +0000 Subject: [PATCH 6/9] feat: allow multiple script context roots --- packages/bruno-js/src/runtime/script-runtime.js | 7 ++++++- packages/bruno-js/src/runtime/test-runtime.js | 7 ++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/packages/bruno-js/src/runtime/script-runtime.js b/packages/bruno-js/src/runtime/script-runtime.js index 391d047d5..a39e00a50 100644 --- a/packages/bruno-js/src/runtime/script-runtime.js +++ b/packages/bruno-js/src/runtime/script-runtime.js @@ -46,6 +46,11 @@ class ScriptRuntime { const req = new BrunoRequest(request); const allowScriptFilesystemAccess = get(scriptingConfig, 'filesystemAccess.allow', false); const moduleWhitelist = get(scriptingConfig, 'moduleWhitelist', []); + const additionalContextRoots = get(scriptingConfig, 'additionalContextRoots', []); + const additionalContextRootsAbsolute = lodash + .chain(additionalContextRoots) + .map((acr) => (acr.startsWith('/') ? acr : path.join(collectionPath, acr))) + .value(); const whitelistedModules = {}; @@ -83,7 +88,7 @@ class ScriptRuntime { require: { context: 'sandbox', external: true, - root: [collectionPath], + root: [collectionPath, ...additionalContextRootsAbsolute], mock: { // node libs path, diff --git a/packages/bruno-js/src/runtime/test-runtime.js b/packages/bruno-js/src/runtime/test-runtime.js index 9da2cb287..fcaa750c9 100644 --- a/packages/bruno-js/src/runtime/test-runtime.js +++ b/packages/bruno-js/src/runtime/test-runtime.js @@ -48,6 +48,11 @@ class TestRuntime { const res = new BrunoResponse(response); const allowScriptFilesystemAccess = get(scriptingConfig, 'filesystemAccess.allow', false); const moduleWhitelist = get(scriptingConfig, 'moduleWhitelist', []); + const additionalContextRoots = get(scriptingConfig, 'additionalContextRoots', []); + const additionalContextRootsAbsolute = lodash + .chain(additionalContextRoots) + .map((acr) => (acr.startsWith('/') ? acr : path.join(collectionPath, acr))) + .value(); const whitelistedModules = {}; @@ -101,7 +106,7 @@ class TestRuntime { require: { context: 'sandbox', external: true, - root: [collectionPath], + root: [collectionPath, ...additionalContextRootsAbsolute], mock: { // node libs path, From fd6b083ae51f225119c19dcd2292e6698059ac6b Mon Sep 17 00:00:00 2001 From: Anoop M D Date: Thu, 26 Oct 2023 22:55:00 +0530 Subject: [PATCH 7/9] chore: fixed broken links in documentation --- contributing.md | 26 +++++++++++--------------- docs/contributing/contributing_de.md | 2 -- docs/contributing/contributing_fr.md | 4 +--- docs/contributing/contributing_ru.md | 2 -- docs/contributing/contributing_tr.md | 2 -- docs/contributing/contributing_ua.md | 2 -- docs/readme/readme_de.md | 4 +--- docs/readme/readme_fr.md | 4 +--- docs/readme/readme_ru.md | 4 +--- docs/readme/readme_tr.md | 6 ++---- docs/readme/readme_ua.md | 4 +--- readme.md | 2 +- 12 files changed, 19 insertions(+), 43 deletions(-) diff --git a/contributing.md b/contributing.md index 55fedf0f7..0d6efdffa 100644 --- a/contributing.md +++ b/contributing.md @@ -1,8 +1,8 @@ -**English** | [Українська](/contributing_ua.md) | [Русский](/contributing_ru.md) | [Türkçe](/contributing_tr.md) | [Deutsch](/contributing_de.md) | [Français](/contributing_fr.md) +**English** | [Українська](docs/contributing/contributing_ua.md) | [Русский](docs/contributing/contributing_ru.md) | [Türkçe](docs/contributing/contributing_tr.md) | [Deutsch](docs/contributing/contributing_de.md) | [Français](docs/contributing/contributing_fr.md) ## Let's make bruno better, together !! -I am happy that you are looking to improve bruno. Below are the guidelines to get started bringing up bruno on your computer. +We are happy that you are looking to improve bruno. Below are the guidelines to get started bringing up bruno on your computer. ### Technology Stack @@ -23,19 +23,6 @@ Libraries we use You would need [Node v18.x or the latest LTS version](https://nodejs.org/en/) and npm 8.x. We use npm workspaces in the project -### Let's start coding - -Please reference [development.md](docs/development.md) for instructions on running the local development environment. - -### Raising Pull Request - -- Please keep the PR's small and focused on one thing -- Please follow the format of creating branches - - feature/[feature name]: This branch should contain changes for a specific feature - - Example: feature/dark-mode - - bugfix/[bug name]: This branch should contain only bug fixes for a specific bug - - Example bugfix/bug-1 - ## Development Bruno is being developed as a desktop app. You need to load the app by running the Next.js app in one terminal and then run the electron app in another terminal. @@ -89,3 +76,12 @@ npm test --workspace=packages/bruno-schema # bruno-lang npm test --workspace=packages/bruno-lang ``` + +### Raising Pull Request + +- Please keep the PR's small and focused on one thing +- Please follow the format of creating branches + - feature/[feature name]: This branch should contain changes for a specific feature + - Example: feature/dark-mode + - bugfix/[bug name]: This branch should contain only bug fixes for a specific bug + - Example bugfix/bug-1 diff --git a/docs/contributing/contributing_de.md b/docs/contributing/contributing_de.md index fca88c609..b0b1b694d 100644 --- a/docs/contributing/contributing_de.md +++ b/docs/contributing/contributing_de.md @@ -1,5 +1,3 @@ -[English](/contributing.md) | [Українська](/contributing_ua.md) | [Русский](/contributing_ru.md) | [Türkçe](/contributing_tr.md) | **Deutsch** | [Français](/contributing_fr.md) - ## Lass uns Bruno noch besser machen, gemeinsam !! Ich freue mich, dass Du Bruno verbessern möchtest. Hier findest Du eine Anleitung, mit der Du Bruno auf Deinem Computer einrichten kannst. diff --git a/docs/contributing/contributing_fr.md b/docs/contributing/contributing_fr.md index f00a331c6..b69260e43 100644 --- a/docs/contributing/contributing_fr.md +++ b/docs/contributing/contributing_fr.md @@ -1,5 +1,3 @@ -[English](/contributing.md) | [Українська](/contributing_ua.md) | [Русский](/contributing_ru.md) | [Türkçe](/contributing_tr.md) | [Deutsch](/contributing_de.md) | **Français** - ## Ensemble, améliorons Bruno ! Je suis content de voir que vous envisagez améliorer Bruno. Ci-dessous, vous trouverez les règles et guides pour récupérer Bruno sur votre ordinateur. @@ -68,7 +66,7 @@ npm run dev:electron ### Dépannage -Vous pourriez rencontrer une error `Unsupported platform` pendant le lancement de `npm install`. Pour résoudre cela, veuillez supprimer le répertoire `node_modules`, le fichier `package-lock.json` et lancer à nouveau `npm install`. Cela devrait isntaller tous les paquets nécessaires pour lancer l'application. +Vous pourriez rencontrer une error `Unsupported platform` pendant le lancement de `npm install`. Pour résoudre cela, veuillez supprimer le répertoire `node_modules`, le fichier `package-lock.json` et lancer à nouveau `npm install`. Cela devrait isntaller tous les paquets nécessaires pour lancer l'application. ```shell # Delete node_modules in sub-directories diff --git a/docs/contributing/contributing_ru.md b/docs/contributing/contributing_ru.md index 63e737f01..6202c8f33 100644 --- a/docs/contributing/contributing_ru.md +++ b/docs/contributing/contributing_ru.md @@ -1,5 +1,3 @@ -[English](/contributing.md) | [Українська](/contributing_ua.md) | **Русский** | [Türkçe](/contributing_tr.md) | [Deutsch](/contributing_de.md) | [Français](/contributing_fr.md) - ## Давайте вместе сделаем Бруно лучше!!! Я рад, что Вы хотите усовершенствовать bruno. Ниже приведены рекомендации по запуску bruno на вашем компьютере. diff --git a/docs/contributing/contributing_tr.md b/docs/contributing/contributing_tr.md index 69d3098a3..25ff880cc 100644 --- a/docs/contributing/contributing_tr.md +++ b/docs/contributing/contributing_tr.md @@ -1,5 +1,3 @@ -[English](/readme.md) | [Українська](/contributing_ua.md) | [Русский](/contributing_ru.md) | **Türkçe** | [Deutsch](/contributing_de.md) | [Français](/contributing_fr.md) - ## Bruno'yu birlikte daha iyi hale getirelim !! Bruno'yu geliştirmek istemenizden mutluluk duyuyorum. Aşağıda, bruno'yu bilgisayarınıza getirmeye başlamak için yönergeler bulunmaktadır. diff --git a/docs/contributing/contributing_ua.md b/docs/contributing/contributing_ua.md index 8b563f3eb..329077cd1 100644 --- a/docs/contributing/contributing_ua.md +++ b/docs/contributing/contributing_ua.md @@ -1,5 +1,3 @@ -[English](/contributing.md) | **Українська** | [Русский](/contributing_ru.md) | [Türkçe](/contributing_tr.md) | [Deutsch](/contributing_de.md) | [Français](/contributing_fr.md) - ## Давайте зробимо Bruno краще, разом !! Я дуже радий що Ви бажаєте покращити Bruno. Нижче наведені вказівки як розпочати розробку Bruno на Вашому комп'ютері. diff --git a/docs/readme/readme_de.md b/docs/readme/readme_de.md index a3b8c3ed7..a0ef031d7 100644 --- a/docs/readme/readme_de.md +++ b/docs/readme/readme_de.md @@ -10,8 +10,6 @@ [![Website](https://img.shields.io/badge/Website-Visit-blue)](https://www.usebruno.com) [![Download](https://img.shields.io/badge/Download-Latest-brightgreen)](https://www.usebruno.com/downloads) -[English](/readme.md) | [Українська](/readme_ua.md) | [Русский](/readme_ru.md) | [Türkçe](/readme_tr.md) | **Deutsch** | [Français](/readme_fr.md) - Bruno ist ein neuer und innovativer API-Client, der den Status Quo von Postman und ähnlichen Tools revolutionieren soll. Bruno speichert Deine Sammlungen direkt in einem Ordner in Deinem Dateisystem. Wir verwenden eine einfache Textauszeichnungssprache - Bru - um Informationen über API-Anfragen zu speichern. @@ -61,7 +59,7 @@ Bitte [hier](publishing.md) für mehr Informationen lesen. ### Mitmachen 👩‍💻🧑‍💻 -Ich freue mich, dass Du Bruno verbessern willst. Bitte schau Dir den [Leitfaden zum Mitmachen](contributing_de.md) an. +Ich freue mich, dass Du Bruno verbessern willst. Bitte schau Dir den [Leitfaden zum Mitmachen](../contributing/contributing_de.md) an. Auch wenn Du nicht in der Lage bist, einen Beitrag in Form von Code zu leisten, zögere bitte nicht, uns Fehler und Funktionswünsche mitzuteilen, die implementiert werden müssen, um Deinen Anwendungsfall zu unterstützen. diff --git a/docs/readme/readme_fr.md b/docs/readme/readme_fr.md index 8078d7a85..97b327bfa 100644 --- a/docs/readme/readme_fr.md +++ b/docs/readme/readme_fr.md @@ -10,8 +10,6 @@ [![Website](https://img.shields.io/badge/Website-Visit-blue)](https://www.usebruno.com) [![Download](https://img.shields.io/badge/Download-Latest-brightgreen)](https://www.usebruno.com/downloads) -[English](/readme.md) | [Українська](/readme_ua.md) | [Русский](/readme_ru.md) | [Türkçe](/readme_tr.md) | [Deutsch](/readme_de.md) | **Français** - Bruno est un nouveau client API, innovant, qui a pour but de révolutionner le _status quo_ que représente Postman et les autres outils. Bruno sauvegarde vos collections directement sur votre système de fichiers. Nous utilisons un langage de balise de type texte pour décrire les requêtes API. @@ -61,7 +59,7 @@ Veuillez regarder [ici](publishing.md) pour plus d'information. ### Contribuer 👩‍💻🧑‍💻 -Je suis heureux de voir que vous cherchez à améliorer Bruno. Merci de consulter le [guide de contribution](contributing_fr.md) +Je suis heureux de voir que vous cherchez à améliorer Bruno. Merci de consulter le [guide de contribution](../contributing/contributing_fr.md) Même si vous n'êtes pas en mesure de contribuer directement via du code, n'hésitez pas à consigner les bogues et les demandes de nouvelles fonctionnalités pour résoudre vos cas d'usage ! diff --git a/docs/readme/readme_ru.md b/docs/readme/readme_ru.md index f30543dcb..423ab33b1 100644 --- a/docs/readme/readme_ru.md +++ b/docs/readme/readme_ru.md @@ -10,8 +10,6 @@ [![Website](https://img.shields.io/badge/Website-Visit-blue)](https://www.usebruno.com) [![Download](https://img.shields.io/badge/Download-Latest-brightgreen)](https://www.usebruno.com/downloads) -[English](/readme.md) | [Українська](/readme_ua.md) | **Русский** | [Türkçe](/readme_tr.md) | [Deutsch](/readme_de.md) | [Français](/readme_fr.md) - Bruno - новый и инновационный клиент API, направленный на революцию в установившейся ситуации, представленной Postman и подобными инструментами. Bruno хранит ваши коллекции непосредственно в папке в вашей файловой системе. Для сохранения информации об API-запросах мы используем язык Bru. @@ -56,7 +54,7 @@ Bruno работает только в автономном режиме. Доб ### Внести вклад 👩‍💻🧑‍💻 -Я рад, что Вы хотите улучшить Бруно. Пожалуйста, ознакомьтесь с [этим гайдом](contributing_ru.md) +Я рад, что Вы хотите улучшить Бруно. Пожалуйста, ознакомьтесь с [этим гайдом](../contributing/contributing_ru.md) Даже если вы не можете внести свой вклад с помощью кода, пожалуйста, не стесняйтесь сообщать об ошибках и пожеланиях к функциям, которые необходимо реализовать для решения вашей задачи. diff --git a/docs/readme/readme_tr.md b/docs/readme/readme_tr.md index eedbf222f..74bd8aa50 100644 --- a/docs/readme/readme_tr.md +++ b/docs/readme/readme_tr.md @@ -10,8 +10,6 @@ [![Web Sitesi](https://img.shields.io/badge/Website-Visit-blue)](https://www.usebruno.com) [![İndir](https://img.shields.io/badge/Download-Latest-brightgreen)](https://www.usebruno.com/downloads) -[English](/readme.md) | [Українська](/readme_ua.md) | [Русский](/readme_ru.md) | **Türkçe** | [Deutsch](/readme_de.md) | [Français](/readme_fr.md) - Bruno, Postman ve benzeri araçlar tarafından temsil edilen statükoda devrim yaratmayı amaçlayan yeni ve yenilikçi bir API istemcisidir. Bruno koleksiyonlarınızı doğrudan dosya sisteminizdeki bir klasörde saklar. API istekleri hakkındaki bilgileri kaydetmek için düz bir metin biçimlendirme dili olan Bru kullanıyoruz. @@ -54,9 +52,9 @@ Woof! Projeyi beğendiyseniz, şu ⭐ düğmesine basın! Bruno işinizde ve ekiplerinizde size yardımcı olduysa, lütfen [github tartışmamızdaki referanslarınızı](https://github.com/usebruno/bruno/discussions/343) paylaşmayı unutmayın -### Katkıda Bulunun 👩‍💻🧑‍💻 +### Katkıda Bulunun 👩‍💻🧑‍💻 -Bruno'yu geliştirmek istemenize sevindim. Lütfen [katkıda bulunma kılavuzu](contributing.md)'na göz atın +Bruno'yu geliştirmek istemenize sevindim. Lütfen [katkıda bulunma kılavuzu](../contributing/contributing.md)'na göz atın Kod yoluyla katkıda bulunamasanız bile, lütfen kullanım durumunuzu çözmek için uygulanması gereken hataları ve özellik isteklerini bildirmekten çekinmeyin. diff --git a/docs/readme/readme_ua.md b/docs/readme/readme_ua.md index bb491f505..9b0eb7a0f 100644 --- a/docs/readme/readme_ua.md +++ b/docs/readme/readme_ua.md @@ -10,8 +10,6 @@ [![Website](https://img.shields.io/badge/Website-Visit-blue)](https://www.usebruno.com) [![Download](https://img.shields.io/badge/Download-Latest-brightgreen)](https://www.usebruno.com/downloads) -[English](/readme.md) | **Українська** | [Русский](/readme_ru.md) | [Türkçe](/readme_tr.md) | [Deutsch](/readme_de.md) | [Français](/readme_fr.md) - Bruno це новий та іноваційний API клієнт, націлений на революційну зміну статус кво, запровадженого інструментами на кшталт Postman. Bruno зберігає ваші колекції напряму у теці на вашому диску. Він використовує текстову мову розмітки Bru для збереження інформації про ваші API запити. @@ -56,7 +54,7 @@ Bruno є повністю автономним. Немає жодних план ### Зробити свій внесок 👩‍💻🧑‍💻 -Я радий що ви бажаєте покращити Bruno. Будь ласка переглянте [інструкцію по контрибуції](contributing_ua.md) +Я радий що ви бажаєте покращити Bruno. Будь ласка переглянте [інструкцію по контрибуції](../contributing/contributing_ua.md) Навіть якщо ви не можете зробити свій внесок пишучи програмний код, будь ласка не соромтесь рапортувати про помилки і писати запити на новий функціонал, який потрібен вам у вашій роботі. diff --git a/readme.md b/readme.md index dc8a39508..1486ad25d 100644 --- a/readme.md +++ b/readme.md @@ -10,7 +10,7 @@ [![Website](https://img.shields.io/badge/Website-Visit-blue)](https://www.usebruno.com) [![Download](https://img.shields.io/badge/Download-Latest-brightgreen)](https://www.usebruno.com/downloads) -**English** | [Українська](/readme_ua.md) | [Русский](/readme_ru.md) | [Türkçe](/readme_tr.md) | [Deutsch](/readme_de.md) | [Français](/readme_fr.md) +**English** | [Українська](docs/readme/readme_ua.md) | [Русский](docs/readme/readme_ru.md) | [Türkçe](docs/readme/readme_tr.md) | [Deutsch](docs/readme/readme_de.md) | [Français](docs/readme/readme_fr.md) Bruno is a new and innovative API client, aimed at revolutionizing the status quo represented by Postman and similar tools out there. From e4b2b651f54cbe74bb564a649198dca2733b2930 Mon Sep 17 00:00:00 2001 From: Makar Date: Thu, 26 Oct 2023 13:23:43 -0500 Subject: [PATCH 8/9] Auth support for postman collection imports --- .../src/utils/importers/postman-collection.js | 49 +++++++++++++++++-- 1 file changed, 46 insertions(+), 3 deletions(-) diff --git a/packages/bruno-app/src/utils/importers/postman-collection.js b/packages/bruno-app/src/utils/importers/postman-collection.js index bc7f475e6..25116446c 100644 --- a/packages/bruno-app/src/utils/importers/postman-collection.js +++ b/packages/bruno-app/src/utils/importers/postman-collection.js @@ -18,7 +18,14 @@ const isItemAFolder = (item) => { return !item.request; }; -const importPostmanV2CollectionItem = (brunoParent, item) => { +const convertV21Auth = (array) => { + return array.reduce((accumulator, currentValue) => { + accumulator[currentValue.key] = currentValue.value; + return accumulator; + }, {}); +}; + +const importPostmanV2CollectionItem = (brunoParent, item, parentAuth) => { brunoParent.items = brunoParent.items || []; each(item, (i) => { @@ -31,7 +38,7 @@ const importPostmanV2CollectionItem = (brunoParent, item) => { }; brunoParent.items.push(brunoFolderItem); if (i.item && i.item.length) { - importPostmanV2CollectionItem(brunoFolderItem, i.item); + importPostmanV2CollectionItem(brunoFolderItem, i.item, i.auth ?? parentAuth); } } else { if (i.request) { @@ -49,6 +56,12 @@ const importPostmanV2CollectionItem = (brunoParent, item) => { request: { url: url, method: i.request.method, + auth: { + mode: 'none', + basic: null, + bearer: null, + awsv4: null + }, headers: [], params: [], body: { @@ -143,6 +156,36 @@ const importPostmanV2CollectionItem = (brunoParent, item) => { }); }); + const auth = i.request.auth ?? parentAuth; + if (auth?.[auth.type] && auth.type !== 'noauth') { + let authValues = auth[auth.type]; + if (Array.isArray(authValues)) { + authValues = convertV21Auth(authValues); + } + if (auth.type === 'basic') { + brunoRequestItem.request.auth.mode = 'basic'; + brunoRequestItem.request.auth.basic = { + username: authValues.username, + password: authValues.password + }; + } else if (auth.type === 'bearer') { + brunoRequestItem.request.auth.mode = 'bearer'; + brunoRequestItem.request.auth.bearer = { + token: authValues.token + }; + } else if (auth.type === 'awsv4') { + brunoRequestItem.request.auth.mode = 'awsv4'; + brunoRequestItem.request.auth.awsv4 = { + accessKeyId: authValues.accessKey, + secretAccessKey: authValues.secretKey, + sessionToken: authValues.sessionToken, + service: authValues.service, + region: authValues.region, + profileName: '' + }; + } + } + each(get(i, 'request.url.query'), (param) => { brunoRequestItem.request.params.push({ uid: uuid(), @@ -183,7 +226,7 @@ const importPostmanV2Collection = (collection) => { environments: [] }; - importPostmanV2CollectionItem(brunoCollection, collection.item); + importPostmanV2CollectionItem(brunoCollection, collection.item, collection.auth); return brunoCollection; }; From 7ac39bcf5c924c9235132e223268969e8cb90297 Mon Sep 17 00:00:00 2001 From: Anoop M D Date: Fri, 27 Oct 2023 16:18:49 +0530 Subject: [PATCH 9/9] fix(#777): fixing snap issue --- .github/workflows/release-snap.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/release-snap.yml b/.github/workflows/release-snap.yml index b71e88486..16a8d2e86 100644 --- a/.github/workflows/release-snap.yml +++ b/.github/workflows/release-snap.yml @@ -30,6 +30,7 @@ jobs: run: | npm run build:bruno-query npm run build:graphql-docs + npm run build:web npm run build:electron:snap - name: Install Snapcraft