Referencia de Esquemas Zod (@oim-media/core)
El paquete @oim-media/core define esquemas de validación estrictos en tiempo de ejecución implementados con Zod. Cada flujo de metadatos .oim y .ovm debe cumplir con este esquema antes de alcanzar la capa de renderizado.
1. Esquema Raíz de Metadatos OIM (OimMetadataSchema)
Define la estructura del diccionario raíz de un contenedor de imagen interactiva:
typescript
import { z } from "zod";
export const OimMetadataSchema = z.object({
oim: z.string().optional(),
version: z.string().optional(),
min_player: z.string().max(16).optional(),
media_type: z.enum(["image", "video"]).optional(),
oim_id: z.string().max(128).optional(),
image_hash: z.string().max(64).optional(), // Hash SHA-256 de la imagen horneada (Capa −1)
reedit: z.enum(["public", "author_only", "sealed"]).optional(), // Permiso de reedición (1.23.0). El `reedicion` heredado (valores en español) se sigue leyendo hasta 2.0.0.
immutable_lock: z.boolean().optional(),
allowed_domains: z.array(z.string().max(253)).optional(),
canvas: z.object({
natural_width: z.number().positive(),
natural_height: z.number().positive()
}).optional(),
capabilities: z.array(z.string()).optional(),
slots: z.array(slotSchema),
signature: z.string().optional(), // Firma ECDSA P-256 Base64
key_version: z.string().optional(),
timestamp: z.string().datetime({ offset: true }).optional(),
}).passthrough();2. Esquema de Slot Interactivo (slotSchema)
Define los elementos individuales de las capas interactivas:
typescript
export const slotSchema = z.object({
id: z.string().min(1).max(128),
type: z.enum([
"text", "image", "lottie", "zone", "geo", "shape", "draw",
"filter", "container", "group", "component", "mask", "svg", "pattern", "artistic-text"
]).optional(),
name: z.string().max(256).optional(),
align: z.enum(["left", "center", "right"]).optional(),
position: z.tuple([z.number(), z.number()]).optional(), // [x_pct, y_pct]
width_px: z.number().optional(),
height_px: z.number().optional(),
style: styleSchema.optional(),
content: contentSchema.optional(),
interaction: interactionSchema.optional(),
tracking_data: z.array(trackingKeyframeSchema).optional(),
});3. Esquema de Estilo y Disposición (styleSchema)
Valida las reglas de diseño y aspecto visual aplicadas a cada slot:
typescript
export const styleSchema = z.object({
width: z.string().optional(),
height: z.string().optional(),
maxWidth: z.string().optional(),
fontSize: z.string().optional(),
color: z.string().optional(),
backgroundColor: z.string().optional(),
borderRadius: z.string().optional(),
opacity: z.number().min(0).max(1).optional(),
transform: z.string().optional(),
boxShadow: z.string().optional(),
textShadow: z.string().optional(),
filter: z.string().optional(),
animation: z.union([z.string(), keyframeAnimationSchema]).optional(),
}).passthrough();4. Esquema de Contenido Multilingüe (contentSchema)
Valida las cadenas de texto traducidas y recursos multimedia embebidos:
typescript
export const contentSchema = z.record(
z.string(), // Código de idioma: "en", "es", "fr", etc.
z.string().max(10000000) // Hasta 10MB para recursos inline en base64
);5. Esquema de Keyframes de Seguimiento Temporal (trackingKeyframeSchema)
Valida los keyframes de cajas delimitadoras a 60 FPS para vídeos .ovm:
typescript
export const trackingKeyframeSchema = z.tuple([
z.number().min(0), // t (tiempo en segundos)
z.number(), z.number(), // x1, y1
z.number(), z.number(), // x2, y2
z.number(), z.number(), // x3, y3
z.number(), z.number(), // x4, y4
z.number(), z.number() // cx, cy (centro)
]);