diff --git a/docs/architecture.md b/docs/architecture.md index 03a7b2f..8fa4e11 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -264,3 +264,23 @@ i18n-подписи → тест в `registry-schema.test.ts`. Ожидаемый минимум проверок: `pnpm --dir web check` и `pnpm --dir web test`; для инструмента, меняющего пользовательский поток, — e2e (см. раздел 3 `docs/quality-gates.md`). + +## 9. Идиома: вынос логики компонента в `*.svelte.ts` + +Крупный компонент-оркестратор (образец — `SchemaToolView.svelte`) держит в себе +только разметку, эффекты и пропсы; исполняемая логика живёт в модуле рядом +(`schema-tool-runner.svelte.ts`). Форма модуля продиктована лимитом +`max-lines-per-function` (100 строк, `web/eslint.config.js`): фабрика +`create*(ctx)` не вмещает все действия замыканиями, поэтому: + +- состояние — один `$state`-объект (`RunnerState`), созданный внутри фабрики (не + модульный уровень — состояние на экземпляр компонента); +- действия — модульные функции `action(state, ctx)`; фабрика только создаёт + состояние и возвращает геттеры + привязанные вызовы; +- зависимости от компонента — `ctx` с ленивыми геттерами (`steps: () => steps`), + чтобы не копировать реактивные значения; +- компонент читает состояние через `$derived`-алиасы, пишет — только методами + фабрики. + +Побочный плюс: действия тестируются как чистые функции над `(state, ctx)` без +монтирования компонента.