3.0 KiB
3.0 KiB
Модуль: Документ
Ответственность: владеет общей моделью документа, контрактом расширяемого профиля и режимами выпуска независимо от Typst-вёрстки.
Расположение: .template/lib/domain/document.typ
Публичный интерфейс
| Символ | Тип | Описание |
|---|---|---|
document-context() |
конструктор dictionary | Создаёт полный неизменяемый контекст после нормализации и валидации |
document-profile() |
конструктор dictionary | Создаёт контракт профиля с id, metadata, normalize, validate, render |
render-options() |
конструктор dictionary | Нормализует режим выпуска, watermark и media policy |
validate-profile-contract() |
функция | Проверяет, что расширение содержит все обязательные функции и поля |
merge-known() |
чистая функция | Объединяет defaults с пользовательскими значениями по явным правилам |
Зависимости
| Модуль | Что использует |
|---|---|
| Нет | Модуль не импортирует infrastructure или presentation |
Инварианты
DocumentProfile.id— непустая стабильная строка.normalize,validateиrenderявляются functions.- Режим выпуска принадлежит конечному набору
final,draft,clean-copy. DocumentContextсоздаётся только после успешной валидации company, profile metadata, parties и attachments.- Domain-значения не содержат вызовов
page,image,place,context,queryили глобальногоstate. - Merge не принимает неизвестные ключи молча: профиль либо объявляет extension bucket, либо возвращает ошибку.
Намеренно НЕ обрабатывает
- Загрузку компании из JSON.
- Пагинацию и выбор шрифта.
- Физическое наличие файлов.
- Состав обязательных полей конкретного отчёта или договора.
Заметки для агента
DocumentProfile— основной extension contract. Не превращайте его в строковый enum со switch в application. Renderer-function является портом presentation, переданным профилем. Для простого пользователя profile constructors скрывают этот контракт; вручную он нужен только разработчику нового вида документа.