write-to-file
Version:
Writes data to file and automatically create its directories if not exists.
64 lines (51 loc) • 1.37 kB
JavaScript
const fs = require("fs");
const path = require("path");
const util = require("util");
const createDir = require("create-dir");
const writeFile = util.promisify(fs.writeFile);
const DEFAULT_OPTIONS = {
encoding: "utf8",
mode: 0o666,
flag: "w",
createDirMode: 0o777
};
const parseOptions = options => {
let userOptions = options;
if (typeof options === "string") {
userOptions = { encoding: options };
}
const {
encoding = DEFAULT_OPTIONS.encoding,
mode = DEFAULT_OPTIONS.mode,
flag = DEFAULT_OPTIONS.flag,
createDirMode = DEFAULT_OPTIONS.createDirMode
} = userOptions;
return {
writeOptions: { encoding, mode, flag },
createDirMode
};
};
const isDirNotExists = error => error.code === "ENOENT";
/**
* Writes data to a file.
*
* @param {String} file
* @param {String|Buffer} data
* @param {Object|String} options
* @return {Promise}
*/
const writeToFile = async (file, data, options = DEFAULT_OPTIONS) => {
const { writeOptions, createDirMode } = parseOptions(options);
try {
await writeFile(file, data, writeOptions);
} catch (error) {
if (isDirNotExists(error)) {
await createDir(path.dirname(file), createDirMode);
await writeToFile(file, data, { ...writeOptions, createDirMode });
} else {
throw error;
}
}
return true;
};
module.exports = writeToFile;