pwd-fs 2.4.1 → 3.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.travis.yml +2 -3
- package/__tests__/__fmock.ts +45 -0
- package/__tests__/append.spec.ts +72 -0
- package/__tests__/bitmask.spec.ts +23 -0
- package/__tests__/chmod.spec.ts +78 -0
- package/__tests__/chown.spec.ts +88 -0
- package/{test → __tests__}/constructor.spec.ts +3 -6
- package/__tests__/copy.spec.ts +102 -0
- package/__tests__/mkdir.spec.ts +120 -0
- package/__tests__/read.spec.ts +92 -0
- package/__tests__/readdir.spec.ts +87 -0
- package/__tests__/remove.spec.ts +78 -0
- package/__tests__/rename.spec.ts +84 -0
- package/__tests__/stat.spec.ts +100 -0
- package/__tests__/symlink.spec.ts +95 -0
- package/__tests__/test.spec.ts +82 -0
- package/__tests__/write.spec.ts +104 -0
- package/appveyor.yml +2 -4
- package/jest.config.ts +14 -0
- package/lib/__tests__/__fmock.d.ts +5 -0
- package/lib/index.js +24 -0
- package/lib/powered-file-system.js +260 -0
- package/lib/recurse-io-sync.js +90 -0
- package/lib/recurse-io.js +194 -0
- package/lib/src/index.d.ts +6 -186
- package/lib/src/powered-file-system.d.ts +155 -0
- package/lib/src/recurse-io-sync.d.ts +10 -5
- package/lib/src/recurse-io.d.ts +14 -6
- package/package.json +18 -14
- package/readme.md +2 -15
- package/rollup.config.js +16 -0
- package/src/index.ts +29 -626
- package/src/powered-file-system.ts +525 -0
- package/src/recurse-io-sync.ts +77 -71
- package/src/recurse-io.ts +181 -176
- package/tsconfig.json +12 -5
- package/lib/src/index.js +0 -297
- package/lib/src/index.js.map +0 -1
- package/lib/src/recurse-io-sync.js +0 -83
- package/lib/src/recurse-io-sync.js.map +0 -1
- package/lib/src/recurse-io.js +0 -188
- package/lib/src/recurse-io.js.map +0 -1
- package/lib/test/append.spec.js +0 -99
- package/lib/test/append.spec.js.map +0 -1
- package/lib/test/bitmask.spec.js +0 -29
- package/lib/test/bitmask.spec.js.map +0 -1
- package/lib/test/chmod.spec.js +0 -104
- package/lib/test/chmod.spec.js.map +0 -1
- package/lib/test/chown.spec.js +0 -94
- package/lib/test/chown.spec.js.map +0 -1
- package/lib/test/constructor.spec.js +0 -20
- package/lib/test/constructor.spec.js.map +0 -1
- package/lib/test/copy.spec.js +0 -135
- package/lib/test/copy.spec.js.map +0 -1
- package/lib/test/mkdir.spec.js +0 -147
- package/lib/test/mkdir.spec.js.map +0 -1
- package/lib/test/read.spec.js +0 -104
- package/lib/test/read.spec.js.map +0 -1
- package/lib/test/readdir.spec.js +0 -112
- package/lib/test/readdir.spec.js.map +0 -1
- package/lib/test/remove.spec.js +0 -84
- package/lib/test/remove.spec.js.map +0 -1
- package/lib/test/rename.spec.js +0 -98
- package/lib/test/rename.spec.js.map +0 -1
- package/lib/test/stat.spec.js +0 -104
- package/lib/test/stat.spec.js.map +0 -1
- package/lib/test/symlink.spec.js +0 -118
- package/lib/test/symlink.spec.js.map +0 -1
- package/lib/test/test.spec.js +0 -89
- package/lib/test/test.spec.js.map +0 -1
- package/lib/test/write.spec.js +0 -133
- package/lib/test/write.spec.js.map +0 -1
- package/test/append.spec.ts +0 -125
- package/test/bitmask.spec.ts +0 -26
- package/test/chmod.spec.ts +0 -127
- package/test/chown.spec.ts +0 -118
- package/test/copy.spec.ts +0 -171
- package/test/mkdir.spec.ts +0 -187
- package/test/read.spec.ts +0 -130
- package/test/readdir.spec.ts +0 -134
- package/test/remove.spec.ts +0 -102
- package/test/rename.spec.ts +0 -122
- package/test/stat.spec.ts +0 -131
- package/test/symlink.spec.ts +0 -146
- package/test/test.spec.ts +0 -113
- package/test/write.spec.ts +0 -167
- /package/lib/{test → __tests__}/append.spec.d.ts +0 -0
- /package/lib/{test → __tests__}/bitmask.spec.d.ts +0 -0
- /package/lib/{test → __tests__}/chmod.spec.d.ts +0 -0
- /package/lib/{test → __tests__}/chown.spec.d.ts +0 -0
- /package/lib/{test → __tests__}/constructor.spec.d.ts +0 -0
- /package/lib/{test → __tests__}/copy.spec.d.ts +0 -0
- /package/lib/{test → __tests__}/mkdir.spec.d.ts +0 -0
- /package/lib/{test → __tests__}/read.spec.d.ts +0 -0
- /package/lib/{test → __tests__}/readdir.spec.d.ts +0 -0
- /package/lib/{test → __tests__}/remove.spec.d.ts +0 -0
- /package/lib/{test → __tests__}/rename.spec.d.ts +0 -0
- /package/lib/{test → __tests__}/stat.spec.d.ts +0 -0
- /package/lib/{test → __tests__}/symlink.spec.d.ts +0 -0
- /package/lib/{test → __tests__}/test.spec.d.ts +0 -0
- /package/lib/{test → __tests__}/write.spec.d.ts +0 -0
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var fs = require('node:fs');
|
|
4
|
+
var path = require('node:path');
|
|
5
|
+
var recurseIo = require('./recurse-io.js');
|
|
6
|
+
var recurseIoSync = require('./recurse-io-sync.js');
|
|
7
|
+
|
|
8
|
+
const permissions = [
|
|
9
|
+
0o400, // OWNER_READ
|
|
10
|
+
0o200, // OWNER_WRITE
|
|
11
|
+
0o100, // OWNER_EXECUTE
|
|
12
|
+
0o040, // GROUP_READ
|
|
13
|
+
0o020, // GROUP_WRITE
|
|
14
|
+
0o010, // GROUP_EXECUTE
|
|
15
|
+
0o004, // OTHERS_READ
|
|
16
|
+
0o002, // OTHERS_WRITE
|
|
17
|
+
0o001 // OTHERS_EXECUTE
|
|
18
|
+
];
|
|
19
|
+
class PoweredFileSystem {
|
|
20
|
+
pwd;
|
|
21
|
+
constants = {
|
|
22
|
+
e: fs.constants.F_OK,
|
|
23
|
+
r: fs.constants.R_OK,
|
|
24
|
+
w: fs.constants.W_OK,
|
|
25
|
+
x: fs.constants.X_OK
|
|
26
|
+
};
|
|
27
|
+
constructor(pwd) {
|
|
28
|
+
this.pwd = pwd ? path.resolve(pwd) : process.cwd();
|
|
29
|
+
}
|
|
30
|
+
resolve(src) {
|
|
31
|
+
return path.resolve(this.pwd, src);
|
|
32
|
+
}
|
|
33
|
+
static bitmask(mode) {
|
|
34
|
+
const type = typeof mode;
|
|
35
|
+
if (type !== 'number') {
|
|
36
|
+
throw new Error(`Argument of type '${type}' is not assignable to parameter of type 'number'.`);
|
|
37
|
+
}
|
|
38
|
+
let umask = 0o000;
|
|
39
|
+
for (const flag of permissions) {
|
|
40
|
+
if (mode & flag) {
|
|
41
|
+
umask += flag;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return umask;
|
|
45
|
+
}
|
|
46
|
+
test(src, { sync = false, flag = 'e' } = {}) {
|
|
47
|
+
const mode = this.constants[flag];
|
|
48
|
+
src = path.resolve(this.pwd, src);
|
|
49
|
+
if (sync) {
|
|
50
|
+
return fs.existsSync(src);
|
|
51
|
+
}
|
|
52
|
+
return new Promise((resolve) => {
|
|
53
|
+
fs.access(src, mode, (err) => {
|
|
54
|
+
if (err) {
|
|
55
|
+
return resolve(false);
|
|
56
|
+
}
|
|
57
|
+
resolve(true);
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
stat(src, { sync = false } = {}) {
|
|
62
|
+
src = this.resolve(src);
|
|
63
|
+
if (sync) {
|
|
64
|
+
return fs.lstatSync(src);
|
|
65
|
+
}
|
|
66
|
+
return new Promise((resolve, reject) => {
|
|
67
|
+
fs.lstat(src, (err, stats) => {
|
|
68
|
+
if (err) {
|
|
69
|
+
return reject(err);
|
|
70
|
+
}
|
|
71
|
+
resolve(stats);
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
chmod(src, mode, { sync = false } = {}) {
|
|
76
|
+
src = this.resolve(src);
|
|
77
|
+
if (sync) {
|
|
78
|
+
return recurseIoSync.default.chmod(src, mode);
|
|
79
|
+
}
|
|
80
|
+
return new Promise((resolve, reject) => {
|
|
81
|
+
recurseIo.default.chmod(src, mode, (err) => {
|
|
82
|
+
if (err) {
|
|
83
|
+
return reject(err);
|
|
84
|
+
}
|
|
85
|
+
resolve();
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
chown(src, uid, gid, { sync = false } = {}) {
|
|
90
|
+
src = this.resolve(src);
|
|
91
|
+
if (sync) {
|
|
92
|
+
return recurseIoSync.default.chown(src, uid, gid);
|
|
93
|
+
}
|
|
94
|
+
return new Promise((resolve, reject) => {
|
|
95
|
+
recurseIo.default.chown(src, uid, gid, (err) => {
|
|
96
|
+
if (err) {
|
|
97
|
+
return reject(err);
|
|
98
|
+
}
|
|
99
|
+
resolve();
|
|
100
|
+
});
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
symlink(src, use, { sync = false } = {}) {
|
|
104
|
+
src = this.resolve(src);
|
|
105
|
+
use = this.resolve(use);
|
|
106
|
+
if (sync) {
|
|
107
|
+
return fs.symlinkSync(src, use);
|
|
108
|
+
}
|
|
109
|
+
return new Promise((resolve, reject) => {
|
|
110
|
+
fs.symlink(src, use, (err) => {
|
|
111
|
+
if (err) {
|
|
112
|
+
return reject(err);
|
|
113
|
+
}
|
|
114
|
+
resolve();
|
|
115
|
+
});
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
copy(src, dir, { sync = false, umask = 0o000 } = {}) {
|
|
119
|
+
src = this.resolve(src);
|
|
120
|
+
dir = this.resolve(dir);
|
|
121
|
+
if (sync) {
|
|
122
|
+
return recurseIoSync.default.copy(src, dir, umask);
|
|
123
|
+
}
|
|
124
|
+
return new Promise((resolve, reject) => {
|
|
125
|
+
recurseIo.default.copy(src, dir, umask, (err) => {
|
|
126
|
+
if (err) {
|
|
127
|
+
return reject(err);
|
|
128
|
+
}
|
|
129
|
+
resolve();
|
|
130
|
+
});
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
rename(src, use, { sync = false } = {}) {
|
|
134
|
+
src = this.resolve(src);
|
|
135
|
+
use = this.resolve(use);
|
|
136
|
+
if (sync) {
|
|
137
|
+
return fs.renameSync(src, use);
|
|
138
|
+
}
|
|
139
|
+
return new Promise((resolve, reject) => {
|
|
140
|
+
fs.rename(src, use, (err) => {
|
|
141
|
+
if (err) {
|
|
142
|
+
return reject(err);
|
|
143
|
+
}
|
|
144
|
+
resolve();
|
|
145
|
+
});
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
remove(src, { sync = false } = {}) {
|
|
149
|
+
src = this.resolve(src);
|
|
150
|
+
if (sync) {
|
|
151
|
+
return recurseIoSync.default.remove(src);
|
|
152
|
+
}
|
|
153
|
+
return new Promise((resolve, reject) => {
|
|
154
|
+
recurseIo.default.remove(src, (err) => {
|
|
155
|
+
if (err) {
|
|
156
|
+
return reject(err);
|
|
157
|
+
}
|
|
158
|
+
resolve();
|
|
159
|
+
});
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
read(src, { sync = false, encoding = 'utf8', flag = 'r' } = {}) {
|
|
163
|
+
src = this.resolve(src);
|
|
164
|
+
if (sync) {
|
|
165
|
+
return fs.readFileSync(src, {
|
|
166
|
+
encoding,
|
|
167
|
+
flag
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
return new Promise((resolve, reject) => {
|
|
171
|
+
fs.readFile(src, {
|
|
172
|
+
encoding,
|
|
173
|
+
flag
|
|
174
|
+
}, (err, raw) => {
|
|
175
|
+
if (err) {
|
|
176
|
+
return reject(err);
|
|
177
|
+
}
|
|
178
|
+
resolve(raw);
|
|
179
|
+
});
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
write(src, data, { sync = false, encoding = 'utf8', umask = 0o000, flag = 'w' } = {}) {
|
|
183
|
+
src = this.resolve(src);
|
|
184
|
+
const mode = 0o666 - umask;
|
|
185
|
+
if (sync) {
|
|
186
|
+
return fs.writeFileSync(src, data, {
|
|
187
|
+
encoding,
|
|
188
|
+
mode,
|
|
189
|
+
flag
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
return new Promise((resolve, reject) => {
|
|
193
|
+
fs.writeFile(src, data, {
|
|
194
|
+
encoding,
|
|
195
|
+
mode,
|
|
196
|
+
flag
|
|
197
|
+
}, (err) => {
|
|
198
|
+
if (err) {
|
|
199
|
+
return reject(err);
|
|
200
|
+
}
|
|
201
|
+
resolve();
|
|
202
|
+
});
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
append(src, data, { sync = false, encoding = 'utf8', umask = 0o000, flag = 'a' } = {}) {
|
|
206
|
+
src = this.resolve(src);
|
|
207
|
+
const mode = 0o666 - umask;
|
|
208
|
+
if (sync) {
|
|
209
|
+
return fs.appendFileSync(src, data, {
|
|
210
|
+
encoding,
|
|
211
|
+
mode,
|
|
212
|
+
flag
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
return new Promise((resolve, reject) => {
|
|
216
|
+
fs.appendFile(src, data, {
|
|
217
|
+
encoding,
|
|
218
|
+
mode,
|
|
219
|
+
flag
|
|
220
|
+
}, (err) => {
|
|
221
|
+
if (err) {
|
|
222
|
+
return reject(err);
|
|
223
|
+
}
|
|
224
|
+
resolve();
|
|
225
|
+
});
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
readdir(dir, { sync = false, encoding = 'utf8' } = {}) {
|
|
229
|
+
dir = this.resolve(dir);
|
|
230
|
+
if (sync) {
|
|
231
|
+
return fs.readdirSync(dir, {
|
|
232
|
+
encoding
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
return new Promise((resolve, reject) => {
|
|
236
|
+
fs.readdir(dir, { encoding }, (err, list) => {
|
|
237
|
+
if (err) {
|
|
238
|
+
return reject(err);
|
|
239
|
+
}
|
|
240
|
+
resolve(list);
|
|
241
|
+
});
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
mkdir(dir, { umask = 0o000, sync = false } = {}) {
|
|
245
|
+
dir = this.resolve(dir);
|
|
246
|
+
if (sync) {
|
|
247
|
+
return recurseIoSync.default.mkdir(dir, umask);
|
|
248
|
+
}
|
|
249
|
+
return new Promise((resolve, reject) => {
|
|
250
|
+
recurseIo.default.mkdir(dir, umask, (err) => {
|
|
251
|
+
if (err) {
|
|
252
|
+
return reject(err);
|
|
253
|
+
}
|
|
254
|
+
resolve();
|
|
255
|
+
});
|
|
256
|
+
});
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
exports.PoweredFileSystem = PoweredFileSystem;
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
var fs = require('node:fs');
|
|
6
|
+
var path = require('node:path');
|
|
7
|
+
|
|
8
|
+
const { sep } = path;
|
|
9
|
+
function chmod(src, mode) {
|
|
10
|
+
const stat = fs.statSync(src);
|
|
11
|
+
if (stat.isDirectory()) {
|
|
12
|
+
const list = fs.readdirSync(src);
|
|
13
|
+
for (const loc of list) {
|
|
14
|
+
chmod(`${src}${sep}${loc}`, mode);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
fs.chmodSync(src, mode);
|
|
18
|
+
}
|
|
19
|
+
function chown(src, uid, gid) {
|
|
20
|
+
const stat = fs.statSync(src);
|
|
21
|
+
if (stat.isDirectory()) {
|
|
22
|
+
const list = fs.readdirSync(src);
|
|
23
|
+
for (const loc of list) {
|
|
24
|
+
chown(`${src}${sep}${loc}`, uid, gid);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
fs.chownSync(src, uid, gid);
|
|
28
|
+
}
|
|
29
|
+
function copy(src, dir, umask) {
|
|
30
|
+
const stat = fs.statSync(src);
|
|
31
|
+
if (stat.isDirectory()) {
|
|
32
|
+
const list = fs.readdirSync(src);
|
|
33
|
+
const paths = src.split(sep);
|
|
34
|
+
const loc = paths[paths.length - 1];
|
|
35
|
+
const mode = 0o777 - umask;
|
|
36
|
+
dir = `${dir}${sep}${loc}`;
|
|
37
|
+
fs.mkdirSync(dir, mode);
|
|
38
|
+
for (const loc of list) {
|
|
39
|
+
copy(`${src}${sep}${loc}`, dir, umask);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
const loc = path.basename(src);
|
|
44
|
+
const use = `${dir}${sep}${loc}`;
|
|
45
|
+
fs.copyFileSync(src, use);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
function remove(src) {
|
|
49
|
+
const stat = fs.statSync(src);
|
|
50
|
+
if (stat.isDirectory()) {
|
|
51
|
+
const list = fs.readdirSync(src);
|
|
52
|
+
for (const loc of list) {
|
|
53
|
+
remove(`${src}${sep}${loc}`);
|
|
54
|
+
}
|
|
55
|
+
fs.rmdirSync(src);
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
fs.unlinkSync(src);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
function mkdir(dir, umask) {
|
|
62
|
+
const mode = 0o777 - umask;
|
|
63
|
+
const cwd = process.cwd();
|
|
64
|
+
let use = '';
|
|
65
|
+
if (dir.indexOf(cwd) === 0) {
|
|
66
|
+
use = cwd;
|
|
67
|
+
dir = dir.substr(cwd.length);
|
|
68
|
+
}
|
|
69
|
+
const ways = dir.split(sep).slice(1);
|
|
70
|
+
for (const loc of ways) {
|
|
71
|
+
use += `${sep}${loc}`;
|
|
72
|
+
try {
|
|
73
|
+
fs.mkdirSync(use, { mode });
|
|
74
|
+
}
|
|
75
|
+
catch (err) {
|
|
76
|
+
if (err.errno !== -17) {
|
|
77
|
+
throw err;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
var recurseSync = {
|
|
83
|
+
chmod,
|
|
84
|
+
chown,
|
|
85
|
+
copy,
|
|
86
|
+
remove,
|
|
87
|
+
mkdir
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
exports.default = recurseSync;
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
var fs = require('node:fs');
|
|
6
|
+
var path = require('node:path');
|
|
7
|
+
|
|
8
|
+
const { sep } = path;
|
|
9
|
+
function chmod(src, mode, callback) {
|
|
10
|
+
let reduce = 0;
|
|
11
|
+
fs.stat(src, (err, stat) => {
|
|
12
|
+
if (err) {
|
|
13
|
+
return callback(err);
|
|
14
|
+
}
|
|
15
|
+
if (stat.isDirectory()) {
|
|
16
|
+
fs.readdir(src, (err, list) => {
|
|
17
|
+
if (err) {
|
|
18
|
+
return callback(err);
|
|
19
|
+
}
|
|
20
|
+
if (list.length === 0) {
|
|
21
|
+
return fs.chmod(src, mode, callback);
|
|
22
|
+
}
|
|
23
|
+
reduce += list.length;
|
|
24
|
+
for (const loc of list) {
|
|
25
|
+
chmod(`${src}${sep}${loc}`, mode, (err) => {
|
|
26
|
+
if (err) {
|
|
27
|
+
return callback(err);
|
|
28
|
+
}
|
|
29
|
+
if (--reduce === 0) {
|
|
30
|
+
fs.chmod(src, mode, callback);
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
fs.chmod(src, mode, callback);
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
function chown(src, uid, gid, callback) {
|
|
42
|
+
let reduce = 0;
|
|
43
|
+
fs.stat(src, (err, stats) => {
|
|
44
|
+
if (err) {
|
|
45
|
+
return callback(err);
|
|
46
|
+
}
|
|
47
|
+
if (stats.isDirectory()) {
|
|
48
|
+
fs.readdir(src, (err, list) => {
|
|
49
|
+
if (err) {
|
|
50
|
+
return callback(err);
|
|
51
|
+
}
|
|
52
|
+
if (list.length === 0) {
|
|
53
|
+
return fs.chown(src, uid, gid, callback);
|
|
54
|
+
}
|
|
55
|
+
reduce += list.length;
|
|
56
|
+
for (const loc of list) {
|
|
57
|
+
chown(`${src}${sep}${loc}`, uid, gid, (err) => {
|
|
58
|
+
if (err) {
|
|
59
|
+
return callback(err);
|
|
60
|
+
}
|
|
61
|
+
if (--reduce === 0) {
|
|
62
|
+
fs.chown(src, uid, gid, callback);
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
fs.chown(src, uid, gid, callback);
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
function copy(src, dir, umask, callback) {
|
|
74
|
+
let reduce = 0;
|
|
75
|
+
fs.stat(src, (err, stat) => {
|
|
76
|
+
if (err) {
|
|
77
|
+
return callback(err);
|
|
78
|
+
}
|
|
79
|
+
if (stat.isDirectory()) {
|
|
80
|
+
fs.readdir(src, (err, list) => {
|
|
81
|
+
if (err) {
|
|
82
|
+
return callback(err);
|
|
83
|
+
}
|
|
84
|
+
reduce += list.length;
|
|
85
|
+
const paths = src.split(sep);
|
|
86
|
+
const loc = paths[paths.length - 1];
|
|
87
|
+
const mode = 0o777 - umask;
|
|
88
|
+
dir = `${dir}${sep}${loc}`;
|
|
89
|
+
fs.mkdir(dir, { mode }, (err) => {
|
|
90
|
+
if (err) {
|
|
91
|
+
return callback(err);
|
|
92
|
+
}
|
|
93
|
+
if (reduce === 0) {
|
|
94
|
+
return callback(null);
|
|
95
|
+
}
|
|
96
|
+
for (const loc of list) {
|
|
97
|
+
copy(`${src}${sep}${loc}`, dir, umask, (err) => {
|
|
98
|
+
if (err) {
|
|
99
|
+
return callback(err);
|
|
100
|
+
}
|
|
101
|
+
if (--reduce === 0) {
|
|
102
|
+
callback(null);
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
const mode = 0o666 - umask;
|
|
111
|
+
const loc = path.basename(src);
|
|
112
|
+
const readStream = fs.createReadStream(src);
|
|
113
|
+
const writeStream = fs.createWriteStream(`${dir}${sep}${loc}`, {
|
|
114
|
+
mode
|
|
115
|
+
});
|
|
116
|
+
readStream.on('error', callback);
|
|
117
|
+
writeStream.on('error', callback);
|
|
118
|
+
writeStream.on('close', () => {
|
|
119
|
+
callback(null);
|
|
120
|
+
});
|
|
121
|
+
readStream.pipe(writeStream);
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
function remove(src, callback) {
|
|
126
|
+
fs.stat(src, (err, stat) => {
|
|
127
|
+
if (err) {
|
|
128
|
+
return callback(err);
|
|
129
|
+
}
|
|
130
|
+
if (stat.isDirectory()) {
|
|
131
|
+
fs.readdir(src, (err, list) => {
|
|
132
|
+
if (err) {
|
|
133
|
+
return callback(err);
|
|
134
|
+
}
|
|
135
|
+
let reduce = list.length;
|
|
136
|
+
if (reduce === 0) {
|
|
137
|
+
return fs.rmdir(src, callback);
|
|
138
|
+
}
|
|
139
|
+
for (const loc of list) {
|
|
140
|
+
remove(`${src}${sep}${loc}`, (err) => {
|
|
141
|
+
if (err) {
|
|
142
|
+
return callback(err);
|
|
143
|
+
}
|
|
144
|
+
if (--reduce === 0) {
|
|
145
|
+
fs.rmdir(src, callback);
|
|
146
|
+
}
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
fs.unlink(src, callback);
|
|
153
|
+
}
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
function mkdir(dir, umask, callback) {
|
|
157
|
+
const cwd = process.cwd();
|
|
158
|
+
if (dir === cwd) {
|
|
159
|
+
return callback(null);
|
|
160
|
+
}
|
|
161
|
+
const sequence = function* (dir, files, mode) {
|
|
162
|
+
const iter = yield;
|
|
163
|
+
for (const item of files) {
|
|
164
|
+
dir += `${sep}${item}`;
|
|
165
|
+
fs.mkdir(dir, { mode }, (err) => {
|
|
166
|
+
if (err && err.errno !== -17) {
|
|
167
|
+
return callback(err);
|
|
168
|
+
}
|
|
169
|
+
iter.next();
|
|
170
|
+
});
|
|
171
|
+
yield;
|
|
172
|
+
}
|
|
173
|
+
callback(null);
|
|
174
|
+
};
|
|
175
|
+
let use = '';
|
|
176
|
+
if (dir.indexOf(cwd) === 0) {
|
|
177
|
+
use = cwd;
|
|
178
|
+
dir = dir.substr(cwd.length);
|
|
179
|
+
}
|
|
180
|
+
const files = dir.split(sep);
|
|
181
|
+
const mode = 0o777 - umask;
|
|
182
|
+
const iter = sequence(use, files, mode);
|
|
183
|
+
iter.next();
|
|
184
|
+
iter.next(iter);
|
|
185
|
+
}
|
|
186
|
+
var recurse = {
|
|
187
|
+
chmod,
|
|
188
|
+
chown,
|
|
189
|
+
copy,
|
|
190
|
+
remove,
|
|
191
|
+
mkdir
|
|
192
|
+
};
|
|
193
|
+
|
|
194
|
+
exports.default = recurse;
|