Scarab Diagnostic Suite 현장 테스트 #016: TypeScript 자동 가져오기(Auto-Import) 패키지 경계
요약
TypeScript의 자동 가져오기(auto-import) 기능이 패키지 내보내기(package exports)의 경계를 침범하는 문제를 분석하고 해결 방안을 제시합니다. 와일드카드 내보기 처리 시 디렉토리 열거 단계에서 유효성 검증이 늦어지는 결함을 수정하기 위한 로컬 검증 결과를 다룹니다.
핵심 포인트
- TypeScript 자동 가져오기 시 패키지 경계 위반 문제 식별
- 와일드카드 내보기 시 디렉토리 열거 단계의 검증 시점 문제 분석
- 패키지 경계 권한 실패를 방지하기 위한 로컬 수정안 제안
- 회귀 테스트를 통한 수정 사항의 유효성 및 안정성 검증
이 현장 테스트는 TypeScript를 대상으로 진행되었습니다.
문제는 TypeScript #63499였습니다:
https://github.com/microsoft/TypeScript/issues/63499
보고된 문제는 자동 가져오기(auto-import) 제안과 와일드카드(wildcard) package.json 내보내기(exports)와 관련이 있었습니다.
유용한 진단 경계(diagnostic boundary)는 다음과 같습니다:
패키지 내보내기 선언(package export declaration) → 리졸버 포함 관계 확인(resolver containment check) → 자동 가져오기 제안(auto-import suggestion)
이것이 중요한 이유는 자동 가져오기가 단순히 에디터의 편의 기능이 아니기 때문입니다.
그것은 개발자에게 제안할 경로가 유효한지에 대한 언어 서비스(language-service)의 결정입니다.
만약 언어 서비스가 패키지 경계(package boundary)를 벗어나는 가져오기 경로를 제공한다면, 에디터는 유효하지 않거나 안전하지 않은 소스 관계를 마치 정당한 것처럼 제시하게 됩니다.
눈에 보이는 증상은 와일드카드 패키지 내보내기가 포함 관계 규칙(containment rules)에 의해 거부되어야 할 경로에 대해 자동 가져오기 제안을 생성할 수 있다는 것이었습니다.
더 깊은 문제는 단계 순서(phase order)였습니다.
와일드카드가 아닌 내보내기 대상은 이미 다음과 같은 유효하지 않은 경로 세그먼트를 거부했습니다:
- ..
- .
- node_modules
하지만 와일드카드 내보내기 대상은 동일한 포함 관계 확인이 적용되기 전에 디렉토리 열거(directory enumeration) 단계에 도달할 수 있었습니다.
쉬운 말로 설명하자면:
한 내보내기 경로는 사용 전에 경계 확인을 거치는 반면, 다른 경로는 먼저 열거를 수행하여 검증이 너무 늦게 이루어질 수 있다는 것입니다.
이는 패키지 경계 권한의 실패(package-boundary authority failure)입니다.
로컬 수정 후보는 의도적으로 좁게 설계되었습니다.
자동 가져오기를 재설계하지 않습니다.
패키지 내보내기 의미론(package export semantics)을 광범위하게 변경하지도 않습니다.
와일드카드 디렉토리 열거 전에 기존의 유효하지 않은 대상 확인(invalid-target check)을 적용하여, 언어 서비스가 완성 후보(completion candidates)를 검색하기 전에 와일드카드 내보내기가 동일한 포함 관계 기대치를 준수하도록 합니다.
패키지 외부 선언이 자동 가져오기 완성으로 제공되지 않음을 증명하기 위해 회귀 테스트(regression test)가 추가되었습니다.
로컬 검증을 통과했습니다:
- resolver 수정 전에는 red proof가 실패했습니다.
- npx hereby runtests --tests=autoImportProvider 실행 결과 78개 테스트 통과
- npx hereby local 통과
- npx hereby lint 통과
- git diff --check 통과
아직 공개된 PR(Pull Request)은 없습니다.
현장 테스트 (Field Test) #016
- 프로젝트: TypeScript
- 이슈 유형: 언어 서비스 (language-service) 자동 가져오기 (auto-import) / 패키지 내보내기 (package exports) 격리
- 경계 (Boundary): 패키지 내보내기 대상 유효성 vs 자동 가져오기 리졸버 (resolver) 열거
- 결과: 좁은 범위의 로컬 수정 후보 및 회귀 테스트 (regression test) 확보
- 상태: 로컬 증명 준비 완료; PR 제출 전 공개 유지 관리자(maintainer) 방향성 코멘트 권장
이 현장 테스트가 중요한 이유는 이것이 언어 서비스 (language-service) 레이어 내부에 위치하기 때문입니다.
이 버그는 런타임 (runtime) 크래시가 아닙니다.
빌드 실패도 아닙니다.
UI 렌더링 문제도 아닙니다.
이것은 에디터/컴파일러 툴링 (tooling)이 유효하게 취급되어서는 안 되는 임포트 (import) 관계를 제안하는 문제입니다.
이는 소프트웨어의 진실 경계 (truth boundary)라는 다른 종류의 문제입니다.
패키지는 무엇을 내보낼지 (exports) 선언합니다.
리졸버 (resolver)는 해당 선언이 무엇을 의미하는지 결정합니다.
언어 서비스 (language service)는 이를 개발자에게 보여지는 제안으로 변환합니다.
만약 한 경로에서 격리 (containment) 체크가 너무 늦게 발생한다면, 툴은 유효하지 않은 패키지 관계를 마치 안전한 것처럼 제시할 수 있습니다.
이것이 바로 Scarab이 드러내기 위해 구축된 바로 그 종류의 경계입니다:
단순히 에디터가 무언가를 찾을 수 있는지 여부가 아니라,
찾아낸 대상이 소스 진실 (source truth)로 취급될 수 있는지의 여부입니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기