@visulima/fs
Version:
Human friendly file system utilities for Node.js
61 lines (57 loc) • 2.24 kB
JavaScript
;
const promises = require('node:fs/promises');
const path = require('@visulima/path');
const utils = require('@visulima/path/utils');
const F_OK = require('./F_OK-CWSqQIdF.cjs');
const isAccessible = require('./isAccessible-ZNVGsSb7.cjs');
const assertValidFileContents = require('./assertValidFileContents-CRVvyM6b.cjs');
const assertValidFileOrDirectoryPath = require('./assertValidFileOrDirectoryPath-BMbgA-eI.cjs');
const toUint8Array = require('./to-uint-8-array-BaTEyX3D.cjs');
var __defProp = Object.defineProperty;
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
const writeFile = /* @__PURE__ */ __name(async (path$1, content, options) => {
options = {
encoding: "utf8",
flag: "w",
overwrite: true,
recursive: true,
...options
};
assertValidFileOrDirectoryPath(path$1);
assertValidFileContents(content);
path$1 = utils.toPath(path$1);
try {
const pathExists = await isAccessible(path$1, F_OK.F_OK);
if (!pathExists && options.recursive) {
const directory = path.dirname(path$1);
if (!await isAccessible(directory, F_OK.F_OK)) {
await promises.mkdir(directory, { recursive: true });
}
}
let stat;
await promises.writeFile(`${path$1}.tmp`, toUint8Array.toUint8Array(content), { encoding: options.encoding, flag: options.flag });
if (pathExists && !options.overwrite) {
stat = await promises.stat(path$1);
if (options.chown === undefined) {
options.chown = { gid: stat.gid, uid: stat.uid };
}
await promises.rename(path$1, `${path$1}.bak`);
}
const temporaryPath = `${path$1}.tmp`;
if (options.chown) {
try {
await promises.chown(temporaryPath, options.chown.uid, options.chown.gid);
} catch {
}
}
await promises.chmod(temporaryPath, stat && !options.mode ? stat.mode : options.mode ?? 438);
await promises.rename(temporaryPath, path$1);
} catch (error) {
throw new Error(`Failed to write file at: ${path$1} - ${error.message}`, { cause: error });
} finally {
if (await isAccessible(`${path$1}.tmp`)) {
await promises.unlink(`${path$1}.tmp`);
}
}
}, "writeFile");
module.exports = writeFile;