@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.
- package/CHANGELOG.md +92 -0
- package/build/index.d.ts +5 -4
- package/build/index.js +31 -15
- package/build/index.js.map +1 -1
- package/build/lib/TransFormResults.d.ts +15 -0
- package/build/lib/TransFormResults.js +61 -0
- package/build/lib/TransFormResults.js.map +1 -0
- package/build/lib/search-utils.d.ts +4 -0
- package/build/lib/search-utils.js +59 -0
- package/build/lib/search-utils.js.map +1 -0
- package/build/lib/star-utils.d.ts +14 -0
- package/build/{star-utils.js → lib/star-utils.js} +16 -2
- package/build/lib/star-utils.js.map +1 -0
- package/build/lib/storage-utils.d.ts +82 -0
- package/build/{storage-utils.js → lib/storage-utils.js} +173 -60
- package/build/lib/storage-utils.js.map +1 -0
- package/build/lib/uplink-util.d.ts +10 -0
- package/build/lib/uplink-util.js +49 -0
- package/build/lib/uplink-util.js.map +1 -0
- package/build/lib/versions-utils.d.ts +28 -0
- package/build/lib/versions-utils.js +104 -0
- package/build/lib/versions-utils.js.map +1 -0
- package/build/local-storage.d.ts +3 -165
- package/build/local-storage.js +6 -1166
- package/build/local-storage.js.map +1 -1
- package/build/storage.d.ts +242 -86
- package/build/storage.js +1681 -548
- package/build/storage.js.map +1 -1
- package/build/type.d.ts +42 -19
- package/build/type.js.map +1 -1
- package/jest.config.js +8 -2
- package/package.json +71 -71
- package/src/index.ts +5 -4
- package/src/lib/TransFormResults.ts +42 -0
- package/src/lib/search-utils.ts +50 -0
- package/src/{star-utils.ts → lib/star-utils.ts} +16 -5
- package/src/lib/storage-utils.ts +362 -0
- package/src/lib/uplink-util.ts +41 -0
- package/src/lib/versions-utils.ts +87 -0
- package/src/local-storage.ts +7 -1217
- package/src/storage.ts +1683 -635
- package/src/type.ts +47 -21
- package/test/fixtures/config/getTarballNext-getupstream.yaml +17 -0
- package/test/fixtures/config/syncDoubleUplinksMetadata.yaml +25 -0
- package/test/fixtures/config/syncNoUplinksMetadata.yaml +17 -0
- package/test/fixtures/config/syncSingleUplinksMetadata.yaml +21 -0
- package/test/fixtures/config/updateManifest-1.yaml +16 -0
- package/test/fixtures/manifests/foo-npmjs.json +253 -0
- package/test/fixtures/manifests/foo-verdaccio.json +253 -0
- package/test/fixtures/tarball.tgz +0 -0
- package/test/helpers.ts +22 -0
- package/test/local-store.__disabled__.ts +553 -0
- package/test/search.spec.ts +4 -5
- package/test/star.spec.ts +31 -0
- package/test/storage-utils.spec.ts +129 -42
- package/test/storage.spec.ts +943 -33
- package/test/versions.spec.ts +109 -0
- package/tsconfig.json +6 -3
- package/build/search.d.ts +0 -35
- package/build/search.js +0 -198
- package/build/search.js.map +0 -1
- package/build/star-utils.d.ts +0 -9
- package/build/star-utils.js.map +0 -1
- package/build/storage-utils.d.ts +0 -39
- package/build/storage-utils.js.map +0 -1
- package/build/uplink-util.d.ts +0 -7
- package/build/uplink-util.js +0 -38
- package/build/uplink-util.js.map +0 -1
- package/src/search.ts +0 -175
- package/src/storage-utils.ts +0 -263
- package/src/uplink-util.ts +0 -32
- 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.
|
|
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 (
|
|
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 (
|
|
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
|
|
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"}
|