Skip to content

[framework-context] DI graph manifest와 check 명령으로 provider 오류를 사전 검증한다 #977

Description

@kang-heewon

Problem

DI와 module provider visibility 오류는 상당 부분 런타임 초기화 시점에야 드러난다. Croco가 Type-first/Build-time-first framework가 되려면 provider token, scope, dependency, module import/export visibility가 검사 가능한 manifest와 CI check로 승격되어야 한다.

Evidence

  • packages/framework-context/src/libs/Container.ts:147-165Container.validate()는 runtime Container 상태를 기반으로 circular dependency를 검사한다.
  • 같은 파일 :183-190은 validation 여부를 CROCO_DI_VALIDATE/NODE_ENV에 의존한다.
  • 같은 파일 :647-659는 resolution trace status로 circular, scope-mismatch, missing을 모델링한다.
  • packages/framework-module/src/ModuleRegistry.ts:72-110는 module setup/start 중 provider를 등록하고 초기화한다.
  • packages/framework-module/src/ModuleRegistry.ts:321-407는 module import/export visibility를 runtime state와 reflect metadata로 검증한다.
  • open issue #931은 일반 package/layer architecture policy다. 이 이슈는 DI/module provider graph에 좁게 집중한다.

Desired Outcome

Croco app은 실행 전에 DI/module graph manifest를 생성하고, missing provider, circular dependency, scope mismatch, module visibility violation을 CI에서 실패시킬 수 있어야 한다.

Proposed Implementation Path

  1. Component/provider decorator와 module metadata에서 deterministic DI graph manifest를 생성하는 API 또는 CLI를 추가한다.
  2. manifest에는 token id, provider class, scope, dependency tokens, module name, imports/exports, source location을 포함한다.
  3. Container.validate()ModuleRegistry runtime validation이 같은 diagnostic model을 공유하게 한다.
  4. croco di check 또는 croco modules check 형태의 명령을 제공하고 generated app scripts에 연결한다.
  5. TypeDI fallback처럼 정적 검증 불가능한 provider는 explicit unknown capability로 표시하고 silent success로 처리하지 않는다.

Acceptance Criteria

  • missing provider fixture가 app startup 전에 check 명령에서 실패한다.
  • circular dependency fixture가 source-location 포함 diagnostic으로 실패한다.
  • singleton/request scope mismatch fixture가 check 명령에서 실패한다.
  • module export 없이 다른 module provider를 주입하는 fixture가 check 명령에서 실패한다.
  • manifest JSON은 deterministic하게 정렬되고 generated docs/LLM-readable artifact로 사용할 수 있다.

Validation

  • pnpm test --filter=@croco/framework-context
  • pnpm test --filter=@croco/framework-module
  • pnpm test --filter=@croco/cli
  • pnpm create-croco-app:smoke
  • pnpm typecheck

Scope Boundaries

Metadata

Metadata

Assignees

Labels

P1Priority 1 issuearchitectureArchitecture and module boundary issuesbuild-timeBuild-time validation, linting, and generated checksdeveloper-experienceDeveloper ergonomics and local workflow improvementsenhancementNew feature or requesttype-safetyType-level contracts and compile-time guarantees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions