UNPKG

@visulima/fs

Version:

Human friendly file system utilities for Node.js

61 lines (57 loc) 2.24 kB
'use strict'; 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;