diff --git a/packages/bruno-app/src/components/RunnerResults/RunConfigurationPanel/index.jsx b/packages/bruno-app/src/components/RunnerResults/RunConfigurationPanel/index.jsx index f9eb07e87..c25ae74c7 100644 --- a/packages/bruno-app/src/components/RunnerResults/RunConfigurationPanel/index.jsx +++ b/packages/bruno-app/src/components/RunnerResults/RunConfigurationPanel/index.jsx @@ -164,7 +164,7 @@ const RunConfigurationPanel = ({ collection, selectedItems, setSelectedItems }) if (!items?.length) return; items.forEach((item) => { - if (isItemARequest(item) && !item.partial) { + if (isItemARequest(item) && !item.partial && !item.isTransient) { const relativePath = path.relative(collection.pathname, path.dirname(item.pathname)); const folderPath = relativePath !== '.' ? relativePath : ''; diff --git a/packages/bruno-app/src/utils/collections/export.js b/packages/bruno-app/src/utils/collections/export.js index 43b25efb2..db4e4de24 100644 --- a/packages/bruno-app/src/utils/collections/export.js +++ b/packages/bruno-app/src/utils/collections/export.js @@ -1,6 +1,7 @@ import * as FileSaver from 'file-saver'; import get from 'lodash/get'; import each from 'lodash/each'; +import { filterTransientItems } from 'utils/collections'; export const deleteUidsInItems = (items) => { each(items, (item) => { @@ -101,6 +102,9 @@ export const exportCollection = (collection, version) => { delete collection.processEnvVariables; delete collection.workspaceProcessEnvVariables; + // filter out transient items + collection.items = filterTransientItems(collection.items); + deleteUidsInItems(collection.items); deleteUidsInEnvs(collection.environments); deleteSecretsInEnvs(collection.environments); diff --git a/packages/bruno-app/src/utils/collections/index.js b/packages/bruno-app/src/utils/collections/index.js index 1eb231285..7b11d31b7 100644 --- a/packages/bruno-app/src/utils/collections/index.js +++ b/packages/bruno-app/src/utils/collections/index.js @@ -294,6 +294,11 @@ export const transformCollectionToSaveToExportAsFile = (collection, options = {} return; } + // Skip transient requests + if (si.isTransient) { + return; + } + const isGrpcRequest = si.type === 'grpc-request'; const di = { @@ -1159,7 +1164,7 @@ const getPathParams = (item) => { export const getTotalRequestCountInCollection = (collection) => { let count = 0; each(collection.items, (item) => { - if (isItemARequest(item)) { + if (isItemARequest(item) && !item.isTransient) { count++; } else if (isItemAFolder(item)) { count += getTotalRequestCountInCollection(item); @@ -1468,7 +1473,7 @@ export const getRequestItemsForCollectionRun = ({ recursive, items = [], tags }) } const requestTypes = ['http-request', 'graphql-request']; - requestItems = requestItems.filter((request) => requestTypes.includes(request.type)); + requestItems = requestItems.filter((request) => requestTypes.includes(request.type) && !request.isTransient); if (tags && tags.include && tags.exclude) { const includeTags = tags.include ? tags.include : []; @@ -1708,3 +1713,27 @@ export const generateUniqueRequestName = async (collection, baseName = 'Untitled export const isItemTransientRequest = (item) => { return isItemARequest(item) && item?.isTransient; }; + +/** + * Recursively filter out transient items from a collection's items array. + * Used for collection runner, exports, and other operations that shouldn't include transient requests. + * @param {Array} items - The items array to filter + * @returns {Array} A new array with transient items removed + */ +export const filterTransientItems = (items) => { + if (!items || !Array.isArray(items)) { + return []; + } + + return items + .filter((item) => !item?.isTransient) + .map((item) => { + if (item.items && item.items.length > 0) { + return { + ...item, + items: filterTransientItems(item.items) + }; + } + return item; + }); +}; diff --git a/packages/bruno-app/src/utils/exporters/opencollection.js b/packages/bruno-app/src/utils/exporters/opencollection.js index 93f996540..60a8697c4 100644 --- a/packages/bruno-app/src/utils/exporters/opencollection.js +++ b/packages/bruno-app/src/utils/exporters/opencollection.js @@ -2,8 +2,12 @@ import * as FileSaver from 'file-saver'; import jsyaml from 'js-yaml'; import { brunoToOpenCollection } from '@usebruno/converters'; import { sanitizeName } from 'utils/common/regex'; +import { filterTransientItems } from 'utils/collections'; export const exportCollection = (collection, version) => { + // Filter out transient items before export + collection.items = filterTransientItems(collection.items); + const openCollection = brunoToOpenCollection(collection); if (!openCollection.extensions) { diff --git a/packages/bruno-app/src/utils/exporters/postman-collection.js b/packages/bruno-app/src/utils/exporters/postman-collection.js index 06e8c3f0a..87694c652 100644 --- a/packages/bruno-app/src/utils/exporters/postman-collection.js +++ b/packages/bruno-app/src/utils/exporters/postman-collection.js @@ -1,7 +1,11 @@ import * as FileSaver from 'file-saver'; import { brunoToPostman } from '@usebruno/converters'; +import { filterTransientItems } from 'utils/collections'; export const exportCollection = (collection) => { + // Filter out transient items before export + collection.items = filterTransientItems(collection.items); + const collectionToExport = brunoToPostman(collection); const fileName = `${collection.name}.json`; diff --git a/packages/bruno-electron/src/ipc/network/index.js b/packages/bruno-electron/src/ipc/network/index.js index 0fdf02ecc..222794d9b 100644 --- a/packages/bruno-electron/src/ipc/network/index.js +++ b/packages/bruno-electron/src/ipc/network/index.js @@ -1243,7 +1243,8 @@ const registerNetworkIpc = (mainWindow) => { folderRequests = getAllRequestsInFolderRecursively(sortedFolder); } else { each(folder.items, (item) => { - if (item.request) { + // Skip transient requests + if (item.request && !item.isTransient) { folderRequests.push(item); } }); diff --git a/packages/bruno-electron/src/utils/collection.js b/packages/bruno-electron/src/utils/collection.js index 7e579bf10..b6ae87102 100644 --- a/packages/bruno-electron/src/utils/collection.js +++ b/packages/bruno-electron/src/utils/collection.js @@ -575,6 +575,10 @@ const getAllRequestsInFolderRecursively = (folder = {}) => { if (folder.items && folder.items.length) { folder.items.forEach((item) => { + // Skip transient requests + if (item.isTransient) { + return; + } if (item.type !== 'folder') { requests.push(item); } else {