@verdaccio/store 8.0.0-next-8.12 → 8.0.0-next-8.13
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/README.md +65 -27
- package/build/lib/storage-utils.d.ts +7 -2
- package/build/lib/storage-utils.js +2 -2
- package/build/lib/storage-utils.js.map +1 -1
- package/build/storage.d.ts +5 -5
- package/build/storage.js +30 -26
- package/build/storage.js.map +1 -1
- package/package.json +21 -17
- package/.babelrc +0 -3
- package/CHANGELOG.md +0 -2232
- package/src/index.ts +0 -5
- package/src/lib/star-utils.ts +0 -44
- package/src/lib/storage-utils.ts +0 -429
- package/src/lib/versions-utils.ts +0 -132
- package/src/local-storage.ts +0 -97
- package/src/storage.ts +0 -2072
- package/src/type.ts +0 -70
- package/test/fixtures/addTarball +0 -5
- package/test/fixtures/changePackage/metadata-change +0 -46
- package/test/fixtures/config/deprecate.yaml +0 -15
- package/test/fixtures/config/getTarball-getupstream.yaml +0 -17
- package/test/fixtures/config/publishWithOwnerAndCheck.yaml +0 -18
- package/test/fixtures/config/publishWithOwnerDefault.yaml +0 -15
- package/test/fixtures/config/syncDoubleUplinksMetadata.yaml +0 -10
- package/test/fixtures/config/syncNoUplinksMetadata.yaml +0 -17
- package/test/fixtures/config/syncSingleUplinksMetadata.yaml +0 -21
- package/test/fixtures/config/unpublishPackage.yaml +0 -13
- package/test/fixtures/config/updateManifest-1.yaml +0 -16
- package/test/fixtures/manifests/foo-npmjs.json +0 -253
- package/test/fixtures/manifests/foo-verdaccio.json +0 -253
- package/test/fixtures/metadata +0 -50
- package/test/fixtures/metadata-update-versions-tags +0 -97
- package/test/fixtures/search.json +0 -157
- package/test/fixtures/tarball.tgz +0 -0
- package/test/fixtures/test.utils.ts +0 -8
- package/test/helpers.ts +0 -22
- package/test/local-store.__disabled__.ts +0 -553
- package/test/search.spec.ts +0 -67
- package/test/star-utils.test.ts +0 -60
- package/test/storage-utils.spec.ts +0 -431
- package/test/storage.spec.ts +0 -2065
- package/test/versions.spec.ts +0 -167
- package/tsconfig.build.json +0 -9
- package/tsconfig.json +0 -38
- package/types/patch.d.ts +0 -12
package/README.md
CHANGED
|
@@ -1,42 +1,80 @@
|
|
|
1
|
-
# Verdaccio
|
|
1
|
+
# @verdaccio/store - Verdaccio Storage
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
[](https://verdaccio.org)
|
|
4
|
+
[](https://github.com/verdaccio/verdaccio/blob/master/LICENSE)
|
|
5
|
+
[](https://github.com/verdaccio/verdaccio)
|
|
6
|
+
[](https://npmjs.com/package/@verdaccio/store)
|
|
4
7
|
|
|
5
|
-
|
|
8
|
+
[](https://verdaccio.org/docs)
|
|
9
|
+
[](https://discord.com/channels/388674437219745793)
|
|
10
|
+
[](https://bsky.app/profile/verdaccio.org)
|
|
11
|
+
[](https://opencollective.com/verdaccio/contribute)
|
|
12
|
+
[](https://opencollective.com/verdaccio/contribute)
|
|
6
13
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
14
|
+
[](https://www.npmjs.com/package/verdaccio)
|
|
15
|
+
[](https://hub.docker.com/r/verdaccio/verdaccio)
|
|
16
|
+
[](https://github.com/verdaccio/verdaccio/stargazers)
|
|
10
17
|
|
|
11
|
-
##
|
|
18
|
+
## Donations
|
|
12
19
|
|
|
13
|
-
|
|
14
|
-
import { Config } from '@verdaccio/config';
|
|
15
|
-
import { logger } from '@verdaccio/logger';
|
|
16
|
-
import { Search } from '@verdaccio/search';
|
|
20
|
+
Verdaccio is run by **volunteers**; nobody is working full-time on it. If you find this project to be useful and would like to support its development, consider making a donation - **your logo might end up in this readme.** 😉
|
|
17
21
|
|
|
18
|
-
|
|
19
|
-
// Instantiate Search class
|
|
20
|
-
const search = new Search(config, logger);
|
|
22
|
+
**[Donate](https://opencollective.com/verdaccio)** 💵👍🏻 starting from _\$1/month_ or just one single contribution.
|
|
21
23
|
|
|
22
|
-
|
|
23
|
-
const searchParams = {
|
|
24
|
-
// specify search parameters as needed
|
|
25
|
-
};
|
|
24
|
+
## Report a vulnerability
|
|
26
25
|
|
|
27
|
-
|
|
28
|
-
const searchResults = await search.search(searchParams);
|
|
29
|
-
```
|
|
26
|
+
If you want to report a security vulnerability, please follow the steps which we have defined for you in our [security policy](https://github.com/verdaccio/verdaccio/security/policy).
|
|
30
27
|
|
|
31
|
-
##
|
|
28
|
+
## Open Collective Sponsors
|
|
32
29
|
|
|
33
|
-
|
|
30
|
+
Support this project by becoming a sponsor. Your logo will show up here with a link to your website. [[Become a sponsor](https://opencollective.com/verdaccio/contribute)]
|
|
34
31
|
|
|
35
|
-
|
|
32
|
+
[](https://opencollective.com/verdaccio/sponsor/0/website)
|
|
33
|
+
[](https://opencollective.com/verdaccio/sponsor/1/website)
|
|
34
|
+
[](https://opencollective.com/verdaccio/sponsor/2/website)
|
|
35
|
+
[](https://opencollective.com/verdaccio/sponsor/3/website)
|
|
36
|
+
[](https://opencollective.com/verdaccio/sponsor/4/website)
|
|
37
|
+
[](https://opencollective.com/verdaccio/sponsor/5/website)
|
|
38
|
+
[](https://opencollective.com/verdaccio/sponsor/6/website)
|
|
39
|
+
[](https://opencollective.com/verdaccio/sponsor/7/website)
|
|
40
|
+
[](https://opencollective.com/verdaccio/sponsor/8/website)
|
|
41
|
+
[](https://opencollective.com/verdaccio/sponsor/9/website)
|
|
42
|
+
|
|
43
|
+
## Open Collective Backers
|
|
44
|
+
|
|
45
|
+
Thank you to all our backers! 🙏 [[Become a backer](https://opencollective.com/verdaccio/contribute)]
|
|
46
|
+
|
|
47
|
+
[](https://opencollective.com/verdaccio/contributes)
|
|
48
|
+
|
|
49
|
+
## Special Thanks
|
|
50
|
+
|
|
51
|
+
Thanks to the following companies to help us to achieve our goals providing free open source licenses.
|
|
52
|
+
|
|
53
|
+
[](https://www.jetbrains.com/)
|
|
54
|
+
[](https://crowdin.com/)
|
|
55
|
+
|
|
56
|
+
## Contributors
|
|
57
|
+
|
|
58
|
+
This project exists thanks to all the people who contribute. [[Contribute](https://github.com/verdaccio/verdaccio/blob/master/CONTRIBUTING.md)].
|
|
59
|
+
|
|
60
|
+
[](https://github.com/verdaccio/verdaccio/graphs/contributors)
|
|
61
|
+
|
|
62
|
+
## FAQ / Contact / Troubleshoot
|
|
63
|
+
|
|
64
|
+
If you have any issue you can try the following options. Do not hesitate to ask or check our issues database. Perhaps someone has asked already what you are looking for.
|
|
65
|
+
|
|
66
|
+
- [Blog](https://verdaccio.org/blog/)
|
|
67
|
+
- [Donations](https://opencollective.com/verdaccio)
|
|
68
|
+
- [Reporting an issue](https://github.com/verdaccio/verdaccio/blob/master/CONTRIBUTING.md#reporting-a-bug)
|
|
69
|
+
- [Running discussions](https://github.com/orgs/verdaccio/discussions)
|
|
70
|
+
- [Chat](https://discord.com/channels/388674437219745793)
|
|
71
|
+
- [Logos](https://verdaccio.org/docs/logo)
|
|
72
|
+
- [Docker Examples](https://github.com/verdaccio/verdaccio/tree/master/docker-examples)
|
|
73
|
+
- [FAQ](https://github.com/verdaccio/verdaccio/issues?utf8=%E2%9C%93&q=is%3Aissue%20label%3Aquestion%20)
|
|
36
74
|
|
|
37
|
-
|
|
75
|
+
## License
|
|
38
76
|
|
|
39
77
|
Verdaccio is [MIT licensed](https://github.com/verdaccio/verdaccio/blob/master/LICENSE)
|
|
40
78
|
|
|
41
|
-
The Verdaccio documentation and logos (excluding /thanks, e.g., .md, .png, .sketch
|
|
42
|
-
[Creative Commons licensed](https://
|
|
79
|
+
The Verdaccio documentation and logos (excluding /thanks, e.g., .md, .png, .sketch files within the /assets folder) are
|
|
80
|
+
[Creative Commons licensed](https://creativecommons.org/licenses/by/4.0/).
|
|
@@ -32,8 +32,13 @@ export declare function cleanUpLinksRef(result: Manifest, keepUpLinkData?: boole
|
|
|
32
32
|
export declare function checkPackageRemote(name: string, isAllowPublishOffline: boolean, syncMetadata: Function): Promise<any>;
|
|
33
33
|
export declare function mergeUplinkTimeIntoLocal(localMetadata: Manifest, remoteMetadata: Manifest): any;
|
|
34
34
|
export declare function mergeUplinkTimeIntoLocalNext(cacheManifest: Manifest, remoteManifest: Manifest): Manifest;
|
|
35
|
-
export declare function updateUpLinkMetadata(
|
|
36
|
-
_uplinks: {
|
|
35
|
+
export declare function updateUpLinkMetadata(uplinkName: string, manifest: Manifest, etag: string): {
|
|
36
|
+
_uplinks: {
|
|
37
|
+
[x: string]: import("@verdaccio/types").UpLinkMetadata | {
|
|
38
|
+
etag: string;
|
|
39
|
+
fetched: number;
|
|
40
|
+
};
|
|
41
|
+
};
|
|
37
42
|
_distfiles: import("@verdaccio/types").DistFiles;
|
|
38
43
|
_rev: string;
|
|
39
44
|
_id?: string | undefined;
|
|
@@ -191,10 +191,10 @@ function mergeUplinkTimeIntoLocalNext(cacheManifest, remoteManifest) {
|
|
|
191
191
|
}
|
|
192
192
|
return cacheManifest;
|
|
193
193
|
}
|
|
194
|
-
function updateUpLinkMetadata(
|
|
194
|
+
function updateUpLinkMetadata(uplinkName, manifest, etag) {
|
|
195
195
|
const _uplinks = {
|
|
196
196
|
...manifest._uplinks,
|
|
197
|
-
[
|
|
197
|
+
[uplinkName]: {
|
|
198
198
|
etag,
|
|
199
199
|
fetched: Date.now()
|
|
200
200
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage-utils.js","names":["_lodash","_interopRequireDefault","require","_semver","_core","_utils","_versionsUtils","e","__esModule","default","STORAGE","exports","PACKAGE_FILE_NAME","FILE_EXIST_ERROR","NO_SUCH_FILE_ERROR","DEFAULT_REVISION","generatePackageTemplate","name","versions","time","USERS","DIST_TAGS","MAINTAINERS","_uplinks","_distfiles","_attachments","_rev","normalizePackage","pkg","pkgProperties","forEach","key","pkgProp","isNil","validatioUtils","isObject","_id","normalizeDistTags","generateRevision","rev","split","generateRandomHexString","getLatestReadme","distTags","latestVersion","readme","_","trim","readmeDistTagsPriority","tag","version","cleanUpReadme","keepReadmes","Object","values","includes","WHITELIST","cleanUpLinksRef","result","keepUpLinkData","propertyToKeep","push","i","indexOf","checkPackageRemote","isAllowPublishOffline","syncMetadata","Promise","resolve","reject","err","packageJsonLocal","upLinksErrors","status","HTTP_STATUS","NOT_FOUND","errorUtils","getConflict","API_ERROR","PACKAGE_EXIST","errorItem","length","getServiceUnavailable","UPLINK_OFFLINE_PUBLISH","mergeUplinkTimeIntoLocal","localMetadata","remoteMetadata","assign","mergeUplinkTimeIntoLocalNext","cacheManifest","remoteManifest","updateUpLinkMetadata","uplinkId","manifest","etag","fetched","Date","now","prepareSearchPackage","data","latest","pkgUtils","getLatest","description","maintainers","author","filter","Boolean","repository","readmeFilename","homepage","keywords","bugs","license","isDifferentThanOne","keys","hasInvalidPublishBody","res","mergeVersions","_cacheManifest","deprecated","distTag","semver","lte","sorted","sortVersionsAndFilterInvalid","pop","isArray","isString","parse","hasDeprecatedVersions","pkgInfo","prototype","hasOwnProperty","call","isDeprecatedManifest","mapManifestToSearchPackageBody","searchItem","scope","date","publisher","links","npm","package","scoped"],"sources":["../../src/lib/storage-utils.ts"],"sourcesContent":["import _ from 'lodash';\nimport semver from 'semver';\n\nimport { errorUtils, pkgUtils, searchUtils, validatioUtils } from '@verdaccio/core';\nimport { API_ERROR, DIST_TAGS, HTTP_STATUS, MAINTAINERS, USERS } from '@verdaccio/core';\nimport {\n AttachMents,\n GenericBody,\n Manifest,\n ReadmeOptions,\n Version,\n Versions,\n} from '@verdaccio/types';\nimport { generateRandomHexString, isNil, isObject } from '@verdaccio/utils';\n\nimport { sortVersionsAndFilterInvalid } from './versions-utils';\n\nexport const STORAGE = {\n PACKAGE_FILE_NAME: 'package.json',\n FILE_EXIST_ERROR: 'EEXISTS',\n NO_SUCH_FILE_ERROR: 'ENOENT',\n DEFAULT_REVISION: '0-0000000000000000',\n};\n\n/**\n * Create a new package in the storage, return a boilerplate package\n * @param name package name\n * @returns {Manifest}\n */\nexport function generatePackageTemplate(name: string): Manifest {\n return {\n // standard things\n name,\n versions: {},\n time: {},\n [USERS]: {},\n [DIST_TAGS]: {},\n [MAINTAINERS]: [],\n _uplinks: {},\n _distfiles: {},\n _attachments: {},\n _rev: '',\n };\n}\n\n/**\n * Normalize package properties, tags, revision id.\n * @param {Object} pkg package reference.\n */\nexport function normalizePackage(pkg: Manifest): Manifest {\n const pkgProperties = ['versions', 'dist-tags', '_distfiles', '_attachments', '_uplinks', 'time'];\n\n pkgProperties.forEach((key): void => {\n const pkgProp = pkg[key];\n\n if (isNil(pkgProp) || validatioUtils.isObject(pkgProp) === false) {\n pkg[key] = {};\n }\n });\n\n if (typeof pkg?._rev !== 'string') {\n pkg._rev = STORAGE.DEFAULT_REVISION;\n }\n\n if (typeof pkg?._id !== 'string') {\n pkg._id = pkg.name;\n }\n\n // normalize dist-tags\n return normalizeDistTags(pkg);\n}\n\nexport function generateRevision(rev: string): string {\n const _rev = rev.split('-');\n\n return (+_rev[0] || 0) + 1 + '-' + generateRandomHexString();\n}\n\nexport function getLatestReadme(pkg: Manifest): string {\n const versions = pkg['versions'] || {};\n const distTags = pkg[DIST_TAGS] || {};\n // FIXME: here is a bit tricky add the types\n const latestVersion: Version | any = distTags['latest'] ? versions[distTags['latest']] || {} : {};\n let readme = _.trim(pkg.readme || latestVersion.readme || '');\n if (readme) {\n return readme;\n }\n\n // In case of empty readme - trying to get ANY readme in the following order:\n // 'next','beta','alpha','test','dev','canary'\n const readmeDistTagsPriority = ['next', 'beta', 'alpha', 'test', 'dev', 'canary'];\n readmeDistTagsPriority.forEach(function (tag): string | void {\n if (readme) {\n return readme;\n }\n const version: Version | any = distTags[tag] ? versions[distTags[tag]] || {} : {};\n readme = _.trim(version.readme || readme);\n });\n return readme;\n}\n\n/**\n * Cleanup readme from package version\n *\n * By default, we don't keep readmes for package versions, only one readme per package.\n * Using publish.keep_readmes you can override this behavior and keep all readmes\n * or only readmes for tagged versions.\n */\nexport function cleanUpReadme(\n version: Version,\n distTags?: GenericBody,\n keepReadmes?: ReadmeOptions\n): Version {\n if (keepReadmes === 'all') {\n return version;\n } else if (keepReadmes === 'tagged') {\n if (distTags && Object.values(distTags).includes(version.version)) {\n return version;\n }\n }\n\n if (isNil(version) === false) {\n version.readme = '';\n }\n\n return version;\n}\n\nexport const WHITELIST = [\n '_rev',\n 'name',\n 'versions',\n 'dist-tags',\n 'readme',\n 'time',\n '_id',\n 'users',\n 'maintainers',\n];\n\nexport function cleanUpLinksRef(result: Manifest, keepUpLinkData?: boolean): Manifest {\n const propertyToKeep = [...WHITELIST];\n if (keepUpLinkData === true) {\n propertyToKeep.push('_uplinks');\n }\n\n for (const i in result) {\n if (propertyToKeep.indexOf(i) === -1) {\n // Remove sections like '_uplinks' from response\n delete result[i];\n }\n }\n\n return result;\n}\n\n// TODO: move to abstract storage\n// @deprecated use abstract.storage.ts:checkPackageRemote\nexport function checkPackageRemote(\n name: string,\n isAllowPublishOffline: boolean,\n syncMetadata: Function\n): Promise<any> {\n return new Promise<void>((resolve, reject): void => {\n syncMetadata(name, null, {}, (err, packageJsonLocal, upLinksErrors): void => {\n // something weird\n if (err && err.status !== HTTP_STATUS.NOT_FOUND) {\n return reject(err);\n }\n\n // checking package exist already\n if (isNil(packageJsonLocal) === false) {\n return reject(errorUtils.getConflict(API_ERROR.PACKAGE_EXIST));\n }\n\n for (let errorItem = 0; errorItem < upLinksErrors.length; errorItem++) {\n // checking error\n // if uplink fails with a status other than 404, we report failure\n if (isNil(upLinksErrors[errorItem][0]) === false) {\n if (upLinksErrors[errorItem][0].status !== HTTP_STATUS.NOT_FOUND) {\n if (isAllowPublishOffline) {\n return resolve();\n }\n\n return reject(errorUtils.getServiceUnavailable(API_ERROR.UPLINK_OFFLINE_PUBLISH));\n }\n }\n }\n\n return resolve();\n });\n });\n}\n\n// @deprecated use export function mergeUplinkTimeIntoLocalNext\nexport function mergeUplinkTimeIntoLocal(localMetadata: Manifest, remoteMetadata: Manifest): any {\n if ('time' in remoteMetadata) {\n return Object.assign({}, localMetadata.time, remoteMetadata.time);\n }\n\n return localMetadata.time;\n}\n\nexport function mergeUplinkTimeIntoLocalNext(\n cacheManifest: Manifest,\n remoteManifest: Manifest\n): Manifest {\n if ('time' in remoteManifest) {\n // remote override cache time conflicts\n return { ...cacheManifest, time: { ...cacheManifest.time, ...remoteManifest.time } };\n }\n\n return cacheManifest;\n}\n\nexport function updateUpLinkMetadata(uplinkId, manifest: Manifest, etag: string) {\n const _uplinks = {\n ...manifest._uplinks,\n [uplinkId]: {\n etag,\n fetched: Date.now(),\n },\n };\n return {\n ...manifest,\n _uplinks,\n };\n}\n\nexport function prepareSearchPackage(data: Manifest): any {\n const latest = pkgUtils.getLatest(data);\n\n if (latest && data.versions[latest]) {\n const version: Version = data.versions[latest];\n const versions: any = { [latest]: 'latest' };\n const pkg: any = {\n name: version.name,\n description: version.description,\n [DIST_TAGS]: { latest },\n maintainers: version.maintainers || [version.author].filter(Boolean),\n author: version.author,\n repository: version.repository,\n readmeFilename: version.readmeFilename || '',\n homepage: version.homepage,\n keywords: version.keywords,\n bugs: version.bugs,\n license: version.license,\n // time: {\n // modified: time,\n // },\n versions,\n };\n\n return pkg;\n }\n}\n\nexport function isDifferentThanOne(versions: Versions | AttachMents): boolean {\n return Object.keys(versions).length !== 1;\n}\n\n// @deprecated use validationUtils.validatePublishNewPackage\nexport function hasInvalidPublishBody(manifest: Pick<Manifest, '_attachments' | 'versions'>) {\n if (!manifest) {\n return false;\n }\n\n const { _attachments, versions } = manifest;\n const res =\n isObject(_attachments) === false ||\n isDifferentThanOne(_attachments) ||\n isObject(versions) === false ||\n isDifferentThanOne(versions);\n return res;\n}\n\n/**\n * Function gets a local info and an info from uplinks and tries to merge it\n exported for unit tests only.\n * @param {*} local\n * @param {*} remoteManifest\n * @param {*} config configuration file\n */\nexport function mergeVersions(cacheManifest: Manifest, remoteManifest: Manifest): Manifest {\n let _cacheManifest = { ...cacheManifest };\n const { versions, time } = remoteManifest;\n // copy new versions to a cache\n // NOTE: if a certain version was updated, we can't refresh it reliably\n // however, we can refresh the deprecated status\n for (const i in versions) {\n if (typeof _cacheManifest.versions[i] === 'undefined') {\n _cacheManifest.versions[i] = versions[i];\n } else if (versions[i].deprecated) {\n _cacheManifest.versions[i].deprecated = versions[i].deprecated;\n }\n }\n\n for (const i in time) {\n if (typeof _cacheManifest.time[i] === 'undefined') {\n _cacheManifest.time[i] = time[i];\n }\n }\n\n for (const distTag in remoteManifest[DIST_TAGS]) {\n if (_cacheManifest[DIST_TAGS][distTag] !== remoteManifest[DIST_TAGS][distTag]) {\n if (\n !_cacheManifest[DIST_TAGS][distTag] ||\n semver.lte(_cacheManifest[DIST_TAGS][distTag], remoteManifest[DIST_TAGS][distTag])\n ) {\n _cacheManifest[DIST_TAGS][distTag] = remoteManifest[DIST_TAGS][distTag];\n }\n if (\n distTag === 'latest' &&\n _cacheManifest[DIST_TAGS][distTag] === remoteManifest[DIST_TAGS][distTag]\n ) {\n // NOTE: this override the latest publish readme from local cache with\n // the remote one\n _cacheManifest = { ..._cacheManifest, readme: remoteManifest.readme };\n }\n }\n }\n return _cacheManifest;\n}\n\n/**\n * Normalize dist-tags.\n *\n * There is a legacy behaviour where the dist-tags could be an array, in such\n * case, the array is orderded and the highest version becames the\n * latest.\n *\n * The dist-tag tags must be plain strigs, if the latest is empty (for whatever reason) is\n * normalized to be the highest version available.\n *\n * This function cleans up every invalid version on dist-tags, but does not remove\n * invalid versions from the manifest.\n *\n * @param {*} data\n */\nexport function normalizeDistTags(manifest: Manifest): Manifest {\n let sorted;\n // handle missing latest dist-tag\n if (!manifest[DIST_TAGS].latest) {\n // if there is no latest tag, set the highest known version based on semver sort\n sorted = sortVersionsAndFilterInvalid(Object.keys(manifest.versions));\n if (sorted?.length) {\n // get the highest published version\n manifest[DIST_TAGS].latest = sorted.pop();\n }\n }\n\n for (const tag in manifest[DIST_TAGS]) {\n // deprecated (will be removed un future majors)\n // this should not happen, tags should be plain strings, legacy fallback\n if (_.isArray(manifest[DIST_TAGS][tag])) {\n if (manifest[DIST_TAGS][tag].length) {\n // sort array\n // FIXME: this is clearly wrong, we need to research why this is like this.\n // @ts-ignore\n sorted = sortVersionsAndFilterInvalid(manifest[DIST_TAGS][tag]);\n if (sorted.length) {\n // use highest version based on semver sort\n manifest[DIST_TAGS][tag] = sorted.pop();\n }\n } else {\n delete manifest[DIST_TAGS][tag];\n }\n } else if (_.isString(manifest[DIST_TAGS][tag])) {\n if (!semver.parse(manifest[DIST_TAGS][tag], true)) {\n // if the version is invalid, delete the dist-tag entry\n delete manifest[DIST_TAGS][tag];\n }\n }\n }\n\n return manifest;\n}\n\nexport function hasDeprecatedVersions(pkgInfo: Manifest): boolean {\n const { versions } = pkgInfo;\n for (const version in versions) {\n if (Object.prototype.hasOwnProperty.call(versions[version], 'deprecated')) {\n return true;\n }\n }\n return false;\n}\n\nexport function isDeprecatedManifest(manifest: Manifest): boolean {\n return (\n hasDeprecatedVersions(manifest) &&\n (typeof manifest._attachments === 'undefined' ||\n Object.keys(manifest._attachments).length === 0)\n );\n}\n\nexport function mapManifestToSearchPackageBody(\n pkg: Manifest,\n searchItem: searchUtils.SearchItem\n): searchUtils.SearchPackageBody {\n const latest = pkgUtils.getLatest(pkg);\n const version: Version = pkg.versions[latest];\n const result: searchUtils.SearchPackageBody = {\n name: version.name,\n scope: '',\n description: version.description,\n version: latest,\n keywords: version.keywords,\n date: pkg.time[latest],\n // FIXME: type\n author: version.author as any,\n // FIXME: not possible fill this out from a private package\n publisher: {},\n // FIXME: type\n maintainers: version.maintainers as any,\n links: {\n npm: '',\n homepage: version.homepage,\n repository: version.repository,\n bugs: version.bugs,\n },\n };\n\n if (typeof searchItem.package.scoped === 'string') {\n result.scope = searchItem.package.scoped;\n }\n\n return result;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,OAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,OAAA,GAAAF,sBAAA,CAAAC,OAAA;AAEA,IAAAE,KAAA,GAAAF,OAAA;AAUA,IAAAG,MAAA,GAAAH,OAAA;AAEA,IAAAI,cAAA,GAAAJ,OAAA;AAAgE,SAAAD,uBAAAM,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAEzD,MAAMG,OAAO,GAAAC,OAAA,CAAAD,OAAA,GAAG;EACrBE,iBAAiB,EAAE,cAAc;EACjCC,gBAAgB,EAAE,SAAS;EAC3BC,kBAAkB,EAAE,QAAQ;EAC5BC,gBAAgB,EAAE;AACpB,CAAC;;AAED;AACA;AACA;AACA;AACA;AACO,SAASC,uBAAuBA,CAACC,IAAY,EAAY;EAC9D,OAAO;IACL;IACAA,IAAI;IACJC,QAAQ,EAAE,CAAC,CAAC;IACZC,IAAI,EAAE,CAAC,CAAC;IACR,CAACC,WAAK,GAAG,CAAC,CAAC;IACX,CAACC,eAAS,GAAG,CAAC,CAAC;IACf,CAACC,iBAAW,GAAG,EAAE;IACjBC,QAAQ,EAAE,CAAC,CAAC;IACZC,UAAU,EAAE,CAAC,CAAC;IACdC,YAAY,EAAE,CAAC,CAAC;IAChBC,IAAI,EAAE;EACR,CAAC;AACH;;AAEA;AACA;AACA;AACA;AACO,SAASC,gBAAgBA,CAACC,GAAa,EAAY;EACxD,MAAMC,aAAa,GAAG,CAAC,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,CAAC;EAEjGA,aAAa,CAACC,OAAO,CAAEC,GAAG,IAAW;IACnC,MAAMC,OAAO,GAAGJ,GAAG,CAACG,GAAG,CAAC;IAExB,IAAI,IAAAE,YAAK,EAACD,OAAO,CAAC,IAAIE,oBAAc,CAACC,QAAQ,CAACH,OAAO,CAAC,KAAK,KAAK,EAAE;MAChEJ,GAAG,CAACG,GAAG,CAAC,GAAG,CAAC,CAAC;IACf;EACF,CAAC,CAAC;EAEF,IAAI,OAAOH,GAAG,EAAEF,IAAI,KAAK,QAAQ,EAAE;IACjCE,GAAG,CAACF,IAAI,GAAGhB,OAAO,CAACK,gBAAgB;EACrC;EAEA,IAAI,OAAOa,GAAG,EAAEQ,GAAG,KAAK,QAAQ,EAAE;IAChCR,GAAG,CAACQ,GAAG,GAAGR,GAAG,CAACX,IAAI;EACpB;;EAEA;EACA,OAAOoB,iBAAiB,CAACT,GAAG,CAAC;AAC/B;AAEO,SAASU,gBAAgBA,CAACC,GAAW,EAAU;EACpD,MAAMb,IAAI,GAAGa,GAAG,CAACC,KAAK,CAAC,GAAG,CAAC;EAE3B,OAAO,CAAC,CAACd,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,GAAG,IAAAe,8BAAuB,EAAC,CAAC;AAC9D;AAEO,SAASC,eAAeA,CAACd,GAAa,EAAU;EACrD,MAAMV,QAAQ,GAAGU,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;EACtC,MAAMe,QAAQ,GAAGf,GAAG,CAACP,eAAS,CAAC,IAAI,CAAC,CAAC;EACrC;EACA,MAAMuB,aAA4B,GAAGD,QAAQ,CAAC,QAAQ,CAAC,GAAGzB,QAAQ,CAACyB,QAAQ,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;EACjG,IAAIE,MAAM,GAAGC,eAAC,CAACC,IAAI,CAACnB,GAAG,CAACiB,MAAM,IAAID,aAAa,CAACC,MAAM,IAAI,EAAE,CAAC;EAC7D,IAAIA,MAAM,EAAE;IACV,OAAOA,MAAM;EACf;;EAEA;EACA;EACA,MAAMG,sBAAsB,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC;EACjFA,sBAAsB,CAAClB,OAAO,CAAC,UAAUmB,GAAG,EAAiB;IAC3D,IAAIJ,MAAM,EAAE;MACV,OAAOA,MAAM;IACf;IACA,MAAMK,OAAsB,GAAGP,QAAQ,CAACM,GAAG,CAAC,GAAG/B,QAAQ,CAACyB,QAAQ,CAACM,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IACjFJ,MAAM,GAAGC,eAAC,CAACC,IAAI,CAACG,OAAO,CAACL,MAAM,IAAIA,MAAM,CAAC;EAC3C,CAAC,CAAC;EACF,OAAOA,MAAM;AACf;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASM,aAAaA,CAC3BD,OAAgB,EAChBP,QAAsB,EACtBS,WAA2B,EAClB;EACT,IAAIA,WAAW,KAAK,KAAK,EAAE;IACzB,OAAOF,OAAO;EAChB,CAAC,MAAM,IAAIE,WAAW,KAAK,QAAQ,EAAE;IACnC,IAAIT,QAAQ,IAAIU,MAAM,CAACC,MAAM,CAACX,QAAQ,CAAC,CAACY,QAAQ,CAACL,OAAO,CAACA,OAAO,CAAC,EAAE;MACjE,OAAOA,OAAO;IAChB;EACF;EAEA,IAAI,IAAAjB,YAAK,EAACiB,OAAO,CAAC,KAAK,KAAK,EAAE;IAC5BA,OAAO,CAACL,MAAM,GAAG,EAAE;EACrB;EAEA,OAAOK,OAAO;AAChB;AAEO,MAAMM,SAAS,GAAA7C,OAAA,CAAA6C,SAAA,GAAG,CACvB,MAAM,EACN,MAAM,EACN,UAAU,EACV,WAAW,EACX,QAAQ,EACR,MAAM,EACN,KAAK,EACL,OAAO,EACP,aAAa,CACd;AAEM,SAASC,eAAeA,CAACC,MAAgB,EAAEC,cAAwB,EAAY;EACpF,MAAMC,cAAc,GAAG,CAAC,GAAGJ,SAAS,CAAC;EACrC,IAAIG,cAAc,KAAK,IAAI,EAAE;IAC3BC,cAAc,CAACC,IAAI,CAAC,UAAU,CAAC;EACjC;EAEA,KAAK,MAAMC,CAAC,IAAIJ,MAAM,EAAE;IACtB,IAAIE,cAAc,CAACG,OAAO,CAACD,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE;MACpC;MACA,OAAOJ,MAAM,CAACI,CAAC,CAAC;IAClB;EACF;EAEA,OAAOJ,MAAM;AACf;;AAEA;AACA;AACO,SAASM,kBAAkBA,CAChC/C,IAAY,EACZgD,qBAA8B,EAC9BC,YAAsB,EACR;EACd,OAAO,IAAIC,OAAO,CAAO,CAACC,OAAO,EAAEC,MAAM,KAAW;IAClDH,YAAY,CAACjD,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAACqD,GAAG,EAAEC,gBAAgB,EAAEC,aAAa,KAAW;MAC3E;MACA,IAAIF,GAAG,IAAIA,GAAG,CAACG,MAAM,KAAKC,iBAAW,CAACC,SAAS,EAAE;QAC/C,OAAON,MAAM,CAACC,GAAG,CAAC;MACpB;;MAEA;MACA,IAAI,IAAArC,YAAK,EAACsC,gBAAgB,CAAC,KAAK,KAAK,EAAE;QACrC,OAAOF,MAAM,CAACO,gBAAU,CAACC,WAAW,CAACC,eAAS,CAACC,aAAa,CAAC,CAAC;MAChE;MAEA,KAAK,IAAIC,SAAS,GAAG,CAAC,EAAEA,SAAS,GAAGR,aAAa,CAACS,MAAM,EAAED,SAAS,EAAE,EAAE;QACrE;QACA;QACA,IAAI,IAAA/C,YAAK,EAACuC,aAAa,CAACQ,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,EAAE;UAChD,IAAIR,aAAa,CAACQ,SAAS,CAAC,CAAC,CAAC,CAAC,CAACP,MAAM,KAAKC,iBAAW,CAACC,SAAS,EAAE;YAChE,IAAIV,qBAAqB,EAAE;cACzB,OAAOG,OAAO,CAAC,CAAC;YAClB;YAEA,OAAOC,MAAM,CAACO,gBAAU,CAACM,qBAAqB,CAACJ,eAAS,CAACK,sBAAsB,CAAC,CAAC;UACnF;QACF;MACF;MAEA,OAAOf,OAAO,CAAC,CAAC;IAClB,CAAC,CAAC;EACJ,CAAC,CAAC;AACJ;;AAEA;AACO,SAASgB,wBAAwBA,CAACC,aAAuB,EAAEC,cAAwB,EAAO;EAC/F,IAAI,MAAM,IAAIA,cAAc,EAAE;IAC5B,OAAOjC,MAAM,CAACkC,MAAM,CAAC,CAAC,CAAC,EAAEF,aAAa,CAAClE,IAAI,EAAEmE,cAAc,CAACnE,IAAI,CAAC;EACnE;EAEA,OAAOkE,aAAa,CAAClE,IAAI;AAC3B;AAEO,SAASqE,4BAA4BA,CAC1CC,aAAuB,EACvBC,cAAwB,EACd;EACV,IAAI,MAAM,IAAIA,cAAc,EAAE;IAC5B;IACA,OAAO;MAAE,GAAGD,aAAa;MAAEtE,IAAI,EAAE;QAAE,GAAGsE,aAAa,CAACtE,IAAI;QAAE,GAAGuE,cAAc,CAACvE;MAAK;IAAE,CAAC;EACtF;EAEA,OAAOsE,aAAa;AACtB;AAEO,SAASE,oBAAoBA,CAACC,QAAQ,EAAEC,QAAkB,EAAEC,IAAY,EAAE;EAC/E,MAAMvE,QAAQ,GAAG;IACf,GAAGsE,QAAQ,CAACtE,QAAQ;IACpB,CAACqE,QAAQ,GAAG;MACVE,IAAI;MACJC,OAAO,EAAEC,IAAI,CAACC,GAAG,CAAC;IACpB;EACF,CAAC;EACD,OAAO;IACL,GAAGJ,QAAQ;IACXtE;EACF,CAAC;AACH;AAEO,SAAS2E,oBAAoBA,CAACC,IAAc,EAAO;EACxD,MAAMC,MAAM,GAAGC,cAAQ,CAACC,SAAS,CAACH,IAAI,CAAC;EAEvC,IAAIC,MAAM,IAAID,IAAI,CAACjF,QAAQ,CAACkF,MAAM,CAAC,EAAE;IACnC,MAAMlD,OAAgB,GAAGiD,IAAI,CAACjF,QAAQ,CAACkF,MAAM,CAAC;IAC9C,MAAMlF,QAAa,GAAG;MAAE,CAACkF,MAAM,GAAG;IAAS,CAAC;IAC5C,MAAMxE,GAAQ,GAAG;MACfX,IAAI,EAAEiC,OAAO,CAACjC,IAAI;MAClBsF,WAAW,EAAErD,OAAO,CAACqD,WAAW;MAChC,CAAClF,eAAS,GAAG;QAAE+E;MAAO,CAAC;MACvBI,WAAW,EAAEtD,OAAO,CAACsD,WAAW,IAAI,CAACtD,OAAO,CAACuD,MAAM,CAAC,CAACC,MAAM,CAACC,OAAO,CAAC;MACpEF,MAAM,EAAEvD,OAAO,CAACuD,MAAM;MACtBG,UAAU,EAAE1D,OAAO,CAAC0D,UAAU;MAC9BC,cAAc,EAAE3D,OAAO,CAAC2D,cAAc,IAAI,EAAE;MAC5CC,QAAQ,EAAE5D,OAAO,CAAC4D,QAAQ;MAC1BC,QAAQ,EAAE7D,OAAO,CAAC6D,QAAQ;MAC1BC,IAAI,EAAE9D,OAAO,CAAC8D,IAAI;MAClBC,OAAO,EAAE/D,OAAO,CAAC+D,OAAO;MACxB;MACA;MACA;MACA/F;IACF,CAAC;IAED,OAAOU,GAAG;EACZ;AACF;AAEO,SAASsF,kBAAkBA,CAAChG,QAAgC,EAAW;EAC5E,OAAOmC,MAAM,CAAC8D,IAAI,CAACjG,QAAQ,CAAC,CAAC+D,MAAM,KAAK,CAAC;AAC3C;;AAEA;AACO,SAASmC,qBAAqBA,CAACvB,QAAqD,EAAE;EAC3F,IAAI,CAACA,QAAQ,EAAE;IACb,OAAO,KAAK;EACd;EAEA,MAAM;IAAEpE,YAAY;IAAEP;EAAS,CAAC,GAAG2E,QAAQ;EAC3C,MAAMwB,GAAG,GACP,IAAAlF,eAAQ,EAACV,YAAY,CAAC,KAAK,KAAK,IAChCyF,kBAAkB,CAACzF,YAAY,CAAC,IAChC,IAAAU,eAAQ,EAACjB,QAAQ,CAAC,KAAK,KAAK,IAC5BgG,kBAAkB,CAAChG,QAAQ,CAAC;EAC9B,OAAOmG,GAAG;AACZ;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASC,aAAaA,CAAC7B,aAAuB,EAAEC,cAAwB,EAAY;EACzF,IAAI6B,cAAc,GAAG;IAAE,GAAG9B;EAAc,CAAC;EACzC,MAAM;IAAEvE,QAAQ;IAAEC;EAAK,CAAC,GAAGuE,cAAc;EACzC;EACA;EACA;EACA,KAAK,MAAM5B,CAAC,IAAI5C,QAAQ,EAAE;IACxB,IAAI,OAAOqG,cAAc,CAACrG,QAAQ,CAAC4C,CAAC,CAAC,KAAK,WAAW,EAAE;MACrDyD,cAAc,CAACrG,QAAQ,CAAC4C,CAAC,CAAC,GAAG5C,QAAQ,CAAC4C,CAAC,CAAC;IAC1C,CAAC,MAAM,IAAI5C,QAAQ,CAAC4C,CAAC,CAAC,CAAC0D,UAAU,EAAE;MACjCD,cAAc,CAACrG,QAAQ,CAAC4C,CAAC,CAAC,CAAC0D,UAAU,GAAGtG,QAAQ,CAAC4C,CAAC,CAAC,CAAC0D,UAAU;IAChE;EACF;EAEA,KAAK,MAAM1D,CAAC,IAAI3C,IAAI,EAAE;IACpB,IAAI,OAAOoG,cAAc,CAACpG,IAAI,CAAC2C,CAAC,CAAC,KAAK,WAAW,EAAE;MACjDyD,cAAc,CAACpG,IAAI,CAAC2C,CAAC,CAAC,GAAG3C,IAAI,CAAC2C,CAAC,CAAC;IAClC;EACF;EAEA,KAAK,MAAM2D,OAAO,IAAI/B,cAAc,CAACrE,eAAS,CAAC,EAAE;IAC/C,IAAIkG,cAAc,CAAClG,eAAS,CAAC,CAACoG,OAAO,CAAC,KAAK/B,cAAc,CAACrE,eAAS,CAAC,CAACoG,OAAO,CAAC,EAAE;MAC7E,IACE,CAACF,cAAc,CAAClG,eAAS,CAAC,CAACoG,OAAO,CAAC,IACnCC,eAAM,CAACC,GAAG,CAACJ,cAAc,CAAClG,eAAS,CAAC,CAACoG,OAAO,CAAC,EAAE/B,cAAc,CAACrE,eAAS,CAAC,CAACoG,OAAO,CAAC,CAAC,EAClF;QACAF,cAAc,CAAClG,eAAS,CAAC,CAACoG,OAAO,CAAC,GAAG/B,cAAc,CAACrE,eAAS,CAAC,CAACoG,OAAO,CAAC;MACzE;MACA,IACEA,OAAO,KAAK,QAAQ,IACpBF,cAAc,CAAClG,eAAS,CAAC,CAACoG,OAAO,CAAC,KAAK/B,cAAc,CAACrE,eAAS,CAAC,CAACoG,OAAO,CAAC,EACzE;QACA;QACA;QACAF,cAAc,GAAG;UAAE,GAAGA,cAAc;UAAE1E,MAAM,EAAE6C,cAAc,CAAC7C;QAAO,CAAC;MACvE;IACF;EACF;EACA,OAAO0E,cAAc;AACvB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASlF,iBAAiBA,CAACwD,QAAkB,EAAY;EAC9D,IAAI+B,MAAM;EACV;EACA,IAAI,CAAC/B,QAAQ,CAACxE,eAAS,CAAC,CAAC+E,MAAM,EAAE;IAC/B;IACAwB,MAAM,GAAG,IAAAC,2CAA4B,EAACxE,MAAM,CAAC8D,IAAI,CAACtB,QAAQ,CAAC3E,QAAQ,CAAC,CAAC;IACrE,IAAI0G,MAAM,EAAE3C,MAAM,EAAE;MAClB;MACAY,QAAQ,CAACxE,eAAS,CAAC,CAAC+E,MAAM,GAAGwB,MAAM,CAACE,GAAG,CAAC,CAAC;IAC3C;EACF;EAEA,KAAK,MAAM7E,GAAG,IAAI4C,QAAQ,CAACxE,eAAS,CAAC,EAAE;IACrC;IACA;IACA,IAAIyB,eAAC,CAACiF,OAAO,CAAClC,QAAQ,CAACxE,eAAS,CAAC,CAAC4B,GAAG,CAAC,CAAC,EAAE;MACvC,IAAI4C,QAAQ,CAACxE,eAAS,CAAC,CAAC4B,GAAG,CAAC,CAACgC,MAAM,EAAE;QACnC;QACA;QACA;QACA2C,MAAM,GAAG,IAAAC,2CAA4B,EAAChC,QAAQ,CAACxE,eAAS,CAAC,CAAC4B,GAAG,CAAC,CAAC;QAC/D,IAAI2E,MAAM,CAAC3C,MAAM,EAAE;UACjB;UACAY,QAAQ,CAACxE,eAAS,CAAC,CAAC4B,GAAG,CAAC,GAAG2E,MAAM,CAACE,GAAG,CAAC,CAAC;QACzC;MACF,CAAC,MAAM;QACL,OAAOjC,QAAQ,CAACxE,eAAS,CAAC,CAAC4B,GAAG,CAAC;MACjC;IACF,CAAC,MAAM,IAAIH,eAAC,CAACkF,QAAQ,CAACnC,QAAQ,CAACxE,eAAS,CAAC,CAAC4B,GAAG,CAAC,CAAC,EAAE;MAC/C,IAAI,CAACyE,eAAM,CAACO,KAAK,CAACpC,QAAQ,CAACxE,eAAS,CAAC,CAAC4B,GAAG,CAAC,EAAE,IAAI,CAAC,EAAE;QACjD;QACA,OAAO4C,QAAQ,CAACxE,eAAS,CAAC,CAAC4B,GAAG,CAAC;MACjC;IACF;EACF;EAEA,OAAO4C,QAAQ;AACjB;AAEO,SAASqC,qBAAqBA,CAACC,OAAiB,EAAW;EAChE,MAAM;IAAEjH;EAAS,CAAC,GAAGiH,OAAO;EAC5B,KAAK,MAAMjF,OAAO,IAAIhC,QAAQ,EAAE;IAC9B,IAAImC,MAAM,CAAC+E,SAAS,CAACC,cAAc,CAACC,IAAI,CAACpH,QAAQ,CAACgC,OAAO,CAAC,EAAE,YAAY,CAAC,EAAE;MACzE,OAAO,IAAI;IACb;EACF;EACA,OAAO,KAAK;AACd;AAEO,SAASqF,oBAAoBA,CAAC1C,QAAkB,EAAW;EAChE,OACEqC,qBAAqB,CAACrC,QAAQ,CAAC,KAC9B,OAAOA,QAAQ,CAACpE,YAAY,KAAK,WAAW,IAC3C4B,MAAM,CAAC8D,IAAI,CAACtB,QAAQ,CAACpE,YAAY,CAAC,CAACwD,MAAM,KAAK,CAAC,CAAC;AAEtD;AAEO,SAASuD,8BAA8BA,CAC5C5G,GAAa,EACb6G,UAAkC,EACH;EAC/B,MAAMrC,MAAM,GAAGC,cAAQ,CAACC,SAAS,CAAC1E,GAAG,CAAC;EACtC,MAAMsB,OAAgB,GAAGtB,GAAG,CAACV,QAAQ,CAACkF,MAAM,CAAC;EAC7C,MAAM1C,MAAqC,GAAG;IAC5CzC,IAAI,EAAEiC,OAAO,CAACjC,IAAI;IAClByH,KAAK,EAAE,EAAE;IACTnC,WAAW,EAAErD,OAAO,CAACqD,WAAW;IAChCrD,OAAO,EAAEkD,MAAM;IACfW,QAAQ,EAAE7D,OAAO,CAAC6D,QAAQ;IAC1B4B,IAAI,EAAE/G,GAAG,CAACT,IAAI,CAACiF,MAAM,CAAC;IACtB;IACAK,MAAM,EAAEvD,OAAO,CAACuD,MAAa;IAC7B;IACAmC,SAAS,EAAE,CAAC,CAAC;IACb;IACApC,WAAW,EAAEtD,OAAO,CAACsD,WAAkB;IACvCqC,KAAK,EAAE;MACLC,GAAG,EAAE,EAAE;MACPhC,QAAQ,EAAE5D,OAAO,CAAC4D,QAAQ;MAC1BF,UAAU,EAAE1D,OAAO,CAAC0D,UAAU;MAC9BI,IAAI,EAAE9D,OAAO,CAAC8D;IAChB;EACF,CAAC;EAED,IAAI,OAAOyB,UAAU,CAACM,OAAO,CAACC,MAAM,KAAK,QAAQ,EAAE;IACjDtF,MAAM,CAACgF,KAAK,GAAGD,UAAU,CAACM,OAAO,CAACC,MAAM;EAC1C;EAEA,OAAOtF,MAAM;AACf","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"storage-utils.js","names":["_lodash","_interopRequireDefault","require","_semver","_core","_utils","_versionsUtils","e","__esModule","default","STORAGE","exports","PACKAGE_FILE_NAME","FILE_EXIST_ERROR","NO_SUCH_FILE_ERROR","DEFAULT_REVISION","generatePackageTemplate","name","versions","time","USERS","DIST_TAGS","MAINTAINERS","_uplinks","_distfiles","_attachments","_rev","normalizePackage","pkg","pkgProperties","forEach","key","pkgProp","isNil","validatioUtils","isObject","_id","normalizeDistTags","generateRevision","rev","split","generateRandomHexString","getLatestReadme","distTags","latestVersion","readme","_","trim","readmeDistTagsPriority","tag","version","cleanUpReadme","keepReadmes","Object","values","includes","WHITELIST","cleanUpLinksRef","result","keepUpLinkData","propertyToKeep","push","i","indexOf","checkPackageRemote","isAllowPublishOffline","syncMetadata","Promise","resolve","reject","err","packageJsonLocal","upLinksErrors","status","HTTP_STATUS","NOT_FOUND","errorUtils","getConflict","API_ERROR","PACKAGE_EXIST","errorItem","length","getServiceUnavailable","UPLINK_OFFLINE_PUBLISH","mergeUplinkTimeIntoLocal","localMetadata","remoteMetadata","assign","mergeUplinkTimeIntoLocalNext","cacheManifest","remoteManifest","updateUpLinkMetadata","uplinkName","manifest","etag","fetched","Date","now","prepareSearchPackage","data","latest","pkgUtils","getLatest","description","maintainers","author","filter","Boolean","repository","readmeFilename","homepage","keywords","bugs","license","isDifferentThanOne","keys","hasInvalidPublishBody","res","mergeVersions","_cacheManifest","deprecated","distTag","semver","lte","sorted","sortVersionsAndFilterInvalid","pop","isArray","isString","parse","hasDeprecatedVersions","pkgInfo","prototype","hasOwnProperty","call","isDeprecatedManifest","mapManifestToSearchPackageBody","searchItem","scope","date","publisher","links","npm","package","scoped"],"sources":["../../src/lib/storage-utils.ts"],"sourcesContent":["import _ from 'lodash';\nimport semver from 'semver';\n\nimport { errorUtils, pkgUtils, searchUtils, validatioUtils } from '@verdaccio/core';\nimport { API_ERROR, DIST_TAGS, HTTP_STATUS, MAINTAINERS, USERS } from '@verdaccio/core';\nimport {\n AttachMents,\n GenericBody,\n Manifest,\n ReadmeOptions,\n Version,\n Versions,\n} from '@verdaccio/types';\nimport { generateRandomHexString, isNil, isObject } from '@verdaccio/utils';\n\nimport { sortVersionsAndFilterInvalid } from './versions-utils';\n\nexport const STORAGE = {\n PACKAGE_FILE_NAME: 'package.json',\n FILE_EXIST_ERROR: 'EEXISTS',\n NO_SUCH_FILE_ERROR: 'ENOENT',\n DEFAULT_REVISION: '0-0000000000000000',\n};\n\n/**\n * Create a new package in the storage, return a boilerplate package\n * @param name package name\n * @returns {Manifest}\n */\nexport function generatePackageTemplate(name: string): Manifest {\n return {\n // standard things\n name,\n versions: {},\n time: {},\n [USERS]: {},\n [DIST_TAGS]: {},\n [MAINTAINERS]: [],\n _uplinks: {},\n _distfiles: {},\n _attachments: {},\n _rev: '',\n };\n}\n\n/**\n * Normalize package properties, tags, revision id.\n * @param {Object} pkg package reference.\n */\nexport function normalizePackage(pkg: Manifest): Manifest {\n const pkgProperties = ['versions', 'dist-tags', '_distfiles', '_attachments', '_uplinks', 'time'];\n\n pkgProperties.forEach((key): void => {\n const pkgProp = pkg[key];\n\n if (isNil(pkgProp) || validatioUtils.isObject(pkgProp) === false) {\n pkg[key] = {};\n }\n });\n\n if (typeof pkg?._rev !== 'string') {\n pkg._rev = STORAGE.DEFAULT_REVISION;\n }\n\n if (typeof pkg?._id !== 'string') {\n pkg._id = pkg.name;\n }\n\n // normalize dist-tags\n return normalizeDistTags(pkg);\n}\n\nexport function generateRevision(rev: string): string {\n const _rev = rev.split('-');\n\n return (+_rev[0] || 0) + 1 + '-' + generateRandomHexString();\n}\n\nexport function getLatestReadme(pkg: Manifest): string {\n const versions = pkg['versions'] || {};\n const distTags = pkg[DIST_TAGS] || {};\n // FIXME: here is a bit tricky add the types\n const latestVersion: Version | any = distTags['latest'] ? versions[distTags['latest']] || {} : {};\n let readme = _.trim(pkg.readme || latestVersion.readme || '');\n if (readme) {\n return readme;\n }\n\n // In case of empty readme - trying to get ANY readme in the following order:\n // 'next','beta','alpha','test','dev','canary'\n const readmeDistTagsPriority = ['next', 'beta', 'alpha', 'test', 'dev', 'canary'];\n readmeDistTagsPriority.forEach(function (tag): string | void {\n if (readme) {\n return readme;\n }\n const version: Version | any = distTags[tag] ? versions[distTags[tag]] || {} : {};\n readme = _.trim(version.readme || readme);\n });\n return readme;\n}\n\n/**\n * Cleanup readme from package version\n *\n * By default, we don't keep readmes for package versions, only one readme per package.\n * Using publish.keep_readmes you can override this behavior and keep all readmes\n * or only readmes for tagged versions.\n */\nexport function cleanUpReadme(\n version: Version,\n distTags?: GenericBody,\n keepReadmes?: ReadmeOptions\n): Version {\n if (keepReadmes === 'all') {\n return version;\n } else if (keepReadmes === 'tagged') {\n if (distTags && Object.values(distTags).includes(version.version)) {\n return version;\n }\n }\n\n if (isNil(version) === false) {\n version.readme = '';\n }\n\n return version;\n}\n\nexport const WHITELIST = [\n '_rev',\n 'name',\n 'versions',\n 'dist-tags',\n 'readme',\n 'time',\n '_id',\n 'users',\n 'maintainers',\n];\n\nexport function cleanUpLinksRef(result: Manifest, keepUpLinkData?: boolean): Manifest {\n const propertyToKeep = [...WHITELIST];\n if (keepUpLinkData === true) {\n propertyToKeep.push('_uplinks');\n }\n\n for (const i in result) {\n if (propertyToKeep.indexOf(i) === -1) {\n // Remove sections like '_uplinks' from response\n delete result[i];\n }\n }\n\n return result;\n}\n\n// TODO: move to abstract storage\n// @deprecated use abstract.storage.ts:checkPackageRemote\nexport function checkPackageRemote(\n name: string,\n isAllowPublishOffline: boolean,\n syncMetadata: Function\n): Promise<any> {\n return new Promise<void>((resolve, reject): void => {\n syncMetadata(name, null, {}, (err, packageJsonLocal, upLinksErrors): void => {\n // something weird\n if (err && err.status !== HTTP_STATUS.NOT_FOUND) {\n return reject(err);\n }\n\n // checking package exist already\n if (isNil(packageJsonLocal) === false) {\n return reject(errorUtils.getConflict(API_ERROR.PACKAGE_EXIST));\n }\n\n for (let errorItem = 0; errorItem < upLinksErrors.length; errorItem++) {\n // checking error\n // if uplink fails with a status other than 404, we report failure\n if (isNil(upLinksErrors[errorItem][0]) === false) {\n if (upLinksErrors[errorItem][0].status !== HTTP_STATUS.NOT_FOUND) {\n if (isAllowPublishOffline) {\n return resolve();\n }\n\n return reject(errorUtils.getServiceUnavailable(API_ERROR.UPLINK_OFFLINE_PUBLISH));\n }\n }\n }\n\n return resolve();\n });\n });\n}\n\n// @deprecated use export function mergeUplinkTimeIntoLocalNext\nexport function mergeUplinkTimeIntoLocal(localMetadata: Manifest, remoteMetadata: Manifest): any {\n if ('time' in remoteMetadata) {\n return Object.assign({}, localMetadata.time, remoteMetadata.time);\n }\n\n return localMetadata.time;\n}\n\nexport function mergeUplinkTimeIntoLocalNext(\n cacheManifest: Manifest,\n remoteManifest: Manifest\n): Manifest {\n if ('time' in remoteManifest) {\n // remote override cache time conflicts\n return { ...cacheManifest, time: { ...cacheManifest.time, ...remoteManifest.time } };\n }\n\n return cacheManifest;\n}\n\nexport function updateUpLinkMetadata(uplinkName: string, manifest: Manifest, etag: string) {\n const _uplinks = {\n ...manifest._uplinks,\n [uplinkName]: {\n etag,\n fetched: Date.now(),\n },\n };\n return {\n ...manifest,\n _uplinks,\n };\n}\n\nexport function prepareSearchPackage(data: Manifest): any {\n const latest = pkgUtils.getLatest(data);\n\n if (latest && data.versions[latest]) {\n const version: Version = data.versions[latest];\n const versions: any = { [latest]: 'latest' };\n const pkg: any = {\n name: version.name,\n description: version.description,\n [DIST_TAGS]: { latest },\n maintainers: version.maintainers || [version.author].filter(Boolean),\n author: version.author,\n repository: version.repository,\n readmeFilename: version.readmeFilename || '',\n homepage: version.homepage,\n keywords: version.keywords,\n bugs: version.bugs,\n license: version.license,\n // time: {\n // modified: time,\n // },\n versions,\n };\n\n return pkg;\n }\n}\n\nexport function isDifferentThanOne(versions: Versions | AttachMents): boolean {\n return Object.keys(versions).length !== 1;\n}\n\n// @deprecated use validationUtils.validatePublishNewPackage\nexport function hasInvalidPublishBody(manifest: Pick<Manifest, '_attachments' | 'versions'>) {\n if (!manifest) {\n return false;\n }\n\n const { _attachments, versions } = manifest;\n const res =\n isObject(_attachments) === false ||\n isDifferentThanOne(_attachments) ||\n isObject(versions) === false ||\n isDifferentThanOne(versions);\n return res;\n}\n\n/**\n * Function gets a local info and an info from uplinks and tries to merge it\n exported for unit tests only.\n * @param {*} local\n * @param {*} remoteManifest\n * @param {*} config configuration file\n */\nexport function mergeVersions(cacheManifest: Manifest, remoteManifest: Manifest): Manifest {\n let _cacheManifest = { ...cacheManifest };\n const { versions, time } = remoteManifest;\n // copy new versions to a cache\n // NOTE: if a certain version was updated, we can't refresh it reliably\n // however, we can refresh the deprecated status\n for (const i in versions) {\n if (typeof _cacheManifest.versions[i] === 'undefined') {\n _cacheManifest.versions[i] = versions[i];\n } else if (versions[i].deprecated) {\n _cacheManifest.versions[i].deprecated = versions[i].deprecated;\n }\n }\n\n for (const i in time) {\n if (typeof _cacheManifest.time[i] === 'undefined') {\n _cacheManifest.time[i] = time[i];\n }\n }\n\n for (const distTag in remoteManifest[DIST_TAGS]) {\n if (_cacheManifest[DIST_TAGS][distTag] !== remoteManifest[DIST_TAGS][distTag]) {\n if (\n !_cacheManifest[DIST_TAGS][distTag] ||\n semver.lte(_cacheManifest[DIST_TAGS][distTag], remoteManifest[DIST_TAGS][distTag])\n ) {\n _cacheManifest[DIST_TAGS][distTag] = remoteManifest[DIST_TAGS][distTag];\n }\n if (\n distTag === 'latest' &&\n _cacheManifest[DIST_TAGS][distTag] === remoteManifest[DIST_TAGS][distTag]\n ) {\n // NOTE: this override the latest publish readme from local cache with\n // the remote one\n _cacheManifest = { ..._cacheManifest, readme: remoteManifest.readme };\n }\n }\n }\n return _cacheManifest;\n}\n\n/**\n * Normalize dist-tags.\n *\n * There is a legacy behaviour where the dist-tags could be an array, in such\n * case, the array is orderded and the highest version becames the\n * latest.\n *\n * The dist-tag tags must be plain strigs, if the latest is empty (for whatever reason) is\n * normalized to be the highest version available.\n *\n * This function cleans up every invalid version on dist-tags, but does not remove\n * invalid versions from the manifest.\n *\n * @param {*} data\n */\nexport function normalizeDistTags(manifest: Manifest): Manifest {\n let sorted;\n // handle missing latest dist-tag\n if (!manifest[DIST_TAGS].latest) {\n // if there is no latest tag, set the highest known version based on semver sort\n sorted = sortVersionsAndFilterInvalid(Object.keys(manifest.versions));\n if (sorted?.length) {\n // get the highest published version\n manifest[DIST_TAGS].latest = sorted.pop();\n }\n }\n\n for (const tag in manifest[DIST_TAGS]) {\n // deprecated (will be removed un future majors)\n // this should not happen, tags should be plain strings, legacy fallback\n if (_.isArray(manifest[DIST_TAGS][tag])) {\n if (manifest[DIST_TAGS][tag].length) {\n // sort array\n // FIXME: this is clearly wrong, we need to research why this is like this.\n // @ts-ignore\n sorted = sortVersionsAndFilterInvalid(manifest[DIST_TAGS][tag]);\n if (sorted.length) {\n // use highest version based on semver sort\n manifest[DIST_TAGS][tag] = sorted.pop();\n }\n } else {\n delete manifest[DIST_TAGS][tag];\n }\n } else if (_.isString(manifest[DIST_TAGS][tag])) {\n if (!semver.parse(manifest[DIST_TAGS][tag], true)) {\n // if the version is invalid, delete the dist-tag entry\n delete manifest[DIST_TAGS][tag];\n }\n }\n }\n\n return manifest;\n}\n\nexport function hasDeprecatedVersions(pkgInfo: Manifest): boolean {\n const { versions } = pkgInfo;\n for (const version in versions) {\n if (Object.prototype.hasOwnProperty.call(versions[version], 'deprecated')) {\n return true;\n }\n }\n return false;\n}\n\nexport function isDeprecatedManifest(manifest: Manifest): boolean {\n return (\n hasDeprecatedVersions(manifest) &&\n (typeof manifest._attachments === 'undefined' ||\n Object.keys(manifest._attachments).length === 0)\n );\n}\n\nexport function mapManifestToSearchPackageBody(\n pkg: Manifest,\n searchItem: searchUtils.SearchItem\n): searchUtils.SearchPackageBody {\n const latest = pkgUtils.getLatest(pkg);\n const version: Version = pkg.versions[latest];\n const result: searchUtils.SearchPackageBody = {\n name: version.name,\n scope: '',\n description: version.description,\n version: latest,\n keywords: version.keywords,\n date: pkg.time[latest],\n // FIXME: type\n author: version.author as any,\n // FIXME: not possible fill this out from a private package\n publisher: {},\n // FIXME: type\n maintainers: version.maintainers as any,\n links: {\n npm: '',\n homepage: version.homepage,\n repository: version.repository,\n bugs: version.bugs,\n },\n };\n\n if (typeof searchItem.package.scoped === 'string') {\n result.scope = searchItem.package.scoped;\n }\n\n return result;\n}\n"],"mappings":"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","ignoreList":[]}
|
package/build/storage.d.ts
CHANGED
|
@@ -211,13 +211,13 @@ declare class Storage {
|
|
|
211
211
|
# one uplink setup
|
|
212
212
|
proxy: npmjs
|
|
213
213
|
|
|
214
|
-
A package requires uplinks syncronization if
|
|
215
|
-
|
|
216
|
-
are made in serial and if 1st call fails, the second will be triggered, otherwise
|
|
214
|
+
A package requires uplinks syncronization if the proxy section is defined. There can be
|
|
215
|
+
more than one uplink. The more uplinks are defined, the longer the request will take.
|
|
216
|
+
The requests are made in serial and if 1st call fails, the second will be triggered, otherwise
|
|
217
217
|
the 1st will reply and others will be discarded. The order is important.
|
|
218
218
|
|
|
219
|
-
Errors on
|
|
220
|
-
|
|
219
|
+
Errors on uplinks that are considered are time outs, connection fails, and http status 304.
|
|
220
|
+
In these cases the request returns empty body and we want ask next on the list if has fresh
|
|
221
221
|
updates.
|
|
222
222
|
*/
|
|
223
223
|
syncUplinksMetadata(name: string, localManifest: Manifest | null, options?: Partial<ISyncUplinksOptions>): Promise<[Manifest | null, any]>;
|
package/build/storage.js
CHANGED
|
@@ -231,8 +231,13 @@ class Storage {
|
|
|
231
231
|
passThroughRemoteStream.emit('error', _core.errorUtils.getNotFound(_core.errorUtils.API_ERROR.NOT_FILE_UPLINK));
|
|
232
232
|
return;
|
|
233
233
|
}
|
|
234
|
+
if (res.statusCode === _core.HTTP_STATUS.UNAUTHORIZED) {
|
|
235
|
+
debug('remote stream response 401');
|
|
236
|
+
passThroughRemoteStream.emit('error', _core.errorUtils.getUnauthorized(_core.errorUtils.API_ERROR.UNAUTHORIZED_ACCESS));
|
|
237
|
+
return;
|
|
238
|
+
}
|
|
234
239
|
if (!(res.statusCode >= _core.HTTP_STATUS.OK && res.statusCode < _core.HTTP_STATUS.MULTIPLE_CHOICES)) {
|
|
235
|
-
debug('remote stream response
|
|
240
|
+
debug('remote stream response %o', res.statusCode);
|
|
236
241
|
passThroughRemoteStream.emit('error', _core.errorUtils.getInternalError(`bad uplink status code: ${res.statusCode}`));
|
|
237
242
|
return;
|
|
238
243
|
}
|
|
@@ -757,15 +762,15 @@ class Storage {
|
|
|
757
762
|
}
|
|
758
763
|
getUpLinkForDistFile(pkgName, distFile) {
|
|
759
764
|
let uplink = null;
|
|
760
|
-
for (const
|
|
765
|
+
for (const uplinkName in this.uplinks) {
|
|
761
766
|
// refer to https://github.com/verdaccio/verdaccio/issues/1642
|
|
762
|
-
if ((0, _config.hasProxyTo)(pkgName,
|
|
763
|
-
uplink = this.uplinks[
|
|
767
|
+
if ((0, _config.hasProxyTo)(pkgName, uplinkName, this.config.packages)) {
|
|
768
|
+
uplink = this.uplinks[uplinkName];
|
|
764
769
|
}
|
|
765
770
|
}
|
|
766
771
|
if (uplink == null) {
|
|
767
|
-
debug('upstream not found creating one for %o', pkgName);
|
|
768
|
-
uplink = new _proxy.ProxyStorage({
|
|
772
|
+
debug('upstream not found, creating one for %o', pkgName);
|
|
773
|
+
uplink = new _proxy.ProxyStorage(`verdaccio-${pkgName}`, {
|
|
769
774
|
url: distFile.url,
|
|
770
775
|
cache: true
|
|
771
776
|
}, this.config, this.logger);
|
|
@@ -965,7 +970,7 @@ class Storage {
|
|
|
965
970
|
throw _core.errorUtils.getNotFound();
|
|
966
971
|
}
|
|
967
972
|
const hasPackage = await storage.hasPackage(pkgName);
|
|
968
|
-
debug('has package %o
|
|
973
|
+
debug('has package %o is %o', pkgName, hasPackage);
|
|
969
974
|
return hasPackage;
|
|
970
975
|
}
|
|
971
976
|
|
|
@@ -1311,6 +1316,7 @@ class Storage {
|
|
|
1311
1316
|
* @returns
|
|
1312
1317
|
*/
|
|
1313
1318
|
async createNewLocalCachePackage(name, username) {
|
|
1319
|
+
debug('creating new package %o for user %o', name, username);
|
|
1314
1320
|
const storage = this.getPrivatePackageStorage(name);
|
|
1315
1321
|
if (!storage) {
|
|
1316
1322
|
debug(`storage is missing for %o package cannot be added`, name);
|
|
@@ -1472,7 +1478,7 @@ class Storage {
|
|
|
1472
1478
|
// etag??
|
|
1473
1479
|
});
|
|
1474
1480
|
|
|
1475
|
-
// if
|
|
1481
|
+
// if both local data and upstream data are empty, we throw an error
|
|
1476
1482
|
if (!remoteManifest && _lodash.default.isNull(data)) {
|
|
1477
1483
|
throw _core.errorUtils.getNotFound(`${_core.API_ERROR.NOT_PACKAGE_UPLINK}: ${name}`);
|
|
1478
1484
|
// if the remote manifest is empty, we return local data
|
|
@@ -1503,30 +1509,28 @@ class Storage {
|
|
|
1503
1509
|
proxy: ver npmjs
|
|
1504
1510
|
# one uplink setup
|
|
1505
1511
|
proxy: npmjs
|
|
1506
|
-
A package requires uplinks syncronization if
|
|
1507
|
-
|
|
1508
|
-
are made in serial and if 1st call fails, the second will be triggered, otherwise
|
|
1512
|
+
A package requires uplinks syncronization if the proxy section is defined. There can be
|
|
1513
|
+
more than one uplink. The more uplinks are defined, the longer the request will take.
|
|
1514
|
+
The requests are made in serial and if 1st call fails, the second will be triggered, otherwise
|
|
1509
1515
|
the 1st will reply and others will be discarded. The order is important.
|
|
1510
|
-
Errors on
|
|
1511
|
-
|
|
1516
|
+
Errors on uplinks that are considered are time outs, connection fails, and http status 304.
|
|
1517
|
+
In these cases the request returns empty body and we want ask next on the list if has fresh
|
|
1512
1518
|
updates.
|
|
1513
1519
|
*/
|
|
1514
1520
|
async syncUplinksMetadata(name, localManifest, options = {}) {
|
|
1515
1521
|
let found = localManifest !== null;
|
|
1516
1522
|
let syncManifest = null;
|
|
1517
|
-
|
|
1523
|
+
let upLinks = [];
|
|
1518
1524
|
const hasToLookIntoUplinks = _lodash.default.isNil(options.uplinksLook) || options.uplinksLook;
|
|
1519
1525
|
debug('is sync uplink enabled %o', hasToLookIntoUplinks);
|
|
1520
|
-
|
|
1521
|
-
|
|
1522
|
-
|
|
1523
|
-
upLinks.push(uplink);
|
|
1524
|
-
}
|
|
1526
|
+
if (hasToLookIntoUplinks) {
|
|
1527
|
+
upLinks = (0, _config.getProxiesForPackage)(name, this.config.packages);
|
|
1528
|
+
debug('uplinks found for %o: %o', name, upLinks);
|
|
1525
1529
|
}
|
|
1526
1530
|
|
|
1527
|
-
// if
|
|
1531
|
+
// if no uplinks match we return the local manifest
|
|
1528
1532
|
if (upLinks.length === 0) {
|
|
1529
|
-
debug('no uplinks found for %o upstream update aborted', name);
|
|
1533
|
+
debug('no uplinks found for %o, upstream update aborted', name);
|
|
1530
1534
|
return [localManifest, []];
|
|
1531
1535
|
}
|
|
1532
1536
|
const uplinksErrors = [];
|
|
@@ -1567,9 +1571,9 @@ class Storage {
|
|
|
1567
1571
|
const {
|
|
1568
1572
|
code
|
|
1569
1573
|
} = err;
|
|
1570
|
-
if (code ===
|
|
1574
|
+
if (code === _core.HTTP_STATUS.SERVICE_UNAVAILABLE) {
|
|
1571
1575
|
debug('uplinks sync failed with timeout error');
|
|
1572
|
-
throw
|
|
1576
|
+
throw err;
|
|
1573
1577
|
}
|
|
1574
1578
|
// we bubble up the 304 special error case
|
|
1575
1579
|
if (code === _core.HTTP_STATUS.NOT_MODIFIED) {
|
|
@@ -1596,7 +1600,7 @@ class Storage {
|
|
|
1596
1600
|
*/
|
|
1597
1601
|
async mergeCacheRemoteMetadata(uplink, cachedManifest, options) {
|
|
1598
1602
|
// we store which uplink is updating the manifest
|
|
1599
|
-
const upLinkMeta = cachedManifest._uplinks[uplink.
|
|
1603
|
+
const upLinkMeta = cachedManifest._uplinks[uplink.uplinkName];
|
|
1600
1604
|
let _cacheManifest = {
|
|
1601
1605
|
...cachedManifest
|
|
1602
1606
|
};
|
|
@@ -1605,7 +1609,7 @@ class Storage {
|
|
|
1605
1609
|
|
|
1606
1610
|
// we check the uplink cache is fresh
|
|
1607
1611
|
if (fetched && Date.now() - fetched < uplink.maxage) {
|
|
1608
|
-
debug('returning cached manifest for %o', uplink.
|
|
1612
|
+
debug('returning cached manifest for %o', uplink.uplinkName);
|
|
1609
1613
|
return cachedManifest;
|
|
1610
1614
|
}
|
|
1611
1615
|
}
|
|
@@ -1624,7 +1628,7 @@ class Storage {
|
|
|
1624
1628
|
throw err;
|
|
1625
1629
|
}
|
|
1626
1630
|
// updates the _uplink metadata fields, cache, etc
|
|
1627
|
-
_cacheManifest = (0, _storageUtils.updateUpLinkMetadata)(uplink.
|
|
1631
|
+
_cacheManifest = (0, _storageUtils.updateUpLinkMetadata)(uplink.uplinkName, _cacheManifest, etag);
|
|
1628
1632
|
// merge time field cache and remote
|
|
1629
1633
|
_cacheManifest = (0, _storageUtils.mergeUplinkTimeIntoLocalNext)(_cacheManifest, remoteManifest);
|
|
1630
1634
|
// update the _uplinks field in the cache
|