Skip to content

chore(deps): TypeScript 6.0 + 빌드 툴체인 업데이트#128

Merged
Han5991 merged 11 commits into
mainfrom
feat/typescript-update
Jun 16, 2026
Merged

chore(deps): TypeScript 6.0 + 빌드 툴체인 업데이트#128
Han5991 merged 11 commits into
mainfrom
feat/typescript-update

Conversation

@Han5991

@Han5991 Han5991 commented Jun 16, 2026

Copy link
Copy Markdown
Owner

No description provided.

@vercel

vercel Bot commented Jun 16, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
ant-blog Ready Ready Preview, Comment Jun 16, 2026 2:52pm
fe-lab-next-js Ready Ready Preview, Comment Jun 16, 2026 2:52pm

@gemini-code-assist

Copy link
Copy Markdown
Contributor

Summary of Changes

Hello, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

이 풀 리퀘스트는 프로젝트의 전반적인 빌드 툴체인과 의존성을 현대화하는 데 중점을 두고 있습니다. TypeScript 6.0으로의 업그레이드와 함께, 기존 tsup 기반의 빌드 설정을 tsdown으로 전환하여 빌드 프로세스를 최적화했습니다. 또한, 프로젝트 유지보수를 위한 정리 스크립트 추가 및 Node.js 버전 요구사항 상향 조정이 포함되어 있습니다.

Highlights

  • TypeScript Upgrade: Updated TypeScript to version 6.0.3 across the workspace via the pnpm catalog.
  • Build Toolchain Migration: Migrated several packages from tsup to tsdown for improved build performance and configuration.
  • Project Maintenance: Updated Node.js engine requirements to >=24, added new clean scripts to package.json, and updated dependencies like Prettier and Turbo.
Ignored Files
  • Ignored by pattern: pnpm-lock.yaml (1)
    • pnpm-lock.yaml
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize the Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counterproductive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for GitHub and other Google products, sign up here.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

@claude

claude Bot commented Jun 16, 2026

Copy link
Copy Markdown

Code Review: TypeScript 6.0 + 빌드 툴체인 업데이트

개요

이 PR은 세 가지 주요 변경을 묶어서 처리합니다:

  1. TypeScript 5.8.3 → 6.0.3 (메이저 버전 업그레이드)
  2. tsup → tsdown 0.22.2 빌드 도구 전환
  3. Node.js 엔진 요구사항 >=22>=24 상향

✅ 잘 된 부분

  • catalog 중앙화: catalog:typescript5 개별 항목들을 catalog: 기본 항목으로 통합 — 버전 관리가 단순해졌습니다.
  • concurrently 위치 수정: dependenciesdevDependencies로 이동 (빌드 도구는 devDep이 맞습니다).
  • exports 구조 개선 (@package/bundler): import / require 조건 아래 types 필드를 올바르게 중첩해 패키지 exports 명세를 따릅니다.
  • ESM-first 출력: .js/.d.ts.mjs/.d.mts 전환은 tsdown의 ESM 우선 방향과 일치합니다.
  • deprecated 패키지 제거: source-map@0.8.0-beta.0, rollup@4.x, sucrase, tsup 의존성들이 제거되어 lockfile이 깔끔해졌습니다.
  • rootDir: "./src" 추가 (sample-lib/tsconfig.json): 선언 파일 생성이 더 정확해집니다.

⚠️ 주의가 필요한 부분

1. TypeScript 6.0 — 실제 컴파일 검증 필요

PR 설명이 비어 있습니다. TypeScript 6.0은 메이저 버전 업그레이드이며 여러 breaking change를 포함합니다. pnpm check-types가 전체 모노레포에서 통과한다는 확인이 필요합니다.

2. baseUrl 제거 (apps/react/tsconfig.app.json)

- "baseUrl": ".",
  "paths": {
    "@/*": ["./src/*"],

TypeScript 6.0에서 paths 사용 시 baseUrl 없이도 동작이 달라질 수 있습니다. 경로 별칭(@/, @pages/)이 런타임(Vite)과 타입 체커 양쪽에서 여전히 올바르게 해석되는지 검증이 필요합니다.

3. Node.js >=24 요구사항 상향

- "node": ">=22"
+ "node": ">=24"

Node.js 22는 현재 LTS이고 2027년까지 지원됩니다. 24를 요구하는 것은 상당히 공격적입니다. 실제 동기는 tsdown@0.22.2의 엔진 요구사항(^22.18.0 || >=24.0.0)인데, 22.18+로도 충족 가능합니다. >=22.18.0 또는 >=22.18.0 || >=24.0.0 형태가 더 유연할 것 같습니다.

4. @pandacss/dev가 peerDependencies에 추가됨 (@design-system/ui)

  "peerDependencies": {
+   "@pandacss/dev": "catalog:",
    "react": "catalog:react19",

catalog: 별칭이 peerDependencies에서 올바르게 해석되는지 확인이 필요합니다. pnpm catalog 참조는 일반적으로 dependencies/devDependencies에서 사용하며, peerDependencies에서의 동작은 패키지 소비자(특히 외부 패키지) 관점에서 예상치 못한 결과를 낳을 수 있습니다.

5. tsdown은 아직 pre-1.0

tsdown@0.22.2는 아직 안정 릴리즈 전입니다. 실험적 레포에서는 괜찮지만, API가 패치 버전 사이에도 변경될 수 있다는 점을 고려할 필요가 있습니다.

6. 자동 생성 파일 커밋

public/rss.xmlpublic/sitemap.xml의 날짜 변경이 포함되어 있습니다. 이 파일들을 git에 포함하는 것이 의도적이라면 CI 빌드 시마다 diff가 생겨 PR 리뷰가 복잡해질 수 있습니다. .gitignore로 제외하거나, 별도 커밋으로 분리하는 것을 고려해보세요.


💡 제안 사항

Node 요구사항 재검토:

"engines": {
  "node": ">=22.18.0"
}

tsdown 요구사항을 만족하면서 Node 22 LTS 사용자를 수용할 수 있습니다.

PR 설명 추가: 어떤 TC 6.0 변경사항을 처리했는지, 테스트는 어떻게 했는지 간략히 기술해주면 리뷰에 도움이 됩니다.


총평

방향성은 좋습니다 — tsdown으로 전환과 TypeScript 6.0 채택 모두 모노레포가 최신 툴체인을 따라가는 합리적인 선택입니다. 위의 몇 가지 사항(특히 baseUrl 제거와 전체 check-types 통과 여부)만 확인하면 머지 가능해 보입니다.


🤖 Reviewed by Claude Code

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

이번 풀 리퀘스트에서는 TypeScript 버전을 6.0.3으로 업그레이드하고, 일부 패키지의 빌드 도구를 tsup에서 tsdown으로 전환하여 빌드 설정을 최적화했습니다. 또한 Node.js 엔진 요구사항을 24 이상으로 상향하고 루트 package.json에 clean 스크립트를 추가했습니다. 이에 대해 리뷰어는 clean 스크립트의 크로스 플랫폼 호환성 문제(Unix 명령어 사용), 빌드 도구 전환 후 @design-system/ui 패키지의 루트 main 및 types 필드가 업데이트되지 않은 문제, 그리고 @package/bundler에서 target: 'node24' 옵션이 누락되어 불필요한 다운레벨 컴파일이 발생할 수 있는 문제를 지적하며 개선을 권장했습니다.

Important

The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.

Comment thread package.json
Comment on lines +20 to +21
"clean:dist": "find . -name node_modules -prune -o -type d '(' -name dist -o -name .next -o -name out -o -name .turbo ')' -prune -exec rm -rf {} +",
"clean:modules": "find . -name node_modules -type d -prune -exec rm -rf {} +",

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

clean 스크립트에서 사용된 findrm 명령어는 Unix 계열 OS(macOS, Linux) 전용 명령어입니다. Windows 환경(PowerShell/CMD 등)을 사용하는 개발자 환경에서는 이 스크립트가 작동하지 않아 빌드 아티팩트 청소 시 오류가 발생할 수 있습니다.

모노레포의 크로스 플랫폼 호환성을 보장하기 위해 rimraf 패키지를 사용하거나, Node.js API(fs.rmSync 등)를 활용한 크로스 플랫폼 스크립트를 작성하여 호출하는 것을 권장합니다.

Comment on lines +16 to +17
"types": "./dist/index.d.mts",
"import": "./dist/index.mjs"

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

빌드 도구를 tsdown으로 전환하면서 출력 파일 확장자가 .mjs.d.mts로 변경되었습니다. publishConfig.exports는 이에 맞춰 잘 업데이트되었으나, package.json 루트 레벨에 정의된 typesmain 필드(6~7행)는 여전히 기존의 ./dist/index.d.ts./dist/index.js를 가리키고 있습니다.

일부 exports 필드를 완벽히 지원하지 않는 레거시 도구나 IDE 환경에서 루트 레벨의 main/types를 참조할 때 파일 찾기 오류가 발생할 수 있으므로, 이 필드들도 새로운 확장자(.mjs, .d.mts)에 맞게 업데이트하거나 불필요하다면 제거하는 것을 권장합니다.

entry: ['src/index.ts', 'src/cli.ts'],
format: ['esm', 'cjs'],
target: 'node24',
platform: 'node',

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

target: 'node24' 옵션이 제거되고 platform: 'node'만 지정되었습니다. package.json에서 Node.js 엔진 요구사항을 node >= 24로 상향 조정했으므로, 불필요한 다운레벨 컴파일을 방지하고 최신 자바스크립트 문법을 그대로 활용할 수 있도록 target: 'node24'(또는 최신 ES 버전) 옵션을 명시적으로 유지하는 것이 좋습니다.

Suggested change
platform: 'node',
platform: 'node',
target: 'node24',

@claude

claude Bot commented Jun 16, 2026

Copy link
Copy Markdown

Code Review: TypeScript 6.0 + Build Toolchain Update

전체적으로 잘 정리된 PR입니다. TypeScript 6.0 업그레이드에 따른 breaking change들을 체계적으로 처리했고, 블로그 포스트로 경위까지 문서화한 점이 좋습니다.


✅ 잘 된 점

  • pnpm catalog 통합이 깔끔합니다. typescript5 named catalog를 제거하고 default catalog로 승격한 것은 모노레포 전체 버전 관리를 단순화합니다.
  • CI matrix 전환이 효과적입니다. 순차 실행 → 병렬 matrix로 바꾸고 fail-fast: false를 추가해 모든 체크 결과를 한 번에 볼 수 있게 된 점이 특히 좋습니다.
  • concurrentlydependenciesdevDependencies로 이동한 것은 정확한 수정입니다. 런타임 의존성이 아니니 맞습니다.
  • tsdown 전환 이유가 명확합니다. tsup이 baseUrl을 강제 주입하는 근본 원인을 파악하고 도구를 교체한 접근이 올바릅니다.

⚠️ 개선 제안

1. @package/bundler/tsdown.config.tsplatform: 'node'가 Node 버전을 고정하지 않습니다

// 변경 전 (tsup)
target: 'node24',

// 변경 후 (tsdown)
platform: 'node',

tsdown의 platform: 'node'는 Node.js 환경을 선언하지만, 출력 대상 버전은 별도로 지정해야 합니다. tsup의 target: 'node24'처럼 특정 버전을 타겟팅하려면 tsdown에서는 target: 'node24' 옵션을 명시적으로 추가해야 합니다. 의도적인 변경인지 확인이 필요합니다.

export default defineConfig({
  entry: ['src/index.ts', 'src/cli.ts'],
  format: ['esm', 'cjs'],
  platform: 'node',
  target: 'node24',  // ← 명시 권장
  clean: true,
  dts: true,
  sourcemap: true,
});

2. @design-system/ui@pandacss/dev를 peerDependencies에 추가한 것, 의도 확인 필요

"peerDependencies": {
  "@pandacss/dev": "catalog:",   // 새로 추가
  "react": "catalog:react19",
  "react-dom": "catalog:react19"
}

블로그 포스트에서도 언급했지만, deps.neverBundle 대신 peerDependency로 추가하는 것이 "더 정석"이라고 했습니다. 그런데 현재 코드를 보면 deps.neverBundle도 그대로 있는지, 또는 제거됐는지 diff에서 명확하지 않습니다. 둘 다 남아 있다면 중복이고, peerDependency만으로 처리하는 쪽이 더 깔끔합니다. 어느 쪽을 선택했는지 확인 바랍니다.

3. @design-system/ui/package.json — peerDependencies에 catalog 참조 사용

"peerDependencies": {
  "react": "catalog:react19",
  "react-dom": "catalog:react19"
}

peerDependencies에 catalog: 참조를 쓰는 것은 pnpm 자체에서는 동작하지만, 이 패키지를 외부에 npm publish할 경우 catalog:react19가 유효한 semver가 아니라 에러가 됩니다. publishConfig.exports가 있는 것을 보면 publish를 고려한 패키지인 것 같은데, peerDependencies는 실제 semver 범위("^19.0.0")로 유지하는 것을 권장합니다.

4. Node.js 최소 요구사항이 >=22>=24로 올라갔습니다

"engines": {
  "node": ">=24"
}

GitHub Actions CI의 Node 버전 설정도 함께 변경됐는지 확인이 필요합니다. .github/workflows/ci.ymlnode-version이 아직 22를 가리키고 있다면 불일치가 생깁니다.


🔍 마이너 관찰

  • apps/blog/web/public/rss.xml, sitemap.xml 커밋: 생성 날짜만 바뀐 자동 생성 파일입니다. 이 파일들을 git으로 추적하는 것이 의도적인지 확인해주세요. 매 빌드마다 변경이 발생해 PR diff가 지저분해질 수 있습니다.
  • 블로그 포스트 status: 'draft': 올바르게 draft로 표시되어 있어 빌드에는 포함되지 않습니다. 정식 발행 예정이시면 pnpm lint:posts로 frontmatter 검증 후 status: 'published'로 변경하면 됩니다.
  • packages/@package/sample-lib/package.json — peerDependencies 범위 변경: >=18>=19는 실제로 React 18을 지원하지 않는다는 의미입니다. 이 패키지가 React 19 전용으로 전환됐다면 의도적인 것이지만, 기존 사용자가 있다면 breaking change입니다.

전체적으로 TypeScript 6.0 마이그레이션을 꼼꼼하게 처리했습니다. 위 사항들 중 platform vs target 이슈와 peerDependencies의 catalog 참조 문제를 확인하시면 머지 준비가 될 것 같습니다.

@claude

claude Bot commented Jun 16, 2026

Copy link
Copy Markdown

Code Review: chore(deps): TypeScript 6.0 + 빌드 툴체인 업데이트

Overview

This PR upgrades TypeScript from 5.8.3 to 6.0.3 across the monorepo by consolidating the named typescript5 catalog into the default catalog. The key chain of changes is well-motivated: TS6 deprecates baseUrl, tsup injects it silently, so tsup was replaced with tsdown. The migration also adds rootDir where TS6 now requires it, and ships a detailed draft blog post documenting the whole journey.


Bug / Breaking Issue

peerDependencies using catalog: protocolpackages/@design-system/ui/package.json

"peerDependencies": {
  "@pandacss/dev": "catalog:",
  "react": "catalog:react19",
  "react-dom": "catalog:react19"
}

The catalog: protocol is pnpm workspace-internal. When this package is published or consumed by an external project, catalog references cannot be resolved and will cause install failures or be treated as invalid version strings. The publishConfig block in the same file indicates this package is meant for distribution.

Recommendation — use concrete semver ranges:

"peerDependencies": {
  "@pandacss/dev": ">=1.0.0",
  "react": ">=19.0.0",
  "react-dom": ">=19.0.0"
}

Also: catalog:react19 resolves to ^19.3.0-canary-a757cb76-20251002. Pinning peers to a canary build is almost certainly not the intent.


Suggestions

1. Stale packageManager in @package/core
packages/@package/core/package.json still declares "packageManager": "pnpm@10.4.1" while the root uses pnpm 11.6.0. Since only the root field is authoritative, the sub-package entry should be removed to avoid confusion.

2. Confirm DTS artifact size after tsdown migration
The blog post documents index.d.mts ballooning to 1.05 MB before being fixed by deps.neverBundle or adding @pandacss/dev to peerDependencies. Please verify the built artifact is back to ~4 KB before merge — this is a correctness and perf concern for consumers.

3. Generated files committed to the repo
apps/blog/web/public/rss.xml and sitemap.xml are auto-generated during the build. Committing them adds noise to every PR and risks stale content. Consider .gitignore-ing them and letting the CI/deploy pipeline regenerate them from source.

4. clean:dist portability

"clean:dist": "find . -name node_modules -prune -o -type d '(' -name dist ... ')' -prune -exec rm -rf {} +"

The parenthesis quoting relies on POSIX find. On Windows (Git Bash, etc.) the behavior may differ. Low risk for a Node 24 repo, but worth a note.


What's Done Well

CI consolidation — merging lint, check-types, and test into pnpm turbo run lint check-types test lets Turborepo share the ^build graph, run tasks in parallel, and apply caching. The inline comment explains the why clearly.

tsup → tsdown migration — well executed. exports are correctly updated for .mjs/.d.mts/.d.cts extension conventions, the bin path is updated to cli.mjs, and the bundler exports are correctly restructured with nested import/require conditions and explicit types fields.

TS6 breaking changes handled systematically:

  • baseUrl removed from apps/react/tsconfig.app.json
  • rootDir: "./src" added to packages/@package/sample-lib/tsconfig.json
  • concurrently correctly moved from dependencies to devDependencies

Blog post (typescript-6-업그레이드-삽질기.md) — excellent engineering write-up. The table-driven TL;DR, root-cause analysis of tsup's silent baseUrl injection, and the pnpm 11 no-op install gotcha are all genuinely useful. Worth publishing.


Summary

One functional bug (catalog refs in peerDependencies) should be fixed before merge. The stale packageManager field and committed generated files are minor hygiene issues. The core TypeScript 6 migration and toolchain switch are solid and well-reasoned.

…Node 버전 동기화

- @design-system/ui: 최상위 main/types가 tsup 시절 .js/.d.ts를 가리켜 dangling 참조였음. tsdown은 .mjs/.d.mts만 산출하므로 publishConfig.exports와 일치시킴
- CLAUDE.md: engines.node >=24 반영 (Node >=22 → >=24), pnpm 10.10.0 → 11.6.0 동기화

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@claude

claude Bot commented Jun 16, 2026

Copy link
Copy Markdown

PR Review: chore(deps): TypeScript 6.0 + 빌드 툴체인 업데이트

Overview

이 PR은 모노레포의 TypeScript를 5.8.3 → 6.0.3으로 업그레이드하면서 연쇄된 변경들을 담고 있습니다. TS6 breaking change 대응(baseUrl deprecation, rootDir 요구), tsup → tsdown 전환, pnpm 11.6.0 + Node.js 24 업그레이드, CI 최적화까지 잘 묶여 있습니다.


Positives

  • catalog 통합 전략이 명확함: typescript5 named catalog를 기본 catalog로 승격하면서 7곳의 참조를 일괄 정리한 방식이 깔끔합니다.
  • CI 최적화 실질적: pnpm lint && pnpm check-types && pnpm testpnpm turbo run lint check-types test로 묶어 ^build 중복 실행을 제거한 것은 실질적인 개선입니다.
  • concurrently 분류 수정: dependenciesdevDependencies 이동이 맞습니다. 런타임 의존성이 아닌 개발 도구이므로 올바른 수정입니다.
  • @design-system/ui peerDependencies 개선: react: '^19.0.0' 하드코딩 → catalog:react19 참조로 버전 관리가 일원화됩니다.
  • tsdown.config.ts의 deps.neverBundle 처리: 1.05MB dts 번들을 3.82KB로 되돌린 조치가 올바릅니다.
  • draft 블로그 포스트 포함: 작업 과정을 문서화하는 것은 좋습니다.

Issues & Suggestions

1. @package/corepackageManager 필드 잔존

@design-system/ui/package.json에서 "packageManager": "pnpm@10.10.0"이 삭제됐는데, @package/core/package.json에는 "packageManager": "pnpm@10.4.1"이 여전히 남아 있습니다. 루트에서 이미 pnpm@11.6.0을 선언하므로 하위 패키지의 이 필드는 혼란을 주거나 무시됩니다. 제거하거나 루트와 일치시키는 게 좋습니다.

2. tsdowndependencies에 위치

@design-system/ui/package.json에서 tsdown: 0.22.2dependencies에 들어 있습니다. 빌드 도구는 런타임 의존성이 아니므로 devDependencies로 이동하는 것이 맞습니다.

// 현재 (packages/@design-system/ui/package.json)
"dependencies": {
  "tsdown": "0.22.2",
  "typescript": "catalog:"
}
// 개선
"devDependencies": {
  "tsdown": "0.22.2",
  "typescript": "catalog:"
}

3. clean:dist 스크립트 — Linux CI 검증 필요

"clean:dist": "find . -name node_modules -prune -o -type d '(' -name dist -o -name .next -o -name out -o -name .turbo ')' -prune -exec rm -rf {} +"

블로그 포스트에서 "macOS find 기반"이라고 언급했는데, 이 스크립트가 GitHub Actions(Ubuntu/GNU find) 환경에서도 의도대로 동작하는지 확인이 필요합니다. 실제로 GNU find와 BSD find 모두 이 문법을 지원하지만, 크로스 플랫폼 안전성을 위해 rimraf 같은 Node.js 기반 도구를 쓰는 것도 고려해볼 수 있습니다.

4. @package/bundler의 exports에 최상위 types 조건 누락

타입스크립트 공식 권장 패턴은 import/require 이전에 최상위 types 조건을 두는 것입니다. 현재 방식도 최신 TS에서는 동작하지만, 일부 도구와의 호환성을 위해 추가를 고려하세요:

"exports": {
  ".": {
    "types": "./dist/index.d.mts",
    "import": { "types": "./dist/index.d.mts", "default": "./dist/index.mjs" },
    "require": { "types": "./dist/index.d.cts", "default": "./dist/index.cjs" }
  }
}

5. peerDependencies 버전 범위 변경 — 의도 확인

@package/sample-lib의 peerDependencies가 react: '>=18'react: '>=19'로 좁아졌습니다. React 18 소비자에게 peer dep warning이 발생하게 되므로, 이 패키지가 React 18과 실제로 호환되지 않는다면 올바른 변경이지만 의도된 것인지 확인이 필요합니다.

6. Node.js 24 요구 — CI 설정 확인

engines: { node: '>=24' }로 올렸는데, CI의 node-version 설정도 함께 업데이트됐는지 확인이 필요합니다. diff에서 .github/workflows/ci.yml의 node-version 변경이 보이지 않아 기존 runner에서 Node 24를 이미 쓰고 있거나, 업데이트가 누락됐을 수 있습니다.


Minor Notes

  • rss.xml / sitemap.xml 커밋: 이 파일들이 항상 빌드 결과물로 자동 생성된다면 PR마다 포함하지 않고 .gitignore에 추가하거나 별도 배포 단계에서만 커밋하는 것을 고려하세요.
  • 블로그 포스트 status: 'draft': draft 컨텐츠를 피처 브랜치에 포함하는 것은 괜찮지만, main에 머지되면 다음 cron 빌드에서 published 처리될 수 있으니 의도를 확인하세요. (현재 status: 'draft'이면 제외되므로 문제없음.)

Summary

전반적으로 TS6 마이그레이션의 핵심 변경(tsdown 전환, baseUrl 제거, rootDir 추가, catalog 통합)이 올바르게 처리됐습니다. 주요 수정 제안은 tsdowndevDependencies로 이동하는 것과 @package/core의 stale packageManager 필드 제거입니다. 나머지는 마이너한 개선 사항입니다.

🤖 Generated with Claude Code

Han5991 and others added 2 commits June 16, 2026 23:12
baseUrl deprecation(TS5101)·types 기본값 []·rootDir 요구(TS5011)를 릴리스 노트·이슈를 넘어 실제 microsoft/TypeScript PR diff(#62509·#63054·#62418)까지 추적하는 탐구 서사로 전면 재작성. 보너스로 유지보수가 멈춘 tsup을 tsdown으로 전환한 과정까지.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
scripts/build-content.ts가 prebuild/predev에서 재생성하는 public/ 산출물을 .gitignore에 추가하고 추적에서 제거. 빌드 시점에 항상 새로 생성되므로 버전 관리 불필요.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@claude

claude Bot commented Jun 16, 2026

Copy link
Copy Markdown

Code Review: TypeScript 6.0 + 빌드 툴체인 업데이트

전반적으로 잘 정리된 메이저 버전 마이그레이션입니다. breaking change 3종을 각각 올바르게 처리했고, tsup → tsdown 전환 동기도 명확합니다.


Overview

  • TypeScript 5.8.3 → 6.0.3 전체 모노레포 업그레이드
  • tsup(유지보수 중단) → tsdown 전환 (@design-system/ui, @package/bundler)
  • baseUrl 제거, rootDir 명시, types 기본값 변화 대응
  • CI 최적화: 개별 pnpm lint / check-types / test → 단일 pnpm turbo run lint check-types test
  • 빌드 생성물(sitemap.xml, rss.xml 등)을 .gitignore에 추가

Issues

🔴 tsdowndependencies에 위치함 (@design-system/ui)

packages/@design-system/ui/package.jsondependencies 섹션에 tsdown이 있습니다:

"dependencies": {
  "@design-system/ui-lib": "workspace:^",
  "tsdown": "0.22.2",       // ← 빌드 도구가 런타임 의존성에
  "typescript": "catalog:"  // ← 마찬가지
}

tsup도 이전에 dependencies에 있었지만, 빌드 도구는 devDependencies에 있어야 합니다. 패키지를 퍼블리시할 때 불필요한 의존성이 딸려갑니다. devDependencies로 이동을 권장합니다.


🟡 target: 'node24'platform: 'node' 동작 차이

packages/@package/bundler/tsdown.config.ts:

-  target: 'node24',
+  platform: 'node',

tsup의 target: 'node24'는 Node.js 24의 ECMAScript 버전 타겟으로 트랜스파일을 제어합니다. tsdown의 platform: 'node'는 플랫폼 힌트이고, 별도로 target을 명시하지 않으면 tsdown 기본값을 사용합니다. 현재 Node 24 환경에서 문제 없으면 괜찮지만, 의도적으로 ES 타겟을 명시하려면 target: 'node24'를 함께 추가하는 게 더 명확합니다.


🟡 @package/core/package.jsonpackageManager 필드가 구버전

루트 package.jsonpnpm@11.6.0으로 업데이트됐지만 packages/@package/core/package.json에는 "packageManager": "pnpm@10.4.1"이 그대로 남아 있습니다. 패키지별 packageManager 필드는 루트와 혼동을 줄 수 있으니, 제거하거나 루트와 맞추는 것을 고려해주세요.


Suggestions

블로그 포스트 status: 'draft'

새 블로그 글(typescript-6-업그레이드-삽질기.md)이 status: 'draft'로 포함되어 있습니다. draft 글은 프로덕션 빌드에서 제외되므로 지금 당장 문제는 없지만, 코드 변경과 콘텐츠 변경을 분리하는 게 이력 추적에 더 유리합니다. 선택적으로 별도 PR로 분리하는 것도 고려해보세요.


CI 최적화 코멘트 — 향후 유지보수 고려

- name: Lint / Type check / Test
  run: pnpm turbo run lint check-types test

현재 turbo pipeline config에서 세 태스크가 올바르게 정의돼 있다면 단일 호출은 좋은 최적화입니다. 다만 turbo.json에 해당 태스크들이 모두 정의됐는지 확인이 필요합니다. 태스크 중 하나가 없으면 에러 없이 스킵될 수 있습니다.


생성 파일 .gitignore 추가

/public/rss.xml
/public/sitemap.xml
/public/search-index.json
/public/llms-full.txt

좋은 방향입니다. prebuild 스크립트(build-content.ts)가 이 파일들을 재생성하므로 배포 파이프라인에서는 문제없이 동작할 것입니다.


Positive Highlights

  • Breaking change 근거까지 파고든 접근: TS5101, types: [] 기본값, rootDir 각각을 "왜"까지 추적해 대응한 점이 좋습니다. 단순 에러 수정이 아니라 원인을 이해하고 처리했습니다.
  • tsdown 전환 후 exports 필드 정확히 업데이트: .mjs/.d.mts/.cjs/.d.cts 확장자 변화에 맞춰 package.jsonexports, main, types, bin 필드를 모두 정정한 것이 꼼꼼합니다.
  • clean 스크립트 추가: find-prune을 활용한 안전한 clean 스크립트 구현이 실용적입니다.
  • pnpm catalog 활용: typescript5 카탈로그를 제거하고 default catalog에 typescript: 6.0.3으로 통합한 것이 일관성 면에서 깔끔합니다.

요약: tsdowndevDependencies로 이동하는 것만 수정하면 머지해도 문제없어 보입니다. platform: 'node' 타겟 이슈는 현재 환경에서 동작을 확인했다면 minor입니다.

🤖 Generated with Claude Code

Han5991 and others added 2 commits June 16, 2026 23:36
- named catalog(react19) → 기본 catalog로 react·react-dom·@types 통합 (stable 19.2.x)
- apps/{react,blog-web,next.js}·@design-system/ui의 catalog:react19 → catalog: 전환
- @design-system/ui: 빌드 도구(tsdown·typescript)를 dependencies → devDependencies (동일 파일이라 함께 반영)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- @package/bundler: tsdown.config에 target: 'node24' 명시 (platform과 별개 축)
- @package/core: 루트(pnpm@11.6.0)와 어긋난 packageManager(pnpm@10.4.1) 필드 제거
- blog: tsup→tsdown 보너스에 함정(platform≠target, 빌드도구 devDeps) + 체크리스트 보강

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@claude

claude Bot commented Jun 16, 2026

Copy link
Copy Markdown

Code Review: chore(deps): TypeScript 6.0 + 빌드 툴체인 업데이트

전체적으로 잘 정리된 메이저 업그레이드 PR입니다. 변경 이유와 흐름이 명확하며, 특히 새 블로그 포스트 초안이 변경 맥락을 아주 잘 설명하고 있습니다.


Overview

이 PR이 수행하는 작업:

  • TypeScript 5.8.3 → 6.0.3 업그레이드 (breaking change 3종 대응 포함)
  • tsup → tsdown 마이그레이션 (tsup이 TS6와 호환되지 않고 유지보수 중단)
  • pnpm 10 → 11 / Node.js 22 → 24 업그레이드
  • React 19 canary → stable (19.2.7) 전환
  • catalog 네임스페이스 통합 (react19, typescript5 → default catalog:)
  • CI 최적화: lint/check-types/test를 단일 turbo run으로 통합
  • 생성 파일들(rss.xml, sitemap.xml 등) .gitignore 처리

🐛 Bug / 잠재적 문제

1. peerDependenciescatalog: 프로토콜 사용 — @design-system/ui

// packages/@design-system/ui/package.json
"peerDependencies": {
  "@pandacss/dev": "catalog:",
  "react": "catalog:",
  "react-dom": "catalog:"
}

catalog: 는 pnpm 워크스페이스 내부 전용 specifier입니다. peerDependencies에 사용하면:

  • pnpm workspace 내부에서는 동작하지만, 해당 패키지가 외부로 publish되거나 다른 환경에서 소비될 경우 catalog: 를 해석할 수 없어 오류가 발생합니다.
  • private: true 패키지이므로 퍼블리시 우려는 없지만, publishConfig.exports 블록이 존재하는 것을 보면 배포 가능성이 있음을 시사합니다. 일관성을 위해서라도 semver range를 쓰는 편이 안전합니다.

제안:

"peerDependencies": {
  "@pandacss/dev": ">=1.11.0",
  "react": ">=19.0.0",
  "react-dom": ">=19.0.0"
}

✅ 잘 된 점

2. CI 최적화 — 합산 turbo run

# 기존: 세 번의 별도 호출 → ^build 3회 중복 실행
- run: pnpm lint
- run: pnpm check-types
- run: pnpm test

# 변경: 한 번의 turbo run → 의존성 그래프 공유, 캐시 재사용
- run: pnpm turbo run lint check-types test

주석으로 이유까지 명시한 점이 좋습니다. 정확한 이유(^build 중복 방지)입니다.

3. tsdown 마이그레이션 — 올바른 결정

  • tsup이 dts 빌드 시 baseUrl: compilerOptions.baseUrl || '.' 를 강제 주입하는 근본 원인을 정확히 진단
  • tsup README의 "not actively maintained" 선언 확인 후 전환 결정
  • devDependencies 이동, 출력 확장자 변경(*.js*.mjs), platform vs target 구분 등 부수 작업도 빠짐없이 처리

4. 생성 파일 .gitignore 처리

/public/rss.xml
/public/sitemap.xml
/public/search-index.json
/public/llms-full.txt

prebuild/predev에서 자동 생성되는 파일들이므로 git 추적에서 제외하는 것이 맞습니다. 이전에 이 파일들이 커밋되어 있어 PR diff 크기가 부풀려진 원인이기도 합니다. 앞으로 PR diff가 훨씬 깔끔해질 것입니다.

5. React canary → stable 전환

19.3.0-canary-a757cb76-20251002 에서 19.2.7 stable로의 전환은 실험적 의존성을 제거하는 올바른 방향입니다.


💬 소견 / 마이너 코멘트

6. @package/sample-lib peerDependencies 범프

- "react": ">=18",
+ "react": ">=19",

명시적으로 React 18 지원을 드롭한 것인지 확인이 필요합니다. 이 패키지가 실험용이라면 문제없지만, 실제 사용처가 있다면 breaking change로 처리해야 합니다.

7. tsdown 버전 exact pin

"tsdown": "0.22.2"

빌드 도구는 exact pin이 일반적으로 맞습니다. 다만 tsdown이 활발히 개발 중인 프로젝트이므로 주기적인 업데이트 검토를 권장합니다.

8. 블로그 포스트 — status: 'draft'

새 포스트가 status: 'draft'로 커밋되어 있어 빌드에서 제외됩니다. 의도된 것으로 보이며, CLAUDE.md의 draft/published 처리 흐름과 일치합니다. publish 전 isPostVisible() 로직 검토 후 status: 'published' 로 변경하면 됩니다. 내용은 매우 충실합니다.

9. concurrentlydependenciesdevDependencies 이동

// 기존: root package.json dependencies
- "concurrently": "^9.2.0"

// 변경: devDependencies
+ "concurrently": "^9.2.0"

올바른 분류입니다. concurrently는 dev 스크립트 실행 도구이므로 devDependencies가 맞습니다.


요약

항목 상태
TypeScript 6 breaking change 대응 ✅ 정확
tsdown 마이그레이션 ✅ 정확, 부수 작업 완비
peerDependencies에 catalog: 사용 ⚠️ semver range로 교체 권장
생성 파일 gitignore ✅ 올바른 정리
CI 최적화 ✅ 효과적
React canary → stable
블로그 포스트 (draft) ✅ 의도된 상태

peerDependenciescatalog: 이슈가 가장 주목할 점입니다. 현재 private: true이므로 즉각적인 문제는 없지만, 관례상 semver range를 쓰는 편이 낫습니다.

🤖 Generated with Claude Code

@Han5991 Han5991 merged commit f34b82d into main Jun 16, 2026
4 of 6 checks passed
@Han5991 Han5991 deleted the feat/typescript-update branch June 16, 2026 14:46
@claude

claude Bot commented Jun 16, 2026

Copy link
Copy Markdown

Code Review: chore(deps): TypeScript 6.0 + 빌드 툴체인 업데이트

전반적으로 잘 정리된 PR입니다. TS 6.0의 세 가지 breaking change를 체계적으로 해결하고, tsup → tsdown 마이그레이션 및 카탈로그 구조 개편까지 한꺼번에 정리한 점이 인상적입니다.


Overview

항목 내용
핵심 변경 TypeScript 5.8.36.0.3
빌드 도구 tsup@8.4.0tsdown@0.22.2 (Rolldown 기반)
React 19.3.0-canary-a757cb7619.2.7 (stable)
Node.js >=22>=24
pnpm 10.10.011.6.0
CI 최적화 3개 step → 1개 turbo run lint check-types test

TS 6.0 Breaking Changes 대응 — ✅ 올바름

Breaking Change 파일 적용
TS5101: baseUrl deprecated apps/react/tsconfig.app.json "baseUrl": "." 제거 ✅
TS5011: rootDir must be explicit packages/@package/sample-lib/tsconfig.json "rootDir": "./src" 추가 ✅
TS5101 via tsup dts 빌드 @design-system/ui, @package/bundler tsup → tsdown 교체 ✅

잘 된 점

  • CI 최적화: pnpm turbo run lint check-types test 단일 호출로 ^build 중복 실행을 제거한 것은 정확한 Turborepo 활용입니다.
  • 생성 파일 gitignore: rss.xml, sitemap.xml, search-index.json, llms-full.txt를 gitignore에 추가하고 트래킹에서 제거한 것은 올바른 방향입니다. 빌드 시 regenerate되므로 커밋 노이즈가 줄어듭니다.
  • concurrently devDependencies 이동: 빌드 도구가 dependencies에 있던 버그를 수정.
  • 카탈로그 단순화: react19/typescript5 명명 카탈로그를 기본 catalog:로 통합해서 관리 포인트를 줄인 것은 명확한 개선입니다.
  • packageManager 필드 정리: 패키지 레벨의 stale packageManager 필드(e.g. @package/corepnpm@10.4.1) 제거. pnpm 권장에 따라 루트에서만 관리하는 것이 맞습니다.

지적 사항

🔴 Minor Issue — @pandacss/devpeerDependencies에 추가

// packages/@design-system/ui/package.json
"peerDependencies": {
  "@pandacss/dev": "catalog:"
}

빌드 도구를 peerDependencies에 추가하는 것은 비표준입니다. 모노레포 내부에서는 동작하지만, 만약 이 패키지를 외부에 publish할 경우 모든 소비자가 @pandacss/dev를 설치해야 한다는 의도치 않은 요구사항이 됩니다. devDependencies로 이동하거나, peerDependenciesMeta로 optional 처리 권장합니다.

🟡 주의 — React canary → stable 다운그레이드

# pnpm-workspace.yaml
- react: ^19.3.0-canary-a757cb76-20251002
+ react: 19.2.7

버전 숫자상 "다운그레이드"이지만, canary → stable이므로 안정성 면에서는 올바른 방향입니다. 다만 canary에서만 사용 가능한 API(예: use, React.cache 등의 실험적 기능)를 혹시 사용 중이라면 런타임 에러가 발생할 수 있습니다. 변경 전후로 앱을 실행해 확인하셨는지 체크 바랍니다.

🟡 주의 — rollup@4 override 제거

# 제거됨
overrides:
  rollup@4: 4.60.4

tsup이 rollup을 내부적으로 사용하기 때문에 이 override가 있었을 것입니다. tsdown은 Rolldown(Rust)을 사용하므로 rollup 의존성이 없어 제거 자체는 옳습니다. 그러나 다른 툴체인 의존성이 rollup@4를 여전히 사용하는지 pnpm why rollup 으로 확인하는 것을 권장합니다.

🟡 확인 필요 — .tool-versions 미포함

CLAUDE.md에 "루트 engines.tool-versions 기준 24.6.0"이라고 언급되어 있지만, .tool-versions 파일은 이번 PR diff에 포함되지 않았습니다. 이 파일이 별도로 업데이트되었는지 확인이 필요합니다.

🟡 확인 필요 — clean:dist 스크립트 cross-platform

"clean:dist": "find . '(' -name dist -o -name .turbo ')' -not -path '*/node_modules/*' -prune -exec rm -rf {} +"

find의 괄호('(' ... ')') 및 -prune 동작이 macOS(BSD find)와 Linux(GNU find)에서 미묘하게 다를 수 있습니다. CI는 Linux(Ubuntu)에서 실행되므로 로컬(macOS) 개발자와 동작이 다를 수 있습니다. rimraf 등 cross-platform 도구 사용을 고려하거나, CI에서 한 번 검증을 권장합니다.

🟢 참고 — @package/bundler TypeScript 점프 폭

이 패키지는 이전에 typescript: "5.9.3" (카탈로그가 아닌 고정 버전)이었습니다. 이번 PR로 6.0.3으로 바로 점프하는데, 이는 다른 패키지(5.8.36.0.3)보다 변경 범위가 큽니다. tsbundler의 타입 체크가 CI에서 통과된다면 문제 없습니다.


보안 고려사항

특별한 보안 문제 없음. 오히려:

  • tsup(rollup 기반) → tsdown(Rolldown 기반) 전환으로 공급망 의존성이 줄어듦
  • rollup@4 override 제거 후 rollup 의존성 자체가 제거되어 더 깔끔함

테스트 커버리지

  • CI에서 pnpm turbo run lint check-types test가 통과되면 타입 오류 및 기존 테스트 회귀는 자동으로 검증됩니다.
  • 빌드 산출물(.mjs/.d.mts 확장자 변경)에 대한 통합 테스트는 workspace: 프로토콜로 연결된 앱들의 빌드 성공 여부로 간접 검증됩니다.
  • 블로그 포스트(status: 'draft')는 프로덕션 빌드에서 제외되므로 배포 영향 없음.

결론

승인 가능한 PR입니다. @pandacss/dev peerDep 이슈만 추후 개선하면 되고, 나머지 주의사항들은 확인 후 필요시 follow-up으로 처리할 수 있습니다. TypeScript 6.0 마이그레이션이 체계적으로 잘 정리되어 있으며, 블로그 포스트로 과정을 문서화한 것도 좋은 접근입니다.


Reviewed by Claude (claude-sonnet-4-6)

@claude

claude Bot commented Jun 16, 2026

Copy link
Copy Markdown

Code Review: PR #128chore(deps): TypeScript 6.0 + 빌드 툴체인 업데이트

Note: This PR is already merged. Review is provided for documentation and retrospective purposes.


Overview

This PR upgrades the entire monorepo toolchain in one coordinated sweep:

Component Before After
TypeScript 5.8.3 (catalog:typescript5) 6.0.3 (default catalog:)
React 19.3.0-canary-a757cb76 (catalog:react19) 19.2.7 (default catalog:)
pnpm 10.10.0 11.6.0
Node.js minimum >=22 >=24
dts bundler tsup 8.4.0 tsdown 0.22.2
Turbo ^2.5.3 ^2.9.18

Three TypeScript 6.0 breaking changes were addressed:

  1. baseUrl deprecated (TS5101) → removed from apps/react/tsconfig.app.json
  2. types defaults to [] → no action needed (already explicit)
  3. rootDir required when outDir is set → added to packages/@package/sample-lib/tsconfig.json

✅ Positive Highlights

Catalog consolidation — removing the named react19: / typescript5: catalog namespaces and folding them into the default catalog: is a clean simplification. Fewer moving parts, single place to bump versions.

Generated artifacts removed from git — deleting rss.xml, sitemap.xml, search-index.json, llms-full.txt from the repo (~1500 lines removed) is the right call. These are regenerated on every prebuild and had no business being tracked.

tsup → tsdown migration is complete — both @design-system/ui and @package/bundler are migrated. The output extension changes (.mjs / .d.mts) and the package.json exports maps are updated consistently. The root cause (tsup injecting baseUrl: '.' into dts builds, which is a hard error in TS6) is correctly identified in the blog post.

CI consolidation — replacing three separate pnpm lint / pnpm check-types / pnpm test steps with a single pnpm turbo run lint check-types test is genuinely better: the shared ^build dependency runs once instead of being re-evaluated by three independent Turbo invocations.

concurrently moved to devDependencies — correct fix; it was incorrectly in dependencies (runtime) before.

clean scripts — the find-based clean:dist / clean:modules scripts using -name node_modules -prune to avoid recursing into node_modules/dist/... are implemented correctly.


⚠️ Concerns / Observations

peerDependencies using catalog: syntax

In packages/@design-system/ui/package.json:

"peerDependencies": {
  "@pandacss/dev": "catalog:",
  "react": "catalog:",
  "react-dom": "catalog:"
}

catalog: is a pnpm workspace feature and is not understood by consumers outside the workspace or by standard tooling. peerDependencies should declare semver ranges (e.g., "react": ">=19"). Since this package is "private": true it works in practice within the monorepo, but it's a non-standard pattern. Consider using actual semver ranges here.

CI: single Turbo step reduces per-task failure visibility

With three separate steps, GitHub Actions showed exactly which step (lint / type-check / test) failed in the step name. With a single step, all failures surface in the same log. Turbo's per-task output grouping partially mitigates this, but consider whether --log-prefix is configured in your turbo.json to keep failures easy to locate.

Node >=24 engine requirement — verify deploy workflow

The root engines field now requires >=24. Confirm that .github/workflows/deploy-blog.yml specifies node-version: '24' (this file was not changed in the PR diff). A Node 22 runner would fail at pnpm install --frozen-lockfile with an engine constraint error.

React canary → stable: potential API drift

19.3.0-canary-a757cb76 may have included features not yet in stable 19.2.7. For a lab repo this is low-risk (no app logic changed), but worth noting in case any code path depended on a canary-only API.

tsdown 0.22.2 exactly pinned (no caret)

Consistent with how tsup was pinned before, so likely intentional. Just confirming this is a deliberate policy rather than an oversight.


Blog Post

apps/blog/posts/typescript/typescript-6-업그레이드-삽질기.md is added as status: 'draft' — correct, it won't appear in production builds. The content is technically strong: it explains why each TS6 breaking change was made (with actual TypeScript compiler PR diffs cited), and documents the tsup discovery root cause. One minor nit: the opening paragraph uses raw <strong> HTML tags while the rest of the post uses markdown syntax — inconsistent but not blocking.


Summary

Well-executed, comprehensive toolchain upgrade. The main thing to follow up on: (1) verify deploy-blog.yml uses Node 24, and (2) consider replacing catalog: syntax in peerDependencies with actual semver ranges.

Reviewed by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant