(v1, v2)
| 229 | } |
| 230 | |
| 231 | function compareVersions(v1, v2) { |
| 232 | if (!v1 || !v2) return 0 |
| 233 | |
| 234 | // Always update if the current version is not a valid semver |
| 235 | // e.g. 1.0.420-beta.1 |
| 236 | if (!v1.match(/^\d+(\.\d+)*$/)) { |
| 237 | return -1 |
| 238 | } |
| 239 | |
| 240 | const parseVersion = (version) => { |
| 241 | const parts = version.split('-') |
| 242 | const mainParts = parts[0].split('.').map(Number) |
| 243 | const prereleaseParts = parts[1] ? parts[1].split('.') : [] |
| 244 | return { main: mainParts, prerelease: prereleaseParts } |
| 245 | } |
| 246 | |
| 247 | const p1 = parseVersion(v1) |
| 248 | const p2 = parseVersion(v2) |
| 249 | |
| 250 | for (let i = 0; i < Math.max(p1.main.length, p2.main.length); i++) { |
| 251 | const n1 = p1.main[i] || 0 |
| 252 | const n2 = p2.main[i] || 0 |
| 253 | |
| 254 | if (n1 < n2) return -1 |
| 255 | if (n1 > n2) return 1 |
| 256 | } |
| 257 | |
| 258 | if (p1.prerelease.length === 0 && p2.prerelease.length === 0) { |
| 259 | return 0 |
| 260 | } else if (p1.prerelease.length === 0) { |
| 261 | return 1 |
| 262 | } else if (p2.prerelease.length === 0) { |
| 263 | return -1 |
| 264 | } else { |
| 265 | for ( |
| 266 | let i = 0; |
| 267 | i < Math.max(p1.prerelease.length, p2.prerelease.length); |
| 268 | i++ |
| 269 | ) { |
| 270 | const pr1 = p1.prerelease[i] || '' |
| 271 | const pr2 = p2.prerelease[i] || '' |
| 272 | |
| 273 | const isNum1 = !isNaN(parseInt(pr1)) |
| 274 | const isNum2 = !isNaN(parseInt(pr2)) |
| 275 | |
| 276 | if (isNum1 && isNum2) { |
| 277 | const num1 = parseInt(pr1) |
| 278 | const num2 = parseInt(pr2) |
| 279 | if (num1 < num2) return -1 |
| 280 | if (num1 > num2) return 1 |
| 281 | } else if (isNum1 && !isNum2) { |
| 282 | return 1 |
| 283 | } else if (!isNum1 && isNum2) { |
| 284 | return -1 |
| 285 | } else if (pr1 < pr2) { |
| 286 | return -1 |
| 287 | } else if (pr1 > pr2) { |
| 288 | return 1 |
no test coverage detected