@verdaccio/store 8.0.0-next-8.12 → 8.0.0-next-8.14

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.
Files changed (49) hide show
  1. package/README.md +65 -27
  2. package/build/lib/star-utils.js +1 -1
  3. package/build/lib/star-utils.js.map +1 -1
  4. package/build/lib/storage-utils.d.ts +11 -9
  5. package/build/lib/storage-utils.js +4 -23
  6. package/build/lib/storage-utils.js.map +1 -1
  7. package/build/local-storage.js +1 -1
  8. package/build/local-storage.js.map +1 -1
  9. package/build/storage.d.ts +5 -5
  10. package/build/storage.js +44 -40
  11. package/build/storage.js.map +1 -1
  12. package/package.json +21 -17
  13. package/.babelrc +0 -3
  14. package/CHANGELOG.md +0 -2232
  15. package/src/index.ts +0 -5
  16. package/src/lib/star-utils.ts +0 -44
  17. package/src/lib/storage-utils.ts +0 -429
  18. package/src/lib/versions-utils.ts +0 -132
  19. package/src/local-storage.ts +0 -97
  20. package/src/storage.ts +0 -2072
  21. package/src/type.ts +0 -70
  22. package/test/fixtures/addTarball +0 -5
  23. package/test/fixtures/changePackage/metadata-change +0 -46
  24. package/test/fixtures/config/deprecate.yaml +0 -15
  25. package/test/fixtures/config/getTarball-getupstream.yaml +0 -17
  26. package/test/fixtures/config/publishWithOwnerAndCheck.yaml +0 -18
  27. package/test/fixtures/config/publishWithOwnerDefault.yaml +0 -15
  28. package/test/fixtures/config/syncDoubleUplinksMetadata.yaml +0 -10
  29. package/test/fixtures/config/syncNoUplinksMetadata.yaml +0 -17
  30. package/test/fixtures/config/syncSingleUplinksMetadata.yaml +0 -21
  31. package/test/fixtures/config/unpublishPackage.yaml +0 -13
  32. package/test/fixtures/config/updateManifest-1.yaml +0 -16
  33. package/test/fixtures/manifests/foo-npmjs.json +0 -253
  34. package/test/fixtures/manifests/foo-verdaccio.json +0 -253
  35. package/test/fixtures/metadata +0 -50
  36. package/test/fixtures/metadata-update-versions-tags +0 -97
  37. package/test/fixtures/search.json +0 -157
  38. package/test/fixtures/tarball.tgz +0 -0
  39. package/test/fixtures/test.utils.ts +0 -8
  40. package/test/helpers.ts +0 -22
  41. package/test/local-store.__disabled__.ts +0 -553
  42. package/test/search.spec.ts +0 -67
  43. package/test/star-utils.test.ts +0 -60
  44. package/test/storage-utils.spec.ts +0 -431
  45. package/test/storage.spec.ts +0 -2065
  46. package/test/versions.spec.ts +0 -167
  47. package/tsconfig.build.json +0 -9
  48. package/tsconfig.json +0 -38
  49. package/types/patch.d.ts +0 -12
package/README.md CHANGED
@@ -1,42 +1,80 @@
1
- # Verdaccio Search API
1
+ # @verdaccio/store - Verdaccio Storage
2
2
 
3
- The **Search** class in Verdaccio provides a convenient API for searching packages across both configured proxies and local storage. It enables efficient package discovery and retrieval by aggregating search results from multiple upstream sources.
3
+ [![Verdaccio Home](https://img.shields.io/badge/Homepage-Verdaccio-405236?style=flat)](https://verdaccio.org)
4
+ [![MIT License](https://img.shields.io/github/license/verdaccio/verdaccio?label=License&color=405236)](https://github.com/verdaccio/verdaccio/blob/master/LICENSE)
5
+ [![Verdaccio Latest](https://img.shields.io/npm/v/verdaccio?label=Latest%20Version&color=405236)](https://github.com/verdaccio/verdaccio)
6
+ [![This Package Latest](https://img.shields.io/npm/v/@verdaccio/store?label=@verdaccio/store&color=405236)](https://npmjs.com/package/@verdaccio/store)
4
7
 
5
- ## Installation
8
+ [![Documentation](https://img.shields.io/badge/Help-Verdaccio?style=flat&logo=Verdaccio&label=Verdaccio&color=cd4000)](https://verdaccio.org/docs)
9
+ [![Discord](https://img.shields.io/badge/Chat-Discord?style=flat&logo=Discord&label=Discord&color=cd4000)](https://discord.com/channels/388674437219745793)
10
+ [![Bluesky](https://img.shields.io/badge/Follow-Bluesky?style=flat&logo=Bluesky&label=Bluesky&color=cd4000)](https://bsky.app/profile/verdaccio.org)
11
+ [![Backers](https://img.shields.io/opencollective/backers/verdaccio?style=flat&logo=opencollective&label=Join%20Backers&color=cd4000)](https://opencollective.com/verdaccio/contribute)
12
+ [![Sponsors](https://img.shields.io/opencollective/sponsors/verdaccio?style=flat&logo=opencollective&label=Sponsor%20Us&color=cd4000)](https://opencollective.com/verdaccio/contribute)
6
13
 
7
- ```bash
8
- npm install @verdaccio/search
9
- ```
14
+ [![Verdaccio Downloads](https://img.shields.io/npm/dm/verdaccio?style=flat&logo=npm&label=Npm%20Downloads&color=lightgrey)](https://www.npmjs.com/package/verdaccio)
15
+ [![Docker Pulls](https://img.shields.io/docker/pulls/verdaccio/verdaccio?style=flat&logo=docker&label=Docker%20Pulls&color=lightgrey)](https://hub.docker.com/r/verdaccio/verdaccio)
16
+ [![GitHub Stars](https://img.shields.io/github/stars/verdaccio?style=flat&logo=github&label=GitHub%20Stars%20%E2%AD%90&color=lightgrey)](https://github.com/verdaccio/verdaccio/stargazers)
10
17
 
11
- ## Usage
18
+ ## Donations
12
19
 
13
- ```ts
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
- const config = new Config(configYaml);
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
- // Define search parameters
23
- const searchParams = {
24
- // specify search parameters as needed
25
- };
24
+ ## Report a vulnerability
26
25
 
27
- // Perform a search and retrieve the results
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
- ## Donations
28
+ ## Open Collective Sponsors
32
29
 
33
- 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.** 😉
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
- **[Donate](https://opencollective.com/verdaccio)** 💵👍🏻 starting from _\$1/month_ or just one single contribution.
32
+ [![sponsor](https://opencollective.com/verdaccio/sponsor/0/avatar.svg)](https://opencollective.com/verdaccio/sponsor/0/website)
33
+ [![sponsor](https://opencollective.com/verdaccio/sponsor/1/avatar.svg)](https://opencollective.com/verdaccio/sponsor/1/website)
34
+ [![sponsor](https://opencollective.com/verdaccio/sponsor/2/avatar.svg)](https://opencollective.com/verdaccio/sponsor/2/website)
35
+ [![sponsor](https://opencollective.com/verdaccio/sponsor/3/avatar.svg)](https://opencollective.com/verdaccio/sponsor/3/website)
36
+ [![sponsor](https://opencollective.com/verdaccio/sponsor/4/avatar.svg)](https://opencollective.com/verdaccio/sponsor/4/website)
37
+ [![sponsor](https://opencollective.com/verdaccio/sponsor/5/avatar.svg)](https://opencollective.com/verdaccio/sponsor/5/website)
38
+ [![sponsor](https://opencollective.com/verdaccio/sponsor/6/avatar.svg)](https://opencollective.com/verdaccio/sponsor/6/website)
39
+ [![sponsor](https://opencollective.com/verdaccio/sponsor/7/avatar.svg)](https://opencollective.com/verdaccio/sponsor/7/website)
40
+ [![sponsor](https://opencollective.com/verdaccio/sponsor/8/avatar.svg)](https://opencollective.com/verdaccio/sponsor/8/website)
41
+ [![sponsor](https://opencollective.com/verdaccio/sponsor/9/avatar.svg)](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
+ [![backers](https://opencollective.com/verdaccio/backers.svg?width=890)](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
+ [![jetbrains](https://github.com/verdaccio/verdaccio/blob/master/assets/thanks/jetbrains/logo.jpg?raw=true)](https://www.jetbrains.com/)
54
+ [![crowdin](https://github.com/verdaccio/verdaccio/blob/master/assets/thanks/crowdin/logo.png?raw=true)](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
+ [![contributors](https://opencollective.com/verdaccio/contributors.svg?width=890&button=true)](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
- ### License
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) files within the /assets folder) is
42
- [Creative Commons licensed](https://github.com/verdaccio/verdaccio/blob/master/LICENSE-docs).
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/).
@@ -40,6 +40,6 @@ function isExecutingStarCommand(localUsers, username, userIsAddingStar) {
40
40
  return true;
41
41
  }
42
42
  function isStarManifest(manifest) {
43
- return isPublishablePackage(manifest) === false && _core.validatioUtils.isObject(manifest.users);
43
+ return isPublishablePackage(manifest) === false && _core.validationUtils.isObject(manifest.users);
44
44
  }
45
45
  //# sourceMappingURL=star-utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"star-utils.js","names":["_core","require","isPublishablePackage","pkg","keys","Object","includes","isExecutingStarCommand","localUsers","username","userIsAddingStar","isExist","isStarManifest","manifest","validatioUtils","isObject","users"],"sources":["../../src/lib/star-utils.ts"],"sourcesContent":["import { validatioUtils } from '@verdaccio/core';\nimport { Manifest, PackageUsers } from '@verdaccio/types';\n\n/**\n * Check whether the package metadata has enough data to be published\n * @param pkg metadata\n */\nexport function isPublishablePackage(pkg: Manifest): boolean {\n // TODO: we can do better, no need get keys\n const keys: string[] = Object.keys(pkg);\n\n return keys.includes('versions');\n}\n\n/**\n * Verify if the user is actually executing an action, to avoid unnecessary calls\n * to the storage.\n * @param localUsers current state at cache\n * @param username user is executing the action\n * @param userIsAddingStar whether user is removing or adding star\n * @returns boolean\n */\nexport function isExecutingStarCommand(\n localUsers: PackageUsers,\n username: string,\n userIsAddingStar: boolean\n): boolean {\n const isExist = typeof localUsers[username] !== 'undefined';\n // fails if user already exist and us trying to add star.\n if (userIsAddingStar && isExist && localUsers[username]) {\n return false;\n // if is not adding a start but user exists (removing star)\n } else if (!userIsAddingStar && isExist) {\n return true;\n // fails if user does not exist and is not adding any star\n } else if (!userIsAddingStar && !isExist) {\n return false;\n }\n return true;\n}\n\nexport function isStarManifest(manifest: Manifest): boolean {\n return isPublishablePackage(manifest) === false && validatioUtils.isObject(manifest.users);\n}\n"],"mappings":";;;;;;;;AAAA,IAAAA,KAAA,GAAAC,OAAA;AAGA;AACA;AACA;AACA;AACO,SAASC,oBAAoBA,CAACC,GAAa,EAAW;EAC3D;EACA,MAAMC,IAAc,GAAGC,MAAM,CAACD,IAAI,CAACD,GAAG,CAAC;EAEvC,OAAOC,IAAI,CAACE,QAAQ,CAAC,UAAU,CAAC;AAClC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASC,sBAAsBA,CACpCC,UAAwB,EACxBC,QAAgB,EAChBC,gBAAyB,EAChB;EACT,MAAMC,OAAO,GAAG,OAAOH,UAAU,CAACC,QAAQ,CAAC,KAAK,WAAW;EAC3D;EACA,IAAIC,gBAAgB,IAAIC,OAAO,IAAIH,UAAU,CAACC,QAAQ,CAAC,EAAE;IACvD,OAAO,KAAK;IACZ;EACF,CAAC,MAAM,IAAI,CAACC,gBAAgB,IAAIC,OAAO,EAAE;IACvC,OAAO,IAAI;IACX;EACF,CAAC,MAAM,IAAI,CAACD,gBAAgB,IAAI,CAACC,OAAO,EAAE;IACxC,OAAO,KAAK;EACd;EACA,OAAO,IAAI;AACb;AAEO,SAASC,cAAcA,CAACC,QAAkB,EAAW;EAC1D,OAAOX,oBAAoB,CAACW,QAAQ,CAAC,KAAK,KAAK,IAAIC,oBAAc,CAACC,QAAQ,CAACF,QAAQ,CAACG,KAAK,CAAC;AAC5F","ignoreList":[]}
1
+ {"version":3,"file":"star-utils.js","names":["_core","require","isPublishablePackage","pkg","keys","Object","includes","isExecutingStarCommand","localUsers","username","userIsAddingStar","isExist","isStarManifest","manifest","validationUtils","isObject","users"],"sources":["../../src/lib/star-utils.ts"],"sourcesContent":["import { validationUtils } from '@verdaccio/core';\nimport { Manifest, PackageUsers } from '@verdaccio/types';\n\n/**\n * Check whether the package metadata has enough data to be published\n * @param pkg metadata\n */\nexport function isPublishablePackage(pkg: Manifest): boolean {\n // TODO: we can do better, no need get keys\n const keys: string[] = Object.keys(pkg);\n\n return keys.includes('versions');\n}\n\n/**\n * Verify if the user is actually executing an action, to avoid unnecessary calls\n * to the storage.\n * @param localUsers current state at cache\n * @param username user is executing the action\n * @param userIsAddingStar whether user is removing or adding star\n * @returns boolean\n */\nexport function isExecutingStarCommand(\n localUsers: PackageUsers,\n username: string,\n userIsAddingStar: boolean\n): boolean {\n const isExist = typeof localUsers[username] !== 'undefined';\n // fails if user already exist and us trying to add star.\n if (userIsAddingStar && isExist && localUsers[username]) {\n return false;\n // if is not adding a start but user exists (removing star)\n } else if (!userIsAddingStar && isExist) {\n return true;\n // fails if user does not exist and is not adding any star\n } else if (!userIsAddingStar && !isExist) {\n return false;\n }\n return true;\n}\n\nexport function isStarManifest(manifest: Manifest): boolean {\n return isPublishablePackage(manifest) === false && validationUtils.isObject(manifest.users);\n}\n"],"mappings":";;;;;;;;AAAA,IAAAA,KAAA,GAAAC,OAAA;AAGA;AACA;AACA;AACA;AACO,SAASC,oBAAoBA,CAACC,GAAa,EAAW;EAC3D;EACA,MAAMC,IAAc,GAAGC,MAAM,CAACD,IAAI,CAACD,GAAG,CAAC;EAEvC,OAAOC,IAAI,CAACE,QAAQ,CAAC,UAAU,CAAC;AAClC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASC,sBAAsBA,CACpCC,UAAwB,EACxBC,QAAgB,EAChBC,gBAAyB,EAChB;EACT,MAAMC,OAAO,GAAG,OAAOH,UAAU,CAACC,QAAQ,CAAC,KAAK,WAAW;EAC3D;EACA,IAAIC,gBAAgB,IAAIC,OAAO,IAAIH,UAAU,CAACC,QAAQ,CAAC,EAAE;IACvD,OAAO,KAAK;IACZ;EACF,CAAC,MAAM,IAAI,CAACC,gBAAgB,IAAIC,OAAO,EAAE;IACvC,OAAO,IAAI;IACX;EACF,CAAC,MAAM,IAAI,CAACD,gBAAgB,IAAI,CAACC,OAAO,EAAE;IACxC,OAAO,KAAK;EACd;EACA,OAAO,IAAI;AACb;AAEO,SAASC,cAAcA,CAACC,QAAkB,EAAW;EAC1D,OAAOX,oBAAoB,CAACW,QAAQ,CAAC,KAAK,KAAK,IAAIC,qBAAe,CAACC,QAAQ,CAACF,QAAQ,CAACG,KAAK,CAAC;AAC7F","ignoreList":[]}
@@ -1,5 +1,5 @@
1
1
  import { searchUtils } from '@verdaccio/core';
2
- import { AttachMents, GenericBody, Manifest, ReadmeOptions, Version, Versions } from '@verdaccio/types';
2
+ import { GenericBody, Manifest, ReadmeOptions, Version } from '@verdaccio/types';
3
3
  export declare const STORAGE: {
4
4
  PACKAGE_FILE_NAME: string;
5
5
  FILE_EXIST_ERROR: string;
@@ -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(uplinkId: any, manifest: Manifest, etag: string): {
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;
@@ -41,7 +46,7 @@ export declare function updateUpLinkMetadata(uplinkId: any, manifest: Manifest,
41
46
  description?: string | undefined;
42
47
  'dist-tags': GenericBody;
43
48
  time: GenericBody;
44
- versions: Versions;
49
+ versions: import("@verdaccio/types").Versions;
45
50
  maintainers?: import("@verdaccio/types").Author[] | undefined;
46
51
  contributors?: import("@verdaccio/types").Author[] | undefined;
47
52
  readme?: string | undefined;
@@ -59,17 +64,14 @@ export declare function updateUpLinkMetadata(uplinkId: any, manifest: Manifest,
59
64
  } | undefined;
60
65
  keywords?: string[] | undefined;
61
66
  author?: string | import("@verdaccio/types").Author | undefined;
62
- _attachments: AttachMents;
67
+ _attachments: import("@verdaccio/types").AttachMents;
63
68
  };
64
69
  export declare function prepareSearchPackage(data: Manifest): any;
65
- export declare function isDifferentThanOne(versions: Versions | AttachMents): boolean;
66
- export declare function hasInvalidPublishBody(manifest: Pick<Manifest, '_attachments' | 'versions'>): boolean;
67
70
  /**
68
71
  * Function gets a local info and an info from uplinks and tries to merge it
69
72
  exported for unit tests only.
70
- * @param {*} local
73
+ * @param {*} cacheManifest
71
74
  * @param {*} remoteManifest
72
- * @param {*} config configuration file
73
75
  */
74
76
  export declare function mergeVersions(cacheManifest: Manifest, remoteManifest: Manifest): Manifest;
75
77
  /**
@@ -11,9 +11,7 @@ exports.generatePackageTemplate = generatePackageTemplate;
11
11
  exports.generateRevision = generateRevision;
12
12
  exports.getLatestReadme = getLatestReadme;
13
13
  exports.hasDeprecatedVersions = hasDeprecatedVersions;
14
- exports.hasInvalidPublishBody = hasInvalidPublishBody;
15
14
  exports.isDeprecatedManifest = isDeprecatedManifest;
16
- exports.isDifferentThanOne = isDifferentThanOne;
17
15
  exports.mapManifestToSearchPackageBody = mapManifestToSearchPackageBody;
18
16
  exports.mergeUplinkTimeIntoLocal = mergeUplinkTimeIntoLocal;
19
17
  exports.mergeUplinkTimeIntoLocalNext = mergeUplinkTimeIntoLocalNext;
@@ -64,7 +62,7 @@ function normalizePackage(pkg) {
64
62
  const pkgProperties = ['versions', 'dist-tags', '_distfiles', '_attachments', '_uplinks', 'time'];
65
63
  pkgProperties.forEach(key => {
66
64
  const pkgProp = pkg[key];
67
- if ((0, _utils.isNil)(pkgProp) || _core.validatioUtils.isObject(pkgProp) === false) {
65
+ if ((0, _utils.isNil)(pkgProp) || _core.validationUtils.isObject(pkgProp) === false) {
68
66
  pkg[key] = {};
69
67
  }
70
68
  });
@@ -191,10 +189,10 @@ function mergeUplinkTimeIntoLocalNext(cacheManifest, remoteManifest) {
191
189
  }
192
190
  return cacheManifest;
193
191
  }
194
- function updateUpLinkMetadata(uplinkId, manifest, etag) {
192
+ function updateUpLinkMetadata(uplinkName, manifest, etag) {
195
193
  const _uplinks = {
196
194
  ...manifest._uplinks,
197
- [uplinkId]: {
195
+ [uplinkName]: {
198
196
  etag,
199
197
  fetched: Date.now()
200
198
  }
@@ -233,29 +231,12 @@ function prepareSearchPackage(data) {
233
231
  return pkg;
234
232
  }
235
233
  }
236
- function isDifferentThanOne(versions) {
237
- return Object.keys(versions).length !== 1;
238
- }
239
-
240
- // @deprecated use validationUtils.validatePublishNewPackage
241
- function hasInvalidPublishBody(manifest) {
242
- if (!manifest) {
243
- return false;
244
- }
245
- const {
246
- _attachments,
247
- versions
248
- } = manifest;
249
- const res = (0, _utils.isObject)(_attachments) === false || isDifferentThanOne(_attachments) || (0, _utils.isObject)(versions) === false || isDifferentThanOne(versions);
250
- return res;
251
- }
252
234
 
253
235
  /**
254
236
  * Function gets a local info and an info from uplinks and tries to merge it
255
237
  exported for unit tests only.
256
- * @param {*} local
238
+ * @param {*} cacheManifest
257
239
  * @param {*} remoteManifest
258
- * @param {*} config configuration file
259
240
  */
260
241
  function mergeVersions(cacheManifest, remoteManifest) {
261
242
  let _cacheManifest = {
@@ -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":"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","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","validationUtils","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","mergeVersions","_cacheManifest","deprecated","distTag","semver","lte","sorted","sortVersionsAndFilterInvalid","keys","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, validationUtils } from '@verdaccio/core';\nimport { API_ERROR, DIST_TAGS, HTTP_STATUS, MAINTAINERS, USERS } from '@verdaccio/core';\nimport { GenericBody, Manifest, ReadmeOptions, Version } from '@verdaccio/types';\nimport { generateRandomHexString, isNil } 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) || validationUtils.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\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 {*} cacheManifest\n * @param {*} remoteManifest\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;AAGA,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,qBAAe,CAACC,QAAQ,CAACH,OAAO,CAAC,KAAK,KAAK,EAAE;MACjEJ,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,UAAkB,EAAEC,QAAkB,EAAEC,IAAY,EAAE;EACzF,MAAMvE,QAAQ,GAAG;IACf,GAAGsE,QAAQ,CAACtE,QAAQ;IACpB,CAACqE,UAAU,GAAG;MACZE,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;;AAEA;AACA;AACA;AACA;AACA;AACA;AACO,SAASsF,aAAaA,CAACzB,aAAuB,EAAEC,cAAwB,EAAY;EACzF,IAAIyB,cAAc,GAAG;IAAE,GAAG1B;EAAc,CAAC;EACzC,MAAM;IAAEvE,QAAQ;IAAEC;EAAK,CAAC,GAAGuE,cAAc;EACzC;EACA;EACA;EACA,KAAK,MAAM5B,CAAC,IAAI5C,QAAQ,EAAE;IACxB,IAAI,OAAOiG,cAAc,CAACjG,QAAQ,CAAC4C,CAAC,CAAC,KAAK,WAAW,EAAE;MACrDqD,cAAc,CAACjG,QAAQ,CAAC4C,CAAC,CAAC,GAAG5C,QAAQ,CAAC4C,CAAC,CAAC;IAC1C,CAAC,MAAM,IAAI5C,QAAQ,CAAC4C,CAAC,CAAC,CAACsD,UAAU,EAAE;MACjCD,cAAc,CAACjG,QAAQ,CAAC4C,CAAC,CAAC,CAACsD,UAAU,GAAGlG,QAAQ,CAAC4C,CAAC,CAAC,CAACsD,UAAU;IAChE;EACF;EAEA,KAAK,MAAMtD,CAAC,IAAI3C,IAAI,EAAE;IACpB,IAAI,OAAOgG,cAAc,CAAChG,IAAI,CAAC2C,CAAC,CAAC,KAAK,WAAW,EAAE;MACjDqD,cAAc,CAAChG,IAAI,CAAC2C,CAAC,CAAC,GAAG3C,IAAI,CAAC2C,CAAC,CAAC;IAClC;EACF;EAEA,KAAK,MAAMuD,OAAO,IAAI3B,cAAc,CAACrE,eAAS,CAAC,EAAE;IAC/C,IAAI8F,cAAc,CAAC9F,eAAS,CAAC,CAACgG,OAAO,CAAC,KAAK3B,cAAc,CAACrE,eAAS,CAAC,CAACgG,OAAO,CAAC,EAAE;MAC7E,IACE,CAACF,cAAc,CAAC9F,eAAS,CAAC,CAACgG,OAAO,CAAC,IACnCC,eAAM,CAACC,GAAG,CAACJ,cAAc,CAAC9F,eAAS,CAAC,CAACgG,OAAO,CAAC,EAAE3B,cAAc,CAACrE,eAAS,CAAC,CAACgG,OAAO,CAAC,CAAC,EAClF;QACAF,cAAc,CAAC9F,eAAS,CAAC,CAACgG,OAAO,CAAC,GAAG3B,cAAc,CAACrE,eAAS,CAAC,CAACgG,OAAO,CAAC;MACzE;MACA,IACEA,OAAO,KAAK,QAAQ,IACpBF,cAAc,CAAC9F,eAAS,CAAC,CAACgG,OAAO,CAAC,KAAK3B,cAAc,CAACrE,eAAS,CAAC,CAACgG,OAAO,CAAC,EACzE;QACA;QACA;QACAF,cAAc,GAAG;UAAE,GAAGA,cAAc;UAAEtE,MAAM,EAAE6C,cAAc,CAAC7C;QAAO,CAAC;MACvE;IACF;EACF;EACA,OAAOsE,cAAc;AACvB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAAS9E,iBAAiBA,CAACwD,QAAkB,EAAY;EAC9D,IAAI2B,MAAM;EACV;EACA,IAAI,CAAC3B,QAAQ,CAACxE,eAAS,CAAC,CAAC+E,MAAM,EAAE;IAC/B;IACAoB,MAAM,GAAG,IAAAC,2CAA4B,EAACpE,MAAM,CAACqE,IAAI,CAAC7B,QAAQ,CAAC3E,QAAQ,CAAC,CAAC;IACrE,IAAIsG,MAAM,EAAEvC,MAAM,EAAE;MAClB;MACAY,QAAQ,CAACxE,eAAS,CAAC,CAAC+E,MAAM,GAAGoB,MAAM,CAACG,GAAG,CAAC,CAAC;IAC3C;EACF;EAEA,KAAK,MAAM1E,GAAG,IAAI4C,QAAQ,CAACxE,eAAS,CAAC,EAAE;IACrC;IACA;IACA,IAAIyB,eAAC,CAAC8E,OAAO,CAAC/B,QAAQ,CAACxE,eAAS,CAAC,CAAC4B,GAAG,CAAC,CAAC,EAAE;MACvC,IAAI4C,QAAQ,CAACxE,eAAS,CAAC,CAAC4B,GAAG,CAAC,CAACgC,MAAM,EAAE;QACnC;QACA;QACA;QACAuC,MAAM,GAAG,IAAAC,2CAA4B,EAAC5B,QAAQ,CAACxE,eAAS,CAAC,CAAC4B,GAAG,CAAC,CAAC;QAC/D,IAAIuE,MAAM,CAACvC,MAAM,EAAE;UACjB;UACAY,QAAQ,CAACxE,eAAS,CAAC,CAAC4B,GAAG,CAAC,GAAGuE,MAAM,CAACG,GAAG,CAAC,CAAC;QACzC;MACF,CAAC,MAAM;QACL,OAAO9B,QAAQ,CAACxE,eAAS,CAAC,CAAC4B,GAAG,CAAC;MACjC;IACF,CAAC,MAAM,IAAIH,eAAC,CAAC+E,QAAQ,CAAChC,QAAQ,CAACxE,eAAS,CAAC,CAAC4B,GAAG,CAAC,CAAC,EAAE;MAC/C,IAAI,CAACqE,eAAM,CAACQ,KAAK,CAACjC,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,SAASkC,qBAAqBA,CAACC,OAAiB,EAAW;EAChE,MAAM;IAAE9G;EAAS,CAAC,GAAG8G,OAAO;EAC5B,KAAK,MAAM9E,OAAO,IAAIhC,QAAQ,EAAE;IAC9B,IAAImC,MAAM,CAAC4E,SAAS,CAACC,cAAc,CAACC,IAAI,CAACjH,QAAQ,CAACgC,OAAO,CAAC,EAAE,YAAY,CAAC,EAAE;MACzE,OAAO,IAAI;IACb;EACF;EACA,OAAO,KAAK;AACd;AAEO,SAASkF,oBAAoBA,CAACvC,QAAkB,EAAW;EAChE,OACEkC,qBAAqB,CAAClC,QAAQ,CAAC,KAC9B,OAAOA,QAAQ,CAACpE,YAAY,KAAK,WAAW,IAC3C4B,MAAM,CAACqE,IAAI,CAAC7B,QAAQ,CAACpE,YAAY,CAAC,CAACwD,MAAM,KAAK,CAAC,CAAC;AAEtD;AAEO,SAASoD,8BAA8BA,CAC5CzG,GAAa,EACb0G,UAAkC,EACH;EAC/B,MAAMlC,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;IAClBsH,KAAK,EAAE,EAAE;IACThC,WAAW,EAAErD,OAAO,CAACqD,WAAW;IAChCrD,OAAO,EAAEkD,MAAM;IACfW,QAAQ,EAAE7D,OAAO,CAAC6D,QAAQ;IAC1ByB,IAAI,EAAE5G,GAAG,CAACT,IAAI,CAACiF,MAAM,CAAC;IACtB;IACAK,MAAM,EAAEvD,OAAO,CAACuD,MAAa;IAC7B;IACAgC,SAAS,EAAE,CAAC,CAAC;IACb;IACAjC,WAAW,EAAEtD,OAAO,CAACsD,WAAkB;IACvCkC,KAAK,EAAE;MACLC,GAAG,EAAE,EAAE;MACP7B,QAAQ,EAAE5D,OAAO,CAAC4D,QAAQ;MAC1BF,UAAU,EAAE1D,OAAO,CAAC0D,UAAU;MAC9BI,IAAI,EAAE9D,OAAO,CAAC8D;IAChB;EACF,CAAC;EAED,IAAI,OAAOsB,UAAU,CAACM,OAAO,CAACC,MAAM,KAAK,QAAQ,EAAE;IACjDnF,MAAM,CAAC6E,KAAK,GAAGD,UAAU,CAACM,OAAO,CAACC,MAAM;EAC1C;EAEA,OAAOnF,MAAM;AACf","ignoreList":[]}
@@ -68,7 +68,7 @@ class LocalStorage {
68
68
  logger: this.logger
69
69
  }, plugin => {
70
70
  return typeof plugin.getPackageStorage !== 'undefined';
71
- }, this.config?.serverSettings?.pluginPrefix, _core.PLUGIN_CATEGORY.STORAGE);
71
+ }, false, this.config?.serverSettings?.pluginPrefix, _core.PLUGIN_CATEGORY.STORAGE);
72
72
  if (plugins.length > 1) {
73
73
  this.logger.warn('more than one storage plugins has been detected, multiple storage are not supported, one will be selected automatically');
74
74
  }
@@ -1 +1 @@
1
- {"version":3,"file":"local-storage.js","names":["_assert","_interopRequireDefault","require","_debug","_lodash","_core","_loaders","_localStorage","e","__esModule","default","debug","buildDebug","noSuchFile","exports","resourceNotAvailable","LocalStorage","constructor","config","logger","child","sub","storagePlugin","init","loadStorage","warn","getStoragePlugin","errorUtils","getInternalError","getSecret","secretKey","setSecret","checkSecretKey","Storage","loadStorePlugin","_","isNil","assert","storage","localStorage","LocalDatabase","info","name","pluginCategory","PLUGIN_CATEGORY","STORAGE","plugins","asyncLoadPlugin","store","plugin","getPackageStorage","serverSettings","pluginPrefix","length","head"],"sources":["../src/local-storage.ts"],"sourcesContent":["import assert from 'assert';\nimport buildDebug from 'debug';\nimport _ from 'lodash';\n\nimport { PLUGIN_CATEGORY, errorUtils, pluginUtils } from '@verdaccio/core';\nimport { asyncLoadPlugin } from '@verdaccio/loaders';\nimport LocalDatabase from '@verdaccio/local-storage';\nimport { Config, Logger } from '@verdaccio/types';\n\nconst debug = buildDebug('verdaccio:storage:local');\n\nexport const noSuchFile = 'ENOENT';\nexport const resourceNotAvailable = 'EAGAIN';\nexport type PluginStorage = pluginUtils.Storage<Config>;\n\n/**\n * Implements Storage interface (same for storage.js, local-storage.js, up-storage.js).\n */\nclass LocalStorage {\n public config: Config;\n public storagePlugin: PluginStorage;\n public logger: Logger;\n\n public constructor(config: Config, logger: Logger) {\n debug('local storage created');\n this.logger = logger.child({ sub: 'fs' });\n this.config = config;\n // @ts-expect-error\n this.storagePlugin = null;\n }\n\n public async init() {\n if (this.storagePlugin === null) {\n this.storagePlugin = await this.loadStorage(this.config, this.logger);\n debug('storage plugin init');\n await this.storagePlugin.init();\n debug('storage plugin initialized');\n } else {\n this.logger.warn('storage plugin has been already initialized');\n }\n return;\n }\n\n public getStoragePlugin(): PluginStorage {\n if (this.storagePlugin === null) {\n throw errorUtils.getInternalError('storage plugin is not initialized');\n }\n\n return this.storagePlugin;\n }\n\n public async getSecret(config: Config): Promise<void> {\n const secretKey = await this.storagePlugin.getSecret();\n\n return this.storagePlugin.setSecret(config.checkSecretKey(secretKey));\n }\n\n private async loadStorage(config: Config, logger: Logger): Promise<PluginStorage> {\n const Storage = await this.loadStorePlugin();\n if (_.isNil(Storage)) {\n assert(this.config.storage, 'CONFIG: storage path not defined');\n debug('no custom storage found, loading default storage @verdaccio/local-storage');\n const localStorage = new LocalDatabase(config, logger);\n logger.info(\n { name: '@verdaccio/local-storage', pluginCategory: PLUGIN_CATEGORY.STORAGE },\n 'plugin @{name} successfully loaded (@{pluginCategory})'\n );\n return localStorage;\n }\n return Storage as PluginStorage;\n }\n\n private async loadStorePlugin(): Promise<PluginStorage | undefined> {\n const plugins: PluginStorage[] = await asyncLoadPlugin<pluginUtils.Storage<unknown>>(\n this.config.store,\n {\n config: this.config,\n logger: this.logger,\n },\n (plugin) => {\n return typeof plugin.getPackageStorage !== 'undefined';\n },\n this.config?.serverSettings?.pluginPrefix,\n PLUGIN_CATEGORY.STORAGE\n );\n\n if (plugins.length > 1) {\n this.logger.warn(\n 'more than one storage plugins has been detected, multiple storage are not supported, one will be selected automatically'\n );\n }\n\n return _.head(plugins);\n }\n}\n\nexport { LocalStorage };\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"local-storage.js","names":["_assert","_interopRequireDefault","require","_debug","_lodash","_core","_loaders","_localStorage","e","__esModule","default","debug","buildDebug","noSuchFile","exports","resourceNotAvailable","LocalStorage","constructor","config","logger","child","sub","storagePlugin","init","loadStorage","warn","getStoragePlugin","errorUtils","getInternalError","getSecret","secretKey","setSecret","checkSecretKey","Storage","loadStorePlugin","_","isNil","assert","storage","localStorage","LocalDatabase","info","name","pluginCategory","PLUGIN_CATEGORY","STORAGE","plugins","asyncLoadPlugin","store","plugin","getPackageStorage","serverSettings","pluginPrefix","length","head"],"sources":["../src/local-storage.ts"],"sourcesContent":["import assert from 'assert';\nimport buildDebug from 'debug';\nimport _ from 'lodash';\n\nimport { PLUGIN_CATEGORY, errorUtils, pluginUtils } from '@verdaccio/core';\nimport { asyncLoadPlugin } from '@verdaccio/loaders';\nimport LocalDatabase from '@verdaccio/local-storage';\nimport { Config, Logger } from '@verdaccio/types';\n\nconst debug = buildDebug('verdaccio:storage:local');\n\nexport const noSuchFile = 'ENOENT';\nexport const resourceNotAvailable = 'EAGAIN';\nexport type PluginStorage = pluginUtils.Storage<Config>;\n\n/**\n * Implements Storage interface (same for storage.js, local-storage.js, up-storage.js).\n */\nclass LocalStorage {\n public config: Config;\n public storagePlugin: PluginStorage;\n public logger: Logger;\n\n public constructor(config: Config, logger: Logger) {\n debug('local storage created');\n this.logger = logger.child({ sub: 'fs' });\n this.config = config;\n // @ts-expect-error\n this.storagePlugin = null;\n }\n\n public async init() {\n if (this.storagePlugin === null) {\n this.storagePlugin = await this.loadStorage(this.config, this.logger);\n debug('storage plugin init');\n await this.storagePlugin.init();\n debug('storage plugin initialized');\n } else {\n this.logger.warn('storage plugin has been already initialized');\n }\n return;\n }\n\n public getStoragePlugin(): PluginStorage {\n if (this.storagePlugin === null) {\n throw errorUtils.getInternalError('storage plugin is not initialized');\n }\n\n return this.storagePlugin;\n }\n\n public async getSecret(config: Config): Promise<void> {\n const secretKey = await this.storagePlugin.getSecret();\n\n return this.storagePlugin.setSecret(config.checkSecretKey(secretKey));\n }\n\n private async loadStorage(config: Config, logger: Logger): Promise<PluginStorage> {\n const Storage = await this.loadStorePlugin();\n if (_.isNil(Storage)) {\n assert(this.config.storage, 'CONFIG: storage path not defined');\n debug('no custom storage found, loading default storage @verdaccio/local-storage');\n const localStorage = new LocalDatabase(config, logger);\n logger.info(\n { name: '@verdaccio/local-storage', pluginCategory: PLUGIN_CATEGORY.STORAGE },\n 'plugin @{name} successfully loaded (@{pluginCategory})'\n );\n return localStorage;\n }\n return Storage as PluginStorage;\n }\n\n private async loadStorePlugin(): Promise<PluginStorage | undefined> {\n const plugins: PluginStorage[] = await asyncLoadPlugin<pluginUtils.Storage<unknown>>(\n this.config.store,\n {\n config: this.config,\n logger: this.logger,\n },\n (plugin) => {\n return typeof plugin.getPackageStorage !== 'undefined';\n },\n false,\n this.config?.serverSettings?.pluginPrefix,\n PLUGIN_CATEGORY.STORAGE\n );\n\n if (plugins.length > 1) {\n this.logger.warn(\n 'more than one storage plugins has been detected, multiple storage are not supported, one will be selected automatically'\n );\n }\n\n return _.head(plugins);\n }\n}\n\nexport { LocalStorage };\n"],"mappings":"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","ignoreList":[]}
@@ -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 enables the proxy section, uplinks
215
- can be more than one, the more are the most slow request will take, the request
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 upkinks are considered are, time outs, connection fails and http status 304,
220
- in that case the request returns empty body and we want ask next on the list if has fresh
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]>;