UNPKG

5.29 kBJavaScriptView Raw
1"use strict";
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6exports.emptyVersion = emptyVersion;
7exports.getRangeLowerBound = getRangeLowerBound;
8exports.getRangeUpperBound = getRangeUpperBound;
9exports.stringToVersion = stringToVersion;
10exports.versionToString = versionToString;
11
12var semver = _interopRequireWildcard(require("semver"));
13
14function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
15
16function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
17
18function emptyVersion() {
19 return {
20 range: '<=',
21 major: 'x',
22 minor: 'x',
23 patch: 'x',
24 prerel: null
25 };
26}
27/**
28 * Find the lowest compatible explicit version based on a version range
29 * of a flow-typed definition
30 * ie: a type definition is 1.2.x, and the lower bound of that would be 1.2.0
31 */
32
33
34function getRangeLowerBound(rangeRaw) {
35 const range = typeof rangeRaw === 'string' ? new semver.Range(rangeRaw) : rangeRaw; // When the range only has one object in the set, it implicitly means
36 // there is a range of anything up to the upper bound.
37 // Therefore we return `'0.0.0'`.
38
39 if (range.set[0].length === 1) {
40 return '0.0.0';
41 }
42
43 return range.set[0][0].semver.version;
44}
45/**
46 * Find the highest compatible explicit version based on a version range
47 * of a flow-typed definition
48 * ie: a type definition is 1.2.x, and the upper bound of that would be 1.3.0
49 */
50
51
52function getRangeUpperBound(rangeRaw) {
53 const range = typeof rangeRaw === 'string' ? new semver.Range(rangeRaw) : rangeRaw; // When the range only has one object in the set, it implicitly means
54 // there is a range of anything up to the upper bound.
55 // So we'll return the first object version representing the upper bound.
56
57 if (range.set[0].length === 1) {
58 return range.set[0][0].semver.version;
59 }
60
61 return range.set[0][1].semver.version;
62} // TODO: This has some egregious duplication with
63// libDef.getLocalLibDefFlowVersions(). Need to better consolidate logic
64
65
66const VER = 'v([0-9]+).([0-9]+|x).([0-9]+|x)(-.*)?';
67const VERSION_RE = new RegExp(`^([><]=?)?${VER}(_([><]=?)${VER})?$`);
68
69function stringToVersion(verStr) {
70 const versionParts = verStr.match(VERSION_RE);
71
72 if (versionParts == null) {
73 throw new Error(`${verStr} is a malformed version string. Expected a version formatted ` + 'as `' + VERSION_RE.toString() + '`');
74 }
75
76 const [_1, range, majorStr, minorStr, patchStr, prerel, _2, upperRange, upperMajor, upperMinor, upperPatch, upperPrerel] = versionParts;
77
78 if (range != null && range !== '>=' && range !== '<=') {
79 throw new Error(`'${verStr}': Invalid version range: ${range}`);
80 }
81
82 if (upperRange != null && upperRange !== '>=' && upperRange !== '<=') {
83 throw new Error(`'${verStr}': Invalid version upper-bound range: ${upperRange}`);
84 }
85
86 const major = _validateVersionNumberPart(verStr, 'major', majorStr);
87
88 const minor = minorStr !== 'x' ? _validateVersionNumberPart(verStr, 'minor', minorStr) : minorStr;
89 const patch = patchStr !== 'x' ? _validateVersionNumberPart(verStr, 'patch', patchStr) : patchStr;
90 const upperBound = upperMajor ? {
91 range: upperRange,
92 major: _validateVersionNumberPart(verStr, 'upper-bound major', upperMajor),
93 minor: upperMinor !== 'x' ? _validateVersionNumberPart(verStr, 'upper-bound minor', upperMinor) : upperMinor,
94 patch: upperPatch !== 'x' ? _validateVersionNumberPart(verStr, 'upper-bound patch', upperPatch) : upperPatch,
95 prerel: upperPrerel.substr(1)
96 } : undefined;
97
98 if (range === '<=' && major === minor === patch === 0) {
99 throw new Error(`It doesn't make sense to have a version range of '<=v0.0.0'!`);
100 }
101
102 return {
103 range,
104 major,
105 minor,
106 patch,
107 prerel: prerel != null ? prerel.substr(1) : prerel,
108 upperBound
109 };
110}
111
112function versionToString(ver) {
113 const rangeStr = ver.range ? ver.range : '';
114 const upperStr = ver.upperBound ? `_${versionToString(ver.upperBound)}` : '';
115 const prerel = ver.prerel == null ? '' : `-${ver.prerel}`;
116 return `${rangeStr}v${ver.major}.${ver.minor}.${ver.patch}${prerel}${upperStr}`;
117}
118
119function _validateVersionNumberPart(context, partName, part) {
120 const num = parseInt(part, 10);
121
122 if (String(num) !== part) {
123 throw new Error(`${context}: Invalid ${partName} number. Expected a number.`);
124 }
125
126 return num;
127}
\No newline at end of file