99 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			99 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
|  | 'use strict' | ||
|  | // This is adapted from https://github.com/normalize/mz
 | ||
|  | // Copyright (c) 2014-2016 Jonathan Ong me@jongleberry.com and Contributors
 | ||
|  | const u = require('universalify').fromCallback | ||
|  | const fs = require('graceful-fs') | ||
|  | 
 | ||
|  | const api = [ | ||
|  |   'access', | ||
|  |   'appendFile', | ||
|  |   'chmod', | ||
|  |   'chown', | ||
|  |   'close', | ||
|  |   'copyFile', | ||
|  |   'fchmod', | ||
|  |   'fchown', | ||
|  |   'fdatasync', | ||
|  |   'fstat', | ||
|  |   'fsync', | ||
|  |   'ftruncate', | ||
|  |   'futimes', | ||
|  |   'lchown', | ||
|  |   'link', | ||
|  |   'lstat', | ||
|  |   'mkdir', | ||
|  |   'mkdtemp', | ||
|  |   'open', | ||
|  |   'readFile', | ||
|  |   'readdir', | ||
|  |   'readlink', | ||
|  |   'realpath', | ||
|  |   'rename', | ||
|  |   'rmdir', | ||
|  |   'stat', | ||
|  |   'symlink', | ||
|  |   'truncate', | ||
|  |   'unlink', | ||
|  |   'utimes', | ||
|  |   'writeFile' | ||
|  | ].filter(key => { | ||
|  |   // Some commands are not available on some systems. Ex:
 | ||
|  |   // fs.copyFile was added in Node.js v8.5.0
 | ||
|  |   // fs.mkdtemp was added in Node.js v5.10.0
 | ||
|  |   // fs.lchown is not available on at least some Linux
 | ||
|  |   return typeof fs[key] === 'function' | ||
|  | }) | ||
|  | 
 | ||
|  | // Export all keys:
 | ||
|  | Object.keys(fs).forEach(key => { | ||
|  |   exports[key] = fs[key] | ||
|  | }) | ||
|  | 
 | ||
|  | // Universalify async methods:
 | ||
|  | api.forEach(method => { | ||
|  |   exports[method] = u(fs[method]) | ||
|  | }) | ||
|  | 
 | ||
|  | // We differ from mz/fs in that we still ship the old, broken, fs.exists()
 | ||
|  | // since we are a drop-in replacement for the native module
 | ||
|  | exports.exists = function (filename, callback) { | ||
|  |   if (typeof callback === 'function') { | ||
|  |     return fs.exists(filename, callback) | ||
|  |   } | ||
|  |   return new Promise(resolve => { | ||
|  |     return fs.exists(filename, resolve) | ||
|  |   }) | ||
|  | } | ||
|  | 
 | ||
|  | // fs.read() & fs.write need special treatment due to multiple callback args
 | ||
|  | 
 | ||
|  | exports.read = function (fd, buffer, offset, length, position, callback) { | ||
|  |   if (typeof callback === 'function') { | ||
|  |     return fs.read(fd, buffer, offset, length, position, callback) | ||
|  |   } | ||
|  |   return new Promise((resolve, reject) => { | ||
|  |     fs.read(fd, buffer, offset, length, position, (err, bytesRead, buffer) => { | ||
|  |       if (err) return reject(err) | ||
|  |       resolve({ bytesRead, buffer }) | ||
|  |     }) | ||
|  |   }) | ||
|  | } | ||
|  | 
 | ||
|  | // Function signature can be
 | ||
|  | // fs.write(fd, buffer[, offset[, length[, position]]], callback)
 | ||
|  | // OR
 | ||
|  | // fs.write(fd, string[, position[, encoding]], callback)
 | ||
|  | // We need to handle both cases, so we use ...args
 | ||
|  | exports.write = function (fd, buffer, ...args) { | ||
|  |   if (typeof args[args.length - 1] === 'function') { | ||
|  |     return fs.write(fd, buffer, ...args) | ||
|  |   } | ||
|  | 
 | ||
|  |   return new Promise((resolve, reject) => { | ||
|  |     fs.write(fd, buffer, ...args, (err, bytesWritten, buffer) => { | ||
|  |       if (err) return reject(err) | ||
|  |       resolve({ bytesWritten, buffer }) | ||
|  |     }) | ||
|  |   }) | ||
|  | } |