From 734a9bef54944d50e98da702a2089b23265b0bbf Mon Sep 17 00:00:00 2001 From: Subin Lee Date: Mon, 20 Apr 2026 16:10:55 +0900 Subject: [PATCH 1/2] fix(build): resolve typedoc type errors and add tsc gate to CI MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `pnpm run docs`(typedoc)가 tsconfig의 include(src + test) 기준으로 전체 TypeScript 컴파일을 수행하다가 4개 타입 에러로 실패하여, v6.0.0 이후 GitHub Pages 문서 배포가 막혀 있었다. CI는 Biome/Vitest/tsup(모두 esbuild 계열)만 돌려 타입 에러를 잡지 못하는 공백이 있었다. - src/lib/schemaUtils.ts: Effect.void(= Effect)를 Effect 자리에 사용하던 것을 Effect.succeed(undefined)로 교정. - test/lib/bms-test-utils.ts: BmsChatBubbleType을 내부용 type-only import만 존재하는 kakaoOption.ts가 아니라 정식 re-export 위치인 @/models/base/kakao/bms 에서 import. - test/models/base/kakao/bms/bmsConstraints.test.ts: 콜백이 2-arg인데 it.each 튜플에 사용되지 않는 3번째 원소(`true`)가 섞여 있어 제거. - test/models/requests/messages/sendMessage.test.ts: Schema.encodeSync 결과의 scheduledDate 타입이 string | Date이므로 new Date(...) 정규화 후 getTime 비교. 추가로 회귀 방지를 위해 package.json에 `typecheck` 스크립트 (tsc --noEmit)를 신설하고 CI lint 잡에 Typecheck step을 추가한다. Co-Authored-By: Claude Opus 4.7 (1M context) --- .github/workflows/ci.yml | 3 +++ package.json | 1 + src/lib/schemaUtils.ts | 2 +- test/lib/bms-test-utils.ts | 2 +- .../models/base/kakao/bms/bmsConstraints.test.ts | 16 ++++++++-------- .../models/requests/messages/sendMessage.test.ts | 4 +++- 6 files changed, 17 insertions(+), 11 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8f02b88c..b02cb9af 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -46,6 +46,9 @@ jobs: - name: Lint run: pnpm lint:ci + - name: Typecheck + run: pnpm typecheck + test-matrix: name: Test Matrix (Node ${{ matrix.node-version }}) runs-on: ubuntu-latest diff --git a/package.json b/package.json index c2c47c95..6341bacd 100644 --- a/package.json +++ b/package.json @@ -37,6 +37,7 @@ "docs": "typedoc --entryPointStrategy expand ./src", "lint": "biome check --write", "lint:ci": "biome check", + "typecheck": "tsc --noEmit", "dev": "tsup --watch", "test": "vitest run", "test:ci": "vitest run --exclude '**/*.e2e.test.ts'", diff --git a/src/lib/schemaUtils.ts b/src/lib/schemaUtils.ts index 5f366d99..d2be40bc 100644 --- a/src/lib/schemaUtils.ts +++ b/src/lib/schemaUtils.ts @@ -45,7 +45,7 @@ export const safeDateTransfer = ( message: error instanceof Error ? error.message : String(error), }), }) - : Effect.void; + : Effect.succeed(undefined); /** * formatWithTransfer를 Effect로 감싸 InvalidDateError가 Defect가 되지 않도록 합니다. diff --git a/test/lib/bms-test-utils.ts b/test/lib/bms-test-utils.ts index 49b97ab7..aad2ab3f 100644 --- a/test/lib/bms-test-utils.ts +++ b/test/lib/bms-test-utils.ts @@ -2,10 +2,10 @@ import path from 'path'; import type { BmsCarouselCommerceItemSchema, BmsCarouselFeedItemSchema, + BmsChatBubbleType, BmsMainWideItemSchema, BmsSubWideItemSchema, } from '@/models/base/kakao/bms'; -import type {BmsChatBubbleType} from '@/models/base/kakao/kakaoOption'; import type {FileType} from '@/models/requests/messages/groupMessageRequest'; import type StorageService from '@/services/storage/storageService'; diff --git a/test/models/base/kakao/bms/bmsConstraints.test.ts b/test/models/base/kakao/bms/bmsConstraints.test.ts index ca746a4e..25978979 100644 --- a/test/models/base/kakao/bms/bmsConstraints.test.ts +++ b/test/models/base/kakao/bms/bmsConstraints.test.ts @@ -27,14 +27,14 @@ describe('validateCouponDescription', () => { }); it.each([ - ['TEXT', 12, true], - ['IMAGE', 12, true], - ['COMMERCE', 12, true], - ['CAROUSEL_FEED', 12, true], - ['CAROUSEL_COMMERCE', 12, true], - ['PREMIUM_VIDEO', 12, true], - ['WIDE', 18, true], - ['WIDE_ITEM_LIST', 18, true], + ['TEXT', 12], + ['IMAGE', 12], + ['COMMERCE', 12], + ['CAROUSEL_FEED', 12], + ['CAROUSEL_COMMERCE', 12], + ['PREMIUM_VIDEO', 12], + ['WIDE', 18], + ['WIDE_ITEM_LIST', 18], ] as const)('should accept coupon description at exact max length for %s (%d chars)', (chatBubbleType, maxLen) => { const result = validateCouponDescription({ chatBubbleType, diff --git a/test/models/requests/messages/sendMessage.test.ts b/test/models/requests/messages/sendMessage.test.ts index 65facef1..c52dd20e 100644 --- a/test/models/requests/messages/sendMessage.test.ts +++ b/test/models/requests/messages/sendMessage.test.ts @@ -597,6 +597,8 @@ describe('sendRequestConfigSchema', () => { }); const encoded = Schema.encodeSync(sendRequestConfigSchema)(decoded); - expect(encoded.scheduledDate!.getTime()).toBe(originalDate.getTime()); + expect(new Date(encoded.scheduledDate!).getTime()).toBe( + originalDate.getTime(), + ); }); }); From 57ad84fd1702e603a0854557d22c953e40a22ceb Mon Sep 17 00:00:00 2001 From: Subin Lee Date: Mon, 20 Apr 2026 16:11:42 +0900 Subject: [PATCH 2/2] ci(release): trigger docs build after stable publish MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit release-please가 기본 GITHUB_TOKEN으로 GitHub Release를 생성할 때, GitHub Actions 정책상 `release: [published]` 이벤트가 다음 워크플로를 트리거하지 않는다. 이 제약으로 v6.0.0 이후 `build-docs.yaml`이 자동으로 돌지 않아 API Reference가 구버전으로 남아 있었다. `workflow_dispatch`는 GITHUB_TOKEN으로도 기동이 허용되므로, publish 잡 성공 후 `gh workflow run build-docs.yaml --ref $TAG`로 명시적 디스패치 하는 `trigger-docs` 잡을 추가한다. master 브랜치이고 release_created가 true일 때만 동작하므로 beta 경로나 release PR 생성 단계에서는 트리거 되지 않는다. `--ref $TAG`로 릴리즈 태그 기준 커밋에서 문서를 빌드해 릴리즈와 동일한 소스 상태가 보장된다. build-docs.yaml 자체는 그대로 유지 — 수동 재빌드 경로와 향후 PAT 전환 시의 release 이벤트 경로 모두 보존. Co-Authored-By: Claude Opus 4.7 (1M context) --- .github/workflows/release.yml | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 3abbd780..5bfbac01 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -276,3 +276,22 @@ jobs: --- > **WARNING**: npm publish failed. Package was NOT published to npm." || true + + trigger-docs: + name: Trigger Docs Build + needs: [release-please, publish] + if: >- + needs.release-please.result == 'success' + && needs.release-please.outputs.release_created == 'true' + && needs.publish.result == 'success' + && github.ref_name == 'master' + runs-on: ubuntu-latest + permissions: + actions: write + steps: + - name: Dispatch build-docs workflow + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + TAG: ${{ needs.release-please.outputs.tag_name }} + REPO: ${{ github.repository }} + run: gh workflow run build-docs.yaml --repo "$REPO" --ref "$TAG"