@@ -106,19 +106,111 @@ function assertFolder (name, version) {
106
106
}
107
107
}
108
108
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
+
109
202
async function assertPackage ( name , version , dependencyVersionRange , external ) {
110
203
// Apply version cap from latests.json if available
111
- // TODO: pinned versions?
112
204
let cappedVersionRange = dependencyVersionRange
205
+
113
206
if ( latests . latests [ name ] ) {
114
207
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 )
119
212
}
120
213
}
121
-
122
214
const dependencies = { [ name ] : cappedVersionRange }
123
215
if ( deps [ name ] ) {
124
216
await addDependencies ( dependencies , name , cappedVersionRange )
0 commit comments