fix(rc5): harden frontend runtime and diagnostics

This commit is contained in:
2026-09-08 05:22:06 +05:00
parent 079094591b
commit b7e478f014
26 changed files with 707 additions and 169 deletions
+15 -8
View File
@@ -136,7 +136,7 @@ Bun обновляется отдельно от остальных: оркес
полного прохода `bun test → tsc → compile → приёмка на Debian`, а не строки в
общем патче.
### Проверка типов frontend — обязательный шаг релиза
### Runtime-компиляция локализации и типы frontend — обязательные шаги релиза
```text
pnpm run typecheck → vue-tsc --noEmit → ОБЯЗАН пройти
@@ -144,9 +144,13 @@ pnpm run build:prod → vite build
pnpm run verify → typecheck, затем build
```
`bundle_ui()` запускает `typecheck` **до** сборки bundle: собирать production
bundle из кода, который не проходит проверку типов, незачем. Порядок и сам факт
наличия шага проверяются приёмкой.
После `pnpm install --frozen-lockfile` функция `bundle_ui()` сначала запускает
`bun test test/i18n-runtime.test.ts`, затем `typecheck` и только потом сборку
bundle. Словари заданы TypeScript-объектами, поэтому Vite и `vue-tsc` не
компилируют message format и не ловят специальные символы `@`, `$`, `{}`, `|`.
Runtime-gate использует реальный `vue-i18n` из lock-графа, обходит все строки
RU/EN и перехватывает также `console.error`: один лишь `try/catch` недостаточен,
поскольку компилятор может сообщить об ошибке без исключения из `t()`.
До v1 этой гарантии не было. `build:prod` означал `vite build && vue-tsc
--noEmit`, но `vue-tsc` был версии `0.35.0` (2022 год) и шаблоны Vue
@@ -222,7 +226,9 @@ bundle из кода, который не проходит проверку ти
Уязвимость обычно приходит не из прямой зависимости, а из чужого поддерева, и
поднимать ради неё весь frontend-граф не нужно. Такие случаи закрываются
списком `pnpm.overrides` в `apps/frontend/package.json`:
списком `overrides` в `apps/frontend/pnpm-workspace.yaml`. Настройки pnpm не
хранятся в поле `pnpm` package manifest: современные версии его игнорируют, и
правило осталось бы только случайно замороженным в старом lock-файле.
| override | зачем |
| --- | --- |
@@ -253,14 +259,15 @@ bundle из кода, который не проходит проверку ти
| Шаг сборки | Что запускается |
| --- | --- |
| `run_orchestrator_tests` | `bun x tsc --noEmit`, `bun test` |
| `bundle_ui` | `pnpm run typecheck` (`vue-tsc --noEmit`) до сборки bundle |
| `run_frontend_tests` | dependency-free контракты панели |
| `bundle_ui` | frozen install → runtime-компиляция всех RU/EN-сообщений → `pnpm run typecheck` → production bundle |
| `run_admin_tests` | `go vet ./...`, `go test ./...` |
Готовый пакет объявляет об этом полем `tests_gate=true` в
`metadata/package.env` — так же, как `dependency_security_gate` и
`hysteria_compat_gate`. Значение у поля ровно одно, потому что не бывает
пакета, собранного с пропущенными тестами: обе функции прогона выставляют свой
флаг **после** успешного завершения, а `write_metadata` отказывается писать
пакета, собранного с пропущенными тестами: функции прогона выставляют свои
флаги **после** успешного завершения, а `write_metadata` отказывается писать
метаданные, если хотя бы один из них не выставлен. То есть поле остаётся
утверждением о результате, а не переключателем.