diff --git a/packages/bruno-app/src/components/CollectionSettings/Auth/AwsV4Auth/index.js b/packages/bruno-app/src/components/CollectionSettings/Auth/AwsV4Auth/index.js index da30225143..d2b644e2c2 100644 --- a/packages/bruno-app/src/components/CollectionSettings/Auth/AwsV4Auth/index.js +++ b/packages/bruno-app/src/components/CollectionSettings/Auth/AwsV4Auth/index.js @@ -11,7 +11,7 @@ const AwsV4Auth = ({ collection }) => { const dispatch = useDispatch(); const { storedTheme } = useTheme(); - const awsv4Auth = collection.draft ? get(collection, 'draft..request.auth.awsv4', {}) : get(collection, 'root.request.auth.awsv4', {}); + const awsv4Auth = collection.draft ? get(collection, 'draft.request.auth.awsv4', {}) : get(collection, 'root.request.auth.awsv4', {}); const handleSave = () => dispatch(saveCollectionRoot(collection.uid)); diff --git a/packages/bruno-app/src/components/CollectionSettings/Auth/DigestAuth/index.js b/packages/bruno-app/src/components/CollectionSettings/Auth/DigestAuth/index.js index 18db037539..382ddc08d9 100644 --- a/packages/bruno-app/src/components/CollectionSettings/Auth/DigestAuth/index.js +++ b/packages/bruno-app/src/components/CollectionSettings/Auth/DigestAuth/index.js @@ -11,7 +11,7 @@ const DigestAuth = ({ collection }) => { const dispatch = useDispatch(); const { storedTheme } = useTheme(); - const digestAuth = collection.draft ? get(collection, 'draft..request.auth.digest', {}) : get(collection, 'root.request.auth.digest', {}); + const digestAuth = collection.draft ? get(collection, 'draft.request.auth.digest', {}) : get(collection, 'root.request.auth.digest', {}); const handleSave = () => dispatch(saveCollectionRoot(collection.uid)); diff --git a/packages/bruno-app/src/components/CollectionSettings/Auth/OAuth2/PasswordCredentials/index.js b/packages/bruno-app/src/components/CollectionSettings/Auth/OAuth2/PasswordCredentials/index.js index d2d9eed1f2..491af25ccf 100644 --- a/packages/bruno-app/src/components/CollectionSettings/Auth/OAuth2/PasswordCredentials/index.js +++ b/packages/bruno-app/src/components/CollectionSettings/Auth/OAuth2/PasswordCredentials/index.js @@ -12,7 +12,7 @@ const OAuth2AuthorizationCode = ({ item, collection }) => { const dispatch = useDispatch(); const { storedTheme } = useTheme(); - const oAuth = get(collection, 'root.request.auth.oauth2', {}); + const oAuth = collection.draft ? get(collection, 'draft.request.auth.oauth2', {}) : get(collection, 'root.request.auth.oauth2', {}); const handleRun = async () => { dispatch(sendCollectionOauth2Request(collection.uid)); diff --git a/packages/bruno-app/src/components/CollectionSettings/Docs/index.js b/packages/bruno-app/src/components/CollectionSettings/Docs/index.js index 0c00c1927b..a5ccbc6986 100644 --- a/packages/bruno-app/src/components/CollectionSettings/Docs/index.js +++ b/packages/bruno-app/src/components/CollectionSettings/Docs/index.js @@ -14,7 +14,7 @@ const Docs = ({ collection }) => { const dispatch = useDispatch(); const { displayedTheme } = useTheme(); const [isEditing, setIsEditing] = useState(false); - const docs = get(collection, 'draft.docs') || get(collection, 'root.docs', ''); + const docs = collection.draft ? get(collection, 'draft.docs', '') : get(collection, 'root.docs', ''); const preferences = useSelector((state) => state.app.preferences); const { theme, storedTheme } = useTheme(); diff --git a/packages/bruno-app/src/components/CollectionSettings/index.js b/packages/bruno-app/src/components/CollectionSettings/index.js index e2d3dac1c7..2985084e9c 100644 --- a/packages/bruno-app/src/components/CollectionSettings/index.js +++ b/packages/bruno-app/src/components/CollectionSettings/index.js @@ -44,13 +44,13 @@ const CollectionSettings = ({ collection }) => { const hasTests = root?.request?.tests; const hasDocs = root?.docs; - const headers = collection.draft ? get(collection, 'draft.request.headers') : get(collection, 'root.request.headers', []); + const headers = collection.draft ? get(collection, 'draft.request.headers', []) : get(collection, 'root.request.headers', []); const activeHeadersCount = headers.filter((header) => header.enabled).length; const requestVars = collection.draft ? get(collection, 'draft.request.vars.req', []) : get(collection, 'root.request.vars.req', []); const responseVars = collection.draft ? get(collection, 'draft.request.vars.res', []) : get(collection, 'root.request.vars.res', []); const activeVarsCount = requestVars.filter((v) => v.enabled).length + responseVars.filter((v) => v.enabled).length; - const auth = collection.draft ? get(collection, 'draft.request,auth', {}).mode : get(collection, 'root.request.auth', {}).mode; + const auth = collection.draft ? get(collection, 'draft.request.auth', {}).mode : get(collection, 'root.request.auth', {}).mode; const proxyConfig = get(collection, 'brunoConfig.proxy', {}); const clientCertConfig = get(collection, 'brunoConfig.clientCertificates.certs', []); 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 a368086f1f..53cc380d95 100644 --- a/packages/bruno-app/src/providers/ReduxStore/slices/collections/actions.js +++ b/packages/bruno-app/src/providers/ReduxStore/slices/collections/actions.js @@ -169,8 +169,6 @@ export const saveFolderRoot = (collectionUid, folderUid) => (dispatch, getState) const transformFolderRoot = transformFolderRootToSave(folder); - console.log({ transformFolderRoot }) - const folderData = { name: folder.name, pathname: folder.pathname, 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 1215f69bd7..c0722e38c0 100644 --- a/packages/bruno-app/src/providers/ReduxStore/slices/collections/index.js +++ b/packages/bruno-app/src/providers/ReduxStore/slices/collections/index.js @@ -1635,11 +1635,24 @@ export const collectionsSlice = createSlice({ // check and update collection root if (collection && file.meta.collectionRoot) { collection.root = file.data; + collection.draft = null; return; } if (collection) { const item = findItemInCollection(collection, file.data.uid); + const isFolderRoot = file.meta.folderRoot ? true : false; + + + if (isFolderRoot) { + const folderPath = getDirectoryName(file.meta.pathname); + const folderItem = findItemInCollectionByPathname(collection, folderPath); + if (folderItem) { + folderItem.root = file.data; + folderItem.draft = null; + } + return; + } if (item) { // whenever a user attempts to sort a req within the same folder diff --git a/packages/bruno-app/src/utils/collections/index.js b/packages/bruno-app/src/utils/collections/index.js index 009e1bcdbf..c1c7b9283a 100644 --- a/packages/bruno-app/src/utils/collections/index.js +++ b/packages/bruno-app/src/utils/collections/index.js @@ -1004,7 +1004,7 @@ const mergeVars = (collection, requestTreePath = []) => { let collectionVariables = {}; let folderVariables = {}; let requestVariables = {}; - let collectionRequestVars = get(collection, 'root.request.vars.req', []); + let collectionRequestVars = collection.draft ? get(collection, 'draft.request.vars.req', []) : get(collection, 'root.request.vars.req', []); collectionRequestVars.forEach((_var) => { if (_var.enabled) { collectionVariables[_var.name] = _var.value; diff --git a/packages/bruno-cli/src/runner/prepare-request.js b/packages/bruno-cli/src/runner/prepare-request.js index 0ed8667609..a26691c573 100644 --- a/packages/bruno-cli/src/runner/prepare-request.js +++ b/packages/bruno-cli/src/runner/prepare-request.js @@ -35,7 +35,7 @@ const prepareRequest = (item = {}, collection = {}) => { responseType: 'arraybuffer' }; - const collectionAuth = get(collection, 'root.request.auth'); + const collectionAuth = collection.draft ? get(collection, 'draft.request.auth') : get(collection, 'root.request.auth'); if (collectionAuth && request.auth.mode === 'inherit') { if (collectionAuth.mode === 'basic') { axiosRequest.auth = { diff --git a/packages/bruno-cli/src/utils/collection.js b/packages/bruno-cli/src/utils/collection.js index 365732c488..a8b97df64b 100644 --- a/packages/bruno-cli/src/utils/collection.js +++ b/packages/bruno-cli/src/utils/collection.js @@ -4,7 +4,7 @@ const os = require('os'); const mergeHeaders = (collection, request, requestTreePath) => { let headers = new Map(); - let collectionHeaders = get(collection, 'root.request.headers', []); + let collectionHeaders = collection.draft ? get(collection, 'draft.request.headers', []) : get(collection, 'root.request.headers', []); collectionHeaders.forEach((header) => { if (header.enabled) { headers.set(header.name, header.value); @@ -34,7 +34,7 @@ const mergeHeaders = (collection, request, requestTreePath) => { const mergeVars = (collection, request, requestTreePath) => { let reqVars = new Map(); - let collectionRequestVars = get(collection, 'root.request.vars.req', []); + let collectionRequestVars = collection.draft ? get(collection, 'draft.request.vars.req', []) : get(collection, 'root.request.vars.req', []); let collectionVariables = {}; collectionRequestVars.forEach((_var) => { if (_var.enabled) { @@ -78,7 +78,7 @@ const mergeVars = (collection, request, requestTreePath) => { } let resVars = new Map(); - let collectionResponseVars = get(collection, 'root.request.vars.res', []); + let collectionResponseVars = collection.draft ? get(collection, 'draft.request.vars.res', []) : get(collection, 'root.request.vars.res', []); collectionResponseVars.forEach((_var) => { if (_var.enabled) { resVars.set(_var.name, _var.value); @@ -113,9 +113,9 @@ const mergeVars = (collection, request, requestTreePath) => { }; const mergeScripts = (collection, request, requestTreePath, scriptFlow) => { - let collectionPreReqScript = get(collection, 'root.request.script.req', ''); - let collectionPostResScript = get(collection, 'root.request.script.res', ''); - let collectionTests = get(collection, 'root.request.tests', ''); + let collectionPreReqScript = collection.draft ? get(collection, 'draft.request.script.req') : get(collection, 'root.request.script.req', ''); + let collectionPostResScript = collection.draft ? get(collection, 'draft.request.script.res') : get(collection, 'root.request.script.res', ''); + let collectionTests = collection.draft ? get(collection, 'draft.request.tests', '') : get(collection, 'root.request.tests', ''); let combinedPreReqScript = []; let combinedPostResScript = []; @@ -137,7 +137,7 @@ const mergeScripts = (collection, request, requestTreePath, scriptFlow) => { combinedTests.push(tests); } } - } + }s request.script.req = compact([collectionPreReqScript, ...combinedPreReqScript, request?.script?.req || '']).join(os.EOL); diff --git a/packages/bruno-electron/src/app/watcher.js b/packages/bruno-electron/src/app/watcher.js index 43d01153d1..56bd68701f 100644 --- a/packages/bruno-electron/src/app/watcher.js +++ b/packages/bruno-electron/src/app/watcher.js @@ -66,7 +66,10 @@ const hydrateRequestWithUuid = (request, pathname) => { return request; }; -const hydrateBruCollectionFileWithUuid = (collectionRoot) => { +const hydrateBruCollectionFileWithUuid = (collectionRoot, pathname) => { + if(pathname) { + collectionRoot.uid = getRequestUid(pathname); + } const params = _.get(collectionRoot, 'request.params', []); const headers = _.get(collectionRoot, 'request.headers', []); const requestVars = _.get(collectionRoot, 'request.vars.req', []); @@ -256,7 +259,7 @@ const add = async (win, pathname, collectionUid, collectionPath) => { file.data = collectionBruToJson(bruContent); - hydrateBruCollectionFileWithUuid(file.data); + hydrateBruCollectionFileWithUuid(file.data, pathname); win.webContents.send('main:collection-tree-updated', 'addFile', file); return; } catch (err) { @@ -367,6 +370,33 @@ const change = async (win, pathname, collectionUid, collectionPath) => { } } + if (path.basename(pathname) === 'folder.bru') { + const file = { + meta: { + collectionUid, + pathname, + name: path.basename(pathname), + folderRoot: true + } + }; + + try { + let bruContent = fs.readFileSync(pathname, 'utf8'); + file.data = collectionBruToJson(bruContent); + + // Preserve the existing UID + const existingUid = getRequestUid(pathname); + file.data.uid = existingUid; + + hydrateBruCollectionFileWithUuid(file.data, pathname); + win.webContents.send('main:collection-tree-updated', 'change', file); + return; + } catch (err) { + console.error('Error handling folder.bru change:', err); + return; + } + } + if (hasBruExtension(pathname)) { try { const file = { diff --git a/packages/bruno-electron/src/utils/collection.js b/packages/bruno-electron/src/utils/collection.js index 15d5574e22..3a98ef57b5 100644 --- a/packages/bruno-electron/src/utils/collection.js +++ b/packages/bruno-electron/src/utils/collection.js @@ -4,7 +4,7 @@ const os = require('os'); const mergeHeaders = (collection, request, requestTreePath) => { let headers = new Map(); - let collectionHeaders = get(collection, 'root.request.headers', []); + let collectionHeaders = collection.draft ? get(collection, 'draft.request.headers', []) : get(collection, 'root.request.headers', []); collectionHeaders.forEach((header) => { if (header.enabled) { headers.set(header.name, header.value); @@ -37,7 +37,7 @@ const mergeHeaders = (collection, request, requestTreePath) => { const mergeVars = (collection, request, requestTreePath) => { let reqVars = new Map(); - let collectionRequestVars = get(collection, 'root.request.vars.req', []); + let collectionRequestVars = collection.draft ? get(collection, 'draft.request.vars.req', []) : get(collection, 'root.request.vars.req', []); let collectionVariables = {}; collectionRequestVars.forEach((_var) => { if (_var.enabled) { @@ -81,7 +81,7 @@ const mergeVars = (collection, request, requestTreePath) => { } let resVars = new Map(); - let collectionResponseVars = get(collection, 'root.request.vars.res', []); + let collectionResponseVars = collection.draft ? get(collection, 'draft.request.vars.res') : get(collection, 'root.request.vars.res', []); collectionResponseVars.forEach((_var) => { if (_var.enabled) { resVars.set(_var.name, _var.value); @@ -116,9 +116,9 @@ const mergeVars = (collection, request, requestTreePath) => { }; const mergeScripts = (collection, request, requestTreePath, scriptFlow) => { - let collectionPreReqScript = get(collection, 'root.request.script.req', ''); - let collectionPostResScript = get(collection, 'root.request.script.res', ''); - let collectionTests = get(collection, 'root.request.tests', ''); + let collectionPreReqScript = collection.draft ? get(collection, 'draft.request.script.req', '') : get(collection, 'root.request.script.req', ''); + let collectionPostResScript = collection.draft ? get(collection, 'draft.request.script.res', '') : get(collection, 'root.request.script.res', ''); + let collectionTests = collection.draft ? get(collection, 'draft.request.tests') : get(collection, 'root.request.tests', ''); let combinedPreReqScript = []; let combinedPostResScript = [];