Jetzt mit KI-gestütztem Page Building über den MCP-Server

@cmssy/types

Ein abhängigkeitsfreies Paket, das Blöcke, Felder, Seiten, Modelle, Formulare und Commerce beschreibt - geteilt von SDK, Plattform und deiner App.

Jeder Teil von cmssy - Plattform, SDK, KI-Tools, deine App - muss sich einig sein, was ein Block ist, was ein Feld ist, wie eine Seite aussieht. @cmssy/types ist der Ort, an dem diese Einigung aufgeschrieben steht.

Es enthält Typen und eine Handvoll reiner Helfer. Keine Laufzeitabhängigkeit, kein Framework, nichts zu bundeln.

Meist bekommst du es umsonst

Du installierst es selten selbst. @cmssy/react und @cmssy/next re-exportieren, was du brauchst - eine normale App importiert es also nie direkt.

Greif danach, wenn du etwas neben dem SDK schreibst: ein Skript, das Blockinhalte liest, eine Migration, ein eigenes Dashboard, eine Editor-Integration. Dann willst du das Vokabular, ohne React mitzuziehen.

Was drin ist

  • Felder - FieldType und die Feldtyp-Wertelisten, FieldValidation, ValidationPattern (email, url, phone, slug) sowie die Typen für bedingte Anzeige.
  • Block-Schema - FieldDefinition, BlockSchema, BlockPropsSchema, BlockMeta, dazu InferBlockContent, das den Inhaltstyp eines Blocks aus seinem Props-Schema ableitet.
  • Inhalte - CmssyPageData, CmssyPageSummary, CmssyPageMeta, RawBlock, RawLayoutBlock, CmssyLocalizedValue, CmssySiteConfig, CmssyBranding, CmssySiteLocales.
  • Modelle - CmssyModelDefinition, CmssyModelRecord, CmssyRecordList.
  • Layout, Formulare, Commerce, Integrationen, Module, Templates - je eine Datei.

Zwei Helfer, die man kennen sollte

isLocalizableFieldType(type) beantwortet, ob ein Feldtyp Werte pro Sprache trägt. Nicht jeder tut das - ein Boolean oder eine Farbe ist in jeder Sprache gleich, und sie als übersetzbar zu behandeln erzeugt fünf Kopien eines Werts.

evaluateFieldConditionGroup(...) wertet die bedingte Sichtbarkeit von Feldern aus. Es ist eine reine Funktion statt editor-interner Logik - eine eigene UI kann also nach exakt denselben Regeln entscheiden, welche Felder erscheinen. Zwei Implementierungen von „zeige dieses Feld, wenn …“ würden auseinanderlaufen, und das Auseinanderlaufen zeigte sich als Pflichtfeld, das unsichtbar ist.

Lokalisierte Werte sind eine Union

Der Typ, der überrascht:

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

Ein lokalisierter Wert ist eine Sprachmap oder ein blanker String oder null. Der blanke String ist Altbestand aus der Zeit vor der Lokalisierung des Feldes und weiterhin gültig - verenge also, bevor du indizierst:

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

Direkt auf value[locale] zuzugreifen funktioniert, bis es auf ein älteres Feld trifft - dann liefert es stillschweigend undefined.

Nächste Schritte