import type { FoundryCompatibility, FoundryPackageManifest } from './foundryTypes'; /** Актуальные major-версии Foundry, которые поддерживает импортёр. */ export const FOUNDRY_SUPPORTED_MAJORS = new Set([11, 12, 13]); function parseMajor(version: string | undefined): number | null { if (!version || typeof version !== 'string') return null; const m = /^(\d+)/u.exec(version.trim()); if (!m) return null; const n = Number(m[1]); return Number.isFinite(n) ? n : null; } /** * true — пакет выглядит как актуальный (v11+). * Если версия не указана — разрешаем (попробуем прочитать данные). * Если явно только старая (<11) — отклоняем. */ export function isSupportedFoundryPackage( manifest: Pick, ): { ok: boolean; reason?: string; } { const compat: FoundryCompatibility = manifest.compatibility ?? {}; const majors = [compat.minimum, compat.verified, compat.maximum, manifest.coreVersion] .map(parseMajor) .filter((n): n is number => n !== null); if (majors.length === 0) return { ok: true }; const maxMajor = Math.max(...majors); const minMajor = Math.min(...majors); // Явно только до v10 и ниже. if (typeof compat.maximum === 'string') { const max = parseMajor(compat.maximum); if (max !== null && max < 11) { return { ok: false, reason: `Пакет Foundry слишком старый (maximum ${compat.maximum}). Нужна версия 11+.`, }; } } if (maxMajor < 11) { return { ok: false, reason: `Пакет Foundry слишком старый (обнаружена версия ${String(maxMajor)}). Нужна версия 11+.`, }; } // Если минимум уже далеко в будущем — всё равно пробуем, если пересекается с 11–13. const overlapsSupported = majors.some((m) => FOUNDRY_SUPPORTED_MAJORS.has(m)) || minMajor <= 13; if (!overlapsSupported) { return { ok: false, reason: `Версия Foundry не поддерживается импортом (нужны 11–13).`, }; } return { ok: true }; }