fix: invalid collection in workspace (#6612)

This commit is contained in:
naman-bruno
2026-01-02 01:21:44 +05:30
committed by GitHub
parent f961e692ee
commit b3764e1703
4 changed files with 48 additions and 14 deletions

View File

@@ -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);

View File

@@ -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 {

View File

@@ -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,

View File

@@ -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;
});
};