@verdaccio/store 6.0.0-6-next.18 → 6.0.0-6-next.21

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/build/storage.js CHANGED
@@ -13,8 +13,6 @@ var _debug = _interopRequireDefault(require("debug"));
13
13
 
14
14
  var _lodash = _interopRequireDefault(require("lodash"));
15
15
 
16
- var _semver = _interopRequireDefault(require("semver"));
17
-
18
16
  var _config = require("@verdaccio/config");
19
17
 
20
18
  var _core = require("@verdaccio/core");
@@ -39,10 +37,8 @@ var _uplinkUtil = require("./uplink-util");
39
37
 
40
38
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
41
39
 
42
- if (_semver.default.lte(process.version, 'v15.0.0')) {
43
- global.AbortController = require('abortcontroller-polyfill/dist/cjs-ponyfill').AbortController;
44
- }
45
-
40
+ // import { isPublishablePackage, validateInputs } from './star-utils';
41
+ // import { StarBody, Users } from './type';
46
42
  const debug = (0, _debug.default)('verdaccio:storage');
47
43
 
48
44
  class Storage {
@@ -98,6 +94,30 @@ class Storage {
98
94
  callback(err);
99
95
  }
100
96
  }
97
+ /**
98
+ * Add a {name} package to a system
99
+ Function checks if package with the same name is available from uplinks.
100
+ If it isn't, we create package locally
101
+ Used storages: local (write) && uplinks
102
+ */
103
+
104
+
105
+ async addPackageNext(name, metadata) {
106
+ try {
107
+ debug('add package for %o', name);
108
+ await (0, _storageUtils.checkPackageLocal)(name, this.localStorage);
109
+ debug('look up remote for %o', name);
110
+ await (0, _storageUtils.checkPackageRemote)(name, this._isAllowPublishOffline(), this._syncUplinksMetadata.bind(this));
111
+ debug('publishing a package for %o', name); // FIXME: publishPackage should return fresh metadata from backend
112
+ // instead return metadata
113
+
114
+ await (0, _storageUtils.publishPackage)(name, metadata, this.localStorage);
115
+ return metadata;
116
+ } catch (err) {
117
+ debug('error on add a package for %o with error %o', name, err);
118
+ throw err;
119
+ }
120
+ }
101
121
 
102
122
  _isAllowPublishOffline() {
103
123
  return typeof this.config.publish !== 'undefined' && _lodash.default.isBoolean(this.config.publish.allow_offline) && this.config.publish.allow_offline;
@@ -124,6 +144,11 @@ class Storage {
124
144
  debug('add the version %o for package %o', version, name);
125
145
  this.localStorage.addVersion(name, version, metadata, tag, callback);
126
146
  }
147
+
148
+ async addVersionNext(name, version, metadata, tag) {
149
+ debug('add the version %o for package %o', version, name);
150
+ return this.localStorage.addVersionNext(name, version, metadata, tag);
151
+ }
127
152
  /**
128
153
  * Tags a package version with a provided tag
129
154
  Used storages: local (write)
@@ -145,6 +170,17 @@ class Storage {
145
170
  debug('change existing package for package %o revision %o', name, revision);
146
171
  this.localStorage.changePackage(name, metadata, revision, callback);
147
172
  }
173
+ /**
174
+ * Change an existing package (i.e. unpublish one version)
175
+ Function changes a package info from local storage and all uplinks with write access./
176
+ Used storages: local (write)
177
+ */
178
+
179
+
180
+ async changePackageNext(name, metadata, revision) {
181
+ debug('change existing package for package %o revision %o', name, revision);
182
+ this.localStorage.changePackageNext(name, metadata, revision);
183
+ }
148
184
  /**
149
185
  * Remove a package from a system
150
186
  Function removes a package from local storage
@@ -154,9 +190,7 @@ class Storage {
154
190
 
155
191
  async removePackage(name) {
156
192
  debug('remove packagefor package %o', name);
157
- await this.localStorage.removePackage(name); // update the indexer
158
-
159
- _search.SearchInstance.remove(name);
193
+ await this.localStorage.removePackage(name);
160
194
  }
161
195
  /**
162
196
  Remove a tarball from a system
@@ -323,6 +357,110 @@ class Storage {
323
357
  on_open();
324
358
  }
325
359
  }
360
+ } // public async starPackage(body: StarBody, options: IGetPackageOptionsNext): Promise<void> {
361
+ // debug('star package');
362
+ // const manifest = await this.getPackageNext(options);
363
+ // const newStarUser = body[constants.USERS];
364
+ // const remoteUsername: string = options.remoteUser.name as string;
365
+ // const localStarUsers = manifest[constants.USERS];
366
+ // // Check is star or unstar
367
+ // const isStar = Object.keys(newStarUser).includes(remoteUsername);
368
+ // debug('is start? %o', isStar);
369
+ // if (
370
+ // _.isNil(localStarUsers) === false &&
371
+ // validateInputs(localStarUsers, remoteUsername, isStar)
372
+ // ) {
373
+ // // return afterChangePackage();
374
+ // }
375
+ // const users: Users = isStar
376
+ // ? {
377
+ // ...localStarUsers,
378
+ // [remoteUsername]: true,
379
+ // }
380
+ // : _.reduce(
381
+ // localStarUsers,
382
+ // (users, value, key) => {
383
+ // if (key !== remoteUsername) {
384
+ // users[key] = value;
385
+ // }
386
+ // return users;
387
+ // },
388
+ // {}
389
+ // );
390
+ // debug('update package for %o', name);
391
+ // }
392
+ // public async publish(body: any, options: IGetPackageOptionsNext): Promise<any> {
393
+ // const { name } = options;
394
+ // debug('publishing or updating a new version for %o', name);
395
+ // // we check if the request is npm star
396
+ // if (!isPublishablePackage(body) && isObject(body.users)) {
397
+ // debug('starting star a package');
398
+ // await this.starPackage(body as StarBody, options);
399
+ // }
400
+ // return { ok: API_MESSAGE.PKG_CHANGED, success: true };
401
+ // }
402
+
403
+
404
+ async getPackageByVersion(options) {
405
+ const queryVersion = options.version;
406
+
407
+ if (_lodash.default.isNil(queryVersion)) {
408
+ throw _core.errorUtils.getNotFound(`${_core.API_ERROR.VERSION_NOT_EXIST}: ${queryVersion}`);
409
+ } // we have version, so we need to return specific version
410
+
411
+
412
+ const [convertedManifest] = await this.getPackageNext(options);
413
+ const version = (0, _utils.getVersion)(convertedManifest.versions, queryVersion);
414
+ debug('query by latest version %o and result %o', queryVersion, version);
415
+
416
+ if (typeof version !== 'undefined') {
417
+ debug('latest version found %o', version);
418
+ return (0, _tarball.convertDistVersionToLocalTarballsUrl)(convertedManifest.name, version, options.requestOptions, this.config.url_prefix);
419
+ } // the version could be a dist-tag eg: beta, alpha, so we find the matched version
420
+ // on disg-tag list
421
+
422
+
423
+ if (_lodash.default.isNil(convertedManifest[_core.DIST_TAGS]) === false) {
424
+ if (_lodash.default.isNil(convertedManifest[_core.DIST_TAGS][queryVersion]) === false) {
425
+ // the version found as a distag
426
+ const matchedDisTagVersion = convertedManifest[_core.DIST_TAGS][queryVersion];
427
+ debug('dist-tag version found %o', matchedDisTagVersion);
428
+ const disTagVersion = (0, _utils.getVersion)(convertedManifest.versions, matchedDisTagVersion);
429
+
430
+ if (typeof disTagVersion !== 'undefined') {
431
+ debug('dist-tag found %o', disTagVersion);
432
+ return (0, _tarball.convertDistVersionToLocalTarballsUrl)(convertedManifest.name, disTagVersion, options.requestOptions, this.config.url_prefix);
433
+ }
434
+ }
435
+ } else {
436
+ debug('dist tag not detected');
437
+ } // we didn't find the version, not found error
438
+
439
+
440
+ debug('package version not found %o', queryVersion);
441
+ throw _core.errorUtils.getNotFound(`${_core.API_ERROR.VERSION_NOT_EXIST}: ${queryVersion}`);
442
+ }
443
+
444
+ async getPackageManifest(options) {
445
+ // convert dist remotes to local bars
446
+ const [manifest] = await this.getPackageNext(options);
447
+ const convertedManifest = (0, _tarball.convertDistRemoteToLocalTarballUrls)(manifest, options.requestOptions, this.config.url_prefix);
448
+ return convertedManifest;
449
+ }
450
+ /**
451
+ * Return a manifest or version based on the options.
452
+ * @param options {Object}
453
+ * @returns A package manifest or specific version
454
+ */
455
+
456
+
457
+ async getPackageByOptions(options) {
458
+ // if no version we return the whole manifest
459
+ if (_lodash.default.isNil(options.version) === false) {
460
+ return this.getPackageByVersion(options);
461
+ } else {
462
+ return this.getPackageManifest(options);
463
+ }
326
464
  }
327
465
 
328
466
  async getPackageNext(options) {
@@ -346,53 +484,11 @@ class Storage {
346
484
 
347
485
  debug('sync uplinks for %o', name); // @ts-expect-error
348
486
 
349
- const [manifest, errors] = await this._syncUplinksMetadataNext(name, data, {
487
+ return this._syncUplinksMetadataNext(name, data, {
350
488
  req: options.req,
351
489
  uplinksLook: options.uplinksLook,
352
490
  keepUpLinkData: options.keepUpLinkData
353
491
  });
354
- debug('no. sync uplinks errors %o', errors === null || errors === void 0 ? void 0 : errors.length); // TODO: we could improve performance here, if a specific version is requested
355
- // we just convert that version and return it otherwise we convert
356
- // the whole manifest, bonus points for contribution :)
357
- // convert dist remotes to local bars
358
-
359
- const convertedManifest = (0, _tarball.convertDistRemoteToLocalTarballUrls)(manifest, options.requestOptions, this.config.url_prefix); // if no version we return the whole manifest
360
-
361
- if (_lodash.default.isNil(options.version)) {
362
- return convertedManifest;
363
- } // we have version, so we need to return specific version
364
-
365
-
366
- const queryVersion = options.version;
367
- const version = (0, _utils.getVersion)(convertedManifest.versions, options.version);
368
- debug('query by latest version %o and result %o', options.version, version);
369
-
370
- if (typeof version !== 'undefined') {
371
- debug('latest version found %o', version);
372
- return version;
373
- } // the version could be a dist-tag eg: beta, alpha, so we find the matched version
374
- // on disg-tag list
375
-
376
-
377
- if (_lodash.default.isNil(convertedManifest[_core.DIST_TAGS]) === false) {
378
- if (_lodash.default.isNil(convertedManifest[_core.DIST_TAGS][queryVersion]) === false) {
379
- // the version found as a distag
380
- const matchedDisTagVersion = convertedManifest[_core.DIST_TAGS][queryVersion];
381
- debug('dist-tag version found %o', matchedDisTagVersion);
382
- const disTagVersion = (0, _utils.getVersion)(convertedManifest.versions, matchedDisTagVersion);
383
-
384
- if (typeof disTagVersion !== 'undefined') {
385
- debug('dist-tag found %o', disTagVersion);
386
- return disTagVersion;
387
- }
388
- }
389
- } else {
390
- debug('dist tag not detected');
391
- } // we didn't find the version, not found error
392
-
393
-
394
- debug('package version not found %o', queryVersion);
395
- throw _core.errorUtils.getNotFound(`${_core.API_ERROR.VERSION_NOT_EXIST}: ${queryVersion}`);
396
492
  } catch (err) {
397
493
  this.logger.error({
398
494
  name,
@@ -420,7 +516,7 @@ class Storage {
420
516
  const normalizedPkg = Object.assign({}, result, { ...(0, _utils.normalizeDistTags)((0, _storageUtils.cleanUpLinksRef)(result, keepUpLinkData)),
421
517
  _attachments: {}
422
518
  });
423
- debug('no. sync uplinks errors %o', uplinkErrors === null || uplinkErrors === void 0 ? void 0 : uplinkErrors.length);
519
+ debug('no. sync uplinks errors %o for %s', uplinkErrors === null || uplinkErrors === void 0 ? void 0 : uplinkErrors.length, name);
424
520
  resolve([normalizedPkg, uplinkErrors]);
425
521
  });
426
522
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/storage.ts"],"names":["semver","lte","process","version","global","AbortController","require","debug","Storage","constructor","config","uplinks","Object","keys","logger","child","module","filters","localStorage","searchManager","init","LocalStorage","getSecret","SearchManager","addPackage","name","metadata","callback","_isAllowPublishOffline","_syncUplinksMetadata","bind","err","publish","_","isBoolean","allow_offline","readTokens","filter","saveToken","token","deleteToken","user","tokenKey","addVersion","tag","mergeTags","tagHash","changePackage","revision","removePackage","SearchInstance","remove","removeTarball","filename","addTarball","getTarball","readStream","ReadTarball","abort","self","localStream","isOpen","on","status","HTTP_STATUS","NOT_FOUND","emit","err404","getPackageMetadata","info","isNil","_distfiles","serveFile","v","pipe","file","uplink","uplinkId","packages","ProxyStorage","url","cache","_autogenerated","savestream","on_open","rstream2","fetchTarball","done","warn","fileName","getPackageNext","options","data","getPackageMetadataNext","INTERNAL_ERROR","manifest","errors","_syncUplinksMetadataNext","req","uplinksLook","keepUpLinkData","length","convertedManifest","requestOptions","url_prefix","queryVersion","versions","DIST_TAGS","matchedDisTagVersion","disTagVersion","errorUtils","getNotFound","API_ERROR","VERSION_NOT_EXIST","error","message","Promise","resolve","reject","getPackageSynUpLinksCallback","result","uplinkErrors","normalizedPkg","assign","_attachments","getPackage","getLocalDatabase","storagePlugin","get","then","locals","itemPkg","pkgMetadata","latest","timeList","time","users","push","package","catch","packageInfo","found","upLinks","hasToLookIntoUplinks","async","map","upLink","cb","_options","upLinkMeta","_uplinks","upname","validatioUtils","isObject","fetched","Date","now","maxage","etag","getRemoteMetadata","upLinkResponse","eTag","remoteStatus","getInternalError","validateMetadata","sub","pkgUtils","mergeVersions","upLinksErrors","Array","isArray","uplinkTimeoutError","i","j","code","getServiceUnavailable","NO_PACKAGE","updateVersions","packageJsonLocal","filterErrors","filter_metadata","concat","_updateVersionsHiddenUpLink","prototype","hasOwnProperty","call","Symbol","for"],"mappings":";;;;;;;AAAA;;AACA;;AACA;;AACA;;AACA;;AAEA;;AACA;;AAEA;;AACA;;AAEA;;AACA;;AAkBA;;AAEA;;AACA;;AACA;;AASA;;;;AAEA,IAAIA,gBAAOC,GAAP,CAAWC,OAAO,CAACC,OAAnB,EAA4B,SAA5B,CAAJ,EAA4C;AAC1CC,EAAAA,MAAM,CAACC,eAAP,GAAyBC,OAAO,CAAC,4CAAD,CAAP,CAAsDD,eAA/E;AACD;;AAED,MAAME,KAAK,GAAG,oBAAW,mBAAX,CAAd;;AACA,MAAMC,OAAN,CAAc;AAQLC,EAAAA,WAAW,CAACC,MAAD,EAAiB;AACjC,SAAKA,MAAL,GAAcA,MAAd;AACA,SAAKC,OAAL,GAAe,8BAAaD,MAAb,CAAf;AACAH,IAAAA,KAAK,CAAC,sBAAD,EAAyBK,MAAM,CAACC,IAAP,CAAY,KAAKF,OAAjB,CAAzB,CAAL;AACA,SAAKG,MAAL,GAAcA,eAAOC,KAAP,CAAa;AAAEC,MAAAA,MAAM,EAAE;AAAV,KAAb,CAAd;AACA,SAAKC,OAAL,GAAe,EAAf,CALiC,CAMjC;;AACA,SAAKC,YAAL,GAAoB,IAApB;AACA,SAAKC,aAAL,GAAqB,IAArB;AACD;;AAEgB,QAAJC,IAAI,CAACV,MAAD,EAAiBO,OAAuB,GAAG,EAA3C,EAA8D;AAC7E,QAAI,KAAKC,YAAL,KAAsB,IAA1B,EAAgC;AAC9B,WAAKD,OAAL,GAAeA,OAAO,IAAI,EAA1B;AACAV,MAAAA,KAAK,CAAC,sBAAD,EAAyBU,OAAzB,CAAL;AACA,WAAKC,YAAL,GAAoB,IAAIG,0BAAJ,CAAiB,KAAKX,MAAtB,EAA8BI,cAA9B,CAApB;AACA,YAAM,KAAKI,YAAL,CAAkBE,IAAlB,EAAN;AACAb,MAAAA,KAAK,CAAC,gCAAD,CAAL;AACA,YAAM,KAAKW,YAAL,CAAkBI,SAAlB,CAA4BZ,MAA5B,CAAN;AACAH,MAAAA,KAAK,CAAC,kCAAD,CAAL;AACA,WAAKY,aAAL,GAAqB,IAAII,qBAAJ,CAAkB,KAAKZ,OAAvB,EAAgC,KAAKO,YAArC,CAArB;AACD,KATD,MASO;AACLX,MAAAA,KAAK,CAAC,sCAAD,CAAL;AACD;;AACD;AACD;AAED;AACF;AACA;AACA;AACA;AACA;;;AACyB,QAAViB,UAAU,CAACC,IAAD,EAAeC,QAAf,EAA8BC,QAA9B,EAAiE;AACtF,QAAI;AACFpB,MAAAA,KAAK,CAAC,oBAAD,EAAuBkB,IAAvB,CAAL;AACA,YAAM,qCAAkBA,IAAlB,EAAwB,KAAKP,YAA7B,CAAN;AACAX,MAAAA,KAAK,CAAC,uBAAD,EAA0BkB,IAA1B,CAAL;AACA,YAAM,sCACJA,IADI,EAEJ,KAAKG,sBAAL,EAFI,EAGJ,KAAKC,oBAAL,CAA0BC,IAA1B,CAA+B,IAA/B,CAHI,CAAN;AAKAvB,MAAAA,KAAK,CAAC,6BAAD,EAAgCkB,IAAhC,CAAL;AACA,YAAM,kCAAeA,IAAf,EAAqBC,QAArB,EAA+B,KAAKR,YAApC,CAAN,CAVE,CAWF;;AACAS,MAAAA,QAAQ,CAAC,IAAD,EAAO,IAAP,CAAR;AACD,KAbD,CAaE,OAAOI,GAAP,EAAiB;AACjBxB,MAAAA,KAAK,CAAC,6CAAD,EAAgDkB,IAAhD,EAAsDM,GAAtD,CAAL;AACAJ,MAAAA,QAAQ,CAACI,GAAD,CAAR;AACD;AACF;;AAEOH,EAAAA,sBAAsB,GAAY;AACxC,WACE,OAAO,KAAKlB,MAAL,CAAYsB,OAAnB,KAA+B,WAA/B,IACAC,gBAAEC,SAAF,CAAY,KAAKxB,MAAL,CAAYsB,OAAZ,CAAoBG,aAAhC,CADA,IAEA,KAAKzB,MAAL,CAAYsB,OAAZ,CAAoBG,aAHtB;AAKD;;AAEMC,EAAAA,UAAU,CAACC,MAAD,EAAwC;AACvD,WAAO,KAAKnB,YAAL,CAAkBkB,UAAlB,CAA6BC,MAA7B,CAAP;AACD;;AAEMC,EAAAA,SAAS,CAACC,KAAD,EAA8B;AAC5C,WAAO,KAAKrB,YAAL,CAAkBoB,SAAlB,CAA4BC,KAA5B,CAAP;AACD;;AAEMC,EAAAA,WAAW,CAACC,IAAD,EAAeC,QAAf,EAA+C;AAC/D,WAAO,KAAKxB,YAAL,CAAkBsB,WAAlB,CAA8BC,IAA9B,EAAoCC,QAApC,CAAP;AACD;AAED;AACF;AACA;AACA;;;AACSC,EAAAA,UAAU,CACflB,IADe,EAEftB,OAFe,EAGfuB,QAHe,EAIfkB,GAJe,EAKfjB,QALe,EAMT;AACNpB,IAAAA,KAAK,CAAC,mCAAD,EAAsCJ,OAAtC,EAA+CsB,IAA/C,CAAL;AACA,SAAKP,YAAL,CAAkByB,UAAlB,CAA6BlB,IAA7B,EAAmCtB,OAAnC,EAA4CuB,QAA5C,EAAsDkB,GAAtD,EAA2DjB,QAA3D;AACD;AAED;AACF;AACA;AACA;;;AACSkB,EAAAA,SAAS,CAACpB,IAAD,EAAeqB,OAAf,EAAmCnB,QAAnC,EAAmE;AACjFpB,IAAAA,KAAK,CAAC,mCAAD,EAAsCkB,IAAtC,EAA4CqB,OAA5C,CAAL;AACA,SAAK5B,YAAL,CAAkB2B,SAAlB,CAA4BpB,IAA5B,EAAkCqB,OAAlC,EAA2CnB,QAA3C;AACD;AAED;AACF;AACA;AACA;AACA;;;AACSoB,EAAAA,aAAa,CAClBtB,IADkB,EAElBC,QAFkB,EAGlBsB,QAHkB,EAIlBrB,QAJkB,EAKZ;AACNpB,IAAAA,KAAK,CAAC,oDAAD,EAAuDkB,IAAvD,EAA6DuB,QAA7D,CAAL;AACA,SAAK9B,YAAL,CAAkB6B,aAAlB,CAAgCtB,IAAhC,EAAsCC,QAAtC,EAAgDsB,QAAhD,EAA0DrB,QAA1D;AACD;AAED;AACF;AACA;AACA;AACA;;;AAC4B,QAAbsB,aAAa,CAACxB,IAAD,EAA8B;AACtDlB,IAAAA,KAAK,CAAC,8BAAD,EAAiCkB,IAAjC,CAAL;AACA,UAAM,KAAKP,YAAL,CAAkB+B,aAAlB,CAAgCxB,IAAhC,CAAN,CAFsD,CAGtD;;AACAyB,2BAAeC,MAAf,CAAsB1B,IAAtB;AACD;AAED;AACF;AACA;AACA;AACA;AACA;AACA;;;AACS2B,EAAAA,aAAa,CAClB3B,IADkB,EAElB4B,QAFkB,EAGlBL,QAHkB,EAIlBrB,QAJkB,EAKZ;AACN,SAAKT,YAAL,CAAkBkC,aAAlB,CAAgC3B,IAAhC,EAAsC4B,QAAtC,EAAgDL,QAAhD,EAA0DrB,QAA1D;AACD;AAED;AACF;AACA;AACA;AACA;;;AACS2B,EAAAA,UAAU,CAAC7B,IAAD,EAAe4B,QAAf,EAAiD;AAChE9C,IAAAA,KAAK,CAAC,4BAAD,EAA+BkB,IAA/B,CAAL;AACA,WAAO,KAAKP,YAAL,CAAkBoC,UAAlB,CAA6B7B,IAA7B,EAAmC4B,QAAnC,CAAP;AACD;AAED;AACF;AACA;AACA;AACA;AACA;AACA;;;AACSE,EAAAA,UAAU,CAAC9B,IAAD,EAAe4B,QAAf,EAA+C;AAC9D9C,IAAAA,KAAK,CAAC,wCAAD,EAA2CkB,IAA3C,EAAiD4B,QAAjD,CAAL;AACA,UAAMG,UAAU,GAAG,IAAIC,oBAAJ,CAAgB,EAAhB,CAAnB;;AACAD,IAAAA,UAAU,CAACE,KAAX,GAAmB,YAAY,CAAE,CAAjC;;AAEA,UAAMC,IAAI,GAAG,IAAb,CAL8D,CAO9D;AACA;AAEA;AACA;;AACA,QAAIC,WAAgB,GAAGD,IAAI,CAACzC,YAAL,CAAkBqC,UAAlB,CAA6B9B,IAA7B,EAAmC4B,QAAnC,CAAvB;AACA,QAAIQ,MAAM,GAAG,KAAb;AACAD,IAAAA,WAAW,CAACE,EAAZ,CAAe,OAAf,EAAyB/B,GAAD,IAAc;AACpC,UAAI8B,MAAM,IAAI9B,GAAG,CAACgC,MAAJ,KAAeC,kBAAYC,SAAzC,EAAoD;AAClD,eAAOT,UAAU,CAACU,IAAX,CAAgB,OAAhB,EAAyBnC,GAAzB,CAAP;AACD,OAHmC,CAKpC;;;AACA,YAAMoC,MAAM,GAAGpC,GAAf;AACA6B,MAAAA,WAAW,CAACF,KAAZ;AACAE,MAAAA,WAAW,GAAG,IAAd,CARoC,CAQhB;;AACpBD,MAAAA,IAAI,CAACzC,YAAL,CAAkBkD,kBAAlB,CAAqC3C,IAArC,EAA2C,CAACM,GAAD,EAAMsC,IAAN,KAA8B;AACvE,YAAIpC,gBAAEqC,KAAF,CAAQvC,GAAR,KAAgBsC,IAAI,CAACE,UAArB,IAAmCtC,gBAAEqC,KAAF,CAAQD,IAAI,CAACE,UAAL,CAAgBlB,QAAhB,CAAR,MAAuC,KAA9E,EAAqF;AACnF;AACAmB,UAAAA,SAAS,CAACH,IAAI,CAACE,UAAL,CAAgBlB,QAAhB,CAAD,CAAT;AACD,SAHD,MAGO;AACL;AACAM,UAAAA,IAAI,CAAC9B,oBAAL,CAA0BJ,IAA1B,EAAgC4C,IAAhC,EAAsC,EAAtC,EAA0C,CAACtC,GAAD,EAAMsC,IAAN,KAA6B;AACrE,gBAAIpC,gBAAEqC,KAAF,CAAQvC,GAAR,MAAiB,KAArB,EAA4B;AAC1B,qBAAOyB,UAAU,CAACU,IAAX,CAAgB,OAAhB,EAAyBnC,GAAzB,CAAP;AACD;;AACD,gBAAIE,gBAAEqC,KAAF,CAAQD,IAAI,CAACE,UAAb,KAA4BtC,gBAAEqC,KAAF,CAAQD,IAAI,CAACE,UAAL,CAAgBlB,QAAhB,CAAR,CAAhC,EAAoE;AAClE,qBAAOG,UAAU,CAACU,IAAX,CAAgB,OAAhB,EAAyBC,MAAzB,CAAP;AACD;;AACDK,YAAAA,SAAS,CAACH,IAAI,CAACE,UAAL,CAAgBlB,QAAhB,CAAD,CAAT;AACD,WARD;AASD;AACF,OAhBD;AAiBD,KA1BD;AA2BAO,IAAAA,WAAW,CAACE,EAAZ,CAAe,gBAAf,EAAiC,UAAUW,CAAV,EAAmB;AAClDjB,MAAAA,UAAU,CAACU,IAAX,CAAgB,gBAAhB,EAAkCO,CAAlC;AACD,KAFD;AAIAb,IAAAA,WAAW,CAACE,EAAZ,CAAe,MAAf,EAAuB,YAAkB;AACvCD,MAAAA,MAAM,GAAG,IAAT;AACAD,MAAAA,WAAW,CAACc,IAAZ,CAAiBlB,UAAjB;AACD,KAHD;AAIA,WAAOA,UAAP;AAEA;AACJ;AACA;AACA;;AACI,aAASgB,SAAT,CAAmBG,IAAnB,EAAyC;AACvC,UAAIC,MAAW,GAAG,IAAlB;;AAEA,WAAK,MAAMC,QAAX,IAAuBlB,IAAI,CAAChD,OAA5B,EAAqC;AACnC;AACA,YAAI,wBAAWc,IAAX,EAAiBoD,QAAjB,EAA2BlB,IAAI,CAACjD,MAAL,CAAYoE,QAAvC,CAAJ,EAAsD;AACpDF,UAAAA,MAAM,GAAGjB,IAAI,CAAChD,OAAL,CAAakE,QAAb,CAAT;AACD;AACF;;AAED,UAAID,MAAM,IAAI,IAAd,EAAoB;AAClBA,QAAAA,MAAM,GAAG,IAAIG,mBAAJ,CACP;AACEC,UAAAA,GAAG,EAAEL,IAAI,CAACK,GADZ;AAEEC,UAAAA,KAAK,EAAE,IAFT;AAGEC,UAAAA,cAAc,EAAE;AAHlB,SADO,EAMPvB,IAAI,CAACjD,MANE,CAAT;AAQD;;AAED,UAAIyE,UAAiC,GAAG,IAAxC;;AACA,UAAIP,MAAM,CAAClE,MAAP,CAAcuE,KAAlB,EAAyB;AACvBE,QAAAA,UAAU,GAAGxB,IAAI,CAACzC,YAAL,CAAkBoC,UAAlB,CAA6B7B,IAA7B,EAAmC4B,QAAnC,CAAb;AACD;;AAED,UAAI+B,OAAO,GAAG,YAAkB;AAC9B;AACAA,QAAAA,OAAO,GAAG,YAAY,CAAE,CAAxB;;AACA,cAAMC,QAAQ,GAAGT,MAAM,CAACU,YAAP,CAAoBX,IAAI,CAACK,GAAzB,CAAjB;AACAK,QAAAA,QAAQ,CAACvB,EAAT,CAAY,OAAZ,EAAqB,UAAU/B,GAAV,EAAqB;AACxC,cAAIoD,UAAJ,EAAgB;AACdA,YAAAA,UAAU,CAACzB,KAAX;AACD;;AACDyB,UAAAA,UAAU,GAAG,IAAb;AACA3B,UAAAA,UAAU,CAACU,IAAX,CAAgB,OAAhB,EAAyBnC,GAAzB;AACD,SAND;AAOAsD,QAAAA,QAAQ,CAACvB,EAAT,CAAY,KAAZ,EAAmB,YAAkB;AACnC,cAAIqB,UAAJ,EAAgB;AACdA,YAAAA,UAAU,CAACI,IAAX;AACD;AACF,SAJD;AAMAF,QAAAA,QAAQ,CAACvB,EAAT,CAAY,gBAAZ,EAA8B,UAAUW,CAAV,EAAmB;AAC/CjB,UAAAA,UAAU,CAACU,IAAX,CAAgB,gBAAhB,EAAkCO,CAAlC;;AACA,cAAIU,UAAJ,EAAgB;AACdA,YAAAA,UAAU,CAACjB,IAAX,CAAgB,gBAAhB,EAAkCO,CAAlC;AACD;AACF,SALD;AAMAY,QAAAA,QAAQ,CAACX,IAAT,CAAclB,UAAd;;AACA,YAAI2B,UAAJ,EAAgB;AACdE,UAAAA,QAAQ,CAACX,IAAT,CAAcS,UAAd;AACD;AACF,OA3BD;;AA6BA,UAAIA,UAAJ,EAAgB;AACdA,QAAAA,UAAU,CAACrB,EAAX,CAAc,MAAd,EAAsB,YAAkB;AACtCsB,UAAAA,OAAO;AACR,SAFD;AAIAD,QAAAA,UAAU,CAACrB,EAAX,CAAc,OAAd,EAAuB,UAAU/B,GAAV,EAAqB;AAC1C4B,UAAAA,IAAI,CAAC7C,MAAL,CAAY0E,IAAZ,CACE;AAAEzD,YAAAA,GAAG,EAAEA,GAAP;AAAY0D,YAAAA,QAAQ,EAAEd;AAAtB,WADF,EAEE,8DAFF;;AAIA,cAAIQ,UAAJ,EAAgB;AACdA,YAAAA,UAAU,CAACzB,KAAX;AACD;;AACDyB,UAAAA,UAAU,GAAG,IAAb;AACAC,UAAAA,OAAO;AACR,SAVD;AAWD,OAhBD,MAgBO;AACLA,QAAAA,OAAO;AACR;AACF;AACF;;AAE0B,QAAdM,cAAc,CAACC,OAAD,EAA8D;AACvF,UAAM;AAAElE,MAAAA;AAAF,QAAWkE,OAAjB;AACApF,IAAAA,KAAK,CAAC,oBAAD,EAAuBkB,IAAvB,CAAL;;AACA,QAAI;AACF,UAAImE,IAAJ;;AACA,UAAI;AACFA,QAAAA,IAAI,GAAG,MAAM,KAAK1E,YAAL,CAAkB2E,sBAAlB,CAAyCpE,IAAzC,CAAb;AACD,OAFD,CAEE,OAAOM,GAAP,EAAiB;AACjB;AACA,YAAIA,GAAG,KAAK,CAACA,GAAG,CAACgC,MAAL,IAAehC,GAAG,CAACgC,MAAJ,IAAcC,kBAAY8B,cAA9C,CAAP,EAAsE;AACpE,gBAAM/D,GAAN;AACD;AACF,OATC,CAWF;;;AACAxB,MAAAA,KAAK,CAAC,qBAAD,EAAwBkB,IAAxB,CAAL,CAZE,CAaF;;AACA,YAAM,CAACsE,QAAD,EAAWC,MAAX,IAAqB,MAAM,KAAKC,wBAAL,CAA8BxE,IAA9B,EAAoCmE,IAApC,EAA0C;AACzEM,QAAAA,GAAG,EAAEP,OAAO,CAACO,GAD4D;AAEzEC,QAAAA,WAAW,EAAER,OAAO,CAACQ,WAFoD;AAGzEC,QAAAA,cAAc,EAAET,OAAO,CAACS;AAHiD,OAA1C,CAAjC;AAKA7F,MAAAA,KAAK,CAAC,4BAAD,EAA+ByF,MAA/B,aAA+BA,MAA/B,uBAA+BA,MAAM,CAAEK,MAAvC,CAAL,CAnBE,CAqBF;AACA;AACA;AACA;;AACA,YAAMC,iBAAiB,GAAG,kDACxBP,QADwB,EAExBJ,OAAO,CAACY,cAFgB,EAGxB,KAAK7F,MAAL,CAAY8F,UAHY,CAA1B,CAzBE,CA8BF;;AACA,UAAIvE,gBAAEqC,KAAF,CAAQqB,OAAO,CAACxF,OAAhB,CAAJ,EAA8B;AAC5B,eAAOmG,iBAAP;AACD,OAjCC,CAmCF;;;AACA,YAAMG,YAAY,GAAGd,OAAO,CAACxF,OAA7B;AACA,YAAMA,OAA4B,GAAG,uBAAWmG,iBAAiB,CAACI,QAA7B,EAAuCf,OAAO,CAACxF,OAA/C,CAArC;AACAI,MAAAA,KAAK,CAAC,0CAAD,EAA6CoF,OAAO,CAACxF,OAArD,EAA8DA,OAA9D,CAAL;;AACA,UAAI,OAAOA,OAAP,KAAmB,WAAvB,EAAoC;AAClCI,QAAAA,KAAK,CAAC,yBAAD,EAA4BJ,OAA5B,CAAL;AACA,eAAOA,OAAP;AACD,OA1CC,CA4CF;AACA;;;AACA,UAAI8B,gBAAEqC,KAAF,CAAQgC,iBAAiB,CAACK,eAAD,CAAzB,MAA0C,KAA9C,EAAqD;AACnD,YAAI1E,gBAAEqC,KAAF,CAAQgC,iBAAiB,CAACK,eAAD,CAAjB,CAA6BF,YAA7B,CAAR,MAAwD,KAA5D,EAAmE;AACjE;AACA,gBAAMG,oBAA4B,GAAGN,iBAAiB,CAACK,eAAD,CAAjB,CAA6BF,YAA7B,CAArC;AACAlG,UAAAA,KAAK,CAAC,2BAAD,EAA8BqG,oBAA9B,CAAL;AACA,gBAAMC,aAAkC,GAAG,uBACzCP,iBAAiB,CAACI,QADuB,EAEzCE,oBAFyC,CAA3C;;AAIA,cAAI,OAAOC,aAAP,KAAyB,WAA7B,EAA0C;AACxCtG,YAAAA,KAAK,CAAC,mBAAD,EAAsBsG,aAAtB,CAAL;AACA,mBAAOA,aAAP;AACD;AACF;AACF,OAdD,MAcO;AACLtG,QAAAA,KAAK,CAAC,uBAAD,CAAL;AACD,OA9DC,CAgEF;;;AACAA,MAAAA,KAAK,CAAC,8BAAD,EAAiCkG,YAAjC,CAAL;AACA,YAAMK,iBAAWC,WAAX,CAAwB,GAAEC,gBAAUC,iBAAkB,KAAIR,YAAa,EAAvE,CAAN;AACD,KAnED,CAmEE,OAAO1E,GAAP,EAAiB;AACjB,WAAKjB,MAAL,CAAYoG,KAAZ,CACE;AAAEzF,QAAAA,IAAF;AAAQM,QAAAA,GAAG,EAAEA,GAAG,CAACoF;AAAjB,OADF,EAEE,oDAFF;AAIA,YAAMpF,GAAN;AACD;AACF;;AAEOkE,EAAAA,wBAAwB,CAC9BxE,IAD8B,EAE9BmE,IAF8B,EAG9B;AAAEO,IAAAA,WAAF;AAAeC,IAAAA,cAAf;AAA+BF,IAAAA;AAA/B,GAH8B,EAIH;AAC3B,WAAO,IAAIkB,OAAJ,CAAY,CAACC,OAAD,EAAUC,MAAV,KAAqB;AACtC,WAAKzF,oBAAL,CACEJ,IADF,EAEEmE,IAFF,EAGE;AAAEM,QAAAA,GAAG,EAAEA,GAAP;AAAYC,QAAAA;AAAZ,OAHF,EAIE,SAASoB,4BAAT,CAAsCxF,GAAtC,EAA2CyF,MAA3C,EAA4DC,YAA5D,EAAgF;AAC9E,YAAI1F,GAAJ,EAAS;AACPxB,UAAAA,KAAK,CAAC,4CAAD,EAA+CkB,IAA/C,EAAqDM,GAArD,aAAqDA,GAArD,uBAAqDA,GAAG,CAAEoF,OAA1D,CAAL;AACA,iBAAOG,MAAM,CAACvF,GAAD,CAAb;AACD;;AAED,cAAM2F,aAAa,GAAG9G,MAAM,CAAC+G,MAAP,CAAc,EAAd,EAAkBH,MAAlB,EAA0B,EAC9C,GAAG,8BAAkB,mCAAgBA,MAAhB,EAAwBpB,cAAxB,CAAlB,CAD2C;AAE9CwB,UAAAA,YAAY,EAAE;AAFgC,SAA1B,CAAtB;AAKArH,QAAAA,KAAK,CAAC,4BAAD,EAA+BkH,YAA/B,aAA+BA,YAA/B,uBAA+BA,YAAY,CAAEpB,MAA7C,CAAL;AACAgB,QAAAA,OAAO,CAAC,CAACK,aAAD,EAAgBD,YAAhB,CAAD,CAAP;AACD,OAjBH;AAmBD,KApBM,CAAP;AAqBD;AAED;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAESI,EAAAA,UAAU,CAAClC,OAAD,EAAoC;AACnD,UAAM;AAAElE,MAAAA;AAAF,QAAWkE,OAAjB;AACApF,IAAAA,KAAK,CAAC,oBAAD,EAAuBkB,IAAvB,CAAL;AACA,SAAKP,YAAL,CAAkBkD,kBAAlB,CAAqC3C,IAArC,EAA2C,CAACM,GAAD,EAAM6D,IAAN,KAAe;AACxD,UAAI7D,GAAG,KAAK,CAACA,GAAG,CAACgC,MAAL,IAAehC,GAAG,CAACgC,MAAJ,IAAcC,kBAAY8B,cAA9C,CAAP,EAAsE;AACpE;AACAvF,QAAAA,KAAK,CAAC,2CAAD,EAA8CkB,IAA9C,EAAoDM,GAApD,aAAoDA,GAApD,uBAAoDA,GAAG,CAAEoF,OAAzD,CAAL;AACA,eAAOxB,OAAO,CAAChE,QAAR,CAAiBI,GAAjB,CAAP;AACD;;AAEDxB,MAAAA,KAAK,CAAC,qBAAD,EAAwBkB,IAAxB,CAAL;;AACA,WAAKI,oBAAL,CACEJ,IADF,EAEEmE,IAFF,EAGE;AAAEM,QAAAA,GAAG,EAAEP,OAAO,CAACO,GAAf;AAAoBC,QAAAA,WAAW,EAAER,OAAO,CAACQ;AAAzC,OAHF,EAIE,SAASoB,4BAAT,CAAsCxF,GAAtC,EAA2CyF,MAA3C,EAA4DC,YAA5D,EAAgF;AAC9E,YAAI1F,GAAJ,EAAS;AACPxB,UAAAA,KAAK,CAAC,4CAAD,EAA+CkB,IAA/C,EAAqDM,GAArD,aAAqDA,GAArD,uBAAqDA,GAAG,CAAEoF,OAA1D,CAAL;AACA,iBAAOxB,OAAO,CAAChE,QAAR,CAAiBI,GAAjB,CAAP;AACD;;AAEDyF,QAAAA,MAAM,GAAG,8BAAkB,mCAAgBA,MAAhB,EAAwB7B,OAAxB,aAAwBA,OAAxB,uBAAwBA,OAAO,CAAES,cAAjC,CAAlB,CAAT,CAN8E,CAQ9E;;AACAoB,QAAAA,MAAM,CAACI,YAAP,GAAsB,EAAtB;AAEArH,QAAAA,KAAK,CAAC,4BAAD,EAA+BkH,YAA/B,aAA+BA,YAA/B,uBAA+BA,YAAY,CAAEpB,MAA7C,CAAL;AACAV,QAAAA,OAAO,CAAChE,QAAR,CAAiB,IAAjB,EAAuB6F,MAAvB,EAA+BC,YAA/B;AACD,OAjBH;AAmBD,KA3BD;AA4BD;AAED;AACF;AACA;AACA;;;AACSK,EAAAA,gBAAgB,CAACnG,QAAD,EAA2B;AAChD,UAAMgC,IAAI,GAAG,IAAb;AACApD,IAAAA,KAAK,CAAC,oBAAD,CAAL;;AACA,QAAI,KAAKW,YAAL,CAAkB6G,aAAlB,KAAoC,IAAxC,EAA8C;AAC5C,WAAK7G,YAAL,CAAkB6G,aAAlB,CACGC,GADH,GAEGC,IAFH,CAESC,MAAD,IAAY;AAChB,cAAMpD,QAAmB,GAAG,EAA5B;;AACA,cAAM+C,UAAU,GAAG,UAAUM,OAAV,EAAyB;AAC1CxE,UAAAA,IAAI,CAACzC,YAAL,CAAkBkD,kBAAlB,CACE8D,MAAM,CAACC,OAAD,CADR,EAEE,UAAUpG,GAAV,EAAeqG,WAAf,EAA2C;AACzC,gBAAInG,gBAAEqC,KAAF,CAAQvC,GAAR,CAAJ,EAAkB;AAChB,oBAAMsG,MAAM,GAAGD,WAAW,CAACzB,eAAD,CAAX,CAAuB0B,MAAtC;;AACA,kBAAIA,MAAM,IAAID,WAAW,CAAC1B,QAAZ,CAAqB2B,MAArB,CAAd,EAA4C;AAC1C,sBAAMlI,OAAgB,GAAGiI,WAAW,CAAC1B,QAAZ,CAAqB2B,MAArB,CAAzB;AACA,sBAAMC,QAAQ,GAAGF,WAAW,CAACG,IAA7B;AACA,sBAAMA,IAAI,GAAGD,QAAQ,CAACD,MAAD,CAArB,CAH0C,CAI1C;;AACAlI,gBAAAA,OAAO,CAACoI,IAAR,GAAeA,IAAf,CAL0C,CAO1C;AACA;;AACApI,gBAAAA,OAAO,CAACqI,KAAR,GAAgBJ,WAAW,CAACI,KAA5B;AAEA1D,gBAAAA,QAAQ,CAAC2D,IAAT,CAActI,OAAd;AACD,eAZD,MAYO;AACLwD,gBAAAA,IAAI,CAAC7C,MAAL,CAAY0E,IAAZ,CACE;AAAEkD,kBAAAA,OAAO,EAAER,MAAM,CAACC,OAAD;AAAjB,iBADF,EAEE,kDAFF;AAID;AACF;;AAED,gBAAIA,OAAO,IAAID,MAAM,CAAC7B,MAAP,GAAgB,CAA/B,EAAkC;AAChC1E,cAAAA,QAAQ,CAAC,IAAD,EAAOmD,QAAP,CAAR;AACD,aAFD,MAEO;AACL+C,cAAAA,UAAU,CAACM,OAAO,GAAG,CAAX,CAAV;AACD;AACF,WA9BH;AAgCD,SAjCD;;AAmCA,YAAID,MAAM,CAAC7B,MAAX,EAAmB;AACjBwB,UAAAA,UAAU,CAAC,CAAD,CAAV;AACD,SAFD,MAEO;AACLlG,UAAAA,QAAQ,CAAC,IAAD,EAAO,EAAP,CAAR;AACD;AACF,OA5CH,EA6CGgH,KA7CH,CA6CU5G,GAAD,IAAS;AACdJ,QAAAA,QAAQ,CAACI,GAAD,CAAR;AACD,OA/CH;AAgDD,KAjDD,MAiDO;AACLxB,MAAAA,KAAK,CAAC,8BAAD,CAAL;AACD;AACF,GA7fW,CA+fZ;;AAEA;AACF;AACA;AACA;AACA;;;AACSsB,EAAAA,oBAAoB,CACzBJ,IADyB,EAEzBmH,WAFyB,EAGzBjD,OAHyB,EAIzBhE,QAJyB,EAKnB;AACN,QAAIkH,KAAK,GAAG,IAAZ;AACA,UAAMlF,IAAI,GAAG,IAAb;AACA,UAAMmF,OAAiB,GAAG,EAA1B;AACA,UAAMC,oBAAoB,GAAG9G,gBAAEqC,KAAF,CAAQqB,OAAO,CAACQ,WAAhB,KAAgCR,OAAO,CAACQ,WAArE;AACA5F,IAAAA,KAAK,CAAC,2BAAD,EAA8BwI,oBAA9B,CAAL;;AAEA,QAAI,CAACH,WAAL,EAAkB;AAChBC,MAAAA,KAAK,GAAG,KAAR;AACAD,MAAAA,WAAW,GAAG,2CAAwBnH,IAAxB,CAAd;AACD;;AAED,SAAK,MAAMmD,MAAX,IAAqB,KAAKjE,OAA1B,EAAmC;AACjC,UAAI,wBAAWc,IAAX,EAAiBmD,MAAjB,EAAyB,KAAKlE,MAAL,CAAYoE,QAArC,KAAkDiE,oBAAtD,EAA4E;AAC1ED,QAAAA,OAAO,CAACL,IAAR,CAAa,KAAK9H,OAAL,CAAaiE,MAAb,CAAb;AACD;AACF;;AAEDrE,IAAAA,KAAK,CAAC,gBAAD,EAAmBuI,OAAO,CAACzC,MAA3B,CAAL;;AAEA2C,mBAAMC,GAAN,CACEH,OADF,EAEE,CAACI,MAAD,EAASC,EAAT,KAAsB;AACpB,YAAMC,QAAQ,GAAGxI,MAAM,CAAC+G,MAAP,CAAc,EAAd,EAAkBhC,OAAlB,CAAjB;;AACA,YAAM0D,UAAU,GAAGT,WAAW,CAACU,QAAZ,CAAqBJ,MAAM,CAACK,MAA5B,CAAnB;;AAEA,UAAIC,qBAAeC,QAAf,CAAwBJ,UAAxB,CAAJ,EAAyC;AACvC,cAAMK,OAAO,GAAGL,UAAU,CAACK,OAA3B;;AAEA,YAAIA,OAAO,IAAIC,IAAI,CAACC,GAAL,KAAaF,OAAb,GAAuBR,MAAM,CAACW,MAA7C,EAAqD;AACnD,iBAAOV,EAAE,EAAT;AACD;;AAEDC,QAAAA,QAAQ,CAACU,IAAT,GAAgBT,UAAU,CAACS,IAA3B;AACD;;AAEDZ,MAAAA,MAAM,CAACa,iBAAP,CAAyBtI,IAAzB,EAA+B2H,QAA/B,EAAyC,CAACrH,GAAD,EAAMiI,cAAN,EAAsBC,IAAtB,KAAqC;AAC5E,YAAIlI,GAAG,IAAIA,GAAG,CAACmI,YAAJ,KAAqB,GAAhC,EAAqC;AACnCb,UAAAA,UAAU,CAACK,OAAX,GAAqBC,IAAI,CAACC,GAAL,EAArB;AACD;;AAED,YAAI7H,GAAG,IAAI,CAACiI,cAAZ,EAA4B;AAC1B,iBAAOb,EAAE,CAAC,IAAD,EAAO,CAACpH,GAAG,IAAI+E,iBAAWqD,gBAAX,CAA4B,SAA5B,CAAR,CAAP,CAAT;AACD;;AAED,YAAI;AACFX,+BAAeY,gBAAf,CAAgCJ,cAAhC,EAAgDvI,IAAhD;AACD,SAFD,CAEE,OAAOM,GAAP,EAAiB;AACjB4B,UAAAA,IAAI,CAAC7C,MAAL,CAAYoG,KAAZ,CACE;AACEmD,YAAAA,GAAG,EAAE,KADP;AAEEtI,YAAAA,GAAG,EAAEA;AAFP,WADF,EAKE,8DALF;AAOA,iBAAOoH,EAAE,CAAC,IAAD,EAAO,CAACpH,GAAD,CAAP,CAAT;AACD;;AAED6G,QAAAA,WAAW,CAACU,QAAZ,CAAqBJ,MAAM,CAACK,MAA5B,IAAsC;AACpCO,UAAAA,IAAI,EAAEG,IAD8B;AAEpCP,UAAAA,OAAO,EAAEC,IAAI,CAACC,GAAL;AAF2B,SAAtC;AAKAhB,QAAAA,WAAW,CAACL,IAAZ,GAAmB,4CAAyBK,WAAzB,EAAsCoB,cAAtC,CAAnB;AAEA,oDAA2BA,cAAc,CAACtD,QAA1C,EAAoDwC,MAApD;;AAEA,YAAI;AACFoB,yBAASC,aAAT,CAAuB3B,WAAvB,EAAoCoB,cAApC;AACD,SAFD,CAEE,OAAOjI,GAAP,EAAiB;AACjB4B,UAAAA,IAAI,CAAC7C,MAAL,CAAYoG,KAAZ,CACE;AACEmD,YAAAA,GAAG,EAAE,KADP;AAEEtI,YAAAA,GAAG,EAAEA;AAFP,WADF,EAKE,2DALF;AAOA,iBAAOoH,EAAE,CAAC,IAAD,EAAO,CAACpH,GAAD,CAAP,CAAT;AACD,SA1C2E,CA4C5E;AACA;;;AACA8G,QAAAA,KAAK,GAAG,IAAR;AACAM,QAAAA,EAAE;AACH,OAhDD;AAiDD,KAjEH,EAkEE;AACA,KAACpH,GAAD,EAAayI,aAAb,KAA8E;AAC5E,2BAAO,CAACzI,GAAD,IAAQ0I,KAAK,CAACC,OAAN,CAAcF,aAAd,CAAf,EAD4E,CAG5E;AACA;;AACA,UAAI,CAAC3B,KAAL,EAAY;AACV,YAAI8B,kBAAJ;;AACA,aAAK,IAAIC,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAGJ,aAAa,CAACnE,MAAlC,EAA0CuE,CAAC,EAA3C,EAA+C;AAC7C,cAAIJ,aAAa,CAACI,CAAD,CAAjB,EAAsB;AACpB,iBAAK,IAAIC,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAGL,aAAa,CAACI,CAAD,CAAb,CAAiBvE,MAArC,EAA6CwE,CAAC,EAA9C,EAAkD;AAChD,kBAAIL,aAAa,CAACI,CAAD,CAAb,CAAiBC,CAAjB,CAAJ,EAAyB;AACvB,sBAAMC,IAAI,GAAGN,aAAa,CAACI,CAAD,CAAb,CAAiBC,CAAjB,EAAoBC,IAAjC;;AACA,oBAAIA,IAAI,KAAK,WAAT,IAAwBA,IAAI,KAAK,iBAAjC,IAAsDA,IAAI,KAAK,YAAnE,EAAiF;AAC/EH,kBAAAA,kBAAkB,GAAG,IAArB;AACA;AACD;AACF;AACF;AACF;AACF;;AAED,YAAIA,kBAAJ,EAAwB;AACtB,iBAAOhJ,QAAQ,CAACmF,iBAAWiE,qBAAX,EAAD,EAAqC,IAArC,EAA2CP,aAA3C,CAAf;AACD;;AACD,eAAO7I,QAAQ,CAACmF,iBAAWC,WAAX,CAAuBC,gBAAUgE,UAAjC,CAAD,EAA+C,IAA/C,EAAqDR,aAArD,CAAf;AACD;;AAED,UAAI1B,OAAO,CAACzC,MAAR,KAAmB,CAAvB,EAA0B;AACxB,eAAO1E,QAAQ,CAAC,IAAD,EAAOiH,WAAP,CAAf;AACD;;AAEDjF,MAAAA,IAAI,CAACzC,YAAL,CAAkB+J,cAAlB,CACExJ,IADF,EAEEmH,WAFF,EAGE,OAAO7G,GAAP,EAAYmJ,gBAAZ,KAAwD;AACtD,YAAInJ,GAAJ,EAAS;AACP,iBAAOJ,QAAQ,CAACI,GAAD,CAAf;AACD,SAHqD,CAItD;AACA;AACA;;;AACA,cAAMoJ,YAAqB,GAAG,EAA9B,CAPsD,CAQtD;;AACA,aAAK,MAAM9I,MAAX,IAAqBsB,IAAI,CAAC1C,OAA1B,EAAmC;AACjC,cAAI;AACF;AACA;AACA;AACAiK,YAAAA,gBAAgB,GAAG,MAAM7I,MAAM,CAAC+I,eAAP,CAAuBF,gBAAvB,CAAzB;AACD,WALD,CAKE,OAAOnJ,GAAP,EAAiB;AACjBoJ,YAAAA,YAAY,CAAC1C,IAAb,CAAkB1G,GAAlB;AACD;AACF;;AACDJ,QAAAA,QAAQ,CAAC,IAAD,EAAOuJ,gBAAP,EAAyBjJ,gBAAEoJ,MAAF,CAASb,aAAT,EAAwBW,YAAxB,CAAzB,CAAR;AACD,OAvBH;AAyBD,KA3HH;AA6HD;AAED;AACF;AACA;AACA;AACA;AACA;;;AACSG,EAAAA,2BAA2B,CAAC5E,QAAD,EAAqBwC,MAArB,EAA2C;AAC3E,SAAK,MAAM0B,CAAX,IAAgBlE,QAAhB,EAA0B;AACxB,UAAI9F,MAAM,CAAC2K,SAAP,CAAiBC,cAAjB,CAAgCC,IAAhC,CAAqC/E,QAArC,EAA+CkE,CAA/C,CAAJ,EAAuD;AACrD,cAAMzK,OAAO,GAAGuG,QAAQ,CAACkE,CAAD,CAAxB,CADqD,CAGrD;AACA;;AACAzK,QAAAA,OAAO,CAACuL,MAAM,CAACC,GAAP,CAAW,oBAAX,CAAD,CAAP,GAA4CzC,MAAM,CAACK,MAAnD;AACD;AACF;AACF;;AA9qBW","sourcesContent":["import assert from 'assert';\nimport async, { AsyncResultArrayCallback } from 'async';\nimport buildDebug from 'debug';\nimport _ from 'lodash';\nimport semver from 'semver';\n\nimport { hasProxyTo } from '@verdaccio/config';\nimport { API_ERROR, DIST_TAGS, HTTP_STATUS, errorUtils } from '@verdaccio/core';\nimport { pkgUtils, validatioUtils } from '@verdaccio/core';\nimport { logger } from '@verdaccio/logger';\nimport { ProxyStorage } from '@verdaccio/proxy';\nimport { IProxy, ProxyList } from '@verdaccio/proxy';\nimport { ReadTarball } from '@verdaccio/streams';\nimport { convertDistRemoteToLocalTarballUrls } from '@verdaccio/tarball';\nimport {\n Callback,\n CallbackAction,\n Config,\n DistFile,\n GenericBody,\n IReadTarball,\n IUploadTarball,\n Logger,\n MergeTags,\n Package,\n StringValue,\n Token,\n TokenFilter,\n Version,\n Versions,\n} from '@verdaccio/types';\nimport { getVersion, normalizeDistTags } from '@verdaccio/utils';\n\nimport { LocalStorage } from './local-storage';\nimport { SearchInstance, SearchManager } from './search';\nimport {\n checkPackageLocal,\n checkPackageRemote,\n cleanUpLinksRef,\n generatePackageTemplate,\n mergeUplinkTimeIntoLocal,\n publishPackage,\n} from './storage-utils';\nimport { IGetPackageOptions, IGetPackageOptionsNext, IPluginFilters, ISyncUplinks } from './type';\nimport { setupUpLinks, updateVersionsHiddenUpLink } from './uplink-util';\n\nif (semver.lte(process.version, 'v15.0.0')) {\n global.AbortController = require('abortcontroller-polyfill/dist/cjs-ponyfill').AbortController;\n}\n\nconst debug = buildDebug('verdaccio:storage');\nclass Storage {\n public localStorage: LocalStorage;\n public searchManager: SearchManager | null;\n public readonly config: Config;\n public readonly logger: Logger;\n public readonly uplinks: ProxyList;\n public filters: IPluginFilters;\n\n public constructor(config: Config) {\n this.config = config;\n this.uplinks = setupUpLinks(config);\n debug('uplinks available %o', Object.keys(this.uplinks));\n this.logger = logger.child({ module: 'storage' });\n this.filters = [];\n // @ts-ignore\n this.localStorage = null;\n this.searchManager = null;\n }\n\n public async init(config: Config, filters: IPluginFilters = []): Promise<void> {\n if (this.localStorage === null) {\n this.filters = filters || [];\n debug('filters available %o', filters);\n this.localStorage = new LocalStorage(this.config, logger);\n await this.localStorage.init();\n debug('local init storage initialized');\n await this.localStorage.getSecret(config);\n debug('local storage secret initialized');\n this.searchManager = new SearchManager(this.uplinks, this.localStorage);\n } else {\n debug('storage has been already initialized');\n }\n return;\n }\n\n /**\n * Add a {name} package to a system\n Function checks if package with the same name is available from uplinks.\n If it isn't, we create package locally\n Used storages: local (write) && uplinks\n */\n public async addPackage(name: string, metadata: any, callback: Function): Promise<void> {\n try {\n debug('add package for %o', name);\n await checkPackageLocal(name, this.localStorage);\n debug('look up remote for %o', name);\n await checkPackageRemote(\n name,\n this._isAllowPublishOffline(),\n this._syncUplinksMetadata.bind(this)\n );\n debug('publishing a package for %o', name);\n await publishPackage(name, metadata, this.localStorage as LocalStorage);\n // TODO: return published data and replace callback by a promise\n callback(null, true);\n } catch (err: any) {\n debug('error on add a package for %o with error %o', name, err);\n callback(err);\n }\n }\n\n private _isAllowPublishOffline(): boolean {\n return (\n typeof this.config.publish !== 'undefined' &&\n _.isBoolean(this.config.publish.allow_offline) &&\n this.config.publish.allow_offline\n );\n }\n\n public readTokens(filter: TokenFilter): Promise<Token[]> {\n return this.localStorage.readTokens(filter);\n }\n\n public saveToken(token: Token): Promise<void> {\n return this.localStorage.saveToken(token);\n }\n\n public deleteToken(user: string, tokenKey: string): Promise<any> {\n return this.localStorage.deleteToken(user, tokenKey);\n }\n\n /**\n * Add a new version of package {name} to a system\n Used storages: local (write)\n */\n public addVersion(\n name: string,\n version: string,\n metadata: Version,\n tag: StringValue,\n callback: CallbackAction\n ): void {\n debug('add the version %o for package %o', version, name);\n this.localStorage.addVersion(name, version, metadata, tag, callback);\n }\n\n /**\n * Tags a package version with a provided tag\n Used storages: local (write)\n */\n public mergeTags(name: string, tagHash: MergeTags, callback: CallbackAction): void {\n debug('merge tags for package %o tags %o', name, tagHash);\n this.localStorage.mergeTags(name, tagHash, callback);\n }\n\n /**\n * Change an existing package (i.e. unpublish one version)\n Function changes a package info from local storage and all uplinks with write access./\n Used storages: local (write)\n */\n public changePackage(\n name: string,\n metadata: Package,\n revision: string,\n callback: Callback\n ): void {\n debug('change existing package for package %o revision %o', name, revision);\n this.localStorage.changePackage(name, metadata, revision, callback);\n }\n\n /**\n * Remove a package from a system\n Function removes a package from local storage\n Used storages: local (write)\n */\n public async removePackage(name: string): Promise<void> {\n debug('remove packagefor package %o', name);\n await this.localStorage.removePackage(name);\n // update the indexer\n SearchInstance.remove(name);\n }\n\n /**\n Remove a tarball from a system\n Function removes a tarball from local storage.\n Tarball in question should not be linked to in any existing\n versions, i.e. package version should be unpublished first.\n Used storage: local (write)\n */\n public removeTarball(\n name: string,\n filename: string,\n revision: string,\n callback: CallbackAction\n ): void {\n this.localStorage.removeTarball(name, filename, revision, callback);\n }\n\n /**\n * Upload a tarball for {name} package\n Function is synchronous and returns a WritableStream\n Used storages: local (write)\n */\n public addTarball(name: string, filename: string): IUploadTarball {\n debug('add tarball for package %o', name);\n return this.localStorage.addTarball(name, filename);\n }\n\n /**\n Get a tarball from a storage for {name} package\n Function is synchronous and returns a ReadableStream\n Function tries to read tarball locally, if it fails then it reads package\n information in order to figure out where we can get this tarball from\n Used storages: local || uplink (just one)\n */\n public getTarball(name: string, filename: string): IReadTarball {\n debug('get tarball for package %o filename %o', name, filename);\n const readStream = new ReadTarball({});\n readStream.abort = function () {};\n\n const self = this;\n\n // if someone requesting tarball, it means that we should already have some\n // information about it, so fetching package info is unnecessary\n\n // trying local first\n // flow: should be IReadTarball\n let localStream: any = self.localStorage.getTarball(name, filename);\n let isOpen = false;\n localStream.on('error', (err): any => {\n if (isOpen || err.status !== HTTP_STATUS.NOT_FOUND) {\n return readStream.emit('error', err);\n }\n\n // local reported 404\n const err404 = err;\n localStream.abort();\n localStream = null; // we force for garbage collector\n self.localStorage.getPackageMetadata(name, (err, info: Package): void => {\n if (_.isNil(err) && info._distfiles && _.isNil(info._distfiles[filename]) === false) {\n // information about this file exists locally\n serveFile(info._distfiles[filename]);\n } else {\n // we know nothing about this file, trying to get information elsewhere\n self._syncUplinksMetadata(name, info, {}, (err, info: Package): any => {\n if (_.isNil(err) === false) {\n return readStream.emit('error', err);\n }\n if (_.isNil(info._distfiles) || _.isNil(info._distfiles[filename])) {\n return readStream.emit('error', err404);\n }\n serveFile(info._distfiles[filename]);\n });\n }\n });\n });\n localStream.on('content-length', function (v): void {\n readStream.emit('content-length', v);\n });\n\n localStream.on('open', function (): void {\n isOpen = true;\n localStream.pipe(readStream);\n });\n return readStream;\n\n /**\n * Fetch and cache local/remote packages.\n * @param {Object} file define the package shape\n */\n function serveFile(file: DistFile): void {\n let uplink: any = null;\n\n for (const uplinkId in self.uplinks) {\n // https://github.com/verdaccio/verdaccio/issues/1642\n if (hasProxyTo(name, uplinkId, self.config.packages)) {\n uplink = self.uplinks[uplinkId];\n }\n }\n\n if (uplink == null) {\n uplink = new ProxyStorage(\n {\n url: file.url,\n cache: true,\n _autogenerated: true,\n },\n self.config\n );\n }\n\n let savestream: IUploadTarball | null = null;\n if (uplink.config.cache) {\n savestream = self.localStorage.addTarball(name, filename);\n }\n\n let on_open = function (): void {\n // prevent it from being called twice\n on_open = function () {};\n const rstream2 = uplink.fetchTarball(file.url);\n rstream2.on('error', function (err): void {\n if (savestream) {\n savestream.abort();\n }\n savestream = null;\n readStream.emit('error', err);\n });\n rstream2.on('end', function (): void {\n if (savestream) {\n savestream.done();\n }\n });\n\n rstream2.on('content-length', function (v): void {\n readStream.emit('content-length', v);\n if (savestream) {\n savestream.emit('content-length', v);\n }\n });\n rstream2.pipe(readStream);\n if (savestream) {\n rstream2.pipe(savestream);\n }\n };\n\n if (savestream) {\n savestream.on('open', function (): void {\n on_open();\n });\n\n savestream.on('error', function (err): void {\n self.logger.warn(\n { err: err, fileName: file },\n 'error saving file @{fileName}: @{err?.message}\\n@{err.stack}'\n );\n if (savestream) {\n savestream.abort();\n }\n savestream = null;\n on_open();\n });\n } else {\n on_open();\n }\n }\n }\n\n public async getPackageNext(options: IGetPackageOptionsNext): Promise<Package | Version> {\n const { name } = options;\n debug('get package for %o', name);\n try {\n let data: Package;\n try {\n data = await this.localStorage.getPackageMetadataNext(name);\n } catch (err: any) {\n // we don't have package locally, so we need to fetch it from uplinks\n if (err && (!err.status || err.status >= HTTP_STATUS.INTERNAL_ERROR)) {\n throw err;\n }\n }\n\n // time to sync with uplinks if we have any\n debug('sync uplinks for %o', name);\n // @ts-expect-error\n const [manifest, errors] = await this._syncUplinksMetadataNext(name, data, {\n req: options.req,\n uplinksLook: options.uplinksLook,\n keepUpLinkData: options.keepUpLinkData,\n });\n debug('no. sync uplinks errors %o', errors?.length);\n\n // TODO: we could improve performance here, if a specific version is requested\n // we just convert that version and return it otherwise we convert\n // the whole manifest, bonus points for contribution :)\n // convert dist remotes to local bars\n const convertedManifest = convertDistRemoteToLocalTarballUrls(\n manifest,\n options.requestOptions,\n this.config.url_prefix\n );\n // if no version we return the whole manifest\n if (_.isNil(options.version)) {\n return convertedManifest;\n }\n\n // we have version, so we need to return specific version\n const queryVersion = options.version as string;\n const version: Version | undefined = getVersion(convertedManifest.versions, options.version);\n debug('query by latest version %o and result %o', options.version, version);\n if (typeof version !== 'undefined') {\n debug('latest version found %o', version);\n return version;\n }\n\n // the version could be a dist-tag eg: beta, alpha, so we find the matched version\n // on disg-tag list\n if (_.isNil(convertedManifest[DIST_TAGS]) === false) {\n if (_.isNil(convertedManifest[DIST_TAGS][queryVersion]) === false) {\n // the version found as a distag\n const matchedDisTagVersion: string = convertedManifest[DIST_TAGS][queryVersion];\n debug('dist-tag version found %o', matchedDisTagVersion);\n const disTagVersion: Version | undefined = getVersion(\n convertedManifest.versions,\n matchedDisTagVersion\n );\n if (typeof disTagVersion !== 'undefined') {\n debug('dist-tag found %o', disTagVersion);\n return disTagVersion;\n }\n }\n } else {\n debug('dist tag not detected');\n }\n\n // we didn't find the version, not found error\n debug('package version not found %o', queryVersion);\n throw errorUtils.getNotFound(`${API_ERROR.VERSION_NOT_EXIST}: ${queryVersion}`);\n } catch (err: any) {\n this.logger.error(\n { name, err: err.message },\n 'error on get package for @{name} with error @{err}'\n );\n throw err;\n }\n }\n\n private _syncUplinksMetadataNext(\n name: string,\n data: Package,\n { uplinksLook, keepUpLinkData, req }\n ): Promise<[Package, any[]]> {\n return new Promise((resolve, reject) => {\n this._syncUplinksMetadata(\n name,\n data,\n { req: req, uplinksLook },\n function getPackageSynUpLinksCallback(err, result: Package, uplinkErrors): void {\n if (err) {\n debug('error on sync package for %o with error %o', name, err?.message);\n return reject(err);\n }\n\n const normalizedPkg = Object.assign({}, result, {\n ...normalizeDistTags(cleanUpLinksRef(result, keepUpLinkData)),\n _attachments: {},\n });\n\n debug('no. sync uplinks errors %o', uplinkErrors?.length);\n resolve([normalizedPkg, uplinkErrors]);\n }\n );\n });\n }\n\n /**\n Retrieve a package metadata for {name} package\n Function invokes localStorage.getPackage and uplink.get_package for every\n uplink with proxy_access rights against {name} and combines results\n into one json object\n Used storages: local && uplink (proxy_access)\n\n * @param {object} options\n * @property {string} options.name Package Name\n * @property {object} options.req Express `req` object\n * @property {boolean} options.keepUpLinkData keep up link info in package meta, last update, etc.\n * @property {function} options.callback Callback for receive data\n */\n public getPackage(options: IGetPackageOptions): void {\n const { name } = options;\n debug('get package for %o', name);\n this.localStorage.getPackageMetadata(name, (err, data) => {\n if (err && (!err.status || err.status >= HTTP_STATUS.INTERNAL_ERROR)) {\n // report internal errors right away\n debug('error on get package for %o with error %o', name, err?.message);\n return options.callback(err);\n }\n\n debug('sync uplinks for %o', name);\n this._syncUplinksMetadata(\n name,\n data,\n { req: options.req, uplinksLook: options.uplinksLook },\n function getPackageSynUpLinksCallback(err, result: Package, uplinkErrors): void {\n if (err) {\n debug('error on sync package for %o with error %o', name, err?.message);\n return options.callback(err);\n }\n\n result = normalizeDistTags(cleanUpLinksRef(result, options?.keepUpLinkData));\n\n // npm can throw if this field doesn't exist\n result._attachments = {};\n\n debug('no. sync uplinks errors %o', uplinkErrors?.length);\n options.callback(null, result, uplinkErrors);\n }\n );\n });\n }\n\n /**\n * Retrieve only private local packages\n * @param {*} callback\n */\n public getLocalDatabase(callback: Callback): void {\n const self = this;\n debug('get local database');\n if (this.localStorage.storagePlugin !== null) {\n this.localStorage.storagePlugin\n .get()\n .then((locals) => {\n const packages: Version[] = [];\n const getPackage = function (itemPkg): void {\n self.localStorage.getPackageMetadata(\n locals[itemPkg],\n function (err, pkgMetadata: Package): void {\n if (_.isNil(err)) {\n const latest = pkgMetadata[DIST_TAGS].latest;\n if (latest && pkgMetadata.versions[latest]) {\n const version: Version = pkgMetadata.versions[latest];\n const timeList = pkgMetadata.time as GenericBody;\n const time = timeList[latest];\n // @ts-ignore\n version.time = time;\n\n // Add for stars api\n // @ts-ignore\n version.users = pkgMetadata.users;\n\n packages.push(version);\n } else {\n self.logger.warn(\n { package: locals[itemPkg] },\n 'package @{package} does not have a \"latest\" tag?'\n );\n }\n }\n\n if (itemPkg >= locals.length - 1) {\n callback(null, packages);\n } else {\n getPackage(itemPkg + 1);\n }\n }\n );\n };\n\n if (locals.length) {\n getPackage(0);\n } else {\n callback(null, []);\n }\n })\n .catch((err) => {\n callback(err);\n });\n } else {\n debug('local stora instance is null');\n }\n }\n\n // notas, debo migrar _syncUplinksMetadata algo mas lindo\n\n /**\n * Function fetches package metadata from uplinks and synchronizes it with local data\n if package is available locally, it MUST be provided in pkginfo\n returns callback(err, result, uplink_errors)\n */\n public _syncUplinksMetadata(\n name: string,\n packageInfo: Package,\n options: ISyncUplinks,\n callback: Callback\n ): void {\n let found = true;\n const self = this;\n const upLinks: IProxy[] = [];\n const hasToLookIntoUplinks = _.isNil(options.uplinksLook) || options.uplinksLook;\n debug('is sync uplink enabled %o', hasToLookIntoUplinks);\n\n if (!packageInfo) {\n found = false;\n packageInfo = generatePackageTemplate(name);\n }\n\n for (const uplink in this.uplinks) {\n if (hasProxyTo(name, uplink, this.config.packages) && hasToLookIntoUplinks) {\n upLinks.push(this.uplinks[uplink]);\n }\n }\n\n debug('uplink list %o', upLinks.length);\n\n async.map(\n upLinks,\n (upLink, cb): void => {\n const _options = Object.assign({}, options);\n const upLinkMeta = packageInfo._uplinks[upLink.upname];\n\n if (validatioUtils.isObject(upLinkMeta)) {\n const fetched = upLinkMeta.fetched;\n\n if (fetched && Date.now() - fetched < upLink.maxage) {\n return cb();\n }\n\n _options.etag = upLinkMeta.etag;\n }\n\n upLink.getRemoteMetadata(name, _options, (err, upLinkResponse, eTag): void => {\n if (err && err.remoteStatus === 304) {\n upLinkMeta.fetched = Date.now();\n }\n\n if (err || !upLinkResponse) {\n return cb(null, [err || errorUtils.getInternalError('no data')]);\n }\n\n try {\n validatioUtils.validateMetadata(upLinkResponse, name);\n } catch (err: any) {\n self.logger.error(\n {\n sub: 'out',\n err: err,\n },\n 'package.json validating error @{!err?.message}\\n@{err.stack}'\n );\n return cb(null, [err]);\n }\n\n packageInfo._uplinks[upLink.upname] = {\n etag: eTag,\n fetched: Date.now(),\n };\n\n packageInfo.time = mergeUplinkTimeIntoLocal(packageInfo, upLinkResponse);\n\n updateVersionsHiddenUpLink(upLinkResponse.versions, upLink);\n\n try {\n pkgUtils.mergeVersions(packageInfo, upLinkResponse);\n } catch (err: any) {\n self.logger.error(\n {\n sub: 'out',\n err: err,\n },\n 'package.json parsing error @{!err?.message}\\n@{err.stack}'\n );\n return cb(null, [err]);\n }\n\n // if we got to this point, assume that the correct package exists\n // on the uplink\n found = true;\n cb();\n });\n },\n // @ts-ignore\n (err: Error, upLinksErrors: any): AsyncResultArrayCallback<unknown, Error> => {\n assert(!err && Array.isArray(upLinksErrors));\n\n // Check for connection timeout or reset errors with uplink(s)\n // (these should be handled differently from the package not being found)\n if (!found) {\n let uplinkTimeoutError;\n for (let i = 0; i < upLinksErrors.length; i++) {\n if (upLinksErrors[i]) {\n for (let j = 0; j < upLinksErrors[i].length; j++) {\n if (upLinksErrors[i][j]) {\n const code = upLinksErrors[i][j].code;\n if (code === 'ETIMEDOUT' || code === 'ESOCKETTIMEDOUT' || code === 'ECONNRESET') {\n uplinkTimeoutError = true;\n break;\n }\n }\n }\n }\n }\n\n if (uplinkTimeoutError) {\n return callback(errorUtils.getServiceUnavailable(), null, upLinksErrors);\n }\n return callback(errorUtils.getNotFound(API_ERROR.NO_PACKAGE), null, upLinksErrors);\n }\n\n if (upLinks.length === 0) {\n return callback(null, packageInfo);\n }\n\n self.localStorage.updateVersions(\n name,\n packageInfo,\n async (err, packageJsonLocal: Package): Promise<any> => {\n if (err) {\n return callback(err);\n }\n // Any error here will cause a 404, like an uplink error. This is likely\n // the right thing to do\n // as a broken filter is a security risk.\n const filterErrors: Error[] = [];\n // This MUST be done serially and not in parallel as they modify packageJsonLocal\n for (const filter of self.filters) {\n try {\n // These filters can assume it's save to modify packageJsonLocal\n // and return it directly for\n // performance (i.e. need not be pure)\n packageJsonLocal = await filter.filter_metadata(packageJsonLocal);\n } catch (err: any) {\n filterErrors.push(err);\n }\n }\n callback(null, packageJsonLocal, _.concat(upLinksErrors, filterErrors));\n }\n );\n }\n );\n }\n\n /**\n * Set a hidden value for each version.\n * @param {Array} versions list of version\n * @param {String} upLink uplink name\n * @private\n */\n public _updateVersionsHiddenUpLink(versions: Versions, upLink: IProxy): void {\n for (const i in versions) {\n if (Object.prototype.hasOwnProperty.call(versions, i)) {\n const version = versions[i];\n\n // holds a \"hidden\" value to be used by the package storage.\n // $FlowFixMe\n version[Symbol.for('__verdaccio_uplink')] = upLink.upname;\n }\n }\n }\n}\n\nexport { Storage };\n"],"file":"storage.js"}
1
+ {"version":3,"sources":["../src/storage.ts"],"names":["debug","Storage","constructor","config","uplinks","Object","keys","logger","child","module","filters","localStorage","searchManager","init","LocalStorage","getSecret","SearchManager","addPackage","name","metadata","callback","_isAllowPublishOffline","_syncUplinksMetadata","bind","err","addPackageNext","publish","_","isBoolean","allow_offline","readTokens","filter","saveToken","token","deleteToken","user","tokenKey","addVersion","version","tag","addVersionNext","mergeTags","tagHash","changePackage","revision","changePackageNext","removePackage","removeTarball","filename","addTarball","getTarball","readStream","ReadTarball","abort","self","localStream","isOpen","on","status","HTTP_STATUS","NOT_FOUND","emit","err404","getPackageMetadata","info","isNil","_distfiles","serveFile","v","pipe","file","uplink","uplinkId","packages","ProxyStorage","url","cache","_autogenerated","savestream","on_open","rstream2","fetchTarball","done","warn","fileName","getPackageByVersion","options","queryVersion","errorUtils","getNotFound","API_ERROR","VERSION_NOT_EXIST","convertedManifest","getPackageNext","versions","requestOptions","url_prefix","DIST_TAGS","matchedDisTagVersion","disTagVersion","getPackageManifest","manifest","getPackageByOptions","data","getPackageMetadataNext","INTERNAL_ERROR","_syncUplinksMetadataNext","req","uplinksLook","keepUpLinkData","error","message","Promise","resolve","reject","getPackageSynUpLinksCallback","result","uplinkErrors","normalizedPkg","assign","_attachments","length","getPackage","getLocalDatabase","storagePlugin","get","then","locals","itemPkg","pkgMetadata","latest","timeList","time","users","push","package","catch","packageInfo","found","upLinks","hasToLookIntoUplinks","async","map","upLink","cb","_options","upLinkMeta","_uplinks","upname","validatioUtils","isObject","fetched","Date","now","maxage","etag","getRemoteMetadata","upLinkResponse","eTag","remoteStatus","getInternalError","validateMetadata","sub","pkgUtils","mergeVersions","upLinksErrors","Array","isArray","uplinkTimeoutError","i","j","code","getServiceUnavailable","NO_PACKAGE","updateVersions","packageJsonLocal","filterErrors","filter_metadata","concat","_updateVersionsHiddenUpLink","prototype","hasOwnProperty","call","Symbol","for"],"mappings":"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","sourcesContent":["import assert from 'assert';\nimport async, { AsyncResultArrayCallback } from 'async';\nimport buildDebug from 'debug';\nimport _ from 'lodash';\n\nimport { hasProxyTo } from '@verdaccio/config';\nimport {\n API_ERROR,\n DIST_TAGS,\n HTTP_STATUS,\n errorUtils,\n pkgUtils,\n validatioUtils,\n} from '@verdaccio/core';\nimport { logger } from '@verdaccio/logger';\nimport { ProxyStorage } from '@verdaccio/proxy';\nimport { IProxy, ProxyList } from '@verdaccio/proxy';\nimport { ReadTarball } from '@verdaccio/streams';\nimport {\n convertDistRemoteToLocalTarballUrls,\n convertDistVersionToLocalTarballsUrl,\n} from '@verdaccio/tarball';\nimport {\n Callback,\n CallbackAction,\n Config,\n DistFile,\n GenericBody,\n IReadTarball,\n IUploadTarball,\n Logger,\n MergeTags,\n Package,\n StringValue,\n Token,\n TokenFilter,\n Version,\n Versions,\n} from '@verdaccio/types';\nimport { getVersion, normalizeDistTags } from '@verdaccio/utils';\n\nimport { LocalStorage } from './local-storage';\nimport { SearchManager } from './search';\n// import { isPublishablePackage, validateInputs } from './star-utils';\nimport {\n checkPackageLocal,\n checkPackageRemote,\n cleanUpLinksRef,\n generatePackageTemplate,\n mergeUplinkTimeIntoLocal,\n publishPackage,\n} from './storage-utils';\nimport { IGetPackageOptions, IGetPackageOptionsNext, IPluginFilters, ISyncUplinks } from './type';\n// import { StarBody, Users } from './type';\nimport { setupUpLinks, updateVersionsHiddenUpLink } from './uplink-util';\n\nconst debug = buildDebug('verdaccio:storage');\nclass Storage {\n public localStorage: LocalStorage;\n public searchManager: SearchManager | null;\n public readonly config: Config;\n public readonly logger: Logger;\n public readonly uplinks: ProxyList;\n public filters: IPluginFilters;\n\n public constructor(config: Config) {\n this.config = config;\n this.uplinks = setupUpLinks(config);\n debug('uplinks available %o', Object.keys(this.uplinks));\n this.logger = logger.child({ module: 'storage' });\n this.filters = [];\n // @ts-ignore\n this.localStorage = null;\n this.searchManager = null;\n }\n\n public async init(config: Config, filters: IPluginFilters = []): Promise<void> {\n if (this.localStorage === null) {\n this.filters = filters || [];\n debug('filters available %o', filters);\n this.localStorage = new LocalStorage(this.config, logger);\n await this.localStorage.init();\n debug('local init storage initialized');\n await this.localStorage.getSecret(config);\n debug('local storage secret initialized');\n this.searchManager = new SearchManager(this.uplinks, this.localStorage);\n } else {\n debug('storage has been already initialized');\n }\n return;\n }\n\n /**\n * Add a {name} package to a system\n Function checks if package with the same name is available from uplinks.\n If it isn't, we create package locally\n Used storages: local (write) && uplinks\n */\n public async addPackage(name: string, metadata: any, callback: Function): Promise<void> {\n try {\n debug('add package for %o', name);\n await checkPackageLocal(name, this.localStorage);\n debug('look up remote for %o', name);\n await checkPackageRemote(\n name,\n this._isAllowPublishOffline(),\n this._syncUplinksMetadata.bind(this)\n );\n debug('publishing a package for %o', name);\n await publishPackage(name, metadata, this.localStorage as LocalStorage);\n // TODO: return published data and replace callback by a promise\n callback(null, true);\n } catch (err: any) {\n debug('error on add a package for %o with error %o', name, err);\n callback(err);\n }\n }\n\n /**\n * Add a {name} package to a system\n Function checks if package with the same name is available from uplinks.\n If it isn't, we create package locally\n Used storages: local (write) && uplinks\n */\n public async addPackageNext(name: string, metadata: Package): Promise<Package> {\n try {\n debug('add package for %o', name);\n await checkPackageLocal(name, this.localStorage);\n debug('look up remote for %o', name);\n await checkPackageRemote(\n name,\n this._isAllowPublishOffline(),\n this._syncUplinksMetadata.bind(this)\n );\n debug('publishing a package for %o', name);\n // FIXME: publishPackage should return fresh metadata from backend\n // instead return metadata\n await publishPackage(name, metadata, this.localStorage as LocalStorage);\n return metadata;\n } catch (err: any) {\n debug('error on add a package for %o with error %o', name, err);\n throw err;\n }\n }\n\n private _isAllowPublishOffline(): boolean {\n return (\n typeof this.config.publish !== 'undefined' &&\n _.isBoolean(this.config.publish.allow_offline) &&\n this.config.publish.allow_offline\n );\n }\n\n public readTokens(filter: TokenFilter): Promise<Token[]> {\n return this.localStorage.readTokens(filter);\n }\n\n public saveToken(token: Token): Promise<void> {\n return this.localStorage.saveToken(token);\n }\n\n public deleteToken(user: string, tokenKey: string): Promise<any> {\n return this.localStorage.deleteToken(user, tokenKey);\n }\n\n /**\n * Add a new version of package {name} to a system\n Used storages: local (write)\n */\n public addVersion(\n name: string,\n version: string,\n metadata: Version,\n tag: StringValue,\n callback: CallbackAction\n ): void {\n debug('add the version %o for package %o', version, name);\n this.localStorage.addVersion(name, version, metadata, tag, callback);\n }\n\n public async addVersionNext(\n name: string,\n version: string,\n metadata: Version,\n tag: StringValue\n ): Promise<void> {\n debug('add the version %o for package %o', version, name);\n return this.localStorage.addVersionNext(name, version, metadata, tag);\n }\n\n /**\n * Tags a package version with a provided tag\n Used storages: local (write)\n */\n public mergeTags(name: string, tagHash: MergeTags, callback: CallbackAction): void {\n debug('merge tags for package %o tags %o', name, tagHash);\n this.localStorage.mergeTags(name, tagHash, callback);\n }\n\n /**\n * Change an existing package (i.e. unpublish one version)\n Function changes a package info from local storage and all uplinks with write access./\n Used storages: local (write)\n */\n public changePackage(\n name: string,\n metadata: Package,\n revision: string,\n callback: Callback\n ): void {\n debug('change existing package for package %o revision %o', name, revision);\n this.localStorage.changePackage(name, metadata, revision, callback);\n }\n\n /**\n * Change an existing package (i.e. unpublish one version)\n Function changes a package info from local storage and all uplinks with write access./\n Used storages: local (write)\n */\n public async changePackageNext(name: string, metadata: Package, revision: string): Promise<void> {\n debug('change existing package for package %o revision %o', name, revision);\n this.localStorage.changePackageNext(name, metadata, revision);\n }\n\n /**\n * Remove a package from a system\n Function removes a package from local storage\n Used storages: local (write)\n */\n public async removePackage(name: string): Promise<void> {\n debug('remove packagefor package %o', name);\n await this.localStorage.removePackage(name);\n }\n\n /**\n Remove a tarball from a system\n Function removes a tarball from local storage.\n Tarball in question should not be linked to in any existing\n versions, i.e. package version should be unpublished first.\n Used storage: local (write)\n */\n public removeTarball(\n name: string,\n filename: string,\n revision: string,\n callback: CallbackAction\n ): void {\n this.localStorage.removeTarball(name, filename, revision, callback);\n }\n\n /**\n * Upload a tarball for {name} package\n Function is synchronous and returns a WritableStream\n Used storages: local (write)\n */\n public addTarball(name: string, filename: string): IUploadTarball {\n debug('add tarball for package %o', name);\n return this.localStorage.addTarball(name, filename);\n }\n\n /**\n Get a tarball from a storage for {name} package\n Function is synchronous and returns a ReadableStream\n Function tries to read tarball locally, if it fails then it reads package\n information in order to figure out where we can get this tarball from\n Used storages: local || uplink (just one)\n */\n public getTarball(name: string, filename: string): IReadTarball {\n debug('get tarball for package %o filename %o', name, filename);\n const readStream = new ReadTarball({});\n readStream.abort = function () {};\n\n const self = this;\n\n // if someone requesting tarball, it means that we should already have some\n // information about it, so fetching package info is unnecessary\n\n // trying local first\n // flow: should be IReadTarball\n let localStream: any = self.localStorage.getTarball(name, filename);\n let isOpen = false;\n localStream.on('error', (err): any => {\n if (isOpen || err.status !== HTTP_STATUS.NOT_FOUND) {\n return readStream.emit('error', err);\n }\n\n // local reported 404\n const err404 = err;\n localStream.abort();\n localStream = null; // we force for garbage collector\n self.localStorage.getPackageMetadata(name, (err, info: Package): void => {\n if (_.isNil(err) && info._distfiles && _.isNil(info._distfiles[filename]) === false) {\n // information about this file exists locally\n serveFile(info._distfiles[filename]);\n } else {\n // we know nothing about this file, trying to get information elsewhere\n self._syncUplinksMetadata(name, info, {}, (err, info: Package): any => {\n if (_.isNil(err) === false) {\n return readStream.emit('error', err);\n }\n if (_.isNil(info._distfiles) || _.isNil(info._distfiles[filename])) {\n return readStream.emit('error', err404);\n }\n serveFile(info._distfiles[filename]);\n });\n }\n });\n });\n localStream.on('content-length', function (v): void {\n readStream.emit('content-length', v);\n });\n\n localStream.on('open', function (): void {\n isOpen = true;\n localStream.pipe(readStream);\n });\n return readStream;\n\n /**\n * Fetch and cache local/remote packages.\n * @param {Object} file define the package shape\n */\n function serveFile(file: DistFile): void {\n let uplink: any = null;\n\n for (const uplinkId in self.uplinks) {\n // https://github.com/verdaccio/verdaccio/issues/1642\n if (hasProxyTo(name, uplinkId, self.config.packages)) {\n uplink = self.uplinks[uplinkId];\n }\n }\n\n if (uplink == null) {\n uplink = new ProxyStorage(\n {\n url: file.url,\n cache: true,\n _autogenerated: true,\n },\n self.config\n );\n }\n\n let savestream: IUploadTarball | null = null;\n if (uplink.config.cache) {\n savestream = self.localStorage.addTarball(name, filename);\n }\n\n let on_open = function (): void {\n // prevent it from being called twice\n on_open = function () {};\n const rstream2 = uplink.fetchTarball(file.url);\n rstream2.on('error', function (err): void {\n if (savestream) {\n savestream.abort();\n }\n savestream = null;\n readStream.emit('error', err);\n });\n rstream2.on('end', function (): void {\n if (savestream) {\n savestream.done();\n }\n });\n\n rstream2.on('content-length', function (v): void {\n readStream.emit('content-length', v);\n if (savestream) {\n savestream.emit('content-length', v);\n }\n });\n rstream2.pipe(readStream);\n if (savestream) {\n rstream2.pipe(savestream);\n }\n };\n\n if (savestream) {\n savestream.on('open', function (): void {\n on_open();\n });\n\n savestream.on('error', function (err): void {\n self.logger.warn(\n { err: err, fileName: file },\n 'error saving file @{fileName}: @{err?.message}\\n@{err.stack}'\n );\n if (savestream) {\n savestream.abort();\n }\n savestream = null;\n on_open();\n });\n } else {\n on_open();\n }\n }\n }\n\n // public async starPackage(body: StarBody, options: IGetPackageOptionsNext): Promise<void> {\n // debug('star package');\n // const manifest = await this.getPackageNext(options);\n // const newStarUser = body[constants.USERS];\n // const remoteUsername: string = options.remoteUser.name as string;\n // const localStarUsers = manifest[constants.USERS];\n // // Check is star or unstar\n // const isStar = Object.keys(newStarUser).includes(remoteUsername);\n // debug('is start? %o', isStar);\n // if (\n // _.isNil(localStarUsers) === false &&\n // validateInputs(localStarUsers, remoteUsername, isStar)\n // ) {\n // // return afterChangePackage();\n // }\n // const users: Users = isStar\n // ? {\n // ...localStarUsers,\n // [remoteUsername]: true,\n // }\n // : _.reduce(\n // localStarUsers,\n // (users, value, key) => {\n // if (key !== remoteUsername) {\n // users[key] = value;\n // }\n // return users;\n // },\n // {}\n // );\n // debug('update package for %o', name);\n // }\n\n // public async publish(body: any, options: IGetPackageOptionsNext): Promise<any> {\n // const { name } = options;\n // debug('publishing or updating a new version for %o', name);\n // // we check if the request is npm star\n // if (!isPublishablePackage(body) && isObject(body.users)) {\n // debug('starting star a package');\n // await this.starPackage(body as StarBody, options);\n // }\n\n // return { ok: API_MESSAGE.PKG_CHANGED, success: true };\n // }\n\n public async getPackageByVersion(options: IGetPackageOptionsNext): Promise<Version> {\n const queryVersion = options.version as string;\n if (_.isNil(queryVersion)) {\n throw errorUtils.getNotFound(`${API_ERROR.VERSION_NOT_EXIST}: ${queryVersion}`);\n }\n\n // we have version, so we need to return specific version\n const [convertedManifest] = await this.getPackageNext(options);\n\n const version: Version | undefined = getVersion(convertedManifest.versions, queryVersion);\n\n debug('query by latest version %o and result %o', queryVersion, version);\n if (typeof version !== 'undefined') {\n debug('latest version found %o', version);\n return convertDistVersionToLocalTarballsUrl(\n convertedManifest.name,\n version,\n options.requestOptions,\n this.config.url_prefix\n );\n }\n\n // the version could be a dist-tag eg: beta, alpha, so we find the matched version\n // on disg-tag list\n if (_.isNil(convertedManifest[DIST_TAGS]) === false) {\n if (_.isNil(convertedManifest[DIST_TAGS][queryVersion]) === false) {\n // the version found as a distag\n const matchedDisTagVersion: string = convertedManifest[DIST_TAGS][queryVersion];\n debug('dist-tag version found %o', matchedDisTagVersion);\n const disTagVersion: Version | undefined = getVersion(\n convertedManifest.versions,\n matchedDisTagVersion\n );\n if (typeof disTagVersion !== 'undefined') {\n debug('dist-tag found %o', disTagVersion);\n return convertDistVersionToLocalTarballsUrl(\n convertedManifest.name,\n disTagVersion,\n options.requestOptions,\n this.config.url_prefix\n );\n }\n }\n } else {\n debug('dist tag not detected');\n }\n\n // we didn't find the version, not found error\n debug('package version not found %o', queryVersion);\n throw errorUtils.getNotFound(`${API_ERROR.VERSION_NOT_EXIST}: ${queryVersion}`);\n }\n\n public async getPackageManifest(options: IGetPackageOptionsNext): Promise<Package> {\n // convert dist remotes to local bars\n const [manifest] = await this.getPackageNext(options);\n const convertedManifest = convertDistRemoteToLocalTarballUrls(\n manifest,\n options.requestOptions,\n this.config.url_prefix\n );\n\n return convertedManifest;\n }\n\n /**\n * Return a manifest or version based on the options.\n * @param options {Object}\n * @returns A package manifest or specific version\n */\n public async getPackageByOptions(options: IGetPackageOptionsNext): Promise<Package | Version> {\n // if no version we return the whole manifest\n if (_.isNil(options.version) === false) {\n return this.getPackageByVersion(options);\n } else {\n return this.getPackageManifest(options);\n }\n }\n\n public async getPackageNext(options: IGetPackageOptionsNext): Promise<[Package, any[]]> {\n const { name } = options;\n debug('get package for %o', name);\n try {\n let data: Package;\n try {\n data = await this.localStorage.getPackageMetadataNext(name);\n } catch (err: any) {\n // we don't have package locally, so we need to fetch it from uplinks\n if (err && (!err.status || err.status >= HTTP_STATUS.INTERNAL_ERROR)) {\n throw err;\n }\n }\n\n // time to sync with uplinks if we have any\n debug('sync uplinks for %o', name);\n // @ts-expect-error\n return this._syncUplinksMetadataNext(name, data, {\n req: options.req,\n uplinksLook: options.uplinksLook,\n keepUpLinkData: options.keepUpLinkData,\n });\n } catch (err: any) {\n this.logger.error(\n { name, err: err.message },\n 'error on get package for @{name} with error @{err}'\n );\n throw err;\n }\n }\n\n private _syncUplinksMetadataNext(\n name: string,\n data: Package,\n { uplinksLook, keepUpLinkData, req }\n ): Promise<[Package, any[]]> {\n return new Promise((resolve, reject) => {\n this._syncUplinksMetadata(\n name,\n data,\n { req: req, uplinksLook },\n function getPackageSynUpLinksCallback(err, result: Package, uplinkErrors): void {\n if (err) {\n debug('error on sync package for %o with error %o', name, err?.message);\n return reject(err);\n }\n\n const normalizedPkg = Object.assign({}, result, {\n ...normalizeDistTags(cleanUpLinksRef(result, keepUpLinkData)),\n _attachments: {},\n });\n\n debug('no. sync uplinks errors %o for %s', uplinkErrors?.length, name);\n resolve([normalizedPkg, uplinkErrors]);\n }\n );\n });\n }\n\n /**\n Retrieve a package metadata for {name} package\n Function invokes localStorage.getPackage and uplink.get_package for every\n uplink with proxy_access rights against {name} and combines results\n into one json object\n Used storages: local && uplink (proxy_access)\n\n * @param {object} options\n * @property {string} options.name Package Name\n * @property {object} options.req Express `req` object\n * @property {boolean} options.keepUpLinkData keep up link info in package meta, last update, etc.\n * @property {function} options.callback Callback for receive data\n */\n public getPackage(options: IGetPackageOptions): void {\n const { name } = options;\n debug('get package for %o', name);\n this.localStorage.getPackageMetadata(name, (err, data) => {\n if (err && (!err.status || err.status >= HTTP_STATUS.INTERNAL_ERROR)) {\n // report internal errors right away\n debug('error on get package for %o with error %o', name, err?.message);\n return options.callback(err);\n }\n\n debug('sync uplinks for %o', name);\n this._syncUplinksMetadata(\n name,\n data,\n { req: options.req, uplinksLook: options.uplinksLook },\n function getPackageSynUpLinksCallback(err, result: Package, uplinkErrors): void {\n if (err) {\n debug('error on sync package for %o with error %o', name, err?.message);\n return options.callback(err);\n }\n\n result = normalizeDistTags(cleanUpLinksRef(result, options?.keepUpLinkData));\n\n // npm can throw if this field doesn't exist\n result._attachments = {};\n\n debug('no. sync uplinks errors %o', uplinkErrors?.length);\n options.callback(null, result, uplinkErrors);\n }\n );\n });\n }\n\n /**\n * Retrieve only private local packages\n * @param {*} callback\n */\n public getLocalDatabase(callback: Callback): void {\n const self = this;\n debug('get local database');\n if (this.localStorage.storagePlugin !== null) {\n this.localStorage.storagePlugin\n .get()\n .then((locals) => {\n const packages: Version[] = [];\n const getPackage = function (itemPkg): void {\n self.localStorage.getPackageMetadata(\n locals[itemPkg],\n function (err, pkgMetadata: Package): void {\n if (_.isNil(err)) {\n const latest = pkgMetadata[DIST_TAGS].latest;\n if (latest && pkgMetadata.versions[latest]) {\n const version: Version = pkgMetadata.versions[latest];\n const timeList = pkgMetadata.time as GenericBody;\n const time = timeList[latest];\n // @ts-ignore\n version.time = time;\n\n // Add for stars api\n // @ts-ignore\n version.users = pkgMetadata.users;\n\n packages.push(version);\n } else {\n self.logger.warn(\n { package: locals[itemPkg] },\n 'package @{package} does not have a \"latest\" tag?'\n );\n }\n }\n\n if (itemPkg >= locals.length - 1) {\n callback(null, packages);\n } else {\n getPackage(itemPkg + 1);\n }\n }\n );\n };\n\n if (locals.length) {\n getPackage(0);\n } else {\n callback(null, []);\n }\n })\n .catch((err) => {\n callback(err);\n });\n } else {\n debug('local stora instance is null');\n }\n }\n\n // notas, debo migrar _syncUplinksMetadata algo mas lindo\n\n /**\n * Function fetches package metadata from uplinks and synchronizes it with local data\n if package is available locally, it MUST be provided in pkginfo\n returns callback(err, result, uplink_errors)\n */\n public _syncUplinksMetadata(\n name: string,\n packageInfo: Package,\n options: ISyncUplinks,\n callback: Callback\n ): void {\n let found = true;\n const self = this;\n const upLinks: IProxy[] = [];\n const hasToLookIntoUplinks = _.isNil(options.uplinksLook) || options.uplinksLook;\n debug('is sync uplink enabled %o', hasToLookIntoUplinks);\n\n if (!packageInfo) {\n found = false;\n packageInfo = generatePackageTemplate(name);\n }\n\n for (const uplink in this.uplinks) {\n if (hasProxyTo(name, uplink, this.config.packages) && hasToLookIntoUplinks) {\n upLinks.push(this.uplinks[uplink]);\n }\n }\n\n debug('uplink list %o', upLinks.length);\n\n async.map(\n upLinks,\n (upLink, cb): void => {\n const _options = Object.assign({}, options);\n const upLinkMeta = packageInfo._uplinks[upLink.upname];\n\n if (validatioUtils.isObject(upLinkMeta)) {\n const fetched = upLinkMeta.fetched;\n\n if (fetched && Date.now() - fetched < upLink.maxage) {\n return cb();\n }\n\n _options.etag = upLinkMeta.etag;\n }\n\n upLink.getRemoteMetadata(name, _options, (err, upLinkResponse, eTag): void => {\n if (err && err.remoteStatus === 304) {\n upLinkMeta.fetched = Date.now();\n }\n\n if (err || !upLinkResponse) {\n return cb(null, [err || errorUtils.getInternalError('no data')]);\n }\n\n try {\n validatioUtils.validateMetadata(upLinkResponse, name);\n } catch (err: any) {\n self.logger.error(\n {\n sub: 'out',\n err: err,\n },\n 'package.json validating error @{!err?.message}\\n@{err.stack}'\n );\n return cb(null, [err]);\n }\n\n packageInfo._uplinks[upLink.upname] = {\n etag: eTag,\n fetched: Date.now(),\n };\n\n packageInfo.time = mergeUplinkTimeIntoLocal(packageInfo, upLinkResponse);\n\n updateVersionsHiddenUpLink(upLinkResponse.versions, upLink);\n\n try {\n pkgUtils.mergeVersions(packageInfo, upLinkResponse);\n } catch (err: any) {\n self.logger.error(\n {\n sub: 'out',\n err: err,\n },\n 'package.json parsing error @{!err?.message}\\n@{err.stack}'\n );\n return cb(null, [err]);\n }\n\n // if we got to this point, assume that the correct package exists\n // on the uplink\n found = true;\n cb();\n });\n },\n // @ts-ignore\n (err: Error, upLinksErrors: any): AsyncResultArrayCallback<unknown, Error> => {\n assert(!err && Array.isArray(upLinksErrors));\n\n // Check for connection timeout or reset errors with uplink(s)\n // (these should be handled differently from the package not being found)\n if (!found) {\n let uplinkTimeoutError;\n for (let i = 0; i < upLinksErrors.length; i++) {\n if (upLinksErrors[i]) {\n for (let j = 0; j < upLinksErrors[i].length; j++) {\n if (upLinksErrors[i][j]) {\n const code = upLinksErrors[i][j].code;\n if (code === 'ETIMEDOUT' || code === 'ESOCKETTIMEDOUT' || code === 'ECONNRESET') {\n uplinkTimeoutError = true;\n break;\n }\n }\n }\n }\n }\n\n if (uplinkTimeoutError) {\n return callback(errorUtils.getServiceUnavailable(), null, upLinksErrors);\n }\n return callback(errorUtils.getNotFound(API_ERROR.NO_PACKAGE), null, upLinksErrors);\n }\n\n if (upLinks.length === 0) {\n return callback(null, packageInfo);\n }\n\n self.localStorage.updateVersions(\n name,\n packageInfo,\n async (err, packageJsonLocal: Package): Promise<any> => {\n if (err) {\n return callback(err);\n }\n // Any error here will cause a 404, like an uplink error. This is likely\n // the right thing to do\n // as a broken filter is a security risk.\n const filterErrors: Error[] = [];\n // This MUST be done serially and not in parallel as they modify packageJsonLocal\n for (const filter of self.filters) {\n try {\n // These filters can assume it's save to modify packageJsonLocal\n // and return it directly for\n // performance (i.e. need not be pure)\n packageJsonLocal = await filter.filter_metadata(packageJsonLocal);\n } catch (err: any) {\n filterErrors.push(err);\n }\n }\n callback(null, packageJsonLocal, _.concat(upLinksErrors, filterErrors));\n }\n );\n }\n );\n }\n\n /**\n * Set a hidden value for each version.\n * @param {Array} versions list of version\n * @param {String} upLink uplink name\n * @private\n */\n public _updateVersionsHiddenUpLink(versions: Versions, upLink: IProxy): void {\n for (const i in versions) {\n if (Object.prototype.hasOwnProperty.call(versions, i)) {\n const version = versions[i];\n\n // holds a \"hidden\" value to be used by the package storage.\n // $FlowFixMe\n version[Symbol.for('__verdaccio_uplink')] = upLink.upname;\n }\n }\n }\n}\n\nexport { Storage };\n"],"file":"storage.js"}
package/build/type.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { Callback, Config, IPluginStorageFilter } from '@verdaccio/types';
1
+ import { Callback, Config, IPluginStorageFilter, RemoteUser } from '@verdaccio/types';
2
2
  export interface IGetPackageOptions {
3
3
  callback: Callback;
4
4
  name: string;
@@ -11,6 +11,7 @@ export declare type IGetPackageOptionsNext = {
11
11
  name: string;
12
12
  version?: string;
13
13
  keepUpLinkData?: boolean;
14
+ remoteUser?: RemoteUser;
14
15
  uplinksLook: boolean;
15
16
  requestOptions: {
16
17
  host: string;
@@ -25,4 +26,12 @@ export interface ISyncUplinks {
25
26
  etag?: string;
26
27
  req?: Request;
27
28
  }
29
+ export declare type Users = {
30
+ [key: string]: string;
31
+ };
32
+ export interface StarBody {
33
+ _id: string;
34
+ _rev: string;
35
+ users: Users;
36
+ }
28
37
  export declare type IPluginFilters = IPluginStorageFilter<Config>[];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@verdaccio/store",
3
- "version": "6.0.0-6-next.18",
3
+ "version": "6.0.0-6-next.21",
4
4
  "description": "loaders logic",
5
5
  "main": "./build/index.js",
6
6
  "types": "build/index.d.ts",
@@ -30,33 +30,29 @@
30
30
  "npm": ">=6"
31
31
  },
32
32
  "dependencies": {
33
- "@verdaccio/config": "6.0.0-6-next.12",
34
- "@verdaccio/core": "6.0.0-6-next.4",
35
- "@verdaccio/loaders": "6.0.0-6-next.9",
36
- "@verdaccio/local-storage": "11.0.0-6-next.11",
37
- "@verdaccio/logger": "6.0.0-6-next.9",
38
- "@verdaccio/proxy": "6.0.0-6-next.17",
33
+ "@verdaccio/config": "6.0.0-6-next.13",
34
+ "@verdaccio/core": "6.0.0-6-next.5",
35
+ "@verdaccio/loaders": "6.0.0-6-next.12",
36
+ "@verdaccio/local-storage": "11.0.0-6-next.12",
37
+ "@verdaccio/logger": "6.0.0-6-next.11",
38
+ "@verdaccio/proxy": "6.0.0-6-next.19",
39
39
  "@verdaccio/streams": "11.0.0-6-next.5",
40
- "@verdaccio/utils": "6.0.0-6-next.10",
41
- "@verdaccio/tarball": "11.0.0-6-next.11",
40
+ "@verdaccio/utils": "6.0.0-6-next.11",
41
+ "@verdaccio/tarball": "11.0.0-6-next.12",
42
42
  "JSONStream": "1.3.5",
43
- "abortcontroller-polyfill": "1.7.3",
44
43
  "async": "3.2.3",
45
44
  "debug": "4.3.3",
46
45
  "lodash": "4.17.21",
47
- "lunr": "2.3.9",
48
- "lunr-mutable-indexes": "2.3.2",
49
46
  "merge2": "1.4.1",
50
47
  "semver": "7.3.5"
51
48
  },
52
49
  "devDependencies": {
53
- "@types/node": "16.11.19",
54
- "@verdaccio/mock": "6.0.0-6-next.13",
55
- "@verdaccio/types": "11.0.0-6-next.10",
56
- "@verdaccio/helper": "1.0.0",
57
- "undici": "4.12.2",
50
+ "@types/node": "16.11.21",
51
+ "@verdaccio/mock": "6.0.0-6-next.14",
52
+ "@verdaccio/types": "11.0.0-6-next.11",
53
+ "@verdaccio/test-helper": "1.1.0-6-next.0",
54
+ "undici": "4.15.0",
58
55
  "nock": "13.2.2",
59
- "undici-fetch": "1.0.0-rc.4",
60
56
  "tmp-promise": "3.0.3",
61
57
  "node-mocks-http": "1.11.0"
62
58
  },
package/src/index.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  export * from './storage';
2
2
  export * from './storage-utils';
3
+ export * from './star-utils';
3
4
  export * from './search';
4
5
  export * from './type';