소스 정보
- 저장소
- puk0806/gugbab-claude
- 최근 소스 활동
- 2026년 6월 11일 02:20
- 감지된 SKILL.md 언어
- 한국어
- 스타
- 2
- 포크
- 0
설치 방법
기본적으로 소스를 먼저 확인하는 Prompt가 선택됩니다. 직접 명령으로 전환하거나 로컬 사본을 다운로드할 수도 있습니다.
소스 파일 검토
설치 여부를 결정하기 전에 SKILL.md와 SkillsMP에 표시된 보조 파일을 읽어 보세요.
메뉴
기본적으로 소스를 먼저 확인하는 Prompt가 선택됩니다. 직접 명령으로 전환하거나 로컬 사본을 다운로드할 수도 있습니다.
설치 여부를 결정하기 전에 SKILL.md와 SkillsMP에 표시된 보조 파일을 읽어 보세요.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
직접 명령은 검토 Prompt를 거치지 않습니다. 실행하기 전에 소스를 확인하세요.
npx skills add https://github.com/puk0806/gugbab-claude --skill tsup명령은 한 줄로 유지됩니다. 복사하기 전에 가로로 스크롤해 전체 내용을 확인하세요.
로컬 사본을 원하시나요? SkillsMP에서 현재 제공할 수 있는 파일을 다운로드하세요.
SOC 직업 분류 기준
SKILL.md 표시 중
| name | tsup |
| description | tsup 패키지 번들러 — esbuild 기반 TypeScript 라이브러리 빌드, CJS/ESM 동시 출력, DTS 생성, 모노레포 공유 패키지 빌드 패턴 |
소스: https://tsup.egoist.dev | https://github.com/egoist/tsup/releases 검증일: 2026-04-20
tsup은 esbuild 기반의 TypeScript/JavaScript 라이브러리 번들러다. 설정이 최소화되어 있고, CJS/ESM 동시 출력과 TypeScript declaration 파일 생성을 지원한다.
최신 안정 버전: 8.5.1 (2024-11-12 릴리즈)
적합한 경우:
부적합한 경우:
# npm
npm install tsup typescript --save-dev
# pnpm
pnpm add -D tsup typescript
import { defineConfig } from 'tsup';
export default defineConfig({
entry: ['src/index.ts'],
format: ['cjs', 'esm'],
dts: true,
clean: true,
sourcemap: true,
});
| 옵션 | 타입 | 설명 |
|---|---|---|
entry | string[] 또는 Record<string, string> | 엔트리 포인트 |
format | ('cjs' | 'esm' | 'iife')[] | 출력 포맷 |
dts | boolean | DtsConfig | TypeScript declaration 파일 생성 |
clean | boolean | 빌드 전 출력 디렉토리 정리 |
sourcemap | boolean | 소스맵 생성 |
splitting | boolean | 코드 스플리팅 (ESM에서만 유효) |
minify | boolean | 코드 압축 |
target | string | 빌드 타겟 (예: 'es2022', 'node18') |
outDir | string | 출력 디렉토리 (기본: 'dist') |
external | string[] | 번들에서 제외할 패키지 |
noExternal | string[] | 번들에 강제 포함할 패키지 |
treeshake | boolean | TreeshakingStrategy | Tree shaking 활성화 (Rollup 사용) |
onSuccess | string | (() => Promise<void>) | 빌드 성공 후 실행할 명령/함수 |
bundle | boolean | 번들링 여부 (기본: true) |
banner | { js?: string; css?: string } | 출력 파일 상단에 추가할 텍스트 |
define | Record<string, string> | 전역 상수 치환 |
esbuildPlugins |
export default defineConfig({
entry: ['src/index.ts'],
});
export default defineConfig({
entry: ['src/index.ts', 'src/cli.ts'],
});
export default defineConfig({
entry: {
index: 'src/index.ts',
cli: 'src/cli.ts',
utils: 'src/utils/index.ts',
},
});
export default defineConfig({
entry: ['src/**/*.ts'],
bundle: false, // 파일을 하나로 묶지 않고 각각 변환
});
export default defineConfig({
entry: ['src/index.ts'],
format: ['cjs', 'esm'],
dts: true,
});
출력 결과:
dist/
├── index.js # ESM
├── index.cjs # CJS
├── index.d.ts # ESM Declaration
└── index.d.cts # CJS Declaration
tsup 8.x에서 ESM은
.js, CJS는.cjs확장자가 기본이다.package.json의"type": "module"여부에 따라 달라질 수 있다. CJS 전용.d.cts파일은 TypeScript의moduleResolution: "NodeNext"/"Node16"환경에서 CJS 조건에 올바른 타입을 제공한다.
export default defineConfig({
dts: true, // TypeScript 컴파일러로 .d.ts 생성
});
export default defineConfig({
dts: {
resolve: true, // 외부 타입도 인라인으로 포함
entry: 'src/index.ts',
tsconfig: './tsconfig.lib.json', // 별도 tsconfig 지정
},
});
DTS 생성은 esbuild가 아닌 TypeScript 컴파일러를 사용하므로 느릴 수 있다. 빌드 속도가 중요하면 분리 실행:
{
"scripts": {
"build": "tsup",
"build:types": "tsc --emitDeclarationOnly --outDir dist"
}
}
tsup은 package.json의 dependencies와 peerDependencies를 자동으로 external 처리한다. devDependencies는 번들에 포함된다.
export default defineConfig({
external: ['react', 'react-dom', 'lodash'],
});
export default defineConfig({
noExternal: ['some-esm-only-package'],
});
주의: CJS 포맷으로 빌드할 때 ESM-only 패키지가 external이면 런타임 에러가 발생할 수 있다. 이 경우
noExternal로 번들에 포함시킨다.
tsup src/index.ts --watch
빌드 성공 후 명령어 실행:
export default defineConfig({
entry: ['src/index.ts'],
onSuccess: 'node dist/index.js',
// 또는 함수로:
// onSuccess: async () => { /* 빌드 후 작업 */ },
});
{
"scripts": {
"build": "tsup",
"dev": "tsup --watch",
"typecheck": "tsc --noEmit"
}
}
import { defineConfig } from 'tsup';
export default defineConfig((options) => ({
entry: ['src/index.ts'],
format: ['cjs', 'esm'],
dts: true,
minify: !options.watch, // watch 모드에서는 압축 안 함
sourcemap: true,
clean: true,
}));
packages/
├── ui/
│ ├── src/
│ │ ├── index.ts
│ │ ├── Button.tsx
│ │ └── Input.tsx
│ ├── tsup.config.ts
│ └── package.json
├── utils/
│ ├── src/
│ │ └── index.ts
│ ├── tsup.config.ts
│ └── package.json
└── shared-types/
└── src/
└── index.ts ← 타입만 있으면 tsup 불필요, tsc만으로 충분
import { defineConfig } from 'tsup';
export default defineConfig({
entry: ['src/index.ts'],
format: ['esm'], // 모노레포 내부용이면 ESM만으로 충분
dts: true,
external: ['react', 'react-dom'], // peer dependencies
clean: true,
});
{
"name": "@myorg/ui",
"version": "1.0.0",
"type": "module",
"main": "./dist/index.js",
"types": "./dist/index.d.ts",
"exports": {
".": {
"import": "./dist/index.js",
"types": "./dist/index.d.ts"
}
},
"files": ["dist"],
"scripts": {
"build": "tsup",
"dev": "tsup --watch"
},
"peerDependencies": {
// turbo.json
{
"tasks": {
"build": {
"dependsOn": ["^build"],
"outputs": ["dist/**"]
},
"dev": {
"dependsOn": ["^build"],
"persistent": true
}
}
}
{
"name": "my-lib",
"type": "module",
"main": "./dist/index.cjs",
"module": "./dist/index.js",
"types": "./dist/index.d.ts",
"exports": {
".": {
"import": {
"types": "./dist/index.d.ts",
"default": "./dist/index.js"
},
"require": {
"types": "./dist/index.d.cts",
"default": "./dist/index.cjs"
}
}
},
"files": ["dist"
주의:
types조건은 반드시default보다 먼저 와야 한다. TypeScript가 조건을 순서대로 평가하기 때문에,types가 뒤에 오면 타입 해석이 무시된다.
{
"exports": {
".": {
"import": {
"types": "./dist/index.d.ts",
"default": "./dist/index.js"
},
"require": {
"types": "./dist/index.d.cts",
"default": "./dist/index.cjs"
}
},
"./utils": {
"import": {
"types": "./dist/utils.d.ts",
"default": "./dist/utils.js"
},
"require": {
"types": "./dist/utils.d.cts",
"default":
대응하는 tsup 설정:
export default defineConfig({
entry: {
index: 'src/index.ts',
utils: 'src/utils/index.ts',
},
format: ['cjs', 'esm'],
dts: true,
});
상세 레퍼런스 (예제·고급 패턴·흔한 실수) →
references/REFERENCE.md
Plugin[] |
| esbuild 플러그인 |