@atlaspack/fs 2.12.1-canary.3354
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/LICENSE +201 -0
- package/index.d.ts +23 -0
- package/lib/browser.js +1134 -0
- package/lib/browser.js.map +1 -0
- package/lib/index.js +2278 -0
- package/lib/index.js.map +1 -0
- package/lib/types.d.ts +0 -0
- package/package.json +73 -0
- package/src/MemoryFS.js +1036 -0
- package/src/NodeFS.browser.js +9 -0
- package/src/NodeFS.js +290 -0
- package/src/OverlayFS.js +439 -0
- package/src/find.js +81 -0
- package/src/index.js +45 -0
- package/test/OverlayFS.test.js +232 -0
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
// @flow
|
|
2
|
+
|
|
3
|
+
import {OverlayFS} from '../src/OverlayFS';
|
|
4
|
+
import {fsFixture} from '@atlaspack/test-utils/src/fsFixture';
|
|
5
|
+
import {MemoryFS} from '../src/MemoryFS';
|
|
6
|
+
import WorkerFarm from '@atlaspack/workers';
|
|
7
|
+
|
|
8
|
+
import assert from 'assert';
|
|
9
|
+
import path from 'path';
|
|
10
|
+
|
|
11
|
+
describe('OverlayFS', () => {
|
|
12
|
+
let underlayFS;
|
|
13
|
+
let fs;
|
|
14
|
+
let workerFarm;
|
|
15
|
+
|
|
16
|
+
beforeEach(() => {
|
|
17
|
+
workerFarm = new WorkerFarm({
|
|
18
|
+
workerPath: require.resolve('@atlaspack/core/src/worker.js'),
|
|
19
|
+
});
|
|
20
|
+
underlayFS = new MemoryFS(workerFarm);
|
|
21
|
+
fs = new OverlayFS(workerFarm, underlayFS);
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
afterEach(async () => {
|
|
25
|
+
await workerFarm.end();
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
it('copies on write', async () => {
|
|
29
|
+
await fsFixture(underlayFS)`
|
|
30
|
+
foo: foo
|
|
31
|
+
`;
|
|
32
|
+
|
|
33
|
+
assert.equal(fs.readFileSync('foo', 'utf8'), 'foo');
|
|
34
|
+
|
|
35
|
+
await fs.writeFile('foo', 'bar');
|
|
36
|
+
|
|
37
|
+
assert.equal(fs.readFileSync('foo', 'utf8'), 'bar');
|
|
38
|
+
assert.equal(underlayFS.readFileSync('foo', 'utf8'), 'foo');
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
it('copies on write with dir', async () => {
|
|
42
|
+
await fsFixture(underlayFS)`
|
|
43
|
+
foo/foo: foo
|
|
44
|
+
`;
|
|
45
|
+
|
|
46
|
+
assert.equal(fs.readFileSync('foo/foo', 'utf8'), 'foo');
|
|
47
|
+
|
|
48
|
+
await fs.writeFile('foo/bar', 'bar');
|
|
49
|
+
|
|
50
|
+
assert.equal(fs.readFileSync('foo/bar', 'utf8'), 'bar');
|
|
51
|
+
assert(!underlayFS.existsSync('foo/bar'));
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
it('copies on write when copying', async () => {
|
|
55
|
+
await fsFixture(underlayFS)`
|
|
56
|
+
foo: foo
|
|
57
|
+
`;
|
|
58
|
+
|
|
59
|
+
assert.equal(fs.readFileSync('foo', 'utf8'), 'foo');
|
|
60
|
+
|
|
61
|
+
await fs.copyFile('foo', 'bar');
|
|
62
|
+
assert.equal(fs.readFileSync('bar', 'utf8'), 'foo');
|
|
63
|
+
assert(!underlayFS.existsSync('bar'));
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
it('copies on write when copying with dir', async () => {
|
|
67
|
+
await fsFixture(underlayFS)`
|
|
68
|
+
foo/foo: foo
|
|
69
|
+
bar
|
|
70
|
+
`;
|
|
71
|
+
|
|
72
|
+
assert.equal(fs.readFileSync('foo/foo', 'utf8'), 'foo');
|
|
73
|
+
|
|
74
|
+
await fs.copyFile('foo/foo', 'bar/bar');
|
|
75
|
+
assert.equal(fs.readFileSync('bar/bar', 'utf8'), 'foo');
|
|
76
|
+
assert(!underlayFS.existsSync('bar/bar'));
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
it('writes to memory', async () => {
|
|
80
|
+
await fs.writeFile('foo', 'foo');
|
|
81
|
+
|
|
82
|
+
assert.equal(fs.readFileSync('foo', 'utf8'), 'foo');
|
|
83
|
+
assert(!underlayFS.existsSync('foo'));
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
it('symlinks in memory', async () => {
|
|
87
|
+
await fsFixture(underlayFS)`
|
|
88
|
+
foo: foo
|
|
89
|
+
`;
|
|
90
|
+
|
|
91
|
+
assert(fs.existsSync('foo'));
|
|
92
|
+
|
|
93
|
+
await fs.symlink('foo', 'bar');
|
|
94
|
+
|
|
95
|
+
assert.equal(fs.readFileSync('bar', 'utf8'), 'foo');
|
|
96
|
+
assert.equal(underlayFS.readFileSync('foo', 'utf8'), 'foo');
|
|
97
|
+
assert.equal(fs.realpathSync('bar'), path.resolve('/foo'));
|
|
98
|
+
assert(!underlayFS.existsSync('bar'));
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
it('tracks deletes', async () => {
|
|
102
|
+
await fsFixture(underlayFS)`
|
|
103
|
+
foo: bar
|
|
104
|
+
baz -> foo`;
|
|
105
|
+
|
|
106
|
+
assert(fs.existsSync('foo'));
|
|
107
|
+
assert.equal(fs.realpathSync('baz'), path.resolve('/foo'));
|
|
108
|
+
assert(fs._isSymlink('baz'));
|
|
109
|
+
|
|
110
|
+
await fs.rimraf('foo');
|
|
111
|
+
|
|
112
|
+
assert(!fs.existsSync('foo'));
|
|
113
|
+
assert(fs._isSymlink('baz'));
|
|
114
|
+
assert(!fs.existsSync('baz'));
|
|
115
|
+
assert(underlayFS.existsSync('foo'));
|
|
116
|
+
assert(underlayFS.existsSync('baz'));
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
it('tracks unlinks', async () => {
|
|
120
|
+
await fsFixture(underlayFS)`
|
|
121
|
+
foo: bar
|
|
122
|
+
baz -> foo`;
|
|
123
|
+
|
|
124
|
+
assert(fs.existsSync('baz'));
|
|
125
|
+
assert.equal(fs.realpathSync('baz'), path.resolve('/foo'));
|
|
126
|
+
assert(fs._isSymlink('baz'));
|
|
127
|
+
|
|
128
|
+
await fs.unlink('baz');
|
|
129
|
+
|
|
130
|
+
assert(!fs._isSymlink('baz'));
|
|
131
|
+
assert(!fs.existsSync('baz'));
|
|
132
|
+
assert(fs.existsSync('foo'));
|
|
133
|
+
assert(underlayFS.existsSync('foo'));
|
|
134
|
+
assert(underlayFS.existsSync('baz'));
|
|
135
|
+
assert.equal(underlayFS.realpathSync('baz'), path.resolve('/foo'));
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
it('tracks nested deletes', async () => {
|
|
139
|
+
await fsFixture(underlayFS)`
|
|
140
|
+
foo/bar: baz
|
|
141
|
+
foo/bat/baz: qux
|
|
142
|
+
`;
|
|
143
|
+
|
|
144
|
+
assert(fs.existsSync('foo/bar'));
|
|
145
|
+
assert(fs.existsSync('foo/bat/baz'));
|
|
146
|
+
|
|
147
|
+
await fs.rimraf('foo');
|
|
148
|
+
|
|
149
|
+
assert(!fs.existsSync('foo/bar'));
|
|
150
|
+
assert(!fs.existsSync('foo/bat/baz'));
|
|
151
|
+
assert(underlayFS.existsSync('foo/bar'));
|
|
152
|
+
assert(underlayFS.existsSync('foo/bat/baz'));
|
|
153
|
+
|
|
154
|
+
await fs.mkdirp('foo');
|
|
155
|
+
|
|
156
|
+
assert(fs.existsSync('foo'));
|
|
157
|
+
assert(!fs.existsSync('foo/bar'));
|
|
158
|
+
assert(!fs.existsSync('foo/baz/bat'));
|
|
159
|
+
|
|
160
|
+
await fs.mkdirp('foo/baz');
|
|
161
|
+
assert(fs.existsSync('foo/baz'));
|
|
162
|
+
assert(!fs.existsSync('foo/baz/bat'));
|
|
163
|
+
});
|
|
164
|
+
|
|
165
|
+
it('supports changing to a dir that is only on the readable fs', async () => {
|
|
166
|
+
await fsFixture(underlayFS)`
|
|
167
|
+
foo/bar: baz
|
|
168
|
+
`;
|
|
169
|
+
|
|
170
|
+
assert.equal(fs.cwd(), path.resolve('/'));
|
|
171
|
+
fs.chdir('/foo');
|
|
172
|
+
assert.equal(fs.cwd(), path.resolve('/foo'));
|
|
173
|
+
});
|
|
174
|
+
|
|
175
|
+
it('supports changing to a dir that is only on the writable fs', async () => {
|
|
176
|
+
await fsFixture(underlayFS)`
|
|
177
|
+
foo/bar: bar
|
|
178
|
+
`;
|
|
179
|
+
|
|
180
|
+
await fs.mkdirp('/bar');
|
|
181
|
+
assert(!underlayFS.existsSync('/bar'));
|
|
182
|
+
|
|
183
|
+
assert.equal(fs.cwd(), path.resolve('/'));
|
|
184
|
+
fs.chdir('/bar');
|
|
185
|
+
assert.equal(fs.cwd(), path.resolve('/bar'));
|
|
186
|
+
});
|
|
187
|
+
|
|
188
|
+
it('supports changing dir relative to cwd', async () => {
|
|
189
|
+
await fsFixture(underlayFS)`
|
|
190
|
+
foo/bar: bar
|
|
191
|
+
`;
|
|
192
|
+
|
|
193
|
+
assert.equal(fs.cwd(), path.resolve('/'));
|
|
194
|
+
fs.chdir('foo');
|
|
195
|
+
assert.equal(fs.cwd(), path.resolve('/foo'));
|
|
196
|
+
});
|
|
197
|
+
|
|
198
|
+
it('changes dir without changing underlying fs dir', async () => {
|
|
199
|
+
await fsFixture(underlayFS)`
|
|
200
|
+
foo/bar: baz
|
|
201
|
+
foo/bat/baz: qux
|
|
202
|
+
`;
|
|
203
|
+
|
|
204
|
+
assert.equal(fs.cwd(), path.resolve('/'));
|
|
205
|
+
assert.equal(underlayFS.cwd(), path.resolve('/'));
|
|
206
|
+
|
|
207
|
+
fs.chdir('foo');
|
|
208
|
+
|
|
209
|
+
assert.equal(fs.cwd(), path.resolve('/foo'));
|
|
210
|
+
assert.equal(underlayFS.cwd(), path.resolve('/'));
|
|
211
|
+
});
|
|
212
|
+
|
|
213
|
+
it('errors when changing to a dir that does not exist on either fs', async () => {
|
|
214
|
+
await fsFixture(underlayFS)`
|
|
215
|
+
foo/bar: bar
|
|
216
|
+
`;
|
|
217
|
+
|
|
218
|
+
assert.throws(() => fs.chdir('/bar'), /ENOENT/);
|
|
219
|
+
});
|
|
220
|
+
|
|
221
|
+
it('errors when changing to a deleted dir', async () => {
|
|
222
|
+
await fsFixture(underlayFS)`
|
|
223
|
+
foo/bar: bar
|
|
224
|
+
`;
|
|
225
|
+
|
|
226
|
+
await fs.rimraf('foo');
|
|
227
|
+
assert(!fs.existsSync('foo'));
|
|
228
|
+
assert(underlayFS.existsSync('foo'));
|
|
229
|
+
|
|
230
|
+
assert.throws(() => fs.chdir('/foo'), /ENOENT/);
|
|
231
|
+
});
|
|
232
|
+
});
|