60 lines
1.7 KiB
TypeScript
60 lines
1.7 KiB
TypeScript
/**
|
|
* Semver comparison utilities that use Bun.semver when available
|
|
* and fall back to the npm `semver` package in Node.js environments.
|
|
*
|
|
* Bun.semver.order() is ~20x faster than npm semver comparisons.
|
|
* The npm semver fallback always uses { loose: true }.
|
|
*/
|
|
|
|
let _npmSemver: typeof import('semver') | undefined
|
|
|
|
function getNpmSemver(): typeof import('semver') {
|
|
if (!_npmSemver) {
|
|
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
_npmSemver = require('semver') as typeof import('semver')
|
|
}
|
|
return _npmSemver
|
|
}
|
|
|
|
export function gt(a: string, b: string): boolean {
|
|
if (typeof Bun !== 'undefined') {
|
|
return Bun.semver.order(a, b) === 1
|
|
}
|
|
return getNpmSemver().gt(a, b, { loose: true })
|
|
}
|
|
|
|
export function gte(a: string, b: string): boolean {
|
|
if (typeof Bun !== 'undefined') {
|
|
return Bun.semver.order(a, b) >= 0
|
|
}
|
|
return getNpmSemver().gte(a, b, { loose: true })
|
|
}
|
|
|
|
export function lt(a: string, b: string): boolean {
|
|
if (typeof Bun !== 'undefined') {
|
|
return Bun.semver.order(a, b) === -1
|
|
}
|
|
return getNpmSemver().lt(a, b, { loose: true })
|
|
}
|
|
|
|
export function lte(a: string, b: string): boolean {
|
|
if (typeof Bun !== 'undefined') {
|
|
return Bun.semver.order(a, b) <= 0
|
|
}
|
|
return getNpmSemver().lte(a, b, { loose: true })
|
|
}
|
|
|
|
export function satisfies(version: string, range: string): boolean {
|
|
if (typeof Bun !== 'undefined') {
|
|
return Bun.semver.satisfies(version, range)
|
|
}
|
|
return getNpmSemver().satisfies(version, range, { loose: true })
|
|
}
|
|
|
|
export function order(a: string, b: string): -1 | 0 | 1 {
|
|
if (typeof Bun !== 'undefined') {
|
|
return Bun.semver.order(a, b)
|
|
}
|
|
return getNpmSemver().compare(a, b, { loose: true })
|
|
}
|