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.
Files changed (101) hide show
  1. package/.travis.yml +2 -3
  2. package/__tests__/__fmock.ts +45 -0
  3. package/__tests__/append.spec.ts +72 -0
  4. package/__tests__/bitmask.spec.ts +23 -0
  5. package/__tests__/chmod.spec.ts +78 -0
  6. package/__tests__/chown.spec.ts +88 -0
  7. package/{test → __tests__}/constructor.spec.ts +3 -6
  8. package/__tests__/copy.spec.ts +102 -0
  9. package/__tests__/mkdir.spec.ts +120 -0
  10. package/__tests__/read.spec.ts +92 -0
  11. package/__tests__/readdir.spec.ts +87 -0
  12. package/__tests__/remove.spec.ts +78 -0
  13. package/__tests__/rename.spec.ts +84 -0
  14. package/__tests__/stat.spec.ts +100 -0
  15. package/__tests__/symlink.spec.ts +95 -0
  16. package/__tests__/test.spec.ts +82 -0
  17. package/__tests__/write.spec.ts +104 -0
  18. package/appveyor.yml +2 -4
  19. package/jest.config.ts +14 -0
  20. package/lib/__tests__/__fmock.d.ts +5 -0
  21. package/lib/index.js +24 -0
  22. package/lib/powered-file-system.js +260 -0
  23. package/lib/recurse-io-sync.js +90 -0
  24. package/lib/recurse-io.js +194 -0
  25. package/lib/src/index.d.ts +6 -186
  26. package/lib/src/powered-file-system.d.ts +155 -0
  27. package/lib/src/recurse-io-sync.d.ts +10 -5
  28. package/lib/src/recurse-io.d.ts +14 -6
  29. package/package.json +18 -14
  30. package/readme.md +2 -15
  31. package/rollup.config.js +16 -0
  32. package/src/index.ts +29 -626
  33. package/src/powered-file-system.ts +525 -0
  34. package/src/recurse-io-sync.ts +77 -71
  35. package/src/recurse-io.ts +181 -176
  36. package/tsconfig.json +12 -5
  37. package/lib/src/index.js +0 -297
  38. package/lib/src/index.js.map +0 -1
  39. package/lib/src/recurse-io-sync.js +0 -83
  40. package/lib/src/recurse-io-sync.js.map +0 -1
  41. package/lib/src/recurse-io.js +0 -188
  42. package/lib/src/recurse-io.js.map +0 -1
  43. package/lib/test/append.spec.js +0 -99
  44. package/lib/test/append.spec.js.map +0 -1
  45. package/lib/test/bitmask.spec.js +0 -29
  46. package/lib/test/bitmask.spec.js.map +0 -1
  47. package/lib/test/chmod.spec.js +0 -104
  48. package/lib/test/chmod.spec.js.map +0 -1
  49. package/lib/test/chown.spec.js +0 -94
  50. package/lib/test/chown.spec.js.map +0 -1
  51. package/lib/test/constructor.spec.js +0 -20
  52. package/lib/test/constructor.spec.js.map +0 -1
  53. package/lib/test/copy.spec.js +0 -135
  54. package/lib/test/copy.spec.js.map +0 -1
  55. package/lib/test/mkdir.spec.js +0 -147
  56. package/lib/test/mkdir.spec.js.map +0 -1
  57. package/lib/test/read.spec.js +0 -104
  58. package/lib/test/read.spec.js.map +0 -1
  59. package/lib/test/readdir.spec.js +0 -112
  60. package/lib/test/readdir.spec.js.map +0 -1
  61. package/lib/test/remove.spec.js +0 -84
  62. package/lib/test/remove.spec.js.map +0 -1
  63. package/lib/test/rename.spec.js +0 -98
  64. package/lib/test/rename.spec.js.map +0 -1
  65. package/lib/test/stat.spec.js +0 -104
  66. package/lib/test/stat.spec.js.map +0 -1
  67. package/lib/test/symlink.spec.js +0 -118
  68. package/lib/test/symlink.spec.js.map +0 -1
  69. package/lib/test/test.spec.js +0 -89
  70. package/lib/test/test.spec.js.map +0 -1
  71. package/lib/test/write.spec.js +0 -133
  72. package/lib/test/write.spec.js.map +0 -1
  73. package/test/append.spec.ts +0 -125
  74. package/test/bitmask.spec.ts +0 -26
  75. package/test/chmod.spec.ts +0 -127
  76. package/test/chown.spec.ts +0 -118
  77. package/test/copy.spec.ts +0 -171
  78. package/test/mkdir.spec.ts +0 -187
  79. package/test/read.spec.ts +0 -130
  80. package/test/readdir.spec.ts +0 -134
  81. package/test/remove.spec.ts +0 -102
  82. package/test/rename.spec.ts +0 -122
  83. package/test/stat.spec.ts +0 -131
  84. package/test/symlink.spec.ts +0 -146
  85. package/test/test.spec.ts +0 -113
  86. package/test/write.spec.ts +0 -167
  87. /package/lib/{test → __tests__}/append.spec.d.ts +0 -0
  88. /package/lib/{test → __tests__}/bitmask.spec.d.ts +0 -0
  89. /package/lib/{test → __tests__}/chmod.spec.d.ts +0 -0
  90. /package/lib/{test → __tests__}/chown.spec.d.ts +0 -0
  91. /package/lib/{test → __tests__}/constructor.spec.d.ts +0 -0
  92. /package/lib/{test → __tests__}/copy.spec.d.ts +0 -0
  93. /package/lib/{test → __tests__}/mkdir.spec.d.ts +0 -0
  94. /package/lib/{test → __tests__}/read.spec.d.ts +0 -0
  95. /package/lib/{test → __tests__}/readdir.spec.d.ts +0 -0
  96. /package/lib/{test → __tests__}/remove.spec.d.ts +0 -0
  97. /package/lib/{test → __tests__}/rename.spec.d.ts +0 -0
  98. /package/lib/{test → __tests__}/stat.spec.d.ts +0 -0
  99. /package/lib/{test → __tests__}/symlink.spec.d.ts +0 -0
  100. /package/lib/{test → __tests__}/test.spec.d.ts +0 -0
  101. /package/lib/{test → __tests__}/write.spec.d.ts +0 -0
@@ -0,0 +1,525 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import recurse, { Files, NoParamCallback } from './recurse-io';
4
+ import recurseSync from './recurse-io-sync';
5
+
6
+ export type Mode = keyof IConstants;
7
+ export type Flag = Mode | 'a';
8
+ export type Stats = fs.Stats;
9
+
10
+ export interface IConstants {
11
+ e: number,
12
+ r: number,
13
+ w: number,
14
+ x: number
15
+ }
16
+
17
+ const permissions: number[] = [
18
+ 0o400, // OWNER_READ
19
+ 0o200, // OWNER_WRITE
20
+ 0o100, // OWNER_EXECUTE
21
+ 0o040, // GROUP_READ
22
+ 0o020, // GROUP_WRITE
23
+ 0o010, // GROUP_EXECUTE
24
+ 0o004, // OTHERS_READ
25
+ 0o002, // OTHERS_WRITE
26
+ 0o001 // OTHERS_EXECUTE
27
+ ];
28
+
29
+ export class PoweredFileSystem {
30
+ readonly pwd: string;
31
+
32
+ readonly constants: IConstants = {
33
+ e: fs.constants.F_OK,
34
+ r: fs.constants.R_OK,
35
+ w: fs.constants.W_OK,
36
+ x: fs.constants.X_OK
37
+ };
38
+
39
+ constructor(pwd?: string) {
40
+ this.pwd = pwd ? path.resolve(pwd) : process.cwd();
41
+ }
42
+
43
+ private resolve(src: string) {
44
+ return path.resolve(this.pwd, src);
45
+ }
46
+
47
+ static bitmask(mode: number) {
48
+ const type = typeof mode;
49
+
50
+ if (type !== 'number') {
51
+ throw new Error(
52
+ `Argument of type '${type}' is not assignable to parameter of type 'number'.`
53
+ );
54
+ }
55
+
56
+ let umask = 0o000;
57
+
58
+ for (const flag of permissions) {
59
+ if (mode & flag) {
60
+ umask += flag;
61
+ }
62
+ }
63
+
64
+ return umask;
65
+ }
66
+
67
+ test(src: string, options: {
68
+ sync: true,
69
+ flag?: Mode
70
+ }): boolean;
71
+
72
+ test(src: string, options?: {
73
+ sync?: false,
74
+ flag?: Mode
75
+ }): Promise<boolean>;
76
+
77
+ test(src: string, { sync = false, flag = 'e' }: {
78
+ sync?: boolean,
79
+ flag?: Mode
80
+ } = {}) {
81
+ const mode = this.constants[flag];
82
+
83
+ src = path.resolve(this.pwd, src);
84
+
85
+ if (sync) {
86
+ return fs.existsSync(src);
87
+ }
88
+
89
+ return new Promise((resolve) => {
90
+ fs.access(src, mode, (err) => {
91
+ if (err) {
92
+ return resolve(false);
93
+ }
94
+
95
+ resolve(true);
96
+ });
97
+ });
98
+ }
99
+
100
+ stat(src: string, options: { sync: true }): Stats;
101
+
102
+ stat(src: string, options?: { sync?: false }): Promise<Stats>;
103
+
104
+ stat(src: string, { sync = false }: { sync?: boolean } = {}) {
105
+ src = this.resolve(src);
106
+
107
+ if (sync) {
108
+ return fs.lstatSync(src);
109
+ }
110
+
111
+ return new Promise((resolve, reject) => {
112
+ fs.lstat(src, (err, stats) => {
113
+ if (err) {
114
+ return reject(err);
115
+ }
116
+
117
+ resolve(stats);
118
+ });
119
+ });
120
+ }
121
+
122
+ chmod(src: string, mode: number, options: {
123
+ sync: true
124
+ }): void;
125
+
126
+ chmod(src: string, mode: number, options?: {
127
+ sync?: false
128
+ }): Promise<void>;
129
+
130
+ chmod(src: string, mode: number, { sync = false }: { sync?: boolean } = {}) {
131
+ src = this.resolve(src);
132
+
133
+ if (sync) {
134
+ return recurseSync.chmod(src, mode);
135
+ }
136
+
137
+ return new Promise<void>((resolve, reject) => {
138
+ recurse.chmod(src, mode, (err) => {
139
+ if (err) {
140
+ return reject(err);
141
+ }
142
+
143
+ resolve();
144
+ });
145
+ });
146
+ }
147
+
148
+ chown(src: string, uid: number, gid: number, options: {
149
+ sync: true
150
+ }): void;
151
+
152
+ chown(src: string, uid: number, gid: number, options?: {
153
+ sync?: false
154
+ }): Promise<void>;
155
+
156
+ chown(src: string, uid: number, gid: number, { sync = false }: { sync?: boolean } = {}) {
157
+ src = this.resolve(src);
158
+
159
+ if (sync) {
160
+ return recurseSync.chown(src, uid, gid);
161
+ }
162
+
163
+ return new Promise<void>((resolve, reject) => {
164
+ recurse.chown(src, uid, gid, (err) => {
165
+ if (err) {
166
+ return reject(err);
167
+ }
168
+
169
+ resolve();
170
+ });
171
+ });
172
+ }
173
+
174
+ symlink(src: string, use: string, options: {
175
+ sync: true
176
+ }): void;
177
+
178
+ symlink(src: string, use: string, options?: {
179
+ sync?: false
180
+ }): Promise<void>;
181
+
182
+ symlink(src: string, use: string, { sync = false }: { sync?: boolean } = {}) {
183
+ src = this.resolve(src);
184
+ use = this.resolve(use);
185
+
186
+ if (sync) {
187
+ return fs.symlinkSync(src, use);
188
+ }
189
+
190
+ return new Promise<void>((resolve, reject) => {
191
+ fs.symlink(src, use, (err) => {
192
+ if (err) {
193
+ return reject(err);
194
+ }
195
+
196
+ resolve();
197
+ });
198
+ });
199
+ }
200
+
201
+ copy(src: string, dir: string, options: {
202
+ sync: true,
203
+ umask?: number
204
+ }): void;
205
+
206
+ copy(src: string, dir: string, options?: {
207
+ sync?: false,
208
+ umask?: number
209
+ }): Promise<void>;
210
+
211
+ copy(src: string, dir: string, { sync = false, umask = 0o000 }: {
212
+ sync?: boolean,
213
+ umask?: number
214
+ } = {}) {
215
+ src = this.resolve(src);
216
+ dir = this.resolve(dir);
217
+
218
+ if (sync) {
219
+ return recurseSync.copy(src, dir, umask);
220
+ }
221
+
222
+ return new Promise<void>((resolve, reject) => {
223
+ recurse.copy(src, dir, umask, (err) => {
224
+ if (err) {
225
+ return reject(err);
226
+ }
227
+
228
+ resolve();
229
+ });
230
+ });
231
+ }
232
+
233
+ rename(src: string, use: string, options: {
234
+ sync: true
235
+ }): void;
236
+
237
+ rename(src: string, use: string, options?: {
238
+ sync?: false
239
+ }): Promise<void>;
240
+
241
+ rename(src: string, use: string, { sync = false }: { sync?: boolean } = {}) {
242
+ src = this.resolve(src);
243
+ use = this.resolve(use);
244
+
245
+ if (sync) {
246
+ return fs.renameSync(src, use);
247
+ }
248
+
249
+ return new Promise<void>((resolve, reject) => {
250
+ fs.rename(src, use, (err) => {
251
+ if (err) {
252
+ return reject(err);
253
+ }
254
+
255
+ resolve();
256
+ });
257
+ });
258
+ }
259
+
260
+ remove(src: string, options: {
261
+ sync: true
262
+ }): void;
263
+
264
+ remove(src: string, options?: {
265
+ sync?: false
266
+ }): Promise<void>;
267
+
268
+ remove(src: string, { sync = false }: { sync?: boolean } = {}) {
269
+ src = this.resolve(src);
270
+
271
+ if (sync) {
272
+ return recurseSync.remove(src);
273
+ }
274
+
275
+ return new Promise<void>((resolve, reject) => {
276
+ recurse.remove(src, (err) => {
277
+ if (err) {
278
+ return reject(err);
279
+ }
280
+
281
+ resolve();
282
+ });
283
+ });
284
+ }
285
+
286
+ read(src: string, options: {
287
+ sync: true,
288
+ encoding?: BufferEncoding,
289
+ flag?: Flag
290
+ }): string;
291
+
292
+ read(src: string, options: {
293
+ sync: true,
294
+ encoding?: null,
295
+ flag?: Flag
296
+ }): Buffer;
297
+
298
+ read(src: string, options: {
299
+ sync?: false,
300
+ encoding: null,
301
+ flag?: Flag
302
+ }): Promise<Buffer>;
303
+
304
+ read(src: string, options?: {
305
+ sync?: false,
306
+ encoding?: BufferEncoding,
307
+ flag?: Flag
308
+ }): Promise<string>;
309
+
310
+ read(src: string, { sync = false, encoding = 'utf8', flag = 'r' }: {
311
+ sync?: boolean,
312
+ encoding?: BufferEncoding | null,
313
+ flag?: Flag
314
+ } = {}) {
315
+ src = this.resolve(src);
316
+
317
+ if (sync) {
318
+ return fs.readFileSync(src, {
319
+ encoding,
320
+ flag
321
+ });
322
+ }
323
+
324
+ return new Promise((resolve, reject) => {
325
+ fs.readFile(src, {
326
+ encoding,
327
+ flag
328
+ },
329
+ (err, raw) => {
330
+ if (err) {
331
+ return reject(err);
332
+ }
333
+
334
+ resolve(raw);
335
+ });
336
+ });
337
+ }
338
+
339
+ write(src: string, data: Buffer, options: {
340
+ sync: true,
341
+ encoding: null,
342
+ umask?: number,
343
+ flag?: Flag
344
+ }): void;
345
+
346
+ write(src: string, data: string, options: {
347
+ sync: true,
348
+ encoding?: BufferEncoding,
349
+ umask?: number,
350
+ flag?: Flag
351
+ }): void;
352
+
353
+ write(src: string, data: Buffer, options: {
354
+ sync?: false,
355
+ encoding: null,
356
+ umask?: number,
357
+ flag?: Flag
358
+ }): Promise<void>;
359
+
360
+ write(src: string, data: string, options?: {
361
+ sync?: false,
362
+ encoding?: BufferEncoding,
363
+ umask?: number,
364
+ flag?: Flag
365
+ }): Promise<void>;
366
+
367
+ write(src: string, data: Buffer | string, { sync = false, encoding = 'utf8', umask = 0o000, flag = 'w' }: {
368
+ sync?: boolean,
369
+ encoding?: BufferEncoding | null,
370
+ umask?: number,
371
+ flag?: Flag
372
+ } = {}) {
373
+ src = this.resolve(src);
374
+
375
+ const mode = 0o666 - umask;
376
+
377
+ if (sync) {
378
+ return fs.writeFileSync(src, data, {
379
+ encoding,
380
+ mode,
381
+ flag
382
+ });
383
+ }
384
+
385
+ return new Promise<void>((resolve, reject) => {
386
+ fs.writeFile(src, data, {
387
+ encoding,
388
+ mode,
389
+ flag
390
+ },
391
+ (err) => {
392
+ if (err) {
393
+ return reject(err);
394
+ }
395
+
396
+ resolve();
397
+ });
398
+ });
399
+ }
400
+
401
+ append(src: string, data: Buffer, options: {
402
+ sync: true,
403
+ encoding: null,
404
+ umask?: number,
405
+ flag?: Flag
406
+ }): void;
407
+
408
+ append(src: string, data: string, options: {
409
+ sync: true,
410
+ encoding?: BufferEncoding,
411
+ umask?: number,
412
+ flag?: Flag
413
+ }): void;
414
+
415
+ append(src: string, data: Buffer, options: {
416
+ sync?: false,
417
+ encoding: null,
418
+ umask?: number,
419
+ flag?: Flag
420
+ }): Promise<void>;
421
+
422
+ append(src: string, data: string, options?: {
423
+ sync?: false,
424
+ encoding?: BufferEncoding,
425
+ umask?: number,
426
+ flag?: Flag
427
+ }): Promise<void>;
428
+
429
+ append(src: string, data: Buffer | string, { sync = false, encoding = 'utf8', umask = 0o000, flag = 'a' }: {
430
+ sync?: boolean,
431
+ encoding?: BufferEncoding | null,
432
+ umask?: number,
433
+ flag?: Flag
434
+ } = {}) {
435
+ src = this.resolve(src);
436
+ const mode = 0o666 - umask;
437
+
438
+ if (sync) {
439
+ return fs.appendFileSync(src, data, {
440
+ encoding,
441
+ mode,
442
+ flag
443
+ });
444
+ }
445
+
446
+ return new Promise<void>((resolve, reject) => {
447
+ fs.appendFile(src, data, {
448
+ encoding,
449
+ mode,
450
+ flag
451
+ },
452
+ (err) => {
453
+ if (err) {
454
+ return reject(err);
455
+ }
456
+
457
+ resolve();
458
+ });
459
+ });
460
+ }
461
+
462
+ readdir(dir: string, options: {
463
+ sync: true,
464
+ encoding?: BufferEncoding | null
465
+ }): string[];
466
+
467
+ readdir(dir: string, options?: {
468
+ sync?: false,
469
+ encoding?: BufferEncoding | null
470
+ }): Promise<string[]>;
471
+
472
+ readdir(dir: string, { sync = false, encoding = 'utf8' }: {
473
+ sync?: boolean,
474
+ encoding?: BufferEncoding | null
475
+ } = {}) {
476
+ dir = this.resolve(dir);
477
+
478
+ if (sync) {
479
+ return fs.readdirSync(dir, {
480
+ encoding
481
+ });
482
+ }
483
+
484
+ return new Promise((resolve, reject) => {
485
+ fs.readdir(dir, { encoding }, (err, list) => {
486
+ if (err) {
487
+ return reject(err);
488
+ }
489
+
490
+ resolve(list);
491
+ });
492
+ });
493
+ }
494
+
495
+ mkdir(dir: string, options: {
496
+ sync: true,
497
+ umask?: number
498
+ }): void;
499
+
500
+ mkdir(dir: string, options?: {
501
+ sync?: false,
502
+ umask?: number
503
+ }): Promise<void>;
504
+
505
+ mkdir(dir: string, { umask = 0o000, sync = false }: {
506
+ umask?: number,
507
+ sync?: boolean
508
+ } = {}) {
509
+ dir = this.resolve(dir);
510
+
511
+ if (sync) {
512
+ return recurseSync.mkdir(dir, umask);
513
+ }
514
+
515
+ return new Promise<void>((resolve, reject) => {
516
+ recurse.mkdir(dir, umask, (err) => {
517
+ if (err) {
518
+ return reject(err);
519
+ }
520
+
521
+ resolve();
522
+ });
523
+ });
524
+ }
525
+ }
@@ -1,102 +1,108 @@
1
- import fs from 'fs';
2
- import path from 'path';
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
3
 
4
- const {sep} = path;
4
+ const { sep } = path;
5
5
 
6
- export default {
7
- chmod(src: string, mode: number): void {
8
- const stat = fs.statSync(src);
6
+ function chmod(src: string, mode: number) {
7
+ const stat = fs.statSync(src);
9
8
 
10
- if (stat.isDirectory()) {
11
- const list = fs.readdirSync(src);
9
+ if (stat.isDirectory()) {
10
+ const list = fs.readdirSync(src);
12
11
 
13
- for (const loc of list) {
14
- this.chmod(`${src}${sep}${loc}`, mode);
15
- }
12
+ for (const loc of list) {
13
+ chmod(`${src}${sep}${loc}`, mode);
16
14
  }
15
+ }
17
16
 
18
- fs.chmodSync(src, mode);
19
- },
17
+ fs.chmodSync(src, mode);
18
+ }
20
19
 
21
- chown(src: string, uid: number, gid: number): void {
22
- const stat = fs.statSync(src);
20
+ function chown(src: string, uid: number, gid: number) {
21
+ const stat = fs.statSync(src);
23
22
 
24
- if (stat.isDirectory()) {
25
- const list = fs.readdirSync(src);
23
+ if (stat.isDirectory()) {
24
+ const list = fs.readdirSync(src);
26
25
 
27
- for (const loc of list) {
28
- this.chown(`${src}${sep}${loc}`, uid, gid);
29
- }
26
+ for (const loc of list) {
27
+ chown(`${src}${sep}${loc}`, uid, gid);
30
28
  }
29
+ }
31
30
 
32
- fs.chownSync(src, uid, gid);
33
- },
34
-
35
- copy(src: string, dir: string, umask: number): void {
36
- const stat = fs.statSync(src);
31
+ fs.chownSync(src, uid, gid);
32
+ }
37
33
 
38
- if (stat.isDirectory()) {
39
- const list = fs.readdirSync(src);
34
+ function copy(src: string, dir: string, umask: number) {
35
+ const stat = fs.statSync(src);
40
36
 
41
- const paths = src.split(sep);
42
- const loc = paths[paths.length - 1];
43
- const mode = 0o777 - umask;
37
+ if (stat.isDirectory()) {
38
+ const list = fs.readdirSync(src);
44
39
 
45
- dir = `${dir}${sep}${loc}`;
46
- fs.mkdirSync(dir, mode);
40
+ const paths = src.split(sep);
41
+ const loc = paths[paths.length - 1];
42
+ const mode = 0o777 - umask;
47
43
 
48
- for (const loc of list) {
49
- this.copy(`${src}${sep}${loc}`, dir, umask);
50
- }
51
- }
52
- else {
53
- const loc = path.basename(src);
54
- const use = `${dir}${sep}${loc}`;
44
+ dir = `${dir}${sep}${loc}`;
45
+ fs.mkdirSync(dir, mode);
55
46
 
56
- fs.copyFileSync(src, use);
47
+ for (const loc of list) {
48
+ copy(`${src}${sep}${loc}`, dir, umask);
57
49
  }
58
- },
50
+ }
51
+ else {
52
+ const loc = path.basename(src);
53
+ const use = `${dir}${sep}${loc}`;
59
54
 
60
- remove(src: string): void {
61
- const stat = fs.statSync(src);
55
+ fs.copyFileSync(src, use);
56
+ }
57
+ }
62
58
 
63
- if (stat.isDirectory()) {
64
- const list = fs.readdirSync(src);
59
+ function remove(src: string) {
60
+ const stat = fs.statSync(src);
65
61
 
66
- for (const loc of list) {
67
- this.remove(`${src}${sep}${loc}`);
68
- }
62
+ if (stat.isDirectory()) {
63
+ const list = fs.readdirSync(src);
69
64
 
70
- fs.rmdirSync(src);
71
- }
72
- else {
73
- fs.unlinkSync(src);
65
+ for (const loc of list) {
66
+ remove(`${src}${sep}${loc}`);
74
67
  }
75
- },
76
68
 
77
- mkdir(dir: string, umask: number): void {
78
- const mode = 0o777 - umask;
79
- const cwd = process.cwd();
80
- let use = '';
69
+ fs.rmdirSync(src);
70
+ }
71
+ else {
72
+ fs.unlinkSync(src);
73
+ }
74
+ }
81
75
 
82
- if (dir.indexOf(cwd) === 0) {
83
- use = cwd;
84
- dir = dir.substr(cwd.length);
85
- }
76
+ function mkdir(dir: string, umask: number) {
77
+ const mode = 0o777 - umask;
78
+ const cwd = process.cwd();
79
+ let use = '';
86
80
 
87
- const ways = dir.split(sep).slice(1);
81
+ if (dir.indexOf(cwd) === 0) {
82
+ use = cwd;
83
+ dir = dir.substr(cwd.length);
84
+ }
88
85
 
89
- for (const loc of ways) {
90
- use += `${sep}${loc}`;
86
+ const ways = dir.split(sep).slice(1);
91
87
 
92
- try {
93
- fs.mkdirSync(use, { mode });
94
- }
95
- catch (err) {
96
- if (err.errno !== -17) {
97
- throw err;
98
- }
88
+ for (const loc of ways) {
89
+ use += `${sep}${loc}`;
90
+
91
+ try {
92
+ fs.mkdirSync(use, { mode });
93
+ }
94
+ catch (err) {
95
+ if (err.errno !== -17) {
96
+ throw err;
99
97
  }
100
98
  }
101
99
  }
102
100
  }
101
+
102
+ export default {
103
+ chmod,
104
+ chown,
105
+ copy,
106
+ remove,
107
+ mkdir
108
+ }