7.1 KiB
Переход домена auth с Level 1
Проверочный пример локального перехода от доменного модуля к доменному пакету.
Связанные правила
SLM-L2-DEPENDENCY-A012SLM-L2-DOMAIN-A026SLM-L2-BUSINESS-A019SLM-L2-ASSEMBLY-A020SLM-L2-ADAPTER-R021SLM-L2-BUSINESS-A022
Исходная форма Level 1
domains/
├── auth/ # Доменный модуль
│ ├── hooks/
│ ├── services/
│ ├── stores/
│ ├── ui/
│ └── index.ts # Общий API модуля
└── catalog/ # Независимый доменный модуль
└── index.ts
Level 1 разрешает business-сценариям, framework hooks, state adapter и локальной сборке Auth находиться внутри одного модуля.
Целевая форма Auth
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
Корневой domains/auth/index.ts удаляется. Потребители переходят на публичные API конкретных модулей. catalog и остальные домены не меняют форму только из-за перехода Auth.
Перенос ответственности
| Исходная часть | Владелец Level 2 | Публичный путь |
|---|---|---|
| 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 |
| Browser storage и HTTP adapters | Соответствующий adapter-модуль | auth/adapters/* |
| Cookies, request data и server adapters | Соответствующий adapter-модуль | auth/adapters/* |
| Browser graph | auth/assemblies/browser |
auth/assemblies/browser |
| Request graph | auth/assemblies/request |
auth/assemblies/request |
| Provider и session hooks | auth/react/session |
auth/react/session |
| Переиспользуемая форма | auth/react/login-form |
auth/react/login-form |
| Страница, текст и redirect | compositions |
API конкретной composition |
Новые импорты
import type {
AuthAdministrationApi,
AuthError,
AuthErrorCode,
AuthSessionApi,
} from '@/domains/auth/business'
import {
authAdministrationFactory,
authSessionFactory,
} from '@/domains/auth/business/factory'
import {
AUTH_ERROR_CODES,
isAuthError,
} from '@/domains/auth/business/runtime'
import { createPhoneHttpAdapter } from '@/domains/auth/adapters/phone-http'
import { createBrowserAuth } from '@/domains/auth/assemblies/browser'
import { AuthSessionProvider } from '@/domains/auth/react/session'
import { LoginForm } from '@/domains/auth/react/login-form'
Cross-domain граф
Если User package зависит от Auth, он получает только type-only API contract и при необходимости deterministic runtime:
import type { AuthSessionApi } from '@/domains/auth/business'
import { isAuthError } from '@/domains/auth/business/runtime'
export type UserDeps = {
auth: Pick<AuthSessionApi, 'getSnapshot'>
}
Место сборки создаёт instances:
const auth = createBrowserAuth()
const user = createBrowserUser({ auth: auth.session })
User не импортирует Auth factory или assembly, а его React-модули не импортируют useAuthSession или Auth components.
Если User остаётся модулем Level 1, runtime-связь также выполняется снаружи доменных границ. Для этого его собственный API должен иметь явную точку передачи нужного Auth behavior; иначе именно User требуется рефакторинг или переход, но несвязанные домены не затрагиваются.
Порядок перехода
- Выбрать один доменный модуль и зафиксировать его внешние consumers.
- Объявить
businessс type-only и factory entry points. - Разделить сценарии на независимо собираемые Domain API без дублирования методов.
- Добавить
business/runtime, только если внешним consumers нужны codes, guards или pure-функции. - Оформить каждую связную production implementation модулем
adapters/*. - Создать минимум одну assembly и перенести туда повторяемый выбор API и adapters.
- Разделить React-ответственности на модули внутри Group
react. - Перенести страницы, redirects и multi-domain UI в
compositions. - Перевести внешние импорты на разрешённые public paths.
- Удалить старый root
index.tsAuth и объявить пакетную форму checker-у.
Завершённость перехода определяется только границей Auth. Наличие других доменных модулей Level 1 не является миграционным долгом.