// 依赖安全下界守卫:锁定 next/react/react-dom 不得低于修补 RCE / 安全补丁的最低版本。 // dependencyFloors.test.ts 读取 package.json 声明版本比对,回归防止误降级回易受攻击版本(CR-C1)。 export const SECURITY_FLOORS = { next: "15.5.20", react: "19.2.7", "react-dom": "19.2.7", } as const; // 语义版本比较:version >= floor(仅比对 major.minor.patch,忽略预发布 / 构建元数据)。 // 去除前导 ^ / ~ 范围符;缺省段按 0 计;非数字段按 0 计。 export function isAtLeast(version: string, floor: string): boolean { const a = parseSemver(version); const b = parseSemver(floor); for (let i = 0; i < 3; i += 1) { const av = a[i] ?? 0; const bv = b[i] ?? 0; if (av > bv) return true; if (av < bv) return false; } return true; } function parseSemver(raw: string): number[] { const cleaned = raw.trim().replace(/^[\^~]/, ""); return cleaned.split(".").map((part) => { const n = Number.parseInt(part, 10); return Number.isNaN(n) ? 0 : n; }); }