docs: сделать проверку типов frontend release gate и убрать известное ограничение

bundle_ui запускает `pnpm run typecheck` перед сборкой bundle. И наличие шага,
и его порядок закреплены приёмкой — вместе с требованием vue-tsc версии 3 и
выше и с запретом снова совмещать сборку и проверку в build:prod.

Из docs/02 убран раздел «Известное ограничение: проверка типов frontend почти
ничего не проверяет» и заменён описанием действующего контракта. Прогноз в нём
был близок, но неточен: ошибок оказалось 142, а не ~155, и класс DefaultRow/
PeerVo на Element Plus 2.3 не существовал вовсе — он появился вместе с
обновлением Element Plus.

docs/04 получил описание модели отображения (третий слой рядом с типизированной
моделью и сырым YAML) и раздел о том, что страница Hysteria теперь read-only на
всех уровнях, а не только визуально.

docs/11: команды проверки frontend и dev doctor в раздел запуска, семь новых
пунктов приёмки.
This commit is contained in:
2026-08-30 07:44:51 +05:00
parent 32ff47731c
commit 219bb364bc
6 changed files with 209 additions and 18 deletions
+28
View File
@@ -187,6 +187,34 @@ run_fix20_acceptance_subset() {
log_step "Acceptance: bootstrap peer can pass auth smoke"
grep -q 'quota := int64(-1)' apps/dao/sqlite.go || fail "acceptance: bootstrap peer quota must be unlimited (-1), otherwise install auth smoke fails"
log_step "Acceptance: frontend type checking is a release gate"
# Проверка типов SFC-шаблонов была фикцией: vue-tsc 0.35 не находил ничего, а
# на современном том же коде — 142 ошибки. Инвариант обязан жить в сборке, а
# не в намерении.
"$BUN_BIN" -e '
const pkg = require("./apps/frontend/package.json");
const scripts = pkg.scripts || {};
if (!scripts.typecheck || !scripts.typecheck.includes("vue-tsc")) {
throw new Error("apps/frontend: скрипт typecheck должен запускать vue-tsc");
}
if (scripts["build:prod"].includes("vue-tsc")) {
throw new Error("build:prod снова совмещает сборку и проверку типов: ошибка типов обнаружится только после production bundle");
}
const major = Number((pkg.devDependencies["vue-tsc"] || "").replace(/^\D*/, "").split(".")[0]);
if (!Number.isInteger(major) || major < 3) {
throw new Error("vue-tsc должен быть версии 3 и выше: 0.x проверку шаблонов не выполняет");
}
' || fail "acceptance: контракт проверки типов frontend нарушен"
grep -q '"\$PNPM_BIN" run typecheck' tools/build/lib/package.sh \
|| fail "acceptance: сборка не запускает проверку типов frontend"
"$BUN_BIN" -e '
const source = require("node:fs").readFileSync("tools/build/lib/package.sh", "utf8");
const check = source.indexOf("run typecheck");
const build = source.indexOf("run build:prod");
if (check < 0 || build < 0) throw new Error("не найдены шаги typecheck/build:prod");
if (check > build) throw new Error("проверка типов идёт после сборки bundle");
' || fail "acceptance: проверка типов обязана предшествовать сборке bundle"
log_step "Acceptance: local SVG icons are rendered from an in-repo sprite"
# vite-plugin-svg-icons убран: он не обновлялся с 2022 года и тянул svgo 2.8,
# postcss 5.2.18 и image-size 0.5.5, у последней advisory прямо сообщает