pwd-fs 3.2.4 → 3.3.0

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