From 9ac0cb3b87b5e5968f92a9e9129a6918598aa2fa Mon Sep 17 00:00:00 2001 From: Nick Shirokov Date: Mon, 25 May 2026 22:42:23 +0300 Subject: [PATCH] =?UTF-8?q?refactor(web-test):=20=D1=8D=D1=82=D0=B0=D0=BF?= =?UTF-8?q?=20B.5.5=20=E2=80=94=20=D0=B2=D0=B2=D0=B5=D1=81=D1=82=D0=B8=20r?= =?UTF-8?q?eturnFormState=20(=D0=B2=D1=8B=D0=B1=D0=BE=D1=80=D0=BE=D1=87?= =?UTF-8?q?=D0=BD=D0=BE=20=D0=BF=D1=80=D0=B8=D0=BC=D0=B5=D0=BD=D0=B8=D1=82?= =?UTF-8?q?=D1=8C)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit core/helpers.mjs: returnFormState(extras) — стандартный хвост action-функций: getFormState + Object.assign(extras) + checkForErrors → state.errors. Унифицирует ~15 hand-written копий и закрывает R1/R2/R3 (state.errors теперь добавляется автоматически у любого пользователя хелпера). В этом коммите конвертированы только 2 простейших P1-сайта (openCommand, второй handle в navigateLink) — без extras между getFormState и err-проверкой. Остальные 30+ сайтов сложнее (state.X между, разные return-shape, wrapped fillFields) — будут мигрированы органически при переносе clickElement/ selectValue/closeForm в forms/* на этапе C. Co-Authored-By: Claude Opus 4.7 (1M context) --- .claude/skills/web-test/scripts/browser.mjs | 12 +++------- .../skills/web-test/scripts/core/helpers.mjs | 23 ++++++++++++++++++- 2 files changed, 25 insertions(+), 10 deletions(-) diff --git a/.claude/skills/web-test/scripts/browser.mjs b/.claude/skills/web-test/scripts/browser.mjs index 1056bba6..94723e71 100644 --- a/.claude/skills/web-test/scripts/browser.mjs +++ b/.claude/skills/web-test/scripts/browser.mjs @@ -143,7 +143,7 @@ import { _detectPlatformDialogs, _closePlatformDialogs, } from './core/errors.mjs'; import { - safeClick, findFieldInputId, readEdd, + safeClick, findFieldInputId, readEdd, returnFormState, detectNewForm as helperDetectNewForm, } from './core/helpers.mjs'; // Re-export only what was publicly exported before the refactor. @@ -215,10 +215,7 @@ export async function openCommand(name) { if (result?.error) throw new Error(`openCommand: "${name}" not found. Available: ${result.available?.join(', ') || 'none'}`); await waitForStable(formBefore); - const state = await getFormState(); - const err = await checkForErrors(); - if (err) state.errors = err; - return state; + return await returnFormState(); } /** Switch to an open tab by name (fuzzy match). Returns updated form state. */ @@ -390,10 +387,7 @@ export async function navigateLink(url) { } await waitForStable(formBefore); - const state = await getFormState(); - const err = await checkForErrors(); - if (err) state.errors = err; - return state; + return await returnFormState(); } /** Read current form state. Single evaluate call via combined script. */ diff --git a/.claude/skills/web-test/scripts/core/helpers.mjs b/.claude/skills/web-test/scripts/core/helpers.mjs index 4b8615e1..810cf2a9 100644 --- a/.claude/skills/web-test/scripts/core/helpers.mjs +++ b/.claude/skills/web-test/scripts/core/helpers.mjs @@ -3,7 +3,8 @@ // Source: https://github.com/Nikolay-Shirokov/cc-1c-skills import { page } from './state.mjs'; -import { dismissPendingErrors } from './errors.mjs'; +import { dismissPendingErrors, checkForErrors } from './errors.mjs'; +import { getFormState } from '../browser.mjs'; /** * page.click with the standard "intercepts pointer events" retry ladder: @@ -105,3 +106,23 @@ export async function readEdd() { }; })()`); } + +/** + * Standard "tail" of action functions: fetch current form state, attach + * caller-specified extras (e.g. `{ clicked: {...} }`) and the result of + * `checkForErrors()` if any. Returns the flat state object. + * + * Unifies ~15 hand-written copies in clickElement, selectValue, closeForm, + * navigation functions, etc. Also closes R1/R2/R3 from the refactor plan — + * any caller using this helper gets `state.errors` for free. + * + * @param {object} [extras] — merged into the state object via Object.assign. + * @returns {Promise} form state (flat) with optional `errors`. + */ +export async function returnFormState(extras = {}) { + const state = await getFormState(); + Object.assign(state, extras); + const err = await checkForErrors(); + if (err) state.errors = err; + return state; +}