31940461c6
electron был не нужен вообще — тянулся транзитивно только через неиспользуемую devDependency @vue/devtools (нет ни одного импорта в коде). Убрана из desktop/package.json и из onlyBuiltDependencies корня; lockfile пересобран. Это устраняет флап CI: pnpm install изредка валился на сетевой ошибке при скачивании ~200MB бинарника electron (run #745 и run #732 на этом PR), из-за чего typecheck падал до первой TS-проверки. Так как install перестал падать раньше срока, vue-tsc теперь реально доходит до конца и вскрывает предсуществующие баги: - useCapitalProgramDocParams.ts, CapitalProgramDocumentParametersWidget.vue: импорт `CapitalProgramPrivateData` напрямую из 'cooptypes' никогда не работал — тип лежит в Cooperative.Registry, не на верхнем уровне (остальной код capital-расширения уже импортирует так же). Каст результата Object.fromEntries (индексная сигнатура) в интерфейс с именованными полями TS отклоняет как insufficient overlap; вместо unknown-каста — каст в Record<EditableFieldKey, string> (тот же паттерн, что и в соседней createEmptyForm), который затем обычной структурной проверкой присваивается в CapitalProgramPrivateData, т.к. набор из 11 полей совпадает один в один. - CapitalProgramDocumentParametersWidget.vue: legacy draft.activeTab стал optional при переходе на wizardStepKey и больше не записывается читалкой драфта — добавлен фолбэк на дефолт 994, как и в самой readCapitalProgramDocParamsDraft. - CapitalProgramInlineDocumentPreview.vue: querySelectorAll с составным CSS-селектором типизируется как NodeListOf<Element>; cleanupEditors использовал узел как HTMLTextAreaElement без сужения (соседняя syncInlineEditors уже делает `as HTMLTextAreaElement` для той же ситуации). - ExtensionInstall.vue: prop schema был типизирован как unknown, хотя передаётся напрямую в ZodForm, которому нужен IExtensionConfigSchema — типизирован точно под фактическое использование. - sdk/queries/paymentMethods/getPaymentMethods.ts: `const name` был без export вопреки конвенции всех остальных query-модулей (Queries.X.Y.name используется для чтения ключа GraphQL-ответа). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
105 lines
5.0 KiB
YAML
105 lines
5.0 KiB
YAML
name: Typecheck
|
||
|
||
# Валидация TypeScript-типов для desktop (Vue 3 + Quasar) и controller (NestJS).
|
||
#
|
||
# Зачем это отдельный workflow:
|
||
# 1. `quasar build --mode ssr` в release.yaml использует Vite/esbuild и
|
||
# vue-tsc отключён через vite-plugin-checker (см. quasar.config.cjs):
|
||
# TS-ошибки в .vue/.ts НЕ ловятся при docker build образа desktop.
|
||
# 2. У `@coopenomics/controller` нет build-скрипта вовсе — `lerna run build`
|
||
# его молча пропускает; в проде `ts-node` стартует и валится на типах
|
||
# только в рантайме при загрузке модуля. Кейс PR #392 (rename 1080→1020
|
||
# в cooptypes) проскочил именно так.
|
||
#
|
||
# Триггеры:
|
||
# - pull_request на dev — гейт перед мерджем в основную ветку;
|
||
# - workflow_call — оставлен для переиспользования, но release.yaml его
|
||
# больше НЕ вызывает (гейт из релиза убран как избыточный — типы
|
||
# проверяются на PR в dev до того, как код доедет до тэга).
|
||
#
|
||
# Push в dev/testnet/main НЕ триггерит — намеренно (PR-гейт на dev достаточен).
|
||
|
||
on:
|
||
pull_request:
|
||
branches: [dev]
|
||
workflow_call:
|
||
|
||
# Новый push в PR-ветку отменяет ещё бегущий typecheck по той же ветке —
|
||
# иначе 30-минутные прогоны копятся очередью. Группа по head_ref (исходная
|
||
# ветка PR), для workflow_call fallback на ref. Отмена только своих же
|
||
# прежних прогонов, разные PR друг друга не трогают.
|
||
concurrency:
|
||
group: typecheck-${{ github.head_ref || github.ref }}
|
||
cancel-in-progress: true
|
||
|
||
jobs:
|
||
desktop:
|
||
runs-on: ubuntu-latest
|
||
steps:
|
||
- uses: actions/checkout@v4
|
||
|
||
- uses: pnpm/action-setup@v4
|
||
with:
|
||
version: 10.33.0
|
||
|
||
- uses: actions/setup-node@v4
|
||
with:
|
||
node-version: 22
|
||
cache: pnpm
|
||
|
||
- name: Install workspace
|
||
run: pnpm install --frozen-lockfile
|
||
|
||
# Полный lerna build по всему workspace — как в корневом Dockerfile.
|
||
# Не --scope, потому что workspace-пакеты unbuild-типа (sdk, inter,
|
||
# notifications, factory, cooptypes, …) экспортируют типы только из
|
||
# сгенерированного dist/. Без dist/ tsc/vue-tsc валятся на TS2307
|
||
# «Cannot find module». Локально это маскируется ts-node-ом, но в
|
||
# CI пути резолвятся через package.json → types → dist/.
|
||
# См. Graphiti / run #148 root cause 2026-05-23.
|
||
- name: Build all workspace packages
|
||
run: pnpm lerna run build
|
||
|
||
# quasar prepare генерирует .quasar/* (auto-imports d.ts, типы для
|
||
# quasar плагинов). Без него vue-tsc ругается на отсутствующие
|
||
# глобальные компоненты QBtn/QCard/etc.
|
||
- name: Quasar prepare
|
||
run: pnpm --filter @coopenomics/desktop run prepare
|
||
|
||
# vue-tsc проверяет и .ts, и <script lang="ts"> в .vue.
|
||
# --skipLibCheck — иначе валится на типах из транзитивных deps
|
||
# (Quasar/Vue/Vite сами по себе чистые, но в графе есть legacy).
|
||
# Из памяти: на dev-сервере висло ~час из-за конкуренции с quasar dev;
|
||
# на чистом ubuntu-latest без живого стека ожидаемо в разы быстрее.
|
||
# Если упрётся в OOM/таймаут — fallback на `pnpm typecheck`
|
||
# (tsc --noEmit --skipLibCheck без vue-tsc, без SFC шаблонов).
|
||
- name: vue-tsc (desktop)
|
||
run: pnpm --filter @coopenomics/desktop exec vue-tsc --noEmit --skipLibCheck
|
||
|
||
controller:
|
||
runs-on: ubuntu-latest
|
||
steps:
|
||
- uses: actions/checkout@v4
|
||
|
||
- uses: pnpm/action-setup@v4
|
||
with:
|
||
version: 10.33.0
|
||
|
||
- uses: actions/setup-node@v4
|
||
with:
|
||
node-version: 22
|
||
cache: pnpm
|
||
|
||
- name: Install workspace
|
||
run: pnpm install --frozen-lockfile
|
||
|
||
# Полный lerna build по всему workspace — controller импортирует
|
||
# @coopenomics/sdk, @coopenomics/inter, @coopenomics/notifications
|
||
# помимо cooptypes/factory; их dist/ генерируется unbuild и без
|
||
# этого шага tsc валится на 37 TS2307. См. root cause выше.
|
||
- name: Build all workspace packages
|
||
run: pnpm lerna run build
|
||
|
||
- name: tsc --noEmit (controller)
|
||
run: pnpm --filter @coopenomics/controller run typecheck
|