// 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', 'fchmod', 'fchown', 'fdatasync', 'fstat', 'fsync', 'ftruncate', 'futimes', 'lchown', 'link', 'lstat', 'mkdir', 'open', 'readFile', 'readdir', 'readlink', 'realpath', 'rename', 'rmdir', 'stat', 'symlink', 'truncate', 'unlink', 'utimes', 'writeFile' ] // fs.mkdtemp() was added in Node.js v5.10.0, so check if it exists typeof fs.mkdtemp === 'function' && api.push('mkdtemp') // 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) // so we need to handle both cases exports.write = function (fd, buffer, a, b, c, callback) { if (typeof arguments[arguments.length - 1] === 'function') { return fs.write(fd, buffer, a, b, c, callback) } // Check for old, depricated fs.write(fd, string[, position[, encoding]], callback) if (typeof buffer === 'string') { return new Promise((resolve, reject) => { fs.write(fd, buffer, a, b, (err, bytesWritten, buffer) => { if (err) return reject(err) resolve({ bytesWritten, buffer }) }) }) } return new Promise((resolve, reject) => { fs.write(fd, buffer, a, b, c, (err, bytesWritten, buffer) => { if (err) return reject(err) resolve({ bytesWritten, buffer }) }) }) }