Teraz z AI - twórz strony przez serwer MCP

@cmssy/types

Jeden pakiet bez zależności opisujący bloki, pola, strony, modele, formularze i commerce - dzielony przez SDK, platformę i Twoją aplikację.

Każda część cmssy - platforma, SDK, narzędzia AI, Twoja aplikacja - musi zgadzać się co do tego, czym jest blok, czym pole, jak wygląda strona. @cmssy/types to miejsce, gdzie ta zgoda jest spisana.

Zawiera typy i garść czystych helperów. Zero zależności runtime'owych, zero frameworka, nic do zbundlowania.

Zwykle dostajesz go za darmo

Rzadko instalujesz go sam. @cmssy/react i @cmssy/next reeksportują to, czego potrzebujesz, więc normalna aplikacja nigdy nie importuje go wprost.

Sięgnij po niego, gdy piszesz coś obok SDK: skrypt czytający treść bloków, migrację, własny dashboard, integrację z edytorem. Wtedy chcesz słownika bez wciągania Reacta.

Co jest w środku

  • Pola - FieldType i listy wartości typów pól, FieldValidation, ValidationPattern (email, url, phone, slug) oraz typy warunkowego wyświetlania.
  • Schemat bloku - FieldDefinition, BlockSchema, BlockPropsSchema, BlockMeta plus InferBlockContent, który wyprowadza typ treści bloku z jego schematu propsów.
  • Treść - CmssyPageData, CmssyPageSummary, CmssyPageMeta, RawBlock, RawLayoutBlock, CmssyLocalizedValue, CmssySiteConfig, CmssyBranding, CmssySiteLocales.
  • Modele - CmssyModelDefinition, CmssyModelRecord, CmssyRecordList.
  • Layout, formularze, commerce, integracje, moduły, szablony - po jednym pliku na każde.

Dwa helpery warte poznania

isLocalizableFieldType(type) odpowiada, czy dany typ pola niesie wartości per język. Nie każdy niesie - boolean albo kolor jest ten sam w każdym języku, a traktowanie go jako tłumaczalnego produkuje pięć kopii jednej wartości.

evaluateFieldConditionGroup(...) oblicza warunkową widoczność pól. To czysta funkcja, a nie logika wewnętrzna edytora - dzięki temu własny interfejs może decydować, które pola pokazać, dokładnie tą samą regułą, której używa edytor cmssy. Dwie implementacje "pokaż to pole, gdy..." rozjechałyby się, a rozjechanie objawiłoby się jako pole wymagane, ale niewidoczne.

Wartości lokalizowane to unia

Typ, który zaskakuje:

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

Wartość lokalizowana to mapa języków albo goły string albo null. Goły string to treść zapisana, zanim pole stało się lokalizowane, i dalej jest poprawna - więc zawęż typ, zanim sięgniesz po klucz:

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

Sięgnięcie wprost po value[locale] działa, dopóki nie trafi na starsze pole - i wtedy po cichu daje undefined.

Następne kroki