Files
slm-design/DRAFT/level-2/dependencies.md

72 lines
4.8 KiB
Markdown
Raw Normal View History

2026-07-30 10:56:48 +03:00
# Зависимости Level 2
> Уточнение графа зависимостей внутри и между доменными пакетами.
2026-07-30 10:56:48 +03:00
## Связанные правила
2026-07-30 10:56:48 +03:00
- [`SLM-L2-BUSINESS-A007`](../rules/level-2.md#slm-l2-business-a007)
- [`SLM-L2-DEPENDENCY-A012`](../rules/level-2.md#slm-l2-dependency-a012)
- [`SLM-L2-ENVIRONMENT-A013`](../rules/level-2.md#slm-l2-environment-a013)
- [`SLM-L1-DEPENDENCY-A005`](../rules/level-1.md#slm-l1-dependency-a005)
2026-07-30 10:56:48 +03:00
## Направление внутри пакета
2026-07-30 10:56:48 +03:00
| Исходный модуль | Допустимые зависимости |
|---|---|
| `business` | Собственные сегменты, объявленный нейтральный `shared`, объявленные business-safe внешние пакеты, type-only публичные business-контракты других доменов |
| Adapter | Собственный `business`, `infra`, конкретная техническая реализация, `shared` |
| Preset | Собственный `business`, закрытые или самостоятельные adapters, type-only API других доменов |
| Framework binding module | Собственный `business`, публичные API framework-модулей своего домена, фреймворк, `ui`, `shared` |
| Место сборки графа | Публичные API presets и framework-модулей всех входящих в граф доменов |
2026-07-30 10:56:48 +03:00
`business` не достигает adapters, presets, framework-модулей, product SDK, storage, API браузера или Node.js. Проверяется весь транзитивный import-граф его публичной точки входа.
2026-07-30 10:56:48 +03:00
## Междоменные импорты
2026-07-30 10:56:48 +03:00
Модуль одного доменного пакета не импортирует runtime-экспорты другого доменного пакета. Разрешён только type-only импорт публичного контракта его `business`, по возможности суженный через `Pick`.
2026-07-30 10:56:48 +03:00
```ts
import type { AuthApi } from '@/domains/auth/business'
export type UserDeps = {
auth: Pick<AuthApi, 'getSession'>
}
2026-07-30 10:56:48 +03:00
```
Type-only импорт остаётся архитектурным ребром. Runtime- и type-only зависимости образуют единый DAG и не могут создавать цикл.
Pure function, hook, Provider, context, component или framework state другого домена являются runtime-экспортами и не образуют исключение. Независимая общая функция переносится в `shared`, а UI нескольких доменов собирается в `compositions`.
## Runtime-инъекция API
Готовый API другого домена передаётся preset-модулю аргументом. Preset не импортирует его runtime-фабрику или сборку:
2026-07-30 10:56:48 +03:00
```text
createAuthForRequest()
→ AuthApi
→ createUserForRequest({ authApi })
→ UserApi
2026-07-30 10:56:48 +03:00
```
Место сборки графа создаёт независимые домены раньше зависимых. Если сбой `AuthApi` становится результатом публичного сценария `UserApi`, приложению доступна только собственная доменная ошибка User. Точный механизм различения ошибок при exception-модели остаётся открытым вопросом.
2026-07-30 10:56:48 +03:00
## Framework-состояние
2026-07-30 10:56:48 +03:00
Framework binding module использует framework API только своего доменного пакета:
2026-07-30 10:56:48 +03:00
```ts
// Допустимо внутри domains/auth/react/login-form
import { useAuthSession } from '@/domains/auth/react/session'
2026-07-30 10:56:48 +03:00
// Недопустимо внутри domains/user/react/profile
import { useAuthSession } from '@/domains/auth/react/session'
```
2026-07-30 10:56:48 +03:00
Во втором случае композиционный модуль читает состояния обоих доменов и передаёт необходимые данные или callbacks через публичные свойства компонентов.
2026-07-30 10:56:48 +03:00
## Границы сред
2026-07-30 10:56:48 +03:00
Каждый client-, server- или shared-entry point имеет совместимый транзитивный import-граф. Серверный preset или adapter не реэкспортируется через `business`, Framework Group или клиентский preset.
Tree shaking не является доказательством изоляции. Проверка выполняется до удаления неиспользуемого кода.