pwd-fs 3.3.0 → 3.3.5
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/dist/bitmask.d.ts +4 -0
- package/dist/{src/bitmask.js → bitmask.js} +3 -1
- package/dist/bitmask.test.d.ts +1 -0
- package/dist/bitmask.test.js +29 -0
- package/dist/{src/index.d.ts → index.d.ts} +3 -0
- package/dist/{src/index.js → index.js} +3 -1
- package/dist/powered-file-system/append.d.ts +9 -0
- package/dist/powered-file-system/append.js +10 -0
- package/dist/powered-file-system/append.test.d.ts +1 -0
- package/dist/powered-file-system/append.test.js +47 -0
- package/dist/powered-file-system/chmod.d.ts +7 -0
- package/dist/powered-file-system/chmod.js +28 -0
- package/dist/powered-file-system/chmod.test.d.ts +1 -0
- package/dist/powered-file-system/chmod.test.js +71 -0
- package/dist/powered-file-system/chown.d.ts +9 -0
- package/dist/powered-file-system/chown.js +45 -0
- package/dist/powered-file-system/chown.test.d.ts +1 -0
- package/dist/powered-file-system/chown.test.js +82 -0
- package/dist/powered-file-system/copy.d.ts +8 -0
- package/dist/powered-file-system/copy.js +29 -0
- package/dist/powered-file-system/copy.test.d.ts +1 -0
- package/dist/powered-file-system/copy.test.js +82 -0
- package/dist/powered-file-system/mkdir.d.ts +8 -0
- package/dist/powered-file-system/mkdir.js +28 -0
- package/dist/powered-file-system/mkdir.test.d.ts +1 -0
- package/dist/powered-file-system/mkdir.test.js +116 -0
- package/dist/powered-file-system/read.d.ts +9 -0
- package/dist/powered-file-system/read.js +29 -0
- package/dist/powered-file-system/read.test.d.ts +1 -0
- package/dist/powered-file-system/read.test.js +75 -0
- package/dist/powered-file-system/readdir.d.ts +8 -0
- package/dist/powered-file-system/readdir.js +26 -0
- package/dist/powered-file-system/readdir.test.d.ts +1 -0
- package/dist/powered-file-system/readdir.test.js +72 -0
- package/dist/powered-file-system/remove.d.ts +7 -0
- package/dist/powered-file-system/remove.js +36 -0
- package/dist/powered-file-system/remove.test.d.ts +1 -0
- package/dist/powered-file-system/remove.test.js +78 -0
- package/dist/powered-file-system/rename.d.ts +7 -0
- package/dist/powered-file-system/rename.js +28 -0
- package/dist/powered-file-system/rename.test.d.ts +1 -0
- package/dist/powered-file-system/rename.test.js +70 -0
- package/dist/powered-file-system/stat.d.ts +7 -0
- package/dist/powered-file-system/stat.js +26 -0
- package/dist/powered-file-system/stat.test.d.ts +1 -0
- package/dist/powered-file-system/stat.test.js +79 -0
- package/dist/powered-file-system/symlink.d.ts +4 -0
- package/dist/powered-file-system/symlink.js +52 -0
- package/dist/powered-file-system/symlink.test.d.ts +1 -0
- package/dist/powered-file-system/symlink.test.js +77 -0
- package/dist/powered-file-system/test.d.ts +8 -0
- package/dist/powered-file-system/test.js +30 -0
- package/dist/powered-file-system/test.test.d.ts +1 -0
- package/dist/powered-file-system/test.test.js +76 -0
- package/dist/powered-file-system/write.d.ts +10 -0
- package/dist/powered-file-system/write.js +36 -0
- package/dist/powered-file-system/write.test.d.ts +1 -0
- package/dist/powered-file-system/write.test.js +97 -0
- package/dist/{src/powered-file-system.d.ts → powered-file-system.d.ts} +57 -4
- package/dist/powered-file-system.js +144 -0
- package/dist/powered-file-system.test.d.ts +1 -0
- package/dist/powered-file-system.test.js +21 -0
- package/dist/recurse-io-sync.d.ts +20 -0
- package/dist/{src/recurse-io-sync.js → recurse-io-sync.js} +25 -23
- package/dist/{src/recurse-io.d.ts → recurse-io.d.ts} +15 -0
- package/dist/{src/recurse-io.js → recurse-io.js} +30 -28
- package/dist/suite.test.d.ts +1 -0
- package/dist/suite.test.js +40 -0
- package/dist/test-utils.d.ts +18 -0
- package/dist/test-utils.js +72 -0
- package/package.json +27 -10
- package/readme.md +331 -246
- package/.travis.yml +0 -12
- package/appveyor.yml +0 -16
- package/dist/src/bitmask.d.ts +0 -1
- package/dist/src/bitmask.js.map +0 -1
- package/dist/src/index.js.map +0 -1
- package/dist/src/powered-file-system.js +0 -252
- package/dist/src/powered-file-system.js.map +0 -1
- package/dist/src/recurse-io-sync.d.ts +0 -5
- package/dist/src/recurse-io-sync.js.map +0 -1
- package/dist/src/recurse-io.js.map +0 -1
- package/src/bitmask.ts +0 -13
- package/src/index.ts +0 -5
- package/src/powered-file-system.ts +0 -369
- package/src/recurse-io-sync.ts +0 -105
- package/src/recurse-io.ts +0 -221
- package/test/__fmock.ts +0 -45
- package/test/append.spec.ts +0 -45
- package/test/bitmask.spec.ts +0 -23
- package/test/chmod.spec.ts +0 -77
- package/test/chown.spec.ts +0 -92
- package/test/constructor.spec.ts +0 -15
- package/test/copy.spec.ts +0 -101
- package/test/mkdir.spec.ts +0 -121
- package/test/read.spec.ts +0 -91
- package/test/readdir.spec.ts +0 -86
- package/test/remove.spec.ts +0 -78
- package/test/rename.spec.ts +0 -84
- package/test/stat.spec.ts +0 -99
- package/test/symlink.spec.ts +0 -95
- package/test/test.spec.ts +0 -80
- package/test/write.spec.ts +0 -104
- package/tsconfig.json +0 -17
|
@@ -1,369 +0,0 @@
|
|
|
1
|
-
import fs from 'node:fs';
|
|
2
|
-
import path from 'node:path';
|
|
3
|
-
import { chmod, chown, copy, remove, mkdir } from './recurse-io';
|
|
4
|
-
import { chmodSync, chownSync, copySync, removeSync, mkdirSync } from './recurse-io-sync';
|
|
5
|
-
import { bitmask } from './bitmask';
|
|
6
|
-
|
|
7
|
-
export type Mode = keyof IConstants;
|
|
8
|
-
export type Flag = Mode | 'a';
|
|
9
|
-
export type Stats = fs.Stats;
|
|
10
|
-
|
|
11
|
-
export * from './bitmask';
|
|
12
|
-
|
|
13
|
-
export interface IConstants {
|
|
14
|
-
e: number,
|
|
15
|
-
r: number,
|
|
16
|
-
w: number,
|
|
17
|
-
x: number
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
export class PoweredFileSystem {
|
|
21
|
-
readonly pwd: string;
|
|
22
|
-
|
|
23
|
-
readonly constants: IConstants = {
|
|
24
|
-
e: fs.constants.F_OK,
|
|
25
|
-
r: fs.constants.R_OK,
|
|
26
|
-
w: fs.constants.W_OK,
|
|
27
|
-
x: fs.constants.X_OK
|
|
28
|
-
};
|
|
29
|
-
|
|
30
|
-
static bitmask = bitmask;
|
|
31
|
-
|
|
32
|
-
constructor(pwd?: string) {
|
|
33
|
-
this.pwd = pwd ? path.resolve(pwd) : process.cwd();
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
private resolve(src: string) {
|
|
37
|
-
return path.resolve(this.pwd, src);
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
test<T extends boolean = false>(
|
|
41
|
-
src: string,
|
|
42
|
-
options?: {
|
|
43
|
-
sync?: T;
|
|
44
|
-
flag?: Mode;
|
|
45
|
-
}
|
|
46
|
-
): T extends true ? boolean : Promise<boolean> {
|
|
47
|
-
const { sync = false as T, flag = 'e' } = options ?? {};
|
|
48
|
-
const mode = this.constants[flag];
|
|
49
|
-
src = path.resolve(this.pwd, src);
|
|
50
|
-
|
|
51
|
-
if (sync) {
|
|
52
|
-
return fs.existsSync(src) as any;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
return new Promise<boolean>((resolve) => {
|
|
56
|
-
fs.access(src, mode, (err) => {
|
|
57
|
-
resolve(!err);
|
|
58
|
-
});
|
|
59
|
-
}) as any;
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
stat<T extends boolean = false>(
|
|
63
|
-
src: string,
|
|
64
|
-
options?: {
|
|
65
|
-
sync?: T;
|
|
66
|
-
}
|
|
67
|
-
): T extends true ? Stats : Promise<Stats> {
|
|
68
|
-
const { sync = false as T } = options ?? {};
|
|
69
|
-
src = this.resolve(src);
|
|
70
|
-
|
|
71
|
-
if (sync) {
|
|
72
|
-
return fs.lstatSync(src) as any;
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
return new Promise<Stats>((resolve, reject) => {
|
|
76
|
-
fs.lstat(src, (err, stats) => {
|
|
77
|
-
if (err) {
|
|
78
|
-
return reject(err);
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
resolve(stats);
|
|
82
|
-
});
|
|
83
|
-
}) as any;
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
chmod<T extends boolean = false>(
|
|
87
|
-
src: string,
|
|
88
|
-
mode: number,
|
|
89
|
-
options?: { sync?: T }
|
|
90
|
-
): T extends true ? void : Promise<void> {
|
|
91
|
-
const { sync = false as T } = options ?? {};
|
|
92
|
-
src = this.resolve(src);
|
|
93
|
-
|
|
94
|
-
if (sync) {
|
|
95
|
-
chmodSync(src, mode);
|
|
96
|
-
return undefined as any;
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
return new Promise<void>((resolve, reject) => {
|
|
100
|
-
chmod(src, mode, (err) => {
|
|
101
|
-
if (err) {
|
|
102
|
-
return reject(err);
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
resolve();
|
|
106
|
-
});
|
|
107
|
-
}) as any;
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
chown<T extends boolean = false>(
|
|
111
|
-
src: string,
|
|
112
|
-
options?: { sync?: T; uid?: number; gid?: number }
|
|
113
|
-
): T extends true ? void : Promise<void> {
|
|
114
|
-
const { sync = false as T, uid = 0, gid = 0 } = options ?? {};
|
|
115
|
-
src = this.resolve(src);
|
|
116
|
-
|
|
117
|
-
if (sync) {
|
|
118
|
-
chownSync(src, uid, gid);
|
|
119
|
-
return undefined as any;
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
return new Promise<void>((resolve, reject) => {
|
|
123
|
-
chown(src, uid, gid, (err) => {
|
|
124
|
-
if (err) {
|
|
125
|
-
return reject(err);
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
resolve();
|
|
129
|
-
});
|
|
130
|
-
}) as any;
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
symlink<T extends boolean = false>(
|
|
134
|
-
src: string,
|
|
135
|
-
dest: string,
|
|
136
|
-
options?: { sync?: T }
|
|
137
|
-
): T extends true ? void : Promise<void> {
|
|
138
|
-
src = this.resolve(src);
|
|
139
|
-
dest = this.resolve(dest);
|
|
140
|
-
|
|
141
|
-
const { sync = false as T } = options ?? {};
|
|
142
|
-
|
|
143
|
-
if (sync) {
|
|
144
|
-
fs.symlinkSync(src, dest);
|
|
145
|
-
return undefined as any;
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
return new Promise<void>((resolve, reject) => {
|
|
149
|
-
fs.symlink(src, dest, (err) => {
|
|
150
|
-
if (err) {
|
|
151
|
-
return reject(err);
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
resolve();
|
|
155
|
-
});
|
|
156
|
-
}) as any;
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
copy<T extends boolean = false>(
|
|
160
|
-
src: string,
|
|
161
|
-
dest: string,
|
|
162
|
-
options?: { sync?: T; umask?: number }
|
|
163
|
-
): T extends true ? void : Promise<void> {
|
|
164
|
-
src = this.resolve(src);
|
|
165
|
-
dest = this.resolve(dest);
|
|
166
|
-
|
|
167
|
-
const { sync = false as T, umask = 0o000 } = options ?? {};
|
|
168
|
-
|
|
169
|
-
if (sync) {
|
|
170
|
-
copySync(src, dest, umask);
|
|
171
|
-
return undefined as any;
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
return new Promise<void>((resolve, reject) => {
|
|
175
|
-
copy(src, dest, umask, (err) => {
|
|
176
|
-
if (err) {
|
|
177
|
-
return reject(err);
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
resolve();
|
|
181
|
-
});
|
|
182
|
-
}) as any;
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
rename<T extends boolean = false>(
|
|
186
|
-
src: string,
|
|
187
|
-
dest: string,
|
|
188
|
-
options?: { sync?: T }
|
|
189
|
-
): T extends true ? void : Promise<void> {
|
|
190
|
-
src = this.resolve(src);
|
|
191
|
-
dest = this.resolve(dest);
|
|
192
|
-
|
|
193
|
-
const { sync = false as T } = options ?? {};
|
|
194
|
-
|
|
195
|
-
if (sync) {
|
|
196
|
-
fs.renameSync(src, dest);
|
|
197
|
-
return undefined as any;
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
return new Promise<void>((resolve, reject) => {
|
|
201
|
-
fs.rename(src, dest, (err) => {
|
|
202
|
-
if (err) {
|
|
203
|
-
return reject(err);
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
resolve();
|
|
207
|
-
});
|
|
208
|
-
}) as any;
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
remove<T extends boolean = false>(
|
|
212
|
-
src: string,
|
|
213
|
-
options?: { sync?: T }
|
|
214
|
-
): T extends true ? void : Promise<void> {
|
|
215
|
-
src = this.resolve(src);
|
|
216
|
-
const { sync = false as T } = options ?? {};
|
|
217
|
-
|
|
218
|
-
if (sync) {
|
|
219
|
-
removeSync(src);
|
|
220
|
-
return undefined as any;
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
return new Promise<void>((resolve, reject) => {
|
|
224
|
-
const callback: fs.NoParamCallback = (err) => {
|
|
225
|
-
if (err) {
|
|
226
|
-
return reject(err);
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
resolve();
|
|
230
|
-
};
|
|
231
|
-
|
|
232
|
-
if ('rm' in fs) {
|
|
233
|
-
fs.rm(src, { recursive: true }, callback);
|
|
234
|
-
}
|
|
235
|
-
else {
|
|
236
|
-
remove(src, callback);
|
|
237
|
-
}
|
|
238
|
-
}) as any;
|
|
239
|
-
}
|
|
240
|
-
|
|
241
|
-
read<T extends boolean = false>(
|
|
242
|
-
src: string,
|
|
243
|
-
options?: {
|
|
244
|
-
sync?: T;
|
|
245
|
-
encoding?: BufferEncoding | null;
|
|
246
|
-
flag?: Flag;
|
|
247
|
-
}
|
|
248
|
-
): T extends true ? string | Buffer : Promise<string | Buffer> {
|
|
249
|
-
const { sync = false as T, encoding = 'utf8', flag = 'r' } = options ?? {};
|
|
250
|
-
const resolved = this.resolve(src);
|
|
251
|
-
|
|
252
|
-
if (sync) {
|
|
253
|
-
if (encoding === null) {
|
|
254
|
-
return fs.readFileSync(resolved, { encoding: null, flag }) as any;
|
|
255
|
-
}
|
|
256
|
-
else {
|
|
257
|
-
return fs.readFileSync(resolved, { encoding, flag }) as any;
|
|
258
|
-
}
|
|
259
|
-
}
|
|
260
|
-
|
|
261
|
-
return new Promise((resolve, reject) => {
|
|
262
|
-
fs.readFile(resolved, { encoding, flag }, (err, raw) => {
|
|
263
|
-
if (err) {
|
|
264
|
-
return reject(err);
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
resolve(raw);
|
|
268
|
-
});
|
|
269
|
-
}) as any;
|
|
270
|
-
}
|
|
271
|
-
|
|
272
|
-
write<T extends boolean = false>(
|
|
273
|
-
src: string,
|
|
274
|
-
data: Buffer | string,
|
|
275
|
-
options?: {
|
|
276
|
-
sync?: T;
|
|
277
|
-
encoding?: BufferEncoding | null;
|
|
278
|
-
umask?: number;
|
|
279
|
-
flag?: Flag;
|
|
280
|
-
}
|
|
281
|
-
): T extends true ? void : Promise<void> {
|
|
282
|
-
const {
|
|
283
|
-
sync = false as T,
|
|
284
|
-
encoding = 'utf8',
|
|
285
|
-
umask = 0o000,
|
|
286
|
-
flag = 'w',
|
|
287
|
-
} = options ?? {};
|
|
288
|
-
src = this.resolve(src);
|
|
289
|
-
|
|
290
|
-
const mode = 0o666 - umask;
|
|
291
|
-
|
|
292
|
-
if (sync) {
|
|
293
|
-
fs.writeFileSync(src, data, { encoding, mode, flag });
|
|
294
|
-
return undefined as any;
|
|
295
|
-
}
|
|
296
|
-
|
|
297
|
-
return new Promise<void>((resolve, reject) => {
|
|
298
|
-
fs.writeFile(src, data, { encoding, mode, flag }, (err) => {
|
|
299
|
-
if (err) {
|
|
300
|
-
return reject(err);
|
|
301
|
-
}
|
|
302
|
-
|
|
303
|
-
resolve();
|
|
304
|
-
});
|
|
305
|
-
}) as any;
|
|
306
|
-
}
|
|
307
|
-
|
|
308
|
-
/**
|
|
309
|
-
* @deprecated The method should not be used
|
|
310
|
-
*/
|
|
311
|
-
append<T extends boolean = false>(
|
|
312
|
-
src: string,
|
|
313
|
-
data: Buffer | string,
|
|
314
|
-
options?: {
|
|
315
|
-
sync?: T;
|
|
316
|
-
encoding?: BufferEncoding | null;
|
|
317
|
-
umask?: number;
|
|
318
|
-
}
|
|
319
|
-
): T extends true ? void : Promise<void> {
|
|
320
|
-
const { sync = false as T, encoding = 'utf8', umask = 0o000 } = options ?? {};
|
|
321
|
-
|
|
322
|
-
return this.write(src, data, { sync, encoding, umask, flag: 'a' }) as any;
|
|
323
|
-
}
|
|
324
|
-
|
|
325
|
-
readdir<T extends boolean = false>(
|
|
326
|
-
dir: string,
|
|
327
|
-
options?: { sync?: T; encoding?: BufferEncoding | null }
|
|
328
|
-
): T extends true ? string[] : Promise<string[]> {
|
|
329
|
-
const { sync = false as T, encoding = 'utf8' } = options ?? {};
|
|
330
|
-
dir = this.resolve(dir);
|
|
331
|
-
|
|
332
|
-
if (sync) {
|
|
333
|
-
return fs.readdirSync(dir, { encoding }) as any;
|
|
334
|
-
}
|
|
335
|
-
|
|
336
|
-
return new Promise<string[]>((resolve, reject) => {
|
|
337
|
-
fs.readdir(dir, { encoding }, (err, list) => {
|
|
338
|
-
if (err) {
|
|
339
|
-
return reject(err);
|
|
340
|
-
}
|
|
341
|
-
|
|
342
|
-
resolve(list);
|
|
343
|
-
});
|
|
344
|
-
}) as any;
|
|
345
|
-
}
|
|
346
|
-
|
|
347
|
-
mkdir<T extends boolean = false>(
|
|
348
|
-
dir: string,
|
|
349
|
-
options?: { sync?: T; umask?: number }
|
|
350
|
-
): T extends true ? void : Promise<void> {
|
|
351
|
-
const { sync = false as T, umask = 0o000 } = options ?? {};
|
|
352
|
-
dir = this.resolve(dir);
|
|
353
|
-
|
|
354
|
-
if (sync) {
|
|
355
|
-
mkdirSync(dir, umask);
|
|
356
|
-
return undefined as any;
|
|
357
|
-
}
|
|
358
|
-
|
|
359
|
-
return new Promise<void>((resolve, reject) => {
|
|
360
|
-
mkdir(dir, umask, (err) => {
|
|
361
|
-
if (err) {
|
|
362
|
-
return reject(err);
|
|
363
|
-
}
|
|
364
|
-
|
|
365
|
-
resolve();
|
|
366
|
-
});
|
|
367
|
-
}) as any;
|
|
368
|
-
}
|
|
369
|
-
}
|
package/src/recurse-io-sync.ts
DELETED
|
@@ -1,105 +0,0 @@
|
|
|
1
|
-
import fs from 'node:fs';
|
|
2
|
-
import path from 'node:path';
|
|
3
|
-
|
|
4
|
-
export function chmodSync(src: string, mode: number) {
|
|
5
|
-
const stats = fs.statSync(src);
|
|
6
|
-
|
|
7
|
-
if (stats.isDirectory()) {
|
|
8
|
-
const list = fs.readdirSync(src);
|
|
9
|
-
|
|
10
|
-
for (const loc of list) {
|
|
11
|
-
chmodSync(path.join(src, loc), mode);
|
|
12
|
-
}
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
fs.chmodSync(src, mode);
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
export function chownSync(src: string, uid: number, gid: number) {
|
|
19
|
-
const stats = fs.statSync(src);
|
|
20
|
-
|
|
21
|
-
if (uid === 0) {
|
|
22
|
-
uid = stats.uid;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
if (gid === 0) {
|
|
26
|
-
gid = stats.gid;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
if (stats.isDirectory()) {
|
|
30
|
-
const list = fs.readdirSync(src);
|
|
31
|
-
|
|
32
|
-
for (const loc of list) {
|
|
33
|
-
chownSync(path.join(src, loc), uid, gid);
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
fs.chownSync(src, uid, gid);
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
export function copySync(src: string, dir: string, umask: number) {
|
|
41
|
-
const stat = fs.statSync(src);
|
|
42
|
-
|
|
43
|
-
if (stat.isDirectory()) {
|
|
44
|
-
const list = fs.readdirSync(src);
|
|
45
|
-
|
|
46
|
-
const loc = path.basename(src);
|
|
47
|
-
const mode = 0o777 - umask;
|
|
48
|
-
|
|
49
|
-
dir = path.join(dir, loc);
|
|
50
|
-
fs.mkdirSync(dir, mode);
|
|
51
|
-
|
|
52
|
-
for (const loc of list) {
|
|
53
|
-
copySync(path.join(src, loc), dir, umask);
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
else {
|
|
57
|
-
const loc = path.basename(src);
|
|
58
|
-
const use = path.join(dir, loc);
|
|
59
|
-
|
|
60
|
-
fs.copyFileSync(src, use);
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
export function removeSync(src: string) {
|
|
65
|
-
const stats = fs.statSync(src);
|
|
66
|
-
|
|
67
|
-
if (stats.isDirectory()) {
|
|
68
|
-
const list = fs.readdirSync(src);
|
|
69
|
-
|
|
70
|
-
for (const loc of list) {
|
|
71
|
-
removeSync(path.join(src, loc));
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
fs.rmdirSync(src);
|
|
75
|
-
}
|
|
76
|
-
else {
|
|
77
|
-
fs.unlinkSync(src);
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
export function mkdirSync(dir: string, umask: number) {
|
|
82
|
-
const mode = 0o777 - umask;
|
|
83
|
-
const cwd = process.cwd();
|
|
84
|
-
let use = '';
|
|
85
|
-
|
|
86
|
-
if (dir.indexOf(cwd) === 0) {
|
|
87
|
-
use = cwd;
|
|
88
|
-
dir = dir.substring(cwd.length);
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
const ways = dir.split(path.sep).slice(1);
|
|
92
|
-
|
|
93
|
-
for (const loc of ways) {
|
|
94
|
-
use = path.join(use, loc);
|
|
95
|
-
|
|
96
|
-
try {
|
|
97
|
-
fs.mkdirSync(use, { mode });
|
|
98
|
-
}
|
|
99
|
-
catch (err) {
|
|
100
|
-
if (err.code !== 'EEXIST') {
|
|
101
|
-
throw err;
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
}
|
package/src/recurse-io.ts
DELETED
|
@@ -1,221 +0,0 @@
|
|
|
1
|
-
import fs, { NoParamCallback } from 'node:fs';
|
|
2
|
-
import path from 'node:path';
|
|
3
|
-
|
|
4
|
-
export function chmod(src: string, mode: number, callback: NoParamCallback) {
|
|
5
|
-
let reduce = 0;
|
|
6
|
-
|
|
7
|
-
fs.stat(src, (err, stats) => {
|
|
8
|
-
if (err) return callback(err);
|
|
9
|
-
|
|
10
|
-
if (stats.isDirectory()) {
|
|
11
|
-
fs.readdir(src, (err, list) => {
|
|
12
|
-
if (err) {
|
|
13
|
-
return callback(err);
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
if (list.length === 0) {
|
|
17
|
-
return fs.chmod(src, mode, callback);
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
reduce = list.length;
|
|
21
|
-
|
|
22
|
-
for (const loc of list) {
|
|
23
|
-
chmod(path.join(src, loc), mode, (err) => {
|
|
24
|
-
if (err) {
|
|
25
|
-
return callback(err);
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
if (--reduce === 0) {
|
|
29
|
-
fs.chmod(src, mode, callback);
|
|
30
|
-
}
|
|
31
|
-
});
|
|
32
|
-
}
|
|
33
|
-
});
|
|
34
|
-
}
|
|
35
|
-
else {
|
|
36
|
-
fs.chmod(src, mode, callback);
|
|
37
|
-
}
|
|
38
|
-
});
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
export function chown(src: string, uid: number, gid: number, callback: NoParamCallback) {
|
|
42
|
-
let reduce = 0;
|
|
43
|
-
|
|
44
|
-
fs.stat(src, (err, stats) => {
|
|
45
|
-
if (err) {
|
|
46
|
-
return callback(err);
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
if (uid === 0) {
|
|
50
|
-
uid = stats.uid;
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
if (gid === 0) {
|
|
54
|
-
gid = stats.gid;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
if (stats.isDirectory()) {
|
|
58
|
-
fs.readdir(src, (err, list) => {
|
|
59
|
-
if (err) {
|
|
60
|
-
return callback(err);
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
if (list.length === 0) {
|
|
64
|
-
return fs.chown(src, uid, gid, callback);
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
reduce = list.length;
|
|
68
|
-
|
|
69
|
-
for (const loc of list) {
|
|
70
|
-
chown(path.join(src, loc), uid, gid, (err) => {
|
|
71
|
-
if (err) {
|
|
72
|
-
return callback(err);
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
if (--reduce === 0) {
|
|
76
|
-
fs.chown(src, uid, gid, callback);
|
|
77
|
-
}
|
|
78
|
-
});
|
|
79
|
-
}
|
|
80
|
-
});
|
|
81
|
-
}
|
|
82
|
-
else {
|
|
83
|
-
fs.chown(src, uid, gid, callback);
|
|
84
|
-
}
|
|
85
|
-
});
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
export function copy(src: string, dir: string, umask: number, callback: NoParamCallback) {
|
|
89
|
-
fs.stat(src, (err, stat) => {
|
|
90
|
-
if (err) {
|
|
91
|
-
return callback(err);
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
if (stat.isDirectory()) {
|
|
95
|
-
fs.readdir(src, (err, list) => {
|
|
96
|
-
if (err) {
|
|
97
|
-
return callback(err);
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
const loc = path.basename(src);
|
|
101
|
-
const destDir = path.join(dir, loc);
|
|
102
|
-
const mode = 0o777 - umask;
|
|
103
|
-
|
|
104
|
-
fs.mkdir(destDir, { mode }, (err) => {
|
|
105
|
-
if (err) {
|
|
106
|
-
if (err.code === 'EEXIST') {
|
|
107
|
-
err = new Error(`Target already exists: ${destDir}`);
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
return callback(err);
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
if (list.length === 0) {
|
|
114
|
-
return callback(null);
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
let reduce = list.length;
|
|
118
|
-
|
|
119
|
-
for (const item of list) {
|
|
120
|
-
copy(path.join(src, item), destDir, umask, (err) => {
|
|
121
|
-
if (err) {
|
|
122
|
-
return callback(err);
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
if (--reduce === 0) {
|
|
126
|
-
callback(null);
|
|
127
|
-
}
|
|
128
|
-
});
|
|
129
|
-
}
|
|
130
|
-
});
|
|
131
|
-
});
|
|
132
|
-
}
|
|
133
|
-
else {
|
|
134
|
-
const loc = path.basename(src);
|
|
135
|
-
const dest = path.join(dir, loc);
|
|
136
|
-
const mode = 0o666 - umask;
|
|
137
|
-
|
|
138
|
-
const readStream = fs.createReadStream(src);
|
|
139
|
-
const writeStream = fs.createWriteStream(dest, { mode });
|
|
140
|
-
|
|
141
|
-
readStream.on('error', callback);
|
|
142
|
-
writeStream.on('error', callback);
|
|
143
|
-
writeStream.on('close', () => callback(null));
|
|
144
|
-
|
|
145
|
-
readStream.pipe(writeStream);
|
|
146
|
-
}
|
|
147
|
-
});
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
export function remove(src: string, callback: NoParamCallback) {
|
|
151
|
-
fs.stat(src, (err, stat) => {
|
|
152
|
-
if (err) {
|
|
153
|
-
return callback(err);
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
if (stat.isDirectory()) {
|
|
157
|
-
fs.readdir(src, (err, list) => {
|
|
158
|
-
if (err) {
|
|
159
|
-
return callback(err);
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
if (list.length === 0) {
|
|
163
|
-
return fs.rmdir(src, callback);
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
let reduce = list.length;
|
|
167
|
-
|
|
168
|
-
for (const loc of list) {
|
|
169
|
-
remove(path.join(src, loc), (err) => {
|
|
170
|
-
if (err) {
|
|
171
|
-
return callback(err);
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
if (--reduce === 0) {
|
|
175
|
-
fs.rmdir(src, callback);
|
|
176
|
-
}
|
|
177
|
-
});
|
|
178
|
-
}
|
|
179
|
-
});
|
|
180
|
-
}
|
|
181
|
-
else {
|
|
182
|
-
fs.unlink(src, callback);
|
|
183
|
-
}
|
|
184
|
-
});
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
export function mkdir(dir: string, umask: number, callback: NoParamCallback) {
|
|
188
|
-
const cwd = process.cwd();
|
|
189
|
-
|
|
190
|
-
if (dir === cwd) {
|
|
191
|
-
return callback(null);
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
let base = '';
|
|
195
|
-
const mode = 0o777 - umask;
|
|
196
|
-
|
|
197
|
-
if (dir.startsWith(cwd)) {
|
|
198
|
-
base = cwd;
|
|
199
|
-
dir = dir.slice(cwd.length);
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
const parts = dir.split(path.sep).filter(Boolean);
|
|
203
|
-
|
|
204
|
-
function next(index: number) {
|
|
205
|
-
if (index >= parts.length) {
|
|
206
|
-
return callback(null);
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
base = path.join(base, parts[index]);
|
|
210
|
-
|
|
211
|
-
fs.mkdir(base, { mode }, (err) => {
|
|
212
|
-
if (err && err.code !== 'EEXIST') {
|
|
213
|
-
return callback(err);
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
next(index + 1);
|
|
217
|
-
});
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
next(0);
|
|
221
|
-
}
|