const BASE64_PATTERN = /^[A-Za-z0-9+/=]+$/; export function isDataUrl(value) { return typeof value === "string" && value.startsWith("data:"); } export function parseDataUrl(value) { if (!isDataUrl(value)) { return null; } const commaIndex = value.indexOf(","); if (commaIndex === -1) { return null; } const metadata = value.slice(5, commaIndex); const base64 = value.slice(commaIndex + 1); const metadataParts = metadata.split(";"); const mimeType = metadataParts[0] || ""; const isBase64 = metadataParts.slice(1).some((part) => part.toLowerCase() === "base64"); if (!mimeType || !isBase64 || !base64) { return null; } return { mimeType, base64 }; } export function isLikelyBase64(value) { if (typeof value !== "string") { return false; } const compact = value.replace(/\s+/g, ""); return compact.length > 0 && compact.length % 4 === 0 && BASE64_PATTERN.test(compact); } export function stripDataUrl(value) { if (!isDataUrl(value)) { return value; } const parsed = parseDataUrl(value); return parsed ? parsed.base64 : value; }