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,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;