Ahora con creación de páginas por IA vía el servidor MCP

@cmssy/types

Un paquete sin dependencias que describe bloques, campos, páginas, modelos, formularios y comercio, compartido por el SDK, la plataforma y tu app.

Cada parte de cmssy -la plataforma, el SDK, las herramientas de IA, tu app- tiene que ponerse de acuerdo sobre qué es un bloque, qué es un campo, cómo es una página. @cmssy/types es donde ese acuerdo está escrito.

Contiene tipos y un puñado de helpers puros. Sin dependencias en tiempo de ejecución, sin framework, nada que empaquetar.

Normalmente lo tienes gratis

Rara vez lo instalas tú. @cmssy/react y @cmssy/next reexportan lo que necesitas, así que una app normal nunca lo importa directamente.

Recúrrelo cuando escribes algo al lado del SDK: un script que lee contenido de bloques, una migración, un panel propio, una integración con el editor. Entonces quieres el vocabulario sin arrastrar React.

Qué hay dentro

  • Campos: FieldType y las listas de valores de tipos, FieldValidation, ValidationPattern (email, url, phone, slug) y los tipos de visualización condicional.
  • Esquema de bloque: FieldDefinition, BlockSchema, BlockPropsSchema, BlockMeta, más InferBlockContent, que deriva el tipo de contenido de un bloque desde su esquema de props.
  • Contenido: CmssyPageData, CmssyPageSummary, CmssyPageMeta, RawBlock, RawLayoutBlock, CmssyLocalizedValue, CmssySiteConfig, CmssyBranding, CmssySiteLocales.
  • Modelos: CmssyModelDefinition, CmssyModelRecord, CmssyRecordList.
  • Layout, formularios, comercio, integraciones, módulos, plantillas: un archivo cada uno.

Dos helpers que conviene conocer

isLocalizableFieldType(type) responde si un tipo de campo lleva valores por idioma. No todos lo hacen: un booleano o un color es igual en todos los idiomas, y tratarlo como traducible produce cinco copias de un solo valor.

evaluateFieldConditionGroup(...) evalúa la visibilidad condicional de campos. Es una función pura en vez de lógica interna del editor, así que una interfaz propia puede decidir qué campos mostrar con exactamente las reglas que usa el editor de cmssy. Dos implementaciones de "muestra este campo cuando…" divergirían, y la divergencia aparecería como un campo obligatorio pero invisible.

Los valores localizados son una unión

El tipo que sorprende:

type CmssyLocalizedValue = Record<string, string> | string | null;

Un valor localizado es un mapa de idiomas o una cadena pelada o null. La cadena pelada es contenido anterior a que el campo fuera localizado, y sigue siendo válida, así que estrecha antes de indexar:

const title =
  typeof value === "string" ? value : (value?.[locale] ?? value?.[defaultLocale] ?? "");

Ir directo a value[locale] funciona hasta que se topa con un campo antiguo, y entonces devuelve undefined en silencio.

Siguientes pasos