[0C1-6][@ant] fix(generate-schema): принимать резолверы с @Resolver() без параметра — устраняет регрессию генерации schema.gql, где терялось 40 из 48 резолверов и десятки input-типов (LoginInput, ResetKeyInput, GenerateDocumentInput, весь блок AnnualGeneralMeeting*Input)

Корневая причина: discoverResolverClasses отфильтровывал по `Reflect.getMetadata(RESOLVER_TYPE_METADATA, exp) === undefined`. Декоратор @Resolver() без аргумента выставляет метаданные через Nest-овский SetMetadata(RESOLVER_TYPE_METADATA, undefined) — defineMetadata реально выполнен, но getMetadata возвращает undefined, неотличимо от «не устанавливалось». В результате ровно те резолверы, что имеют @Resolver() без параметра, проваливались через фильтр (AuthResolver, MeetResolver, DocumentResolver, GenerationResolver, и т.п. — почти весь capital-extension и половина application/).

Фикс: использовать Reflect.hasMetadata, который корректно различает defined-as-undefined от undefined-by-absence. Теперь подхватываются все 48 резолверов (было 8).

Регенерированы schema.gql, zeus/index.ts, zeus/const.ts в обоих копиях (controller-local и sdk). SDK typecheck чист; desktop vue-tsc чист (единственная ошибка в PaymentCard — pre-existing, не из этого фикса).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
coopops
2026-04-22 08:57:33 +00:00
parent 124f0c4440
commit 0c5e04a484
6 changed files with 22122 additions and 1076 deletions
File diff suppressed because it is too large Load Diff
@@ -76,7 +76,11 @@ async function discoverResolverClasses(srcRoot: string): Promise<ResolverCtor[]>
if (seen.has(exp)) {
continue;
}
if (Reflect.getMetadata(RESOLVER_TYPE_METADATA, exp) === undefined) {
// Важно: используем hasMetadata, а не getMetadata. Для @Resolver() без параметра
// Nest делает SetMetadata(RESOLVER_TYPE_METADATA, undefined) — defineMetadata
// реально проставлен, но getMetadata возвращает undefined и неотличим от «не объявлен».
// hasMetadata это различает и принимает оба случая: @Resolver(() => X) и @Resolver().
if (!Reflect.hasMetadata(RESOLVER_TYPE_METADATA, exp)) {
continue;
}
seen.add(exp);
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+11 -9
View File
@@ -1809,7 +1809,8 @@ export const AllTypesProps: Record<string,any> = {
},
WebPushSubscriptionKeysInput:{
}
},
ID: `scalar.ID` as const
}
export const ReturnTypes: Record<string,any> = {
@@ -2308,6 +2309,10 @@ export const ReturnTypes: Record<string,any> = {
cycle_id:"String",
description:"String",
estimate:"Float",
fact:"Float",
fact_by_contributor:"CapitalIssueContributorFact",
fact_committed:"Float",
fact_uncommitted:"Float",
id:"String",
issue_hash:"String",
linked_git_commits:"CapitalIssueLinkedGitCommit",
@@ -2319,11 +2324,7 @@ export const ReturnTypes: Record<string,any> = {
sort_order:"Int",
status:"IssueStatus",
submaster:"String",
title:"String",
fact:"Float",
fact_committed:"Float",
fact_uncommitted:"Float",
fact_by_contributor:"CapitalIssueContributorFact"
title:"String"
},
CapitalIssueContributorFact:{
contributor_hash:"String",
@@ -2343,10 +2344,10 @@ export const ReturnTypes: Record<string,any> = {
can_change_status:"Boolean",
can_complete_requirement:"Boolean",
can_create_requirement:"Boolean",
can_edit_requirement:"Boolean",
can_delete_issue:"Boolean",
can_delete_requirement:"Boolean",
can_edit_issue:"Boolean",
can_edit_requirement:"Boolean",
can_move_issue:"Boolean",
can_set_done:"Boolean",
can_set_estimate:"Boolean",
@@ -2493,10 +2494,10 @@ export const ReturnTypes: Record<string,any> = {
can_change_project_status:"Boolean",
can_complete_requirement:"Boolean",
can_create_requirement:"Boolean",
can_edit_requirement:"Boolean",
can_delete_project:"Boolean",
can_delete_requirement:"Boolean",
can_edit_project:"Boolean",
can_edit_requirement:"Boolean",
can_manage_authors:"Boolean",
can_manage_issues:"Boolean",
can_set_master:"Boolean",
@@ -4062,7 +4063,8 @@ export const ReturnTypes: Record<string,any> = {
updatedAt:"DateTime",
userAgent:"String",
username:"String"
}
},
ID: `scalar.ID` as const
}
export const Ops = {
File diff suppressed because it is too large Load Diff