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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
| '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',
| 'lchmod',
| 'lchown',
| 'link',
| 'lstat',
| 'mkdir',
| 'mkdtemp',
| 'open',
| 'opendir',
| 'readdir',
| 'readFile',
| 'readlink',
| 'realpath',
| 'rename',
| 'rm',
| 'rmdir',
| 'stat',
| 'symlink',
| 'truncate',
| 'unlink',
| 'utimes',
| 'writeFile'
| ].filter(key => {
| // Some commands are not available on some systems. Ex:
| // fs.opendir was added in Node.js v12.12.0
| // fs.rm was added in Node.js v14.14.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(), & fs.writev() 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 })
| })
| })
| }
|
| // fs.writev only available in Node v12.9.0+
| if (typeof fs.writev === 'function') {
| // Function signature is
| // s.writev(fd, buffers[, position], callback)
| // We need to handle the optional arg, so we use ...args
| exports.writev = function (fd, buffers, ...args) {
| if (typeof args[args.length - 1] === 'function') {
| return fs.writev(fd, buffers, ...args)
| }
|
| return new Promise((resolve, reject) => {
| fs.writev(fd, buffers, ...args, (err, bytesWritten, buffers) => {
| if (err) return reject(err)
| resolve({ bytesWritten, buffers })
| })
| })
| }
| }
|
| // fs.realpath.native only available in Node v9.2+
| if (typeof fs.realpath.native === 'function') {
| exports.realpath.native = u(fs.realpath.native)
| }
|
|