usebruno/bruno · error · Error

directory: ${dir} already exists

Error message

directory: ${dir} already exists

What it means

Thrown by createDirectory when fs.existsSync(dir) is true. Unlike mkdirSync(recursive), createDirectory intentionally refuses to overwrite an existing directory — it is a create-not-overwrite primitive.

Source

Thrown at packages/bruno-electron/src/utils/filesystem.js:162

const hasRequestExtension = (filename, format = null) => {
  if (!filename || typeof filename !== 'string') return false;

  if (format) {
    const ext = format === 'yml' ? 'yml' : 'bru';
    return filename.toLowerCase().endsWith(`.${ext}`);
  }

  return ['bru', 'yml'].some((ext) => filename.toLowerCase().endsWith(`.${ext}`));
};

const createDirectory = async (dir) => {
  if (!dir) {
    throw new Error(`directory: path is null`);
  }

  if (fs.existsSync(dir)) {
    throw new Error(`directory: ${dir} already exists`);
  }

  return fs.mkdirSync(dir);
};

const browseDirectory = async (win) => {
  const { filePaths } = await dialog.showOpenDialog(win, {
    properties: ['openDirectory', 'createDirectory']
  });

  if (!filePaths || !filePaths[0]) {
    return false;
  }

  const resolvedPath = path.resolve(filePaths[0]);
  return isDirectory(resolvedPath) ? resolvedPath : false;
};

View on GitHub (pinned to 9bdd81c7bd)

Solutions

  1. Check existence first or switch to a unique-name strategy (generateUniqueName).
  2. If the existing directory is the intended target, skip creation rather than treating it as an error.
  3. Use fs.mkdirSync(dir, { recursive: true }) directly when overwrite-equivalent idempotency is desired.

Example fix

// before
if (fs.existsSync(dir)) {
  throw new Error(`directory: ${dir} already exists`);
}
return fs.mkdirSync(dir);

// after: idempotent when caller signals reuse
const createDirectory = async (dir, { existsOk = false } = {}) => {
  if (!dir) throw new Error('directory: path is null');
  if (fs.existsSync(dir)) {
    if (existsOk) return dir;
    throw new Error(`directory: ${dir} already exists`);
  }
  return fs.mkdirSync(dir);
};
Defensive patterns

Strategy: validation

Validate before calling

async function createDirectoryIdempotent(dir) {
  if (fs.existsSync(dir)) return dir;
  return createDirectory(dir);
}

Type guard

function directoryMissing(dir) {
  return !fs.existsSync(dir);
}

Try / catch

try {
  await createDirectory(dir);
} catch (err) {
  if (err.message.endsWith('already exists')) return dir; // idempotent success
  throw err;
}

Prevention

When it happens

Trigger: Calling createDirectory for a path that already exists on disk; two concurrent creations racing on the same path; retry after a partial run that already made the folder.

Common situations: Re-running an import/create after a previous success; duplicate folder name; a sync from git already populated the directory.

Related errors


AI-assisted analysis of usebruno/bruno@9bdd81c7bd (2026-08-13). Data as JSON: /api/errors/2603e71f318b53a5. Report an issue: GitHub.