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

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 (72) hide show
  1. package/CHANGELOG.md +92 -0
  2. package/build/index.d.ts +5 -4
  3. package/build/index.js +31 -15
  4. package/build/index.js.map +1 -1
  5. package/build/lib/TransFormResults.d.ts +15 -0
  6. package/build/lib/TransFormResults.js +61 -0
  7. package/build/lib/TransFormResults.js.map +1 -0
  8. package/build/lib/search-utils.d.ts +4 -0
  9. package/build/lib/search-utils.js +59 -0
  10. package/build/lib/search-utils.js.map +1 -0
  11. package/build/lib/star-utils.d.ts +14 -0
  12. package/build/{star-utils.js → lib/star-utils.js} +16 -2
  13. package/build/lib/star-utils.js.map +1 -0
  14. package/build/lib/storage-utils.d.ts +82 -0
  15. package/build/{storage-utils.js → lib/storage-utils.js} +173 -60
  16. package/build/lib/storage-utils.js.map +1 -0
  17. package/build/lib/uplink-util.d.ts +10 -0
  18. package/build/lib/uplink-util.js +49 -0
  19. package/build/lib/uplink-util.js.map +1 -0
  20. package/build/lib/versions-utils.d.ts +28 -0
  21. package/build/lib/versions-utils.js +104 -0
  22. package/build/lib/versions-utils.js.map +1 -0
  23. package/build/local-storage.d.ts +3 -165
  24. package/build/local-storage.js +6 -1166
  25. package/build/local-storage.js.map +1 -1
  26. package/build/storage.d.ts +242 -86
  27. package/build/storage.js +1681 -548
  28. package/build/storage.js.map +1 -1
  29. package/build/type.d.ts +42 -19
  30. package/build/type.js.map +1 -1
  31. package/jest.config.js +8 -2
  32. package/package.json +71 -71
  33. package/src/index.ts +5 -4
  34. package/src/lib/TransFormResults.ts +42 -0
  35. package/src/lib/search-utils.ts +50 -0
  36. package/src/{star-utils.ts → lib/star-utils.ts} +16 -5
  37. package/src/lib/storage-utils.ts +362 -0
  38. package/src/lib/uplink-util.ts +41 -0
  39. package/src/lib/versions-utils.ts +87 -0
  40. package/src/local-storage.ts +7 -1217
  41. package/src/storage.ts +1683 -635
  42. package/src/type.ts +47 -21
  43. package/test/fixtures/config/getTarballNext-getupstream.yaml +17 -0
  44. package/test/fixtures/config/syncDoubleUplinksMetadata.yaml +25 -0
  45. package/test/fixtures/config/syncNoUplinksMetadata.yaml +17 -0
  46. package/test/fixtures/config/syncSingleUplinksMetadata.yaml +21 -0
  47. package/test/fixtures/config/updateManifest-1.yaml +16 -0
  48. package/test/fixtures/manifests/foo-npmjs.json +253 -0
  49. package/test/fixtures/manifests/foo-verdaccio.json +253 -0
  50. package/test/fixtures/tarball.tgz +0 -0
  51. package/test/helpers.ts +22 -0
  52. package/test/local-store.__disabled__.ts +553 -0
  53. package/test/search.spec.ts +4 -5
  54. package/test/star.spec.ts +31 -0
  55. package/test/storage-utils.spec.ts +129 -42
  56. package/test/storage.spec.ts +943 -33
  57. package/test/versions.spec.ts +109 -0
  58. package/tsconfig.json +6 -3
  59. package/build/search.d.ts +0 -35
  60. package/build/search.js +0 -198
  61. package/build/search.js.map +0 -1
  62. package/build/star-utils.d.ts +0 -9
  63. package/build/star-utils.js.map +0 -1
  64. package/build/storage-utils.d.ts +0 -39
  65. package/build/storage-utils.js.map +0 -1
  66. package/build/uplink-util.d.ts +0 -7
  67. package/build/uplink-util.js +0 -38
  68. package/build/uplink-util.js.map +0 -1
  69. package/src/search.ts +0 -175
  70. package/src/storage-utils.ts +0 -263
  71. package/src/uplink-util.ts +0 -32
  72. package/test/local-storage.spec.ts +0 -583
@@ -4,20 +4,23 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.WHITELIST = exports.STORAGE = void 0;
7
- exports.checkPackageLocal = checkPackageLocal;
8
7
  exports.checkPackageRemote = checkPackageRemote;
9
8
  exports.cleanUpLinksRef = cleanUpLinksRef;
10
9
  exports.cleanUpReadme = cleanUpReadme;
11
10
  exports.generatePackageTemplate = generatePackageTemplate;
12
11
  exports.generateRevision = generateRevision;
13
12
  exports.getLatestReadme = getLatestReadme;
13
+ exports.hasDeprecatedVersions = hasDeprecatedVersions;
14
14
  exports.hasInvalidPublishBody = hasInvalidPublishBody;
15
+ exports.isDeprecatedManifest = isDeprecatedManifest;
15
16
  exports.isDifferentThanOne = isDifferentThanOne;
16
17
  exports.mergeUplinkTimeIntoLocal = mergeUplinkTimeIntoLocal;
18
+ exports.mergeUplinkTimeIntoLocalNext = mergeUplinkTimeIntoLocalNext;
19
+ exports.mergeVersions = mergeVersions;
20
+ exports.normalizeDistTags = normalizeDistTags;
17
21
  exports.normalizePackage = normalizePackage;
18
22
  exports.prepareSearchPackage = prepareSearchPackage;
19
- exports.publishPackage = publishPackage;
20
- exports.tagVersion = tagVersion;
23
+ exports.updateUpLinkMetadata = updateUpLinkMetadata;
21
24
 
22
25
  var _lodash = _interopRequireDefault(require("lodash"));
23
26
 
@@ -27,6 +30,8 @@ var _core = require("@verdaccio/core");
27
30
 
28
31
  var _utils = require("@verdaccio/utils");
29
32
 
33
+ var _versionsUtils = require("./versions-utils");
34
+
30
35
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
31
36
 
32
37
  const STORAGE = {
@@ -35,6 +40,12 @@ const STORAGE = {
35
40
  NO_SUCH_FILE_ERROR: 'ENOENT',
36
41
  DEFAULT_REVISION: '0-0000000000000000'
37
42
  };
43
+ /**
44
+ * Create a new package in the storage, return a boilerplate package
45
+ * @param name package name
46
+ * @returns {Manifest}
47
+ */
48
+
38
49
  exports.STORAGE = STORAGE;
39
50
 
40
51
  function generatePackageTemplate(name) {
@@ -67,16 +78,16 @@ function normalizePackage(pkg) {
67
78
  }
68
79
  });
69
80
 
70
- if (_lodash.default.isString(pkg._rev) === false) {
81
+ if (typeof (pkg === null || pkg === void 0 ? void 0 : pkg._rev) !== 'string') {
71
82
  pkg._rev = STORAGE.DEFAULT_REVISION;
72
83
  }
73
84
 
74
- if (_lodash.default.isString(pkg._id) === false) {
85
+ if (typeof (pkg === null || pkg === void 0 ? void 0 : pkg._id) !== 'string') {
75
86
  pkg._id = pkg.name;
76
87
  } // normalize dist-tags
77
88
 
78
89
 
79
- return (0, _utils.normalizeDistTags)(pkg);
90
+ return normalizeDistTags(pkg);
80
91
  }
81
92
 
82
93
  function generateRevision(rev) {
@@ -138,42 +149,10 @@ function cleanUpLinksRef(result, keepUpLinkData) {
138
149
  }
139
150
 
140
151
  return result;
141
- }
142
- /**
143
- * Check whether a package it is already a local package
144
- * @param {*} name
145
- * @param {*} localStorage
146
- */
152
+ } // TODO: move to abstract storage
153
+ // @deprecated use abstract.storage.ts:checkPackageRemote
147
154
 
148
155
 
149
- function checkPackageLocal(name, localStorage) {
150
- return new Promise((resolve, reject) => {
151
- localStorage.getPackageMetadata(name, (err, results) => {
152
- if (!(0, _utils.isNil)(err) && err.status !== _core.HTTP_STATUS.NOT_FOUND) {
153
- return reject(err);
154
- }
155
-
156
- if (results) {
157
- return reject(_core.errorUtils.getConflict(_core.API_ERROR.PACKAGE_EXIST));
158
- }
159
-
160
- return resolve();
161
- });
162
- });
163
- }
164
-
165
- function publishPackage(name, metadata, localStorage) {
166
- return new Promise((resolve, reject) => {
167
- localStorage.addPackage(name, metadata, err => {
168
- if (!_lodash.default.isNull(err)) {
169
- return reject(err);
170
- }
171
-
172
- return resolve();
173
- });
174
- });
175
- }
176
-
177
156
  function checkPackageRemote(name, isAllowPublishOffline, syncMetadata) {
178
157
  return new Promise((resolve, reject) => {
179
158
  syncMetadata(name, null, {}, (err, packageJsonLocal, upLinksErrors) => {
@@ -204,7 +183,8 @@ function checkPackageRemote(name, isAllowPublishOffline, syncMetadata) {
204
183
  return resolve();
205
184
  });
206
185
  });
207
- }
186
+ } // @deprecated use export function mergeUplinkTimeIntoLocalNext
187
+
208
188
 
209
189
  function mergeUplinkTimeIntoLocal(localMetadata, remoteMetadata) {
210
190
  if ('time' in remoteMetadata) {
@@ -214,6 +194,31 @@ function mergeUplinkTimeIntoLocal(localMetadata, remoteMetadata) {
214
194
  return localMetadata.time;
215
195
  }
216
196
 
197
+ function mergeUplinkTimeIntoLocalNext(cacheManifest, remoteManifest) {
198
+ if ('time' in remoteManifest) {
199
+ // remote override cache time conflicts
200
+ return { ...cacheManifest,
201
+ time: { ...cacheManifest.time,
202
+ ...remoteManifest.time
203
+ }
204
+ };
205
+ }
206
+
207
+ return cacheManifest;
208
+ }
209
+
210
+ function updateUpLinkMetadata(uplinkId, manifest, etag) {
211
+ const _uplinks = { ...manifest._uplinks,
212
+ [uplinkId]: {
213
+ etag,
214
+ fetched: Date.now()
215
+ }
216
+ };
217
+ return { ...manifest,
218
+ _uplinks
219
+ };
220
+ }
221
+
217
222
  function prepareSearchPackage(data) {
218
223
  const latest = _core.pkgUtils.getLatest(data);
219
224
 
@@ -244,28 +249,11 @@ function prepareSearchPackage(data) {
244
249
  return pkg;
245
250
  }
246
251
  }
247
- /**
248
- * Create a tag for a package
249
- * @param {*} data
250
- * @param {*} version
251
- * @param {*} tag
252
- * @return {Boolean} whether a package has been tagged
253
- */
254
-
255
-
256
- function tagVersion(data, version, tag) {
257
- if (tag && data[_core.DIST_TAGS][tag] !== version && _semver.default.parse(version, true)) {
258
- // valid version - store
259
- data[_core.DIST_TAGS][tag] = version;
260
- return true;
261
- }
262
-
263
- return false;
264
- }
265
252
 
266
253
  function isDifferentThanOne(versions) {
267
254
  return Object.keys(versions).length !== 1;
268
- }
255
+ } // @deprecated use validationUtils.validatePublishNewPackage
256
+
269
257
 
270
258
  function hasInvalidPublishBody(manifest) {
271
259
  if (!manifest) {
@@ -279,4 +267,129 @@ function hasInvalidPublishBody(manifest) {
279
267
  const res = (0, _utils.isObject)(_attachments) === false || isDifferentThanOne(_attachments) || (0, _utils.isObject)(versions) === false || isDifferentThanOne(versions);
280
268
  return res;
281
269
  }
270
+ /**
271
+ * Function gets a local info and an info from uplinks and tries to merge it
272
+ exported for unit tests only.
273
+ * @param {*} local
274
+ * @param {*} remoteManifest
275
+ * @param {*} config configuration file
276
+ */
277
+
278
+
279
+ function mergeVersions(cacheManifest, remoteManifest) {
280
+ let _cacheManifest = { ...cacheManifest
281
+ };
282
+ const {
283
+ versions,
284
+ time
285
+ } = remoteManifest; // copy new versions to a cache
286
+ // NOTE: if a certain version was updated, we can't refresh it reliably
287
+
288
+ for (const i in versions) {
289
+ if (typeof cacheManifest.versions[i] === 'undefined') {
290
+ _cacheManifest.versions[i] = versions[i];
291
+ }
292
+ }
293
+
294
+ for (const i in time) {
295
+ if (typeof cacheManifest.time[i] === 'undefined') {
296
+ _cacheManifest.time[i] = time[i];
297
+ }
298
+ }
299
+
300
+ for (const distTag in remoteManifest[_core.DIST_TAGS]) {
301
+ if (_cacheManifest[_core.DIST_TAGS][distTag] !== remoteManifest[_core.DIST_TAGS][distTag]) {
302
+ if (!_cacheManifest[_core.DIST_TAGS][distTag] || _semver.default.lte(_cacheManifest[_core.DIST_TAGS][distTag], remoteManifest[_core.DIST_TAGS][distTag])) {
303
+ _cacheManifest[_core.DIST_TAGS][distTag] = remoteManifest[_core.DIST_TAGS][distTag];
304
+ }
305
+
306
+ if (distTag === 'latest' && _cacheManifest[_core.DIST_TAGS][distTag] === remoteManifest[_core.DIST_TAGS][distTag]) {
307
+ // NOTE: this override the latest publish readme from local cache with
308
+ // the remote one
309
+ cacheManifest = { ..._cacheManifest,
310
+ readme: remoteManifest.readme
311
+ };
312
+ }
313
+ }
314
+ }
315
+
316
+ return cacheManifest;
317
+ }
318
+ /**
319
+ * Normalize dist-tags.
320
+ *
321
+ * There is a legacy behaviour where the dist-tags could be an array, in such
322
+ * case, the array is orderded and the highest version becames the
323
+ * latest.
324
+ *
325
+ * The dist-tag tags must be plain strigs, if the latest is empty (for whatever reason) is
326
+ * normalized to be the highest version available.
327
+ *
328
+ * This function cleans up every invalid version on dist-tags, but does not remove
329
+ * invalid versions from the manifest.
330
+ *
331
+ * @param {*} data
332
+ */
333
+
334
+
335
+ function normalizeDistTags(manifest) {
336
+ let sorted; // handle missing latest dist-tag
337
+
338
+ if (!manifest[_core.DIST_TAGS].latest) {
339
+ var _sorted;
340
+
341
+ // if there is no latest tag, set the highest known version based on semver sort
342
+ sorted = (0, _versionsUtils.sortVersionsAndFilterInvalid)(Object.keys(manifest.versions));
343
+
344
+ if ((_sorted = sorted) !== null && _sorted !== void 0 && _sorted.length) {
345
+ // get the highest published version
346
+ manifest[_core.DIST_TAGS].latest = sorted.pop();
347
+ }
348
+ }
349
+
350
+ for (const tag in manifest[_core.DIST_TAGS]) {
351
+ // deprecated (will be removed un future majors)
352
+ // this should not happen, tags should be plain strings, legacy fallback
353
+ if (_lodash.default.isArray(manifest[_core.DIST_TAGS][tag])) {
354
+ if (manifest[_core.DIST_TAGS][tag].length) {
355
+ // sort array
356
+ // FIXME: this is clearly wrong, we need to research why this is like this.
357
+ // @ts-ignore
358
+ sorted = (0, _versionsUtils.sortVersionsAndFilterInvalid)(manifest[_core.DIST_TAGS][tag]);
359
+
360
+ if (sorted.length) {
361
+ // use highest version based on semver sort
362
+ manifest[_core.DIST_TAGS][tag] = sorted.pop();
363
+ }
364
+ } else {
365
+ delete manifest[_core.DIST_TAGS][tag];
366
+ }
367
+ } else if (_lodash.default.isString(manifest[_core.DIST_TAGS][tag])) {
368
+ if (!_semver.default.parse(manifest[_core.DIST_TAGS][tag], true)) {
369
+ // if the version is invalid, delete the dist-tag entry
370
+ delete manifest[_core.DIST_TAGS][tag];
371
+ }
372
+ }
373
+ }
374
+
375
+ return manifest;
376
+ }
377
+
378
+ function hasDeprecatedVersions(pkgInfo) {
379
+ const {
380
+ versions
381
+ } = pkgInfo;
382
+
383
+ for (const version in versions) {
384
+ if (Object.prototype.hasOwnProperty.call(versions[version], 'deprecated')) {
385
+ return true;
386
+ }
387
+ }
388
+
389
+ return false;
390
+ }
391
+
392
+ function isDeprecatedManifest(manifest) {
393
+ return hasDeprecatedVersions(manifest) && Object.keys(manifest._attachments).length === 0;
394
+ }
282
395
  //# sourceMappingURL=storage-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage-utils.js","names":["STORAGE","PACKAGE_FILE_NAME","FILE_EXIST_ERROR","NO_SUCH_FILE_ERROR","DEFAULT_REVISION","generatePackageTemplate","name","versions","time","USERS","DIST_TAGS","_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","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","Object","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","distTag","semver","lte","sorted","sortVersionsAndFilterInvalid","pop","isArray","isString","parse","hasDeprecatedVersions","pkgInfo","prototype","hasOwnProperty","call","isDeprecatedManifest"],"sources":["../../src/lib/storage-utils.ts"],"sourcesContent":["import _ from 'lodash';\nimport semver from 'semver';\n\nimport { errorUtils, pkgUtils, validatioUtils } from '@verdaccio/core';\nimport { API_ERROR, DIST_TAGS, HTTP_STATUS, USERS } from '@verdaccio/core';\nimport { AttachMents, Manifest, Version, Versions } 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 _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// FIXME: type any due this\nexport function cleanUpReadme(version: any): Version {\n if (isNil(version) === false) {\n delete 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];\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 for (const i in versions) {\n if (typeof cacheManifest.versions[i] === 'undefined') {\n _cacheManifest.versions[i] = versions[i];\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\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 hasDeprecatedVersions(manifest) && Object.keys(manifest._attachments).length === 0;\n}\n"],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { IProxy } from '@verdaccio/proxy';
2
+ import { Config, Manifest } from '@verdaccio/types';
3
+ export interface ProxyInstanceList {
4
+ [key: string]: IProxy;
5
+ }
6
+ /**
7
+ * Set up the Up Storage for each link.
8
+ */
9
+ export declare function setupUpLinks(config: Config): ProxyInstanceList;
10
+ export declare function updateVersionsHiddenUpLinkNext(manifest: Manifest, upLink: IProxy): Manifest;
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.setupUpLinks = setupUpLinks;
7
+ exports.updateVersionsHiddenUpLinkNext = updateVersionsHiddenUpLinkNext;
8
+
9
+ var _proxy = require("@verdaccio/proxy");
10
+
11
+ /**
12
+ * Set up the Up Storage for each link.
13
+ */
14
+ function setupUpLinks(config) {
15
+ const uplinks = {};
16
+
17
+ for (const uplinkName in config.uplinks) {
18
+ if (Object.prototype.hasOwnProperty.call(config.uplinks, uplinkName)) {
19
+ // instance for each up-link definition
20
+ const proxy = new _proxy.ProxyStorage(config.uplinks[uplinkName], config); // TODO: review this can be inside ProxyStorage
21
+
22
+ proxy.upname = uplinkName;
23
+ uplinks[uplinkName] = proxy;
24
+ }
25
+ }
26
+
27
+ return uplinks;
28
+ }
29
+
30
+ function updateVersionsHiddenUpLinkNext(manifest, upLink) {
31
+ const {
32
+ versions
33
+ } = manifest;
34
+ const versionsList = Object.keys(versions);
35
+
36
+ if (versionsList.length === 0) {
37
+ return manifest;
38
+ }
39
+
40
+ for (const version of versionsList) {
41
+ // holds a "hidden" value to be used by the package storage.
42
+ versions[version][Symbol.for('__verdaccio_uplink')] = upLink.upname;
43
+ }
44
+
45
+ return { ...manifest,
46
+ versions: versions
47
+ };
48
+ }
49
+ //# sourceMappingURL=uplink-util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uplink-util.js","names":["setupUpLinks","config","uplinks","uplinkName","Object","prototype","hasOwnProperty","call","proxy","ProxyStorage","upname","updateVersionsHiddenUpLinkNext","manifest","upLink","versions","versionsList","keys","length","version","Symbol","for"],"sources":["../../src/lib/uplink-util.ts"],"sourcesContent":["import { IProxy, ProxyStorage } from '@verdaccio/proxy';\nimport { Config, Manifest } from '@verdaccio/types';\n\nexport interface ProxyInstanceList {\n [key: string]: IProxy;\n}\n\n/**\n * Set up the Up Storage for each link.\n */\nexport function setupUpLinks(config: Config): ProxyInstanceList {\n const uplinks: ProxyInstanceList = {};\n\n for (const uplinkName in config.uplinks) {\n if (Object.prototype.hasOwnProperty.call(config.uplinks, uplinkName)) {\n // instance for each up-link definition\n const proxy: IProxy = new ProxyStorage(config.uplinks[uplinkName], config);\n // TODO: review this can be inside ProxyStorage\n proxy.upname = uplinkName;\n\n uplinks[uplinkName] = proxy;\n }\n }\n\n return uplinks;\n}\n\nexport function updateVersionsHiddenUpLinkNext(manifest: Manifest, upLink: IProxy): Manifest {\n const { versions } = manifest;\n const versionsList = Object.keys(versions);\n if (versionsList.length === 0) {\n return manifest;\n }\n\n for (const version of versionsList) {\n // holds a \"hidden\" value to be used by the package storage.\n versions[version][Symbol.for('__verdaccio_uplink')] = upLink.upname;\n }\n\n return { ...manifest, versions: versions };\n}\n"],"mappings":";;;;;;;;AAAA;;AAOA;AACA;AACA;AACO,SAASA,YAAT,CAAsBC,MAAtB,EAAyD;EAC9D,MAAMC,OAA0B,GAAG,EAAnC;;EAEA,KAAK,MAAMC,UAAX,IAAyBF,MAAM,CAACC,OAAhC,EAAyC;IACvC,IAAIE,MAAM,CAACC,SAAP,CAAiBC,cAAjB,CAAgCC,IAAhC,CAAqCN,MAAM,CAACC,OAA5C,EAAqDC,UAArD,CAAJ,EAAsE;MACpE;MACA,MAAMK,KAAa,GAAG,IAAIC,mBAAJ,CAAiBR,MAAM,CAACC,OAAP,CAAeC,UAAf,CAAjB,EAA6CF,MAA7C,CAAtB,CAFoE,CAGpE;;MACAO,KAAK,CAACE,MAAN,GAAeP,UAAf;MAEAD,OAAO,CAACC,UAAD,CAAP,GAAsBK,KAAtB;IACD;EACF;;EAED,OAAON,OAAP;AACD;;AAEM,SAASS,8BAAT,CAAwCC,QAAxC,EAA4DC,MAA5D,EAAsF;EAC3F,MAAM;IAAEC;EAAF,IAAeF,QAArB;EACA,MAAMG,YAAY,GAAGX,MAAM,CAACY,IAAP,CAAYF,QAAZ,CAArB;;EACA,IAAIC,YAAY,CAACE,MAAb,KAAwB,CAA5B,EAA+B;IAC7B,OAAOL,QAAP;EACD;;EAED,KAAK,MAAMM,OAAX,IAAsBH,YAAtB,EAAoC;IAClC;IACAD,QAAQ,CAACI,OAAD,CAAR,CAAkBC,MAAM,CAACC,GAAP,CAAW,oBAAX,CAAlB,IAAsDP,MAAM,CAACH,MAA7D;EACD;;EAED,OAAO,EAAE,GAAGE,QAAL;IAAeE,QAAQ,EAAEA;EAAzB,CAAP;AACD"}
@@ -0,0 +1,28 @@
1
+ import { Manifest, StringValue, Version, Versions } from '@verdaccio/types';
2
+ /**
3
+ * Gets version from a package object taking into account semver weirdness.
4
+ * @return {String} return the semantic version of a package
5
+ */
6
+ export declare function getVersion(versions: Versions, version: string): Version | undefined;
7
+ /**
8
+ * Function filters out bad semver versions and sorts the array.
9
+ * @return {Array} sorted Array
10
+ */
11
+ export declare function sortVersionsAndFilterInvalid(listVersions: string[]): string[];
12
+ /**
13
+ * Create a tag for a package
14
+ * @param {*} data
15
+ * @param {*} version
16
+ * @param {*} tag
17
+ * @return {Boolean} whether a package has been tagged
18
+ * @deprecated
19
+ */
20
+ export declare function tagVersion(data: Manifest, version: string, tag: StringValue): boolean;
21
+ /**
22
+ *
23
+ * @param manifest
24
+ * @param version
25
+ * @param tag
26
+ * @returns
27
+ */
28
+ export declare function tagVersionNext(manifest: Manifest, version: string, tag: StringValue): Manifest;
@@ -0,0 +1,104 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.getVersion = getVersion;
7
+ exports.sortVersionsAndFilterInvalid = sortVersionsAndFilterInvalid;
8
+ exports.tagVersion = tagVersion;
9
+ exports.tagVersionNext = tagVersionNext;
10
+
11
+ var _lodash = _interopRequireDefault(require("lodash"));
12
+
13
+ var _semver = _interopRequireDefault(require("semver"));
14
+
15
+ var _core = require("@verdaccio/core");
16
+
17
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
18
+
19
+ /**
20
+ * Gets version from a package object taking into account semver weirdness.
21
+ * @return {String} return the semantic version of a package
22
+ */
23
+ function getVersion(versions, version) {
24
+ if (!versions) {
25
+ return;
26
+ } // this condition must allow cast
27
+
28
+
29
+ if (_lodash.default.isNil(versions[version]) === false) {
30
+ return versions[version];
31
+ }
32
+
33
+ const versionSemver = _semver.default.parse(version, true);
34
+
35
+ if (versionSemver === null) {
36
+ return;
37
+ }
38
+
39
+ for (const versionItem in versions) {
40
+ if (Object.prototype.hasOwnProperty.call(versions, versionItem)) {
41
+ // @ts-ignore
42
+ if (versionSemver.compare(_semver.default.parse(versionItem, true)) === 0) {
43
+ return versions[versionItem];
44
+ }
45
+ }
46
+ }
47
+ }
48
+ /**
49
+ * Function filters out bad semver versions and sorts the array.
50
+ * @return {Array} sorted Array
51
+ */
52
+
53
+
54
+ function sortVersionsAndFilterInvalid(listVersions) {
55
+ return listVersions.filter(function (version) {
56
+ if (!_semver.default.parse(version, true)) {
57
+ return false;
58
+ }
59
+
60
+ return true;
61
+ }) // FIXME: it seems the @types/semver do not handle a legitimate method named 'compareLoose'
62
+ // @ts-ignore
63
+ .sort(_semver.default.compareLoose).map(String);
64
+ }
65
+ /**
66
+ * Create a tag for a package
67
+ * @param {*} data
68
+ * @param {*} version
69
+ * @param {*} tag
70
+ * @return {Boolean} whether a package has been tagged
71
+ * @deprecated
72
+ */
73
+
74
+
75
+ function tagVersion(data, version, tag) {
76
+ if (tag && data[_core.DIST_TAGS][tag] !== version && _semver.default.parse(version, true)) {
77
+ // valid version - store
78
+ data[_core.DIST_TAGS][tag] = version;
79
+ return true;
80
+ }
81
+
82
+ return false;
83
+ }
84
+ /**
85
+ *
86
+ * @param manifest
87
+ * @param version
88
+ * @param tag
89
+ * @returns
90
+ */
91
+
92
+
93
+ function tagVersionNext(manifest, version, tag) {
94
+ const data = { ...manifest
95
+ };
96
+
97
+ if (tag && data[_core.DIST_TAGS][tag] !== version && _semver.default.parse(version, true)) {
98
+ // valid version - store
99
+ data[_core.DIST_TAGS][tag] = version;
100
+ }
101
+
102
+ return data;
103
+ }
104
+ //# sourceMappingURL=versions-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"versions-utils.js","names":["getVersion","versions","version","_","isNil","versionSemver","semver","parse","versionItem","Object","prototype","hasOwnProperty","call","compare","sortVersionsAndFilterInvalid","listVersions","filter","sort","compareLoose","map","String","tagVersion","data","tag","DIST_TAGS","tagVersionNext","manifest"],"sources":["../../src/lib/versions-utils.ts"],"sourcesContent":["import _ from 'lodash';\nimport semver, { SemVer } from 'semver';\n\nimport { DIST_TAGS } from '@verdaccio/core';\nimport { Manifest, StringValue, Version, Versions } from '@verdaccio/types';\n\n/**\n * Gets version from a package object taking into account semver weirdness.\n * @return {String} return the semantic version of a package\n */\nexport function getVersion(versions: Versions, version: string): Version | undefined {\n if (!versions) {\n return;\n }\n\n // this condition must allow cast\n if (_.isNil(versions[version]) === false) {\n return versions[version];\n }\n\n const versionSemver: SemVer | null = semver.parse(version, true);\n if (versionSemver === null) {\n return;\n }\n\n for (const versionItem in versions) {\n if (Object.prototype.hasOwnProperty.call(versions, versionItem)) {\n // @ts-ignore\n if (versionSemver.compare(semver.parse(versionItem, true)) === 0) {\n return versions[versionItem];\n }\n }\n }\n}\n\n/**\n * Function filters out bad semver versions and sorts the array.\n * @return {Array} sorted Array\n */\nexport function sortVersionsAndFilterInvalid(listVersions: string[] /* logger */): string[] {\n return (\n listVersions\n .filter(function (version): boolean {\n if (!semver.parse(version, true)) {\n return false;\n }\n return true;\n })\n // FIXME: it seems the @types/semver do not handle a legitimate method named 'compareLoose'\n // @ts-ignore\n .sort(semver.compareLoose)\n .map(String)\n );\n}\n\n/**\n * Create a tag for a package\n * @param {*} data\n * @param {*} version\n * @param {*} tag\n * @return {Boolean} whether a package has been tagged\n * @deprecated\n */\nexport function tagVersion(data: Manifest, version: string, tag: StringValue): boolean {\n if (tag && data[DIST_TAGS][tag] !== version && semver.parse(version, true)) {\n // valid version - store\n data[DIST_TAGS][tag] = version;\n return true;\n }\n return false;\n}\n\n/**\n *\n * @param manifest\n * @param version\n * @param tag\n * @returns\n */\nexport function tagVersionNext(manifest: Manifest, version: string, tag: StringValue): Manifest {\n const data = { ...manifest };\n if (tag && data[DIST_TAGS][tag] !== version && semver.parse(version, true)) {\n // valid version - store\n data[DIST_TAGS][tag] = version;\n }\n return data;\n}\n"],"mappings":";;;;;;;;;;AAAA;;AACA;;AAEA;;;;AAGA;AACA;AACA;AACA;AACO,SAASA,UAAT,CAAoBC,QAApB,EAAwCC,OAAxC,EAA8E;EACnF,IAAI,CAACD,QAAL,EAAe;IACb;EACD,CAHkF,CAKnF;;;EACA,IAAIE,eAAA,CAAEC,KAAF,CAAQH,QAAQ,CAACC,OAAD,CAAhB,MAA+B,KAAnC,EAA0C;IACxC,OAAOD,QAAQ,CAACC,OAAD,CAAf;EACD;;EAED,MAAMG,aAA4B,GAAGC,eAAA,CAAOC,KAAP,CAAaL,OAAb,EAAsB,IAAtB,CAArC;;EACA,IAAIG,aAAa,KAAK,IAAtB,EAA4B;IAC1B;EACD;;EAED,KAAK,MAAMG,WAAX,IAA0BP,QAA1B,EAAoC;IAClC,IAAIQ,MAAM,CAACC,SAAP,CAAiBC,cAAjB,CAAgCC,IAAhC,CAAqCX,QAArC,EAA+CO,WAA/C,CAAJ,EAAiE;MAC/D;MACA,IAAIH,aAAa,CAACQ,OAAd,CAAsBP,eAAA,CAAOC,KAAP,CAAaC,WAAb,EAA0B,IAA1B,CAAtB,MAA2D,CAA/D,EAAkE;QAChE,OAAOP,QAAQ,CAACO,WAAD,CAAf;MACD;IACF;EACF;AACF;AAED;AACA;AACA;AACA;;;AACO,SAASM,4BAAT,CAAsCC,YAAtC,EAAqF;EAC1F,OACEA,YAAY,CACTC,MADH,CACU,UAAUd,OAAV,EAA4B;IAClC,IAAI,CAACI,eAAA,CAAOC,KAAP,CAAaL,OAAb,EAAsB,IAAtB,CAAL,EAAkC;MAChC,OAAO,KAAP;IACD;;IACD,OAAO,IAAP;EACD,CANH,EAOE;EACA;EARF,CASGe,IATH,CASQX,eAAA,CAAOY,YATf,EAUGC,GAVH,CAUOC,MAVP,CADF;AAaD;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AACO,SAASC,UAAT,CAAoBC,IAApB,EAAoCpB,OAApC,EAAqDqB,GAArD,EAAgF;EACrF,IAAIA,GAAG,IAAID,IAAI,CAACE,eAAD,CAAJ,CAAgBD,GAAhB,MAAyBrB,OAAhC,IAA2CI,eAAA,CAAOC,KAAP,CAAaL,OAAb,EAAsB,IAAtB,CAA/C,EAA4E;IAC1E;IACAoB,IAAI,CAACE,eAAD,CAAJ,CAAgBD,GAAhB,IAAuBrB,OAAvB;IACA,OAAO,IAAP;EACD;;EACD,OAAO,KAAP;AACD;AAED;AACA;AACA;AACA;AACA;AACA;AACA;;;AACO,SAASuB,cAAT,CAAwBC,QAAxB,EAA4CxB,OAA5C,EAA6DqB,GAA7D,EAAyF;EAC9F,MAAMD,IAAI,GAAG,EAAE,GAAGI;EAAL,CAAb;;EACA,IAAIH,GAAG,IAAID,IAAI,CAACE,eAAD,CAAJ,CAAgBD,GAAhB,MAAyBrB,OAAhC,IAA2CI,eAAA,CAAOC,KAAP,CAAaL,OAAb,EAAsB,IAAtB,CAA/C,EAA4E;IAC1E;IACAoB,IAAI,CAACE,eAAD,CAAJ,CAAgBD,GAAhB,IAAuBrB,OAAvB;EACD;;EACD,OAAOoB,IAAP;AACD"}