Files
slm-design/DRAFT/level-2/domains/auth-example.md

7.1 KiB
Raw Blame History

Переход домена auth с Level 1

Проверочный пример локального перехода от доменного модуля к доменному пакету.

Связанные правила

Исходная форма 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 требуется рефакторинг или переход, но несвязанные домены не затрагиваются.

Порядок перехода

  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 не является миграционным долгом.