import { ANY, INVALID } from "./constants.ts";import type { SemVer } from "./types.ts";import { isValidNumber, isValidString } from "./_shared.ts";
export function isSemVer(value: unknown): value is SemVer { if (value === null || value === undefined) return false; if (Array.isArray(value)) return false; if (typeof value !== "object") return false; if (value === INVALID) return true; if (value === ANY) return true;
const { major, minor, patch, build, prerelease } = value as Record< string, unknown >; const result = typeof major === "number" && isValidNumber(major) && typeof minor === "number" && isValidNumber(minor) && typeof patch === "number" && isValidNumber(patch) && Array.isArray(prerelease) && Array.isArray(build) && prerelease.every((v) => typeof v === "string" || typeof v === "number") && prerelease.filter((v) => typeof v === "string").every((v) => isValidString(v) ) && prerelease.filter((v) => typeof v === "number").every((v) => isValidNumber(v) ) && build.every((v) => typeof v === "string" && isValidString(v)); return result;}