semver.ts 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. /**
  2. * Semver comparison utilities that use Bun.semver when available
  3. * and fall back to the npm `semver` package in Node.js environments.
  4. *
  5. * Bun.semver.order() is ~20x faster than npm semver comparisons.
  6. * The npm semver fallback always uses { loose: true }.
  7. */
  8. let _npmSemver: typeof import('semver') | undefined
  9. function getNpmSemver(): typeof import('semver') {
  10. if (!_npmSemver) {
  11. // eslint-disable-next-line @typescript-eslint/no-require-imports
  12. _npmSemver = require('semver') as typeof import('semver')
  13. }
  14. return _npmSemver
  15. }
  16. export function gt(a: string, b: string): boolean {
  17. if (typeof Bun !== 'undefined') {
  18. return Bun.semver.order(a, b) === 1
  19. }
  20. return getNpmSemver().gt(a, b, { loose: true })
  21. }
  22. export function gte(a: string, b: string): boolean {
  23. if (typeof Bun !== 'undefined') {
  24. return Bun.semver.order(a, b) >= 0
  25. }
  26. return getNpmSemver().gte(a, b, { loose: true })
  27. }
  28. export function lt(a: string, b: string): boolean {
  29. if (typeof Bun !== 'undefined') {
  30. return Bun.semver.order(a, b) === -1
  31. }
  32. return getNpmSemver().lt(a, b, { loose: true })
  33. }
  34. export function lte(a: string, b: string): boolean {
  35. if (typeof Bun !== 'undefined') {
  36. return Bun.semver.order(a, b) <= 0
  37. }
  38. return getNpmSemver().lte(a, b, { loose: true })
  39. }
  40. export function satisfies(version: string, range: string): boolean {
  41. if (typeof Bun !== 'undefined') {
  42. return Bun.semver.satisfies(version, range)
  43. }
  44. return getNpmSemver().satisfies(version, range, { loose: true })
  45. }
  46. export function order(a: string, b: string): -1 | 0 | 1 {
  47. if (typeof Bun !== 'undefined') {
  48. return Bun.semver.order(a, b)
  49. }
  50. return getNpmSemver().compare(a, b, { loose: true })
  51. }