fix(rc5): harden frontend runtime and diagnostics
This commit is contained in:
+15
-8
@@ -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` отказывается писать
|
||||
метаданные, если хотя бы один из них не выставлен. То есть поле остаётся
|
||||
утверждением о результате, а не переключателем.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user