@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 CHANGED
@@ -17,4 +17,4 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
17
17
 
18
18
  var _default = _localDatabase.default;
19
19
  exports.default = _default;
20
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC50cyJdLCJuYW1lcyI6WyJMb2NhbERhdGFiYXNlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBQUE7Ozs7ZUFJZUEsc0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgTG9jYWxEYXRhYmFzZSBmcm9tICcuL2xvY2FsLWRhdGFiYXNlJztcblxuZXhwb3J0IHsgTG9jYWxEYXRhYmFzZSB9O1xuXG5leHBvcnQgZGVmYXVsdCBMb2NhbERhdGFiYXNlO1xuIl19
20
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts"],"names":["LocalDatabase"],"mappings":";;;;;;;;;;;;;AAAA;;;;eAIeA,sB","sourcesContent":["import LocalDatabase from './local-database';\n\nexport { LocalDatabase };\n\nexport default LocalDatabase;\n"],"file":"index.js"}
@@ -1,33 +1,16 @@
1
- import { Callback, Config, IPackageStorage, IPluginStorage, LocalStorage, Logger, Token, TokenFilter } from '@verdaccio/types';
2
- /**
3
- * Handle local database.
4
- */
5
- declare class LocalDatabase implements IPluginStorage<{}> {
1
+ import { Callback, Config, IPackageStorage, IPluginStorage, LocalStorage, Logger } from '@verdaccio/types';
2
+ import TokenActions from './token';
3
+ declare class LocalDatabase extends TokenActions implements IPluginStorage<{}> {
6
4
  path: string;
7
5
  logger: Logger;
8
6
  data: LocalStorage;
9
7
  config: Config;
10
8
  locked: boolean;
11
- tokenDb: any;
12
- /**
13
- * Load an parse the local json database.
14
- * @param {*} path the database path
15
- */
16
9
  constructor(config: Config, logger: Logger);
17
10
  getSecret(): Promise<string>;
18
11
  setSecret(secret: string): Promise<Error | null>;
19
- /**
20
- * Add a new element.
21
- * @param {*} name
22
- * @return {Error|*}
23
- */
24
12
  add(name: string, cb: Callback): void;
25
13
  search(onPackage: Callback, onEnd: Callback, validateName: (name: string) => boolean): void;
26
- /**
27
- * Remove an element from the database.
28
- * @param {*} name
29
- * @return {Error|*}
30
- */
31
14
  remove(name: string, cb: Callback): void;
32
15
  /**
33
16
  * Return all database elements.
@@ -36,10 +19,7 @@ declare class LocalDatabase implements IPluginStorage<{}> {
36
19
  get(cb: Callback): void;
37
20
  getPackageStorage(packageName: string): IPackageStorage;
38
21
  clean(): void;
39
- saveToken(token: Token): Promise<void>;
40
- deleteToken(user: string, tokenKey: string): Promise<void>;
41
- readTokens(filter: TokenFilter): Promise<Token[]>;
42
- private _getTime;
22
+ private getTime;
43
23
  private _getCustomPackageLocalStorages;
44
24
  /**
45
25
  * Syncronize {create} database whether does not exist.
@@ -60,15 +40,11 @@ declare class LocalDatabase implements IPluginStorage<{}> {
60
40
  * @private
61
41
  */
62
42
  private _buildStoragePath;
63
- private _dbGenPath;
64
43
  /**
65
44
  * Fetch local packages.
66
45
  * @private
67
46
  * @return {Object}
68
47
  */
69
48
  private _fetchLocalPackages;
70
- private getTokenDb;
71
- private _getTokenKey;
72
- private _compoundTokenKey;
73
49
  }
74
50
  export default LocalDatabase;
@@ -9,20 +9,22 @@ 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 _async = _interopRequireDefault(require("async"));
15
17
 
16
18
  var _mkdirp = _interopRequireDefault(require("mkdirp"));
17
19
 
18
- var _level = _interopRequireDefault(require("level"));
19
-
20
- var _lib = require("@verdaccio/commons-api/lib");
20
+ var _commonsApi = require("@verdaccio/commons-api");
21
21
 
22
22
  var _localFs = _interopRequireWildcard(require("./local-fs"));
23
23
 
24
24
  var _pkgUtils = require("./pkg-utils");
25
25
 
26
+ var _token = _interopRequireDefault(require("./token"));
27
+
26
28
  function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }
27
29
 
28
30
  function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
@@ -33,17 +35,12 @@ function _defineProperty(obj, key, value) { if (key in obj) { Object.definePrope
33
35
 
34
36
  const DEPRECATED_DB_NAME = '.sinopia-db.json';
35
37
  const DB_NAME = '.verdaccio-db.json';
36
- const TOKEN_DB_NAME = '.token-db';
38
+ const debug = (0, _debug.default)('verdaccio:plugin:local-storage');
37
39
 
38
- /**
39
- * Handle local database.
40
- */
41
- class LocalDatabase {
42
- /**
43
- * Load an parse the local json database.
44
- * @param {*} path the database path
45
- */
40
+ class LocalDatabase extends _token.default {
46
41
  constructor(config, logger) {
42
+ super(config);
43
+
47
44
  _defineProperty(this, "path", void 0);
48
45
 
49
46
  _defineProperty(this, "logger", void 0);
@@ -54,16 +51,11 @@ class LocalDatabase {
54
51
 
55
52
  _defineProperty(this, "locked", void 0);
56
53
 
57
- _defineProperty(this, "tokenDb", void 0);
58
-
59
54
  this.config = config;
60
55
  this.path = this._buildStoragePath(config);
61
56
  this.logger = logger;
62
57
  this.locked = false;
63
58
  this.data = this._fetchLocalPackages();
64
- this.logger.trace({
65
- config: this.config
66
- }, '[local-storage]: configuration: @{config}');
67
59
 
68
60
  this._sync();
69
61
  }
@@ -78,21 +70,14 @@ class LocalDatabase {
78
70
  resolve(this._sync());
79
71
  });
80
72
  }
81
- /**
82
- * Add a new element.
83
- * @param {*} name
84
- * @return {Error|*}
85
- */
86
-
87
73
 
88
74
  add(name, cb) {
89
75
  if (this.data.list.indexOf(name) === -1) {
90
76
  this.data.list.push(name);
91
- this.logger.debug({
92
- name
93
- }, '[local-storage]: the private package @{name} has been added');
77
+ debug('the private package %o has been added', name);
94
78
  cb(this._sync());
95
79
  } else {
80
+ debug('the private package %o was not added', name);
96
81
  cb(null);
97
82
  }
98
83
  }
@@ -100,13 +85,13 @@ class LocalDatabase {
100
85
  search(onPackage, onEnd, validateName) {
101
86
  const storages = this._getCustomPackageLocalStorages();
102
87
 
103
- this.logger.trace(`local-storage: [search]: ${JSON.stringify(storages)}`);
88
+ debug(`search custom local packages: %o`, JSON.stringify(storages));
104
89
 
105
90
  const base = _path.default.dirname(this.config.self_path);
106
91
 
107
92
  const self = this;
108
93
  const storageKeys = Object.keys(storages);
109
- this.logger.trace(`local-storage: [search] base: ${base} keys ${storageKeys}`);
94
+ debug(`search base: %o keys: %o`, base, storageKeys);
110
95
 
111
96
  _async.default.eachSeries(storageKeys, function (storage, cb) {
112
97
  const position = storageKeys.indexOf(storage);
@@ -115,10 +100,7 @@ class LocalDatabase {
115
100
 
116
101
  const storagePath = _path.default.resolve(base, base2, storage);
117
102
 
118
- self.logger.trace({
119
- storagePath,
120
- storage
121
- }, 'local-storage: [search] search path: @{storagePath} : @{storage}');
103
+ debug('search path: %o : %o', storagePath, storage);
122
104
 
123
105
  _fs.default.readdir(storagePath, (err, files) => {
124
106
  if (err) {
@@ -126,9 +108,7 @@ class LocalDatabase {
126
108
  }
127
109
 
128
110
  _async.default.eachSeries(files, function (file, cb) {
129
- self.logger.trace({
130
- file
131
- }, 'local-storage: [search] search file path: @{file}');
111
+ debug('local-storage: [search] search file path: %o', file);
132
112
 
133
113
  if (storageKeys.includes(file)) {
134
114
  return cb();
@@ -138,9 +118,7 @@ class LocalDatabase {
138
118
  // scoped
139
119
  const fileLocation = _path.default.resolve(base, storage, file);
140
120
 
141
- self.logger.trace({
142
- fileLocation
143
- }, 'local-storage: [search] search scoped file location: @{fileLocation}');
121
+ debug('search scoped file location: %o', fileLocation);
144
122
 
145
123
  _fs.default.readdir(fileLocation, function (err, files) {
146
124
  if (err) {
@@ -173,9 +151,7 @@ class LocalDatabase {
173
151
 
174
152
  const packagePath = _path.default.resolve(base, base2, storage, file);
175
153
 
176
- self.logger.trace({
177
- packagePath
178
- }, 'local-storage: [search] search file location: @{packagePath}');
154
+ debug('search file location: %o', packagePath);
179
155
 
180
156
  _fs.default.stat(packagePath, (err, stats) => {
181
157
  if (_lodash.default.isNil(err) === false) {
@@ -185,7 +161,7 @@ class LocalDatabase {
185
161
  onPackage({
186
162
  name: file,
187
163
  path: packagePath,
188
- time: self._getTime(stats.mtime.getTime(), stats.mtime)
164
+ time: self.getTime(stats.mtime.getTime(), stats.mtime)
189
165
  }, cb);
190
166
  });
191
167
  } else {
@@ -193,31 +169,25 @@ class LocalDatabase {
193
169
  }
194
170
  }, cb);
195
171
  });
196
- }, onEnd);
172
+ }, // @ts-ignore
173
+ onEnd);
197
174
  }
198
- /**
199
- * Remove an element from the database.
200
- * @param {*} name
201
- * @return {Error|*}
202
- */
203
-
204
175
 
205
176
  remove(name, cb) {
206
177
  this.get((err, data) => {
207
178
  if (err) {
208
- cb((0, _lib.getInternalError)('error remove private package'));
179
+ cb((0, _commonsApi.getInternalError)('error remove private package'));
209
180
  this.logger.error({
210
181
  err
211
182
  }, '[local-storage/remove]: remove the private package has failed @{err}');
183
+ debug('error on remove package %o', name);
212
184
  }
213
185
 
214
186
  const pkgName = data.indexOf(name);
215
187
 
216
188
  if (pkgName !== -1) {
217
189
  this.data.list.splice(pkgName, 1);
218
- this.logger.trace({
219
- name
220
- }, 'local-storage: [remove] package @{name} has been removed');
190
+ debug('remove package %o has been removed', name);
221
191
  }
222
192
 
223
193
  cb(this._sync());
@@ -233,9 +203,7 @@ class LocalDatabase {
233
203
  const list = this.data.list;
234
204
  const totalItems = this.data.list.length;
235
205
  cb(null, list);
236
- this.logger.trace({
237
- totalItems
238
- }, 'local-storage: [get] full list of packages (@{totalItems}) has been fetched');
206
+ debug('get full list of packages (%o) has been fetched', totalItems);
239
207
  }
240
208
 
241
209
  getPackageStorage(packageName) {
@@ -243,22 +211,16 @@ class LocalDatabase {
243
211
 
244
212
  const packagePath = this._getLocalStoragePath(packageAccess ? packageAccess.storage : undefined);
245
213
 
246
- this.logger.trace({
247
- packagePath
248
- }, '[local-storage/getPackageStorage]: storage selected: @{packagePath}');
214
+ debug('storage path selected: ', packagePath);
249
215
 
250
216
  if (_lodash.default.isString(packagePath) === false) {
251
- this.logger.debug({
252
- name: packageName
253
- }, 'this package has no storage defined: @{name}');
217
+ debug('the package %o has no storage defined ', packageName);
254
218
  return;
255
219
  }
256
220
 
257
221
  const packageStoragePath = _path.default.join(_path.default.resolve(_path.default.dirname(this.config.self_path || ''), packagePath), packageName);
258
222
 
259
- this.logger.trace({
260
- packageStoragePath
261
- }, '[local-storage/getPackageStorage]: storage path: @{packageStoragePath}');
223
+ debug('storage absolute path: ', packageStoragePath);
262
224
  return new _localFs.default(packageStoragePath, this.logger);
263
225
  }
264
226
 
@@ -266,56 +228,7 @@ class LocalDatabase {
266
228
  this._sync();
267
229
  }
268
230
 
269
- saveToken(token) {
270
- const key = this._getTokenKey(token);
271
-
272
- const db = this.getTokenDb();
273
- return new Promise((resolve, reject) => {
274
- db.put(key, token, err => {
275
- if (err) {
276
- reject(err);
277
- return;
278
- }
279
-
280
- resolve();
281
- });
282
- });
283
- }
284
-
285
- deleteToken(user, tokenKey) {
286
- const key = this._compoundTokenKey(user, tokenKey);
287
-
288
- const db = this.getTokenDb();
289
- return new Promise((resolve, reject) => {
290
- db.del(key, err => {
291
- if (err) {
292
- reject(err);
293
- return;
294
- }
295
-
296
- resolve();
297
- });
298
- });
299
- }
300
-
301
- readTokens(filter) {
302
- return new Promise((resolve, reject) => {
303
- const tokens = [];
304
- const key = filter.user + ':';
305
- const db = this.getTokenDb();
306
- const stream = db.createReadStream({
307
- gte: key,
308
- lte: String.fromCharCode(key.charCodeAt(0) + 1)
309
- });
310
- stream.on('data', data => {
311
- tokens.push(data.value);
312
- });
313
- stream.once('end', () => resolve(tokens));
314
- stream.once('error', err => reject(err));
315
- });
316
- }
317
-
318
- _getTime(time, mtime) {
231
+ getTime(time, mtime) {
319
232
  return time ? time : mtime;
320
233
  }
321
234
 
@@ -350,11 +263,11 @@ class LocalDatabase {
350
263
 
351
264
 
352
265
  _sync() {
353
- this.logger.debug('[local-storage/_sync]: init sync database');
266
+ debug('sync database started');
354
267
 
355
268
  if (this.locked) {
356
- this.logger.error('Database is locked, please check error message printed during startup to prevent data loss.');
357
- return new Error('Verdaccio database is locked, please contact your administrator to checkout logs during verdaccio startup.');
269
+ this.logger.error('Database is locked, please check error message printed during startup to ' + 'prevent data loss.');
270
+ return new Error('Verdaccio database is locked, please contact your administrator to checkout ' + 'logs during verdaccio startup.');
358
271
  } // Uses sync to prevent ugly race condition
359
272
 
360
273
 
@@ -364,26 +277,19 @@ class LocalDatabase {
364
277
 
365
278
  _mkdirp.default.sync(folderName);
366
279
 
367
- this.logger.debug({
368
- folderName
369
- }, '[local-storage/_sync]: folder @{folderName} created succeed');
280
+ debug('sync folder %o created succeed', folderName);
370
281
  } catch (err) {
371
- // perhaps a logger instance?
372
- this.logger.debug({
373
- err
374
- }, '[local-storage/_sync/mkdirp.sync]: sync failed @{err}');
282
+ debug('sync create folder has failed with error: %o', err);
375
283
  return null;
376
284
  }
377
285
 
378
286
  try {
379
287
  _fs.default.writeFileSync(this.path, JSON.stringify(this.data));
380
288
 
381
- this.logger.debug('[local-storage/_sync/writeFileSync]: sync write succeed');
289
+ debug('sync write succeed');
382
290
  return null;
383
291
  } catch (err) {
384
- this.logger.debug({
385
- err
386
- }, '[local-storage/_sync/writeFileSync]: sync failed @{err}');
292
+ debug('sync failed %o', err);
387
293
  return err;
388
294
  }
389
295
  }
@@ -420,8 +326,13 @@ class LocalDatabase {
420
326
  const sinopiadbPath = this._dbGenPath(DEPRECATED_DB_NAME, config);
421
327
 
422
328
  try {
423
- _fs.default.accessSync(sinopiadbPath, _fs.default.constants.F_OK);
329
+ _fs.default.accessSync(sinopiadbPath, _fs.default.constants.F_OK); // @ts-ignore
330
+
424
331
 
332
+ process.emitWarning('Database name deprecated!', {
333
+ code: 'VERCODE01',
334
+ detail: `Please rename database name from ${DEPRECATED_DB_NAME} to ${DB_NAME}`
335
+ });
425
336
  return sinopiadbPath;
426
337
  } catch (err) {
427
338
  if (err.code === _localFs.noSuchFile) {
@@ -431,10 +342,6 @@ class LocalDatabase {
431
342
  throw err;
432
343
  }
433
344
  }
434
-
435
- _dbGenPath(dbName, config) {
436
- return _path.default.join(_path.default.resolve(_path.default.dirname(config.self_path || ''), config.storage, dbName));
437
- }
438
345
  /**
439
346
  * Fetch local packages.
440
347
  * @private
@@ -450,8 +357,7 @@ class LocalDatabase {
450
357
  };
451
358
 
452
359
  try {
453
- const db = (0, _pkgUtils.loadPrivatePackages)(this.path, this.logger);
454
- return db;
360
+ return (0, _pkgUtils.loadPrivatePackages)(this.path, this.logger);
455
361
  } catch (err) {
456
362
  // readFileSync is platform specific, macOS, Linux and Windows thrown an error
457
363
  // Only recreate if file not found to prevent data loss
@@ -464,30 +370,8 @@ class LocalDatabase {
464
370
  }
465
371
  }
466
372
 
467
- getTokenDb() {
468
- if (!this.tokenDb) {
469
- this.tokenDb = (0, _level.default)(this._dbGenPath(TOKEN_DB_NAME, this.config), {
470
- valueEncoding: 'json'
471
- });
472
- }
473
-
474
- return this.tokenDb;
475
- }
476
-
477
- _getTokenKey(token) {
478
- const {
479
- user,
480
- key
481
- } = token;
482
- return this._compoundTokenKey(user, key);
483
- }
484
-
485
- _compoundTokenKey(user, key) {
486
- return `${user}:${key}`;
487
- }
488
-
489
373
  }
490
374
 
491
375
  var _default = LocalDatabase;
492
376
  exports.default = _default;
493
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9sb2NhbC1kYXRhYmFzZS50cyJdLCJuYW1lcyI6WyJERVBSRUNBVEVEX0RCX05BTUUiLCJEQl9OQU1FIiwiVE9LRU5fREJfTkFNRSIsIkxvY2FsRGF0YWJhc2UiLCJjb25zdHJ1Y3RvciIsImNvbmZpZyIsImxvZ2dlciIsInBhdGgiLCJfYnVpbGRTdG9yYWdlUGF0aCIsImxvY2tlZCIsImRhdGEiLCJfZmV0Y2hMb2NhbFBhY2thZ2VzIiwidHJhY2UiLCJfc3luYyIsImdldFNlY3JldCIsIlByb21pc2UiLCJyZXNvbHZlIiwic2VjcmV0Iiwic2V0U2VjcmV0IiwiYWRkIiwibmFtZSIsImNiIiwibGlzdCIsImluZGV4T2YiLCJwdXNoIiwiZGVidWciLCJzZWFyY2giLCJvblBhY2thZ2UiLCJvbkVuZCIsInZhbGlkYXRlTmFtZSIsInN0b3JhZ2VzIiwiX2dldEN1c3RvbVBhY2thZ2VMb2NhbFN0b3JhZ2VzIiwiSlNPTiIsInN0cmluZ2lmeSIsImJhc2UiLCJQYXRoIiwiZGlybmFtZSIsInNlbGZfcGF0aCIsInNlbGYiLCJzdG9yYWdlS2V5cyIsIk9iamVjdCIsImtleXMiLCJhc3luYyIsImVhY2hTZXJpZXMiLCJzdG9yYWdlIiwicG9zaXRpb24iLCJiYXNlMiIsImpvaW4iLCJzdG9yYWdlUGF0aCIsImZzIiwicmVhZGRpciIsImVyciIsImZpbGVzIiwiZmlsZSIsImluY2x1ZGVzIiwibWF0Y2giLCJmaWxlTG9jYXRpb24iLCJmaWxlMiIsInBhY2thZ2VQYXRoIiwic3RhdCIsInN0YXRzIiwiXyIsImlzTmlsIiwiaXRlbSIsInRpbWUiLCJtdGltZSIsImdldFRpbWUiLCJfZ2V0VGltZSIsInJlbW92ZSIsImdldCIsImVycm9yIiwicGtnTmFtZSIsInNwbGljZSIsInRvdGFsSXRlbXMiLCJsZW5ndGgiLCJnZXRQYWNrYWdlU3RvcmFnZSIsInBhY2thZ2VOYW1lIiwicGFja2FnZUFjY2VzcyIsImdldE1hdGNoZWRQYWNrYWdlc1NwZWMiLCJfZ2V0TG9jYWxTdG9yYWdlUGF0aCIsInVuZGVmaW5lZCIsImlzU3RyaW5nIiwicGFja2FnZVN0b3JhZ2VQYXRoIiwiTG9jYWxEcml2ZXIiLCJjbGVhbiIsInNhdmVUb2tlbiIsInRva2VuIiwia2V5IiwiX2dldFRva2VuS2V5IiwiZGIiLCJnZXRUb2tlbkRiIiwicmVqZWN0IiwicHV0IiwiZGVsZXRlVG9rZW4iLCJ1c2VyIiwidG9rZW5LZXkiLCJfY29tcG91bmRUb2tlbktleSIsImRlbCIsInJlYWRUb2tlbnMiLCJmaWx0ZXIiLCJ0b2tlbnMiLCJzdHJlYW0iLCJjcmVhdGVSZWFkU3RyZWFtIiwiZ3RlIiwibHRlIiwiU3RyaW5nIiwiZnJvbUNoYXJDb2RlIiwiY2hhckNvZGVBdCIsIm9uIiwidmFsdWUiLCJvbmNlIiwicGFja2FnZXMiLCJsaXN0UGFja2FnZXNDb25mIiwibWFwIiwicGtnIiwiRXJyb3IiLCJmb2xkZXJOYW1lIiwibWtkaXJwIiwic3luYyIsIndyaXRlRmlsZVN5bmMiLCJnbG9iYWxDb25maWdTdG9yYWdlIiwic2lub3BpYWRiUGF0aCIsIl9kYkdlblBhdGgiLCJhY2Nlc3NTeW5jIiwiY29uc3RhbnRzIiwiRl9PSyIsImNvZGUiLCJub1N1Y2hGaWxlIiwiZGJOYW1lIiwiZW1wdHlEYXRhYmFzZSIsIm1lc3NhZ2UiLCJ0b2tlbkRiIiwidmFsdWVFbmNvZGluZyJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBOztBQUNBOztBQUdBOztBQUNBOztBQUNBOztBQVlBOztBQUNBOztBQUVBOztBQUNBOzs7Ozs7Ozs7O0FBRUEsTUFBTUEsa0JBQWtCLEdBQUcsa0JBQTNCO0FBQ0EsTUFBTUMsT0FBTyxHQUFHLG9CQUFoQjtBQUNBLE1BQU1DLGFBQWEsR0FBRyxXQUF0Qjs7QUFZQTs7O0FBR0EsTUFBTUMsYUFBTixDQUFrRDtBQVFoRDs7OztBQUlPQyxFQUFBQSxXQUFQLENBQW1CQyxNQUFuQixFQUFtQ0MsTUFBbkMsRUFBbUQ7QUFBQTs7QUFBQTs7QUFBQTs7QUFBQTs7QUFBQTs7QUFBQTs7QUFDakQsU0FB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QUtULFVBQUwsQ0FBZ0J4SCxhQUFoQixFQUErQixLQUFLRyxNQUFwQyxDQUFOLEVBQW1EO0FBQ2hFK0gsUUFBQUEsYUFBYSxFQUFFO0FBRGlELE9BQW5ELENBQWY7QUFHRDs7QUFFRCxXQUFPLEtBQUtELE9BQVo7QUFDRDs7QUFFTzNDLEVBQUFBLFlBQVIsQ0FBcUJGLEtBQXJCLEVBQTJDO0FBQ3pDLFVBQU07QUFBRVEsTUFBQUEsSUFBRjtBQUFRUCxNQUFBQTtBQUFSLFFBQWdCRCxLQUF0QjtBQUNBLFdBQU8sS0FBS1UsaUJBQUwsQ0FBdUJGLElBQXZCLEVBQTZCUCxHQUE3QixDQUFQO0FBQ0Q7O0FBRU9TLEVBQUFBLGlCQUFSLENBQTBCRixJQUExQixFQUF3Q1AsR0FBeEMsRUFBNkQ7QUFDM0QsV0FBUSxHQUFFTyxJQUFLLElBQUdQLEdBQUksRUFBdEI7QUFDRDs7QUF6WitDOztlQTRabkNwRixhIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGZzIGZyb20gJ2ZzJztcbmltcG9ydCBQYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHN0cmVhbSBmcm9tICdzdHJlYW0nO1xuXG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IGFzeW5jIGZyb20gJ2FzeW5jJztcbmltcG9ydCBta2RpcnAgZnJvbSAnbWtkaXJwJztcbmltcG9ydCB7XG4gIENhbGxiYWNrLFxuICBDb25maWcsXG4gIElQYWNrYWdlU3RvcmFnZSxcbiAgSVBsdWdpblN0b3JhZ2UsXG4gIExvY2FsU3RvcmFnZSxcbiAgTG9nZ2VyLFxuICBTdG9yYWdlTGlzdCxcbiAgVG9rZW4sXG4gIFRva2VuRmlsdGVyLFxufSBmcm9tICdAdmVyZGFjY2lvL3R5cGVzJztcbmltcG9ydCBsZXZlbCBmcm9tICdsZXZlbCc7XG5pbXBvcnQgeyBnZXRJbnRlcm5hbEVycm9yIH0gZnJvbSAnQHZlcmRhY2Npby9jb21tb25zLWFwaS9saWInO1xuXG5pbXBvcnQgTG9jYWxEcml2ZXIsIHsgbm9TdWNoRmlsZSB9IGZyb20gJy4vbG9jYWwtZnMnO1xuaW1wb3J0IHsgbG9hZFByaXZhdGVQYWNrYWdlcyB9IGZyb20gJy4vcGtnLXV0aWxzJztcblxuY29uc3QgREVQUkVDQVRFRF9EQl9OQU1FID0gJy5zaW5vcGlhLWRiLmpzb24nO1xuY29uc3QgREJfTkFNRSA9ICcudmVyZGFjY2lvLWRiLmpzb24nO1xuY29uc3QgVE9LRU5fREJfTkFNRSA9ICcudG9rZW4tZGInO1xuXG5pbnRlcmZhY2UgTGV2ZWwge1xuICBwdXQoa2V5OiBzdHJpbmcsIHRva2VuLCBmbj86IEZ1bmN0aW9uKTogdm9pZDtcblxuICBnZXQoa2V5OiBzdHJpbmcsIGZuPzogRnVuY3Rpb24pOiB2b2lkO1xuXG4gIGRlbChrZXk6IHN0cmluZywgZm4/OiBGdW5jdGlvbik6IHZvaWQ7XG5cbiAgY3JlYXRlUmVhZFN0cmVhbShvcHRpb25zPzogb2JqZWN0KTogc3RyZWFtLlJlYWRhYmxlO1xufVxuXG4vKipcbiAqIEhhbmRsZSBsb2NhbCBkYXRhYmFzZS5cbiAqL1xuY2xhc3MgTG9jYWxEYXRhYmFzZSBpbXBsZW1lbnRzIElQbHVnaW5TdG9yYWdlPHt9PiB7XG4gIHB1YmxpYyBwYXRoOiBzdHJpbmc7XG4gIHB1YmxpYyBsb2dnZXI6IExvZ2dlcjtcbiAgcHVibGljIGRhdGE6IExvY2FsU3RvcmFnZTtcbiAgcHVibGljIGNvbmZpZzogQ29uZmlnO1xuICBwdWJsaWMgbG9ja2VkOiBib29sZWFuO1xuICBwdWJsaWMgdG9rZW5EYjtcblxuICAvKipcbiAgICogTG9hZCBhbiBwYXJzZSB0aGUgbG9jYWwganNvbiBkYXRhYmFzZS5cbiAgICogQHBhcmFtIHsqfSBwYXRoIHRoZSBkYXRhYmFzZSBwYXRoXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoY29uZmlnOiBDb25maWcsIGxvZ2dlcjogTG9nZ2VyKSB7XG4gICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gICAgdGhpcy5wYXRoID0gdGhpcy5fYnVpbGRTdG9yYWdlUGF0aChjb25maWcpO1xuICAgIHRoaXMubG9nZ2VyID0gbG9nZ2VyO1xuICAgIHRoaXMubG9ja2VkID0gZmFsc2U7XG4gICAgdGhpcy5kYXRhID0gdGhpcy5fZmV0Y2hMb2NhbFBhY2thZ2VzKCk7XG5cbiAgICB0aGlzLmxvZ2dlci50cmFjZSh7IGNvbmZpZzogdGhpcy5jb25maWcgfSwgJ1tsb2NhbC1zdG9yYWdlXTogY29uZmlndXJhdGlvbjogQHtjb25maWd9Jyk7XG5cbiAgICB0aGlzLl9zeW5jKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0U2VjcmV0KCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLmRhdGEuc2VjcmV0KTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRTZWNyZXQoc2VjcmV0OiBzdHJpbmcpOiBQcm9taXNlPEVycm9yIHwgbnVsbD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSk6IHZvaWQgPT4ge1xuICAgICAgdGhpcy5kYXRhLnNlY3JldCA9IHNlY3JldDtcblxuICAgICAgcmVzb2x2ZSh0aGlzLl9zeW5jKCkpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIG5ldyBlbGVtZW50LlxuICAgKiBAcGFyYW0geyp9IG5hbWVcbiAgICogQHJldHVybiB7RXJyb3J8Kn1cbiAgICovXG4gIHB1YmxpYyBhZGQobmFtZTogc3RyaW5nLCBjYjogQ2FsbGJhY2spOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kYXRhLmxpc3QuaW5kZXhPZihuYW1lKSA9PT0gLTEpIHtcbiAgICAgIHRoaXMuZGF0YS5saXN0LnB1c2gobmFtZSk7XG5cbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKHsgbmFtZSB9LCAnW2xvY2FsLXN0b3JhZ2VdOiB0aGUgcHJpdmF0ZSBwYWNrYWdlIEB7bmFtZX0gaGFzIGJlZW4gYWRkZWQnKTtcbiAgICAgIGNiKHRoaXMuX3N5bmMoKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNiKG51bGwpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzZWFyY2gob25QYWNrYWdlOiBDYWxsYmFjaywgb25FbmQ6IENhbGxiYWNrLCB2YWxpZGF0ZU5hbWU6IChuYW1lOiBzdHJpbmcpID0+IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBjb25zdCBzdG9yYWdlcyA9IHRoaXMuX2dldEN1c3RvbVBhY2thZ2VMb2NhbFN0b3JhZ2VzKCk7XG4gICAgdGhpcy5sb2dnZXIudHJhY2UoYGxvY2FsLXN0b3JhZ2U6IFtzZWFyY2hdOiAke0pTT04uc3RyaW5naWZ5KHN0b3JhZ2VzKX1gKTtcbiAgICBjb25zdCBiYXNlID0gUGF0aC5kaXJuYW1lKHRoaXMuY29uZmlnLnNlbGZfcGF0aCk7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgY29uc3Qgc3RvcmFnZUtleXMgPSBPYmplY3Qua2V5cyhzdG9yYWdlcyk7XG4gICAgdGhpcy5sb2dnZXIudHJhY2UoYGxvY2FsLXN0b3JhZ2U6IFtzZWFyY2hdIGJhc2U6ICR7YmFzZX0ga2V5cyAke3N0b3JhZ2VLZXlzfWApO1xuXG4gICAgYXN5bmMuZWFjaFNlcmllcyhcbiAgICAgIHN0b3JhZ2VLZXlzLFxuICAgICAgZnVuY3Rpb24gKHN0b3JhZ2UsIGNiKSB7XG4gICAgICAgIGNvbnN0IHBvc2l0aW9uID0gc3RvcmFnZUtleXMuaW5kZXhPZihzdG9yYWdlKTtcbiAgICAgICAgY29uc3QgYmFzZTIgPSBQYXRoLmpvaW4ocG9zaXRpb24gIT09IDAgPyBzdG9yYWdlS2V5c1swXSA6ICcnKTtcbiAgICAgICAgY29uc3Qgc3RvcmFnZVBhdGg6IHN0cmluZyA9IFBhdGgucmVzb2x2ZShiYXNlLCBiYXNlMiwgc3RvcmFnZSk7XG4gICAgICAgIHNlbGYubG9nZ2VyLnRyYWNlKHsgc3RvcmFnZVBhdGgsIHN0b3JhZ2UgfSwgJ2xvY2FsLXN0b3JhZ2U6IFtzZWFyY2hdIHNlYXJjaCBwYXRoOiBAe3N0b3JhZ2VQYXRofSA6IEB7c3RvcmFnZX0nKTtcbiAgICAgICAgZnMucmVhZGRpcihzdG9yYWdlUGF0aCwgKGVyciwgZmlsZXMpID0+IHtcbiAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICByZXR1cm4gY2IoZXJyKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBhc3luYy5lYWNoU2VyaWVzKFxuICAgICAgICAgICAgZmlsZXMsXG4gICAgICAgICAgICBmdW5jdGlvbiAoZmlsZSwgY2IpIHtcbiAgICAgICAgICAgICAgc2VsZi5sb2dnZXIudHJhY2UoeyBmaWxlIH0sICdsb2NhbC1zdG9yYWdlOiBbc2VhcmNoXSBzZWFyY2ggZmlsZSBwYXRoOiBAe2ZpbGV9Jyk7XG4gICAgICAgICAgICAgIGlmIChzdG9yYWdlS2V5cy5pbmNsdWRlcyhmaWxlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjYigpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgaWYgKGZpbGUubWF0Y2goL15ALykpIHtcbiAgICAgICAgICAgICAgICAvLyBzY29wZWRcbiAgICAgICAgICAgICAgICBjb25zdCBmaWxlTG9jYXRpb24gPSBQYXRoLnJlc29sdmUoYmFzZSwgc3RvcmFnZSwgZmlsZSk7XG4gICAgICAgICAgICAgICAgc2VsZi5sb2dnZXIudHJhY2UoXG4gICAgICAgICAgICAgICAgICB7IGZpbGVMb2NhdGlvbiB9LFxuICAgICAgICAgICAgICAgICAgJ2xvY2FsLXN0b3JhZ2U6IFtzZWFyY2hdIHNlYXJjaCBzY29wZWQgZmlsZSBsb2NhdGlvbjogQHtmaWxlTG9jYXRpb259J1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgZnMucmVhZGRpcihmaWxlTG9jYXRpb24sIGZ1bmN0aW9uIChlcnIsIGZpbGVzKSB7XG4gICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjYihlcnIpO1xuICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICBhc3luYy5lYWNoU2VyaWVzKFxuICAgICAgICAgICAgICAgICAgICBmaWxlcyxcbiAgICAgICAgICAgICAgICAgICAgKGZpbGUyLCBjYikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWxpZGF0ZU5hbWUoZmlsZTIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYWNrYWdlUGF0aCA9IFBhdGgucmVzb2x2ZShiYXNlLCBzdG9yYWdlLCBmaWxlLCBmaWxlMik7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGZzLnN0YXQocGFja2FnZVBhdGgsIChlcnIsIHN0YXRzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfLmlzTmlsKGVycikgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNiKGVycik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXRlbSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBgJHtmaWxlfS8ke2ZpbGUyfWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aDogcGFja2FnZVBhdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZTogc3RhdHMubXRpbWUuZ2V0VGltZSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICBvblBhY2thZ2UoaXRlbSwgY2IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNiKCk7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBjYlxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmICh2YWxpZGF0ZU5hbWUoZmlsZSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBiYXNlMiA9IFBhdGguam9pbihwb3NpdGlvbiAhPT0gMCA/IHN0b3JhZ2VLZXlzWzBdIDogJycpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhY2thZ2VQYXRoID0gUGF0aC5yZXNvbHZlKGJhc2UsIGJhc2UyLCBzdG9yYWdlLCBmaWxlKTtcbiAgICAgICAgICAgICAgICBzZWxmLmxvZ2dlci50cmFjZSh7IHBhY2thZ2VQYXRoIH0sICdsb2NhbC1zdG9yYWdlOiBbc2VhcmNoXSBzZWFyY2ggZmlsZSBsb2NhdGlvbjogQHtwYWNrYWdlUGF0aH0nKTtcbiAgICAgICAgICAgICAgICBmcy5zdGF0KHBhY2thZ2VQYXRoLCAoZXJyLCBzdGF0cykgPT4ge1xuICAgICAgICAgICAgICAgICAgaWYgKF8uaXNOaWwoZXJyKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNiKGVycik7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBvblBhY2thZ2UoXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBmaWxlLFxuICAgICAgICAgICAgICAgICAgICAgIHBhdGg6IHBhY2thZ2VQYXRoLFxuICAgICAgICAgICAgICAgICAgICAgIHRpbWU6IHNlbGYuX2dldFRpbWUoc3RhdHMubXRpbWUuZ2V0VGltZSgpLCBzdGF0cy5tdGltZSksXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGNiXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNiKCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjYlxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIG9uRW5kXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgYW4gZWxlbWVudCBmcm9tIHRoZSBkYXRhYmFzZS5cbiAgICogQHBhcmFtIHsqfSBuYW1lXG4gICAqIEByZXR1cm4ge0Vycm9yfCp9XG4gICAqL1xuICBwdWJsaWMgcmVtb3ZlKG5hbWU6IHN0cmluZywgY2I6IENhbGxiYWNrKTogdm9pZCB7XG4gICAgdGhpcy5nZXQoKGVyciwgZGF0YSkgPT4ge1xuICAgICAgaWYgKGVycikge1xuICAgICAgICBjYihnZXRJbnRlcm5hbEVycm9yKCdlcnJvciByZW1vdmUgcHJpdmF0ZSBwYWNrYWdlJykpO1xuICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcih7IGVyciB9LCAnW2xvY2FsLXN0b3JhZ2UvcmVtb3ZlXTogcmVtb3ZlIHRoZSBwcml2YXRlIHBhY2thZ2UgaGFzIGZhaWxlZCBAe2Vycn0nKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcGtnTmFtZSA9IGRhdGEuaW5kZXhPZihuYW1lKTtcbiAgICAgIGlmIChwa2dOYW1lICE9PSAtMSkge1xuICAgICAgICB0aGlzLmRhdGEubGlzdC5zcGxpY2UocGtnTmFtZSwgMSk7XG5cbiAgICAgICAgdGhpcy5sb2dnZXIudHJhY2UoeyBuYW1lIH0sICdsb2NhbC1zdG9yYWdlOiBbcmVtb3ZlXSBwYWNrYWdlIEB7bmFtZX0gaGFzIGJlZW4gcmVtb3ZlZCcpO1xuICAgICAgfVxuXG4gICAgICBjYih0aGlzLl9zeW5jKCkpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhbGwgZGF0YWJhc2UgZWxlbWVudHMuXG4gICAqIEByZXR1cm4ge0FycmF5fVxuICAgKi9cbiAgcHVibGljIGdldChjYjogQ2FsbGJhY2spOiB2b2lkIHtcbiAgICBjb25zdCBsaXN0ID0gdGhpcy5kYXRhLmxpc3Q7XG4gICAgY29uc3QgdG90YWxJdGVtcyA9IHRoaXMuZGF0YS5saXN0Lmxlbmd0aDtcblxuICAgIGNiKG51bGwsIGxpc3QpO1xuXG4gICAgdGhpcy5sb2dnZXIudHJhY2UoeyB0b3RhbEl0ZW1zIH0sICdsb2NhbC1zdG9yYWdlOiBbZ2V0XSBmdWxsIGxpc3Qgb2YgcGFja2FnZXMgKEB7dG90YWxJdGVtc30pIGhhcyBiZWVuIGZldGNoZWQnKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRQYWNrYWdlU3RvcmFnZShwYWNrYWdlTmFtZTogc3RyaW5nKTogSVBhY2thZ2VTdG9yYWdlIHtcbiAgICBjb25zdCBwYWNrYWdlQWNjZXNzID0gdGhpcy5jb25maWcuZ2V0TWF0Y2hlZFBhY2thZ2VzU3BlYyhwYWNrYWdlTmFtZSk7XG5cbiAgICBjb25zdCBwYWNrYWdlUGF0aDogc3RyaW5nID0gdGhpcy5fZ2V0TG9jYWxTdG9yYWdlUGF0aChwYWNrYWdlQWNjZXNzID8gcGFja2FnZUFjY2Vzcy5zdG9yYWdlIDogdW5kZWZpbmVkKTtcbiAgICB0aGlzLmxvZ2dlci50cmFjZSh7IHBhY2thZ2VQYXRoIH0sICdbbG9jYWwtc3RvcmFnZS9nZXRQYWNrYWdlU3RvcmFnZV06IHN0b3JhZ2Ugc2VsZWN0ZWQ6IEB7cGFja2FnZVBhdGh9Jyk7XG5cbiAgICBpZiAoXy5pc1N0cmluZyhwYWNrYWdlUGF0aCkgPT09IGZhbHNlKSB7XG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1Zyh7IG5hbWU6IHBhY2thZ2VOYW1lIH0sICd0aGlzIHBhY2thZ2UgaGFzIG5vIHN0b3JhZ2UgZGVmaW5lZDogQHtuYW1lfScpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBhY2thZ2VTdG9yYWdlUGF0aDogc3RyaW5nID0gUGF0aC5qb2luKFxuICAgICAgUGF0aC5yZXNvbHZlKFBhdGguZGlybmFtZSh0aGlzLmNvbmZpZy5zZWxmX3BhdGggfHwgJycpLCBwYWNrYWdlUGF0aCksXG4gICAgICBwYWNrYWdlTmFtZVxuICAgICk7XG5cbiAgICB0aGlzLmxvZ2dlci50cmFjZSh7IHBhY2thZ2VTdG9yYWdlUGF0aCB9LCAnW2xvY2FsLXN0b3JhZ2UvZ2V0UGFja2FnZVN0b3JhZ2VdOiBzdG9yYWdlIHBhdGg6IEB7cGFja2FnZVN0b3JhZ2VQYXRofScpO1xuXG4gICAgcmV0dXJuIG5ldyBMb2NhbERyaXZlcihwYWNrYWdlU3RvcmFnZVBhdGgsIHRoaXMubG9nZ2VyKTtcbiAgfVxuXG4gIHB1YmxpYyBjbGVhbigpOiB2b2lkIHtcbiAgICB0aGlzLl9zeW5jKCk7XG4gIH1cblxuICBwdWJsaWMgc2F2ZVRva2VuKHRva2VuOiBUb2tlbik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGtleSA9IHRoaXMuX2dldFRva2VuS2V5KHRva2VuKTtcbiAgICBjb25zdCBkYiA9IHRoaXMuZ2V0VG9rZW5EYigpO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpOiB2b2lkID0+IHtcbiAgICAgIGRiLnB1dChrZXksIHRva2VuLCBlcnIgPT4ge1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGRlbGV0ZVRva2VuKHVzZXI6IHN0cmluZywgdG9rZW5LZXk6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGtleSA9IHRoaXMuX2NvbXBvdW5kVG9rZW5LZXkodXNlciwgdG9rZW5LZXkpO1xuICAgIGNvbnN0IGRiID0gdGhpcy5nZXRUb2tlbkRiKCk7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpOiB2b2lkID0+IHtcbiAgICAgIGRiLmRlbChrZXksIGVyciA9PiB7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgcmVhZFRva2VucyhmaWx0ZXI6IFRva2VuRmlsdGVyKTogUHJvbWlzZTxUb2tlbltdPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpOiB2b2lkID0+IHtcbiAgICAgIGNvbnN0IHRva2VuczogVG9rZW5bXSA9IFtdO1xuICAgICAgY29uc3Qga2V5ID0gZmlsdGVyLnVzZXIgKyAnOic7XG4gICAgICBjb25zdCBkYiA9IHRoaXMuZ2V0VG9rZW5EYigpO1xuICAgICAgY29uc3Qgc3RyZWFtID0gZGIuY3JlYXRlUmVhZFN0cmVhbSh7XG4gICAgICAgIGd0ZToga2V5LFxuICAgICAgICBsdGU6IFN0cmluZy5mcm9tQ2hhckNvZGUoa2V5LmNoYXJDb2RlQXQoMCkgKyAxKSxcbiAgICAgIH0pO1xuXG4gICAgICBzdHJlYW0ub24oJ2RhdGEnLCBkYXRhID0+IHtcbiAgICAgICAgdG9rZW5zLnB1c2goZGF0YS52YWx1ZSk7XG4gICAgICB9KTtcblxuICAgICAgc3RyZWFtLm9uY2UoJ2VuZCcsICgpID0+IHJlc29sdmUodG9rZW5zKSk7XG5cbiAgICAgIHN0cmVhbS5vbmNlKCdlcnJvcicsIGVyciA9PiByZWplY3QoZXJyKSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9nZXRUaW1lKHRpbWU6IG51bWJlciwgbXRpbWU6IERhdGUpOiBudW1iZXIgfCBEYXRlIHtcbiAgICByZXR1cm4gdGltZSA/IHRpbWUgOiBtdGltZTtcbiAgfVxuXG4gIHByaXZhdGUgX2dldEN1c3RvbVBhY2thZ2VMb2NhbFN0b3JhZ2VzKCk6IG9iamVjdCB7XG4gICAgY29uc3Qgc3RvcmFnZXMgPSB7fTtcblxuICAgIC8vIGFkZCBjdXN0b20gc3RvcmFnZSBpZiBleGlzdFxuICAgIGlmICh0aGlzLmNvbmZpZy5zdG9yYWdlKSB7XG4gICAgICBzdG9yYWdlc1t0aGlzLmNvbmZpZy5zdG9yYWdlXSA9IHRydWU7XG4gICAgfVxuXG4gICAgY29uc3QgeyBwYWNrYWdlcyB9ID0gdGhpcy5jb25maWc7XG5cbiAgICBpZiAocGFja2FnZXMpIHtcbiAgICAgIGNvbnN0IGxpc3RQYWNrYWdlc0NvbmYgPSBPYmplY3Qua2V5cyhwYWNrYWdlcyB8fCB7fSk7XG5cbiAgICAgIGxpc3RQYWNrYWdlc0NvbmYubWFwKHBrZyA9PiB7XG4gICAgICAgIGNvbnN0IHN0b3JhZ2UgPSBwYWNrYWdlc1twa2ddLnN0b3JhZ2U7XG4gICAgICAgIGlmIChzdG9yYWdlKSB7XG4gICAgICAgICAgc3RvcmFnZXNbc3RvcmFnZV0gPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0b3JhZ2VzO1xuICB9XG5cbiAgLyoqXG4gICAqIFN5bmNyb25pemUge2NyZWF0ZX0gZGF0YWJhc2Ugd2hldGhlciBkb2VzIG5vdCBleGlzdC5cbiAgICogQHJldHVybiB7RXJyb3J8Kn1cbiAgICovXG4gIHByaXZhdGUgX3N5bmMoKTogRXJyb3IgfCBudWxsIHtcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnW2xvY2FsLXN0b3JhZ2UvX3N5bmNdOiBpbml0IHN5bmMgZGF0YWJhc2UnKTtcblxuICAgIGlmICh0aGlzLmxvY2tlZCkge1xuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ0RhdGFiYXNlIGlzIGxvY2tlZCwgcGxlYXNlIGNoZWNrIGVycm9yIG1lc3NhZ2UgcHJpbnRlZCBkdXJpbmcgc3RhcnR1cCB0byBwcmV2ZW50IGRhdGEgbG9zcy4nKTtcbiAgICAgIHJldHVybiBuZXcgRXJyb3IoXG4gICAgICAgICdWZXJkYWNjaW8gZGF0YWJhc2UgaXMgbG9ja2VkLCBwbGVhc2UgY29udGFjdCB5b3VyIGFkbWluaXN0cmF0b3IgdG8gY2hlY2tvdXQgbG9ncyBkdXJpbmcgdmVyZGFjY2lvIHN0YXJ0dXAuJ1xuICAgICAgKTtcbiAgICB9XG4gICAgLy8gVXNlcyBzeW5jIHRvIHByZXZlbnQgdWdseSByYWNlIGNvbmRpdGlvblxuICAgIHRyeSB7XG4gICAgICAvLyBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9ta2RpcnAjbWtkaXJwc3luY2Rpci1vcHRzXG4gICAgICBjb25zdCBmb2xkZXJOYW1lID0gUGF0aC5kaXJuYW1lKHRoaXMucGF0aCk7XG4gICAgICBta2RpcnAuc3luYyhmb2xkZXJOYW1lKTtcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKHsgZm9sZGVyTmFtZSB9LCAnW2xvY2FsLXN0b3JhZ2UvX3N5bmNdOiBmb2xkZXIgQHtmb2xkZXJOYW1lfSBjcmVhdGVkIHN1Y2NlZWQnKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIC8vIHBlcmhhcHMgYSBsb2dnZXIgaW5zdGFuY2U/XG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1Zyh7IGVyciB9LCAnW2xvY2FsLXN0b3JhZ2UvX3N5bmMvbWtkaXJwLnN5bmNdOiBzeW5jIGZhaWxlZCBAe2Vycn0nKTtcblxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGZzLndyaXRlRmlsZVN5bmModGhpcy5wYXRoLCBKU09OLnN0cmluZ2lmeSh0aGlzLmRhdGEpKTtcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdbbG9jYWwtc3RvcmFnZS9fc3luYy93cml0ZUZpbGVTeW5jXTogc3luYyB3cml0ZSBzdWNjZWVkJyk7XG5cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5sb2dnZXIuZGVidWcoeyBlcnIgfSwgJ1tsb2NhbC1zdG9yYWdlL19zeW5jL3dyaXRlRmlsZVN5bmNdOiBzeW5jIGZhaWxlZCBAe2Vycn0nKTtcblxuICAgICAgcmV0dXJuIGVycjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZ5IHRoZSByaWdodCBsb2NhbCBzdG9yYWdlIGxvY2F0aW9uLlxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGF0aFxuICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIF9nZXRMb2NhbFN0b3JhZ2VQYXRoKHN0b3JhZ2U6IHN0cmluZyB8IHZvaWQpOiBzdHJpbmcge1xuICAgIGNvbnN0IGdsb2JhbENvbmZpZ1N0b3JhZ2UgPSB0aGlzLmNvbmZpZyA/IHRoaXMuY29uZmlnLnN0b3JhZ2UgOiB1bmRlZmluZWQ7XG4gICAgaWYgKF8uaXNOaWwoZ2xvYmFsQ29uZmlnU3RvcmFnZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZ2xvYmFsIHN0b3JhZ2UgaXMgcmVxdWlyZWQgZm9yIHRoaXMgcGx1Z2luJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChfLmlzTmlsKHN0b3JhZ2UpID09PSBmYWxzZSAmJiBfLmlzU3RyaW5nKHN0b3JhZ2UpKSB7XG4gICAgICAgIHJldHVybiBQYXRoLmpvaW4oZ2xvYmFsQ29uZmlnU3RvcmFnZSBhcyBzdHJpbmcsIHN0b3JhZ2UgYXMgc3RyaW5nKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGdsb2JhbENvbmZpZ1N0b3JhZ2UgYXMgc3RyaW5nO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCB0aGUgbG9jYWwgZGF0YWJhc2UgcGF0aC5cbiAgICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZ1xuICAgKiBAcmV0dXJuIHtzdHJpbmd8U3RyaW5nfCp9XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIF9idWlsZFN0b3JhZ2VQYXRoKGNvbmZpZzogQ29uZmlnKTogc3RyaW5nIHtcbiAgICBjb25zdCBzaW5vcGlhZGJQYXRoOiBzdHJpbmcgPSB0aGlzLl9kYkdlblBhdGgoREVQUkVDQVRFRF9EQl9OQU1FLCBjb25maWcpO1xuICAgIHRyeSB7XG4gICAgICBmcy5hY2Nlc3NTeW5jKHNpbm9waWFkYlBhdGgsIGZzLmNvbnN0YW50cy5GX09LKTtcbiAgICAgIHJldHVybiBzaW5vcGlhZGJQYXRoO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaWYgKGVyci5jb2RlID09PSBub1N1Y2hGaWxlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYkdlblBhdGgoREJfTkFNRSwgY29uZmlnKTtcbiAgICAgIH1cblxuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2RiR2VuUGF0aChkYk5hbWU6IHN0cmluZywgY29uZmlnOiBDb25maWcpOiBzdHJpbmcge1xuICAgIHJldHVybiBQYXRoLmpvaW4oUGF0aC5yZXNvbHZlKFBhdGguZGlybmFtZShjb25maWcuc2VsZl9wYXRoIHx8ICcnKSwgY29uZmlnLnN0b3JhZ2UgYXMgc3RyaW5nLCBkYk5hbWUpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCBsb2NhbCBwYWNrYWdlcy5cbiAgICogQHByaXZhdGVcbiAgICogQHJldHVybiB7T2JqZWN0fVxuICAgKi9cbiAgcHJpdmF0ZSBfZmV0Y2hMb2NhbFBhY2thZ2VzKCk6IExvY2FsU3RvcmFnZSB7XG4gICAgY29uc3QgbGlzdDogU3RvcmFnZUxpc3QgPSBbXTtcbiAgICBjb25zdCBlbXB0eURhdGFiYXNlID0geyBsaXN0LCBzZWNyZXQ6ICcnIH07XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgZGIgPSBsb2FkUHJpdmF0ZVBhY2thZ2VzKHRoaXMucGF0aCwgdGhpcy5sb2dnZXIpO1xuXG4gICAgICByZXR1cm4gZGI7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAvLyByZWFkRmlsZVN5bmMgaXMgcGxhdGZvcm0gc3BlY2lmaWMsIG1hY09TLCBMaW51eCBhbmQgV2luZG93cyB0aHJvd24gYW4gZXJyb3JcbiAgICAgIC8vIE9ubHkgcmVjcmVhdGUgaWYgZmlsZSBub3QgZm91bmQgdG8gcHJldmVudCBkYXRhIGxvc3NcbiAgICAgIGlmIChlcnIuY29kZSAhPT0gbm9TdWNoRmlsZSkge1xuICAgICAgICB0aGlzLmxvY2tlZCA9IHRydWU7XG4gICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKFxuICAgICAgICAgICdGYWlsZWQgdG8gcmVhZCBwYWNrYWdlIGRhdGFiYXNlIGZpbGUsIHBsZWFzZSBjaGVjayB0aGUgZXJyb3IgcHJpbnRlZCBiZWxvdzpcXG4nLFxuICAgICAgICAgIGBGaWxlIFBhdGg6ICR7dGhpcy5wYXRofVxcblxcbiAke2Vyci5tZXNzYWdlfWBcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGVtcHR5RGF0YWJhc2U7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRUb2tlbkRiKCk6IExldmVsIHtcbiAgICBpZiAoIXRoaXMudG9rZW5EYikge1xuICAgICAgdGhpcy50b2tlbkRiID0gbGV2ZWwodGhpcy5fZGJHZW5QYXRoKFRPS0VOX0RCX05BTUUsIHRoaXMuY29uZmlnKSwge1xuICAgICAgICB2YWx1ZUVuY29kaW5nOiAnanNvbicsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy50b2tlbkRiO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0VG9rZW5LZXkodG9rZW46IFRva2VuKTogc3RyaW5nIHtcbiAgICBjb25zdCB7IHVzZXIsIGtleSB9ID0gdG9rZW47XG4gICAgcmV0dXJuIHRoaXMuX2NvbXBvdW5kVG9rZW5LZXkodXNlciwga2V5KTtcbiAgfVxuXG4gIHByaXZhdGUgX2NvbXBvdW5kVG9rZW5LZXkodXNlcjogc3RyaW5nLCBrZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3VzZXJ9OiR7a2V5fWA7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgTG9jYWxEYXRhYmFzZTtcbiJdfQ==
377
+ //# sourceMappingURL=local-database.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/local-database.ts"],"names":["DEPRECATED_DB_NAME","DB_NAME","debug","LocalDatabase","TokenActions","constructor","config","logger","path","_buildStoragePath","locked","data","_fetchLocalPackages","_sync","getSecret","Promise","resolve","secret","setSecret","add","name","cb","list","indexOf","push","search","onPackage","onEnd","validateName","storages","_getCustomPackageLocalStorages","JSON","stringify","base","Path","dirname","self_path","self","storageKeys","Object","keys","async","eachSeries","storage","position","base2","join","storagePath","fs","readdir","err","files","file","includes","match","fileLocation","file2","packagePath","stat","stats","_","isNil","item","time","mtime","getTime","remove","get","error","pkgName","splice","totalItems","length","getPackageStorage","packageName","packageAccess","getMatchedPackagesSpec","_getLocalStoragePath","undefined","isString","packageStoragePath","LocalDriver","clean","packages","listPackagesConf","map","pkg","Error","folderName","mkdirp","sync","writeFileSync","globalConfigStorage","sinopiadbPath","_dbGenPath","accessSync","constants","F_OK","process","emitWarning","code","detail","noSuchFile","emptyDatabase","message"],"mappings":"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","sourcesContent":["import fs from 'fs';\nimport Path from 'path';\n\nimport buildDebug from 'debug';\nimport _ from 'lodash';\nimport async from 'async';\nimport mkdirp from 'mkdirp';\nimport { Callback, Config, IPackageStorage, IPluginStorage, LocalStorage, Logger, StorageList } from '@verdaccio/types';\nimport { getInternalError } from '@verdaccio/commons-api';\n\nimport LocalDriver, { noSuchFile } from './local-fs';\nimport { loadPrivatePackages } from './pkg-utils';\nimport TokenActions from './token';\n\nconst DEPRECATED_DB_NAME = '.sinopia-db.json';\nconst DB_NAME = '.verdaccio-db.json';\n\nconst debug = buildDebug('verdaccio:plugin:local-storage');\n\nclass LocalDatabase extends TokenActions implements IPluginStorage<{}> {\n public path: string;\n public logger: Logger;\n public data: LocalStorage;\n public config: Config;\n public locked: boolean;\n\n public constructor(config: Config, logger: Logger) {\n super(config);\n this.config = config;\n this.path = this._buildStoragePath(config);\n this.logger = logger;\n this.locked = false;\n this.data = this._fetchLocalPackages();\n this._sync();\n }\n\n public getSecret(): Promise<string> {\n return Promise.resolve(this.data.secret);\n }\n\n public setSecret(secret: string): Promise<Error | null> {\n return new Promise((resolve): void => {\n this.data.secret = secret;\n\n resolve(this._sync());\n });\n }\n\n public add(name: string, cb: Callback): void {\n if (this.data.list.indexOf(name) === -1) {\n this.data.list.push(name);\n\n debug('the private package %o has been added', name);\n cb(this._sync());\n } else {\n debug('the private package %o was not added', name);\n cb(null);\n }\n }\n\n public search(onPackage: Callback, onEnd: Callback, validateName: (name: string) => boolean): void {\n const storages = this._getCustomPackageLocalStorages();\n debug(`search custom local packages: %o`, JSON.stringify(storages));\n const base = Path.dirname(this.config.self_path);\n const self = this;\n const storageKeys = Object.keys(storages);\n debug(`search base: %o keys: %o`, base, storageKeys);\n\n async.eachSeries(\n storageKeys,\n function(storage, cb) {\n const position = storageKeys.indexOf(storage);\n const base2 = Path.join(position !== 0 ? storageKeys[0] : '');\n const storagePath: string = Path.resolve(base, base2, storage);\n debug('search path: %o : %o', storagePath, storage);\n fs.readdir(storagePath, (err, files) => {\n if (err) {\n return cb(err);\n }\n\n async.eachSeries(\n files,\n function(file, cb) {\n debug('local-storage: [search] search file path: %o', file);\n if (storageKeys.includes(file)) {\n return cb();\n }\n\n if (file.match(/^@/)) {\n // scoped\n const fileLocation = Path.resolve(base, storage, file);\n debug('search scoped file location: %o', fileLocation);\n fs.readdir(fileLocation, function(err, files) {\n if (err) {\n return cb(err);\n }\n\n async.eachSeries(\n files,\n (file2, cb) => {\n if (validateName(file2)) {\n const packagePath = Path.resolve(base, storage, file, file2);\n\n fs.stat(packagePath, (err, stats) => {\n if (_.isNil(err) === false) {\n return cb(err);\n }\n const item = {\n name: `${file}/${file2}`,\n path: packagePath,\n time: stats.mtime.getTime(),\n };\n onPackage(item, cb);\n });\n } else {\n cb();\n }\n },\n cb\n );\n });\n } else if (validateName(file)) {\n const base2 = Path.join(position !== 0 ? storageKeys[0] : '');\n const packagePath = Path.resolve(base, base2, storage, file);\n debug('search file location: %o', packagePath);\n fs.stat(packagePath, (err, stats) => {\n if (_.isNil(err) === false) {\n return cb(err);\n }\n onPackage(\n {\n name: file,\n path: packagePath,\n time: self.getTime(stats.mtime.getTime(), stats.mtime),\n },\n cb\n );\n });\n } else {\n cb();\n }\n },\n cb\n );\n });\n },\n // @ts-ignore\n onEnd\n );\n }\n\n public remove(name: string, cb: Callback): void {\n this.get((err, data) => {\n if (err) {\n cb(getInternalError('error remove private package'));\n this.logger.error({ err }, '[local-storage/remove]: remove the private package has failed @{err}');\n debug('error on remove package %o', name);\n }\n\n const pkgName = data.indexOf(name);\n if (pkgName !== -1) {\n this.data.list.splice(pkgName, 1);\n\n debug('remove package %o has been removed', name);\n }\n\n cb(this._sync());\n });\n }\n\n /**\n * Return all database elements.\n * @return {Array}\n */\n public get(cb: Callback): void {\n const list = this.data.list;\n const totalItems = this.data.list.length;\n\n cb(null, list);\n\n debug('get full list of packages (%o) has been fetched', totalItems);\n }\n\n public getPackageStorage(packageName: string): IPackageStorage {\n const packageAccess = this.config.getMatchedPackagesSpec(packageName);\n\n const packagePath: string = this._getLocalStoragePath(packageAccess ? packageAccess.storage : undefined);\n debug('storage path selected: ', packagePath);\n\n if (_.isString(packagePath) === false) {\n debug('the package %o has no storage defined ', packageName);\n return;\n }\n\n const packageStoragePath: string = Path.join(\n Path.resolve(Path.dirname(this.config.self_path || ''), packagePath),\n packageName\n );\n\n debug('storage absolute path: ', packageStoragePath);\n\n return new LocalDriver(packageStoragePath, this.logger);\n }\n\n public clean(): void {\n this._sync();\n }\n\n private getTime(time: number, mtime: Date): number | Date {\n return time ? time : mtime;\n }\n\n private _getCustomPackageLocalStorages(): object {\n const storages = {};\n\n // add custom storage if exist\n if (this.config.storage) {\n storages[this.config.storage] = true;\n }\n\n const { packages } = this.config;\n\n if (packages) {\n const listPackagesConf = Object.keys(packages || {});\n\n listPackagesConf.map(pkg => {\n const storage = packages[pkg].storage;\n if (storage) {\n storages[storage] = false;\n }\n });\n }\n\n return storages;\n }\n\n /**\n * Syncronize {create} database whether does not exist.\n * @return {Error|*}\n */\n private _sync(): Error | null {\n debug('sync database started');\n\n if (this.locked) {\n this.logger.error(\n 'Database is locked, please check error message printed during startup to ' + 'prevent data loss.'\n );\n return new Error(\n 'Verdaccio database is locked, please contact your administrator to checkout ' +\n 'logs during verdaccio startup.'\n );\n }\n // Uses sync to prevent ugly race condition\n try {\n // https://www.npmjs.com/package/mkdirp#mkdirpsyncdir-opts\n const folderName = Path.dirname(this.path);\n mkdirp.sync(folderName);\n debug('sync folder %o created succeed', folderName);\n } catch (err) {\n debug('sync create folder has failed with error: %o', err);\n return null;\n }\n\n try {\n fs.writeFileSync(this.path, JSON.stringify(this.data));\n debug('sync write succeed');\n\n return null;\n } catch (err) {\n debug('sync failed %o', err);\n\n return err;\n }\n }\n\n /**\n * Verify the right local storage location.\n * @param {String} path\n * @return {String}\n * @private\n */\n private _getLocalStoragePath(storage: string | void): string {\n const globalConfigStorage = this.config ? this.config.storage : undefined;\n if (_.isNil(globalConfigStorage)) {\n throw new Error('global storage is required for this plugin');\n } else {\n if (_.isNil(storage) === false && _.isString(storage)) {\n return Path.join(globalConfigStorage as string, storage as string);\n }\n\n return globalConfigStorage as string;\n }\n }\n\n /**\n * Build the local database path.\n * @param {Object} config\n * @return {string|String|*}\n * @private\n */\n private _buildStoragePath(config: Config): string {\n const sinopiadbPath: string = this._dbGenPath(DEPRECATED_DB_NAME, config);\n try {\n fs.accessSync(sinopiadbPath, fs.constants.F_OK);\n // @ts-ignore\n process.emitWarning('Database name deprecated!', {\n code: 'VERCODE01',\n detail: `Please rename database name from ${DEPRECATED_DB_NAME} to ${DB_NAME}`,\n });\n return sinopiadbPath;\n } catch (err) {\n if (err.code === noSuchFile) {\n return this._dbGenPath(DB_NAME, config);\n }\n\n throw err;\n }\n }\n\n /**\n * Fetch local packages.\n * @private\n * @return {Object}\n */\n private _fetchLocalPackages(): LocalStorage {\n const list: StorageList = [];\n const emptyDatabase = { list, secret: '' };\n\n try {\n return loadPrivatePackages(this.path, this.logger);\n } catch (err) {\n // readFileSync is platform specific, macOS, Linux and Windows thrown an error\n // Only recreate if file not found to prevent data loss\n if (err.code !== noSuchFile) {\n this.locked = true;\n this.logger.error(\n 'Failed to read package database file, please check the error printed below:\\n',\n `File Path: ${this.path}\\n\\n ${err.message}`\n );\n }\n\n return emptyDatabase;\n }\n }\n}\n\nexport default LocalDatabase;\n"],"file":"local-database.js"}
package/lib/local-fs.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  /// <reference types="node" />
2
2
  import { ReadTarball } from '@verdaccio/streams';
3
3
  import { Callback, Logger, Package, ILocalPackageManager, IUploadTarball } from '@verdaccio/types';
4
- import { VerdaccioError } from '@verdaccio/commons-api/lib';
4
+ import { VerdaccioError } from '@verdaccio/commons-api';
5
5
  export declare const fileExist = "EEXISTS";
6
6
  export declare const noSuchFile = "ENOENT";
7
7
  export declare const resourceNotAvailable = "EAGAIN";