oven-sh/bun · error · Error
Failed to write file ${file}
Error message
Failed to write file ${file} What it means
writeIfNotChanged writes generated content, then reads the file back and requires byte-for-byte equality. The helper already retries once after mkdir-ing the parent directory, so this error means the write silently failed or the file on disk does not match what was written.
Source
Thrown at src/codegen/helpers.ts:60
if (Array.isArray(contents)) contents = contents.join("");
contents = contents.replaceAll("\r\n", "\n").trim() + "\n";
try {
const oldContents = fs.readFileSync(file, "utf8");
if (oldContents === contents) {
return;
}
} catch (e) {}
try {
fs.writeFileSync(file, contents);
} catch (error) {
fs.mkdirSync(path.dirname(file), { recursive: true });
fs.writeFileSync(file, contents);
}
if (fs.readFileSync(file, "utf8") !== contents) {
throw new Error(`Failed to write file ${file}`);
}
}
export function writeIfNotChangedBinary(file: string, contents: Buffer) {
try {
if (fs.readFileSync(file).equals(contents)) return;
} catch {}
try {
fs.writeFileSync(file, contents);
} catch {
fs.mkdirSync(path.dirname(file), { recursive: true });
fs.writeFileSync(file, contents);
}
}
export function readdirRecursiveWithExclusionsAndExtensionsSync(
dir: string,
exclusions: string[],View on GitHub (pinned to 8c5296ac45)
Solutions
- Check disk space and write permissions on the output directory (df -h, ls -ld), then rerun the build.
- Make sure the output path is a file location, not an existing directory, and that no symlink loop or case-insensitive collision shadows it.
- Exclude build output directories from antivirus/sync tools, then rebuild.
Defensive patterns
Strategy: retry
Validate before calling
import fs from "node:fs";
function canWrite(file: string) {
try {
fs.accessSync(file.endsWith("/") ? file : fs.dirnameSync?.(file) ?? ".", fs.constants.W_OK);
fs.statSync(file);
return !fs.statSync(file).isDirectory();
} catch {
return false;
}
} Try / catch
try {
writeIfNotChanged(outFile, contents);
} catch (e) {
if (process.platform === "win32" && (e as NodeJS.ErrnoException).code === "EPERM") {
fs.rmSync(outFile, { force: true });
writeIfNotChanged(outFile, contents); // single retry after clearing the blocker
} else {
throw e;
}
} Prevention
- Run builds with adequate free disk space (check df before long builds).
- Keep generated-output directories out of cloud-sync and antivirus scan scopes.
- Never point two generators at the same output file concurrently.
When it happens
Trigger: Out-of-space disk filling during write, a read-only or permission-denied directory where writeFileSync appears to succeed, the target path existing as a directory, or an external process (antivirus, sync client) rewriting the file between write and read-back.
Common situations: Full disk / full Docker volume during `bun run build`; building into a checkout owned by another user; case-insensitive filesystem collisions; cloud-sync folders normalizing file content.
Related errors
- not implemented right
- file did not exist after write: ${outputPath}
- generate-string-map: duplicate key ${JSON.stringify(k)} in $
- blob.text() failed
- Your package manager doesn't seem to support bun. To use bun
AI-assisted analysis of oven-sh/bun@8c5296ac45 (2026-08-16).
Data as JSON: /api/errors/d5272f38d2002573.
Report an issue: GitHub.