@verdaccio/local-storage 10.0.0-next.1 → 10.0.7
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/lib/index.js +1 -1
- package/lib/index.js.map +1 -0
- package/lib/local-database.d.ts +4 -28
- package/lib/local-database.js +43 -159
- package/lib/local-database.js.map +1 -0
- package/lib/local-fs.d.ts +1 -1
- package/lib/local-fs.js +36 -72
- package/lib/local-fs.js.map +1 -0
- package/lib/pkg-utils.js +2 -2
- package/lib/pkg-utils.js.map +1 -0
- package/lib/token.d.ts +12 -0
- package/lib/token.js +116 -0
- package/lib/token.js.map +1 -0
- package/lib/utils.js +1 -1
- package/lib/utils.js.map +1 -0
- package/package.json +20 -23
- package/CHANGELOG.md +0 -437
package/lib/local-fs.js
CHANGED
|
@@ -9,6 +9,8 @@ var _fs = _interopRequireDefault(require("fs"));
|
|
|
9
9
|
|
|
10
10
|
var _path = _interopRequireDefault(require("path"));
|
|
11
11
|
|
|
12
|
+
var _debug = _interopRequireDefault(require("debug"));
|
|
13
|
+
|
|
12
14
|
var _lodash = _interopRequireDefault(require("lodash"));
|
|
13
15
|
|
|
14
16
|
var _mkdirp = _interopRequireDefault(require("mkdirp"));
|
|
@@ -17,7 +19,7 @@ var _streams = require("@verdaccio/streams");
|
|
|
17
19
|
|
|
18
20
|
var _fileLocking = require("@verdaccio/file-locking");
|
|
19
21
|
|
|
20
|
-
var
|
|
22
|
+
var _commonsApi = require("@verdaccio/commons-api");
|
|
21
23
|
|
|
22
24
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
23
25
|
|
|
@@ -31,9 +33,10 @@ const resourceNotAvailable = 'EAGAIN';
|
|
|
31
33
|
exports.resourceNotAvailable = resourceNotAvailable;
|
|
32
34
|
const pkgFileName = 'package.json';
|
|
33
35
|
exports.pkgFileName = pkgFileName;
|
|
36
|
+
const debug = (0, _debug.default)('verdaccio:plugin:local-storage:fs');
|
|
34
37
|
|
|
35
38
|
const fSError = function (message, code = 409) {
|
|
36
|
-
const err = (0,
|
|
39
|
+
const err = (0, _commonsApi.getCode)(code, message); // FIXME: we should return http-status codes here instead, future improvement
|
|
37
40
|
// @ts-ignore
|
|
38
41
|
|
|
39
42
|
err.code = message;
|
|
@@ -111,34 +114,27 @@ class LocalFS {
|
|
|
111
114
|
self._unlockJSON(pkgFileName, () => {
|
|
112
115
|
// ignore any error from the unlock
|
|
113
116
|
if (lockError !== null) {
|
|
114
|
-
|
|
115
|
-
name,
|
|
116
|
-
lockError
|
|
117
|
-
}, '[local-storage/updatePackage/unLockCallback] file: @{name} lock has failed lockError: @{lockError}');
|
|
117
|
+
debug('lock file: %o has failed with error %o', name, lockError);
|
|
118
118
|
}
|
|
119
119
|
|
|
120
120
|
onEnd.apply(lockError, _args);
|
|
121
121
|
});
|
|
122
122
|
} else {
|
|
123
|
-
|
|
124
|
-
name
|
|
125
|
-
}, '[local-storage/updatePackage/unLockCallback] file: @{name} has been updated');
|
|
123
|
+
debug('file: %o has been updated', name);
|
|
126
124
|
onEnd(..._args);
|
|
127
125
|
}
|
|
128
126
|
};
|
|
129
127
|
|
|
130
128
|
if (!err) {
|
|
131
129
|
locked = true;
|
|
132
|
-
|
|
133
|
-
name
|
|
134
|
-
}, '[local-storage/updatePackage] file: @{name} has been locked');
|
|
130
|
+
debug('file: %o has been locked', name);
|
|
135
131
|
}
|
|
136
132
|
|
|
137
133
|
if (_lodash.default.isNil(err) === false) {
|
|
138
134
|
if (err.code === resourceNotAvailable) {
|
|
139
|
-
return unLockCallback((0,
|
|
135
|
+
return unLockCallback((0, _commonsApi.getInternalError)('resource temporarily unavailable'));
|
|
140
136
|
} else if (err.code === noSuchFile) {
|
|
141
|
-
return unLockCallback((0,
|
|
137
|
+
return unLockCallback((0, _commonsApi.getNotFound)());
|
|
142
138
|
} else {
|
|
143
139
|
return unLockCallback(err);
|
|
144
140
|
}
|
|
@@ -155,67 +151,49 @@ class LocalFS {
|
|
|
155
151
|
}
|
|
156
152
|
|
|
157
153
|
deletePackage(packageName, callback) {
|
|
158
|
-
|
|
159
|
-
packageName
|
|
160
|
-
}, '[local-storage/deletePackage] delete a package @{packageName}');
|
|
154
|
+
debug('delete a package %o', packageName);
|
|
161
155
|
return _fs.default.unlink(this._getStorage(packageName), callback);
|
|
162
156
|
}
|
|
163
157
|
|
|
164
158
|
removePackage(callback) {
|
|
165
|
-
this.
|
|
166
|
-
packageName: this.path
|
|
167
|
-
}, '[local-storage/removePackage] remove a package: @{packageName}');
|
|
159
|
+
debug('remove a package %o', this.path);
|
|
168
160
|
|
|
169
161
|
_fs.default.rmdir(this._getStorage('.'), callback);
|
|
170
162
|
}
|
|
171
163
|
|
|
172
164
|
createPackage(name, value, cb) {
|
|
173
|
-
|
|
174
|
-
packageName: name
|
|
175
|
-
}, '[local-storage/createPackage] create a package: @{packageName}');
|
|
165
|
+
debug('create a package %o', name);
|
|
176
166
|
|
|
177
167
|
this._createFile(this._getStorage(pkgFileName), this._convertToString(value), cb);
|
|
178
168
|
}
|
|
179
169
|
|
|
180
170
|
savePackage(name, value, cb) {
|
|
181
|
-
|
|
182
|
-
packageName: name
|
|
183
|
-
}, '[local-storage/savePackage] save a package: @{packageName}');
|
|
171
|
+
debug('save a package %o', name);
|
|
184
172
|
|
|
185
173
|
this._writeFile(this._getStorage(pkgFileName), this._convertToString(value), cb);
|
|
186
174
|
}
|
|
187
175
|
|
|
188
176
|
readPackage(name, cb) {
|
|
189
|
-
|
|
190
|
-
packageName: name
|
|
191
|
-
}, '[local-storage/readPackage] read a package: @{packageName}');
|
|
177
|
+
debug('read a package %o', name);
|
|
192
178
|
|
|
193
179
|
this._readStorageFile(this._getStorage(pkgFileName)).then(res => {
|
|
194
180
|
try {
|
|
195
181
|
const data = JSON.parse(res.toString('utf8'));
|
|
196
|
-
|
|
197
|
-
packageName: name
|
|
198
|
-
}, '[local-storage/readPackage/_readStorageFile] read a package succeed: @{packageName}');
|
|
182
|
+
debug('read storage file %o has succeed', name);
|
|
199
183
|
cb(null, data);
|
|
200
184
|
} catch (err) {
|
|
201
|
-
|
|
202
|
-
err
|
|
203
|
-
}, '[local-storage/readPackage/_readStorageFile] error on read a package: @{err}');
|
|
185
|
+
debug('parse storage file %o has failed with error %o', name, err);
|
|
204
186
|
cb(err);
|
|
205
187
|
}
|
|
206
188
|
}, err => {
|
|
207
|
-
|
|
208
|
-
err
|
|
209
|
-
}, '[local-storage/readPackage/_readStorageFile] error on read a package: @{err}');
|
|
189
|
+
debug('read storage file %o has failed with error %o', name, err);
|
|
210
190
|
return cb(err);
|
|
211
191
|
});
|
|
212
192
|
}
|
|
213
193
|
|
|
214
194
|
writeTarball(name) {
|
|
215
195
|
const uploadStream = new _streams.UploadTarball({});
|
|
216
|
-
|
|
217
|
-
packageName: name
|
|
218
|
-
}, '[local-storage/writeTarball] write a tarball for package: @{packageName}');
|
|
196
|
+
debug('write a tarball for a package %o', name);
|
|
219
197
|
let _ended = 0;
|
|
220
198
|
uploadStream.on('end', function () {
|
|
221
199
|
_ended = 1;
|
|
@@ -231,6 +209,8 @@ class LocalFS {
|
|
|
231
209
|
} else {
|
|
232
210
|
const temporalName = _path.default.join(this.path, `${name}.tmp-${String(Math.random()).replace(/^0\./, '')}`);
|
|
233
211
|
|
|
212
|
+
debug('write a temporal name %o', temporalName);
|
|
213
|
+
|
|
234
214
|
const file = _fs.default.createWriteStream(temporalName);
|
|
235
215
|
|
|
236
216
|
const removeTempFile = () => _fs.default.unlink(temporalName, () => {});
|
|
@@ -290,29 +270,31 @@ class LocalFS {
|
|
|
290
270
|
readTarball(name) {
|
|
291
271
|
const pathName = this._getStorage(name);
|
|
292
272
|
|
|
293
|
-
|
|
294
|
-
packageName: name
|
|
295
|
-
}, '[local-storage/readTarball] read a tarball for package: @{packageName}');
|
|
273
|
+
debug('read a a tarball %o on path %o', name, pathName);
|
|
296
274
|
const readTarballStream = new _streams.ReadTarball({});
|
|
297
275
|
|
|
298
276
|
const readStream = _fs.default.createReadStream(pathName);
|
|
299
277
|
|
|
300
278
|
readStream.on('error', function (err) {
|
|
279
|
+
debug('error on read a tarball %o with error %o', name, err);
|
|
301
280
|
readTarballStream.emit('error', err);
|
|
302
281
|
});
|
|
303
282
|
readStream.on('open', function (fd) {
|
|
304
283
|
_fs.default.fstat(fd, function (err, stats) {
|
|
305
284
|
if (_lodash.default.isNil(err) === false) {
|
|
285
|
+
debug('error on read a tarball %o with error %o', name, err);
|
|
306
286
|
return readTarballStream.emit('error', err);
|
|
307
287
|
}
|
|
308
288
|
|
|
309
289
|
readTarballStream.emit('content-length', stats.size);
|
|
310
290
|
readTarballStream.emit('open');
|
|
291
|
+
debug('open on read a tarball %o', name);
|
|
311
292
|
readStream.pipe(readTarballStream);
|
|
312
293
|
});
|
|
313
294
|
});
|
|
314
295
|
|
|
315
296
|
readTarballStream.abort = function () {
|
|
297
|
+
debug('abort on read a tarball %o', name);
|
|
316
298
|
readStream.close();
|
|
317
299
|
};
|
|
318
300
|
|
|
@@ -320,17 +302,13 @@ class LocalFS {
|
|
|
320
302
|
}
|
|
321
303
|
|
|
322
304
|
_createFile(name, contents, callback) {
|
|
323
|
-
|
|
324
|
-
name
|
|
325
|
-
}, '[local-storage/_createFile] create a new file: @{name}');
|
|
305
|
+
debug(' create a new file: %o', name);
|
|
326
306
|
|
|
327
307
|
_fs.default.open(name, 'wx', err => {
|
|
328
308
|
if (err) {
|
|
329
309
|
// native EEXIST used here to check exception on fs.open
|
|
330
310
|
if (err.code === 'EEXIST') {
|
|
331
|
-
|
|
332
|
-
name
|
|
333
|
-
}, '[local-storage/_createFile] file cannot be created, it already exists: @{name}');
|
|
311
|
+
debug('file %o cannot be created, it already exists: %o', name);
|
|
334
312
|
return callback(fSError(fileExist));
|
|
335
313
|
}
|
|
336
314
|
}
|
|
@@ -341,20 +319,14 @@ class LocalFS {
|
|
|
341
319
|
|
|
342
320
|
_readStorageFile(name) {
|
|
343
321
|
return new Promise((resolve, reject) => {
|
|
344
|
-
|
|
345
|
-
name
|
|
346
|
-
}, '[local-storage/_readStorageFile] read a file: @{name}');
|
|
322
|
+
debug('reading the file: %o', name);
|
|
347
323
|
|
|
348
324
|
_fs.default.readFile(name, (err, data) => {
|
|
349
325
|
if (err) {
|
|
350
|
-
|
|
351
|
-
err
|
|
352
|
-
}, '[local-storage/_readStorageFile] error on read the file: @{name}');
|
|
326
|
+
debug('error reading the file: %o with error %o', name, err);
|
|
353
327
|
reject(err);
|
|
354
328
|
} else {
|
|
355
|
-
|
|
356
|
-
name
|
|
357
|
-
}, '[local-storage/_readStorageFile] read file succeed: @{name}');
|
|
329
|
+
debug('read file %o succeed', name);
|
|
358
330
|
resolve(data);
|
|
359
331
|
}
|
|
360
332
|
});
|
|
@@ -377,15 +349,11 @@ class LocalFS {
|
|
|
377
349
|
|
|
378
350
|
_fs.default.writeFile(tempFilePath, data, err => {
|
|
379
351
|
if (err) {
|
|
380
|
-
|
|
381
|
-
name: dest
|
|
382
|
-
}, '[local-storage/_writeFile] new file: @{name} has been created');
|
|
352
|
+
debug('error on write the file: %o', dest);
|
|
383
353
|
return cb(err);
|
|
384
354
|
}
|
|
385
355
|
|
|
386
|
-
|
|
387
|
-
name: dest
|
|
388
|
-
}, '[local-storage/_writeFile] creating a new file: @{name}');
|
|
356
|
+
debug('creating a new file:: %o', dest);
|
|
389
357
|
renameTmp(tempFilePath, dest, cb);
|
|
390
358
|
});
|
|
391
359
|
};
|
|
@@ -411,15 +379,11 @@ class LocalFS {
|
|
|
411
379
|
parse: true
|
|
412
380
|
}, (err, res) => {
|
|
413
381
|
if (err) {
|
|
414
|
-
|
|
415
|
-
name
|
|
416
|
-
}, '[local-storage/_lockAndReadJSON] read new file: @{name} has failed');
|
|
382
|
+
debug('error on lock and read json for file: %o', name);
|
|
417
383
|
return cb(err);
|
|
418
384
|
}
|
|
419
385
|
|
|
420
|
-
|
|
421
|
-
name
|
|
422
|
-
}, '[local-storage/_lockAndReadJSON] file: @{name} read');
|
|
386
|
+
debug('lock and read json for file: %o', name);
|
|
423
387
|
return cb(null, res);
|
|
424
388
|
});
|
|
425
389
|
}
|
|
@@ -431,4 +395,4 @@ class LocalFS {
|
|
|
431
395
|
}
|
|
432
396
|
|
|
433
397
|
exports.default = LocalFS;
|
|
434
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9sb2NhbC1mcy50cyJdLCJuYW1lcyI6WyJmaWxlRXhpc3QiLCJub1N1Y2hGaWxlIiwicmVzb3VyY2VOb3RBdmFpbGFibGUiLCJwa2dGaWxlTmFtZSIsImZTRXJyb3IiLCJtZXNzYWdlIiwiY29kZSIsImVyciIsInRlbXBGaWxlIiwic3RyIiwiU3RyaW5nIiwiTWF0aCIsInJhbmRvbSIsInN1YnN0ciIsInJlbmFtZVRtcCIsInNyYyIsImRzdCIsIl9jYiIsImNiIiwiZnMiLCJ1bmxpbmsiLCJwcm9jZXNzIiwicGxhdGZvcm0iLCJyZW5hbWUiLCJ0bXAiLCJMb2NhbEZTIiwiY29uc3RydWN0b3IiLCJwYXRoIiwibG9nZ2VyIiwidXBkYXRlUGFja2FnZSIsIm5hbWUiLCJ1cGRhdGVIYW5kbGVyIiwib25Xcml0ZSIsInRyYW5zZm9ybVBhY2thZ2UiLCJvbkVuZCIsIl9sb2NrQW5kUmVhZEpTT04iLCJqc29uIiwibG9ja2VkIiwic2VsZiIsInVuTG9ja0NhbGxiYWNrIiwibG9ja0Vycm9yIiwiX2FyZ3MiLCJhcmd1bWVudHMiLCJfdW5sb2NrSlNPTiIsInRyYWNlIiwiYXBwbHkiLCJfIiwiaXNOaWwiLCJkZWxldGVQYWNrYWdlIiwicGFja2FnZU5hbWUiLCJjYWxsYmFjayIsImRlYnVnIiwiX2dldFN0b3JhZ2UiLCJyZW1vdmVQYWNrYWdlIiwicm1kaXIiLCJjcmVhdGVQYWNrYWdlIiwidmFsdWUiLCJfY3JlYXRlRmlsZSIsIl9jb252ZXJ0VG9TdHJpbmciLCJzYXZlUGFja2FnZSIsIl93cml0ZUZpbGUiLCJyZWFkUGFja2FnZSIsIl9yZWFkU3RvcmFnZUZpbGUiLCJ0aGVuIiwicmVzIiwiZGF0YSIsIkpTT04iLCJwYXJzZSIsInRvU3RyaW5nIiwid3JpdGVUYXJiYWxsIiwidXBsb2FkU3RyZWFtIiwiVXBsb2FkVGFyYmFsbCIsIl9lbmRlZCIsIm9uIiwicGF0aE5hbWUiLCJhY2Nlc3MiLCJmaWxlTm90Rm91bmQiLCJleGlzdHMiLCJlbWl0IiwidGVtcG9yYWxOYW1lIiwiam9pbiIsInJlcGxhY2UiLCJmaWxlIiwiY3JlYXRlV3JpdGVTdHJlYW0iLCJyZW1vdmVUZW1wRmlsZSIsIm9wZW5lZCIsInBpcGUiLCJkb25lIiwib25lbmQiLCJlbmQiLCJhYm9ydCIsInJlYWRUYXJiYWxsIiwicmVhZFRhcmJhbGxTdHJlYW0iLCJSZWFkVGFyYmFsbCIsInJlYWRTdHJlYW0iLCJjcmVhdGVSZWFkU3RyZWFtIiwiZmQiLCJmc3RhdCIsInN0YXRzIiwic2l6ZSIsImNsb3NlIiwiY29udGVudHMiLCJvcGVuIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJyZWFkRmlsZSIsInN0cmluZ2lmeSIsImZpbGVOYW1lIiwic3RvcmFnZVBhdGgiLCJkZXN0IiwiY3JlYXRlVGVtcEZpbGUiLCJ0ZW1wRmlsZVBhdGgiLCJ3cml0ZUZpbGUiLCJkaXJuYW1lIiwiY2F0Y2giLCJsb2NrIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7O0FBQ0E7O0FBRUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUE7Ozs7OztBQUVPLE1BQU1BLFNBQVMsR0FBRyxTQUFsQjs7QUFDQSxNQUFNQyxVQUFVLEdBQUcsUUFBbkI7O0FBQ0EsTUFBTUMsb0JBQW9CLEdBQUcsUUFBN0I7O0FBQ0EsTUFBTUMsV0FBVyxHQUFHLGNBQXBCOzs7QUFFQSxNQUFNQyxPQUFPLEdBQUcsVUFBVUMsT0FBVixFQUEyQkMsSUFBSSxHQUFHLEdBQWxDLEVBQXVEO0FBQzVFLFFBQU1DLEdBQW1CLEdBQUcsa0JBQVFELElBQVIsRUFBY0QsT0FBZCxDQUE1QixDQUQ0RSxDQUU1RTtBQUNBOztBQUNBRSxFQUFBQSxHQUFHLENBQUNELElBQUosR0FBV0QsT0FBWDtBQUVBLFNBQU9FLEdBQVA7QUFDRCxDQVBNOzs7O0FBU1AsTUFBTUMsUUFBUSxHQUFHLFVBQVVDLEdBQVYsRUFBdUI7QUFDdEMsU0FBUSxHQUFFQSxHQUFJLE9BQU1DLE1BQU0sQ0FBQ0MsSUFBSSxDQUFDQyxNQUFMLEVBQUQsQ0FBTixDQUFzQkMsTUFBdEIs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O0FBRUEsK0JBQ0U4RSxRQURGLEVBRUU7QUFDRVEsTUFBQUEsSUFBSSxFQUFFLElBRFI7QUFFRWpELE1BQUFBLEtBQUssRUFBRTtBQUZULEtBRkYsRUFNRSxDQUFDNUQsR0FBRCxFQUFNeUQsR0FBTixLQUFjO0FBQ1osVUFBSXpELEdBQUosRUFBUztBQUNQLGFBQUtxQixNQUFMLENBQVlnQixLQUFaLENBQWtCO0FBQUVkLFVBQUFBO0FBQUYsU0FBbEIsRUFBNEIsb0VBQTVCO0FBRUEsZUFBT1osRUFBRSxDQUFDWCxHQUFELENBQVQ7QUFDRDs7QUFFRCxXQUFLcUIsTUFBTCxDQUFZZ0IsS0FBWixDQUFrQjtBQUFFZCxRQUFBQTtBQUFGLE9BQWxCLEVBQTRCLHFEQUE1QjtBQUNBLGFBQU9aLEVBQUUsQ0FBQyxJQUFELEVBQU84QyxHQUFQLENBQVQ7QUFDRCxLQWZIO0FBaUJEOztBQUVPckIsRUFBQUEsV0FBUixDQUFvQmIsSUFBcEIsRUFBa0NaLEVBQWxDLEVBQXNEO0FBQ3BELGlDQUFXLEtBQUtrQyxXQUFMLENBQWlCdEIsSUFBakIsQ0FBWCxFQUFtQ1osRUFBbkM7QUFDRDs7QUF0VjREIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGZzIGZyb20gJ2ZzJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuXG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IG1rZGlycCBmcm9tICdta2RpcnAnO1xuaW1wb3J0IHsgVXBsb2FkVGFyYmFsbCwgUmVhZFRhcmJhbGwgfSBmcm9tICdAdmVyZGFjY2lvL3N0cmVhbXMnO1xuaW1wb3J0IHsgdW5sb2NrRmlsZSwgcmVhZEZpbGUgfSBmcm9tICdAdmVyZGFjY2lvL2ZpbGUtbG9ja2luZyc7XG5pbXBvcnQgeyBDYWxsYmFjaywgTG9nZ2VyLCBQYWNrYWdlLCBJTG9jYWxQYWNrYWdlTWFuYWdlciwgSVVwbG9hZFRhcmJhbGwgfSBmcm9tICdAdmVyZGFjY2lvL3R5cGVzJztcbmltcG9ydCB7IGdldENvZGUsIGdldEludGVybmFsRXJyb3IsIGdldE5vdEZvdW5kLCBWZXJkYWNjaW9FcnJvciB9IGZyb20gJ0B2ZXJkYWNjaW8vY29tbW9ucy1hcGkvbGliJztcblxuZXhwb3J0IGNvbnN0IGZpbGVFeGlzdCA9ICdFRVhJU1RTJztcbmV4cG9ydCBjb25zdCBub1N1Y2hGaWxlID0gJ0VOT0VOVCc7XG5leHBvcnQgY29uc3QgcmVzb3VyY2VOb3RBdmFpbGFibGUgPSAnRUFHQUlOJztcbmV4cG9ydCBjb25zdCBwa2dGaWxlTmFtZSA9ICdwYWNrYWdlLmpzb24nO1xuXG5leHBvcnQgY29uc3QgZlNFcnJvciA9IGZ1bmN0aW9uIChtZXNzYWdlOiBzdHJpbmcsIGNvZGUgPSA0MDkpOiBWZXJkYWNjaW9FcnJvciB7XG4gIGNvbnN0IGVycjogVmVyZGFjY2lvRXJyb3IgPSBnZXRDb2RlKGNvZGUsIG1lc3NhZ2UpO1xuICAvLyBGSVhNRTogd2Ugc2hvdWxkIHJldHVybiBodHRwLXN0YXR1cyBjb2RlcyBoZXJlIGluc3RlYWQsIGZ1dHVyZSBpbXByb3ZlbWVudFxuICAvLyBAdHMtaWdub3JlXG4gIGVyci5jb2RlID0gbWVzc2FnZTtcblxuICByZXR1cm4gZXJyO1xufTtcblxuY29uc3QgdGVtcEZpbGUgPSBmdW5jdGlvbiAoc3RyKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke3N0cn0udG1wJHtTdHJpbmcoTWF0aC5yYW5kb20oKSkuc3Vic3RyKDIpfWA7XG59O1xuXG5jb25zdCByZW5hbWVUbXAgPSBmdW5jdGlvbiAoc3JjLCBkc3QsIF9jYik6IHZvaWQge1xuICBjb25zdCBjYiA9IChlcnIpOiB2b2lkID0+IHtcbiAgICBpZiAoZXJyKSB7XG4gICAgICBmcy51bmxpbmsoc3JjLCAoKSA9PiB7fSk7XG4gICAgfVxuICAgIF9jYihlcnIpO1xuICB9O1xuXG4gIGlmIChwcm9jZXNzLnBsYXRmb3JtICE9PSAnd2luMzInKSB7XG4gICAgcmV0dXJuIGZzLnJlbmFtZShzcmMsIGRzdCwgY2IpO1xuICB9XG5cbiAgLy8gd2luZG93cyBjYW4ndCByZW1vdmUgb3BlbmVkIGZpbGUsXG4gIC8vIGJ1dCBpdCBzZWVtIHRvIGJlIGFibGUgdG8gcmVuYW1lIGl0XG4gIGNvbnN0IHRtcCA9IHRlbXBGaWxlKGRzdCk7XG4gIGZzLnJlbmFtZShkc3QsIHRtcCwgZnVuY3Rpb24gKGVycikge1xuICAgIGZzLnJlbmFtZShzcmMsIGRzdCwgY2IpO1xuICAgIGlmICghZXJyKSB7XG4gICAgICBmcy51bmxpbmsodG1wLCAoKSA9PiB7fSk7XG4gICAgfVxuICB9KTtcbn07XG5cbmV4cG9ydCB0eXBlIElMb2NhbEZTUGFja2FnZU1hbmFnZXIgPSBJTG9jYWxQYWNrYWdlTWFuYWdlciAmIHsgcGF0aDogc3RyaW5nIH07XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIExvY2FsRlMgaW1wbGVtZW50cyBJTG9jYWxGU1BhY2thZ2VNYW5hZ2VyIHtcbiAgcHVibGljIHBhdGg6IHN0cmluZztcbiAgcHVibGljIGxvZ2dlcjogTG9nZ2VyO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXRoOiBzdHJpbmcsIGxvZ2dlcjogTG9nZ2VyKSB7XG4gICAgdGhpcy5wYXRoID0gcGF0aDtcbiAgICB0aGlzLmxvZ2dlciA9IGxvZ2dlcjtcbiAgfVxuXG4gIC8qKlxuICAgICogIFRoaXMgZnVuY3Rpb24gYWxsb3dzIHRvIHVwZGF0ZSB0aGUgcGFja2FnZSB0aHJlYWQtc2FmZWx5XG4gICAgICBBbGdvcml0aG06XG4gICAgICAxLiBsb2NrIHBhY2thZ2UuanNvbiBmb3Igd3JpdGluZ1xuICAgICAgMi4gcmVhZCBwYWNrYWdlLmpzb25cbiAgICAgIDMuIHVwZGF0ZUZuKHBrZywgY2IpLCBhbmQgd2FpdCBmb3IgY2JcbiAgICAgIDQuIHdyaXRlIHBhY2thZ2UuanNvbi50bXBcbiAgICAgIDUuIG1vdmUgcGFja2FnZS5qc29uLnRtcCBwYWNrYWdlLmpzb25cbiAgICAgIDYuIGNhbGxiYWNrKGVycj8pXG4gICAgKiBAcGFyYW0geyp9IG5hbWVcbiAgICAqIEBwYXJhbSB7Kn0gdXBkYXRlSGFuZGxlclxuICAgICogQHBhcmFtIHsqfSBvbldyaXRlXG4gICAgKiBAcGFyYW0geyp9IHRyYW5zZm9ybVBhY2thZ2VcbiAgICAqIEBwYXJhbSB7Kn0gb25FbmRcbiAgICAqL1xuICBwdWJsaWMgdXBkYXRlUGFja2FnZShcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgdXBkYXRlSGFuZGxlcjogQ2FsbGJhY2ssXG4gICAgb25Xcml0ZTogQ2FsbGJhY2ssXG4gICAgdHJhbnNmb3JtUGFja2FnZTogRnVuY3Rpb24sXG4gICAgb25FbmQ6IENhbGxiYWNrXG4gICk6IHZvaWQge1xuICAgIHRoaXMuX2xvY2tBbmRSZWFkSlNPTihwa2dGaWxlTmFtZSwgKGVyciwganNvbikgPT4ge1xuICAgICAgbGV0IGxvY2tlZCA9IGZhbHNlO1xuICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgICAvLyBjYWxsYmFjayB0aGF0IGNsZWFucyB1cCBsb2NrIGZpcnN0XG4gICAgICBjb25zdCB1bkxvY2tDYWxsYmFjayA9IGZ1bmN0aW9uIChsb2NrRXJyb3I6IEVycm9yKTogdm9pZCB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItcmVzdC1wYXJhbXNcbiAgICAgICAgY29uc3QgX2FyZ3MgPSBhcmd1bWVudHM7XG5cbiAgICAgICAgaWYgKGxvY2tlZCkge1xuICAgICAgICAgIHNlbGYuX3VubG9ja0pTT04ocGtnRmlsZU5hbWUsICgpID0+IHtcbiAgICAgICAgICAgIC8vIGlnbm9yZSBhbnkgZXJyb3IgZnJvbSB0aGUgdW5sb2NrXG4gICAgICAgICAgICBpZiAobG9ja0Vycm9yICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIHNlbGYubG9nZ2VyLnRyYWNlKFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgICBsb2NrRXJyb3IsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAnW2xvY2FsLXN0b3JhZ2UvdXBkYXRlUGFja2FnZS91bkxvY2tDYWxsYmFja10gZmlsZTogQHtuYW1lfSBsb2NrIGhhcyBmYWlsZWQgbG9ja0Vycm9yOiBAe2xvY2tFcnJvcn0nXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIG9uRW5kLmFwcGx5KGxvY2tFcnJvciwgX2FyZ3MpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNlbGYubG9nZ2VyLnRyYWNlKHsgbmFtZSB9LCAnW2xvY2FsLXN0b3JhZ2UvdXBkYXRlUGFja2FnZS91bkxvY2tDYWxsYmFja10gZmlsZTogQHtuYW1lfSBoYXMgYmVlbiB1cGRhdGVkJyk7XG5cbiAgICAgICAgICBvbkVuZCguLi5fYXJncyk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGlmICghZXJyKSB7XG4gICAgICAgIGxvY2tlZCA9IHRydWU7XG4gICAgICAgIHRoaXMubG9nZ2VyLnRyYWNlKFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgICAnW2xvY2FsLXN0b3JhZ2UvdXBkYXRlUGFja2FnZV0gZmlsZTogQHtuYW1lfSBoYXMgYmVlbiBsb2NrZWQnXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGlmIChfLmlzTmlsKGVycikgPT09IGZhbHNlKSB7XG4gICAgICAgIGlmIChlcnIuY29kZSA9PT0gcmVzb3VyY2VOb3RBdmFpbGFibGUpIHtcbiAgICAgICAgICByZXR1cm4gdW5Mb2NrQ2FsbGJhY2soZ2V0SW50ZXJuYWxFcnJvcigncmVzb3VyY2UgdGVtcG9yYXJpbHkgdW5hdmFpbGFibGUnKSk7XG4gICAgICAgIH0gZWxzZSBpZiAoZXJyLmNvZGUgPT09IG5vU3VjaEZpbGUpIHtcbiAgICAgICAgICByZXR1cm4gdW5Mb2NrQ2FsbGJhY2soZ2V0Tm90Rm91bmQoKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHVuTG9ja0NhbGxiYWNrKGVycik7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdXBkYXRlSGFuZGxlcihqc29uLCBlcnIgPT4ge1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgcmV0dXJuIHVuTG9ja0NhbGxiYWNrKGVycik7XG4gICAgICAgIH1cblxuICAgICAgICBvbldyaXRlKG5hbWUsIHRyYW5zZm9ybVBhY2thZ2UoanNvbiksIHVuTG9ja0NhbGxiYWNrKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGRlbGV0ZVBhY2thZ2UocGFja2FnZU5hbWU6IHN0cmluZywgY2FsbGJhY2s6IChlcnI6IE5vZGVKUy5FcnJub0V4Y2VwdGlvbiB8IG51bGwpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLmxvZ2dlci5kZWJ1Zyh7IHBhY2thZ2VOYW1lIH0sICdbbG9jYWwtc3RvcmFnZS9kZWxldGVQYWNrYWdlXSBkZWxldGUgYSBwYWNrYWdlIEB7cGFja2FnZU5hbWV9Jyk7XG5cbiAgICByZXR1cm4gZnMudW5saW5rKHRoaXMuX2dldFN0b3JhZ2UocGFja2FnZU5hbWUpLCBjYWxsYmFjayk7XG4gIH1cblxuICBwdWJsaWMgcmVtb3ZlUGFja2FnZShjYWxsYmFjazogKGVycjogTm9kZUpTLkVycm5vRXhjZXB0aW9uIHwgbnVsbCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKHsgcGFja2FnZU5hbWU6IHRoaXMucGF0aCB9LCAnW2xvY2FsLXN0b3JhZ2UvcmVtb3ZlUGFja2FnZV0gcmVtb3ZlIGEgcGFja2FnZTogQHtwYWNrYWdlTmFtZX0nKTtcblxuICAgIGZzLnJtZGlyKHRoaXMuX2dldFN0b3JhZ2UoJy4nKSwgY2FsbGJhY2spO1xuICB9XG5cbiAgcHVibGljIGNyZWF0ZVBhY2thZ2UobmFtZTogc3RyaW5nLCB2YWx1ZTogUGFja2FnZSwgY2I6IENhbGxiYWNrKTogdm9pZCB7XG4gICAgdGhpcy5sb2dnZXIuZGVidWcoeyBwYWNrYWdlTmFtZTogbmFtZSB9LCAnW2xvY2FsLXN0b3JhZ2UvY3JlYXRlUGFja2FnZV0gY3JlYXRlIGEgcGFja2FnZTogQHtwYWNrYWdlTmFtZX0nKTtcblxuICAgIHRoaXMuX2NyZWF0ZUZpbGUodGhpcy5fZ2V0U3RvcmFnZShwa2dGaWxlTmFtZSksIHRoaXMuX2NvbnZlcnRUb1N0cmluZyh2YWx1ZSksIGNiKTtcbiAgfVxuXG4gIHB1YmxpYyBzYXZlUGFja2FnZShuYW1lOiBzdHJpbmcsIHZhbHVlOiBQYWNrYWdlLCBjYjogQ2FsbGJhY2spOiB2b2lkIHtcbiAgICB0aGlzLmxvZ2dlci5kZWJ1Zyh7IHBhY2thZ2VOYW1lOiBuYW1lIH0sICdbbG9jYWwtc3RvcmFnZS9zYXZlUGFja2FnZV0gc2F2ZSBhIHBhY2thZ2U6IEB7cGFja2FnZU5hbWV9Jyk7XG5cbiAgICB0aGlzLl93cml0ZUZpbGUodGhpcy5fZ2V0U3RvcmFnZShwa2dGaWxlTmFtZSksIHRoaXMuX2NvbnZlcnRUb1N0cmluZyh2YWx1ZSksIGNiKTtcbiAgfVxuXG4gIHB1YmxpYyByZWFkUGFja2FnZShuYW1lOiBzdHJpbmcsIGNiOiBDYWxsYmFjayk6IHZvaWQge1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKHsgcGFja2FnZU5hbWU6IG5hbWUgfSwgJ1tsb2NhbC1zdG9yYWdlL3JlYWRQYWNrYWdlXSByZWFkIGEgcGFja2FnZTogQHtwYWNrYWdlTmFtZX0nKTtcblxuICAgIHRoaXMuX3JlYWRTdG9yYWdlRmlsZSh0aGlzLl9nZXRTdG9yYWdlKHBrZ0ZpbGVOYW1lKSkudGhlbihcbiAgICAgIHJlcyA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgZGF0YTogYW55ID0gSlNPTi5wYXJzZShyZXMudG9TdHJpbmcoJ3V0ZjgnKSk7XG5cbiAgICAgICAgICB0aGlzLmxvZ2dlci50cmFjZShcbiAgICAgICAgICAgIHsgcGFja2FnZU5hbWU6IG5hbWUgfSxcbiAgICAgICAgICAgICdbbG9jYWwtc3RvcmFnZS9yZWFkUGFja2FnZS9fcmVhZFN0b3JhZ2VGaWxlXSByZWFkIGEgcGFja2FnZSBzdWNjZWVkOiBAe3BhY2thZ2VOYW1lfSdcbiAgICAgICAgICApO1xuICAgICAgICAgIGNiKG51bGwsIGRhdGEpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci50cmFjZSh7IGVyciB9LCAnW2xvY2FsLXN0b3JhZ2UvcmVhZFBhY2thZ2UvX3JlYWRTdG9yYWdlRmlsZV0gZXJyb3Igb24gcmVhZCBhIHBhY2thZ2U6IEB7ZXJyfScpO1xuICAgICAgICAgIGNiKGVycik7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBlcnIgPT4ge1xuICAgICAgICB0aGlzLmxvZ2dlci50cmFjZSh7IGVyciB9LCAnW2xvY2FsLXN0b3JhZ2UvcmVhZFBhY2thZ2UvX3JlYWRTdG9yYWdlRmlsZV0gZXJyb3Igb24gcmVhZCBhIHBhY2thZ2U6IEB7ZXJyfScpO1xuXG4gICAgICAgIHJldHVybiBjYihlcnIpO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgd3JpdGVUYXJiYWxsKG5hbWU6IHN0cmluZyk6IElVcGxvYWRUYXJiYWxsIHtcbiAgICBjb25zdCB1cGxvYWRTdHJlYW0gPSBuZXcgVXBsb2FkVGFyYmFsbCh7fSk7XG4gICAgdGhpcy5sb2dnZXIuZGVidWcoXG4gICAgICB7IHBhY2thZ2VOYW1lOiBuYW1lIH0sXG4gICAgICAnW2xvY2FsLXN0b3JhZ2Uvd3JpdGVUYXJiYWxsXSB3cml0ZSBhIHRhcmJhbGwgZm9yIHBhY2thZ2U6IEB7cGFja2FnZU5hbWV9J1xuICAgICk7XG5cbiAgICBsZXQgX2VuZGVkID0gMDtcbiAgICB1cGxvYWRTdHJlYW0ub24oJ2VuZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIF9lbmRlZCA9IDE7XG4gICAgfSk7XG5cbiAgICBjb25zdCBwYXRoTmFtZTogc3RyaW5nID0gdGhpcy5fZ2V0U3RvcmFnZShuYW1lKTtcblxuICAgIGZzLmFjY2VzcyhwYXRoTmFtZSwgZmlsZU5vdEZvdW5kID0+IHtcbiAgICAgIGNvbnN0IGV4aXN0cyA9ICFmaWxlTm90Rm91bmQ7XG4gICAgICBpZiAoZXhpc3RzKSB7XG4gICAgICAgIHVwbG9hZFN0cmVhbS5lbWl0KCdlcnJvcicsIGZTRXJyb3IoZmlsZUV4aXN0KSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCB0ZW1wb3JhbE5hbWUgPSBwYXRoLmpvaW4odGhpcy5wYXRoLCBgJHtuYW1lfS50bXAtJHtTdHJpbmcoTWF0aC5yYW5kb20oKSkucmVwbGFjZSgvXjBcXC4vLCAnJyl9YCk7XG4gICAgICAgIGNvbnN0IGZpbGUgPSBmcy5jcmVhdGVXcml0ZVN0cmVhbSh0ZW1wb3JhbE5hbWUpO1xuICAgICAgICBjb25zdCByZW1vdmVUZW1wRmlsZSA9ICgpOiB2b2lkID0+IGZzLnVubGluayh0ZW1wb3JhbE5hbWUsICgpID0+IHt9KTtcbiAgICAgICAgbGV0IG9wZW5lZCA9IGZhbHNlO1xuICAgICAgICB1cGxvYWRTdHJlYW0ucGlwZShmaWxlKTtcblxuICAgICAgICB1cGxvYWRTdHJlYW0uZG9uZSA9IGZ1bmN0aW9uICgpOiB2b2lkIHtcbiAgICAgICAgICBjb25zdCBvbmVuZCA9IGZ1bmN0aW9uICgpOiB2b2lkIHtcbiAgICAgICAgICAgIGZpbGUub24oJ2Nsb3NlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICByZW5hbWVUbXAodGVtcG9yYWxOYW1lLCBwYXRoTmFtZSwgZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgIHVwbG9hZFN0cmVhbS5lbWl0KCdlcnJvcicsIGVycik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHVwbG9hZFN0cmVhbS5lbWl0KCdzdWNjZXNzJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZmlsZS5lbmQoKTtcbiAgICAgICAgICB9O1xuICAgICAgICAgIGlmIChfZW5kZWQpIHtcbiAgICAgICAgICAgIG9uZW5kKCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHVwbG9hZFN0cmVhbS5vbignZW5kJywgb25lbmQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICB1cGxvYWRTdHJlYW0uYWJvcnQgPSBmdW5jdGlvbiAoKTogdm9pZCB7XG4gICAgICAgICAgaWYgKG9wZW5lZCkge1xuICAgICAgICAgICAgb3BlbmVkID0gZmFsc2U7XG4gICAgICAgICAgICBmaWxlLm9uKCdjbG9zZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgcmVtb3ZlVGVtcEZpbGUoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBpZiB0aGUgZmlsZSBkb2VzIG5vdCByZWNpZXZlIGFueSBieXRlIG5ldmVyIGlzIG9wZW5lZCBhbmQgaGFzIHRvIGJlIHJlbW92ZWQgYW55d2F5LlxuICAgICAgICAgICAgcmVtb3ZlVGVtcEZpbGUoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZmlsZS5lbmQoKTtcbiAgICAgICAgfTtcblxuICAgICAgICBmaWxlLm9uKCdvcGVuJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIG9wZW5lZCA9IHRydWU7XG4gICAgICAgICAgLy8gcmUtZW1pdHRpbmcgb3BlbiBiZWNhdXNlIGl0J3MgaGFuZGxlZCBpbiBzdG9yYWdlLmpzXG4gICAgICAgICAgdXBsb2FkU3RyZWFtLmVtaXQoJ29wZW4nKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZmlsZS5vbignZXJyb3InLCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgICAgdXBsb2FkU3RyZWFtLmVtaXQoJ2Vycm9yJywgZXJyKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gdXBsb2FkU3RyZWFtO1xuICB9XG5cbiAgcHVibGljIHJlYWRUYXJiYWxsKG5hbWU6IHN0cmluZyk6IFJlYWRUYXJiYWxsIHtcbiAgICBjb25zdCBwYXRoTmFtZTogc3RyaW5nID0gdGhpcy5fZ2V0U3RvcmFnZShuYW1lKTtcbiAgICB0aGlzLmxvZ2dlci5kZWJ1Zyh7IHBhY2thZ2VOYW1lOiBuYW1lIH0sICdbbG9jYWwtc3RvcmFnZS9yZWFkVGFyYmFsbF0gcmVhZCBhIHRhcmJhbGwgZm9yIHBhY2thZ2U6IEB7cGFja2FnZU5hbWV9Jyk7XG5cbiAgICBjb25zdCByZWFkVGFyYmFsbFN0cmVhbSA9IG5ldyBSZWFkVGFyYmFsbCh7fSk7XG5cbiAgICBjb25zdCByZWFkU3RyZWFtID0gZnMuY3JlYXRlUmVhZFN0cmVhbShwYXRoTmFtZSk7XG5cbiAgICByZWFkU3RyZWFtLm9uKCdlcnJvcicsIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgIHJlYWRUYXJiYWxsU3RyZWFtLmVtaXQoJ2Vycm9yJywgZXJyKTtcbiAgICB9KTtcblxuICAgIHJlYWRTdHJlYW0ub24oJ29wZW4nLCBmdW5jdGlvbiAoZmQpIHtcbiAgICAgIGZzLmZzdGF0KGZkLCBmdW5jdGlvbiAoZXJyLCBzdGF0cykge1xuICAgICAgICBpZiAoXy5pc05pbChlcnIpID09PSBmYWxzZSkge1xuICAgICAgICAgIHJldHVybiByZWFkVGFyYmFsbFN0cmVhbS5lbWl0KCdlcnJvcicsIGVycik7XG4gICAgICAgIH1cbiAgICAgICAgcmVhZFRhcmJhbGxTdHJlYW0uZW1pdCgnY29udGVudC1sZW5ndGgnLCBzdGF0cy5zaXplKTtcbiAgICAgICAgcmVhZFRhcmJhbGxTdHJlYW0uZW1pdCgnb3BlbicpO1xuICAgICAgICByZWFkU3RyZWFtLnBpcGUocmVhZFRhcmJhbGxTdHJlYW0pO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICByZWFkVGFyYmFsbFN0cmVhbS5hYm9ydCA9IGZ1bmN0aW9uICgpOiB2b2lkIHtcbiAgICAgIHJlYWRTdHJlYW0uY2xvc2UoKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIHJlYWRUYXJiYWxsU3RyZWFtO1xuICB9XG5cbiAgcHJpdmF0ZSBfY3JlYXRlRmlsZShuYW1lOiBzdHJpbmcsIGNvbnRlbnRzOiBhbnksIGNhbGxiYWNrOiBGdW5jdGlvbik6IHZvaWQge1xuICAgIHRoaXMubG9nZ2VyLnRyYWNlKHsgbmFtZSB9LCAnW2xvY2FsLXN0b3JhZ2UvX2NyZWF0ZUZpbGVdIGNyZWF0ZSBhIG5ldyBmaWxlOiBAe25hbWV9Jyk7XG5cbiAgICBmcy5vcGVuKG5hbWUsICd3eCcsIGVyciA9PiB7XG4gICAgICBpZiAoZXJyKSB7XG4gICAgICAgIC8vIG5hdGl2ZSBFRVhJU1QgdXNlZCBoZXJlIHRvIGNoZWNrIGV4Y2VwdGlvbiBvbiBmcy5vcGVuXG4gICAgICAgIGlmIChlcnIuY29kZSA9PT0gJ0VFWElTVCcpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci50cmFjZSh7IG5hbWUgfSwgJ1tsb2NhbC1zdG9yYWdlL19jcmVhdGVGaWxlXSBmaWxlIGNhbm5vdCBiZSBjcmVhdGVkLCBpdCBhbHJlYWR5IGV4aXN0czogQHtuYW1lfScpO1xuICAgICAgICAgIHJldHVybiBjYWxsYmFjayhmU0Vycm9yKGZpbGVFeGlzdCkpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX3dyaXRlRmlsZShuYW1lLCBjb250ZW50cywgY2FsbGJhY2spO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVhZFN0b3JhZ2VGaWxlKG5hbWU6IHN0cmluZyk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpOiB2b2lkID0+IHtcbiAgICAgIHRoaXMubG9nZ2VyLnRyYWNlKHsgbmFtZSB9LCAnW2xvY2FsLXN0b3JhZ2UvX3JlYWRTdG9yYWdlRmlsZV0gcmVhZCBhIGZpbGU6IEB7bmFtZX0nKTtcblxuICAgICAgZnMucmVhZEZpbGUobmFtZSwgKGVyciwgZGF0YSkgPT4ge1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoeyBlcnIgfSwgJ1tsb2NhbC1zdG9yYWdlL19yZWFkU3RvcmFnZUZpbGVdIGVycm9yIG9uIHJlYWQgdGhlIGZpbGU6IEB7bmFtZX0nKTtcbiAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci50cmFjZSh7IG5hbWUgfSwgJ1tsb2NhbC1zdG9yYWdlL19yZWFkU3RvcmFnZUZpbGVdIHJlYWQgZmlsZSBzdWNjZWVkOiBAe25hbWV9Jyk7XG5cbiAgICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX2NvbnZlcnRUb1N0cmluZyh2YWx1ZTogUGFja2FnZSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbHVlLCBudWxsLCAnXFx0Jyk7XG4gIH1cblxuICBwcml2YXRlIF9nZXRTdG9yYWdlKGZpbGVOYW1lID0gJycpOiBzdHJpbmcge1xuICAgIGNvbnN0IHN0b3JhZ2VQYXRoOiBzdHJpbmcgPSBwYXRoLmpvaW4odGhpcy5wYXRoLCBmaWxlTmFtZSk7XG5cbiAgICByZXR1cm4gc3RvcmFnZVBhdGg7XG4gIH1cblxuICBwcml2YXRlIF93cml0ZUZpbGUoZGVzdDogc3RyaW5nLCBkYXRhOiBzdHJpbmcsIGNiOiBDYWxsYmFjayk6IHZvaWQge1xuICAgIGNvbnN0IGNyZWF0ZVRlbXBGaWxlID0gKGNiKTogdm9pZCA9PiB7XG4gICAgICBjb25zdCB0ZW1wRmlsZVBhdGggPSB0ZW1wRmlsZShkZXN0KTtcblxuICAgICAgZnMud3JpdGVGaWxlKHRlbXBGaWxlUGF0aCwgZGF0YSwgZXJyID0+IHtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLnRyYWNlKHsgbmFtZTogZGVzdCB9LCAnW2xvY2FsLXN0b3JhZ2UvX3dyaXRlRmlsZV0gbmV3IGZpbGU6IEB7bmFtZX0gaGFzIGJlZW4gY3JlYXRlZCcpO1xuXG4gICAgICAgICAgcmV0dXJuIGNiKGVycik7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmxvZ2dlci50cmFjZSh7IG5hbWU6IGRlc3QgfSwgJ1tsb2NhbC1zdG9yYWdlL193cml0ZUZpbGVdIGNyZWF0aW5nIGEgbmV3IGZpbGU6IEB7bmFtZX0nKTtcbiAgICAgICAgcmVuYW1lVG1wKHRlbXBGaWxlUGF0aCwgZGVzdCwgY2IpO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIGNyZWF0ZVRlbXBGaWxlKGVyciA9PiB7XG4gICAgICBpZiAoZXJyICYmIGVyci5jb2RlID09PSBub1N1Y2hGaWxlKSB7XG4gICAgICAgIG1rZGlycChwYXRoLmRpcm5hbWUoZGVzdCkpXG4gICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgY3JlYXRlVGVtcEZpbGUoY2IpO1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLmNhdGNoKGVyciA9PiB7XG4gICAgICAgICAgICByZXR1cm4gY2IoZXJyKTtcbiAgICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNiKGVycik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9sb2NrQW5kUmVhZEpTT04obmFtZTogc3RyaW5nLCBjYjogRnVuY3Rpb24pOiB2b2lkIHtcbiAgICBjb25zdCBmaWxlTmFtZTogc3RyaW5nID0gdGhpcy5fZ2V0U3RvcmFnZShuYW1lKTtcblxuICAgIHJlYWRGaWxlKFxuICAgICAgZmlsZU5hbWUsXG4gICAgICB7XG4gICAgICAgIGxvY2s6IHRydWUsXG4gICAgICAgIHBhcnNlOiB0cnVlLFxuICAgICAgfSxcbiAgICAgIChlcnIsIHJlcykgPT4ge1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoeyBuYW1lIH0sICdbbG9jYWwtc3RvcmFnZS9fbG9ja0FuZFJlYWRKU09OXSByZWFkIG5ldyBmaWxlOiBAe25hbWV9IGhhcyBmYWlsZWQnKTtcblxuICAgICAgICAgIHJldHVybiBjYihlcnIpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoeyBuYW1lIH0sICdbbG9jYWwtc3RvcmFnZS9fbG9ja0FuZFJlYWRKU09OXSBmaWxlOiBAe25hbWV9IHJlYWQnKTtcbiAgICAgICAgcmV0dXJuIGNiKG51bGwsIHJlcyk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgX3VubG9ja0pTT04obmFtZTogc3RyaW5nLCBjYjogRnVuY3Rpb24pOiB2b2lkIHtcbiAgICB1bmxvY2tGaWxlKHRoaXMuX2dldFN0b3JhZ2UobmFtZSksIGNiKTtcbiAgfVxufVxuIl19
|
|
398
|
+
//# sourceMappingURL=local-fs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/local-fs.ts"],"names":["fileExist","noSuchFile","resourceNotAvailable","pkgFileName","debug","fSError","message","code","err","tempFile","str","String","Math","random","substr","renameTmp","src","dst","_cb","cb","fs","unlink","process","platform","rename","tmp","LocalFS","constructor","path","logger","updatePackage","name","updateHandler","onWrite","transformPackage","onEnd","_lockAndReadJSON","json","locked","self","unLockCallback","lockError","_args","arguments","_unlockJSON","apply","_","isNil","deletePackage","packageName","callback","_getStorage","removePackage","rmdir","createPackage","value","_createFile","_convertToString","savePackage","_writeFile","readPackage","_readStorageFile","then","res","data","JSON","parse","toString","writeTarball","uploadStream","UploadTarball","_ended","on","pathName","access","fileNotFound","exists","emit","temporalName","join","replace","file","createWriteStream","removeTempFile","opened","pipe","done","onend","end","abort","readTarball","readTarballStream","ReadTarball","readStream","createReadStream","fd","fstat","stats","size","close","contents","open","Promise","resolve","reject","readFile","stringify","fileName","storagePath","dest","createTempFile","tempFilePath","writeFile","dirname","catch","lock"],"mappings":"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","sourcesContent":["/* eslint-disable no-undef */\n\nimport fs from 'fs';\nimport path from 'path';\n\nimport buildDebug from 'debug';\nimport _ from 'lodash';\nimport mkdirp from 'mkdirp';\nimport { UploadTarball, ReadTarball } from '@verdaccio/streams';\nimport { unlockFile, readFile } from '@verdaccio/file-locking';\nimport { Callback, Logger, Package, ILocalPackageManager, IUploadTarball } from '@verdaccio/types';\nimport { getCode, getInternalError, getNotFound, VerdaccioError } from '@verdaccio/commons-api';\n\nexport const fileExist = 'EEXISTS';\nexport const noSuchFile = 'ENOENT';\nexport const resourceNotAvailable = 'EAGAIN';\nexport const pkgFileName = 'package.json';\n\nconst debug = buildDebug('verdaccio:plugin:local-storage:fs');\n\nexport const fSError = function(message: string, code = 409): VerdaccioError {\n const err: VerdaccioError = getCode(code, message);\n // FIXME: we should return http-status codes here instead, future improvement\n // @ts-ignore\n err.code = message;\n\n return err;\n};\n\nconst tempFile = function(str): string {\n return `${str}.tmp${String(Math.random()).substr(2)}`;\n};\n\nconst renameTmp = function(src, dst, _cb): void {\n const cb = (err): void => {\n if (err) {\n fs.unlink(src, () => {});\n }\n _cb(err);\n };\n\n if (process.platform !== 'win32') {\n return fs.rename(src, dst, cb);\n }\n\n // windows can't remove opened file,\n // but it seem to be able to rename it\n const tmp = tempFile(dst);\n fs.rename(dst, tmp, function(err) {\n fs.rename(src, dst, cb);\n if (!err) {\n fs.unlink(tmp, () => {});\n }\n });\n};\n\nexport type ILocalFSPackageManager = ILocalPackageManager & { path: string };\n\nexport default class LocalFS implements ILocalFSPackageManager {\n public path: string;\n public logger: Logger;\n\n public constructor(path: string, logger: Logger) {\n this.path = path;\n this.logger = logger;\n }\n\n /**\n * This function allows to update the package thread-safely\n Algorithm:\n 1. lock package.json for writing\n 2. read package.json\n 3. updateFn(pkg, cb), and wait for cb\n 4. write package.json.tmp\n 5. move package.json.tmp package.json\n 6. callback(err?)\n * @param {*} name\n * @param {*} updateHandler\n * @param {*} onWrite\n * @param {*} transformPackage\n * @param {*} onEnd\n */\n public updatePackage(\n name: string,\n updateHandler: Callback,\n onWrite: Callback,\n transformPackage: Function,\n onEnd: Callback\n ): void {\n this._lockAndReadJSON(pkgFileName, (err, json) => {\n let locked = false;\n const self = this;\n // callback that cleans up lock first\n const unLockCallback = function(lockError: Error): void {\n // eslint-disable-next-line prefer-rest-params\n const _args = arguments;\n\n if (locked) {\n self._unlockJSON(pkgFileName, () => {\n // ignore any error from the unlock\n if (lockError !== null) {\n debug('lock file: %o has failed with error %o', name, lockError);\n }\n\n onEnd.apply(lockError, _args);\n });\n } else {\n debug('file: %o has been updated', name);\n onEnd(..._args);\n }\n };\n\n if (!err) {\n locked = true;\n debug('file: %o has been locked', name);\n }\n\n if (_.isNil(err) === false) {\n if (err.code === resourceNotAvailable) {\n return unLockCallback(getInternalError('resource temporarily unavailable'));\n } else if (err.code === noSuchFile) {\n return unLockCallback(getNotFound());\n } else {\n return unLockCallback(err);\n }\n }\n\n updateHandler(json, err => {\n if (err) {\n return unLockCallback(err);\n }\n\n onWrite(name, transformPackage(json), unLockCallback);\n });\n });\n }\n\n public deletePackage(packageName: string, callback: (err: NodeJS.ErrnoException | null) => void): void {\n debug('delete a package %o', packageName);\n\n return fs.unlink(this._getStorage(packageName), callback);\n }\n\n public removePackage(callback: (err: NodeJS.ErrnoException | null) => void): void {\n debug('remove a package %o', this.path);\n\n fs.rmdir(this._getStorage('.'), callback);\n }\n\n public createPackage(name: string, value: Package, cb: Callback): void {\n debug('create a package %o', name);\n\n this._createFile(this._getStorage(pkgFileName), this._convertToString(value), cb);\n }\n\n public savePackage(name: string, value: Package, cb: Callback): void {\n debug('save a package %o', name);\n\n this._writeFile(this._getStorage(pkgFileName), this._convertToString(value), cb);\n }\n\n public readPackage(name: string, cb: Callback): void {\n debug('read a package %o', name);\n\n this._readStorageFile(this._getStorage(pkgFileName)).then(\n res => {\n try {\n const data: any = JSON.parse(res.toString('utf8'));\n\n debug('read storage file %o has succeed', name);\n cb(null, data);\n } catch (err) {\n debug('parse storage file %o has failed with error %o', name, err);\n cb(err);\n }\n },\n err => {\n debug('read storage file %o has failed with error %o', name, err);\n\n return cb(err);\n }\n );\n }\n\n public writeTarball(name: string): IUploadTarball {\n const uploadStream = new UploadTarball({});\n debug('write a tarball for a package %o', name);\n\n let _ended = 0;\n uploadStream.on('end', function() {\n _ended = 1;\n });\n\n const pathName: string = this._getStorage(name);\n\n fs.access(pathName, fileNotFound => {\n const exists = !fileNotFound;\n if (exists) {\n uploadStream.emit('error', fSError(fileExist));\n } else {\n const temporalName = path.join(this.path, `${name}.tmp-${String(Math.random()).replace(/^0\\./, '')}`);\n debug('write a temporal name %o', temporalName);\n const file = fs.createWriteStream(temporalName);\n const removeTempFile = (): void => fs.unlink(temporalName, () => {});\n let opened = false;\n uploadStream.pipe(file);\n\n uploadStream.done = function(): void {\n const onend = function(): void {\n file.on('close', function() {\n renameTmp(temporalName, pathName, function(err) {\n if (err) {\n uploadStream.emit('error', err);\n } else {\n uploadStream.emit('success');\n }\n });\n });\n file.end();\n };\n if (_ended) {\n onend();\n } else {\n uploadStream.on('end', onend);\n }\n };\n\n uploadStream.abort = function(): void {\n if (opened) {\n opened = false;\n file.on('close', function() {\n removeTempFile();\n });\n } else {\n // if the file does not recieve any byte never is opened and has to be removed anyway.\n removeTempFile();\n }\n file.end();\n };\n\n file.on('open', function() {\n opened = true;\n // re-emitting open because it's handled in storage.js\n uploadStream.emit('open');\n });\n\n file.on('error', function(err) {\n uploadStream.emit('error', err);\n });\n }\n });\n\n return uploadStream;\n }\n\n public readTarball(name: string): ReadTarball {\n const pathName: string = this._getStorage(name);\n debug('read a a tarball %o on path %o', name, pathName);\n\n const readTarballStream = new ReadTarball({});\n\n const readStream = fs.createReadStream(pathName);\n\n readStream.on('error', function(err) {\n debug('error on read a tarball %o with error %o', name, err);\n readTarballStream.emit('error', err);\n });\n\n readStream.on('open', function(fd) {\n fs.fstat(fd, function(err, stats) {\n if (_.isNil(err) === false) {\n debug('error on read a tarball %o with error %o', name, err);\n return readTarballStream.emit('error', err);\n }\n readTarballStream.emit('content-length', stats.size);\n readTarballStream.emit('open');\n debug('open on read a tarball %o', name);\n readStream.pipe(readTarballStream);\n });\n });\n\n readTarballStream.abort = function(): void {\n debug('abort on read a tarball %o', name);\n readStream.close();\n };\n\n return readTarballStream;\n }\n\n private _createFile(name: string, contents: any, callback: Function): void {\n debug(' create a new file: %o', name);\n\n fs.open(name, 'wx', err => {\n if (err) {\n // native EEXIST used here to check exception on fs.open\n if (err.code === 'EEXIST') {\n debug('file %o cannot be created, it already exists: %o', name);\n return callback(fSError(fileExist));\n }\n }\n\n this._writeFile(name, contents, callback);\n });\n }\n\n private _readStorageFile(name: string): Promise<any> {\n return new Promise((resolve, reject): void => {\n debug('reading the file: %o', name);\n\n fs.readFile(name, (err, data) => {\n if (err) {\n debug('error reading the file: %o with error %o', name, err);\n reject(err);\n } else {\n debug('read file %o succeed', name);\n\n resolve(data);\n }\n });\n });\n }\n\n private _convertToString(value: Package): string {\n return JSON.stringify(value, null, '\\t');\n }\n\n private _getStorage(fileName = ''): string {\n const storagePath: string = path.join(this.path, fileName);\n\n return storagePath;\n }\n\n private _writeFile(dest: string, data: string, cb: Callback): void {\n const createTempFile = (cb): void => {\n const tempFilePath = tempFile(dest);\n\n fs.writeFile(tempFilePath, data, err => {\n if (err) {\n debug('error on write the file: %o', dest);\n return cb(err);\n }\n\n debug('creating a new file:: %o', dest);\n renameTmp(tempFilePath, dest, cb);\n });\n };\n\n createTempFile(err => {\n if (err && err.code === noSuchFile) {\n mkdirp(path.dirname(dest))\n .then(() => {\n createTempFile(cb);\n })\n .catch(err => {\n return cb(err);\n });\n } else {\n cb(err);\n }\n });\n }\n\n private _lockAndReadJSON(name: string, cb: Function): void {\n const fileName: string = this._getStorage(name);\n\n readFile(\n fileName,\n {\n lock: true,\n parse: true,\n },\n (err, res) => {\n if (err) {\n debug('error on lock and read json for file: %o', name);\n\n return cb(err);\n }\n debug('lock and read json for file: %o', name);\n\n return cb(null, res);\n }\n );\n }\n\n private _unlockJSON(name: string, cb: Function): void {\n unlockFile(this._getStorage(name), cb);\n }\n}\n"],"file":"local-fs.js"}
|
package/lib/pkg-utils.js
CHANGED
|
@@ -30,7 +30,7 @@ function loadPrivatePackages(path, logger) {
|
|
|
30
30
|
try {
|
|
31
31
|
db = JSON.parse(data);
|
|
32
32
|
} catch (err) {
|
|
33
|
-
logger.error(`Package database file corrupted (invalid JSON), please check the error printed below.\nFile Path: ${path}`, err);
|
|
33
|
+
logger.error(`Package database file corrupted (invalid JSON), please check the error` + ` printed below.\nFile Path: ${path}`, err);
|
|
34
34
|
throw Error('Package database file corrupted (invalid JSON)');
|
|
35
35
|
}
|
|
36
36
|
|
|
@@ -40,4 +40,4 @@ function loadPrivatePackages(path, logger) {
|
|
|
40
40
|
|
|
41
41
|
return db;
|
|
42
42
|
}
|
|
43
|
-
//# sourceMappingURL=
|
|
43
|
+
//# sourceMappingURL=pkg-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/pkg-utils.ts"],"names":["loadPrivatePackages","path","logger","list","emptyDatabase","secret","data","fs","readFileSync","_","isNil","db","JSON","parse","err","error","Error","isEmpty"],"mappings":";;;;;;;AAAA;;AAEA;;;;AAGO,SAASA,mBAAT,CAA6BC,IAA7B,EAA2CC,MAA3C,EAAyE;AAC9E,QAAMC,IAAiB,GAAG,EAA1B;AACA,QAAMC,aAAa,GAAG;AAAED,IAAAA,IAAF;AAAQE,IAAAA,MAAM,EAAE;AAAhB,GAAtB;;AACA,QAAMC,IAAI,GAAGC,YAAGC,YAAH,CAAgBP,IAAhB,EAAsB,MAAtB,CAAb;;AAEA,MAAIQ,gBAAEC,KAAF,CAAQJ,IAAR,CAAJ,EAAmB;AACjB;AACA,WAAOF,aAAP;AACD;;AAED,MAAIO,EAAJ;;AACA,MAAI;AACFA,IAAAA,EAAE,GAAGC,IAAI,CAACC,KAAL,CAAWP,IAAX,CAAL;AACD,GAFD,CAEE,OAAOQ,GAAP,EAAY;AACZZ,IAAAA,MAAM,CAACa,KAAP,CACG,wEAAD,GAA4E,+BAA8Bd,IAAK,EADjH,EAEEa,GAFF;AAIA,UAAME,KAAK,CAAC,gDAAD,CAAX;AACD;;AAED,MAAIP,gBAAEQ,OAAF,CAAUN,EAAV,CAAJ,EAAmB;AACjB,WAAOP,aAAP;AACD;;AAED,SAAOO,EAAP;AACD","sourcesContent":["import fs from 'fs';\n\nimport _ from 'lodash';\nimport { LocalStorage, StorageList, Logger } from '@verdaccio/types';\n\nexport function loadPrivatePackages(path: string, logger: Logger): LocalStorage {\n const list: StorageList = [];\n const emptyDatabase = { list, secret: '' };\n const data = fs.readFileSync(path, 'utf8');\n\n if (_.isNil(data)) {\n // readFileSync is platform specific, FreeBSD might return null\n return emptyDatabase;\n }\n\n let db;\n try {\n db = JSON.parse(data);\n } catch (err) {\n logger.error(\n `Package database file corrupted (invalid JSON), please check the error` + ` printed below.\\nFile Path: ${path}`,\n err\n );\n throw Error('Package database file corrupted (invalid JSON)');\n }\n\n if (_.isEmpty(db)) {\n return emptyDatabase;\n }\n\n return db;\n}\n"],"file":"pkg-utils.js"}
|
package/lib/token.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import low from 'lowdb';
|
|
2
|
+
import { ITokenActions, Config, Token, TokenFilter } from '@verdaccio/types';
|
|
3
|
+
export default class TokenActions implements ITokenActions {
|
|
4
|
+
config: Config;
|
|
5
|
+
tokenDb: low.LowdbAsync<any> | null;
|
|
6
|
+
constructor(config: Config);
|
|
7
|
+
_dbGenPath(dbName: string, config: Config): string;
|
|
8
|
+
private getTokenDb;
|
|
9
|
+
saveToken(token: Token): Promise<void>;
|
|
10
|
+
deleteToken(user: string, tokenKey: string): Promise<void>;
|
|
11
|
+
readTokens(filter: TokenFilter): Promise<Token[]>;
|
|
12
|
+
}
|
package/lib/token.js
ADDED
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
|
|
8
|
+
var _path = _interopRequireDefault(require("path"));
|
|
9
|
+
|
|
10
|
+
var _lodash = _interopRequireDefault(require("lodash"));
|
|
11
|
+
|
|
12
|
+
var _lowdb = _interopRequireDefault(require("lowdb"));
|
|
13
|
+
|
|
14
|
+
var _FileAsync = _interopRequireDefault(require("lowdb/adapters/FileAsync"));
|
|
15
|
+
|
|
16
|
+
var _Memory = _interopRequireDefault(require("lowdb/adapters/Memory"));
|
|
17
|
+
|
|
18
|
+
var _debug = _interopRequireDefault(require("debug"));
|
|
19
|
+
|
|
20
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
21
|
+
|
|
22
|
+
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
23
|
+
|
|
24
|
+
const debug = (0, _debug.default)('verdaccio:plugin:local-storage:token');
|
|
25
|
+
const TOKEN_DB_NAME = '.token-db.json';
|
|
26
|
+
|
|
27
|
+
class TokenActions {
|
|
28
|
+
constructor(config) {
|
|
29
|
+
_defineProperty(this, "config", void 0);
|
|
30
|
+
|
|
31
|
+
_defineProperty(this, "tokenDb", void 0);
|
|
32
|
+
|
|
33
|
+
this.config = config;
|
|
34
|
+
this.tokenDb = null;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
_dbGenPath(dbName, config) {
|
|
38
|
+
return _path.default.join(_path.default.resolve(_path.default.dirname(config.config_path || ''), config.storage, dbName));
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
async getTokenDb() {
|
|
42
|
+
if (!this.tokenDb) {
|
|
43
|
+
debug('token database is not defined');
|
|
44
|
+
let adapter;
|
|
45
|
+
|
|
46
|
+
if (process.env.NODE_ENV === 'test') {
|
|
47
|
+
debug('token memory adapter');
|
|
48
|
+
adapter = new _Memory.default('');
|
|
49
|
+
} else {
|
|
50
|
+
debug('token async adapter');
|
|
51
|
+
|
|
52
|
+
const pathDb = this._dbGenPath(TOKEN_DB_NAME, this.config);
|
|
53
|
+
|
|
54
|
+
adapter = new _FileAsync.default(pathDb);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
debug('token bd generated');
|
|
58
|
+
this.tokenDb = await (0, _lowdb.default)(adapter);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
return this.tokenDb;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
async saveToken(token) {
|
|
65
|
+
debug('token key %o', token.key);
|
|
66
|
+
const db = await this.getTokenDb();
|
|
67
|
+
const userData = await db.get(token.user).value();
|
|
68
|
+
debug('user data %o', userData);
|
|
69
|
+
|
|
70
|
+
if (_lodash.default.isNil(userData)) {
|
|
71
|
+
await db.set(token.user, [token]).write();
|
|
72
|
+
debug('token user %o new database', token.user);
|
|
73
|
+
} else {
|
|
74
|
+
// types does not match with valid implementation
|
|
75
|
+
// @ts-ignore
|
|
76
|
+
await db.get(token.user) // @ts-ignore
|
|
77
|
+
.push(token).write();
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
debug('data %o', await db.getState());
|
|
81
|
+
debug('token saved %o', token.user);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
async deleteToken(user, tokenKey) {
|
|
85
|
+
const db = await this.getTokenDb();
|
|
86
|
+
const userTokens = await db.get(user).value();
|
|
87
|
+
|
|
88
|
+
if (_lodash.default.isNil(userTokens)) {
|
|
89
|
+
throw new Error('user not found');
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
debug('tokens %o - %o', userTokens, userTokens.length);
|
|
93
|
+
const remainingTokens = userTokens.filter(({
|
|
94
|
+
key
|
|
95
|
+
}) => {
|
|
96
|
+
debug('key %o', key);
|
|
97
|
+
return key !== tokenKey;
|
|
98
|
+
});
|
|
99
|
+
await db.set(user, remainingTokens).write();
|
|
100
|
+
debug('removed tokens key %o', tokenKey);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
async readTokens(filter) {
|
|
104
|
+
const {
|
|
105
|
+
user
|
|
106
|
+
} = filter;
|
|
107
|
+
debug('read tokens with %o', user);
|
|
108
|
+
const db = await this.getTokenDb();
|
|
109
|
+
const tokens = await db.get(user).value();
|
|
110
|
+
return tokens || [];
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
exports.default = TokenActions;
|
|
116
|
+
//# sourceMappingURL=token.js.map
|
package/lib/token.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/token.ts"],"names":["debug","TOKEN_DB_NAME","TokenActions","constructor","config","tokenDb","_dbGenPath","dbName","Path","join","resolve","dirname","config_path","storage","getTokenDb","adapter","process","env","NODE_ENV","FileMemory","pathDb","FileAsync","saveToken","token","key","db","userData","get","user","value","_","isNil","set","write","push","getState","deleteToken","tokenKey","userTokens","Error","length","remainingTokens","filter","readTokens","tokens"],"mappings":"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","sourcesContent":["import Path from 'path';\n\nimport _ from 'lodash';\nimport low from 'lowdb';\nimport FileAsync from 'lowdb/adapters/FileAsync';\nimport FileMemory from 'lowdb/adapters/Memory';\nimport buildDebug from 'debug';\nimport { ITokenActions, Config, Token, TokenFilter } from '@verdaccio/types';\n\nconst debug = buildDebug('verdaccio:plugin:local-storage:token');\n\nconst TOKEN_DB_NAME = '.token-db.json';\n\nexport default class TokenActions implements ITokenActions {\n public config: Config;\n public tokenDb: low.LowdbAsync<any> | null;\n\n public constructor(config: Config) {\n this.config = config;\n this.tokenDb = null;\n }\n\n public _dbGenPath(dbName: string, config: Config): string {\n return Path.join(Path.resolve(Path.dirname(config.config_path || ''), config.storage as string, dbName));\n }\n\n private async getTokenDb(): Promise<low.LowdbAsync<any>> {\n if (!this.tokenDb) {\n debug('token database is not defined');\n let adapter;\n if (process.env.NODE_ENV === 'test') {\n debug('token memory adapter');\n adapter = new FileMemory('');\n } else {\n debug('token async adapter');\n const pathDb = this._dbGenPath(TOKEN_DB_NAME, this.config);\n adapter = new FileAsync(pathDb);\n }\n debug('token bd generated');\n this.tokenDb = await low(adapter);\n }\n\n return this.tokenDb;\n }\n\n public async saveToken(token: Token): Promise<void> {\n debug('token key %o', token.key);\n const db = await this.getTokenDb();\n const userData = await db.get(token.user).value();\n debug('user data %o', userData);\n if (_.isNil(userData)) {\n await db.set(token.user, [token]).write();\n debug('token user %o new database', token.user);\n } else {\n // types does not match with valid implementation\n // @ts-ignore\n await db\n .get(token.user)\n // @ts-ignore\n .push(token)\n .write();\n }\n debug('data %o', await db.getState());\n debug('token saved %o', token.user);\n }\n\n public async deleteToken(user: string, tokenKey: string): Promise<void> {\n const db = await this.getTokenDb();\n const userTokens = await db.get(user).value();\n if (_.isNil(userTokens)) {\n throw new Error('user not found');\n }\n debug('tokens %o - %o', userTokens, userTokens.length);\n const remainingTokens = userTokens.filter(({ key }) => {\n debug('key %o', key);\n return key !== tokenKey;\n });\n await db.set(user, remainingTokens).write();\n debug('removed tokens key %o', tokenKey);\n }\n\n public async readTokens(filter: TokenFilter): Promise<Token[]> {\n const { user } = filter;\n debug('read tokens with %o', user);\n const db = await this.getTokenDb();\n const tokens = await db.get(user).value();\n return tokens || [];\n }\n}\n"],"file":"token.js"}
|
package/lib/utils.js
CHANGED
|
@@ -93,4 +93,4 @@ async function findPackages(storagePath, validationHandler) {
|
|
|
93
93
|
});
|
|
94
94
|
}
|
|
95
95
|
/* eslint-enable no-async-promise-executor */
|
|
96
|
-
//# sourceMappingURL=
|
|
96
|
+
//# sourceMappingURL=utils.js.map
|
package/lib/utils.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utils.ts"],"names":["getFileStats","packagePath","Promise","resolve","reject","fs","stat","err","stats","_","isNil","readDirectory","readdir","scopedPackages","hasScope","file","match","findPackages","storagePath","validationHandler","listPackages","scopePath","path","storageDirs","directory","scopeDirectory","scopedDirName","push","name","error"],"mappings":";;;;;;;;;AAAA;;AACA;;AAEA;;;;AAEO,SAASA,YAAT,CAAsBC,WAAtB,EAA8D;AACnE,SAAO,IAAIC,OAAJ,CAAY,CAACC,OAAD,EAAUC,MAAV,KAA2B;AAC5CC,gBAAGC,IAAH,CAAQL,WAAR,EAAqB,CAACM,GAAD,EAAMC,KAAN,KAAgB;AACnC,UAAIC,gBAAEC,KAAF,CAAQH,GAAR,MAAiB,KAArB,EAA4B;AAC1B,eAAOH,MAAM,CAACG,GAAD,CAAb;AACD;;AACDJ,MAAAA,OAAO,CAACK,KAAD,CAAP;AACD,KALD;AAMD,GAPM,CAAP;AAQD;;AAEM,SAASG,aAAT,CAAuBV,WAAvB,EAA+D;AACpE,SAAO,IAAIC,OAAJ,CAAY,CAACC,OAAD,EAAUC,MAAV,KAA2B;AAC5CC,gBAAGO,OAAH,CAAWX,WAAX,EAAwB,CAACM,GAAD,EAAMM,cAAN,KAAyB;AAC/C,UAAIJ,gBAAEC,KAAF,CAAQH,GAAR,MAAiB,KAArB,EAA4B;AAC1B,eAAOH,MAAM,CAACG,GAAD,CAAb;AACD;;AAEDJ,MAAAA,OAAO,CAACU,cAAD,CAAP;AACD,KAND;AAOD,GARM,CAAP;AASD;;AAED,SAASC,QAAT,CAAkBC,IAAlB,EAAyC;AACvC,SAAOA,IAAI,CAACC,KAAL,CAAW,IAAX,MAAqB,IAA5B;AACD;AAED;;;AACO,eAAeC,YAAf,CACLC,WADK,EAELC,iBAFK,EAGsC;AAC3C,QAAMC,YAA8C,GAAG,EAAvD;AACA,SAAO,IAAIlB,OAAJ,CAAY,OAAOC,OAAP,EAAgBC,MAAhB,KAA2B;AAC5C,QAAI;AACF,YAAMiB,SAAS,GAAGC,cAAKnB,OAAL,CAAae,WAAb,CAAlB;;AACA,YAAMK,WAAW,GAAG,MAAMZ,aAAa,CAACU,SAAD,CAAvC;;AACA,WAAK,MAAMG,SAAX,IAAwBD,WAAxB,EAAqC;AACnC;AACA,YAAIT,QAAQ,CAACU,SAAD,CAAZ,EAAyB;AACvB;AACA,gBAAMC,cAAc,GAAGH,cAAKnB,OAAL,CAAae,WAAb,EAA0BM,SAA1B,CAAvB;;AACA,gBAAMX,cAAc,GAAG,MAAMF,aAAa,CAACc,cAAD,CAA1C;;AACA,eAAK,MAAMC,aAAX,IAA4Bb,cAA5B,EAA4C;AAC1C,gBAAIM,iBAAiB,CAACO,aAAD,CAArB,EAAsC;AACpC;AACA,oBAAML,SAAS,GAAGC,cAAKnB,OAAL,CAAae,WAAb,EAA0BM,SAA1B,EAAqCE,aAArC,CAAlB,CAFoC,CAGpC;;;AACAN,cAAAA,YAAY,CAACO,IAAb,CAAkB;AAChBC,gBAAAA,IAAI,EAAG,GAAEJ,SAAU,IAAGE,aAAc,EADpB;AAEhBJ,gBAAAA,IAAI,EAAED;AAFU,eAAlB;AAID;AACF;AACF,SAfD,MAeO;AACL;AACA,cAAIF,iBAAiB,CAACK,SAAD,CAArB,EAAkC;AAChC,kBAAMH,SAAS,GAAGC,cAAKnB,OAAL,CAAae,WAAb,EAA0BM,SAA1B,CAAlB;;AACAJ,YAAAA,YAAY,CAACO,IAAb,CAAkB;AAChBC,cAAAA,IAAI,EAAEJ,SADU;AAEhBF,cAAAA,IAAI,EAAED;AAFU,aAAlB;AAID;AACF;AACF;AACF,KA/BD,CA+BE,OAAOQ,KAAP,EAAc;AACdzB,MAAAA,MAAM,CAACyB,KAAD,CAAN;AACD;;AAED1B,IAAAA,OAAO,CAACiB,YAAD,CAAP;AACD,GArCM,CAAP;AAsCD;AACD","sourcesContent":["import fs from 'fs';\nimport path from 'path';\n\nimport _ from 'lodash';\n\nexport function getFileStats(packagePath: string): Promise<fs.Stats> {\n return new Promise((resolve, reject): void => {\n fs.stat(packagePath, (err, stats) => {\n if (_.isNil(err) === false) {\n return reject(err);\n }\n resolve(stats);\n });\n });\n}\n\nexport function readDirectory(packagePath: string): Promise<string[]> {\n return new Promise((resolve, reject): void => {\n fs.readdir(packagePath, (err, scopedPackages) => {\n if (_.isNil(err) === false) {\n return reject(err);\n }\n\n resolve(scopedPackages);\n });\n });\n}\n\nfunction hasScope(file: string): boolean {\n return file.match(/^@/) !== null;\n}\n\n/* eslint-disable no-async-promise-executor */\nexport async function findPackages(\n storagePath: string,\n validationHandler: Function\n): Promise<{ name: string; path: string }[]> {\n const listPackages: { name: string; path: string }[] = [];\n return new Promise(async (resolve, reject) => {\n try {\n const scopePath = path.resolve(storagePath);\n const storageDirs = await readDirectory(scopePath);\n for (const directory of storageDirs) {\n // we check whether has 2nd level\n if (hasScope(directory)) {\n // we read directory multiple\n const scopeDirectory = path.resolve(storagePath, directory);\n const scopedPackages = await readDirectory(scopeDirectory);\n for (const scopedDirName of scopedPackages) {\n if (validationHandler(scopedDirName)) {\n // we build the complete scope path\n const scopePath = path.resolve(storagePath, directory, scopedDirName);\n // list content of such directory\n listPackages.push({\n name: `${directory}/${scopedDirName}`,\n path: scopePath,\n });\n }\n }\n } else {\n // otherwise we read as single level\n if (validationHandler(directory)) {\n const scopePath = path.resolve(storagePath, directory);\n listPackages.push({\n name: directory,\n path: scopePath,\n });\n }\n }\n }\n } catch (error) {\n reject(error);\n }\n\n resolve(listPackages);\n });\n}\n/* eslint-enable no-async-promise-executor */\n"],"file":"utils.js"}
|