@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.
@@ -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
+ });