import { writeFile as fsWriteFile, rename, unlink } from 'node:fs/promises' import { randomBytes } from 'node:crypto' // Drop-in replacement for fs.promises.writeFile that never leaves a truncated // file behind: the data goes to a sibling temp file which is then renamed over // the target (atomic on the same filesystem). A crash mid-write leaves the // previous version intact instead of a half-written JSON file. export async function writeFile(file, data, options) { const tmp = `${file}.${process.pid}.${randomBytes(4).toString('hex')}.tmp` try { await fsWriteFile(tmp, data, options) await rename(tmp, file) } catch (err) { await unlink(tmp).catch(() => {}) throw err } }