mirror of
https://github.com/gromlab-ru/slm-design.git
synced 2026-08-22 07:30:16 +03:00
5.9 KiB
5.9 KiB
Миграция домена auth с Level 1
Проверочный пример перехода от доменного модуля к доменному пакету.
Связанное правило
SLM-L2-MIGRATION-A017SLM-L2-BUSINESS-A019SLM-L2-PRESET-A020SLM-L2-ADAPTER-R021SLM-L2-BUSINESS-A022
Исходная форма Level 1
domains/auth/ # Доменный модуль
├── hooks/
├── services/
├── stores/
├── ui/
└── index.ts # Общий API модуля
Level 1 разрешает business-сценариям, framework hooks, state adapter и локальной сборке находиться внутри одного модуля.
Целевая форма Level 2
domains/auth/ # Доменный пакет
├── README.md
├── business/ # SLM-модуль
│ ├── errors/
│ ├── lib/
│ ├── services/
│ ├── types/
│ ├── index.ts # Только public types
│ ├── factory.ts # Public factory entry
│ └── error.ts # Public error runtime entry
├── adapters/ # Group
│ ├── phone-http/ # SLM-модуль
│ │ └── index.ts
│ ├── browser-session/ # SLM-модуль
│ │ └── index.ts
│ └── request-session/ # SLM-модуль
│ └── index.ts
├── presets/ # Обязательная Group
│ ├── browser/ # SLM-модуль
│ │ └── index.ts
│ └── request/ # SLM-модуль
│ └── index.ts
└── react/ # Framework Group
├── session/ # SLM-модуль
│ └── index.ts
└── login-form/ # SLM-модуль
└── index.ts
Корневой domains/auth/index.ts удаляется. Потребители переходят на публичные API конкретных модулей.
Перенос ответственности
| Исходная часть | Владелец Level 2 | Публичный путь |
|---|---|---|
| Сценарии и public types | auth/business |
auth/business |
| Runtime-фабрика | auth/business |
auth/business/factory |
| Коды и guards ошибок | auth/business |
auth/business/error |
| Browser storage и HTTP adapters | Соответствующий adapter-модуль | auth/adapters/* |
| Cookies, request data и server adapters | Соответствующий adapter-модуль | auth/adapters/* |
| Выбор browser implementations | auth/presets/browser |
auth/presets/browser |
| Выбор request implementations | auth/presets/request |
auth/presets/request |
| Provider и session hooks | auth/react/session |
auth/react/session |
| Переиспользуемая форма | auth/react/login-form |
auth/react/login-form |
| Страница, текст и redirect | compositions |
API конкретной composition |
Новые импорты
import type {
AuthApi,
AuthError,
AuthErrorCode,
} from '@/domains/auth/business'
import { authFactory } from '@/domains/auth/business/factory'
import {
AUTH_ERROR_CODES,
isAuthError,
} from '@/domains/auth/business/error'
import { createPhoneHttpAdapter } from '@/domains/auth/adapters/phone-http'
import { createBrowserAuth } from '@/domains/auth/presets/browser'
import { AuthSessionProvider } from '@/domains/auth/react/session'
import { LoginForm } from '@/domains/auth/react/login-form'
Cross-domain граф
Если User зависит от Auth, оба связанных домена сначала переводятся в пакеты. Затем User получает только type-only контракт:
import type { AuthApi } from '@/domains/auth/business'
export type UserDeps = {
auth: Pick<AuthApi, 'getSession'>
}
Место сборки графа создаёт экземпляры:
const authApi = createBrowserAuth()
const userApi = createBrowserUser({ authApi })
User не импортирует runtime-код Auth, а его React-модули не импортируют useAuthSession или Auth components.
Порядок перехода
- Определить dependency-connected набор доменов, который нужно мигрировать вместе.
- Выделить
businessи три публичных фасета: type-only barrel,factoryиerror. - Зафиксировать
DomainApi, error codes, error type и runtime guard. - Оформить каждую production implementation отдельным модулем
adapters/*. - Создать минимум один preset и перенести туда повторяемый выбор adapter-модулей.
- Разделить React-ответственности на модули внутри Group
react. - Перенести страницы, redirects и multi-domain UI в
compositions. - Перевести внешние импорты на разрешённые public paths.
- Удалить старый root
index.tsи проверить import-граф.
Простые доменные модули могут оставаться в SLM root только как временное миграционное состояние. Они не создают прямые runtime- или type-only зависимости с уже переведёнными пакетами.