index.js 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. // This is adapted from https://github.com/normalize/mz
  2. // Copyright (c) 2014-2016 Jonathan Ong me@jongleberry.com and Contributors
  3. const u = require('universalify').fromCallback
  4. const fs = require('graceful-fs')
  5. const api = [
  6. 'access',
  7. 'appendFile',
  8. 'chmod',
  9. 'chown',
  10. 'close',
  11. 'copyFile',
  12. 'fchmod',
  13. 'fchown',
  14. 'fdatasync',
  15. 'fstat',
  16. 'fsync',
  17. 'ftruncate',
  18. 'futimes',
  19. 'lchown',
  20. 'link',
  21. 'lstat',
  22. 'mkdir',
  23. 'mkdtemp',
  24. 'open',
  25. 'readFile',
  26. 'readdir',
  27. 'readlink',
  28. 'realpath',
  29. 'rename',
  30. 'rmdir',
  31. 'stat',
  32. 'symlink',
  33. 'truncate',
  34. 'unlink',
  35. 'utimes',
  36. 'writeFile'
  37. ].filter(key => {
  38. // Some commands are not available on some systems. Ex:
  39. // fs.copyFile was added in Node.js v8.5.0
  40. // fs.mkdtemp was added in Node.js v5.10.0
  41. // fs.lchown is not available on at least some Linux
  42. return typeof fs[key] === 'function'
  43. })
  44. // Export all keys:
  45. Object.keys(fs).forEach(key => {
  46. exports[key] = fs[key]
  47. })
  48. // Universalify async methods:
  49. api.forEach(method => {
  50. exports[method] = u(fs[method])
  51. })
  52. // We differ from mz/fs in that we still ship the old, broken, fs.exists()
  53. // since we are a drop-in replacement for the native module
  54. exports.exists = function (filename, callback) {
  55. if (typeof callback === 'function') {
  56. return fs.exists(filename, callback)
  57. }
  58. return new Promise(resolve => {
  59. return fs.exists(filename, resolve)
  60. })
  61. }
  62. // fs.read() & fs.write need special treatment due to multiple callback args
  63. exports.read = function (fd, buffer, offset, length, position, callback) {
  64. if (typeof callback === 'function') {
  65. return fs.read(fd, buffer, offset, length, position, callback)
  66. }
  67. return new Promise((resolve, reject) => {
  68. fs.read(fd, buffer, offset, length, position, (err, bytesRead, buffer) => {
  69. if (err) return reject(err)
  70. resolve({ bytesRead, buffer })
  71. })
  72. })
  73. }
  74. // Function signature can be
  75. // fs.write(fd, buffer[, offset[, length[, position]]], callback)
  76. // OR
  77. // fs.write(fd, string[, position[, encoding]], callback)
  78. // so we need to handle both cases
  79. exports.write = function (fd, buffer, a, b, c, callback) {
  80. if (typeof arguments[arguments.length - 1] === 'function') {
  81. return fs.write(fd, buffer, a, b, c, callback)
  82. }
  83. // Check for old, depricated fs.write(fd, string[, position[, encoding]], callback)
  84. if (typeof buffer === 'string') {
  85. return new Promise((resolve, reject) => {
  86. fs.write(fd, buffer, a, b, (err, bytesWritten, buffer) => {
  87. if (err) return reject(err)
  88. resolve({ bytesWritten, buffer })
  89. })
  90. })
  91. }
  92. return new Promise((resolve, reject) => {
  93. fs.write(fd, buffer, a, b, c, (err, bytesWritten, buffer) => {
  94. if (err) return reject(err)
  95. resolve({ bytesWritten, buffer })
  96. })
  97. })
  98. }