diff --git a/packages/bruno-electron/src/ipc/workspace.js b/packages/bruno-electron/src/ipc/workspace.js index 34a825191..21badfcc8 100644 --- a/packages/bruno-electron/src/ipc/workspace.js +++ b/packages/bruno-electron/src/ipc/workspace.js @@ -27,17 +27,34 @@ const { getWorkspaceUid } = require('../utils/workspace-config'); +const { isValidCollectionDirectory } = require('../utils/filesystem'); + const DEFAULT_WORKSPACE_NAME = 'My Workspace'; -const prepareWorkspaceConfigForClient = (workspaceConfig, isDefault) => { +const prepareWorkspaceConfigForClient = (workspaceConfig, workspacePath, isDefault) => { + const collections = workspaceConfig.collections || []; + const filteredCollections = collections + .map((collection) => { + if (collection.path && !path.isAbsolute(collection.path)) { + return { ...collection, path: path.resolve(workspacePath, collection.path) }; + } + return collection; + }) + .filter((collection) => collection.path && isValidCollectionDirectory(collection.path)); + + const config = { + ...workspaceConfig, + collections: filteredCollections + }; + if (isDefault) { return { - ...workspaceConfig, + ...config, name: DEFAULT_WORKSPACE_NAME, type: 'default' }; } - return workspaceConfig; + return config; }; const registerWorkspaceIpc = (mainWindow, workspaceWatcher) => { @@ -72,7 +89,7 @@ const registerWorkspaceIpc = (mainWindow, workspaceWatcher) => { lastOpenedWorkspaces.add(dirPath); - const configForClient = prepareWorkspaceConfigForClient(workspaceConfig, isDefault); + const configForClient = prepareWorkspaceConfigForClient(workspaceConfig, dirPath, isDefault); mainWindow.webContents.send('main:workspace-opened', dirPath, workspaceUid, configForClient); @@ -99,7 +116,7 @@ const registerWorkspaceIpc = (mainWindow, workspaceWatcher) => { const workspaceUid = getWorkspaceUid(workspacePath); const isDefault = workspaceUid === 'default'; - const configForClient = prepareWorkspaceConfigForClient(workspaceConfig, isDefault); + const configForClient = prepareWorkspaceConfigForClient(workspaceConfig, workspacePath, isDefault); lastOpenedWorkspaces.add(workspacePath); @@ -139,7 +156,7 @@ const registerWorkspaceIpc = (mainWindow, workspaceWatcher) => { const workspaceUid = getWorkspaceUid(workspacePath); const isDefault = workspaceUid === 'default'; - const configForClient = prepareWorkspaceConfigForClient(workspaceConfig, isDefault); + const configForClient = prepareWorkspaceConfigForClient(workspaceConfig, workspacePath, isDefault); lastOpenedWorkspaces.add(workspacePath); @@ -374,7 +391,7 @@ const registerWorkspaceIpc = (mainWindow, workspaceWatcher) => { const workspaceUid = getWorkspaceUid(finalWorkspacePath); const isDefault = workspaceUid === 'default'; - const configForClient = prepareWorkspaceConfigForClient(finalConfig, isDefault); + const configForClient = prepareWorkspaceConfigForClient(finalConfig, finalWorkspacePath, isDefault); lastOpenedWorkspaces.add(finalWorkspacePath); @@ -503,7 +520,7 @@ const registerWorkspaceIpc = (mainWindow, workspaceWatcher) => { const workspaceConfig = readWorkspaceConfig(workspacePath); const workspaceUid = getWorkspaceUid(workspacePath); const isDefault = workspaceUid === 'default'; - const configForClient = prepareWorkspaceConfigForClient(workspaceConfig, isDefault); + const configForClient = prepareWorkspaceConfigForClient(workspaceConfig, workspacePath, isDefault); mainWindow.webContents.send('main:workspace-config-updated', workspacePath, workspaceUid, configForClient); return updatedCollections; @@ -545,7 +562,7 @@ const registerWorkspaceIpc = (mainWindow, workspaceWatcher) => { const correctWorkspaceUid = getWorkspaceUid(workspacePath); const isDefault = correctWorkspaceUid === 'default'; - const configForClient = prepareWorkspaceConfigForClient(result.updatedConfig, isDefault); + const configForClient = prepareWorkspaceConfigForClient(result.updatedConfig, workspacePath, isDefault); mainWindow.webContents.send('main:workspace-config-updated', workspacePath, correctWorkspaceUid, configForClient); return true; @@ -597,7 +614,7 @@ const registerWorkspaceIpc = (mainWindow, workspaceWatcher) => { const { workspacePath, workspaceUid } = result; const workspaceConfig = readWorkspaceConfig(workspacePath); - const configForClient = prepareWorkspaceConfigForClient(workspaceConfig, true); + const configForClient = prepareWorkspaceConfigForClient(workspaceConfig, workspacePath, true); return { workspaceConfig: configForClient, @@ -627,7 +644,7 @@ const registerWorkspaceIpc = (mainWindow, workspaceWatcher) => { const { workspacePath, workspaceUid } = defaultResult; defaultWorkspacePath = workspacePath; const workspaceConfig = readWorkspaceConfig(workspacePath); - const configForClient = prepareWorkspaceConfigForClient(workspaceConfig, true); + const configForClient = prepareWorkspaceConfigForClient(workspaceConfig, workspacePath, true); win.webContents.send('main:workspace-opened', workspacePath, workspaceUid, configForClient); @@ -652,7 +669,7 @@ const registerWorkspaceIpc = (mainWindow, workspaceWatcher) => { validateWorkspaceConfig(workspaceConfig); const workspaceUid = getWorkspaceUid(workspacePath); const isDefault = workspaceUid === 'default'; - const configForClient = prepareWorkspaceConfigForClient(workspaceConfig, isDefault); + const configForClient = prepareWorkspaceConfigForClient(workspaceConfig, workspacePath, isDefault); win.webContents.send('main:workspace-opened', workspacePath, workspaceUid, configForClient); diff --git a/packages/bruno-electron/src/store/default-workspace.js b/packages/bruno-electron/src/store/default-workspace.js index b2bb6a0ad..4c66ae66d 100644 --- a/packages/bruno-electron/src/store/default-workspace.js +++ b/packages/bruno-electron/src/store/default-workspace.js @@ -2,7 +2,7 @@ const fs = require('fs'); const path = require('path'); const { app } = require('electron'); const { generateUidBasedOnHash } = require('../utils/common'); -const { writeFile } = require('../utils/filesystem'); +const { writeFile, isValidCollectionDirectory } = require('../utils/filesystem'); const { getPreferences, savePreferences } = require('./preferences'); const { globalEnvironmentsStore } = require('./global-environments'); const { @@ -178,6 +178,10 @@ class DefaultWorkspaceManager { } seenPaths.add(normalizedPath); + if (!isValidCollectionDirectory(absolutePath)) { + return null; + } + const collectionName = path.basename(absolutePath); return { diff --git a/packages/bruno-electron/src/utils/filesystem.js b/packages/bruno-electron/src/utils/filesystem.js index a49d6e7c8..90406d8dc 100644 --- a/packages/bruno-electron/src/utils/filesystem.js +++ b/packages/bruno-electron/src/utils/filesystem.js @@ -38,6 +38,15 @@ const isDirectory = (dirPath) => { } }; +const isValidCollectionDirectory = (dirPath) => { + if (!isDirectory(dirPath)) { + return false; + } + const brunoJsonPath = path.join(dirPath, 'bruno.json'); + const opencollectionYmlPath = path.join(dirPath, 'opencollection.yml'); + return fs.existsSync(brunoJsonPath) || fs.existsSync(opencollectionYmlPath); +}; + const hasSubDirectories = (dir) => { const files = fs.readdirSync(dir); return files.some((file) => fs.statSync(path.join(dir, file)).isDirectory()); @@ -452,6 +461,7 @@ module.exports = { isSymbolicLink, isFile, isDirectory, + isValidCollectionDirectory, normalizeAndResolvePath, isWSLPath, normalizeWSLPath, diff --git a/packages/bruno-electron/src/utils/workspace-config.js b/packages/bruno-electron/src/utils/workspace-config.js index d6f8f00fb..002942ae8 100644 --- a/packages/bruno-electron/src/utils/workspace-config.js +++ b/packages/bruno-electron/src/utils/workspace-config.js @@ -3,7 +3,7 @@ const path = require('path'); const os = require('os'); const yaml = require('js-yaml'); const crypto = require('node:crypto'); -const { writeFile, validateName } = require('./filesystem'); +const { writeFile, validateName, isValidCollectionDirectory } = require('./filesystem'); const { generateUidBasedOnHash } = require('./common'); const { withLock, getWorkspaceLockKey } = require('./workspace-lock'); @@ -420,6 +420,9 @@ const getWorkspaceCollections = (workspacePath) => { return false; } seenPaths.add(normalizedPath); + if (!isValidCollectionDirectory(collection.path)) { + return false; + } return true; }); };