| /*! | |
| * write <https://github.com/jonschlinkert/write> | |
| * | |
| * Copyright (c) 2014-2017, Jon Schlinkert. | |
| * Released under the MIT License. | |
| */ | |
| 'use strict'; | |
| var fs = require('fs'); | |
| var path = require('path'); | |
| var mkdirp = require('mkdirp'); | |
| /** | |
| * Asynchronously writes data to a file, replacing the file if it already | |
| * exists and creating any intermediate directories if they don't already | |
| * exist. Data can be a string or a buffer. Returns a promise if a callback | |
| * function is not passed. | |
| * | |
| * ```js | |
| * var writeFile = require('write'); | |
| * writeFile('foo.txt', 'This is content...', function(err) { | |
| * if (err) console.log(err); | |
| * }); | |
| * | |
| * // promise | |
| * writeFile('foo.txt', 'This is content...') | |
| * .then(function() { | |
| * // do stuff | |
| * }); | |
| * ``` | |
| * @name writeFile | |
| * @param {string|Buffer|integer} `filepath` filepath or file descriptor. | |
| * @param {string|Buffer|Uint8Array} `data` String to write to disk. | |
| * @param {object} `options` Options to pass to [fs.writeFile][fs]{#fs_fs_writefile_file_data_options_callback} and/or [mkdirp][] | |
| * @param {Function} `callback` (optional) If no callback is provided, a promise is returned. | |
| * @api public | |
| */ | |
| function writeFile(filepath, data, options, cb) { | |
| if (typeof options === 'function') { | |
| cb = options; | |
| options = {}; | |
| } | |
| if (typeof cb !== 'function') { | |
| return writeFile.promise.apply(null, arguments); | |
| } | |
| if (typeof filepath !== 'string') { | |
| cb(new TypeError('expected filepath to be a string')); | |
| return; | |
| } | |
| mkdirp(path.dirname(filepath), options, function(err) { | |
| if (err) { | |
| cb(err); | |
| return; | |
| } | |
| fs.writeFile(filepath, data, options, cb); | |
| }); | |
| }; | |
| /** | |
| * The promise version of [writeFile](#writefile). Returns a promise. | |
| * | |
| * ```js | |
| * var writeFile = require('write'); | |
| * writeFile.promise('foo.txt', 'This is content...') | |
| * .then(function() { | |
| * // do stuff | |
| * }); | |
| * ``` | |
| * @name .promise | |
| * @param {string|Buffer|integer} `filepath` filepath or file descriptor. | |
| * @param {string|Buffer|Uint8Array} `val` String or buffer to write to disk. | |
| * @param {object} `options` Options to pass to [fs.writeFile][fs]{#fs_fs_writefile_file_data_options_callback} and/or [mkdirp][] | |
| * @return {Promise} | |
| * @api public | |
| */ | |
| writeFile.promise = function(filepath, val, options) { | |
| if (typeof filepath !== 'string') { | |
| return Promise.reject(new TypeError('expected filepath to be a string')); | |
| } | |
| return new Promise(function(resolve, reject) { | |
| mkdirp(path.dirname(filepath), options, function(err) { | |
| if (err) { | |
| reject(err); | |
| return; | |
| } | |
| fs.writeFile(filepath, val, options, function(err) { | |
| if (err) { | |
| reject(err); | |
| return; | |
| } | |
| resolve(val); | |
| }); | |
| }); | |
| }); | |
| }; | |
| /** | |
| * The synchronous version of [writeFile](#writefile). Returns undefined. | |
| * | |
| * ```js | |
| * var writeFile = require('write'); | |
| * writeFile.sync('foo.txt', 'This is content...'); | |
| * ``` | |
| * @name .sync | |
| * @param {string|Buffer|integer} `filepath` filepath or file descriptor. | |
| * @param {string|Buffer|Uint8Array} `data` String or buffer to write to disk. | |
| * @param {object} `options` Options to pass to [fs.writeFileSync][fs]{#fs_fs_writefilesync_file_data_options} and/or [mkdirp][] | |
| * @return {undefined} | |
| * @api public | |
| */ | |
| writeFile.sync = function(filepath, data, options) { | |
| if (typeof filepath !== 'string') { | |
| throw new TypeError('expected filepath to be a string'); | |
| } | |
| mkdirp.sync(path.dirname(filepath), options); | |
| fs.writeFileSync(filepath, data, options); | |
| }; | |
| /** | |
| * Uses `fs.createWriteStream` to write data to a file, replacing the | |
| * file if it already exists and creating any intermediate directories | |
| * if they don't already exist. Data can be a string or a buffer. Returns | |
| * a new [WriteStream](https://nodejs.org/api/fs.html#fs_class_fs_writestream) | |
| * object. | |
| * | |
| * ```js | |
| * var fs = require('fs'); | |
| * var writeFile = require('write'); | |
| * fs.createReadStream('README.md') | |
| * .pipe(writeFile.stream('a/b/c/other-file.md')) | |
| * .on('close', function() { | |
| * // do stuff | |
| * }); | |
| * ``` | |
| * @name .stream | |
| * @param {string|Buffer|integer} `filepath` filepath or file descriptor. | |
| * @param {object} `options` Options to pass to [mkdirp][] and [fs.createWriteStream][fs]{#fs_fs_createwritestream_path_options} | |
| * @return {Stream} Returns a new [WriteStream](https://nodejs.org/api/fs.html#fs_class_fs_writestream) object. (See [Writable Stream](https://nodejs.org/api/stream.html#stream_class_stream_writable)). | |
| * @api public | |
| */ | |
| writeFile.stream = function(filepath, options) { | |
| mkdirp.sync(path.dirname(filepath), options); | |
| return fs.createWriteStream(filepath, options); | |
| }; | |
| /** | |
| * Expose `writeFile` | |
| */ | |
| module.exports = writeFile; |