Entity fields
Кастомные поля на core-сущностях без изменения Keystone lists. Расширения декларируют метаданные; хост хранит значения в EAV.
Главный принцип: всё — строка
| Слой | Правило |
|---|---|
Storage (EntityFieldValue.value) | text, NOT NULL |
Host API setValues | Record<string, string> |
Hook context fields | Record<string, string> |
GraphQL filter value | String |
Семантика boolean / number / JSON — ответственность расширения: сериализует при записи ("true", "42", '{"a":1}'), парсит при чтении. Ядро не интерпретирует тип beyond maxLength и optional validate().
Поддерживаемые entity types
space | artifact | user | template | spaceMember
Что ядро не делает
- Не рендерит формы по registry (
app.entityFieldEditors— out of scope). - Не добавляет поля в auto-generated Keystone
WhereInput. - Не валидирует бизнес-смысл значения (только ключ зарегистрирован, длина, optional extension validate).
Registry
backend.entityFields — metadata only:
ts
interface EntityFieldDefinition {
entityType: 'space' | 'artifact' | ...
key: string // namespaced, уникален в extension
label: string // админка / логи
filterable?: boolean // участие в fieldFilters
defaultValue?: string
maxLength?: number
validate?(value: string): void | Promise<void>
}Документация по слоям
Краткий registry guide.