@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/CHANGELOG.md +41 -0
- package/build/index.d.ts +1 -0
- package/build/index.js +13 -0
- package/build/index.js.map +1 -1
- package/build/local-storage.d.ts +22 -1
- package/build/local-storage.js +240 -4
- package/build/local-storage.js.map +1 -1
- package/build/search.d.ts +0 -43
- package/build/search.js +31 -142
- package/build/search.js.map +1 -1
- package/build/star-utils.d.ts +9 -0
- package/build/star-utils.js +50 -0
- package/build/star-utils.js.map +1 -0
- package/build/storage-utils.d.ts +3 -1
- package/build/storage-utils.js +20 -5
- package/build/storage-utils.js.map +1 -1
- package/build/storage.d.ts +23 -1
- package/build/storage.js +149 -53
- package/build/storage.js.map +1 -1
- package/build/type.d.ts +10 -1
- package/package.json +14 -18
- package/src/index.ts +1 -0
- package/src/local-storage.ts +255 -4
- package/src/search.ts +21 -124
- package/src/star-utils.ts +38 -0
- package/src/storage-utils.ts +21 -6
- package/src/storage.ts +188 -62
- package/src/type.ts +11 -1
- package/test/search.spec.ts +2 -66
- package/test/storage-utils.spec.ts +95 -1
- package/test/storage.spec.ts +7 -7
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
|
-
|
|
43
|
-
|
|
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);
|
|
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
|
-
|
|
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
|
});
|
package/build/storage.js.map
CHANGED
|
@@ -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":"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","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":";;;;;;;AAAA;;AACA;;AACA;;AACA;;AAEA;;AACA;;AAQA;;AACA;;AAEA;;AACA;;AAqBA;;AAEA;;AACA;;AAEA;;AAUA;;;;AAXA;AAUA;AAGA,MAAMA,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;AAED;AACF;AACA;AACA;AACA;AACA;;;AAC6B,QAAdC,cAAc,CAACP,IAAD,EAAeC,QAAf,EAAoD;AAC7E,QAAI;AACFnB,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,CATE,CAUF;AACA;;AACA,YAAM,kCAAeA,IAAf,EAAqBC,QAArB,EAA+B,KAAKR,YAApC,CAAN;AACA,aAAOQ,QAAP;AACD,KAdD,CAcE,OAAOK,GAAP,EAAiB;AACjBxB,MAAAA,KAAK,CAAC,6CAAD,EAAgDkB,IAAhD,EAAsDM,GAAtD,CAAL;AACA,YAAMA,GAAN;AACD;AACF;;AAEOH,EAAAA,sBAAsB,GAAY;AACxC,WACE,OAAO,KAAKlB,MAAL,CAAYuB,OAAnB,KAA+B,WAA/B,IACAC,gBAAEC,SAAF,CAAY,KAAKzB,MAAL,CAAYuB,OAAZ,CAAoBG,aAAhC,CADA,IAEA,KAAK1B,MAAL,CAAYuB,OAAZ,CAAoBG,aAHtB;AAKD;;AAEMC,EAAAA,UAAU,CAACC,MAAD,EAAwC;AACvD,WAAO,KAAKpB,YAAL,CAAkBmB,UAAlB,CAA6BC,MAA7B,CAAP;AACD;;AAEMC,EAAAA,SAAS,CAACC,KAAD,EAA8B;AAC5C,WAAO,KAAKtB,YAAL,CAAkBqB,SAAlB,CAA4BC,KAA5B,CAAP;AACD;;AAEMC,EAAAA,WAAW,CAACC,IAAD,EAAeC,QAAf,EAA+C;AAC/D,WAAO,KAAKzB,YAAL,CAAkBuB,WAAlB,CAA8BC,IAA9B,EAAoCC,QAApC,CAAP;AACD;AAED;AACF;AACA;AACA;;;AACSC,EAAAA,UAAU,CACfnB,IADe,EAEfoB,OAFe,EAGfnB,QAHe,EAIfoB,GAJe,EAKfnB,QALe,EAMT;AACNpB,IAAAA,KAAK,CAAC,mCAAD,EAAsCsC,OAAtC,EAA+CpB,IAA/C,CAAL;AACA,SAAKP,YAAL,CAAkB0B,UAAlB,CAA6BnB,IAA7B,EAAmCoB,OAAnC,EAA4CnB,QAA5C,EAAsDoB,GAAtD,EAA2DnB,QAA3D;AACD;;AAE0B,QAAdoB,cAAc,CACzBtB,IADyB,EAEzBoB,OAFyB,EAGzBnB,QAHyB,EAIzBoB,GAJyB,EAKV;AACfvC,IAAAA,KAAK,CAAC,mCAAD,EAAsCsC,OAAtC,EAA+CpB,IAA/C,CAAL;AACA,WAAO,KAAKP,YAAL,CAAkB6B,cAAlB,CAAiCtB,IAAjC,EAAuCoB,OAAvC,EAAgDnB,QAAhD,EAA0DoB,GAA1D,CAAP;AACD;AAED;AACF;AACA;AACA;;;AACSE,EAAAA,SAAS,CAACvB,IAAD,EAAewB,OAAf,EAAmCtB,QAAnC,EAAmE;AACjFpB,IAAAA,KAAK,CAAC,mCAAD,EAAsCkB,IAAtC,EAA4CwB,OAA5C,CAAL;AACA,SAAK/B,YAAL,CAAkB8B,SAAlB,CAA4BvB,IAA5B,EAAkCwB,OAAlC,EAA2CtB,QAA3C;AACD;AAED;AACF;AACA;AACA;AACA;;;AACSuB,EAAAA,aAAa,CAClBzB,IADkB,EAElBC,QAFkB,EAGlByB,QAHkB,EAIlBxB,QAJkB,EAKZ;AACNpB,IAAAA,KAAK,CAAC,oDAAD,EAAuDkB,IAAvD,EAA6D0B,QAA7D,CAAL;AACA,SAAKjC,YAAL,CAAkBgC,aAAlB,CAAgCzB,IAAhC,EAAsCC,QAAtC,EAAgDyB,QAAhD,EAA0DxB,QAA1D;AACD;AAED;AACF;AACA;AACA;AACA;;;AACgC,QAAjByB,iBAAiB,CAAC3B,IAAD,EAAeC,QAAf,EAAkCyB,QAAlC,EAAmE;AAC/F5C,IAAAA,KAAK,CAAC,oDAAD,EAAuDkB,IAAvD,EAA6D0B,QAA7D,CAAL;AACA,SAAKjC,YAAL,CAAkBkC,iBAAlB,CAAoC3B,IAApC,EAA0CC,QAA1C,EAAoDyB,QAApD;AACD;AAED;AACF;AACA;AACA;AACA;;;AAC4B,QAAbE,aAAa,CAAC5B,IAAD,EAA8B;AACtDlB,IAAAA,KAAK,CAAC,8BAAD,EAAiCkB,IAAjC,CAAL;AACA,UAAM,KAAKP,YAAL,CAAkBmC,aAAlB,CAAgC5B,IAAhC,CAAN;AACD;AAED;AACF;AACA;AACA;AACA;AACA;AACA;;;AACS6B,EAAAA,aAAa,CAClB7B,IADkB,EAElB8B,QAFkB,EAGlBJ,QAHkB,EAIlBxB,QAJkB,EAKZ;AACN,SAAKT,YAAL,CAAkBoC,aAAlB,CAAgC7B,IAAhC,EAAsC8B,QAAtC,EAAgDJ,QAAhD,EAA0DxB,QAA1D;AACD;AAED;AACF;AACA;AACA;AACA;;;AACS6B,EAAAA,UAAU,CAAC/B,IAAD,EAAe8B,QAAf,EAAiD;AAChEhD,IAAAA,KAAK,CAAC,4BAAD,EAA+BkB,IAA/B,CAAL;AACA,WAAO,KAAKP,YAAL,CAAkBsC,UAAlB,CAA6B/B,IAA7B,EAAmC8B,QAAnC,CAAP;AACD;AAED;AACF;AACA;AACA;AACA;AACA;AACA;;;AACSE,EAAAA,UAAU,CAAChC,IAAD,EAAe8B,QAAf,EAA+C;AAC9DhD,IAAAA,KAAK,CAAC,wCAAD,EAA2CkB,IAA3C,EAAiD8B,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,CAAC3C,YAAL,CAAkBuC,UAAlB,CAA6BhC,IAA7B,EAAmC8B,QAAnC,CAAvB;AACA,QAAIQ,MAAM,GAAG,KAAb;AACAD,IAAAA,WAAW,CAACE,EAAZ,CAAe,OAAf,EAAyBjC,GAAD,IAAc;AACpC,UAAIgC,MAAM,IAAIhC,GAAG,CAACkC,MAAJ,KAAeC,kBAAYC,SAAzC,EAAoD;AAClD,eAAOT,UAAU,CAACU,IAAX,CAAgB,OAAhB,EAAyBrC,GAAzB,CAAP;AACD,OAHmC,CAKpC;;;AACA,YAAMsC,MAAM,GAAGtC,GAAf;AACA+B,MAAAA,WAAW,CAACF,KAAZ;AACAE,MAAAA,WAAW,GAAG,IAAd,CARoC,CAQhB;;AACpBD,MAAAA,IAAI,CAAC3C,YAAL,CAAkBoD,kBAAlB,CAAqC7C,IAArC,EAA2C,CAACM,GAAD,EAAMwC,IAAN,KAA8B;AACvE,YAAIrC,gBAAEsC,KAAF,CAAQzC,GAAR,KAAgBwC,IAAI,CAACE,UAArB,IAAmCvC,gBAAEsC,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,CAAChC,oBAAL,CAA0BJ,IAA1B,EAAgC8C,IAAhC,EAAsC,EAAtC,EAA0C,CAACxC,GAAD,EAAMwC,IAAN,KAA6B;AACrE,gBAAIrC,gBAAEsC,KAAF,CAAQzC,GAAR,MAAiB,KAArB,EAA4B;AAC1B,qBAAO2B,UAAU,CAACU,IAAX,CAAgB,OAAhB,EAAyBrC,GAAzB,CAAP;AACD;;AACD,gBAAIG,gBAAEsC,KAAF,CAAQD,IAAI,CAACE,UAAb,KAA4BvC,gBAAEsC,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,CAAClD,OAA5B,EAAqC;AACnC;AACA,YAAI,wBAAWc,IAAX,EAAiBsD,QAAjB,EAA2BlB,IAAI,CAACnD,MAAL,CAAYsE,QAAvC,CAAJ,EAAsD;AACpDF,UAAAA,MAAM,GAAGjB,IAAI,CAAClD,OAAL,CAAaoE,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,CAACnD,MANE,CAAT;AAQD;;AAED,UAAI2E,UAAiC,GAAG,IAAxC;;AACA,UAAIP,MAAM,CAACpE,MAAP,CAAcyE,KAAlB,EAAyB;AACvBE,QAAAA,UAAU,GAAGxB,IAAI,CAAC3C,YAAL,CAAkBsC,UAAlB,CAA6B/B,IAA7B,EAAmC8B,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,UAAUjC,GAAV,EAAqB;AACxC,cAAIsD,UAAJ,EAAgB;AACdA,YAAAA,UAAU,CAACzB,KAAX;AACD;;AACDyB,UAAAA,UAAU,GAAG,IAAb;AACA3B,UAAAA,UAAU,CAACU,IAAX,CAAgB,OAAhB,EAAyBrC,GAAzB;AACD,SAND;AAOAwD,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,UAAUjC,GAAV,EAAqB;AAC1C8B,UAAAA,IAAI,CAAC/C,MAAL,CAAY4E,IAAZ,CACE;AAAE3D,YAAAA,GAAG,EAAEA,GAAP;AAAY4D,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,GApVW,CAsVZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;;;AAEgC,QAAnBM,mBAAmB,CAACC,OAAD,EAAoD;AAClF,UAAMC,YAAY,GAAGD,OAAO,CAAChD,OAA7B;;AACA,QAAIX,gBAAEsC,KAAF,CAAQsB,YAAR,CAAJ,EAA2B;AACzB,YAAMC,iBAAWC,WAAX,CAAwB,GAAEC,gBAAUC,iBAAkB,KAAIJ,YAAa,EAAvE,CAAN;AACD,KAJiF,CAMlF;;;AACA,UAAM,CAACK,iBAAD,IAAsB,MAAM,KAAKC,cAAL,CAAoBP,OAApB,CAAlC;AAEA,UAAMhD,OAA4B,GAAG,uBAAWsD,iBAAiB,CAACE,QAA7B,EAAuCP,YAAvC,CAArC;AAEAvF,IAAAA,KAAK,CAAC,0CAAD,EAA6CuF,YAA7C,EAA2DjD,OAA3D,CAAL;;AACA,QAAI,OAAOA,OAAP,KAAmB,WAAvB,EAAoC;AAClCtC,MAAAA,KAAK,CAAC,yBAAD,EAA4BsC,OAA5B,CAAL;AACA,aAAO,mDACLsD,iBAAiB,CAAC1E,IADb,EAELoB,OAFK,EAGLgD,OAAO,CAACS,cAHH,EAIL,KAAK5F,MAAL,CAAY6F,UAJP,CAAP;AAMD,KApBiF,CAsBlF;AACA;;;AACA,QAAIrE,gBAAEsC,KAAF,CAAQ2B,iBAAiB,CAACK,eAAD,CAAzB,MAA0C,KAA9C,EAAqD;AACnD,UAAItE,gBAAEsC,KAAF,CAAQ2B,iBAAiB,CAACK,eAAD,CAAjB,CAA6BV,YAA7B,CAAR,MAAwD,KAA5D,EAAmE;AACjE;AACA,cAAMW,oBAA4B,GAAGN,iBAAiB,CAACK,eAAD,CAAjB,CAA6BV,YAA7B,CAArC;AACAvF,QAAAA,KAAK,CAAC,2BAAD,EAA8BkG,oBAA9B,CAAL;AACA,cAAMC,aAAkC,GAAG,uBACzCP,iBAAiB,CAACE,QADuB,EAEzCI,oBAFyC,CAA3C;;AAIA,YAAI,OAAOC,aAAP,KAAyB,WAA7B,EAA0C;AACxCnG,UAAAA,KAAK,CAAC,mBAAD,EAAsBmG,aAAtB,CAAL;AACA,iBAAO,mDACLP,iBAAiB,CAAC1E,IADb,EAELiF,aAFK,EAGLb,OAAO,CAACS,cAHH,EAIL,KAAK5F,MAAL,CAAY6F,UAJP,CAAP;AAMD;AACF;AACF,KAnBD,MAmBO;AACLhG,MAAAA,KAAK,CAAC,uBAAD,CAAL;AACD,KA7CiF,CA+ClF;;;AACAA,IAAAA,KAAK,CAAC,8BAAD,EAAiCuF,YAAjC,CAAL;AACA,UAAMC,iBAAWC,WAAX,CAAwB,GAAEC,gBAAUC,iBAAkB,KAAIJ,YAAa,EAAvE,CAAN;AACD;;AAE8B,QAAlBa,kBAAkB,CAACd,OAAD,EAAoD;AACjF;AACA,UAAM,CAACe,QAAD,IAAa,MAAM,KAAKR,cAAL,CAAoBP,OAApB,CAAzB;AACA,UAAMM,iBAAiB,GAAG,kDACxBS,QADwB,EAExBf,OAAO,CAACS,cAFgB,EAGxB,KAAK5F,MAAL,CAAY6F,UAHY,CAA1B;AAMA,WAAOJ,iBAAP;AACD;AAED;AACF;AACA;AACA;AACA;;;AACkC,QAAnBU,mBAAmB,CAAChB,OAAD,EAA8D;AAC5F;AACA,QAAI3D,gBAAEsC,KAAF,CAAQqB,OAAO,CAAChD,OAAhB,MAA6B,KAAjC,EAAwC;AACtC,aAAO,KAAK+C,mBAAL,CAAyBC,OAAzB,CAAP;AACD,KAFD,MAEO;AACL,aAAO,KAAKc,kBAAL,CAAwBd,OAAxB,CAAP;AACD;AACF;;AAE0B,QAAdO,cAAc,CAACP,OAAD,EAA6D;AACtF,UAAM;AAAEpE,MAAAA;AAAF,QAAWoE,OAAjB;AACAtF,IAAAA,KAAK,CAAC,oBAAD,EAAuBkB,IAAvB,CAAL;;AACA,QAAI;AACF,UAAIqF,IAAJ;;AACA,UAAI;AACFA,QAAAA,IAAI,GAAG,MAAM,KAAK5F,YAAL,CAAkB6F,sBAAlB,CAAyCtF,IAAzC,CAAb;AACD,OAFD,CAEE,OAAOM,GAAP,EAAiB;AACjB;AACA,YAAIA,GAAG,KAAK,CAACA,GAAG,CAACkC,MAAL,IAAelC,GAAG,CAACkC,MAAJ,IAAcC,kBAAY8C,cAA9C,CAAP,EAAsE;AACpE,gBAAMjF,GAAN;AACD;AACF,OATC,CAWF;;;AACAxB,MAAAA,KAAK,CAAC,qBAAD,EAAwBkB,IAAxB,CAAL,CAZE,CAaF;;AACA,aAAO,KAAKwF,wBAAL,CAA8BxF,IAA9B,EAAoCqF,IAApC,EAA0C;AAC/CI,QAAAA,GAAG,EAAErB,OAAO,CAACqB,GADkC;AAE/CC,QAAAA,WAAW,EAAEtB,OAAO,CAACsB,WAF0B;AAG/CC,QAAAA,cAAc,EAAEvB,OAAO,CAACuB;AAHuB,OAA1C,CAAP;AAKD,KAnBD,CAmBE,OAAOrF,GAAP,EAAiB;AACjB,WAAKjB,MAAL,CAAYuG,KAAZ,CACE;AAAE5F,QAAAA,IAAF;AAAQM,QAAAA,GAAG,EAAEA,GAAG,CAACuF;AAAjB,OADF,EAEE,oDAFF;AAIA,YAAMvF,GAAN;AACD;AACF;;AAEOkF,EAAAA,wBAAwB,CAC9BxF,IAD8B,EAE9BqF,IAF8B,EAG9B;AAAEK,IAAAA,WAAF;AAAeC,IAAAA,cAAf;AAA+BF,IAAAA;AAA/B,GAH8B,EAIH;AAC3B,WAAO,IAAIK,OAAJ,CAAY,CAACC,OAAD,EAAUC,MAAV,KAAqB;AACtC,WAAK5F,oBAAL,CACEJ,IADF,EAEEqF,IAFF,EAGE;AAAEI,QAAAA,GAAG,EAAEA,GAAP;AAAYC,QAAAA;AAAZ,OAHF,EAIE,SAASO,4BAAT,CAAsC3F,GAAtC,EAA2C4F,MAA3C,EAA4DC,YAA5D,EAAgF;AAC9E,YAAI7F,GAAJ,EAAS;AACPxB,UAAAA,KAAK,CAAC,4CAAD,EAA+CkB,IAA/C,EAAqDM,GAArD,aAAqDA,GAArD,uBAAqDA,GAAG,CAAEuF,OAA1D,CAAL;AACA,iBAAOG,MAAM,CAAC1F,GAAD,CAAb;AACD;;AAED,cAAM8F,aAAa,GAAGjH,MAAM,CAACkH,MAAP,CAAc,EAAd,EAAkBH,MAAlB,EAA0B,EAC9C,GAAG,8BAAkB,mCAAgBA,MAAhB,EAAwBP,cAAxB,CAAlB,CAD2C;AAE9CW,UAAAA,YAAY,EAAE;AAFgC,SAA1B,CAAtB;AAKAxH,QAAAA,KAAK,CAAC,mCAAD,EAAsCqH,YAAtC,aAAsCA,YAAtC,uBAAsCA,YAAY,CAAEI,MAApD,EAA4DvG,IAA5D,CAAL;AACA+F,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;;;AAESK,EAAAA,UAAU,CAACpC,OAAD,EAAoC;AACnD,UAAM;AAAEpE,MAAAA;AAAF,QAAWoE,OAAjB;AACAtF,IAAAA,KAAK,CAAC,oBAAD,EAAuBkB,IAAvB,CAAL;AACA,SAAKP,YAAL,CAAkBoD,kBAAlB,CAAqC7C,IAArC,EAA2C,CAACM,GAAD,EAAM+E,IAAN,KAAe;AACxD,UAAI/E,GAAG,KAAK,CAACA,GAAG,CAACkC,MAAL,IAAelC,GAAG,CAACkC,MAAJ,IAAcC,kBAAY8C,cAA9C,CAAP,EAAsE;AACpE;AACAzG,QAAAA,KAAK,CAAC,2CAAD,EAA8CkB,IAA9C,EAAoDM,GAApD,aAAoDA,GAApD,uBAAoDA,GAAG,CAAEuF,OAAzD,CAAL;AACA,eAAOzB,OAAO,CAAClE,QAAR,CAAiBI,GAAjB,CAAP;AACD;;AAEDxB,MAAAA,KAAK,CAAC,qBAAD,EAAwBkB,IAAxB,CAAL;;AACA,WAAKI,oBAAL,CACEJ,IADF,EAEEqF,IAFF,EAGE;AAAEI,QAAAA,GAAG,EAAErB,OAAO,CAACqB,GAAf;AAAoBC,QAAAA,WAAW,EAAEtB,OAAO,CAACsB;AAAzC,OAHF,EAIE,SAASO,4BAAT,CAAsC3F,GAAtC,EAA2C4F,MAA3C,EAA4DC,YAA5D,EAAgF;AAC9E,YAAI7F,GAAJ,EAAS;AACPxB,UAAAA,KAAK,CAAC,4CAAD,EAA+CkB,IAA/C,EAAqDM,GAArD,aAAqDA,GAArD,uBAAqDA,GAAG,CAAEuF,OAA1D,CAAL;AACA,iBAAOzB,OAAO,CAAClE,QAAR,CAAiBI,GAAjB,CAAP;AACD;;AAED4F,QAAAA,MAAM,GAAG,8BAAkB,mCAAgBA,MAAhB,EAAwB9B,OAAxB,aAAwBA,OAAxB,uBAAwBA,OAAO,CAAEuB,cAAjC,CAAlB,CAAT,CAN8E,CAQ9E;;AACAO,QAAAA,MAAM,CAACI,YAAP,GAAsB,EAAtB;AAEAxH,QAAAA,KAAK,CAAC,4BAAD,EAA+BqH,YAA/B,aAA+BA,YAA/B,uBAA+BA,YAAY,CAAEI,MAA7C,CAAL;AACAnC,QAAAA,OAAO,CAAClE,QAAR,CAAiB,IAAjB,EAAuBgG,MAAvB,EAA+BC,YAA/B;AACD,OAjBH;AAmBD,KA3BD;AA4BD;AAED;AACF;AACA;AACA;;;AACSM,EAAAA,gBAAgB,CAACvG,QAAD,EAA2B;AAChD,UAAMkC,IAAI,GAAG,IAAb;AACAtD,IAAAA,KAAK,CAAC,oBAAD,CAAL;;AACA,QAAI,KAAKW,YAAL,CAAkBiH,aAAlB,KAAoC,IAAxC,EAA8C;AAC5C,WAAKjH,YAAL,CAAkBiH,aAAlB,CACGC,GADH,GAEGC,IAFH,CAESC,MAAD,IAAY;AAChB,cAAMtD,QAAmB,GAAG,EAA5B;;AACA,cAAMiD,UAAU,GAAG,UAAUM,OAAV,EAAyB;AAC1C1E,UAAAA,IAAI,CAAC3C,YAAL,CAAkBoD,kBAAlB,CACEgE,MAAM,CAACC,OAAD,CADR,EAEE,UAAUxG,GAAV,EAAeyG,WAAf,EAA2C;AACzC,gBAAItG,gBAAEsC,KAAF,CAAQzC,GAAR,CAAJ,EAAkB;AAChB,oBAAM0G,MAAM,GAAGD,WAAW,CAAChC,eAAD,CAAX,CAAuBiC,MAAtC;;AACA,kBAAIA,MAAM,IAAID,WAAW,CAACnC,QAAZ,CAAqBoC,MAArB,CAAd,EAA4C;AAC1C,sBAAM5F,OAAgB,GAAG2F,WAAW,CAACnC,QAAZ,CAAqBoC,MAArB,CAAzB;AACA,sBAAMC,QAAQ,GAAGF,WAAW,CAACG,IAA7B;AACA,sBAAMA,IAAI,GAAGD,QAAQ,CAACD,MAAD,CAArB,CAH0C,CAI1C;;AACA5F,gBAAAA,OAAO,CAAC8F,IAAR,GAAeA,IAAf,CAL0C,CAO1C;AACA;;AACA9F,gBAAAA,OAAO,CAAC+F,KAAR,GAAgBJ,WAAW,CAACI,KAA5B;AAEA5D,gBAAAA,QAAQ,CAAC6D,IAAT,CAAchG,OAAd;AACD,eAZD,MAYO;AACLgB,gBAAAA,IAAI,CAAC/C,MAAL,CAAY4E,IAAZ,CACE;AAAEoD,kBAAAA,OAAO,EAAER,MAAM,CAACC,OAAD;AAAjB,iBADF,EAEE,kDAFF;AAID;AACF;;AAED,gBAAIA,OAAO,IAAID,MAAM,CAACN,MAAP,GAAgB,CAA/B,EAAkC;AAChCrG,cAAAA,QAAQ,CAAC,IAAD,EAAOqD,QAAP,CAAR;AACD,aAFD,MAEO;AACLiD,cAAAA,UAAU,CAACM,OAAO,GAAG,CAAX,CAAV;AACD;AACF,WA9BH;AAgCD,SAjCD;;AAmCA,YAAID,MAAM,CAACN,MAAX,EAAmB;AACjBC,UAAAA,UAAU,CAAC,CAAD,CAAV;AACD,SAFD,MAEO;AACLtG,UAAAA,QAAQ,CAAC,IAAD,EAAO,EAAP,CAAR;AACD;AACF,OA5CH,EA6CGoH,KA7CH,CA6CUhH,GAAD,IAAS;AACdJ,QAAAA,QAAQ,CAACI,GAAD,CAAR;AACD,OA/CH;AAgDD,KAjDD,MAiDO;AACLxB,MAAAA,KAAK,CAAC,8BAAD,CAAL;AACD;AACF,GArnBW,CAunBZ;;AAEA;AACF;AACA;AACA;AACA;;;AACSsB,EAAAA,oBAAoB,CACzBJ,IADyB,EAEzBuH,WAFyB,EAGzBnD,OAHyB,EAIzBlE,QAJyB,EAKnB;AACN,QAAIsH,KAAK,GAAG,IAAZ;AACA,UAAMpF,IAAI,GAAG,IAAb;AACA,UAAMqF,OAAiB,GAAG,EAA1B;AACA,UAAMC,oBAAoB,GAAGjH,gBAAEsC,KAAF,CAAQqB,OAAO,CAACsB,WAAhB,KAAgCtB,OAAO,CAACsB,WAArE;AACA5G,IAAAA,KAAK,CAAC,2BAAD,EAA8B4I,oBAA9B,CAAL;;AAEA,QAAI,CAACH,WAAL,EAAkB;AAChBC,MAAAA,KAAK,GAAG,KAAR;AACAD,MAAAA,WAAW,GAAG,2CAAwBvH,IAAxB,CAAd;AACD;;AAED,SAAK,MAAMqD,MAAX,IAAqB,KAAKnE,OAA1B,EAAmC;AACjC,UAAI,wBAAWc,IAAX,EAAiBqD,MAAjB,EAAyB,KAAKpE,MAAL,CAAYsE,QAArC,KAAkDmE,oBAAtD,EAA4E;AAC1ED,QAAAA,OAAO,CAACL,IAAR,CAAa,KAAKlI,OAAL,CAAamE,MAAb,CAAb;AACD;AACF;;AAEDvE,IAAAA,KAAK,CAAC,gBAAD,EAAmB2I,OAAO,CAAClB,MAA3B,CAAL;;AAEAoB,mBAAMC,GAAN,CACEH,OADF,EAEE,CAACI,MAAD,EAASC,EAAT,KAAsB;AACpB,YAAMC,QAAQ,GAAG5I,MAAM,CAACkH,MAAP,CAAc,EAAd,EAAkBjC,OAAlB,CAAjB;;AACA,YAAM4D,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,CAAyB1I,IAAzB,EAA+B+H,QAA/B,EAAyC,CAACzH,GAAD,EAAMqI,cAAN,EAAsBC,IAAtB,KAAqC;AAC5E,YAAItI,GAAG,IAAIA,GAAG,CAACuI,YAAJ,KAAqB,GAAhC,EAAqC;AACnCb,UAAAA,UAAU,CAACK,OAAX,GAAqBC,IAAI,CAACC,GAAL,EAArB;AACD;;AAED,YAAIjI,GAAG,IAAI,CAACqI,cAAZ,EAA4B;AAC1B,iBAAOb,EAAE,CAAC,IAAD,EAAO,CAACxH,GAAG,IAAIgE,iBAAWwE,gBAAX,CAA4B,SAA5B,CAAR,CAAP,CAAT;AACD;;AAED,YAAI;AACFX,+BAAeY,gBAAf,CAAgCJ,cAAhC,EAAgD3I,IAAhD;AACD,SAFD,CAEE,OAAOM,GAAP,EAAiB;AACjB8B,UAAAA,IAAI,CAAC/C,MAAL,CAAYuG,KAAZ,CACE;AACEoD,YAAAA,GAAG,EAAE,KADP;AAEE1I,YAAAA,GAAG,EAAEA;AAFP,WADF,EAKE,8DALF;AAOA,iBAAOwH,EAAE,CAAC,IAAD,EAAO,CAACxH,GAAD,CAAP,CAAT;AACD;;AAEDiH,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,CAAC/D,QAA1C,EAAoDiD,MAApD;;AAEA,YAAI;AACFoB,yBAASC,aAAT,CAAuB3B,WAAvB,EAAoCoB,cAApC;AACD,SAFD,CAEE,OAAOrI,GAAP,EAAiB;AACjB8B,UAAAA,IAAI,CAAC/C,MAAL,CAAYuG,KAAZ,CACE;AACEoD,YAAAA,GAAG,EAAE,KADP;AAEE1I,YAAAA,GAAG,EAAEA;AAFP,WADF,EAKE,2DALF;AAOA,iBAAOwH,EAAE,CAAC,IAAD,EAAO,CAACxH,GAAD,CAAP,CAAT;AACD,SA1C2E,CA4C5E;AACA;;;AACAkH,QAAAA,KAAK,GAAG,IAAR;AACAM,QAAAA,EAAE;AACH,OAhDD;AAiDD,KAjEH,EAkEE;AACA,KAACxH,GAAD,EAAa6I,aAAb,KAA8E;AAC5E,2BAAO,CAAC7I,GAAD,IAAQ8I,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,CAAC5C,MAAlC,EAA0CgD,CAAC,EAA3C,EAA+C;AAC7C,cAAIJ,aAAa,CAACI,CAAD,CAAjB,EAAsB;AACpB,iBAAK,IAAIC,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAGL,aAAa,CAACI,CAAD,CAAb,CAAiBhD,MAArC,EAA6CiD,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,iBAAOpJ,QAAQ,CAACoE,iBAAWoF,qBAAX,EAAD,EAAqC,IAArC,EAA2CP,aAA3C,CAAf;AACD;;AACD,eAAOjJ,QAAQ,CAACoE,iBAAWC,WAAX,CAAuBC,gBAAUmF,UAAjC,CAAD,EAA+C,IAA/C,EAAqDR,aAArD,CAAf;AACD;;AAED,UAAI1B,OAAO,CAAClB,MAAR,KAAmB,CAAvB,EAA0B;AACxB,eAAOrG,QAAQ,CAAC,IAAD,EAAOqH,WAAP,CAAf;AACD;;AAEDnF,MAAAA,IAAI,CAAC3C,YAAL,CAAkBmK,cAAlB,CACE5J,IADF,EAEEuH,WAFF,EAGE,OAAOjH,GAAP,EAAYuJ,gBAAZ,KAAwD;AACtD,YAAIvJ,GAAJ,EAAS;AACP,iBAAOJ,QAAQ,CAACI,GAAD,CAAf;AACD,SAHqD,CAItD;AACA;AACA;;;AACA,cAAMwJ,YAAqB,GAAG,EAA9B,CAPsD,CAQtD;;AACA,aAAK,MAAMjJ,MAAX,IAAqBuB,IAAI,CAAC5C,OAA1B,EAAmC;AACjC,cAAI;AACF;AACA;AACA;AACAqK,YAAAA,gBAAgB,GAAG,MAAMhJ,MAAM,CAACkJ,eAAP,CAAuBF,gBAAvB,CAAzB;AACD,WALD,CAKE,OAAOvJ,GAAP,EAAiB;AACjBwJ,YAAAA,YAAY,CAAC1C,IAAb,CAAkB9G,GAAlB;AACD;AACF;;AACDJ,QAAAA,QAAQ,CAAC,IAAD,EAAO2J,gBAAP,EAAyBpJ,gBAAEuJ,MAAF,CAASb,aAAT,EAAwBW,YAAxB,CAAzB,CAAR;AACD,OAvBH;AAyBD,KA3HH;AA6HD;AAED;AACF;AACA;AACA;AACA;AACA;;;AACSG,EAAAA,2BAA2B,CAACrF,QAAD,EAAqBiD,MAArB,EAA2C;AAC3E,SAAK,MAAM0B,CAAX,IAAgB3E,QAAhB,EAA0B;AACxB,UAAIzF,MAAM,CAAC+K,SAAP,CAAiBC,cAAjB,CAAgCC,IAAhC,CAAqCxF,QAArC,EAA+C2E,CAA/C,CAAJ,EAAuD;AACrD,cAAMnI,OAAO,GAAGwD,QAAQ,CAAC2E,CAAD,CAAxB,CADqD,CAGrD;AACA;;AACAnI,QAAAA,OAAO,CAACiJ,MAAM,CAACC,GAAP,CAAW,oBAAX,CAAD,CAAP,GAA4CzC,MAAM,CAACK,MAAnD;AACD;AACF;AACF;;AAtyBW","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.
|
|
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.
|
|
34
|
-
"@verdaccio/core": "6.0.0-6-next.
|
|
35
|
-
"@verdaccio/loaders": "6.0.0-6-next.
|
|
36
|
-
"@verdaccio/local-storage": "11.0.0-6-next.
|
|
37
|
-
"@verdaccio/logger": "6.0.0-6-next.
|
|
38
|
-
"@verdaccio/proxy": "6.0.0-6-next.
|
|
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.
|
|
41
|
-
"@verdaccio/tarball": "11.0.0-6-next.
|
|
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.
|
|
54
|
-
"@verdaccio/mock": "6.0.0-6-next.
|
|
55
|
-
"@verdaccio/types": "11.0.0-6-next.
|
|
56
|
-
"@verdaccio/helper": "1.0.0",
|
|
57
|
-
"undici": "4.
|
|
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
|
},
|