basant307/AI_Governance_Project
048
1import { compare } from './compare.js';2import { compareSegments, validateAndParse } from './utils.js';3/**4 * Match [npm semver](https://docs.npmjs.com/cli/v6/using-npm/semver) version range.5 *6 * @param version Version number to match7 * @param range Range pattern for version8 * @returns `true` if the version number is within the range, `false` otherwise.9 *10 * @example11 * ```12 * satisfies('1.1.0', '^1.0.0'); // return true13 * satisfies('1.1.0', '~1.0.0'); // return false14 * ```15 */16export const satisfies = (version, range) => {17 // clean input18 range = range.replace(/([><=]+)\s+/g, '$1');19 // handle multiple comparators20 if (range.includes('||')) {21 return range.split('||').some((r) => satisfies(version, r));22 }23 else if (range.includes(' - ')) {24 const [a, b] = range.split(' - ', 2);25 return satisfies(version, `>=${a} <=${b}`);26 }27 else if (range.includes(' ')) {28 return range29 .trim()30 .replace(/\s{2,}/g, ' ')31 .split(' ')32 .every((r) => satisfies(version, r));33 }34 // if no range operator then "="35 const m = range.match(/^([<>=~^]+)/);36 const op = m ? m[1] : '=';37 // if gt/lt/eq then operator compare38 if (op !== '^' && op !== '~')39 return compare(version, range, op);40 // else range of either "~" or "^" is assumed41 const [v1, v2, v3, , vp] = validateAndParse(version);42 const [r1, r2, r3, , rp] = validateAndParse(range);43 const v = [v1, v2, v3];44 const r = [r1, r2 !== null && r2 !== void 0 ? r2 : 'x', r3 !== null && r3 !== void 0 ? r3 : 'x'];45 // validate pre-release46 if (rp) {47 if (!vp)48 return false;49 if (compareSegments(v, r) !== 0)50 return false;51 if (compareSegments(vp.split('.'), rp.split('.')) === -1)52 return false;53 }54 // first non-zero number55 const nonZero = r.findIndex((v) => v !== '0') + 1;56 // pointer to where segments can be >=57 const i = op === '~' ? 2 : nonZero > 1 ? nonZero : 1;58 // before pointer must be equal59 if (compareSegments(v.slice(0, i), r.slice(0, i)) !== 0)60 return false;61 // after pointer must be >=62 if (compareSegments(v.slice(i), r.slice(i)) === -1)63 return false;64 return true;65};66//# sourceMappingURL=satisfies.js.map