(latest: string, current: string)
| 146 | } |
| 147 | |
| 148 | export function isVersionNewer(latest: string, current: string) { |
| 149 | const next = parseVersion(latest) |
| 150 | const prev = parseVersion(current) |
| 151 | if (!next || !prev) return false |
| 152 | |
| 153 | for (let i = 0; i < 3; i++) { |
| 154 | if (next.parts[i] !== prev.parts[i]) return next.parts[i] > prev.parts[i] |
| 155 | } |
| 156 | |
| 157 | if (!next.pre.length && prev.pre.length) return true |
| 158 | if (next.pre.length && !prev.pre.length) return false |
| 159 | |
| 160 | for (let i = 0; i < Math.max(next.pre.length, prev.pre.length); i++) { |
| 161 | const a = next.pre[i] |
| 162 | const b = prev.pre[i] |
| 163 | if (a === undefined) return false |
| 164 | if (b === undefined) return true |
| 165 | if (a === b) continue |
| 166 | |
| 167 | const aNumber = /^\d+$/.test(a) ? Number(a) : undefined |
| 168 | const bNumber = /^\d+$/.test(b) ? Number(b) : undefined |
| 169 | if (aNumber !== undefined && bNumber !== undefined) return aNumber > bNumber |
| 170 | if (aNumber !== undefined) return false |
| 171 | if (bNumber !== undefined) return true |
| 172 | return a > b |
| 173 | } |
| 174 | |
| 175 | return false |
| 176 | } |
| 177 | |
| 178 | function parseVersion(version: string) { |
| 179 | const match = version.match(/^v?(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?(?:\+.+)?$/) |
no test coverage detected