Тема
Кодогенерация: обзор
Кодогенерация в Endge разделена на два слоя:
- Базовые типы в ядре.
- Сгенерированные типы и реестры в пользовательском проекте.
Базовые типы в ядре
В @endge/core есть fallback-типы:
ts
type EndgeProjectId = string
type EndgeEnvId = string
type EndgeComponentId = string
type EndgeActionId = stringОни нужны, чтобы библиотечные компоненты можно было писать даже до первой генерации.
Пример:
ts
import type { EndgeEnvId, EndgeProjectId } from '@endge/core'
interface Props {
project: EndgeProjectId
env: EndgeEnvId
}Сгенерированные типы в проекте
После запуска codegen в целевом проекте появляется src/gen/types.ts с namespace EndgeGen.
Пример:
ts
import { EndgeGen } from '@/gen'
interface Props {
project: EndgeGen.ProjectId
env: EndgeGen.EnvId
}Это уже не просто string, а узкий union по текущему домену.
Что именно генерируется
Для каждой коллекции домена генерируются:
EndgeGen.ProjectIdEndgeGen.EnvIdEndgeGen.PageIdEndgeGen.ComponentIdEndgeGen.QueryIdEndgeGen.ActionIdEndgeGen.SettingsId
и аналогичные типы для остальных сущностей.
Также создаются:
- объект-константа с identity
- type alias по значениям
- массив
all...Ids
Примеры по текущему проекту
В текущем дереве уже встречаются такие identity:
- проект:
configurator - среда:
dev - settings:
general - action:
configurator-init - component:
text
Это значит, что после генерации вы ожидаете примерно такой контракт:
ts
import { EndgeGen } from '@/gen'
type ProjectId = EndgeGen.ProjectId
type EnvId = EndgeGen.EnvId
type SettingsId = EndgeGen.SettingsId
type ActionId = EndgeGen.ActionId
type ComponentId = EndgeGen.ComponentIdи примерно такие значения:
ts
EndgeGen.ProjectId.configurator
EndgeGen.EnvId.dev
EndgeGen.SettingsId.general
EndgeGen.ActionId.configurator_init
EndgeGen.ComponentId.textОбрати внимание: ключи в объекте нормализуются для TypeScript. Например, workplaces-init превращается в ключ workplaces_init, но значение остается исходной identity-строкой.
Где это уже используется
Сейчас базовые Endge*Id уже протянуты в:
EndgeShellEndgeViewuseEndgeView(identity)
То есть библиотека работает сразу, а generated-слой просто усиливает типизацию поверх нее.