fork of hey-api/openapi-ts because I need some additional things
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}