You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							160 lines
						
					
					
						
							4.6 KiB
						
					
					
				
			
		
		
	
	
							160 lines
						
					
					
						
							4.6 KiB
						
					
					
				/*! | 
						|
 * 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;
 | 
						|
 |