Skip to content

Контракты файлов

Структура домена

📄 Явные контракты (File Contracts)

Section titled “📄 Явные контракты (File Contracts)”

Каждый файл внутри домена имеет строго определённую роль и набор экспортов:

Для чего нужен каждый файл и что он экспортирует:

Section titled “Для чего нужен каждый файл и что он экспортирует:”
// Строго: только схемы для ORM
// Никакой логики, только декларативное описание сущностей
export const users = pgTable(...)
export const posts = pgTable(...)
// Бизнес-логика работы с данными через repo
// Экспортирует операции, процессы, транзакции
export const getUserById = async (id: string) => { ... }
export const createUser = async (data: CreateUserInput) => { ... }
// Обслуживание запросов, применение моделей, хендлинг ошибок
// Экспортирует ручки/эндпоинты для фронтенда и других потребителей
export const authenticateUser = async (credentials: Credentials) => { ... }
export const generateToken = async (userId: string) => { ... }
// Работа с UI-состоянием
// Экспортирует реактивные stores и обработчики ввода
export const userStore = derived(...)
export const navigateToProfile = (userId: string) => { ... }
// Непосредственный UI с версткой
// Ничего не экспортируем, применяем state/stores
import { userStore, navigateToProfile } from './stores.ts'
...
<button on:click={navigateToProfile}>...</button
// Описание политик авторизации
// Экспортирует правила доступа
export const canEditUser = (user: User, target: User) => { ... }
export const policy = { ... }
// Вспомогательные функции модуля
// Экспортирует утилиты, не подходящие в другие категории
export const formatUserDisplay = (user: User) => { ... }
// Константы и enum
// Экспортирует только const/enum
export const USER_ROLES = { ADMIN: 'admin', USER: 'user' }
export const MAX_UPLOAD_SIZE = 1024 * 1024 * 5
// Шаблоны форм и состояний
// Экспортирует структуры для formik/yup или аналогов
export const userFormSchema = object({ ... })
export const initialFormState = { ... }
// Типы и интерфейсы
// Экспортирует только type/interface
export interface User { ... }
export type AuthResult = { success: boolean; message?: string }
// Центральный экспорт модуля
// Экспортирует все экспортируемые API
export * from './model.server'
export * from './rpc'
export * from './controller'
export * from './constants'
export * from './types'

В зависимости от вашего мета-фреймворка структура и названия папок и файлов могут отличаться. Но это не влияет на общую концепцию

SvelteKitNextNuxt
domain/+page.sveltedomain/page.tsxdomain/index.vue
domain/+page.server.tssrc/pages/action.tsdomain/setup.ts
domain/rpc.tsdomain/rpc.tssrc/pages/.../rpc.ts
domain/+server.tsdomain/endpoints.ts/server/api/domain/.ts
domain/model.tsdomain/model.tsdomain/model.ts