fork of hey-api/openapi-ts because I need some additional things
at feat/skip-token 58 lines 2.0 kB view raw
1import type { RangeOptions, SemVer } from 'semver'; 2import * as semver from 'semver'; 3 4export type Dependency = { 5 /** 6 * Get the installed version of a package. 7 * @param name The name of the package to get the version for. 8 * @returns A SemVer object containing version information, or undefined if the package is not installed 9 * or the version string is invalid. 10 */ 11 getVersion: (name: string) => SemVer | undefined; 12 /** 13 * Check if a given package is installed in the project. 14 * @param name The name of the package to check. 15 */ 16 isInstalled: (name: string) => boolean; 17 /** 18 * Check if the installed version of a package or a given SemVer object satisfies a semver range. 19 * @param nameOrVersion The name of the package to check, or a SemVer object. 20 * @param range The semver range to check against. 21 * @returns True if the version satisfies the range, false otherwise. 22 */ 23 satisfies: ( 24 nameOrVersion: string | SemVer, 25 range: string, 26 optionsOrLoose?: boolean | RangeOptions, 27 ) => boolean; 28}; 29 30export const satisfies: typeof semver.satisfies = (...args) => semver.satisfies(...args); 31 32export function dependencyFactory(dependencies: Record<string, string>): Dependency { 33 return { 34 getVersion: (name) => { 35 const version = dependencies[name]; 36 if (!version) return; 37 try { 38 let parsed = semver.parse(version); 39 if (parsed) return parsed; 40 41 const min = semver.minVersion(version); 42 if (min) return min; 43 44 parsed = semver.coerce(version); 45 if (parsed) return parsed; 46 } catch { 47 // noop 48 } 49 return; 50 }, 51 isInstalled: (name) => Boolean(dependencies[name]), 52 satisfies: (nameOrVersion, range, optionsOrLoose) => { 53 const version = 54 typeof nameOrVersion === 'string' ? dependencies[nameOrVersion] : nameOrVersion; 55 return version ? satisfies(version, range, optionsOrLoose) : false; 56 }, 57 }; 58}