memfs 4.0.0 → 4.1.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.
Files changed (105) hide show
  1. package/LICENSE +201 -24
  2. package/README.md +21 -92
  3. package/lib/Dirent.d.ts +2 -1
  4. package/lib/__tests__/util.d.ts +13 -0
  5. package/lib/__tests__/util.js +29 -0
  6. package/lib/consts/AMODE.d.ts +9 -0
  7. package/lib/consts/FLAG.d.ts +22 -0
  8. package/lib/consts/FLAG.js +2 -0
  9. package/lib/fsa/types.d.ts +3 -3
  10. package/lib/fsa-to-node/FsaNodeCore.d.ts +32 -0
  11. package/lib/fsa-to-node/FsaNodeCore.js +168 -0
  12. package/lib/fsa-to-node/FsaNodeDirent.d.ts +13 -0
  13. package/lib/fsa-to-node/FsaNodeDirent.js +31 -0
  14. package/lib/fsa-to-node/FsaNodeFs.d.ts +171 -0
  15. package/lib/fsa-to-node/FsaNodeFs.js +842 -0
  16. package/lib/fsa-to-node/FsaNodeFsOpenFile.d.ts +24 -0
  17. package/lib/fsa-to-node/FsaNodeFsOpenFile.js +46 -0
  18. package/lib/fsa-to-node/FsaNodeReadStream.d.ts +24 -0
  19. package/lib/fsa-to-node/FsaNodeReadStream.js +100 -0
  20. package/lib/fsa-to-node/FsaNodeStats.d.ts +30 -0
  21. package/lib/fsa-to-node/FsaNodeStats.js +52 -0
  22. package/lib/fsa-to-node/FsaNodeWriteStream.d.ts +48 -0
  23. package/lib/fsa-to-node/FsaNodeWriteStream.js +162 -0
  24. package/lib/fsa-to-node/__tests__/FsaNodeFs.test.d.ts +1 -0
  25. package/lib/fsa-to-node/__tests__/FsaNodeFs.test.js +873 -0
  26. package/lib/fsa-to-node/__tests__/util.test.d.ts +1 -0
  27. package/lib/fsa-to-node/__tests__/util.test.js +28 -0
  28. package/lib/fsa-to-node/constants.d.ts +3 -0
  29. package/lib/fsa-to-node/constants.js +2 -0
  30. package/lib/fsa-to-node/index.d.ts +2 -0
  31. package/lib/fsa-to-node/index.js +7 -0
  32. package/lib/fsa-to-node/json.d.ts +4 -0
  33. package/lib/fsa-to-node/json.js +7 -0
  34. package/lib/fsa-to-node/types.d.ts +37 -0
  35. package/lib/fsa-to-node/types.js +2 -0
  36. package/lib/fsa-to-node/util.d.ts +4 -0
  37. package/lib/fsa-to-node/util.js +40 -0
  38. package/lib/fsa-to-node/worker/FsaNodeSyncAdapterWorker.d.ts +10 -0
  39. package/lib/fsa-to-node/worker/FsaNodeSyncAdapterWorker.js +72 -0
  40. package/lib/fsa-to-node/worker/FsaNodeSyncWorker.d.ts +20 -0
  41. package/lib/fsa-to-node/worker/FsaNodeSyncWorker.js +190 -0
  42. package/lib/fsa-to-node/worker/SyncMessenger.d.ts +24 -0
  43. package/lib/fsa-to-node/worker/SyncMessenger.js +80 -0
  44. package/lib/fsa-to-node/worker/constants.d.ts +8 -0
  45. package/lib/fsa-to-node/worker/constants.js +2 -0
  46. package/lib/fsa-to-node/worker/types.d.ts +17 -0
  47. package/lib/fsa-to-node/worker/types.js +2 -0
  48. package/lib/index.d.ts +5 -4
  49. package/lib/index.js +1 -1
  50. package/lib/node/constants.d.ts +41 -0
  51. package/lib/node/constants.js +56 -0
  52. package/lib/node/options.d.ts +23 -0
  53. package/lib/node/options.js +94 -0
  54. package/lib/node/promises.d.ts +1 -1
  55. package/lib/node/promises.js +1 -3
  56. package/lib/node/types/FsCommonObjects.d.ts +17 -0
  57. package/lib/node/types/FsCommonObjects.js +2 -0
  58. package/lib/node/types/{sync.d.ts → FsSynchronousApi.d.ts} +36 -37
  59. package/lib/node/types/FsSynchronousApi.js +2 -0
  60. package/lib/node/types/callback.d.ts +57 -58
  61. package/lib/node/types/index.d.ts +1 -1
  62. package/lib/node/types/misc.d.ts +6 -8
  63. package/lib/node/types/options.d.ts +20 -6
  64. package/lib/node/types/promises.d.ts +2 -2
  65. package/lib/node/util.d.ts +19 -0
  66. package/lib/node/util.js +265 -1
  67. package/lib/node-to-fsa/NodeFileSystemDirectoryHandle.d.ts +71 -0
  68. package/lib/node-to-fsa/NodeFileSystemDirectoryHandle.js +264 -0
  69. package/lib/node-to-fsa/NodeFileSystemFileHandle.d.ts +28 -0
  70. package/lib/node-to-fsa/NodeFileSystemFileHandle.js +73 -0
  71. package/lib/node-to-fsa/NodeFileSystemHandle.d.ts +33 -0
  72. package/lib/node-to-fsa/NodeFileSystemHandle.js +53 -0
  73. package/lib/node-to-fsa/NodeFileSystemSyncAccessHandle.d.ts +42 -0
  74. package/lib/node-to-fsa/NodeFileSystemSyncAccessHandle.js +116 -0
  75. package/lib/node-to-fsa/NodeFileSystemWritableFileStream.d.ts +54 -0
  76. package/lib/node-to-fsa/NodeFileSystemWritableFileStream.js +195 -0
  77. package/lib/node-to-fsa/NodePermissionStatus.d.ts +8 -0
  78. package/lib/node-to-fsa/NodePermissionStatus.js +13 -0
  79. package/lib/node-to-fsa/__tests__/NodeFileSystemDirectoryHandle.test.d.ts +1 -0
  80. package/lib/node-to-fsa/__tests__/NodeFileSystemDirectoryHandle.test.js +627 -0
  81. package/lib/node-to-fsa/__tests__/NodeFileSystemFileHandle.test.d.ts +1 -0
  82. package/lib/node-to-fsa/__tests__/NodeFileSystemFileHandle.test.js +191 -0
  83. package/lib/node-to-fsa/__tests__/NodeFileSystemHandle.test.d.ts +1 -0
  84. package/lib/node-to-fsa/__tests__/NodeFileSystemHandle.test.js +49 -0
  85. package/lib/node-to-fsa/__tests__/NodeFileSystemSyncAccessHandle.test.d.ts +1 -0
  86. package/lib/node-to-fsa/__tests__/NodeFileSystemSyncAccessHandle.test.js +183 -0
  87. package/lib/node-to-fsa/__tests__/NodeFileSystemWritableFileStream.test.d.ts +1 -0
  88. package/lib/node-to-fsa/__tests__/NodeFileSystemWritableFileStream.test.js +106 -0
  89. package/lib/node-to-fsa/__tests__/scenarios.test.d.ts +1 -0
  90. package/lib/node-to-fsa/__tests__/scenarios.test.js +46 -0
  91. package/lib/node-to-fsa/__tests__/util.test.d.ts +1 -0
  92. package/lib/node-to-fsa/__tests__/util.test.js +25 -0
  93. package/lib/node-to-fsa/index.d.ts +7 -0
  94. package/lib/node-to-fsa/index.js +26 -0
  95. package/lib/node-to-fsa/types.d.ts +12 -0
  96. package/lib/node-to-fsa/types.js +2 -0
  97. package/lib/node-to-fsa/util.d.ts +11 -0
  98. package/lib/node-to-fsa/util.js +33 -0
  99. package/lib/node.d.ts +1 -1
  100. package/lib/volume.d.ts +45 -126
  101. package/lib/volume.js +204 -562
  102. package/lib/webfs/index.d.ts +1 -0
  103. package/lib/webfs/index.js +22 -0
  104. package/package.json +28 -5
  105. /package/lib/{node/types/sync.js → consts/AMODE.js} +0 -0
@@ -0,0 +1,627 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __asyncValues = (this && this.__asyncValues) || function (o) {
12
+ if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
13
+ var m = o[Symbol.asyncIterator], i;
14
+ return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
15
+ function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
16
+ function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
17
+ };
18
+ Object.defineProperty(exports, "__esModule", { value: true });
19
+ const __1 = require("../..");
20
+ const NodeFileSystemDirectoryHandle_1 = require("../NodeFileSystemDirectoryHandle");
21
+ const NodeFileSystemFileHandle_1 = require("../NodeFileSystemFileHandle");
22
+ const util_1 = require("../../__tests__/util");
23
+ const setup = (json = {}) => {
24
+ const fs = (0, __1.memfs)(json, '/');
25
+ const dir = new NodeFileSystemDirectoryHandle_1.NodeFileSystemDirectoryHandle(fs, '/', { mode: 'readwrite' });
26
+ return { dir, fs };
27
+ };
28
+ (0, util_1.onlyOnNode20)('NodeFileSystemDirectoryHandle', () => {
29
+ test('can instantiate', () => {
30
+ const { dir } = setup();
31
+ expect(dir).toBeInstanceOf(NodeFileSystemDirectoryHandle_1.NodeFileSystemDirectoryHandle);
32
+ });
33
+ describe('.keys()', () => {
34
+ test('returns an empty iterator for an empty directory', () => __awaiter(void 0, void 0, void 0, function* () {
35
+ const { dir } = setup();
36
+ const keys = dir.keys();
37
+ expect(yield keys.next()).toStrictEqual({ done: true, value: undefined });
38
+ }));
39
+ test('returns a folder', () => __awaiter(void 0, void 0, void 0, function* () {
40
+ var _a, e_1, _b, _c;
41
+ const { dir } = setup({ folder: null });
42
+ const list = [];
43
+ try {
44
+ for (var _d = true, _e = __asyncValues(dir.keys()), _f; _f = yield _e.next(), _a = _f.done, !_a;) {
45
+ _c = _f.value;
46
+ _d = false;
47
+ try {
48
+ const key = _c;
49
+ list.push(key);
50
+ }
51
+ finally {
52
+ _d = true;
53
+ }
54
+ }
55
+ }
56
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
57
+ finally {
58
+ try {
59
+ if (!_d && !_a && (_b = _e.return)) yield _b.call(_e);
60
+ }
61
+ finally { if (e_1) throw e_1.error; }
62
+ }
63
+ expect(list).toStrictEqual(['folder']);
64
+ }));
65
+ test('returns two folders', () => __awaiter(void 0, void 0, void 0, function* () {
66
+ var _g, e_2, _h, _j;
67
+ const { dir } = setup({
68
+ folder: null,
69
+ 'another/folder': null,
70
+ });
71
+ const list = [];
72
+ try {
73
+ for (var _k = true, _l = __asyncValues(dir.keys()), _m; _m = yield _l.next(), _g = _m.done, !_g;) {
74
+ _j = _m.value;
75
+ _k = false;
76
+ try {
77
+ const key = _j;
78
+ list.push(key);
79
+ }
80
+ finally {
81
+ _k = true;
82
+ }
83
+ }
84
+ }
85
+ catch (e_2_1) { e_2 = { error: e_2_1 }; }
86
+ finally {
87
+ try {
88
+ if (!_k && !_g && (_h = _l.return)) yield _h.call(_l);
89
+ }
90
+ finally { if (e_2) throw e_2.error; }
91
+ }
92
+ expect(list.length).toBe(2);
93
+ }));
94
+ test('returns a file', () => __awaiter(void 0, void 0, void 0, function* () {
95
+ var _o, e_3, _p, _q;
96
+ const { dir } = setup({
97
+ 'file.txt': 'Hello, world!',
98
+ });
99
+ const list = [];
100
+ try {
101
+ for (var _r = true, _s = __asyncValues(dir.keys()), _t; _t = yield _s.next(), _o = _t.done, !_o;) {
102
+ _q = _t.value;
103
+ _r = false;
104
+ try {
105
+ const key = _q;
106
+ list.push(key);
107
+ }
108
+ finally {
109
+ _r = true;
110
+ }
111
+ }
112
+ }
113
+ catch (e_3_1) { e_3 = { error: e_3_1 }; }
114
+ finally {
115
+ try {
116
+ if (!_r && !_o && (_p = _s.return)) yield _p.call(_s);
117
+ }
118
+ finally { if (e_3) throw e_3.error; }
119
+ }
120
+ expect(list).toStrictEqual(['file.txt']);
121
+ }));
122
+ });
123
+ describe('.entries()', () => {
124
+ test('returns an empty iterator for an empty directory', () => __awaiter(void 0, void 0, void 0, function* () {
125
+ const { dir } = setup();
126
+ const keys = dir.entries();
127
+ expect(yield keys.next()).toStrictEqual({ done: true, value: undefined });
128
+ }));
129
+ test('returns a folder', () => __awaiter(void 0, void 0, void 0, function* () {
130
+ var _a, e_4, _b, _c;
131
+ const { dir } = setup({ 'My Documents': null });
132
+ try {
133
+ for (var _d = true, _e = __asyncValues(dir.entries()), _f; _f = yield _e.next(), _a = _f.done, !_a;) {
134
+ _c = _f.value;
135
+ _d = false;
136
+ try {
137
+ const [name, subdir] = _c;
138
+ expect(name).toBe('My Documents');
139
+ expect(subdir).toBeInstanceOf(NodeFileSystemDirectoryHandle_1.NodeFileSystemDirectoryHandle);
140
+ expect(subdir.kind).toBe('directory');
141
+ expect(subdir.name).toBe('My Documents');
142
+ }
143
+ finally {
144
+ _d = true;
145
+ }
146
+ }
147
+ }
148
+ catch (e_4_1) { e_4 = { error: e_4_1 }; }
149
+ finally {
150
+ try {
151
+ if (!_d && !_a && (_b = _e.return)) yield _b.call(_e);
152
+ }
153
+ finally { if (e_4) throw e_4.error; }
154
+ }
155
+ }));
156
+ test('returns a file', () => __awaiter(void 0, void 0, void 0, function* () {
157
+ var _g, e_5, _h, _j;
158
+ const { dir } = setup({
159
+ 'file.txt': 'Hello, world!',
160
+ });
161
+ try {
162
+ for (var _k = true, _l = __asyncValues(dir.entries()), _m; _m = yield _l.next(), _g = _m.done, !_g;) {
163
+ _j = _m.value;
164
+ _k = false;
165
+ try {
166
+ const [name, file] = _j;
167
+ expect(name).toBe('file.txt');
168
+ expect(file).toBeInstanceOf(NodeFileSystemFileHandle_1.NodeFileSystemFileHandle);
169
+ expect(file.kind).toBe('file');
170
+ expect(file.name).toBe('file.txt');
171
+ }
172
+ finally {
173
+ _k = true;
174
+ }
175
+ }
176
+ }
177
+ catch (e_5_1) { e_5 = { error: e_5_1 }; }
178
+ finally {
179
+ try {
180
+ if (!_k && !_g && (_h = _l.return)) yield _h.call(_l);
181
+ }
182
+ finally { if (e_5) throw e_5.error; }
183
+ }
184
+ }));
185
+ test('returns two entries', () => __awaiter(void 0, void 0, void 0, function* () {
186
+ var _o, e_6, _p, _q;
187
+ const { dir } = setup({
188
+ 'index.html': '<nobr>Hello, world!</nobr>',
189
+ 'another/folder': null,
190
+ });
191
+ const handles = [];
192
+ try {
193
+ for (var _r = true, _s = __asyncValues(dir.entries()), _t; _t = yield _s.next(), _o = _t.done, !_o;) {
194
+ _q = _t.value;
195
+ _r = false;
196
+ try {
197
+ const entry = _q;
198
+ handles.push(entry[1]);
199
+ }
200
+ finally {
201
+ _r = true;
202
+ }
203
+ }
204
+ }
205
+ catch (e_6_1) { e_6 = { error: e_6_1 }; }
206
+ finally {
207
+ try {
208
+ if (!_r && !_o && (_p = _s.return)) yield _p.call(_s);
209
+ }
210
+ finally { if (e_6) throw e_6.error; }
211
+ }
212
+ expect(handles.length).toBe(2);
213
+ expect(handles.find(handle => handle.name === 'index.html')).toBeInstanceOf(NodeFileSystemFileHandle_1.NodeFileSystemFileHandle);
214
+ expect(handles.find(handle => handle.name === 'another')).toBeInstanceOf(NodeFileSystemDirectoryHandle_1.NodeFileSystemDirectoryHandle);
215
+ }));
216
+ });
217
+ describe('.values()', () => {
218
+ test('returns an empty iterator for an empty directory', () => __awaiter(void 0, void 0, void 0, function* () {
219
+ const { dir } = setup();
220
+ const values = dir.values();
221
+ expect(yield values.next()).toStrictEqual({ done: true, value: undefined });
222
+ }));
223
+ test('returns a folder', () => __awaiter(void 0, void 0, void 0, function* () {
224
+ var _a, e_7, _b, _c;
225
+ const { dir } = setup({ 'My Documents': null });
226
+ try {
227
+ for (var _d = true, _e = __asyncValues(dir.values()), _f; _f = yield _e.next(), _a = _f.done, !_a;) {
228
+ _c = _f.value;
229
+ _d = false;
230
+ try {
231
+ const subdir = _c;
232
+ expect(subdir).toBeInstanceOf(NodeFileSystemDirectoryHandle_1.NodeFileSystemDirectoryHandle);
233
+ expect(subdir.kind).toBe('directory');
234
+ expect(subdir.name).toBe('My Documents');
235
+ }
236
+ finally {
237
+ _d = true;
238
+ }
239
+ }
240
+ }
241
+ catch (e_7_1) { e_7 = { error: e_7_1 }; }
242
+ finally {
243
+ try {
244
+ if (!_d && !_a && (_b = _e.return)) yield _b.call(_e);
245
+ }
246
+ finally { if (e_7) throw e_7.error; }
247
+ }
248
+ }));
249
+ test('returns a file', () => __awaiter(void 0, void 0, void 0, function* () {
250
+ var _g, e_8, _h, _j;
251
+ const { dir } = setup({
252
+ 'file.txt': 'Hello, world!',
253
+ });
254
+ try {
255
+ for (var _k = true, _l = __asyncValues(dir.values()), _m; _m = yield _l.next(), _g = _m.done, !_g;) {
256
+ _j = _m.value;
257
+ _k = false;
258
+ try {
259
+ const file = _j;
260
+ expect(file).toBeInstanceOf(NodeFileSystemFileHandle_1.NodeFileSystemFileHandle);
261
+ expect(file.kind).toBe('file');
262
+ expect(file.name).toBe('file.txt');
263
+ }
264
+ finally {
265
+ _k = true;
266
+ }
267
+ }
268
+ }
269
+ catch (e_8_1) { e_8 = { error: e_8_1 }; }
270
+ finally {
271
+ try {
272
+ if (!_k && !_g && (_h = _l.return)) yield _h.call(_l);
273
+ }
274
+ finally { if (e_8) throw e_8.error; }
275
+ }
276
+ }));
277
+ test('returns two entries', () => __awaiter(void 0, void 0, void 0, function* () {
278
+ var _o, e_9, _p, _q;
279
+ const { dir } = setup({
280
+ 'index.html': '<nobr>Hello, world!</nobr>',
281
+ 'another/folder': null,
282
+ });
283
+ const handles = [];
284
+ try {
285
+ for (var _r = true, _s = __asyncValues(dir.values()), _t; _t = yield _s.next(), _o = _t.done, !_o;) {
286
+ _q = _t.value;
287
+ _r = false;
288
+ try {
289
+ const entry = _q;
290
+ handles.push(entry);
291
+ }
292
+ finally {
293
+ _r = true;
294
+ }
295
+ }
296
+ }
297
+ catch (e_9_1) { e_9 = { error: e_9_1 }; }
298
+ finally {
299
+ try {
300
+ if (!_r && !_o && (_p = _s.return)) yield _p.call(_s);
301
+ }
302
+ finally { if (e_9) throw e_9.error; }
303
+ }
304
+ expect(handles.length).toBe(2);
305
+ expect(handles.find(handle => handle.name === 'index.html')).toBeInstanceOf(NodeFileSystemFileHandle_1.NodeFileSystemFileHandle);
306
+ expect(handles.find(handle => handle.name === 'another')).toBeInstanceOf(NodeFileSystemDirectoryHandle_1.NodeFileSystemDirectoryHandle);
307
+ }));
308
+ });
309
+ describe('.getDirectoryHandle()', () => {
310
+ test('throws "NotFoundError" DOMException if sub-directory not found', () => __awaiter(void 0, void 0, void 0, function* () {
311
+ const { dir } = setup({ a: null });
312
+ try {
313
+ yield dir.getDirectoryHandle('b');
314
+ throw new Error('Not this error.');
315
+ }
316
+ catch (error) {
317
+ expect(error).toBeInstanceOf(DOMException);
318
+ expect(error.name).toBe('NotFoundError');
319
+ expect(error.message).toBe('A requested file or directory could not be found at the time an operation was processed.');
320
+ }
321
+ }));
322
+ test('throws "TypeMismatchError" DOMException if entry is not a directory', () => __awaiter(void 0, void 0, void 0, function* () {
323
+ const { dir } = setup({ file: 'contents' });
324
+ try {
325
+ yield dir.getDirectoryHandle('file');
326
+ throw new Error('Not this error.');
327
+ }
328
+ catch (error) {
329
+ expect(error).toBeInstanceOf(DOMException);
330
+ expect(error.name).toBe('TypeMismatchError');
331
+ expect(error.message).toBe('The path supplied exists, but was not an entry of requested type.');
332
+ }
333
+ }));
334
+ test('throws if not in "readwrite" mode and attempting to create a directory', () => __awaiter(void 0, void 0, void 0, function* () {
335
+ const fs = (0, __1.memfs)({}, '/');
336
+ const dir = new NodeFileSystemDirectoryHandle_1.NodeFileSystemDirectoryHandle(fs, '/', { mode: 'read' });
337
+ try {
338
+ yield dir.getDirectoryHandle('test', { create: true });
339
+ throw new Error('Not this error');
340
+ }
341
+ catch (error) {
342
+ expect(error).toBeInstanceOf(DOMException);
343
+ expect(error.name).toBe('NotAllowedError');
344
+ expect(error.message).toBe('The request is not allowed by the user agent or the platform in the current context.');
345
+ }
346
+ }));
347
+ const invalidNames = [
348
+ '.',
349
+ '..',
350
+ '/',
351
+ '/a',
352
+ 'a/',
353
+ 'a//b',
354
+ 'a/.',
355
+ 'a/..',
356
+ 'a/b/.',
357
+ 'a/b/..',
358
+ '\\',
359
+ '\\a',
360
+ 'a\\',
361
+ 'a\\\\b',
362
+ 'a\\.',
363
+ ];
364
+ for (const invalidName of invalidNames) {
365
+ test(`throws on invalid file name: "${invalidName}"`, () => __awaiter(void 0, void 0, void 0, function* () {
366
+ const { dir } = setup({ file: 'contents' });
367
+ try {
368
+ yield dir.getDirectoryHandle(invalidName);
369
+ throw new Error('Not this error.');
370
+ }
371
+ catch (error) {
372
+ expect(error).toBeInstanceOf(TypeError);
373
+ expect(error.message).toBe(`Failed to execute 'getDirectoryHandle' on 'FileSystemDirectoryHandle': Name is not allowed.`);
374
+ }
375
+ }));
376
+ }
377
+ test('can retrieve a child directory', () => __awaiter(void 0, void 0, void 0, function* () {
378
+ const { dir } = setup({ file: 'contents', subdir: null });
379
+ const subdir = yield dir.getDirectoryHandle('subdir');
380
+ expect(subdir.kind).toBe('directory');
381
+ expect(subdir.name).toBe('subdir');
382
+ expect(subdir).toBeInstanceOf(NodeFileSystemDirectoryHandle_1.NodeFileSystemDirectoryHandle);
383
+ }));
384
+ test('can create a sub-directory', () => __awaiter(void 0, void 0, void 0, function* () {
385
+ const { dir, fs } = setup({});
386
+ expect(fs.existsSync('/subdir')).toBe(false);
387
+ const subdir = yield dir.getDirectoryHandle('subdir', { create: true });
388
+ expect(fs.existsSync('/subdir')).toBe(true);
389
+ expect(fs.statSync('/subdir').isDirectory()).toBe(true);
390
+ expect(subdir.kind).toBe('directory');
391
+ expect(subdir.name).toBe('subdir');
392
+ expect(subdir).toBeInstanceOf(NodeFileSystemDirectoryHandle_1.NodeFileSystemDirectoryHandle);
393
+ }));
394
+ });
395
+ describe('.getFileHandle()', () => {
396
+ test('throws "NotFoundError" DOMException if file not found', () => __awaiter(void 0, void 0, void 0, function* () {
397
+ const { dir } = setup({ a: null });
398
+ try {
399
+ yield dir.getFileHandle('b');
400
+ throw new Error('Not this error.');
401
+ }
402
+ catch (error) {
403
+ expect(error).toBeInstanceOf(DOMException);
404
+ expect(error.name).toBe('NotFoundError');
405
+ expect(error.message).toBe('A requested file or directory could not be found at the time an operation was processed.');
406
+ }
407
+ }));
408
+ test('throws "TypeMismatchError" DOMException if entry is not a file', () => __awaiter(void 0, void 0, void 0, function* () {
409
+ const { dir } = setup({ directory: null });
410
+ try {
411
+ yield dir.getFileHandle('directory');
412
+ throw new Error('Not this error.');
413
+ }
414
+ catch (error) {
415
+ expect(error).toBeInstanceOf(DOMException);
416
+ expect(error.name).toBe('TypeMismatchError');
417
+ expect(error.message).toBe('The path supplied exists, but was not an entry of requested type.');
418
+ }
419
+ }));
420
+ test('throws if not in "readwrite" mode and attempting to create a file', () => __awaiter(void 0, void 0, void 0, function* () {
421
+ const fs = (0, __1.memfs)({}, '/');
422
+ const dir = new NodeFileSystemDirectoryHandle_1.NodeFileSystemDirectoryHandle(fs, '/', { mode: 'read' });
423
+ try {
424
+ yield dir.getFileHandle('test', { create: true });
425
+ throw new Error('Not this error');
426
+ }
427
+ catch (error) {
428
+ expect(error).toBeInstanceOf(DOMException);
429
+ expect(error.name).toBe('NotAllowedError');
430
+ expect(error.message).toBe('The request is not allowed by the user agent or the platform in the current context.');
431
+ }
432
+ }));
433
+ const invalidNames = [
434
+ '',
435
+ '.',
436
+ '..',
437
+ '/',
438
+ '/a',
439
+ 'a/',
440
+ 'a//b',
441
+ 'a/.',
442
+ 'a/..',
443
+ 'a/b/.',
444
+ 'a/b/..',
445
+ '\\',
446
+ '\\a',
447
+ 'a\\',
448
+ 'a\\\\b',
449
+ 'a\\.',
450
+ ];
451
+ for (const invalidName of invalidNames) {
452
+ test(`throws on invalid file name: "${invalidName}"`, () => __awaiter(void 0, void 0, void 0, function* () {
453
+ const { dir } = setup({ file: 'contents' });
454
+ try {
455
+ yield dir.getFileHandle(invalidName);
456
+ throw new Error('Not this error.');
457
+ }
458
+ catch (error) {
459
+ expect(error).toBeInstanceOf(TypeError);
460
+ expect(error.message).toBe(`Failed to execute 'getFileHandle' on 'FileSystemDirectoryHandle': Name is not allowed.`);
461
+ }
462
+ }));
463
+ }
464
+ test('can retrieve a child file', () => __awaiter(void 0, void 0, void 0, function* () {
465
+ const { dir } = setup({ file: 'contents', subdir: null });
466
+ const subdir = yield dir.getFileHandle('file');
467
+ expect(subdir.kind).toBe('file');
468
+ expect(subdir.name).toBe('file');
469
+ expect(subdir).toBeInstanceOf(NodeFileSystemFileHandle_1.NodeFileSystemFileHandle);
470
+ }));
471
+ test('can create a file', () => __awaiter(void 0, void 0, void 0, function* () {
472
+ const { dir, fs } = setup({});
473
+ expect(fs.existsSync('/text.txt')).toBe(false);
474
+ const subdir = yield dir.getFileHandle('text.txt', { create: true });
475
+ expect(fs.existsSync('/text.txt')).toBe(true);
476
+ expect(fs.statSync('/text.txt').isFile()).toBe(true);
477
+ expect(subdir.kind).toBe('file');
478
+ expect(subdir.name).toBe('text.txt');
479
+ expect(subdir).toBeInstanceOf(NodeFileSystemFileHandle_1.NodeFileSystemFileHandle);
480
+ }));
481
+ });
482
+ describe('.removeEntry()', () => {
483
+ test('throws "NotFoundError" DOMException if file not found', () => __awaiter(void 0, void 0, void 0, function* () {
484
+ const { dir } = setup({ a: null });
485
+ try {
486
+ yield dir.removeEntry('b');
487
+ throw new Error('Not this error.');
488
+ }
489
+ catch (error) {
490
+ expect(error).toBeInstanceOf(DOMException);
491
+ expect(error.name).toBe('NotFoundError');
492
+ expect(error.message).toBe('A requested file or directory could not be found at the time an operation was processed.');
493
+ }
494
+ }));
495
+ test('throws if not in "readwrite" mode and attempting to remove a file', () => __awaiter(void 0, void 0, void 0, function* () {
496
+ const fs = (0, __1.memfs)({ a: 'b' }, '/');
497
+ const dir = new NodeFileSystemDirectoryHandle_1.NodeFileSystemDirectoryHandle(fs, '/', { mode: 'read' });
498
+ try {
499
+ yield dir.removeEntry('a');
500
+ throw new Error('Not this error');
501
+ }
502
+ catch (error) {
503
+ expect(error).toBeInstanceOf(DOMException);
504
+ expect(error.name).toBe('NotAllowedError');
505
+ expect(error.message).toBe('The request is not allowed by the user agent or the platform in the current context.');
506
+ }
507
+ }));
508
+ test('throws if not in "readwrite" mode and attempting to remove a folder', () => __awaiter(void 0, void 0, void 0, function* () {
509
+ const fs = (0, __1.memfs)({ a: null }, '/');
510
+ const dir = new NodeFileSystemDirectoryHandle_1.NodeFileSystemDirectoryHandle(fs, '/', { mode: 'read' });
511
+ try {
512
+ yield dir.removeEntry('a');
513
+ throw new Error('Not this error');
514
+ }
515
+ catch (error) {
516
+ expect(error).toBeInstanceOf(DOMException);
517
+ expect(error.name).toBe('NotAllowedError');
518
+ expect(error.message).toBe('The request is not allowed by the user agent or the platform in the current context.');
519
+ }
520
+ }));
521
+ const invalidNames = [
522
+ '',
523
+ '.',
524
+ '..',
525
+ '/',
526
+ '/a',
527
+ 'a/',
528
+ 'a//b',
529
+ 'a/.',
530
+ 'a/..',
531
+ 'a/b/.',
532
+ 'a/b/..',
533
+ '\\',
534
+ '\\a',
535
+ 'a\\',
536
+ 'a\\\\b',
537
+ 'a\\.',
538
+ ];
539
+ for (const invalidName of invalidNames) {
540
+ test(`throws on invalid file name: "${invalidName}"`, () => __awaiter(void 0, void 0, void 0, function* () {
541
+ const { dir } = setup({ file: 'contents' });
542
+ try {
543
+ yield dir.removeEntry(invalidName);
544
+ throw new Error('Not this error.');
545
+ }
546
+ catch (error) {
547
+ expect(error).toBeInstanceOf(TypeError);
548
+ expect(error.message).toBe(`Failed to execute 'removeEntry' on 'FileSystemDirectoryHandle': Name is not allowed.`);
549
+ }
550
+ }));
551
+ }
552
+ test('can delete a file', () => __awaiter(void 0, void 0, void 0, function* () {
553
+ const { dir, fs } = setup({ file: 'contents', subdir: null });
554
+ expect(fs.statSync('/file').isFile()).toBe(true);
555
+ const res = yield dir.removeEntry('file');
556
+ expect(fs.existsSync('/file')).toBe(false);
557
+ expect(res).toBe(undefined);
558
+ }));
559
+ test('can delete a folder', () => __awaiter(void 0, void 0, void 0, function* () {
560
+ const { dir, fs } = setup({ dir: null });
561
+ expect(fs.statSync('/dir').isDirectory()).toBe(true);
562
+ const res = yield dir.removeEntry('dir');
563
+ expect(fs.existsSync('/dir')).toBe(false);
564
+ expect(res).toBe(undefined);
565
+ }));
566
+ test('throws "InvalidModificationError" DOMException if directory has contents', () => __awaiter(void 0, void 0, void 0, function* () {
567
+ const { dir, fs } = setup({
568
+ 'dir/file': 'contents',
569
+ });
570
+ expect(fs.statSync('/dir').isDirectory()).toBe(true);
571
+ let res;
572
+ try {
573
+ res = yield dir.removeEntry('dir');
574
+ throw new Error('Not this error.');
575
+ }
576
+ catch (error) {
577
+ expect(res).toBe(undefined);
578
+ expect(error).toBeInstanceOf(DOMException);
579
+ expect(error.name).toBe('InvalidModificationError');
580
+ expect(error.message).toBe('The object can not be modified in this way.');
581
+ }
582
+ }));
583
+ test('can recursively delete a folder with "recursive" flag', () => __awaiter(void 0, void 0, void 0, function* () {
584
+ const { dir, fs } = setup({
585
+ 'dir/file': 'contents',
586
+ });
587
+ expect(fs.statSync('/dir').isDirectory()).toBe(true);
588
+ const res = yield dir.removeEntry('dir', { recursive: true });
589
+ expect(fs.existsSync('/dir')).toBe(false);
590
+ expect(res).toBe(undefined);
591
+ }));
592
+ });
593
+ describe('.resolve()', () => {
594
+ test('return empty array for itself', () => __awaiter(void 0, void 0, void 0, function* () {
595
+ const { dir } = setup({});
596
+ const res = yield dir.resolve(dir);
597
+ expect(res).toStrictEqual([]);
598
+ }));
599
+ test('can resolve one level deep child', () => __awaiter(void 0, void 0, void 0, function* () {
600
+ const { dir } = setup({
601
+ file: 'contents',
602
+ });
603
+ const child = yield dir.getFileHandle('file');
604
+ const res = yield dir.resolve(child);
605
+ expect(res).toStrictEqual(['file']);
606
+ }));
607
+ test('can resolve two level deep child', () => __awaiter(void 0, void 0, void 0, function* () {
608
+ const { dir } = setup({
609
+ 'dir/file': 'contents',
610
+ });
611
+ const child1 = yield dir.getDirectoryHandle('dir');
612
+ const child2 = yield child1.getFileHandle('file');
613
+ const res = yield dir.resolve(child2);
614
+ expect(res).toStrictEqual(['dir', 'file']);
615
+ const res2 = yield child1.resolve(child2);
616
+ expect(res2).toStrictEqual(['file']);
617
+ }));
618
+ test('returns "null" if not a descendant', () => __awaiter(void 0, void 0, void 0, function* () {
619
+ const { dir } = setup({
620
+ 'dir/file': 'contents',
621
+ });
622
+ const child1 = yield dir.getDirectoryHandle('dir');
623
+ const res = yield child1.resolve(dir);
624
+ expect(res).toBe(null);
625
+ }));
626
+ });
627
+ });