| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 | 'use strict'// This is adapted from https://github.com/normalize/mz// Copyright (c) 2014-2016 Jonathan Ong me@jongleberry.com and Contributorsconst u = require('universalify').fromCallbackconst fs = require('graceful-fs')const api = [  'access',  'appendFile',  'chmod',  'chown',  'close',  'copyFile',  'fchmod',  'fchown',  'fdatasync',  'fstat',  'fsync',  'ftruncate',  'futimes',  'lchown',  'lchmod',  '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 => {  if (key === 'promises') {    // fs.promises is a getter property that triggers ExperimentalWarning    // Don't re-export it here, the getter is defined in "lib/index.js"    return  }  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 moduleexports.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 argsexports.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 ...argsexports.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 })    })  })}
 |