{"version":3,"file":"semver.mjs","names":[],"sources":["../../src/utils/semver.ts"],"sourcesContent":["const SEMVER_PATTERN =\n  /^(?<core>\\d+)\\.(?<minor>\\d+)\\.(?<patch>\\d+)(?:-(?<prerelease>[0-9A-Za-z.-]+))?(?:\\+[\\w.-]+)?$/;\n\ninterface ParsedVersion {\n  core: readonly number[];\n  prerelease: readonly (number | string)[];\n}\n\nfunction parseVersion(version: string | undefined): ParsedVersion | null {\n  if (!version) return null;\n  const match = SEMVER_PATTERN.exec(version.trim().replace(/^[\\^~>=v]+/, \"\"));\n  if (!match?.groups) return null;\n  const prerelease = match.groups.prerelease\n    ? match.groups.prerelease.split(\".\").map((id) => (/^\\d+$/.test(id) ? Number(id) : id))\n    : [];\n  return {\n    core: [Number(match.groups.core), Number(match.groups.minor), Number(match.groups.patch)],\n    prerelease,\n  };\n}\n\nfunction comparePrerelease(a: ParsedVersion[\"prerelease\"], b: ParsedVersion[\"prerelease\"]): number {\n  if (a.length === 0 && b.length === 0) return 0;\n  if (a.length === 0) return 1;\n  if (b.length === 0) return -1;\n  const length = Math.max(a.length, b.length);\n  for (let i = 0; i < length; i += 1) {\n    const left = a[i];\n    const right = b[i];\n    if (left === undefined) return -1;\n    if (right === undefined) return 1;\n    if (typeof left === \"number\" && typeof right === \"number\") {\n      if (left !== right) return left < right ? -1 : 1;\n    } else if (typeof left === \"number\") {\n      return -1;\n    } else if (typeof right === \"number\") {\n      return 1;\n    } else if (left !== right) {\n      return left < right ? -1 : 1;\n    }\n  }\n  return 0;\n}\n\n/**\n * Semver-ordered comparison of two version strings: -1 when `a` is older than\n * `b`, 1 when newer, 0 when equal. Prerelease-aware per the semver spec\n * (\"2.0.0-rc.9\" < \"2.0.0-rc.10\" < \"2.0.0\"). Unparseable versions compare as\n * equal — a gate must never fire on versions it cannot order.\n */\nexport function compareSemver(a: string | undefined, b: string | undefined): number {\n  const left = parseVersion(a);\n  const right = parseVersion(b);\n  if (!left || !right) return 0;\n  for (let i = 0; i < left.core.length; i += 1) {\n    if (left.core[i] !== right.core[i]) return left.core[i]! < right.core[i]! ? -1 : 1;\n  }\n  return comparePrerelease(left.prerelease, right.prerelease);\n}\n\n/**\n * Whether `version` satisfies `constraint`. Supported: exact (`=x.y.z` or bare\n * `x.y.z(-pre)`), caret, tilde, and `>` / `<` floors. A constraint with a\n * prerelease segment is satisfied by versions that order `>=` the constraint's\n * own prerelease (no identifier padding); a constraint without one is never\n * satisfied by a prerelease version. Unparseable constraint forms are\n * permissive (`true`) — remote manifests may carry shapes this module does not\n * model, and an unverifiable gate must not block.\n */\nexport function satisfiesConstraint(version: string, constraint: string): boolean {\n  const trimmed = constraint.trim();\n  if (!trimmed) return true;\n  const match = /^(\\^|~|<|>|=)?\\s*v?(\\d+)\\.(\\d+)\\.(\\d+)(?:-([0-9A-Za-z.-]+))?$/.exec(trimmed);\n  if (!match) return true;\n  const operator = match[1] ?? \"\";\n  const floor = `${match[2]}.${match[3]}.${match[4]}${match[5] ? `-${match[5]}` : \"\"}`;\n  const comparison = compareSemver(version, floor);\n  if (!operator || operator === \"=\") return comparison === 0;\n  if (operator === \"<\") return comparison < 0;\n  if (operator === \">\") return comparison > 0;\n  const subject = parseVersion(version);\n  if (!subject) return false;\n  if (!match[5] && subject.prerelease.length > 0) return false;\n  if (match[5] && subject.prerelease.length === 0) return false;\n  if (comparison < 0) return false;\n  if (operator === \"~\") {\n    return subject.core[0] === Number(match[2]) && subject.core[1] === Number(match[3]);\n  }\n  return subject.core[0] === Number(match[2]);\n}\n"],"mappings":";AAAA,MAAM,iBACJ;AAOF,SAAS,aAAa,SAAmD;CACvE,IAAI,CAAC,SAAS,OAAO;CACrB,MAAM,QAAQ,eAAe,KAAK,QAAQ,KAAK,CAAC,CAAC,QAAQ,cAAc,EAAE,CAAC;CAC1E,IAAI,CAAC,OAAO,QAAQ,OAAO;CAC3B,MAAM,aAAa,MAAM,OAAO,aAC5B,MAAM,OAAO,WAAW,MAAM,GAAG,CAAC,CAAC,KAAK,OAAQ,QAAQ,KAAK,EAAE,IAAI,OAAO,EAAE,IAAI,EAAG,IACnF,CAAC;CACL,OAAO;EACL,MAAM;GAAC,OAAO,MAAM,OAAO,IAAI;GAAG,OAAO,MAAM,OAAO,KAAK;GAAG,OAAO,MAAM,OAAO,KAAK;EAAC;EACxF;CACF;AACF;AAEA,SAAS,kBAAkB,GAAgC,GAAwC;CACjG,IAAI,EAAE,WAAW,KAAK,EAAE,WAAW,GAAG,OAAO;CAC7C,IAAI,EAAE,WAAW,GAAG,OAAO;CAC3B,IAAI,EAAE,WAAW,GAAG,OAAO;CAC3B,MAAM,SAAS,KAAK,IAAI,EAAE,QAAQ,EAAE,MAAM;CAC1C,KAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,KAAK,GAAG;EAClC,MAAM,OAAO,EAAE;EACf,MAAM,QAAQ,EAAE;EAChB,IAAI,SAAS,QAAW,OAAO;EAC/B,IAAI,UAAU,QAAW,OAAO;EAChC,IAAI,OAAO,SAAS,YAAY,OAAO,UAAU,UAC/C;OAAI,SAAS,OAAO,OAAO,OAAO,QAAQ,KAAK;EAAC,OAC3C,IAAI,OAAO,SAAS,UACzB,OAAO;OACF,IAAI,OAAO,UAAU,UAC1B,OAAO;OACF,IAAI,SAAS,OAClB,OAAO,OAAO,QAAQ,KAAK;CAE/B;CACA,OAAO;AACT;;;;;;;AAQA,SAAgB,cAAc,GAAuB,GAA+B;CAClF,MAAM,OAAO,aAAa,CAAC;CAC3B,MAAM,QAAQ,aAAa,CAAC;CAC5B,IAAI,CAAC,QAAQ,CAAC,OAAO,OAAO;CAC5B,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,KAAK,QAAQ,KAAK,GACzC,IAAI,KAAK,KAAK,OAAO,MAAM,KAAK,IAAI,OAAO,KAAK,KAAK,KAAM,MAAM,KAAK,KAAM,KAAK;CAEnF,OAAO,kBAAkB,KAAK,YAAY,MAAM,UAAU;AAC5D;;;;;;;;;;AAWA,SAAgB,oBAAoB,SAAiB,YAA6B;CAChF,MAAM,UAAU,WAAW,KAAK;CAChC,IAAI,CAAC,SAAS,OAAO;CACrB,MAAM,QAAQ,gEAAgE,KAAK,OAAO;CAC1F,IAAI,CAAC,OAAO,OAAO;CACnB,MAAM,WAAW,MAAM,MAAM;CAE7B,MAAM,aAAa,cAAc,SAAS,GADzB,MAAM,GAAG,GAAG,MAAM,GAAG,GAAG,MAAM,KAAK,MAAM,KAAK,IAAI,MAAM,OAAO,IACjC;CAC/C,IAAI,CAAC,YAAY,aAAa,KAAK,OAAO,eAAe;CACzD,IAAI,aAAa,KAAK,OAAO,aAAa;CAC1C,IAAI,aAAa,KAAK,OAAO,aAAa;CAC1C,MAAM,UAAU,aAAa,OAAO;CACpC,IAAI,CAAC,SAAS,OAAO;CACrB,IAAI,CAAC,MAAM,MAAM,QAAQ,WAAW,SAAS,GAAG,OAAO;CACvD,IAAI,MAAM,MAAM,QAAQ,WAAW,WAAW,GAAG,OAAO;CACxD,IAAI,aAAa,GAAG,OAAO;CAC3B,IAAI,aAAa,KACf,OAAO,QAAQ,KAAK,OAAO,OAAO,MAAM,EAAE,KAAK,QAAQ,KAAK,OAAO,OAAO,MAAM,EAAE;CAEpF,OAAO,QAAQ,KAAK,OAAO,OAAO,MAAM,EAAE;AAC5C"}