Skip to content

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)
]);