@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/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 _lib = require("@verdaccio/commons-api/lib");
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, _lib.getCode)(code, message); // FIXME: we should return http-status codes here instead, future improvement
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
- self.logger.trace({
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
- self.logger.trace({
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
- this.logger.trace({
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, _lib.getInternalError)('resource temporarily unavailable'));
135
+ return unLockCallback((0, _commonsApi.getInternalError)('resource temporarily unavailable'));
140
136
  } else if (err.code === noSuchFile) {
141
- return unLockCallback((0, _lib.getNotFound)());
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
- this.logger.debug({
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.logger.debug({
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
- this.logger.debug({
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
- this.logger.debug({
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
- this.logger.debug({
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
- this.logger.trace({
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
- this.logger.trace({
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
- this.logger.trace({
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
- this.logger.debug({
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
- this.logger.debug({
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
- this.logger.trace({
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
- this.logger.trace({
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
- this.logger.trace({
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
- this.logger.trace({
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
- this.logger.trace({
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
- this.logger.trace({
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
- this.logger.trace({
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
- this.logger.trace({
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
- this.logger.trace({
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9sb2NhbC1mcy50cyJdLCJuYW1lcyI6WyJmaWxlRXhpc3QiLCJub1N1Y2hGaWxlIiwicmVzb3VyY2VOb3RBdmFpbGFibGUiLCJwa2dGaWxlTmFtZSIsImZTRXJyb3IiLCJtZXNzYWdlIiwiY29kZSIsImVyciIsInRlbXBGaWxlIiwic3RyIiwiU3RyaW5nIiwiTWF0aCIsInJhbmRvbSIsInN1YnN0ciIsInJlbmFtZVRtcCIsInNyYyIsImRzdCIsIl9jYiIsImNiIiwiZnMiLCJ1bmxpbmsiLCJwcm9jZXNzIiwicGxhdGZvcm0iLCJyZW5hbWUiLCJ0bXAiLCJMb2NhbEZTIiwiY29uc3RydWN0b3IiLCJwYXRoIiwibG9nZ2VyIiwidXBkYXRlUGFja2FnZSIsIm5hbWUiLCJ1cGRhdGVIYW5kbGVyIiwib25Xcml0ZSIsInRyYW5zZm9ybVBhY2thZ2UiLCJvbkVuZCIsIl9sb2NrQW5kUmVhZEpTT04iLCJqc29uIiwibG9ja2VkIiwic2VsZiIsInVuTG9ja0NhbGxiYWNrIiwibG9ja0Vycm9yIiwiX2FyZ3MiLCJhcmd1bWVudHMiLCJfdW5sb2NrSlNPTiIsInRyYWNlIiwiYXBwbHkiLCJfIiwiaXNOaWwiLCJkZWxldGVQYWNrYWdlIiwicGFja2FnZU5hbWUiLCJjYWxsYmFjayIsImRlYnVnIiwiX2dldFN0b3JhZ2UiLCJyZW1vdmVQYWNrYWdlIiwicm1kaXIiLCJjcmVhdGVQYWNrYWdlIiwidmFsdWUiLCJfY3JlYXRlRmlsZSIsIl9jb252ZXJ0VG9TdHJpbmciLCJzYXZlUGFja2FnZSIsIl93cml0ZUZpbGUiLCJyZWFkUGFja2FnZSIsIl9yZWFkU3RvcmFnZUZpbGUiLCJ0aGVuIiwicmVzIiwiZGF0YSIsIkpTT04iLCJwYXJzZSIsInRvU3RyaW5nIiwid3JpdGVUYXJiYWxsIiwidXBsb2FkU3RyZWFtIiwiVXBsb2FkVGFyYmFsbCIsIl9lbmRlZCIsIm9uIiwicGF0aE5hbWUiLCJhY2Nlc3MiLCJmaWxlTm90Rm91bmQiLCJleGlzdHMiLCJlbWl0IiwidGVtcG9yYWxOYW1lIiwiam9pbiIsInJlcGxhY2UiLCJmaWxlIiwiY3JlYXRlV3JpdGVTdHJlYW0iLCJyZW1vdmVUZW1wRmlsZSIsIm9wZW5lZCIsInBpcGUiLCJkb25lIiwib25lbmQiLCJlbmQiLCJhYm9ydCIsInJlYWRUYXJiYWxsIiwicmVhZFRhcmJhbGxTdHJlYW0iLCJSZWFkVGFyYmFsbCIsInJlYWRTdHJlYW0iLCJjcmVhdGVSZWFkU3RyZWFtIiwiZmQiLCJmc3RhdCIsInN0YXRzIiwic2l6ZSIsImNsb3NlIiwiY29udGVudHMiLCJvcGVuIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJyZWFkRmlsZSIsInN0cmluZ2lmeSIsImZpbGVOYW1lIiwic3RvcmFnZVBhdGgiLCJkZXN0IiwiY3JlYXRlVGVtcEZpbGUiLCJ0ZW1wRmlsZVBhdGgiLCJ3cml0ZUZpbGUiLCJkaXJuYW1lIiwiY2F0Y2giLCJsb2NrIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7O0FBQ0E7O0FBRUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUE7Ozs7OztBQUVPLE1BQU1BLFNBQVMsR0FBRyxTQUFsQjs7QUFDQSxNQUFNQyxVQUFVLEdBQUcsUUFBbkI7O0FBQ0EsTUFBTUMsb0JBQW9CLEdBQUcsUUFBN0I7O0FBQ0EsTUFBTUMsV0FBVyxHQUFHLGNBQXBCOzs7QUFFQSxNQUFNQyxPQUFPLEdBQUcsVUFBVUMsT0FBVixFQUEyQkMsSUFBSSxHQUFHLEdBQWxDLEVBQXVEO0FBQzVFLFFBQU1DLEdBQW1CLEdBQUcsa0JBQVFELElBQVIsRUFBY0QsT0FBZCxDQUE1QixDQUQ0RSxDQUU1RTtBQUNBOztBQUNBRSxFQUFBQSxHQUFHLENBQUNELElBQUosR0FBV0QsT0FBWDtBQUVBLFNBQU9FLEdBQVA7QUFDRCxDQVBNOzs7O0FBU1AsTUFBTUMsUUFBUSxHQUFHLFVBQVVDLEdBQVYsRUFBdUI7QUFDdEMsU0FBUSxHQUFFQSxHQUFJLE9BQU1DLE1BQU0sQ0FBQ0MsSUFBSSxDQUFDQyxNQUFMLEVBQUQsQ0FBTixDQUFzQkMsTUFBdEIsQ0FBNkIsQ0FBN0IsQ0FBZ0MsRUFBcEQ7QUFDRCxDQUZEOztBQUlBLE1BQU1DLFNBQVMsR0FBRyxVQUFVQyxHQUFWLEVBQWVDLEdBQWYsRUFBb0JDLEdBQXBCLEVBQStCO0FBQy9DLFFBQU1DLEVBQUUsR0FBSVgsR0FBRCxJQUFlO0FBQ3hCLFFBQUlBLEdBQUosRUFBUztBQUNQWSxrQkFBR0MsTUFBSCxDQUFVTCxHQUFWLEVBQWUsTUFBTSxDQUFFLENBQXZCO0FBQ0Q7O0FBQ0RFLElBQUFBLEdBQUcsQ0FBQ1YsR0FBRCxDQUFIO0FBQ0QsR0FMRDs7QUFPQSxNQUFJYyxPQUFPLENBQUNDLFFBQVIsS0FBcUIsT0FBekIsRUFBa0M7QUFDaEMsV0FBT0gsWUFBR0ksTUFBSCxDQUFVUixHQUFWLEVBQWVDLEdBQWYsRUFBb0JFLEVBQXBCLENBQVA7QUFDRCxHQVY4QyxDQVkvQztBQUNBOzs7QUFDQSxRQUFNTSxHQUFHLEdBQUdoQixRQUFRLENBQUNRLEdBQUQsQ0FBcEI7O0FBQ0FHLGNBQUdJLE1BQUgsQ0FBVVAsR0FBVixFQUFlUSxHQUFmLEVBQW9CLFVBQVVqQixHQUFWLEVBQWU7QUFDakNZLGdCQUFHSSxNQUFILENBQVVSLEdBQVYsRUFBZUMsR0FBZixFQUFvQkUsRUFBcEI7O0FBQ0EsUUFBSSxDQUFDWCxHQUFMLEVBQVU7QUFDUlksa0JBQUdDLE1BQUgsQ0FBVUksR0FBVixFQUFlLE1BQU0sQ0FBRSxDQUF2QjtBQUNEO0FBQ0YsR0FMRDtBQU1ELENBckJEOztBQXlCZSxNQUFNQyxPQUFOLENBQWdEO0FBSXREQyxFQUFBQSxXQUFQLENBQW1CQyxJQUFuQixFQUFpQ0MsTUFBakMsRUFBaUQ7QUFBQTs7QUFBQTs7QUFDL0MsU0FBS0QsSUFBTCxHQUFZQSxJQUFaO0FBQ0EsU0FBS0MsTUFBTCxHQUFjQSxNQUFkO0FBQ0Q7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFlT0MsRUFBQUEsYUFBUCxDQUNFQyxJQURGLEVBRUVDLGFBRkYsRUFHRUMsT0FIRixFQUlFQyxnQkFKRixFQUtFQyxLQUxGLEVBTVE7QUFDTixTQUFLQyxnQkFBTCxDQUFzQmhDLFdBQXRCLEVBQW1DLENBQUNJLEdBQUQsRUFBTTZCLElBQU4sS0FBZTtBQUNoRCxVQUFJQyxNQUFNLEdBQUcsS0FBYjtBQUNBLFlBQU1DLElBQUksR0FBRyxJQUFiLENBRmdELENBR2hEOztBQUNBLFlBQU1DLGNBQWMsR0FBRyxVQUFVQyxTQUFWLEVBQWtDO0FBQ3ZEO0FBQ0EsY0FBTUMsS0FBSyxHQUFHQyxTQUFkOztBQUVBLFlBQUlMLE1BQUosRUFBWTtBQUNWQyxVQUFBQSxJQUFJLENBQUNLLFdBQUwsQ0FBaUJ4QyxXQUFqQixFQUE4QixNQUFNO0FBQ2xDO0FBQ0EsZ0JBQUlxQyxTQUFTLEtBQUssSUFBbEIsRUFBd0I7QUFDdEJGLGNBQUFBLElBQUksQ0FBQ1YsTUFBTCxDQUFZZ0IsS0FBWixDQUNFO0FBQ0VkLGdCQUFBQSxJQURGO0FBRUVVLGdCQUFBQTtBQUZGLGVBREYsRUFLRSxvR0FMRjtBQU9EOztBQUVETixZQUFBQSxLQUFLLENBQUNXLEtBQU4sQ0FBWUwsU0FBWixFQUF1QkMsS0FBdkI7QUFDRCxXQWJEO0FBY0QsU0FmRCxNQWVPO0FBQ0xILFVBQUFBLElBQUksQ0FBQ1YsTUFBTCxDQUFZZ0IsS0FBWixDQUFrQjtBQUFFZCxZQUFBQTtBQUFGLFdBQWxCLEVBQTRCLDZFQUE1QjtBQUVBSSxVQUFBQSxLQUFLLENBQUMsR0FBR08sS0FBSixDQUFMO0FBQ0Q7QUFDRixPQXhCRDs7QUEwQkEsVUFBSSxDQUFDbEMsR0FBTCxFQUFVO0FBQ1I4QixRQUFBQSxNQUFNLEdBQUcsSUFBVDtBQUNBLGFBQUtULE1BQUwsQ0FBWWdCLEtBQVosQ0FDRTtBQUNFZCxVQUFBQTtBQURGLFNBREYsRUFJRSw2REFKRjtBQU1EOztBQUVELFVBQUlnQixnQkFBRUMsS0FBRixDQUFReEMsR0FBUixNQUFpQixLQUFyQixFQUE0QjtBQUMxQixZQUFJQSxHQUFHLENBQUNELElBQUosS0FBYUosb0JBQWpCLEVBQXVDO0FBQ3JDLGlCQUFPcUMsY0FBYyxDQUFDLDJCQUFpQixrQ0FBakIsQ0FBRCxDQUFyQjtBQUNELFNBRkQsTUFFTyxJQUFJaEMsR0FBRyxDQUFDRCxJQUFKLEtBQWFMLFVBQWpCLEVBQTZCO0FBQ2xDLGlCQUFPc0MsY0FBYyxDQUFDLHVCQUFELENBQXJCO0FBQ0QsU0FGTSxNQUVBO0FBQ0wsaUJBQU9BLGNBQWMsQ0FBQ2hDLEdBQUQsQ0FBckI7QUFDRDtBQUNGOztBQUVEd0IsTUFBQUEsYUFBYSxDQUFDSyxJQUFELEVBQU83QixHQUFHLElBQUk7QUFDekIsWUFBSUEsR0FBSixFQUFTO0FBQ1AsaUJBQU9nQyxjQUFjLENBQUNoQyxHQUFELENBQXJCO0FBQ0Q7O0FBRUR5QixRQUFBQSxPQUFPLENBQUNGLElBQUQsRUFBT0csZ0JBQWdCLENBQUNHLElBQUQsQ0FBdkIsRUFBK0JHLGNBQS9CLENBQVA7QUFDRCxPQU5ZLENBQWI7QUFPRCxLQXpERDtBQTBERDs7QUFFTVMsRUFBQUEsYUFBUCxDQUFxQkMsV0FBckIsRUFBMENDLFFBQTFDLEVBQXVHO0FBQ3JHLFNBQUt0QixNQUFMLENBQVl1QixLQUFaLENBQWtCO0FBQUVGLE1BQUFBO0FBQUYsS0FBbEIsRUFBbUMsK0RBQW5DO0FBRUEsV0FBTzlCLFlBQUdDLE1BQUgsQ0FBVSxLQUFLZ0MsV0FBTCxDQUFpQkgsV0FBakIsQ0FBVixFQUF5Q0MsUUFBekMsQ0FBUDtBQUNEOztBQUVNRyxFQUFBQSxhQUFQLENBQXFCSCxRQUFyQixFQUFrRjtBQUNoRixTQUFLdEIsTUFBTCxDQUFZdUIsS0FBWixDQUFrQjtBQUFFRixNQUFBQSxXQUFXLEVBQUUsS0FBS3RCO0FBQXBCLEtBQWxCLEVBQThDLGdFQUE5Qzs7QUFFQVIsZ0JBQUdtQyxLQUFILENBQVMsS0FBS0YsV0FBTCxDQUFpQixHQUFqQixDQUFULEVBQWdDRixRQUFoQztBQUNEOztBQUVNSyxFQUFBQSxhQUFQLENBQXFCekIsSUFBckIsRUFBbUMwQixLQUFuQyxFQUFtRHRDLEVBQW5ELEVBQXVFO0FBQ3JFLFNBQUtVLE1BQUwsQ0FBWXVCLEtBQVosQ0FBa0I7QUFBRUYsTUFBQUEsV0FBVyxFQUFFbkI7QUFBZixLQUFsQixFQUF5QyxnRUFBekM7O0FBRUEsU0FBSzJCLFdBQUwsQ0FBaUIsS0FBS0wsV0FBTCxDQUFpQmpELFdBQWpCLENBQWpCLEVBQWdELEtBQUt1RCxnQkFBTCxDQUFzQkYsS0FBdEIsQ0FBaEQsRUFBOEV0QyxFQUE5RTtBQUNEOztBQUVNeUMsRUFBQUEsV0FBUCxDQUFtQjdCLElBQW5CLEVBQWlDMEIsS0FBakMsRUFBaUR0QyxFQUFqRCxFQUFxRTtBQUNuRSxTQUFLVSxNQUFMLENBQVl1QixLQUFaLENBQWtCO0FBQUVGLE1BQUFBLFdBQVcsRUFBRW5CO0FBQWYsS0FBbEIsRUFBeUMsNERBQXpDOztBQUVBLFNBQUs4QixVQUFMLENBQWdCLEtBQUtSLFdBQUwsQ0FBaUJqRCxXQUFqQixDQUFoQixFQUErQyxLQUFLdUQsZ0JBQUwsQ0FBc0JGLEtBQXRCLENBQS9DLEVBQTZFdEMsRUFBN0U7QUFDRDs7QUFFTTJDLEVBQUFBLFdBQVAsQ0FBbUIvQixJQUFuQixFQUFpQ1osRUFBakMsRUFBcUQ7QUFDbkQsU0FBS1UsTUFBTCxDQUFZdUIsS0FBWixDQUFrQjtBQUFFRixNQUFBQSxXQUFXLEVBQUVuQjtBQUFmLEtBQWxCLEVBQXlDLDREQUF6Qzs7QUFFQSxTQUFLZ0MsZ0JBQUwsQ0FBc0IsS0FBS1YsV0FBTCxDQUFpQmpELFdBQWpCLENBQXRCLEVBQXFENEQsSUFBckQsQ0FDRUMsR0FBRyxJQUFJO0FBQ0wsVUFBSTtBQUNGLGNBQU1DLElBQVMsR0FBR0MsSUFBSSxDQUFDQyxLQUFMLENBQVdILEdBQUcsQ0FBQ0ksUUFBSixDQUFhLE1BQWIsQ0FBWCxDQUFsQjtBQUVBLGFBQUt4QyxNQUFMLENBQVlnQixLQUFaLENBQ0U7QUFBRUssVUFBQUEsV0FBVyxFQUFFbkI7QUFBZixTQURGLEVBRUUscUZBRkY7QUFJQVosUUFBQUEsRUFBRSxDQUFDLElBQUQsRUFBTytDLElBQVAsQ0FBRjtBQUNELE9BUkQsQ0FRRSxPQUFPMUQsR0FBUCxFQUFZO0FBQ1osYUFBS3FCLE1BQUwsQ0FBWWdCLEtBQVosQ0FBa0I7QUFBRXJDLFVBQUFBO0FBQUYsU0FBbEIsRUFBMkIsOEVBQTNCO0FBQ0FXLFFBQUFBLEVBQUUsQ0FBQ1gsR0FBRCxDQUFGO0FBQ0Q7QUFDRixLQWRILEVBZUVBLEdBQUcsSUFBSTtBQUNMLFdBQUtxQixNQUFMLENBQVlnQixLQUFaLENBQWtCO0FBQUVyQyxRQUFBQTtBQUFGLE9BQWxCLEVBQTJCLDhFQUEzQjtBQUVBLGFBQU9XLEVBQUUsQ0FBQ1gsR0FBRCxDQUFUO0FBQ0QsS0FuQkg7QUFxQkQ7O0FBRU04RCxFQUFBQSxZQUFQLENBQW9CdkMsSUFBcEIsRUFBa0Q7QUFDaEQsVUFBTXdDLFlBQVksR0FBRyxJQUFJQyxzQkFBSixDQUFrQixFQUFsQixDQUFyQjtBQUNBLFNBQUszQyxNQUFMLENBQVl1QixLQUFaLENBQ0U7QUFBRUYsTUFBQUEsV0FBVyxFQUFFbkI7QUFBZixLQURGLEVBRUUsMEVBRkY7QUFLQSxRQUFJMEMsTUFBTSxHQUFHLENBQWI7QUFDQUYsSUFBQUEsWUFBWSxDQUFDRyxFQUFiLENBQWdCLEtBQWhCLEVBQXVCLFlBQVk7QUFDakNELE1BQUFBLE1BQU0sR0FBRyxDQUFUO0FBQ0QsS0FGRDs7QUFJQSxVQUFNRSxRQUFnQixHQUFHLEtBQUt0QixXQUFMLENBQWlCdEIsSUFBakIsQ0FBekI7O0FBRUFYLGdCQUFHd0QsTUFBSCxDQUFVRCxRQUFWLEVBQW9CRSxZQUFZLElBQUk7QUFDbEMsWUFBTUMsTUFBTSxHQUFHLENBQUNELFlBQWhCOztBQUNBLFVBQUlDLE1BQUosRUFBWTtBQUNWUCxRQUFBQSxZQUFZLENBQUNRLElBQWIsQ0FBa0IsT0FBbEIsRUFBMkIxRSxPQUFPLENBQUNKLFNBQUQsQ0FBbEM7QUFDRCxPQUZELE1BRU87QUFDTCxjQUFNK0UsWUFBWSxHQUFHcEQsY0FBS3FELElBQUwsQ0FBVSxLQUFLckQsSUFBZixFQUFzQixHQUFFRyxJQUFLLFFBQU9wQixNQUFNLENBQUNDLElBQUksQ0FBQ0MsTUFBTCxFQUFELENBQU4sQ0FBc0JxRSxPQUF0QixDQUE4QixNQUE5QixFQUFzQyxFQUF0QyxDQUEwQyxFQUE5RSxDQUFyQjs7QUFDQSxjQUFNQyxJQUFJLEdBQUcvRCxZQUFHZ0UsaUJBQUgsQ0FBcUJKLFlBQXJCLENBQWI7O0FBQ0EsY0FBTUssY0FBYyxHQUFHLE1BQVlqRSxZQUFHQyxNQUFILENBQVUyRCxZQUFWLEVBQXdCLE1BQU0sQ0FBRSxDQUFoQyxDQUFuQzs7QUFDQSxZQUFJTSxNQUFNLEdBQUcsS0FBYjtBQUNBZixRQUFBQSxZQUFZLENBQUNnQixJQUFiLENBQWtCSixJQUFsQjs7QUFFQVosUUFBQUEsWUFBWSxDQUFDaUIsSUFBYixHQUFvQixZQUFrQjtBQUNwQyxnQkFBTUMsS0FBSyxHQUFHLFlBQWtCO0FBQzlCTixZQUFBQSxJQUFJLENBQUNULEVBQUwsQ0FBUSxPQUFSLEVBQWlCLFlBQVk7QUFDM0IzRCxjQUFBQSxTQUFTLENBQUNpRSxZQUFELEVBQWVMLFFBQWYsRUFBeUIsVUFBVW5FLEdBQVYsRUFBZTtBQUMvQyxvQkFBSUEsR0FBSixFQUFTO0FBQ1ArRCxrQkFBQUEsWUFBWSxDQUFDUSxJQUFiLENBQWtCLE9BQWxCLEVBQTJCdkUsR0FBM0I7QUFDRCxpQkFGRCxNQUVPO0FBQ0wrRCxrQkFBQUEsWUFBWSxDQUFDUSxJQUFiLENBQWtCLFNBQWxCO0FBQ0Q7QUFDRixlQU5RLENBQVQ7QUFPRCxhQVJEO0FBU0FJLFlBQUFBLElBQUksQ0FBQ08sR0FBTDtBQUNELFdBWEQ7O0FBWUEsY0FBSWpCLE1BQUosRUFBWTtBQUNWZ0IsWUFBQUEsS0FBSztBQUNOLFdBRkQsTUFFTztBQUNMbEIsWUFBQUEsWUFBWSxDQUFDRyxFQUFiLENBQWdCLEtBQWhCLEVBQXVCZSxLQUF2QjtBQUNEO0FBQ0YsU0FsQkQ7O0FBb0JBbEIsUUFBQUEsWUFBWSxDQUFDb0IsS0FBYixHQUFxQixZQUFrQjtBQUNyQyxjQUFJTCxNQUFKLEVBQVk7QUFDVkEsWUFBQUEsTUFBTSxHQUFHLEtBQVQ7QUFDQUgsWUFBQUEsSUFBSSxDQUFDVCxFQUFMLENBQVEsT0FBUixFQUFpQixZQUFZO0FBQzNCVyxjQUFBQSxjQUFjO0FBQ2YsYUFGRDtBQUdELFdBTEQsTUFLTztBQUNMO0FBQ0FBLFlBQUFBLGNBQWM7QUFDZjs7QUFDREYsVUFBQUEsSUFBSSxDQUFDTyxHQUFMO0FBQ0QsU0FYRDs7QUFhQVAsUUFBQUEsSUFBSSxDQUFDVCxFQUFMLENBQVEsTUFBUixFQUFnQixZQUFZO0FBQzFCWSxVQUFBQSxNQUFNLEdBQUcsSUFBVCxDQUQwQixDQUUxQjs7QUFDQWYsVUFBQUEsWUFBWSxDQUFDUSxJQUFiLENBQWtCLE1BQWxCO0FBQ0QsU0FKRDtBQU1BSSxRQUFBQSxJQUFJLENBQUNULEVBQUwsQ0FBUSxPQUFSLEVBQWlCLFVBQVVsRSxHQUFWLEVBQWU7QUFDOUIrRCxVQUFBQSxZQUFZLENBQUNRLElBQWIsQ0FBa0IsT0FBbEIsRUFBMkJ2RSxHQUEzQjtBQUNELFNBRkQ7QUFHRDtBQUNGLEtBdEREOztBQXdEQSxXQUFPK0QsWUFBUDtBQUNEOztBQUVNcUIsRUFBQUEsV0FBUCxDQUFtQjdELElBQW5CLEVBQThDO0FBQzVDLFVBQU00QyxRQUFnQixHQUFHLEtBQUt0QixXQUFMLENBQWlCdEIsSUFBakIsQ0FBekI7O0FBQ0EsU0FBS0YsTUFBTCxDQUFZdUIsS0FBWixDQUFrQjtBQUFFRixNQUFBQSxXQUFXLEVBQUVuQjtBQUFmLEtBQWxCLEVBQXlDLHdFQUF6QztBQUVBLFVBQU04RCxpQkFBaUIsR0FBRyxJQUFJQyxvQkFBSixDQUFnQixFQUFoQixDQUExQjs7QUFFQSxVQUFNQyxVQUFVLEdBQUczRSxZQUFHNEUsZ0JBQUgsQ0FBb0JyQixRQUFwQixDQUFuQjs7QUFFQW9CLElBQUFBLFVBQVUsQ0FBQ3JCLEVBQVgsQ0FBYyxPQUFkLEVBQXVCLFVBQVVsRSxHQUFWLEVBQWU7QUFDcENxRixNQUFBQSxpQkFBaUIsQ0FBQ2QsSUFBbEIsQ0FBdUIsT0FBdkIsRUFBZ0N2RSxHQUFoQztBQUNELEtBRkQ7QUFJQXVGLElBQUFBLFVBQVUsQ0FBQ3JCLEVBQVgsQ0FBYyxNQUFkLEVBQXNCLFVBQVV1QixFQUFWLEVBQWM7QUFDbEM3RSxrQkFBRzhFLEtBQUgsQ0FBU0QsRUFBVCxFQUFhLFVBQVV6RixHQUFWLEVBQWUyRixLQUFmLEVBQXNCO0FBQ2pDLFlBQUlwRCxnQkFBRUMsS0FBRixDQUFReEMsR0FBUixNQUFpQixLQUFyQixFQUE0QjtBQUMxQixpQkFBT3FGLGlCQUFpQixDQUFDZCxJQUFsQixDQUF1QixPQUF2QixFQUFnQ3ZFLEdBQWhDLENBQVA7QUFDRDs7QUFDRHFGLFFBQUFBLGlCQUFpQixDQUFDZCxJQUFsQixDQUF1QixnQkFBdkIsRUFBeUNvQixLQUFLLENBQUNDLElBQS9DO0FBQ0FQLFFBQUFBLGlCQUFpQixDQUFDZCxJQUFsQixDQUF1QixNQUF2QjtBQUNBZ0IsUUFBQUEsVUFBVSxDQUFDUixJQUFYLENBQWdCTSxpQkFBaEI7QUFDRCxPQVBEO0FBUUQsS0FURDs7QUFXQUEsSUFBQUEsaUJBQWlCLENBQUNGLEtBQWxCLEdBQTBCLFlBQWtCO0FBQzFDSSxNQUFBQSxVQUFVLENBQUNNLEtBQVg7QUFDRCxLQUZEOztBQUlBLFdBQU9SLGlCQUFQO0FBQ0Q7O0FBRU9uQyxFQUFBQSxXQUFSLENBQW9CM0IsSUFBcEIsRUFBa0N1RSxRQUFsQyxFQUFpRG5ELFFBQWpELEVBQTJFO0FBQ3pFLFNBQUt0QixNQUFMLENBQVlnQixLQUFaLENBQWtCO0FBQUVkLE1BQUFBO0FBQUYsS0FBbEIsRUFBNEIsd0RBQTVCOztBQUVBWCxnQkFBR21GLElBQUgsQ0FBUXhFLElBQVIsRUFBYyxJQUFkLEVBQW9CdkIsR0FBRyxJQUFJO0FBQ3pCLFVBQUlBLEdBQUosRUFBUztBQUNQO0FBQ0EsWUFBSUEsR0FBRyxDQUFDRCxJQUFKLEtBQWEsUUFBakIsRUFBMkI7QUFDekIsZUFBS3NCLE1BQUwsQ0FBWWdCLEtBQVosQ0FBa0I7QUFBRWQsWUFBQUE7QUFBRixXQUFsQixFQUE0QixnRkFBNUI7QUFDQSxpQkFBT29CLFFBQVEsQ0FBQzlDLE9BQU8sQ0FBQ0osU0FBRCxDQUFSLENBQWY7QUFDRDtBQUNGOztBQUVELFdBQUs0RCxVQUFMLENBQWdCOUIsSUFBaEIsRUFBc0J1RSxRQUF0QixFQUFnQ25ELFFBQWhDO0FBQ0QsS0FWRDtBQVdEOztBQUVPWSxFQUFBQSxnQkFBUixDQUF5QmhDLElBQXpCLEVBQXFEO0FBQ25ELFdBQU8sSUFBSXlFLE9BQUosQ0FBWSxDQUFDQyxPQUFELEVBQVVDLE1BQVYsS0FBMkI7QUFDNUMsV0FBSzdFLE1BQUwsQ0FBWWdCLEtBQVosQ0FBa0I7QUFBRWQsUUFBQUE7QUFBRixPQUFsQixFQUE0Qix1REFBNUI7O0FBRUFYLGtCQUFHdUYsUUFBSCxDQUFZNUUsSUFBWixFQUFrQixDQUFDdkIsR0FBRCxFQUFNMEQsSUFBTixLQUFlO0FBQy9CLFlBQUkxRCxHQUFKLEVBQVM7QUFDUCxlQUFLcUIsTUFBTCxDQUFZZ0IsS0FBWixDQUFrQjtBQUFFckMsWUFBQUE7QUFBRixXQUFsQixFQUEyQixrRUFBM0I7QUFDQWtHLFVBQUFBLE1BQU0sQ0FBQ2xHLEdBQUQsQ0FBTjtBQUNELFNBSEQsTUFHTztBQUNMLGVBQUtxQixNQUFMLENBQVlnQixLQUFaLENBQWtCO0FBQUVkLFlBQUFBO0FBQUYsV0FBbEIsRUFBNEIsNkRBQTVCO0FBRUEwRSxVQUFBQSxPQUFPLENBQUN2QyxJQUFELENBQVA7QUFDRDtBQUNGLE9BVEQ7QUFVRCxLQWJNLENBQVA7QUFjRDs7QUFFT1AsRUFBQUEsZ0JBQVIsQ0FBeUJGLEtBQXpCLEVBQWlEO0FBQy9DLFdBQU9VLElBQUksQ0FBQ3lDLFNBQUwsQ0FBZW5ELEtBQWYsRUFBc0IsSUFBdEIsRUFBNEIsSUFBNUIsQ0FBUDtBQUNEOztBQUVPSixFQUFBQSxXQUFSLENBQW9Cd0QsUUFBUSxHQUFHLEVBQS9CLEVBQTJDO0FBQ3pDLFVBQU1DLFdBQW1CLEdBQUdsRixjQUFLcUQsSUFBTCxDQUFVLEtBQUtyRCxJQUFmLEVBQXFCaUYsUUFBckIsQ0FBNUI7O0FBRUEsV0FBT0MsV0FBUDtBQUNEOztBQUVPakQsRUFBQUEsVUFBUixDQUFtQmtELElBQW5CLEVBQWlDN0MsSUFBakMsRUFBK0MvQyxFQUEvQyxFQUFtRTtBQUNqRSxVQUFNNkYsY0FBYyxHQUFJN0YsRUFBRCxJQUFjO0FBQ25DLFlBQU04RixZQUFZLEdBQUd4RyxRQUFRLENBQUNzRyxJQUFELENBQTdCOztBQUVBM0Ysa0JBQUc4RixTQUFILENBQWFELFlBQWIsRUFBMkIvQyxJQUEzQixFQUFpQzFELEdBQUcsSUFBSTtBQUN0QyxZQUFJQSxHQUFKLEVBQVM7QUFDUCxlQUFLcUIsTUFBTCxDQUFZZ0IsS0FBWixDQUFrQjtBQUFFZCxZQUFBQSxJQUFJLEVBQUVnRjtBQUFSLFdBQWxCLEVBQWtDLCtEQUFsQztBQUVBLGlCQUFPNUYsRUFBRSxDQUFDWCxHQUFELENBQVQ7QUFDRDs7QUFFRCxhQUFLcUIsTUFBTCxDQUFZZ0IsS0FBWixDQUFrQjtBQUFFZCxVQUFBQSxJQUFJLEVBQUVnRjtBQUFSLFNBQWxCLEVBQWtDLHlEQUFsQztBQUNBaEcsUUFBQUEsU0FBUyxDQUFDa0csWUFBRCxFQUFlRixJQUFmLEVBQXFCNUYsRUFBckIsQ0FBVDtBQUNELE9BVEQ7QUFVRCxLQWJEOztBQWVBNkYsSUFBQUEsY0FBYyxDQUFDeEcsR0FBRyxJQUFJO0FBQ3BCLFVBQUlBLEdBQUcsSUFBSUEsR0FBRyxDQUFDRCxJQUFKLEtBQWFMLFVBQXhCLEVBQW9DO0FBQ2xDLDZCQUFPMEIsY0FBS3VGLE9BQUwsQ0FBYUosSUFBYixDQUFQLEVBQ0cvQyxJQURILENBQ1EsTUFBTTtBQUNWZ0QsVUFBQUEsY0FBYyxDQUFDN0YsRUFBRCxDQUFkO0FBQ0QsU0FISCxFQUlHaUcsS0FKSCxDQUlTNUcsR0FBRyxJQUFJO0FBQ1osaUJBQU9XLEVBQUUsQ0FBQ1gsR0FBRCxDQUFUO0FBQ0QsU0FOSDtBQU9ELE9BUkQsTUFRTztBQUNMVyxRQUFBQSxFQUFFLENBQUNYLEdBQUQsQ0FBRjtBQUNEO0FBQ0YsS0FaYSxDQUFkO0FBYUQ7O0FBRU80QixFQUFBQSxnQkFBUixDQUF5QkwsSUFBekIsRUFBdUNaLEVBQXZDLEVBQTJEO0FBQ3pELFVBQU0wRixRQUFnQixHQUFHLEtBQUt4RCxXQUFMLENBQWlCdEIsSUFBakIsQ0FBekI7O0FBRUEsK0JBQ0U4RSxRQURGLEVBRUU7QUFDRVEsTUFBQUEsSUFBSSxFQUFFLElBRFI7QUFFRWpELE1BQUFBLEtBQUssRUFBRTtBQUZULEtBRkYsRUFNRSxDQUFDNUQsR0FBRCxFQUFNeUQsR0FBTixLQUFjO0FBQ1osVUFBSXpELEdBQUosRUFBUztBQUNQLGFBQUtxQixNQUFMLENBQVlnQixLQUFaLENBQWtCO0FBQUVkLFVBQUFBO0FBQUYsU0FBbEIsRUFBNEIsb0VBQTVCO0FBRUEsZUFBT1osRUFBRSxDQUFDWCxHQUFELENBQVQ7QUFDRDs7QUFFRCxXQUFLcUIsTUFBTCxDQUFZZ0IsS0FBWixDQUFrQjtBQUFFZCxRQUFBQTtBQUFGLE9BQWxCLEVBQTRCLHFEQUE1QjtBQUNBLGFBQU9aLEVBQUUsQ0FBQyxJQUFELEVBQU84QyxHQUFQLENBQVQ7QUFDRCxLQWZIO0FBaUJEOztBQUVPckIsRUFBQUEsV0FBUixDQUFvQmIsSUFBcEIsRUFBa0NaLEVBQWxDLEVBQXNEO0FBQ3BELGlDQUFXLEtBQUtrQyxXQUFMLENBQWlCdEIsSUFBakIsQ0FBWCxFQUFtQ1osRUFBbkM7QUFDRDs7QUF0VjREIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGZzIGZyb20gJ2ZzJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuXG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IG1rZGlycCBmcm9tICdta2RpcnAnO1xuaW1wb3J0IHsgVXBsb2FkVGFyYmFsbCwgUmVhZFRhcmJhbGwgfSBmcm9tICdAdmVyZGFjY2lvL3N0cmVhbXMnO1xuaW1wb3J0IHsgdW5sb2NrRmlsZSwgcmVhZEZpbGUgfSBmcm9tICdAdmVyZGFjY2lvL2ZpbGUtbG9ja2luZyc7XG5pbXBvcnQgeyBDYWxsYmFjaywgTG9nZ2VyLCBQYWNrYWdlLCBJTG9jYWxQYWNrYWdlTWFuYWdlciwgSVVwbG9hZFRhcmJhbGwgfSBmcm9tICdAdmVyZGFjY2lvL3R5cGVzJztcbmltcG9ydCB7IGdldENvZGUsIGdldEludGVybmFsRXJyb3IsIGdldE5vdEZvdW5kLCBWZXJkYWNjaW9FcnJvciB9IGZyb20gJ0B2ZXJkYWNjaW8vY29tbW9ucy1hcGkvbGliJztcblxuZXhwb3J0IGNvbnN0IGZpbGVFeGlzdCA9ICdFRVhJU1RTJztcbmV4cG9ydCBjb25zdCBub1N1Y2hGaWxlID0gJ0VOT0VOVCc7XG5leHBvcnQgY29uc3QgcmVzb3VyY2VOb3RBdmFpbGFibGUgPSAnRUFHQUlOJztcbmV4cG9ydCBjb25zdCBwa2dGaWxlTmFtZSA9ICdwYWNrYWdlLmpzb24nO1xuXG5leHBvcnQgY29uc3QgZlNFcnJvciA9IGZ1bmN0aW9uIChtZXNzYWdlOiBzdHJpbmcsIGNvZGUgPSA0MDkpOiBWZXJkYWNjaW9FcnJvciB7XG4gIGNvbnN0IGVycjogVmVyZGFjY2lvRXJyb3IgPSBnZXRDb2RlKGNvZGUsIG1lc3NhZ2UpO1xuICAvLyBGSVhNRTogd2Ugc2hvdWxkIHJldHVybiBodHRwLXN0YXR1cyBjb2RlcyBoZXJlIGluc3RlYWQsIGZ1dHVyZSBpbXByb3ZlbWVudFxuICAvLyBAdHMtaWdub3JlXG4gIGVyci5jb2RlID0gbWVzc2FnZTtcblxuICByZXR1cm4gZXJyO1xufTtcblxuY29uc3QgdGVtcEZpbGUgPSBmdW5jdGlvbiAoc3RyKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke3N0cn0udG1wJHtTdHJpbmcoTWF0aC5yYW5kb20oKSkuc3Vic3RyKDIpfWA7XG59O1xuXG5jb25zdCByZW5hbWVUbXAgPSBmdW5jdGlvbiAoc3JjLCBkc3QsIF9jYik6IHZvaWQge1xuICBjb25zdCBjYiA9IChlcnIpOiB2b2lkID0+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=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9wa2ctdXRpbHMudHMiXSwibmFtZXMiOlsibG9hZFByaXZhdGVQYWNrYWdlcyIsInBhdGgiLCJsb2dnZXIiLCJsaXN0IiwiZW1wdHlEYXRhYmFzZSIsInNlY3JldCIsImRhdGEiLCJmcyIsInJlYWRGaWxlU3luYyIsIl8iLCJpc05pbCIsImRiIiwiSlNPTiIsInBhcnNlIiwiZXJyIiwiZXJyb3IiLCJFcnJvciIsImlzRW1wdHkiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTs7QUFFQTs7OztBQUdPLFNBQVNBLG1CQUFULENBQTZCQyxJQUE3QixFQUEyQ0MsTUFBM0MsRUFBeUU7QUFDOUUsUUFBTUMsSUFBaUIsR0FBRyxFQUExQjtBQUNBLFFBQU1DLGFBQWEsR0FBRztBQUFFRCxJQUFBQSxJQUFGO0FBQVFFLElBQUFBLE1BQU0sRUFBRTtBQUFoQixHQUF0Qjs7QUFDQSxRQUFNQyxJQUFJLEdBQUdDLFlBQUdDLFlBQUgsQ0FBZ0JQLElBQWhCLEVBQXNCLE1BQXRCLENBQWI7O0FBRUEsTUFBSVEsZ0JBQUVDLEtBQUYsQ0FBUUosSUFBUixDQUFKLEVBQW1CO0FBQ2pCO0FBQ0EsV0FBT0YsYUFBUDtBQUNEOztBQUVELE1BQUlPLEVBQUo7O0FBQ0EsTUFBSTtBQUNGQSxJQUFBQSxFQUFFLEdBQUdDLElBQUksQ0FBQ0MsS0FBTCxDQUFXUCxJQUFYLENBQUw7QUFDRCxHQUZELENBRUUsT0FBT1EsR0FBUCxFQUFZO0FBQ1paLElBQUFBLE1BQU0sQ0FBQ2EsS0FBUCxDQUNHLHFHQUFvR2QsSUFBSyxFQUQ1RyxFQUVFYSxHQUZGO0FBSUEsVUFBTUUsS0FBSyxDQUFDLGdEQUFELENBQVg7QUFDRDs7QUFFRCxNQUFJUCxnQkFBRVEsT0FBRixDQUFVTixFQUFWLENBQUosRUFBbUI7QUFDakIsV0FBT1AsYUFBUDtBQUNEOztBQUVELFNBQU9PLEVBQVA7QUFDRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBmcyBmcm9tICdmcyc7XG5cbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBMb2NhbFN0b3JhZ2UsIFN0b3JhZ2VMaXN0LCBMb2dnZXIgfSBmcm9tICdAdmVyZGFjY2lvL3R5cGVzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGxvYWRQcml2YXRlUGFja2FnZXMocGF0aDogc3RyaW5nLCBsb2dnZXI6IExvZ2dlcik6IExvY2FsU3RvcmFnZSB7XG4gIGNvbnN0IGxpc3Q6IFN0b3JhZ2VMaXN0ID0gW107XG4gIGNvbnN0IGVtcHR5RGF0YWJhc2UgPSB7IGxpc3QsIHNlY3JldDogJycgfTtcbiAgY29uc3QgZGF0YSA9IGZzLnJlYWRGaWxlU3luYyhwYXRoLCAndXRmOCcpO1xuXG4gIGlmIChfLmlzTmlsKGRhdGEpKSB7XG4gICAgLy8gcmVhZEZpbGVTeW5jIGlzIHBsYXRmb3JtIHNwZWNpZmljLCBGcmVlQlNEIG1pZ2h0IHJldHVybiBudWxsXG4gICAgcmV0dXJuIGVtcHR5RGF0YWJhc2U7XG4gIH1cblxuICBsZXQgZGI7XG4gIHRyeSB7XG4gICAgZGIgPSBKU09OLnBhcnNlKGRhdGEpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2dnZXIuZXJyb3IoXG4gICAgICBgUGFja2FnZSBkYXRhYmFzZSBmaWxlIGNvcnJ1cHRlZCAoaW52YWxpZCBKU09OKSwgcGxlYXNlIGNoZWNrIHRoZSBlcnJvciBwcmludGVkIGJlbG93LlxcbkZpbGUgUGF0aDogJHtwYXRofWAsXG4gICAgICBlcnJcbiAgICApO1xuICAgIHRocm93IEVycm9yKCdQYWNrYWdlIGRhdGFiYXNlIGZpbGUgY29ycnVwdGVkIChpbnZhbGlkIEpTT04pJyk7XG4gIH1cblxuICBpZiAoXy5pc0VtcHR5KGRiKSkge1xuICAgIHJldHVybiBlbXB0eURhdGFiYXNlO1xuICB9XG5cbiAgcmV0dXJuIGRiO1xufVxuIl19
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
@@ -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=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy91dGlscy50cyJdLCJuYW1lcyI6WyJnZXRGaWxlU3RhdHMiLCJwYWNrYWdlUGF0aCIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwiZnMiLCJzdGF0IiwiZXJyIiwic3RhdHMiLCJfIiwiaXNOaWwiLCJyZWFkRGlyZWN0b3J5IiwicmVhZGRpciIsInNjb3BlZFBhY2thZ2VzIiwiaGFzU2NvcGUiLCJmaWxlIiwibWF0Y2giLCJmaW5kUGFja2FnZXMiLCJzdG9yYWdlUGF0aCIsInZhbGlkYXRpb25IYW5kbGVyIiwibGlzdFBhY2thZ2VzIiwic2NvcGVQYXRoIiwicGF0aCIsInN0b3JhZ2VEaXJzIiwiZGlyZWN0b3J5Iiwic2NvcGVEaXJlY3RvcnkiLCJzY29wZWREaXJOYW1lIiwicHVzaCIsIm5hbWUiLCJlcnJvciJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBRUE7Ozs7QUFFTyxTQUFTQSxZQUFULENBQXNCQyxXQUF0QixFQUE4RDtBQUNuRSxTQUFPLElBQUlDLE9BQUosQ0FBWSxDQUFDQyxPQUFELEVBQVVDLE1BQVYsS0FBMkI7QUFDNUNDLGdCQUFHQyxJQUFILENBQVFMLFdBQVIsRUFBcUIsQ0FBQ00sR0FBRCxFQUFNQyxLQUFOLEtBQWdCO0FBQ25DLFVBQUlDLGdCQUFFQyxLQUFGLENBQVFILEdBQVIsTUFBaUIsS0FBckIsRUFBNEI7QUFDMUIsZUFBT0gsTUFBTSxDQUFDRyxHQUFELENBQWI7QUFDRDs7QUFDREosTUFBQUEsT0FBTyxDQUFDSyxLQUFELENBQVA7QUFDRCxLQUxEO0FBTUQsR0FQTSxDQUFQO0FBUUQ7O0FBRU0sU0FBU0csYUFBVCxDQUF1QlYsV0FBdkIsRUFBK0Q7QUFDcEUsU0FBTyxJQUFJQyxPQUFKLENBQVksQ0FBQ0MsT0FBRCxFQUFVQyxNQUFWLEtBQTJCO0FBQzVDQyxnQkFBR08sT0FBSCxDQUFXWCxXQUFYLEVBQXdCLENBQUNNLEdBQUQsRUFBTU0sY0FBTixLQUF5QjtBQUMvQyxVQUFJSixnQkFBRUMsS0FBRixDQUFRSCxHQUFSLE1BQWlCLEtBQXJCLEVBQTRCO0FBQzFCLGVBQU9ILE1BQU0sQ0FBQ0csR0FBRCxDQUFiO0FBQ0Q7O0FBRURKLE1BQUFBLE9BQU8sQ0FBQ1UsY0FBRCxDQUFQO0FBQ0QsS0FORDtBQU9ELEdBUk0sQ0FBUDtBQVNEOztBQUVELFNBQVNDLFFBQVQsQ0FBa0JDLElBQWxCLEVBQXlDO0FBQ3ZDLFNBQU9BLElBQUksQ0FBQ0MsS0FBTCxDQUFXLElBQVgsTUFBcUIsSUFBNUI7QUFDRDtBQUVEOzs7QUFDTyxlQUFlQyxZQUFmLENBQ0xDLFdBREssRUFFTEMsaUJBRkssRUFHc0M7QUFDM0MsUUFBTUMsWUFBOEMsR0FBRyxFQUF2RDtBQUNBLFNBQU8sSUFBSWxCLE9BQUosQ0FBWSxPQUFPQyxPQUFQLEVBQWdCQyxNQUFoQixLQUEyQjtBQUM1QyxRQUFJO0FBQ0YsWUFBTWlCLFNBQVMsR0FBR0MsY0FBS25CLE9BQUwsQ0FBYWUsV0FBYixDQUFsQjs7QUFDQSxZQUFNSyxXQUFXLEdBQUcsTUFBTVosYUFBYSxDQUFDVSxTQUFELENBQXZDOztBQUNBLFdBQUssTUFBTUcsU0FBWCxJQUF3QkQsV0FBeEIsRUFBcUM7QUFDbkM7QUFDQSxZQUFJVCxRQUFRLENBQUNVLFNBQUQsQ0FBWixFQUF5QjtBQUN2QjtBQUNBLGdCQUFNQyxjQUFjLEdBQUdILGNBQUtuQixPQUFMLENBQWFlLFdBQWIsRUFBMEJNLFNBQTFCLENBQXZCOztBQUNBLGdCQUFNWCxjQUFjLEdBQUcsTUFBTUYsYUFBYSxDQUFDYyxjQUFELENBQTFDOztBQUNBLGVBQUssTUFBTUMsYUFBWCxJQUE0QmIsY0FBNUIsRUFBNEM7QUFDMUMsZ0JBQUlNLGlCQUFpQixDQUFDTyxhQUFELENBQXJCLEVBQXNDO0FBQ3BDO0FBQ0Esb0JBQU1MLFNBQVMsR0FBR0MsY0FBS25CLE9BQUwsQ0FBYWUsV0FBYixFQUEwQk0sU0FBMUIsRUFBcUNFLGFBQXJDLENBQWxCLENBRm9DLENBR3BDOzs7QUFDQU4sY0FBQUEsWUFBWSxDQUFDTyxJQUFiLENBQWtCO0FBQ2hCQyxnQkFBQUEsSUFBSSxFQUFHLEdBQUVKLFNBQVUsSUFBR0UsYUFBYyxFQURwQjtBQUVoQkosZ0JBQUFBLElBQUksRUFBRUQ7QUFGVSxlQUFsQjtBQUlEO0FBQ0Y7QUFDRixTQWZELE1BZU87QUFDTDtBQUNBLGNBQUlGLGlCQUFpQixDQUFDSyxTQUFELENBQXJCLEVBQWtDO0FBQ2hDLGtCQUFNSCxTQUFTLEdBQUdDLGNBQUtuQixPQUFMLENBQWFlLFdBQWIsRUFBMEJNLFNBQTFCLENBQWxCOztBQUNBSixZQUFBQSxZQUFZLENBQUNPLElBQWIsQ0FBa0I7QUFDaEJDLGNBQUFBLElBQUksRUFBRUosU0FEVTtBQUVoQkYsY0FBQUEsSUFBSSxFQUFFRDtBQUZVLGFBQWxCO0FBSUQ7QUFDRjtBQUNGO0FBQ0YsS0EvQkQsQ0ErQkUsT0FBT1EsS0FBUCxFQUFjO0FBQ2R6QixNQUFBQSxNQUFNLENBQUN5QixLQUFELENBQU47QUFDRDs7QUFFRDFCLElBQUFBLE9BQU8sQ0FBQ2lCLFlBQUQsQ0FBUDtBQUNELEdBckNNLENBQVA7QUFzQ0Q7QUFDRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBmcyBmcm9tICdmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcblxuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldEZpbGVTdGF0cyhwYWNrYWdlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxmcy5TdGF0cz4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCk6IHZvaWQgPT4ge1xuICAgIGZzLnN0YXQocGFja2FnZVBhdGgsIChlcnIsIHN0YXRzKSA9PiB7XG4gICAgICBpZiAoXy5pc05pbChlcnIpID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gcmVqZWN0KGVycik7XG4gICAgICB9XG4gICAgICByZXNvbHZlKHN0YXRzKTtcbiAgICB9KTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWFkRGlyZWN0b3J5KHBhY2thZ2VQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KTogdm9pZCA9PiB7XG4gICAgZnMucmVhZGRpcihwYWNrYWdlUGF0aCwgKGVyciwgc2NvcGVkUGFja2FnZXMpID0+IHtcbiAgICAgIGlmIChfLmlzTmlsKGVycikgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiByZWplY3QoZXJyKTtcbiAgICAgIH1cblxuICAgICAgcmVzb2x2ZShzY29wZWRQYWNrYWdlcyk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBoYXNTY29wZShmaWxlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGZpbGUubWF0Y2goL15ALykgIT09IG51bGw7XG59XG5cbi8qIGVzbGludC1kaXNhYmxlIG5vLWFzeW5jLXByb21pc2UtZXhlY3V0b3IgKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaW5kUGFja2FnZXMoXG4gIHN0b3JhZ2VQYXRoOiBzdHJpbmcsXG4gIHZhbGlkYXRpb25IYW5kbGVyOiBGdW5jdGlvblxuKTogUHJvbWlzZTx7IG5hbWU6IHN0cmluZzsgcGF0aDogc3RyaW5nIH1bXT4ge1xuICBjb25zdCBsaXN0UGFja2FnZXM6IHsgbmFtZTogc3RyaW5nOyBwYXRoOiBzdHJpbmcgfVtdID0gW107XG4gIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNjb3BlUGF0aCA9IHBhdGgucmVzb2x2ZShzdG9yYWdlUGF0aCk7XG4gICAgICBjb25zdCBzdG9yYWdlRGlycyA9IGF3YWl0IHJlYWREaXJlY3Rvcnkoc2NvcGVQYXRoKTtcbiAgICAgIGZvciAoY29uc3QgZGlyZWN0b3J5IG9mIHN0b3JhZ2VEaXJzKSB7XG4gICAgICAgIC8vIHdlIGNoZWNrIHdoZXRoZXIgaGFzIDJuZCBsZXZlbFxuICAgICAgICBpZiAoaGFzU2NvcGUoZGlyZWN0b3J5KSkge1xuICAgICAgICAgIC8vIHdlIHJlYWQgZGlyZWN0b3J5IG11bHRpcGxlXG4gICAgICAgICAgY29uc3Qgc2NvcGVEaXJlY3RvcnkgPSBwYXRoLnJlc29sdmUoc3RvcmFnZVBhdGgsIGRpcmVjdG9yeSk7XG4gICAgICAgICAgY29uc3Qgc2NvcGVkUGFja2FnZXMgPSBhd2FpdCByZWFkRGlyZWN0b3J5KHNjb3BlRGlyZWN0b3J5KTtcbiAgICAgICAgICBmb3IgKGNvbnN0IHNjb3BlZERpck5hbWUgb2Ygc2NvcGVkUGFja2FnZXMpIHtcbiAgICAgICAgICAgIGlmICh2YWxpZGF0aW9uSGFuZGxlcihzY29wZWREaXJOYW1lKSkge1xuICAgICAgICAgICAgICAvLyB3ZSBidWlsZCB0aGUgY29tcGxldGUgc2NvcGUgcGF0aFxuICAgICAgICAgICAgICBjb25zdCBzY29wZVBhdGggPSBwYXRoLnJlc29sdmUoc3RvcmFnZVBhdGgsIGRpcmVjdG9yeSwgc2NvcGVkRGlyTmFtZSk7XG4gICAgICAgICAgICAgIC8vIGxpc3QgY29udGVudCBvZiBzdWNoIGRpcmVjdG9yeVxuICAgICAgICAgICAgICBsaXN0UGFja2FnZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgbmFtZTogYCR7ZGlyZWN0b3J5fS8ke3Njb3BlZERpck5hbWV9YCxcbiAgICAgICAgICAgICAgICBwYXRoOiBzY29wZVBhdGgsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBvdGhlcndpc2Ugd2UgcmVhZCBhcyBzaW5nbGUgbGV2ZWxcbiAgICAgICAgICBpZiAodmFsaWRhdGlvbkhhbmRsZXIoZGlyZWN0b3J5KSkge1xuICAgICAgICAgICAgY29uc3Qgc2NvcGVQYXRoID0gcGF0aC5yZXNvbHZlKHN0b3JhZ2VQYXRoLCBkaXJlY3RvcnkpO1xuICAgICAgICAgICAgbGlzdFBhY2thZ2VzLnB1c2goe1xuICAgICAgICAgICAgICBuYW1lOiBkaXJlY3RvcnksXG4gICAgICAgICAgICAgIHBhdGg6IHNjb3BlUGF0aCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZWplY3QoZXJyb3IpO1xuICAgIH1cblxuICAgIHJlc29sdmUobGlzdFBhY2thZ2VzKTtcbiAgfSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG5vLWFzeW5jLXByb21pc2UtZXhlY3V0b3IgKi9cbiJdfQ==
96
+ //# sourceMappingURL=utils.js.map
@@ -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"}