| 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
 | | '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', |  |   '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 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 }) |  |     }) |  |   }) |  | } | 
 |