Контракты файлов
Детализация слоев:
Section titled “Детализация слоев:”
📄 Явные контракты (File Contracts)
Section titled “📄 Явные контракты (File Contracts)”Каждый файл внутри домена имеет строго определённую роль и набор экспортов:
Для чего нужен каждый файл и что он экспортирует:
Section titled “Для чего нужен каждый файл и что он экспортирует:”schema.ts (пример на Drizzle ORM)
Section titled “schema.ts (пример на Drizzle ORM)”// Строго: только схемы для ORM// Никакой логики, только декларативное описание сущностейexport const users = pgTable(...)export const posts = pgTable(...)model.server.ts
Section titled “model.server.ts”// Бизнес-логика работы с данными через repo// Экспортирует операции, процессы, транзакцииexport const getUserById = async (id: string) => { ... }export const createUser = async (data: CreateUserInput) => { ... }rpc.ts
Section titled “rpc.ts”// Обслуживание запросов, применение моделей, хендлинг ошибок// Экспортирует ручки/эндпоинты для фронтенда и других потребителейexport const authenticateUser = async (credentials: Credentials) => { ... }export const generateToken = async (userId: string) => { ... }state.ts / stores.ts
Section titled “state.ts / stores.ts”// Работа с UI-состоянием// Экспортирует реактивные stores и обработчики вводаexport const userStore = derived(...)export const navigateToProfile = (userId: string) => { ... }+page.svelte / index.vue / page.tsx
Section titled “+page.svelte / index.vue / page.tsx”// Непосредственный UI с версткой// Ничего не экспортируем, применяем state/storesimport { userStore, navigateToProfile } from './stores.ts'...<button on:click={navigateToProfile}>...</buttonpolicy.ts
Section titled “policy.ts”// Описание политик авторизации// Экспортирует правила доступаexport const canEditUser = (user: User, target: User) => { ... }export const policy = { ... }utils.ts
Section titled “utils.ts”// Вспомогательные функции модуля// Экспортирует утилиты, не подходящие в другие категорииexport const formatUserDisplay = (user: User) => { ... }constants.ts
Section titled “constants.ts”// Константы и enum// Экспортирует только const/enumexport const USER_ROLES = { ADMIN: 'admin', USER: 'user' }export const MAX_UPLOAD_SIZE = 1024 * 1024 * 5templates.ts
Section titled “templates.ts”// Шаблоны форм и состояний// Экспортирует структуры для formik/yup или аналоговexport const userFormSchema = object({ ... })export const initialFormState = { ... }types.ts
Section titled “types.ts”// Типы и интерфейсы// Экспортирует только type/interfaceexport interface User { ... }export type AuthResult = { success: boolean; message?: string }index.ts
Section titled “index.ts”// Центральный экспорт модуля// Экспортирует все экспортируемые APIexport * from './model.server'export * from './rpc'export * from './controller'export * from './constants'export * from './types'Примеры маппинга:
Section titled “Примеры маппинга:”В зависимости от вашего мета-фреймворка структура и названия папок и файлов могут отличаться. Но это не влияет на общую концепцию
| SvelteKit | Next | Nuxt |
|---|---|---|
domain/+page.svelte | domain/page.tsx | domain/index.vue |
domain/+page.server.ts | src/pages/action.ts | domain/setup.ts |
domain/rpc.ts | domain/rpc.ts | src/pages/.../rpc.ts |
domain/+server.ts | domain/endpoints.ts | /server/api/domain/.ts |
domain/model.ts | domain/model.ts | domain/model.ts |