Skip to content

Commit 8a91614

Browse files
committed
Attempt to handle ranges better when capping
1 parent 1a4ba09 commit 8a91614

File tree

1 file changed

+98
-6
lines changed

1 file changed

+98
-6
lines changed

scripts/install_plugin_modules.js

Lines changed: 98 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -106,19 +106,111 @@ function assertFolder (name, version) {
106106
}
107107
}
108108

109+
// Helper function to apply version caps in a more readable way
110+
function applyCap (versionRange, latestVersion) {
111+
// Handle hyphen ranges (e.g., "24.8.0 - 24.9.0")
112+
const hyphenRangeMatch = versionRange.match(/^(\d+\.\d+\.\d+)\s*-\s*(\d+\.\d+\.\d+)(.*)$/)
113+
if (hyphenRangeMatch) {
114+
return handleHyphenRange(hyphenRangeMatch, latestVersion)
115+
}
116+
117+
// Handle exact versions (e.g., "24.8.0")
118+
if (semver.valid(versionRange)) {
119+
return handleExactVersion(versionRange, latestVersion)
120+
}
121+
122+
// Handle other valid semver ranges
123+
if (semver.validRange(versionRange)) {
124+
return handleValidRange(versionRange, latestVersion)
125+
}
126+
127+
// If nothing else matched, return the original range
128+
return versionRange
129+
}
130+
131+
// Handle hyphen ranges like "24.8.0 - 24.9.0"
132+
function handleHyphenRange (match, latestVersion) {
133+
const [, lowerBound, upperBound, extraConstraints] = match
134+
135+
// Cap at the lower of: original upper bound or latest version
136+
const effectiveUpper = semver.lt(upperBound, latestVersion) ? upperBound : latestVersion
137+
138+
// Create properly formatted range
139+
let result = `>=${lowerBound} <=${effectiveUpper}`
140+
141+
// Add any extra constraints if they exist and would create a valid range
142+
if (extraConstraints && extraConstraints.trim()) {
143+
const combinedRange = `${result} ${extraConstraints.trim()}`
144+
if (semver.validRange(combinedRange)) {
145+
result = combinedRange
146+
}
147+
}
148+
149+
return result
150+
}
151+
152+
// Handle exact versions like "24.8.0"
153+
function handleExactVersion (version, latestVersion) {
154+
const exactVersion = semver.clean(version)
155+
156+
// If exact version is too high, cap it
157+
if (semver.gt(exactVersion, latestVersion)) {
158+
return latestVersion
159+
}
160+
161+
// Otherwise keep exact version with cap
162+
return `${exactVersion} <=${latestVersion}`
163+
}
164+
165+
// Handle general semver ranges
166+
function handleValidRange (range, latestVersion) {
167+
// Only apply cap if necessary
168+
if (semver.subset(`<=${latestVersion}`, range)) {
169+
return range
170+
}
171+
172+
// Extract lower bound from the range if possible
173+
const lowerBound = extractLowerBound(range)
174+
175+
if (lowerBound) {
176+
return `>=${lowerBound.version} <=${latestVersion}`
177+
} else {
178+
return `<=${latestVersion}`
179+
}
180+
}
181+
182+
// Extract the lower bound from a semver range
183+
function extractLowerBound (range) {
184+
const parsedRange = new semver.Range(range)
185+
let lowerBound = null
186+
187+
if (parsedRange.set && parsedRange.set.length > 0) {
188+
for (const comparators of parsedRange.set) {
189+
for (const comparator of comparators) {
190+
if (comparator.operator === '>=' || comparator.operator === '>') {
191+
if (!lowerBound || semver.gt(comparator.semver, lowerBound)) {
192+
lowerBound = comparator.semver
193+
}
194+
}
195+
}
196+
}
197+
}
198+
199+
return lowerBound
200+
}
201+
109202
async function assertPackage (name, version, dependencyVersionRange, external) {
110203
// Apply version cap from latests.json if available
111-
// TODO: pinned versions?
112204
let cappedVersionRange = dependencyVersionRange
205+
113206
if (latests.latests[name]) {
114207
const latestVersion = latests.latests[name]
115-
// If the range would allow versions beyond what we've tested, cap it
116-
if (semver.validRange(dependencyVersionRange) &&
117-
!semver.subset(`<=${latestVersion}`, dependencyVersionRange)) {
118-
cappedVersionRange = `${dependencyVersionRange} <=${latestVersion}`
208+
209+
// Only process string version ranges
210+
if (dependencyVersionRange && typeof dependencyVersionRange === 'string') {
211+
cappedVersionRange = applyCap(dependencyVersionRange, latestVersion)
119212
}
120213
}
121-
122214
const dependencies = { [name]: cappedVersionRange }
123215
if (deps[name]) {
124216
await addDependencies(dependencies, name, cappedVersionRange)

0 commit comments

Comments
 (0)