diff --git a/packages/bruno-app/src/components/EnvironmentSelector/EnvironmentSettings/Layout/EnvironmentDetails/index.js b/packages/bruno-app/src/components/EnvironmentSelector/EnvironmentSettings/Layout/EnvironmentDetails/index.js deleted file mode 100644 index 35f5a486e..000000000 --- a/packages/bruno-app/src/components/EnvironmentSelector/EnvironmentSettings/Layout/EnvironmentDetails/index.js +++ /dev/null @@ -1,25 +0,0 @@ -import React, { useEffect, useState } from "react"; -import { IconEdit, IconTrash } from "@tabler/icons"; -import RenameEnvironment from "../../RenameEnvironment"; -import DeleteEnvironment from "../../DeleteEnvironment"; -// import StyledWrapper from "./StyledWrapper"; - -const EnvironmentDetails = ({selected}) => { - const [ openEditModal, setOpenEditModal] = useState(false); - const [ openDeleteModal, setOpenDeleteModal] = useState(false); - - return ( -
- {selected.name} -
- setOpenEditModal(true)}/> - setOpenDeleteModal(true)}/> -
- {openEditModal && setOpenEditModal(false)} environment={selected} />} - {openDeleteModal && setOpenDeleteModal(false)} environment={selected} />} -
- - ); -}; - -export default EnvironmentDetails; diff --git a/packages/bruno-app/src/components/EnvironmentSelector/EnvironmentSettings/index.js b/packages/bruno-app/src/components/EnvironmentSelector/EnvironmentSettings/index.js deleted file mode 100644 index 3e2c05a00..000000000 --- a/packages/bruno-app/src/components/EnvironmentSelector/EnvironmentSettings/index.js +++ /dev/null @@ -1,43 +0,0 @@ -import Modal from "components/Modal/index"; -import React, { useState } from "react"; -import CreateEnvironment from "./CreateEnvironment"; -import Layout from "./Layout"; - -const EnvironmentSettings = ({onClose}) => { - const environments = [ - {name: "My env", uid: 123}, - {name: "hjdgfh dj", uid: 3876}, - ]; - const [openCreateModal, setOpenCreateModal] = useState(false) - - if(!environments.length) { - return ( - -

No environment found!

- - {openCreateModal && setOpenCreateModal(false)}/>} -
- ) - } - - return ( - - - - ) - -} - -export default EnvironmentSettings; diff --git a/packages/bruno-app/src/components/EnvironmentSelector/StyledWrapper.js b/packages/bruno-app/src/components/Environments/EnvironmentSelector/StyledWrapper.js similarity index 100% rename from packages/bruno-app/src/components/EnvironmentSelector/StyledWrapper.js rename to packages/bruno-app/src/components/Environments/EnvironmentSelector/StyledWrapper.js diff --git a/packages/bruno-app/src/components/EnvironmentSelector/index.js b/packages/bruno-app/src/components/Environments/EnvironmentSelector/index.js similarity index 88% rename from packages/bruno-app/src/components/EnvironmentSelector/index.js rename to packages/bruno-app/src/components/Environments/EnvironmentSelector/index.js index 7d5de34f2..8ec67bac2 100644 --- a/packages/bruno-app/src/components/EnvironmentSelector/index.js +++ b/packages/bruno-app/src/components/Environments/EnvironmentSelector/index.js @@ -1,10 +1,10 @@ import React, { useRef, forwardRef, useState } from 'react'; import Dropdown from 'components/Dropdown'; import { IconAdjustmentsHorizontal, IconCaretDown } from '@tabler/icons'; -import EnvironmentSettings from "./EnvironmentSettings"; +import EnvironmentSettings from "../EnvironmentSettings"; import StyledWrapper from './StyledWrapper'; -const EnvironmentSelector = () => { +const EnvironmentSelector = ({collection}) => { const dropdownTippyRef = useRef(); const [openSettingsModal, setOpenSettingsModal] = useState(false); @@ -46,7 +46,7 @@ const EnvironmentSelector = () => { - {openSettingsModal && setOpenSettingsModal(false)}/>} + {openSettingsModal && setOpenSettingsModal(false)}/>} ); }; diff --git a/packages/bruno-app/src/components/EnvironmentSelector/EnvironmentSettings/CreateEnvironment/index.js b/packages/bruno-app/src/components/Environments/EnvironmentSettings/CreateEnvironment/index.js similarity index 78% rename from packages/bruno-app/src/components/EnvironmentSelector/EnvironmentSettings/CreateEnvironment/index.js rename to packages/bruno-app/src/components/Environments/EnvironmentSettings/CreateEnvironment/index.js index d01f98fb8..885d901c1 100644 --- a/packages/bruno-app/src/components/EnvironmentSelector/EnvironmentSettings/CreateEnvironment/index.js +++ b/packages/bruno-app/src/components/Environments/EnvironmentSettings/CreateEnvironment/index.js @@ -1,12 +1,13 @@ import React, { useEffect, useRef } from 'react'; import Portal from "components/Portal/index"; import Modal from "components/Modal/index"; +import toast from 'react-hot-toast'; import { useFormik } from 'formik'; -import { addWorkspace } from 'providers/ReduxStore/slices/workspaces'; +import { addEnvironment } from 'providers/ReduxStore/slices/collections/actions'; import * as Yup from 'yup'; import { useDispatch } from 'react-redux'; -const CreateEnvironment = ({onClose}) => { +const CreateEnvironment = ({collection, onClose}) => { const dispatch = useDispatch(); const inputRef = useRef(); const formik = useFormik({ @@ -17,12 +18,16 @@ const CreateEnvironment = ({onClose}) => { validationSchema: Yup.object({ name: Yup.string() .min(1, 'must be atleast 1 characters') - .max(30, 'must be 30 characters or less') + .max(50, 'must be 50 characters or less') .required('name is required') }), onSubmit: (values) => { - // dispatch(addWorkspace({name: values.name})); - // onClose(); + dispatch(addEnvironment(values.name, collection.uid)) + .then(() => { + toast.success("Environment created in collection"); + onClose(); + }) + .catch(() => toast.error("An error occured while created the environment")); } }); diff --git a/packages/bruno-app/src/components/EnvironmentSelector/EnvironmentSettings/DeleteEnvironment/StyledWrapper.js b/packages/bruno-app/src/components/Environments/EnvironmentSettings/DeleteEnvironment/StyledWrapper.js similarity index 100% rename from packages/bruno-app/src/components/EnvironmentSelector/EnvironmentSettings/DeleteEnvironment/StyledWrapper.js rename to packages/bruno-app/src/components/Environments/EnvironmentSettings/DeleteEnvironment/StyledWrapper.js diff --git a/packages/bruno-app/src/components/EnvironmentSelector/EnvironmentSettings/DeleteEnvironment/index.js b/packages/bruno-app/src/components/Environments/EnvironmentSettings/DeleteEnvironment/index.js similarity index 61% rename from packages/bruno-app/src/components/EnvironmentSelector/EnvironmentSettings/DeleteEnvironment/index.js rename to packages/bruno-app/src/components/Environments/EnvironmentSettings/DeleteEnvironment/index.js index f13aee318..c4cc0cb69 100644 --- a/packages/bruno-app/src/components/EnvironmentSelector/EnvironmentSettings/DeleteEnvironment/index.js +++ b/packages/bruno-app/src/components/Environments/EnvironmentSettings/DeleteEnvironment/index.js @@ -1,15 +1,20 @@ import React from 'react'; import Portal from "components/Portal/index"; +import toast from 'react-hot-toast'; import Modal from "components/Modal/index"; -// import { deleteWorkspace } from 'providers/ReduxStore/slices/workspaces'; +import { deleteEnvironment } from 'providers/ReduxStore/slices/collections/actions'; import { useDispatch } from 'react-redux'; import StyledWrapper from './StyledWrapper'; -const DeleteEnvironment = ({onClose, environment}) => { +const DeleteEnvironment = ({onClose, environment, collection}) => { const dispatch = useDispatch(); const onConfirm = () =>{ - // dispatch(deleteWorkspace({workspaceUid: workspace.uid})) - onClose(); + dispatch(deleteEnvironment(environment.uid, collection.uid)) + .then(() => { + toast.success("Environment deleted successfully"); + onClose(); + }) + .catch(() => toast.error("An error occured while deleting the environment")); }; return ( diff --git a/packages/bruno-app/src/components/Environments/EnvironmentSettings/EnvironmentList/EnvironmentDetails/index.js b/packages/bruno-app/src/components/Environments/EnvironmentSettings/EnvironmentList/EnvironmentDetails/index.js new file mode 100644 index 000000000..766bba05d --- /dev/null +++ b/packages/bruno-app/src/components/Environments/EnvironmentSettings/EnvironmentList/EnvironmentDetails/index.js @@ -0,0 +1,26 @@ +import React, {useState } from "react"; +import { IconEdit, IconTrash } from "@tabler/icons"; +import RenameEnvironment from "../../RenameEnvironment"; +import DeleteEnvironment from "../../DeleteEnvironment"; + +const EnvironmentDetails = ({environment, collection}) => { + const [ openEditModal, setOpenEditModal] = useState(false); + const [ openDeleteModal, setOpenDeleteModal] = useState(false); + + return ( +
+ {openEditModal && setOpenEditModal(false)} environment={environment} collection={collection}/>} + {openDeleteModal && setOpenDeleteModal(false)} environment={environment} collection={collection}/>} +
+
{environment.name}
+
+ setOpenEditModal(true)}/> + setOpenDeleteModal(true)}/> +
+
+
+ + ); +}; + +export default EnvironmentDetails; diff --git a/packages/bruno-app/src/components/EnvironmentSelector/EnvironmentSettings/Layout/StyledWrapper.js b/packages/bruno-app/src/components/Environments/EnvironmentSettings/EnvironmentList/StyledWrapper.js similarity index 54% rename from packages/bruno-app/src/components/EnvironmentSelector/EnvironmentSettings/Layout/StyledWrapper.js rename to packages/bruno-app/src/components/Environments/EnvironmentSettings/EnvironmentList/StyledWrapper.js index c44482cc0..4c7ce038c 100644 --- a/packages/bruno-app/src/components/EnvironmentSelector/EnvironmentSettings/Layout/StyledWrapper.js +++ b/packages/bruno-app/src/components/Environments/EnvironmentSettings/EnvironmentList/StyledWrapper.js @@ -1,12 +1,12 @@ import styled from "styled-components"; const StyledWrapper = styled.div` - margin-left: -1rem; + margin-inline: -1rem; margin-block: -1.5rem; + .environments-sidebar { - margin-bottom: 8px; - background-color: #ffffff; - min-height: 300px; + background-color: #eaeaea; + min-height: 400px; } .environment-item { @@ -15,28 +15,34 @@ const StyledWrapper = styled.div` position: relative; cursor: pointer; padding: 8px 10px; - color: rgb(35, 35, 35); - border-bottom: 1px solid #eaecef; + border-left: solid 2px transparent; + text-decoration: none; &:hover { text-decoration: none; - background-color: #f6f8fa; + background-color: #e4e4e4; } } .active { - background-color: #e1e4e8; + background-color: #dcdcdc !important; + border-left: solid 2px var(--color-brand); &:hover { - text-decoration: none; - background-color: #e1e4e8; + background-color: #dcdcdc !important; } } - .create-env { + .btn-create-environment { padding: 8px 10px; cursor: pointer; border-bottom: none; color: var(--color-text-link); + + &:hover { + span { + text-decoration: underline; + } + } } `; diff --git a/packages/bruno-app/src/components/EnvironmentSelector/EnvironmentSettings/Layout/index.js b/packages/bruno-app/src/components/Environments/EnvironmentSettings/EnvironmentList/index.js similarity index 50% rename from packages/bruno-app/src/components/EnvironmentSelector/EnvironmentSettings/Layout/index.js rename to packages/bruno-app/src/components/Environments/EnvironmentSettings/EnvironmentList/index.js index 19a15d032..c3d0cc8b3 100644 --- a/packages/bruno-app/src/components/EnvironmentSelector/EnvironmentSettings/Layout/index.js +++ b/packages/bruno-app/src/components/Environments/EnvironmentSettings/EnvironmentList/index.js @@ -3,38 +3,43 @@ import EnvironmentDetails from "./EnvironmentDetails"; import CreateEnvironment from "../CreateEnvironment/index"; import StyledWrapper from "./StyledWrapper"; -const environments = [ - {name: "My env", uid: 123}, - {name: "hjdgfh dj", uid: 3876}, - {name: "hjdgfer dj", uid: 4678}, -]; - -const Layout = () => { - const [selectedEnvironment, setSelectedEnvironment] = useState({}); +const EnvironmentList = ({collection}) => { + const { environments } = collection; + const [selectedEnvironment, setSelectedEnvironment] = useState(null); const [openCreateModal, setOpenCreateModal] = useState(false); useEffect(() => { setSelectedEnvironment(environments[0]); }, []); + if(!selectedEnvironment) { + return null; + } + return ( + {openCreateModal && setOpenCreateModal(false)}/>}
-
+
{environments && environments.length && environments.map((env) => ( -
setSelectedEnvironment(env)}> +
setSelectedEnvironment(env)} + > {env.name}
))} -

setOpenCreateModal(true)}> + Create

+
setOpenCreateModal(true)}> + + Create +
- +
- {openCreateModal && setOpenCreateModal(false)}/>} ); }; -export default Layout; +export default EnvironmentList; diff --git a/packages/bruno-app/src/components/EnvironmentSelector/EnvironmentSettings/RenameEnvironment/index.js b/packages/bruno-app/src/components/Environments/EnvironmentSettings/RenameEnvironment/index.js similarity index 75% rename from packages/bruno-app/src/components/EnvironmentSelector/EnvironmentSettings/RenameEnvironment/index.js rename to packages/bruno-app/src/components/Environments/EnvironmentSettings/RenameEnvironment/index.js index 7023a9971..1811aa44a 100644 --- a/packages/bruno-app/src/components/EnvironmentSelector/EnvironmentSettings/RenameEnvironment/index.js +++ b/packages/bruno-app/src/components/Environments/EnvironmentSettings/RenameEnvironment/index.js @@ -1,13 +1,14 @@ import React, { useEffect, useRef } from 'react'; import Portal from "components/Portal/index"; import Modal from "components/Modal/index"; +import toast from 'react-hot-toast'; import { useFormik } from 'formik'; -// import { rename } from 'providers/ReduxStore/slices/environments'; +import { renameEnvironment } from 'providers/ReduxStore/slices/collections/actions'; import * as Yup from 'yup'; import { useDispatch } from 'react-redux'; -const RenameEnvironment = ({onClose, environment}) => { - // const dispatch = useDispatch(); +const RenameEnvironment = ({onClose, environment, collection}) => { + const dispatch = useDispatch(); const inputRef = useRef(); const formik = useFormik({ enableReinitialize: true, @@ -17,12 +18,16 @@ const RenameEnvironment = ({onClose, environment}) => { validationSchema: Yup.object({ name: Yup.string() .min(1, 'must be atleast 1 characters') - .max(30, 'must be 30 characters or less') + .max(50, 'must be 50 characters or less') .required('name is required') }), onSubmit: (values) => { - // dispatch(rename({name: values.name, uid: environment.uid})); - onClose(); + dispatch(renameEnvironment(values.name, environment.uid, collection.uid)) + .then(() => { + toast.success("Environment renamed successfully"); + onClose(); + }) + .catch(() => toast.error("An error occured while renaming the environment")); } }); diff --git a/packages/bruno-app/src/components/Environments/EnvironmentSettings/StyledWrapper.js b/packages/bruno-app/src/components/Environments/EnvironmentSettings/StyledWrapper.js new file mode 100644 index 000000000..14e04bb5c --- /dev/null +++ b/packages/bruno-app/src/components/Environments/EnvironmentSettings/StyledWrapper.js @@ -0,0 +1,13 @@ +import styled from "styled-components"; + +const StyledWrapper = styled.div` + button.btn-create-environment { + &:hover { + span { + text-decoration: underline; + } + } + } +`; + +export default StyledWrapper; \ No newline at end of file diff --git a/packages/bruno-app/src/components/Environments/EnvironmentSettings/index.js b/packages/bruno-app/src/components/Environments/EnvironmentSettings/index.js new file mode 100644 index 000000000..6cb08cd79 --- /dev/null +++ b/packages/bruno-app/src/components/Environments/EnvironmentSettings/index.js @@ -0,0 +1,50 @@ +import Modal from "components/Modal/index"; +import React, { useState } from "react"; +import CreateEnvironment from "./CreateEnvironment"; +import EnvironmentList from "./EnvironmentList"; +import StyledWrapper from "./StyledWrapper"; + +const EnvironmentSettings = ({collection, onClose}) => { + const { environments } = collection; + const [openCreateModal, setOpenCreateModal] = useState(false) + + if(!environments || !environments.length) { + return ( + + + {openCreateModal && setOpenCreateModal(false)}/>} +
+

No environments found!

+ +
+
+
+ ) + } + + return ( + + + + ) + +} + +export default EnvironmentSettings; diff --git a/packages/bruno-app/src/components/RequestTabs/CollectionToolBar/index.js b/packages/bruno-app/src/components/RequestTabs/CollectionToolBar/index.js index 16013dbd7..fd728e2ec 100644 --- a/packages/bruno-app/src/components/RequestTabs/CollectionToolBar/index.js +++ b/packages/bruno-app/src/components/RequestTabs/CollectionToolBar/index.js @@ -1,6 +1,6 @@ import React from 'react'; import { IconFiles } from '@tabler/icons'; -import EnvironmentSelector from 'components/EnvironmentSelector'; +import EnvironmentSelector from 'components/Environments/EnvironmentSelector'; import StyledWrapper from './StyledWrapper'; const CollectionToolBar = ({collection}) => { @@ -12,7 +12,7 @@ const CollectionToolBar = ({collection}) => { {collection.name}
- +
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 e19647764..059991f1a 100644 --- a/packages/bruno-app/src/providers/ReduxStore/slices/collections/actions.js +++ b/packages/bruno-app/src/providers/ReduxStore/slices/collections/actions.js @@ -1,5 +1,5 @@ import path from 'path'; -import axios from 'axios'; +import filter from 'lodash/filter'; import each from 'lodash/each'; import trim from 'lodash/trim'; import toast from 'react-hot-toast'; @@ -13,6 +13,7 @@ import { transformRequestToSaveToFilesystem, deleteItemInCollection, findParentItemInCollection, + findEnvironmentInCollection, isItemAFolder, refreshUidsInItem } from 'utils/collections'; @@ -31,6 +32,9 @@ import { cloneItem as _cloneItem, deleteItem as _deleteItem, saveRequest as _saveRequest, + addEnvironment as _addEnvironment, + renameEnvironment as _renameEnvironment, + deleteEnvironment as _deleteEnvironment, createCollection as _createCollection, renameCollection as _renameCollection, deleteCollection as _deleteCollection, @@ -71,7 +75,8 @@ export const createCollection = (collectionName) => (dispatch, getState) => { const newCollection = { uid: uuid(), name: collectionName, - items: [] + items: [], + environments: [] }; const requestItem = { @@ -606,6 +611,88 @@ export const newHttpRequest = (params) => (dispatch, getState) => { }); }; +export const addEnvironment = (name, collectionUid) => (dispatch, getState) => { + return new Promise((resolve, reject) => { + const state = getState(); + const collection = findCollectionByUid(state.collections.collections, collectionUid); + if(!collection) { + return reject(new Error('Collection not found')); + } + + const environment = { + uid: uuid(), + name: name, + variables: [] + }; + + const collectionCopy = cloneDeep(collection); + const collectionToSave = transformCollectionToSaveToIdb(collectionCopy); + collectionToSave.environments = collectionToSave.environments || []; + collectionToSave.environments.push(environment); + + collectionSchema + .validate(collectionToSave) + .then(() => saveCollectionToIdb(window.__idb, collectionToSave)) + .then(() => dispatch(_addEnvironment({environment, collectionUid}))) + .then(resolve) + .catch(reject); + }); +}; + +export const renameEnvironment = (newName, environmentUid, collectionUid) => (dispatch, getState) => { + return new Promise((resolve, reject) => { + const state = getState(); + const collection = findCollectionByUid(state.collections.collections, collectionUid); + if(!collection) { + return reject(new Error('Collection not found')); + } + + const collectionCopy = cloneDeep(collection); + const environment = findEnvironmentInCollection(collectionCopy, environmentUid); + if(!environment) { + return reject(new Error('Environment not found')); + } + + environment.name = newName; + + const collectionToSave = transformCollectionToSaveToIdb(collectionCopy); + + collectionSchema + .validate(collectionToSave) + .then(() => saveCollectionToIdb(window.__idb, collectionToSave)) + .then(() => dispatch(_renameEnvironment({newName, environmentUid, collectionUid}))) + .then(resolve) + .catch(reject); + }); +}; + +export const deleteEnvironment = (environmentUid, collectionUid) => (dispatch, getState) => { + return new Promise((resolve, reject) => { + const state = getState(); + const collection = findCollectionByUid(state.collections.collections, collectionUid); + if(!collection) { + return reject(new Error('Collection not found')); + } + + const collectionCopy = cloneDeep(collection); + const environment = findEnvironmentInCollection(collectionCopy, environmentUid); + if(!environment) { + return reject(new Error('Environment not found')); + } + + collectionCopy.environments = filter(collectionCopy.environments, (e) => e.uid !== environmentUid); + + const collectionToSave = transformCollectionToSaveToIdb(collectionCopy); + + collectionSchema + .validate(collectionToSave) + .then(() => saveCollectionToIdb(window.__idb, collectionToSave)) + .then(() => dispatch(_deleteEnvironment({environmentUid, collectionUid}))) + .then(resolve) + .catch(reject); + }); +}; + export const removeLocalCollection = (collectionUid) => (dispatch, getState) => { return new Promise((resolve, reject) => { const state = getState(); 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 fe7cdcbfd..62f2dd92a 100644 --- a/packages/bruno-app/src/providers/ReduxStore/slices/collections/index.js +++ b/packages/bruno-app/src/providers/ReduxStore/slices/collections/index.js @@ -11,6 +11,7 @@ import splitOnFirst from 'split-on-first'; import { findCollectionByUid, findItemInCollection, + findEnvironmentInCollection, findItemInCollectionByPathname, addDepth, collapseCollection, @@ -69,6 +70,39 @@ export const collectionsSlice = createSlice({ deleteCollection: (state, action) => { state.collections = filter(state.collections, c => c.uid !== action.payload.collectionUid); }, + addEnvironment: (state, action) => { + const { environment, collectionUid } = action.payload; + const collection = findCollectionByUid(state.collections, collectionUid); + + if(collection) { + collection.environments = collection.environments || []; + collection.environments.push(environment); + } + }, + renameEnvironment: (state, action) => { + const { newName, environmentUid, collectionUid } = action.payload; + const collection = findCollectionByUid(state.collections, collectionUid); + + if(collection) { + const environment = findEnvironmentInCollection(collection, environmentUid); + + if(environment) { + environment.name = newName; + } + } + }, + deleteEnvironment: (state, action) => { + const { environmentUid, collectionUid } = action.payload; + const collection = findCollectionByUid(state.collections, collectionUid); + + if(collection) { + const environment = findEnvironmentInCollection(collection, environmentUid); + + if(environment) { + collection.environments = filter(collection.environments, (e) => e.uid !== environmentUid); + } + } + }, newItem: (state, action) => { const collection = findCollectionByUid(state.collections, action.payload.collectionUid); @@ -690,6 +724,9 @@ export const { renameCollection, deleteCollection, loadCollections, + addEnvironment, + renameEnvironment, + deleteEnvironment, newItem, deleteItem, renameItem, diff --git a/packages/bruno-app/src/utils/collections/index.js b/packages/bruno-app/src/utils/collections/index.js index 4d8bbda2a..29542a65c 100644 --- a/packages/bruno-app/src/utils/collections/index.js +++ b/packages/bruno-app/src/utils/collections/index.js @@ -117,6 +117,10 @@ export const recursivelyGetAllItemUids = (items = []) => { return map(flattenedItems, (i) => i.uid); }; +export const findEnvironmentInCollection = (collection, envUid) => { + return find(collection.environments, (e) => e.uid === envUid); +} + export const transformCollectionToSaveToIdb = (collection, options = {}) => { const copyHeaders = (headers) => { return map(headers, (header) => { @@ -233,6 +237,7 @@ export const transformCollectionToSaveToIdb = (collection, options = {}) => { collectionToSave.name = collection.name; collectionToSave.uid = collection.uid; collectionToSave.items = []; + collectionToSave.environments = collection.environments || []; copyItems(collection.items, collectionToSave.items); diff --git a/packages/bruno-schema/src/collections/index.js b/packages/bruno-schema/src/collections/index.js index 5aa1e38a4..e20e2a4c9 100644 --- a/packages/bruno-schema/src/collections/index.js +++ b/packages/bruno-schema/src/collections/index.js @@ -1,6 +1,21 @@ const Yup = require('yup'); const { uidSchema } = require("../common"); +const environmentVariablesSchema = Yup.object({ + uid: uidSchema, + name: Yup.string().nullable().max(256, 'name must be 256 characters or less').defined(), + value: Yup.string().nullable().max(2048, 'value must be 2048 characters or less').defined(), + type: Yup.string().oneOf(['text']).required('type is required'), + enabled: Yup.boolean().defined() +}).noUnknown(true).strict(); + + +const environmentSchema = Yup.object({ + uid: uidSchema, + name: Yup.string().min(1).max(50, 'name must be 50 characters or less').required('name is required'), + variables: Yup.array().of(environmentVariablesSchema).required('variables are required') +}).noUnknown(true).strict(); + const keyValueSchema = Yup.object({ uid: uidSchema, name: Yup.string().nullable().max(256, 'name must be 256 characters or less').defined(), @@ -55,6 +70,7 @@ const collectionSchema = Yup.object({ .max(50, 'name must be 100 characters or less') .required('name is required'), items: Yup.array().of(itemSchema), + environments: Yup.array().of(environmentSchema), pathname: Yup.string().max(1024, 'pathname cannot be more than 1024 characters').nullable() }).noUnknown(true).strict();