2026-07-30 21:44:47 +03:00
# Переход домена auth с Level 1
2026-07-30 18:45:54 +03:00
2026-07-30 21:44:47 +03:00
> Проверочный пример локального перехода от доменного модуля к доменному пакету.
2026-07-30 18:45:54 +03:00
2026-07-30 21:44:47 +03:00
## Связанные правила
2026-07-30 18:45:54 +03:00
2026-07-30 21:44:47 +03:00
- [`SLM-L2-DEPENDENCY-A012` ](../../rules/level-2.md#slm-l2-dependency-a012 )
- [`SLM-L2-DOMAIN-A026` ](../../rules/level-2.md#slm-l2-domain-a026 )
2026-07-30 20:48:05 +03:00
- [`SLM-L2-BUSINESS-A019` ](../../rules/level-2.md#slm-l2-business-a019 )
2026-07-30 21:44:47 +03:00
- [`SLM-L2-ASSEMBLY-A020` ](../../rules/level-2.md#slm-l2-assembly-a020 )
2026-07-30 20:48:05 +03:00
- [`SLM-L2-ADAPTER-R021` ](../../rules/level-2.md#slm-l2-adapter-r021 )
- [`SLM-L2-BUSINESS-A022` ](../../rules/level-2.md#slm-l2-business-a022 )
2026-07-30 18:45:54 +03:00
## Исходная форма Level 1
```text
2026-07-30 21:44:47 +03:00
domains/
├── auth/ # Доменный модуль
│ ├── hooks/
│ ├── services/
│ ├── stores/
│ ├── ui/
│ └── index.ts # Общий API модуля
└── catalog/ # Независимый доменный модуль
└── index.ts
2026-07-30 18:45:54 +03:00
```
2026-07-30 21:44:47 +03:00
Level 1 разрешает business-сценариям, framework hooks, state adapter и локальной сборке Auth находиться внутри одного модуля.
2026-07-30 18:45:54 +03:00
2026-07-30 21:44:47 +03:00
## Целевая форма Auth
2026-07-30 18:45:54 +03:00
```text
2026-07-30 21:44:47 +03:00
domains/
├── auth/ # Доменный пакет Level 2
│ ├── README.md
│ ├── business/ # Один SLM-модуль
│ │ ├── errors/
│ │ ├── factories/
│ │ ├── services/
│ │ ├── types/
│ │ ├── index.ts # Только public types нескольких API
│ │ ├── factory.ts # Public factories entry
│ │ └── runtime.ts # Error codes, guards, public pure runtime
│ ├── adapters/ # Group
│ │ ├── phone-http/ # SLM-модуль
│ │ ├── browser-session/ # SLM-модуль
│ │ └── request-session/ # SLM-модуль
│ ├── assemblies/ # Обязательная Group
│ │ ├── browser/ # Только AuthSessionApi
│ │ └── request/ # Session + Administration API
│ └── react/ # Framework Group
│ ├── session/ # SLM-модуль
│ └── login-form/ # SLM-модуль
└── catalog/ # По-прежнему модуль Level 1
└── index.ts
2026-07-30 18:45:54 +03:00
```
2026-07-30 21:44:47 +03:00
Корневой `domains/auth/index.ts` удаляется. Потребители переходят на публичные API конкретных модулей. `catalog` и остальные домены не меняют форму только из-за перехода Auth.
2026-07-30 18:45:54 +03:00
## Перенос ответственности
2026-07-30 20:48:05 +03:00
| Исходная часть | Владелец Level 2 | Публичный путь |
|---|---|---|
2026-07-30 21:44:47 +03:00
| Session-сценарии и public types | `auth/business` | `auth/business` |
| Administration-сценарии и public types | `auth/business` | `auth/business` |
| Runtime-фабрики API | `auth/business` | `auth/business/factory` |
| Коды, guards и public pure-функции | `auth/business` | `auth/business/runtime` |
2026-07-30 20:48:05 +03:00
| Browser storage и HTTP adapters | Соответствующий adapter-модуль | `auth/adapters/*` |
| Cookies, request data и server adapters | Соответствующий adapter-модуль | `auth/adapters/*` |
2026-07-30 21:44:47 +03:00
| Browser graph | `auth/assemblies/browser` | `auth/assemblies/browser` |
| Request graph | `auth/assemblies/request` | `auth/assemblies/request` |
2026-07-30 20:48:05 +03:00
| Provider и session hooks | `auth/react/session` | `auth/react/session` |
| Переиспользуемая форма | `auth/react/login-form` | `auth/react/login-form` |
| Страница, текст и redirect | `compositions` | API конкретной composition |
2026-07-30 18:45:54 +03:00
## Новые импорты
```ts
2026-07-30 20:48:05 +03:00
import type {
2026-07-30 21:44:47 +03:00
AuthAdministrationApi,
2026-07-30 20:48:05 +03:00
AuthError,
AuthErrorCode,
2026-07-30 21:44:47 +03:00
AuthSessionApi,
2026-07-30 20:48:05 +03:00
} from '@/domains/auth/business '
2026-07-30 21:44:47 +03:00
import {
authAdministrationFactory,
authSessionFactory,
} from '@/domains/auth/business/factory '
2026-07-30 20:48:05 +03:00
import {
AUTH_ERROR_CODES,
isAuthError,
2026-07-30 21:44:47 +03:00
} from '@/domains/auth/business/runtime '
2026-07-30 20:48:05 +03:00
import { createPhoneHttpAdapter } from '@/domains/auth/adapters/phone -http'
2026-07-30 21:44:47 +03:00
import { createBrowserAuth } from '@/domains/auth/assemblies/browser '
2026-07-30 18:45:54 +03:00
import { AuthSessionProvider } from '@/domains/auth/react/session '
import { LoginForm } from '@/domains/auth/react/login -form'
```
## Cross-domain граф
2026-07-30 21:44:47 +03:00
Если User package зависит от Auth, он получает только type-only API contract и при необходимости deterministic runtime:
2026-07-30 18:45:54 +03:00
```ts
2026-07-30 21:44:47 +03:00
import type { AuthSessionApi } from '@/domains/auth/business '
import { isAuthError } from '@/domains/auth/business/runtime '
2026-07-30 18:45:54 +03:00
export type UserDeps = {
2026-07-30 21:44:47 +03:00
auth: Pick< AuthSessionApi , ' getSnapshot ' >
2026-07-30 18:45:54 +03:00
}
```
2026-07-30 21:44:47 +03:00
Место сборки создаёт instances:
2026-07-30 18:45:54 +03:00
```ts
2026-07-30 21:44:47 +03:00
const auth = createBrowserAuth()
const user = createBrowserUser({ auth: auth.session })
2026-07-30 18:45:54 +03:00
```
2026-07-30 21:44:47 +03:00
User не импортирует Auth factory или assembly, а е г о React-модули не импортируют `useAuthSession` или Auth components.
Если User остаётся модулем Level 1, runtime-связь также выполняется снаружи доменных границ. Для этого е г о собственный API должен иметь явную точку передачи нужного Auth behavior; иначе именно User требуется рефакторинг или переход, но несвязанные домены не затрагиваются.
2026-07-30 18:45:54 +03:00
## Порядок перехода
2026-07-30 21:44:47 +03:00
1. Выбрать один доменный модуль и зафиксировать е г о внешние consumers.
2. Объявить `business` с type-only и factory entry points.
3. Разделить сценарии на независимо собираемые Domain API без дублирования методов.
4. Добавить `business/runtime` , только если внешним consumers нужны codes, guards или pure-функции.
5. Оформить каждую связную production implementation модулем `adapters/*` .
6. Создать минимум одну assembly и перенести туда повторяемый выбор API и adapters.
7. Разделить React-ответственности на модули внутри Group `react` .
8. Перенести страницы, redirects и multi-domain UI в `compositions` .
9. Перевести внешние импорты на разрешённые public paths.
10. Удалить старый root `index.ts` Auth и объявить пакетную форму checker-у .
Завершённость перехода определяется только границей Auth. Наличие других доменных модулей Level 1 не является миграционным долгом.