Désormais avec création de pages par IA via le serveur MCP

@cmssy/types

Un paquet sans dépendances décrivant blocs, champs, pages, modèles, formulaires et commerce - partagé par le SDK, la plateforme et votre application.

Chaque partie de cmssy - la plateforme, le SDK, les outils IA, votre application - doit s'accorder sur ce qu'est un bloc, un champ, une page. @cmssy/types est l'endroit où cet accord est écrit.

Il contient des types et une poignée de fonctions pures. Aucune dépendance d'exécution, aucun framework, rien à empaqueter.

Vous l'obtenez généralement gratuitement

Vous l'installez rarement vous-même. @cmssy/react et @cmssy/next réexportent ce qu'il vous faut : une application normale ne l'importe jamais directement.

Servez-vous-en quand vous écrivez quelque chose à côté du SDK : un script qui lit du contenu de blocs, une migration, un tableau de bord maison, une intégration à l'éditeur. Vous voulez alors le vocabulaire sans embarquer React.

Ce qu'il contient

  • Champs - FieldType et les listes de valeurs de types, FieldValidation, ValidationPattern (email, url, phone, slug) et les types d'affichage conditionnel.
  • Schéma de bloc - FieldDefinition, BlockSchema, BlockPropsSchema, BlockMeta, plus InferBlockContent, qui déduit le type de contenu d'un bloc de son schéma de props.
  • Contenu - CmssyPageData, CmssyPageSummary, CmssyPageMeta, RawBlock, RawLayoutBlock, CmssyLocalizedValue, CmssySiteConfig, CmssyBranding, CmssySiteLocales.
  • Modèles - CmssyModelDefinition, CmssyModelRecord, CmssyRecordList.
  • Layout, formulaires, commerce, intégrations, modules, templates - un fichier chacun.

Deux fonctions à connaître

isLocalizableFieldType(type) indique si un type de champ porte des valeurs par langue. Ce n'est pas le cas de tous : un booléen ou une couleur est identique dans toutes les langues, et le traiter comme traduisible produit cinq copies d'une seule valeur.

evaluateFieldConditionGroup(...) évalue la visibilité conditionnelle des champs. C'est une fonction pure plutôt qu'une logique interne à l'éditeur : une interface maison peut donc décider quels champs afficher avec exactement les règles de l'éditeur cmssy. Deux implémentations de « affiche ce champ quand… » divergeraient, et la divergence apparaîtrait comme un champ requis mais invisible.

Les valeurs localisées sont une union

Le type qui surprend :

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

Une valeur localisée est une map de langues ou une chaîne nue ou null. La chaîne nue est du contenu antérieur à la localisation du champ, et reste valide - restreignez donc avant d'indexer :

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

Aller droit sur value[locale] fonctionne jusqu'à rencontrer un champ plus ancien, et renvoie alors silencieusement undefined.

Étapes suivantes