기본값에 맡겼을 인자가 전부 필수입니다. createTossPayments는 OrderStore를 넘기기 전에는 confirm 프로퍼티가, BillingKeyStore를 넘기기 전에는 billing 프로퍼티가 아예 없는 타입을 돌려줍니다. formatDateTime(instant)는 timeZone에 기본값이 없어서 컴파일되지 않고, createTossPaymentsPostgres({ sql })은 암호화 protector가 필수 필드라 타입 에러입니다. 무제한 업로드도 Number.POSITIVE_INFINITY가 거부되기 때문에 'server-enforced'라고 직접 적어야 합니다.
분기를 빼놓을 수 없습니다
돌려받는 결과가 union이라, 그냥 빠뜨렸을 분기에 이름이 붙어 있습니다. matchRefreshOutcome은 token refresh의 다섯 결말을 전부 핸들러 키로 받는데, transient를 빼면 그 호출은 컴파일되지 않습니다. 5xx를 오탐 로그아웃으로 바꾸는 분기가 바로 그것입니다. saveWorkout()의 nativeId도, 개발 중에는 한 번도 마주치지 않는 잠긴 기기 분기를 status === 'saved'로 좁혀 지나기 전에는 TS2339입니다. 잡 실행 결과의 error 역시 status로 좁히기 전에는 접근할 수 없습니다.
강제 장치도 테스트가 지킵니다
tests/types 아래 65개 픽스처 파일에 @ts-expect-error 708개가 들어 있고, vitest typecheck가 그 전부를 실행합니다. TypeScript는 더 이상 아무것도 잡아내지 못하는 directive 자체를 에러(TS2578)로 취급합니다. 그래서 강제가 느슨해지는 순간 테스트는 통과하는 게 아니라 깨집니다. 여기서는 규칙이 빌드를 깨뜨리지 않고서는 문서 속 한 줄짜리 권고로 전락할 수 없습니다.
앱이 소유한 절반은 Node에서 돕니다
열 개 중 일곱 개가 프레임워크 없는 ./testing 엔트리를 함께 냅니다. 위험한 대상을 붙이지 않고도 앱이 소유한 부분을 검사할 수 있다는 뜻입니다. nest-notifications는 직접 운영하는 database에 그대로 겨눌 수 있는 적합성 케이스 30개를, nest-operations-jobs는 13개를 돌려줍니다. toss-payments-postgresql의 인메모리 대역은 PostgreSQL이라면 조용히 멈췄을 중첩 lock에서 그 자리에 예외를 던집니다. expo-workouts는 API가 아니라 그 아래 네이티브 모듈 seam을 대체하기 때문에, 실제 코어 코드가 cursor reset 사유 6종을 vitest에서 그대로 재현합니다.
플랫폼이 조용히 실패하는 네 지점을 하나씩 맡습니다. 접근성 이름이 없는 IconButton, reject 대신 프로세스를 끝내 버리는 업로드, 5xx를 로그아웃으로 오분류하는 refresh, 그리고 빠뜨린 route를 함께 지워 버리는 Health Connect upsert입니다.
@gj-kit/expo-ui · 0.8.5이름 없는 IconButton·Tabs·Slider가 스크린 리더 버그가 아니라 컴파일 에러가 되는 React Native·웹 UI primitive 모음입니다.