@verdaccio/local-storage 10.5.0 → 10.5.1
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/README.md +4 -6
- package/lib/_virtual/_rolldown/runtime.js +23 -0
- package/lib/dir-utils.js +77 -104
- package/lib/dir-utils.js.map +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/index.js +10 -14
- package/lib/index.js.map +1 -1
- package/lib/local-database.d.ts +9 -9
- package/lib/local-database.js +223 -258
- package/lib/local-database.js.map +1 -1
- package/lib/local-fs.d.ts +2 -3
- package/lib/local-fs.js +268 -314
- package/lib/local-fs.js.map +1 -1
- package/lib/pkg-utils.js +27 -35
- package/lib/pkg-utils.js.map +1 -1
- package/lib/token.d.ts +2 -2
- package/lib/token.js +75 -93
- package/lib/token.js.map +1 -1
- package/lib/utils.d.ts +2 -3
- package/package.json +17 -17
- package/lib/utils.js +0 -79
- package/lib/utils.js.map +0 -1
package/lib/local-fs.js
CHANGED
|
@@ -1,319 +1,273 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
const
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
const fSError = function (message, code = 409) {
|
|
25
|
-
const err = _core.errorUtils.getCode(code, message);
|
|
26
|
-
// FIXME: we should return http-status codes here instead, future improvement
|
|
27
|
-
// @ts-ignore
|
|
28
|
-
err.code = message;
|
|
29
|
-
return err;
|
|
1
|
+
const require_runtime = require("./_virtual/_rolldown/runtime.js");
|
|
2
|
+
let debug = require("debug");
|
|
3
|
+
debug = require_runtime.__toESM(debug);
|
|
4
|
+
let fs = require("fs");
|
|
5
|
+
fs = require_runtime.__toESM(fs);
|
|
6
|
+
let lodash = require("lodash");
|
|
7
|
+
lodash = require_runtime.__toESM(lodash);
|
|
8
|
+
let mkdirp = require("mkdirp");
|
|
9
|
+
mkdirp = require_runtime.__toESM(mkdirp);
|
|
10
|
+
let path = require("path");
|
|
11
|
+
path = require_runtime.__toESM(path);
|
|
12
|
+
let _verdaccio_core = require("@verdaccio/core");
|
|
13
|
+
let _verdaccio_file_locking = require("@verdaccio/file-locking");
|
|
14
|
+
let _verdaccio_streams = require("@verdaccio/streams");
|
|
15
|
+
//#region src/local-fs.ts
|
|
16
|
+
var fileExist = "EEXISTS";
|
|
17
|
+
var noSuchFile = "ENOENT";
|
|
18
|
+
var pkgFileName = "package.json";
|
|
19
|
+
var debug$1 = (0, debug.default)("verdaccio:plugin:local-storage:fs");
|
|
20
|
+
var fSError = function(message, code = 409) {
|
|
21
|
+
const err = _verdaccio_core.errorUtils.getCode(code, message);
|
|
22
|
+
err.code = message;
|
|
23
|
+
return err;
|
|
30
24
|
};
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
return `${str}.tmp${String(Math.random()).substr(2)}`;
|
|
25
|
+
var tempFile = function(str) {
|
|
26
|
+
return `${str}.tmp${String(Math.random()).substr(2)}`;
|
|
34
27
|
};
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
// windows can't remove opened file,
|
|
47
|
-
// but it seem to be able to rename it
|
|
48
|
-
const tmp = tempFile(dst);
|
|
49
|
-
_fs.default.rename(dst, tmp, function (err) {
|
|
50
|
-
_fs.default.rename(src, dst, cb);
|
|
51
|
-
if (!err) {
|
|
52
|
-
_fs.default.unlink(tmp, () => {});
|
|
53
|
-
}
|
|
54
|
-
});
|
|
28
|
+
var renameTmp = function(src, dst, _cb) {
|
|
29
|
+
const cb = (err) => {
|
|
30
|
+
if (err) fs.default.unlink(src, () => {});
|
|
31
|
+
_cb(err);
|
|
32
|
+
};
|
|
33
|
+
if (process.platform !== "win32") return fs.default.rename(src, dst, cb);
|
|
34
|
+
const tmp = tempFile(dst);
|
|
35
|
+
fs.default.rename(dst, tmp, function(err) {
|
|
36
|
+
fs.default.rename(src, dst, cb);
|
|
37
|
+
if (!err) fs.default.unlink(tmp, () => {});
|
|
38
|
+
});
|
|
55
39
|
};
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
});
|
|
287
|
-
};
|
|
288
|
-
createTempFile(err => {
|
|
289
|
-
if (err && err.code === noSuchFile) {
|
|
290
|
-
(0, _mkdirp.default)(_path.default.dirname(dest)).then(() => {
|
|
291
|
-
createTempFile(cb);
|
|
292
|
-
}).catch(err => {
|
|
293
|
-
return cb(err);
|
|
294
|
-
});
|
|
295
|
-
} else {
|
|
296
|
-
cb(err);
|
|
297
|
-
}
|
|
298
|
-
});
|
|
299
|
-
}
|
|
300
|
-
_lockAndReadJSON(name, cb) {
|
|
301
|
-
const fileName = this._getStorage(name);
|
|
302
|
-
(0, _fileLocking.readFile)(fileName, {
|
|
303
|
-
lock: true,
|
|
304
|
-
parse: true
|
|
305
|
-
}, (err, res) => {
|
|
306
|
-
if (err) {
|
|
307
|
-
debug('error on lock and read json for file: %o', name);
|
|
308
|
-
return cb(err);
|
|
309
|
-
}
|
|
310
|
-
debug('lock and read json for file: %o', name);
|
|
311
|
-
return cb(null, res);
|
|
312
|
-
});
|
|
313
|
-
}
|
|
314
|
-
_unlockJSON(name, cb) {
|
|
315
|
-
(0, _fileLocking.unlockFile)(this._getStorage(name), cb);
|
|
316
|
-
}
|
|
317
|
-
}
|
|
40
|
+
var LocalFS = class {
|
|
41
|
+
path;
|
|
42
|
+
logger;
|
|
43
|
+
constructor(path$2, logger) {
|
|
44
|
+
this.path = path$2;
|
|
45
|
+
this.logger = logger;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* This function allows to update the package thread-safely
|
|
49
|
+
Algorithm:
|
|
50
|
+
1. lock package.json for writing
|
|
51
|
+
2. read package.json
|
|
52
|
+
3. updateFn(pkg, cb), and wait for cb
|
|
53
|
+
4. write package.json.tmp
|
|
54
|
+
5. move package.json.tmp package.json
|
|
55
|
+
6. callback(err?)
|
|
56
|
+
* @param {*} name
|
|
57
|
+
* @param {*} updateHandler
|
|
58
|
+
* @param {*} onWrite
|
|
59
|
+
* @param {*} transformPackage
|
|
60
|
+
* @param {*} onEnd
|
|
61
|
+
*/
|
|
62
|
+
updatePackage(name, updateHandler, onWrite, transformPackage, onEnd) {
|
|
63
|
+
this._lockAndReadJSON(pkgFileName, (err, json) => {
|
|
64
|
+
let locked = false;
|
|
65
|
+
const self = this;
|
|
66
|
+
const unLockCallback = function(lockError) {
|
|
67
|
+
const _args = arguments;
|
|
68
|
+
if (locked) self._unlockJSON(pkgFileName, () => {
|
|
69
|
+
if (lockError !== null) debug$1("lock file: %o has failed with error %o", name, lockError);
|
|
70
|
+
onEnd.apply(lockError, _args);
|
|
71
|
+
});
|
|
72
|
+
else {
|
|
73
|
+
debug$1("file: %o has been updated", name);
|
|
74
|
+
onEnd(..._args);
|
|
75
|
+
}
|
|
76
|
+
};
|
|
77
|
+
if (!err) {
|
|
78
|
+
locked = true;
|
|
79
|
+
debug$1("file: %o has been locked", name);
|
|
80
|
+
}
|
|
81
|
+
if (lodash.default.isNil(err) === false) if (err.code === "EAGAIN") return unLockCallback(_verdaccio_core.errorUtils.getInternalError("resource temporarily unavailable"));
|
|
82
|
+
else if (err.code === "ENOENT") return unLockCallback(_verdaccio_core.errorUtils.getNotFound());
|
|
83
|
+
else return unLockCallback(err);
|
|
84
|
+
updateHandler(json, (err) => {
|
|
85
|
+
if (err) return unLockCallback(err);
|
|
86
|
+
onWrite(name, transformPackage(json), unLockCallback);
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
deletePackage(packageName, callback) {
|
|
91
|
+
debug$1("delete a package %o", packageName);
|
|
92
|
+
return fs.default.unlink(this._getStorage(packageName), callback);
|
|
93
|
+
}
|
|
94
|
+
removePackage(callback) {
|
|
95
|
+
debug$1("remove a package %o", this.path);
|
|
96
|
+
fs.default.rmdir(this._getStorage("."), callback);
|
|
97
|
+
}
|
|
98
|
+
createPackage(name, value, cb) {
|
|
99
|
+
debug$1("create a package %o", name);
|
|
100
|
+
this._createFile(this._getStorage(pkgFileName), this._convertToString(value), cb);
|
|
101
|
+
}
|
|
102
|
+
savePackage(name, value, cb) {
|
|
103
|
+
debug$1("save a package %o", name);
|
|
104
|
+
this._writeFile(this._getStorage(pkgFileName), this._convertToString(value), cb);
|
|
105
|
+
}
|
|
106
|
+
readPackage(name, cb) {
|
|
107
|
+
debug$1("read a package %o", name);
|
|
108
|
+
this._readStorageFile(this._getStorage(pkgFileName)).then((res) => {
|
|
109
|
+
try {
|
|
110
|
+
const data = JSON.parse(res.toString("utf8"));
|
|
111
|
+
debug$1("read storage file %o has succeed", name);
|
|
112
|
+
cb(null, data);
|
|
113
|
+
} catch (err) {
|
|
114
|
+
debug$1("parse storage file %o has failed with error %o", name, err);
|
|
115
|
+
cb(err);
|
|
116
|
+
}
|
|
117
|
+
}, (err) => {
|
|
118
|
+
debug$1("read storage file %o has failed with error %o", name, err);
|
|
119
|
+
return cb(err);
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
writeTarball(name) {
|
|
123
|
+
const uploadStream = new _verdaccio_streams.UploadTarball({});
|
|
124
|
+
debug$1("write a tarball for a package %o", name);
|
|
125
|
+
let _ended = 0;
|
|
126
|
+
uploadStream.on("end", function() {
|
|
127
|
+
_ended = 1;
|
|
128
|
+
});
|
|
129
|
+
const pathName = this._getStorage(name);
|
|
130
|
+
fs.default.access(pathName, (fileNotFound) => {
|
|
131
|
+
if (!fileNotFound) uploadStream.emit("error", fSError(fileExist));
|
|
132
|
+
else {
|
|
133
|
+
const temporalName = path.default.join(this.path, `${name}.tmp-${String(Math.random()).replace(/^0\./, "")}`);
|
|
134
|
+
debug$1("write a temporal name %o", temporalName);
|
|
135
|
+
const file = fs.default.createWriteStream(temporalName);
|
|
136
|
+
const removeTempFile = () => fs.default.unlink(temporalName, () => {});
|
|
137
|
+
let opened = false;
|
|
138
|
+
uploadStream.pipe(file);
|
|
139
|
+
uploadStream.done = function() {
|
|
140
|
+
const onend = function() {
|
|
141
|
+
file.on("close", function() {
|
|
142
|
+
renameTmp(temporalName, pathName, function(err) {
|
|
143
|
+
if (err) uploadStream.emit("error", err);
|
|
144
|
+
else uploadStream.emit("success");
|
|
145
|
+
});
|
|
146
|
+
});
|
|
147
|
+
file.end();
|
|
148
|
+
};
|
|
149
|
+
if (_ended) onend();
|
|
150
|
+
else uploadStream.on("end", onend);
|
|
151
|
+
};
|
|
152
|
+
uploadStream.abort = function() {
|
|
153
|
+
if (opened) {
|
|
154
|
+
opened = false;
|
|
155
|
+
file.on("close", function() {
|
|
156
|
+
removeTempFile();
|
|
157
|
+
});
|
|
158
|
+
} else removeTempFile();
|
|
159
|
+
file.end();
|
|
160
|
+
};
|
|
161
|
+
file.on("open", function() {
|
|
162
|
+
opened = true;
|
|
163
|
+
uploadStream.emit("open");
|
|
164
|
+
});
|
|
165
|
+
file.on("error", function(err) {
|
|
166
|
+
uploadStream.emit("error", err);
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
});
|
|
170
|
+
return uploadStream;
|
|
171
|
+
}
|
|
172
|
+
readTarball(name) {
|
|
173
|
+
const pathName = this._getStorage(name);
|
|
174
|
+
debug$1("read a a tarball %o on path %o", name, pathName);
|
|
175
|
+
const readTarballStream = new _verdaccio_streams.ReadTarball({});
|
|
176
|
+
const readStream = fs.default.createReadStream(pathName);
|
|
177
|
+
readStream.on("error", function(err) {
|
|
178
|
+
debug$1("error on read a tarball %o with error %o", name, err);
|
|
179
|
+
readTarballStream.emit("error", err);
|
|
180
|
+
});
|
|
181
|
+
readStream.on("open", function(fd) {
|
|
182
|
+
fs.default.fstat(fd, function(err, stats) {
|
|
183
|
+
if (lodash.default.isNil(err) === false) {
|
|
184
|
+
debug$1("error on read a tarball %o with error %o", name, err);
|
|
185
|
+
return readTarballStream.emit("error", err);
|
|
186
|
+
}
|
|
187
|
+
readTarballStream.emit("content-length", stats.size);
|
|
188
|
+
readTarballStream.emit("open");
|
|
189
|
+
debug$1("open on read a tarball %o", name);
|
|
190
|
+
readStream.pipe(readTarballStream);
|
|
191
|
+
});
|
|
192
|
+
});
|
|
193
|
+
readTarballStream.abort = function() {
|
|
194
|
+
debug$1("abort on read a tarball %o", name);
|
|
195
|
+
readStream.close();
|
|
196
|
+
};
|
|
197
|
+
return readTarballStream;
|
|
198
|
+
}
|
|
199
|
+
_createFile(name, contents, callback) {
|
|
200
|
+
debug$1(" create a new file: %o", name);
|
|
201
|
+
fs.default.open(name, "wx", (err) => {
|
|
202
|
+
if (err) {
|
|
203
|
+
if (err.code === "EEXIST") {
|
|
204
|
+
debug$1("file %o cannot be created, it already exists: %o", name);
|
|
205
|
+
return callback(fSError(fileExist));
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
this._writeFile(name, contents, callback);
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
_readStorageFile(name) {
|
|
212
|
+
return new Promise((resolve, reject) => {
|
|
213
|
+
debug$1("reading the file: %o", name);
|
|
214
|
+
fs.default.readFile(name, (err, data) => {
|
|
215
|
+
if (err) {
|
|
216
|
+
debug$1("error reading the file: %o with error %o", name, err);
|
|
217
|
+
reject(err);
|
|
218
|
+
} else {
|
|
219
|
+
debug$1("read file %o succeed", name);
|
|
220
|
+
resolve(data);
|
|
221
|
+
}
|
|
222
|
+
});
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
_convertToString(value) {
|
|
226
|
+
return JSON.stringify(value, null, " ");
|
|
227
|
+
}
|
|
228
|
+
_getStorage(fileName = "") {
|
|
229
|
+
return path.default.join(this.path, fileName);
|
|
230
|
+
}
|
|
231
|
+
_writeFile(dest, data, cb) {
|
|
232
|
+
const createTempFile = (cb) => {
|
|
233
|
+
const tempFilePath = tempFile(dest);
|
|
234
|
+
fs.default.writeFile(tempFilePath, data, (err) => {
|
|
235
|
+
if (err) {
|
|
236
|
+
debug$1("error on write the file: %o", dest);
|
|
237
|
+
return cb(err);
|
|
238
|
+
}
|
|
239
|
+
debug$1("creating a new file:: %o", dest);
|
|
240
|
+
renameTmp(tempFilePath, dest, cb);
|
|
241
|
+
});
|
|
242
|
+
};
|
|
243
|
+
createTempFile((err) => {
|
|
244
|
+
if (err && err.code === "ENOENT") (0, mkdirp.default)(path.default.dirname(dest)).then(() => {
|
|
245
|
+
createTempFile(cb);
|
|
246
|
+
}).catch((err) => {
|
|
247
|
+
return cb(err);
|
|
248
|
+
});
|
|
249
|
+
else cb(err);
|
|
250
|
+
});
|
|
251
|
+
}
|
|
252
|
+
_lockAndReadJSON(name, cb) {
|
|
253
|
+
(0, _verdaccio_file_locking.readFile)(this._getStorage(name), {
|
|
254
|
+
lock: true,
|
|
255
|
+
parse: true
|
|
256
|
+
}, (err, res) => {
|
|
257
|
+
if (err) {
|
|
258
|
+
debug$1("error on lock and read json for file: %o", name);
|
|
259
|
+
return cb(err);
|
|
260
|
+
}
|
|
261
|
+
debug$1("lock and read json for file: %o", name);
|
|
262
|
+
return cb(null, res);
|
|
263
|
+
});
|
|
264
|
+
}
|
|
265
|
+
_unlockJSON(name, cb) {
|
|
266
|
+
(0, _verdaccio_file_locking.unlockFile)(this._getStorage(name), cb);
|
|
267
|
+
}
|
|
268
|
+
};
|
|
269
|
+
//#endregion
|
|
318
270
|
exports.default = LocalFS;
|
|
271
|
+
exports.noSuchFile = noSuchFile;
|
|
272
|
+
|
|
319
273
|
//# sourceMappingURL=local-fs.js.map
|