Skip to content

[typecheck] contract/core 패키지의 strict TS·REST misuse gate를 단계 적용한다 #981

Description

@kang-heewon

Problem

repo는 strict: true를 사용하지만 build-time/type 기반 검증을 더 강하게 만드는 TS strict 옵션과 Croco-specific lint rule은 아직 단계적으로 적용되지 않았다. 결과적으로 일부 contract/core 오류는 타입 시스템보다 generator diagnostic 또는 runtime path에서 늦게 드러난다.

Evidence

  • tsconfig/tsconfig.base.json:24-25strict: true지만 strictPropertyInitialization: false다.
  • noUncheckedIndexedAccess, exactOptionalPropertyTypes, noPropertyAccessFromIndexSignature는 trunk의 tsconfig에서 활성화되어 있지 않다.
  • packages/oxlint-rules/src/index.ts:6-11는 현재 no-cross-domain-import, no-datasource-import, type-graphql-explicit-type 세 rule만 노출한다.
  • packages/protocols-rest/src/libs/decorators/HttpMethod.ts:67-70는 generated contract에 표현하기 어려운 @All decorator를 제공한다.
  • packages/protocols-rest/src/libs/decorators/Params.ts:38-57는 REST param/body schema를 optional로 받는다.

Desired Outcome

contract/core 경로부터 stricter TS options와 Croco REST misuse lint를 단계 적용해, 약한 계약 작성이 CI 전에 타입/정적 분석 단계에서 드러나게 한다.

Proposed Implementation Path

  1. contract/core 패키지부터 적용할 staged strict config를 만든다. 후보: exactOptionalPropertyTypes, noUncheckedIndexedAccess, noPropertyAccessFromIndexSignature, package별 strictPropertyInitialization 재검토.
  2. 바로 전체 repo에 강제하지 말고 allowlist와 package rollout plan을 둔다.
  3. oxlint-rules에 REST contract misuse rule을 추가한다. 후보: generated-contract path의 @All 금지, public route @ResponseSchema 요구, @Body() schema 요구, named param schema 요구.
  4. generated app templates와 CI pnpm check가 새 gate를 사용하도록 연결한다.
  5. false positive를 피하기 위해 route contract-first API와 compatibility loose mode의 경계를 rule 옵션으로 둔다.

Acceptance Criteria

  • 최소 protocols-core, protocols-rest, rpc-codegen, openapi-spec, framework-context 중 합의된 1차 대상 패키지가 staged strict config로 typecheck된다.
  • strict option 위반은 allowlist 없이 새 코드에서 추가될 수 없다.
  • @All을 generated contract route에 쓰는 fixture가 lint에서 실패한다.
  • @Body() 또는 named param에 schema를 빠뜨린 fixture가 strict REST contract lint에서 실패한다.
  • generated app smoke와 pnpm check가 새 gate를 실행한다.

Validation

  • pnpm check
  • pnpm typecheck
  • pnpm test --filter=@croco/oxlint-rules
  • pnpm test --filter=@croco/protocols-rest
  • pnpm create-croco-app:smoke

Scope Boundaries

Metadata

Metadata

Assignees

Labels

P1Priority 1 issuebuild-timeBuild-time validation, linting, and generated checksdeveloper-experienceDeveloper ergonomics and local workflow improvementsenhancementNew feature or requesttech-debtTechnical debttype-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