| 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; | |
| } | |