@kood/claude-code 0.1.6 → 0.1.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +109 -216
- package/package.json +8 -2
- package/templates/hono/CLAUDE.md +59 -328
- package/templates/hono/docs/architecture/architecture.md +93 -747
- package/templates/hono/docs/deployment/cloudflare.md +59 -513
- package/templates/hono/docs/deployment/docker.md +41 -356
- package/templates/hono/docs/deployment/index.md +54 -190
- package/templates/hono/docs/deployment/railway.md +36 -306
- package/templates/hono/docs/deployment/vercel.md +49 -434
- package/templates/hono/docs/library/ai-sdk/index.md +53 -290
- package/templates/hono/docs/library/ai-sdk/openrouter.md +19 -387
- package/templates/hono/docs/library/ai-sdk/providers.md +28 -394
- package/templates/hono/docs/library/ai-sdk/streaming.md +52 -353
- package/templates/hono/docs/library/ai-sdk/structured-output.md +63 -395
- package/templates/hono/docs/library/ai-sdk/tools.md +62 -431
- package/templates/hono/docs/library/hono/env-setup.md +24 -313
- package/templates/hono/docs/library/hono/error-handling.md +34 -295
- package/templates/hono/docs/library/hono/index.md +29 -121
- package/templates/hono/docs/library/hono/middleware.md +21 -188
- package/templates/hono/docs/library/hono/rpc.md +40 -341
- package/templates/hono/docs/library/hono/validation.md +35 -195
- package/templates/hono/docs/library/pino/index.md +42 -333
- package/templates/hono/docs/library/prisma/cloudflare-d1.md +64 -367
- package/templates/hono/docs/library/prisma/config.md +19 -260
- package/templates/hono/docs/library/prisma/index.md +67 -320
- package/templates/hono/docs/library/zod/index.md +53 -257
- package/templates/npx/CLAUDE.md +62 -274
- package/templates/npx/docs/references/patterns.md +160 -0
- package/templates/tanstack-start/CLAUDE.md +100 -256
- package/templates/tanstack-start/docs/architecture/architecture.md +44 -589
- package/templates/tanstack-start/docs/deployment/cloudflare.md +37 -424
- package/templates/tanstack-start/docs/deployment/index.md +57 -286
- package/templates/tanstack-start/docs/deployment/nitro.md +36 -318
- package/templates/tanstack-start/docs/deployment/railway.md +40 -409
- package/templates/tanstack-start/docs/deployment/vercel.md +43 -465
- package/templates/tanstack-start/docs/design/components.md +77 -311
- package/templates/tanstack-start/docs/design/index.md +113 -69
- package/templates/tanstack-start/docs/design/safe-area.md +51 -250
- package/templates/tanstack-start/docs/design/tailwind-setup.md +45 -359
- package/templates/tanstack-start/docs/guides/conventions.md +103 -0
- package/templates/tanstack-start/docs/guides/env-setup.md +34 -340
- package/templates/tanstack-start/docs/guides/getting-started.md +22 -209
- package/templates/tanstack-start/docs/guides/hooks.md +166 -0
- package/templates/tanstack-start/docs/guides/routes.md +166 -0
- package/templates/tanstack-start/docs/guides/services.md +143 -0
- package/templates/tanstack-start/docs/library/better-auth/2fa.md +27 -115
- package/templates/tanstack-start/docs/library/better-auth/advanced.md +22 -105
- package/templates/tanstack-start/docs/library/better-auth/index.md +17 -66
- package/templates/tanstack-start/docs/library/better-auth/plugins.md +11 -88
- package/templates/tanstack-start/docs/library/better-auth/session.md +12 -92
- package/templates/tanstack-start/docs/library/better-auth/setup.md +9 -91
- package/templates/tanstack-start/docs/library/prisma/cloudflare-d1.md +30 -358
- package/templates/tanstack-start/docs/library/prisma/config.md +27 -327
- package/templates/tanstack-start/docs/library/prisma/crud.md +46 -174
- package/templates/tanstack-start/docs/library/prisma/index.md +23 -113
- package/templates/tanstack-start/docs/library/prisma/relations.md +31 -153
- package/templates/tanstack-start/docs/library/prisma/schema.md +40 -217
- package/templates/tanstack-start/docs/library/prisma/setup.md +12 -112
- package/templates/tanstack-start/docs/library/prisma/transactions.md +20 -110
- package/templates/tanstack-start/docs/library/tanstack-query/index.md +26 -97
- package/templates/tanstack-start/docs/library/tanstack-query/invalidation.md +28 -107
- package/templates/tanstack-start/docs/library/tanstack-query/optimistic-updates.md +44 -146
- package/templates/tanstack-start/docs/library/tanstack-query/use-mutation.md +33 -127
- package/templates/tanstack-start/docs/library/tanstack-query/use-query.md +49 -149
- package/templates/tanstack-start/docs/library/tanstack-start/auth-patterns.md +19 -112
- package/templates/tanstack-start/docs/library/tanstack-start/index.md +33 -80
- package/templates/tanstack-start/docs/library/tanstack-start/middleware.md +28 -106
- package/templates/tanstack-start/docs/library/tanstack-start/routing.md +21 -118
- package/templates/tanstack-start/docs/library/tanstack-start/server-functions.md +34 -246
- package/templates/tanstack-start/docs/library/tanstack-start/setup.md +6 -39
- package/templates/tanstack-start/docs/library/zod/complex-types.md +32 -156
- package/templates/tanstack-start/docs/library/zod/index.md +31 -144
- package/templates/tanstack-start/docs/library/zod/transforms.md +20 -129
- package/templates/tanstack-start/docs/library/zod/validation.md +39 -155
- package/templates/hono/docs/commands/git.md +0 -145
- package/templates/hono/docs/mcp/context7.md +0 -106
- package/templates/hono/docs/mcp/index.md +0 -176
- package/templates/hono/docs/mcp/sequential-thinking.md +0 -101
- package/templates/hono/docs/mcp/serena.md +0 -269
- package/templates/hono/docs/mcp/sgrep.md +0 -105
- package/templates/hono/docs/skills/gemini-review/SKILL.md +0 -220
- package/templates/hono/docs/skills/gemini-review/references/checklists.md +0 -136
- package/templates/hono/docs/skills/gemini-review/references/prompt-templates.md +0 -303
- package/templates/npx/docs/commands/git.md +0 -145
- package/templates/npx/docs/mcp/index.md +0 -60
- package/templates/npx/docs/skills/gemini-review/SKILL.md +0 -220
- package/templates/npx/docs/skills/gemini-review/references/checklists.md +0 -134
- package/templates/npx/docs/skills/gemini-review/references/prompt-templates.md +0 -301
- package/templates/tanstack-start/docs/commands/git.md +0 -145
- package/templates/tanstack-start/docs/design/accessibility.md +0 -433
- package/templates/tanstack-start/docs/design/color.md +0 -235
- package/templates/tanstack-start/docs/design/spacing.md +0 -341
- package/templates/tanstack-start/docs/design/typography.md +0 -324
- package/templates/tanstack-start/docs/guides/best-practices.md +0 -950
- package/templates/tanstack-start/docs/guides/husky-lint-staged.md +0 -303
- package/templates/tanstack-start/docs/guides/prettier.md +0 -189
- package/templates/tanstack-start/docs/guides/project-templates.md +0 -710
- package/templates/tanstack-start/docs/library/tanstack-query/setup.md +0 -107
- package/templates/tanstack-start/docs/library/zod/basic-types.md +0 -186
- package/templates/tanstack-start/docs/mcp/context7.md +0 -204
- package/templates/tanstack-start/docs/mcp/index.md +0 -177
- package/templates/tanstack-start/docs/mcp/sequential-thinking.md +0 -180
- package/templates/tanstack-start/docs/mcp/serena.md +0 -269
- package/templates/tanstack-start/docs/mcp/sgrep.md +0 -174
- package/templates/tanstack-start/docs/skills/gemini-review/SKILL.md +0 -220
- package/templates/tanstack-start/docs/skills/gemini-review/references/checklists.md +0 -144
- package/templates/tanstack-start/docs/skills/gemini-review/references/prompt-templates.md +0 -292
package/templates/hono/CLAUDE.md
CHANGED
|
@@ -1,220 +1,64 @@
|
|
|
1
|
-
# CLAUDE.md -
|
|
1
|
+
# CLAUDE.md - Hono Server Framework
|
|
2
2
|
|
|
3
|
-
>
|
|
3
|
+
> Web Standards 기반 초경량 서버 프레임워크
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
## 🚨 STOP - 작업 전 필수 확인
|
|
8
|
-
|
|
9
|
-
```
|
|
10
|
-
┌─────────────────────────────────────────────────────────────┐
|
|
11
|
-
│ 이 프로젝트에서 작업하기 전에 이 문서를 끝까지 읽으세요. │
|
|
12
|
-
│ 특히 ⛔ NEVER DO 섹션의 규칙은 절대 위반하지 마세요. │
|
|
13
|
-
│ │
|
|
14
|
-
│ 📖 작업 유형별 상세 문서: docs/ 폴더 참조 │
|
|
15
|
-
└─────────────────────────────────────────────────────────────┘
|
|
16
|
-
```
|
|
17
|
-
|
|
18
|
-
---
|
|
19
|
-
|
|
20
|
-
## ⛔ NEVER DO (절대 금지 - 예외 없음)
|
|
21
|
-
|
|
22
|
-
### Git 커밋 금지 사항
|
|
23
|
-
```
|
|
24
|
-
❌ "Generated with Claude Code" 포함 금지
|
|
25
|
-
❌ "🤖" 또는 AI 관련 이모지 포함 금지
|
|
26
|
-
❌ "Co-Authored-By:" 헤더 포함 금지
|
|
27
|
-
❌ AI/봇이 작성했다는 어떤 표시도 금지
|
|
28
|
-
❌ 커밋 메시지 여러 줄 작성 금지
|
|
29
|
-
❌ 커밋 메시지에 이모지 사용 금지
|
|
30
|
-
```
|
|
31
|
-
|
|
32
|
-
### Prisma 금지 사항
|
|
33
|
-
```
|
|
34
|
-
❌ prisma db push 자동 실행 금지
|
|
35
|
-
❌ prisma migrate 자동 실행 금지
|
|
36
|
-
❌ prisma generate 자동 실행 금지
|
|
37
|
-
❌ schema.prisma 임의 변경 금지 (요청된 것만)
|
|
38
|
-
```
|
|
5
|
+
## Instructions
|
|
39
6
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
❌ HTTPException 없이 에러 throw 금지
|
|
46
|
-
```
|
|
47
|
-
|
|
48
|
-
### 코드 검색 금지 사항
|
|
49
|
-
```
|
|
50
|
-
❌ grep, rg 등 기본 검색 도구 사용 금지
|
|
51
|
-
❌ find 명령어로 코드 검색 금지
|
|
52
|
-
✅ 코드베이스 검색 시 sgrep 사용 필수
|
|
53
|
-
```
|
|
54
|
-
|
|
55
|
-
### 코드 작성 규칙
|
|
56
|
-
```
|
|
57
|
-
✅ 모든 한글 텍스트는 UTF-8 인코딩 유지
|
|
58
|
-
✅ 코드 묶음 단위로 한글 주석 작성 (너무 세세하게 X)
|
|
59
|
-
✅ Prisma Multi-File 모든 요소에 한글 주석 필수
|
|
60
|
-
```
|
|
61
|
-
|
|
62
|
-
### Prisma Multi-File 구조 (필수)
|
|
63
|
-
```
|
|
64
|
-
prisma/
|
|
65
|
-
├── schema/
|
|
66
|
-
│ ├── +base.prisma # datasource, generator 설정
|
|
67
|
-
│ ├── +enum.prisma # 모든 enum 정의
|
|
68
|
-
│ ├── user.prisma # User 모델
|
|
69
|
-
│ ├── post.prisma # Post 모델
|
|
70
|
-
│ └── ... # 기타 모델별 파일
|
|
71
|
-
```
|
|
7
|
+
@../../commands/git.md
|
|
8
|
+
@docs/library/hono/index.md
|
|
9
|
+
@docs/library/prisma/index.md
|
|
10
|
+
@docs/library/zod/index.md
|
|
11
|
+
@docs/deployment/index.md
|
|
72
12
|
|
|
73
13
|
---
|
|
74
14
|
|
|
75
|
-
##
|
|
76
|
-
|
|
77
|
-
### 1. 작업 전: 관련 문서 읽기
|
|
78
|
-
```
|
|
79
|
-
API 작업 → docs/library/hono/ 읽기
|
|
80
|
-
DB 작업 → docs/library/prisma/ 읽기
|
|
81
|
-
검증 작업 → docs/library/zod/ 읽기
|
|
82
|
-
배포 작업 → docs/deployment/ 읽기
|
|
83
|
-
```
|
|
84
|
-
|
|
85
|
-
### 2. MCP 도구 적극 활용
|
|
86
|
-
```
|
|
87
|
-
코드베이스 검색 → sgrep 사용 (grep/rg 금지)
|
|
88
|
-
복잡한 분석/디버깅 → Sequential Thinking 사용
|
|
89
|
-
라이브러리 문서 → Context7 사용
|
|
90
|
-
```
|
|
91
|
-
**상세**: `docs/mcp/` 참고
|
|
92
|
-
|
|
93
|
-
### 3. 복잡한 작업 시: Gemini Review 실행
|
|
94
|
-
```
|
|
95
|
-
아키텍처 설계/변경 → gemini-review (architecture)
|
|
96
|
-
구현 계획 검증 → gemini-review (plan)
|
|
97
|
-
복잡한 코드 리뷰 → gemini-review (code)
|
|
98
|
-
```
|
|
99
|
-
|
|
100
|
-
**실행 조건**:
|
|
101
|
-
- 3개 이상 파일 수정하는 기능 구현
|
|
102
|
-
- 새로운 아키텍처 패턴 도입
|
|
103
|
-
- 보안 관련 코드 (인증, 권한, 암호화)
|
|
104
|
-
- 성능 크리티컬 코드
|
|
15
|
+
## STOP - 금지 사항
|
|
105
16
|
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
```
|
|
113
|
-
|
|
114
|
-
**커밋 형식**: `<prefix>: <설명>` (한 줄, 본문 없음)
|
|
115
|
-
|
|
116
|
-
**Prefix**: `feat` | `fix` | `refactor` | `style` | `docs` | `test` | `chore` | `perf` | `ci`
|
|
117
|
-
|
|
118
|
-
**예시**:
|
|
119
|
-
```bash
|
|
120
|
-
feat: 사용자 인증 API 추가
|
|
121
|
-
fix: JWT 토큰 검증 오류 수정
|
|
122
|
-
docs: API 문서 업데이트
|
|
123
|
-
```
|
|
17
|
+
| 분류 | 금지 항목 |
|
|
18
|
+
|------|----------|
|
|
19
|
+
| **Git** | `Generated with Claude Code`, `🤖`, `Co-Authored-By:`, 여러 줄 커밋, 이모지 |
|
|
20
|
+
| **Prisma** | `db push`, `migrate`, `generate` 자동 실행, schema 임의 변경 |
|
|
21
|
+
| **API** | handler 내부 수동 검증 (→ zValidator), 수동 인증 (→ middleware), 일반 Error throw (→ HTTPException) |
|
|
22
|
+
| **검색** | grep, rg, find (→ ast-grep 사용) |
|
|
124
23
|
|
|
125
24
|
---
|
|
126
25
|
|
|
127
|
-
##
|
|
26
|
+
## ALWAYS - 필수 사항
|
|
128
27
|
|
|
129
|
-
| 작업 |
|
|
130
|
-
|
|
131
|
-
|
|
|
132
|
-
|
|
|
133
|
-
|
|
|
134
|
-
|
|
|
135
|
-
|
|
|
136
|
-
|
|
|
137
|
-
| **배포** | `docs/deployment/` | 🟡 해당 시 |
|
|
28
|
+
| 작업 | 필수 |
|
|
29
|
+
|------|------|
|
|
30
|
+
| 작업 전 | 관련 docs 읽기 |
|
|
31
|
+
| 코드 검색 | ast-grep 사용 |
|
|
32
|
+
| 복잡한 분석 | Sequential Thinking MCP |
|
|
33
|
+
| 3+ 파일 수정 | gemini-review 실행 |
|
|
34
|
+
| 코드 작성 | UTF-8, 코드 묶음별 한글 주석 |
|
|
35
|
+
| Prisma | Multi-File 구조, 모든 요소 한글 주석 |
|
|
138
36
|
|
|
139
37
|
---
|
|
140
38
|
|
|
141
|
-
##
|
|
39
|
+
## Tech Stack
|
|
142
40
|
|
|
143
41
|
| 기술 | 버전 | 주의사항 |
|
|
144
42
|
|------|------|----------|
|
|
145
|
-
| Hono | 최신 | Web Standards 기반
|
|
43
|
+
| Hono | 최신 | Web Standards 기반 |
|
|
146
44
|
| TypeScript | 5.x | strict mode |
|
|
147
|
-
| Prisma | **7.x** | `prisma-client
|
|
148
|
-
| Zod | **4.x** | `z.email()`, `z.url()` (
|
|
149
|
-
| @hono/zod-validator | 최신 | Zod 검증 미들웨어 |
|
|
150
|
-
|
|
151
|
-
---
|
|
152
|
-
|
|
153
|
-
## 📁 Directory Structure
|
|
154
|
-
|
|
155
|
-
```
|
|
156
|
-
src/
|
|
157
|
-
├── index.ts # Entry point
|
|
158
|
-
├── routes/ # 라우트 모듈
|
|
159
|
-
│ ├── index.ts # 라우트 통합
|
|
160
|
-
│ ├── users.ts # /users 라우트
|
|
161
|
-
│ └── posts.ts # /posts 라우트
|
|
162
|
-
├── middleware/ # 미들웨어
|
|
163
|
-
│ ├── auth.ts # 인증 미들웨어
|
|
164
|
-
│ └── logger.ts # 로깅 미들웨어
|
|
165
|
-
├── validators/ # Zod 스키마
|
|
166
|
-
│ ├── user.ts # 사용자 스키마
|
|
167
|
-
│ └── post.ts # 게시글 스키마
|
|
168
|
-
├── services/ # 비즈니스 로직
|
|
169
|
-
│ └── user.service.ts # 사용자 서비스
|
|
170
|
-
├── database/ # DB 연결
|
|
171
|
-
│ └── prisma.ts # Prisma Client
|
|
172
|
-
├── types/ # 타입 정의
|
|
173
|
-
│ └── env.d.ts # 환경변수 타입
|
|
174
|
-
└── lib/ # 유틸리티
|
|
175
|
-
└── errors.ts # 커스텀 에러
|
|
176
|
-
```
|
|
45
|
+
| Prisma | **7.x** | `prisma-client`, output 필수 |
|
|
46
|
+
| Zod | **4.x** | `z.email()`, `z.url()` (v4 문법) |
|
|
177
47
|
|
|
178
48
|
---
|
|
179
49
|
|
|
180
|
-
##
|
|
181
|
-
|
|
182
|
-
### File Naming
|
|
183
|
-
- **kebab-case**: `user-service.ts`, `auth-middleware.ts`
|
|
184
|
-
- **라우트 파일**: `users.ts`, `posts.ts`
|
|
185
|
-
|
|
186
|
-
### TypeScript
|
|
187
|
-
- `const` 선언 사용 (function 대신)
|
|
188
|
-
- 명시적 return type
|
|
189
|
-
- `interface` (객체) / `type` (유니온)
|
|
190
|
-
- `any` 금지 → `unknown` 사용
|
|
50
|
+
## Quick Patterns
|
|
191
51
|
|
|
192
|
-
###
|
|
193
|
-
```typescript
|
|
194
|
-
// @/ → ./src/
|
|
195
|
-
import { prisma } from '@/database/prisma'
|
|
196
|
-
import { userSchema } from '@/validators/user'
|
|
197
|
-
```
|
|
52
|
+
### App + 에러 핸들러
|
|
198
53
|
|
|
199
|
-
**순서**: 외부 → 내부(@/) → 상대경로 → type imports
|
|
200
|
-
|
|
201
|
-
---
|
|
202
|
-
|
|
203
|
-
## 📝 Quick Patterns (복사용)
|
|
204
|
-
|
|
205
|
-
### App 설정
|
|
206
54
|
```typescript
|
|
207
55
|
import { Hono } from 'hono'
|
|
208
56
|
import { HTTPException } from 'hono/http-exception'
|
|
209
57
|
|
|
210
|
-
type Bindings = {
|
|
211
|
-
DATABASE_URL: string
|
|
212
|
-
JWT_SECRET: string
|
|
213
|
-
}
|
|
58
|
+
type Bindings = { DATABASE_URL: string; JWT_SECRET: string }
|
|
214
59
|
|
|
215
60
|
const app = new Hono<{ Bindings: Bindings }>()
|
|
216
61
|
|
|
217
|
-
// 글로벌 에러 핸들러
|
|
218
62
|
app.onError((err, c) => {
|
|
219
63
|
if (err instanceof HTTPException) {
|
|
220
64
|
return c.json({ error: err.message }, err.status)
|
|
@@ -223,172 +67,59 @@ app.onError((err, c) => {
|
|
|
223
67
|
return c.json({ error: 'Internal Server Error' }, 500)
|
|
224
68
|
})
|
|
225
69
|
|
|
226
|
-
|
|
227
|
-
app.notFound((c) => {
|
|
228
|
-
return c.json({ error: 'Not Found', path: c.req.path }, 404)
|
|
229
|
-
})
|
|
70
|
+
app.notFound((c) => c.json({ error: 'Not Found' }, 404))
|
|
230
71
|
|
|
231
72
|
export default app
|
|
232
73
|
```
|
|
233
74
|
|
|
234
|
-
###
|
|
235
|
-
```typescript
|
|
236
|
-
import { Hono } from 'hono'
|
|
237
|
-
import { zValidator } from '@hono/zod-validator'
|
|
238
|
-
import { z } from 'zod'
|
|
239
|
-
|
|
240
|
-
const app = new Hono()
|
|
241
|
-
|
|
242
|
-
// ✅ 올바른 패턴: zValidator 사용
|
|
243
|
-
const querySchema = z.object({
|
|
244
|
-
page: z.coerce.number().positive().optional(),
|
|
245
|
-
limit: z.coerce.number().max(100).optional(),
|
|
246
|
-
})
|
|
247
|
-
|
|
248
|
-
app.get('/users', zValidator('query', querySchema), (c) => {
|
|
249
|
-
const { page = 1, limit = 10 } = c.req.valid('query')
|
|
250
|
-
return c.json({ page, limit, users: [] })
|
|
251
|
-
})
|
|
252
|
-
```
|
|
75
|
+
### Zod 검증 (v4 문법)
|
|
253
76
|
|
|
254
|
-
### 라우트 + Zod 검증 (POST)
|
|
255
77
|
```typescript
|
|
256
78
|
import { zValidator } from '@hono/zod-validator'
|
|
257
79
|
import { z } from 'zod'
|
|
258
80
|
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
email: z.email(), // ✅ v4
|
|
81
|
+
const schema = z.object({
|
|
82
|
+
email: z.email(), // ✅ v4
|
|
262
83
|
name: z.string().min(1).trim(),
|
|
263
|
-
website: z.url().optional()
|
|
84
|
+
website: z.url().optional() // ✅ v4
|
|
264
85
|
})
|
|
265
86
|
|
|
266
|
-
app.post('/users', zValidator('json',
|
|
87
|
+
app.post('/users', zValidator('json', schema), (c) => {
|
|
267
88
|
const data = c.req.valid('json')
|
|
268
|
-
// prisma.user.create({ data })
|
|
269
89
|
return c.json({ user: data }, 201)
|
|
270
90
|
})
|
|
271
91
|
```
|
|
272
92
|
|
|
273
|
-
###
|
|
274
|
-
```typescript
|
|
275
|
-
// ❌ handler 내부에서 수동 검증 금지
|
|
276
|
-
app.post('/users', async (c) => {
|
|
277
|
-
const body = await c.req.json()
|
|
278
|
-
// ❌ 이렇게 하지 마세요!
|
|
279
|
-
if (!body.email) {
|
|
280
|
-
return c.json({ error: 'Email required' }, 400)
|
|
281
|
-
}
|
|
282
|
-
})
|
|
93
|
+
### Prisma Multi-File 구조
|
|
283
94
|
|
|
284
|
-
// ❌ 일반 Error throw 금지
|
|
285
|
-
app.get('/user/:id', async (c) => {
|
|
286
|
-
throw new Error('Not found') // ❌ HTTPException 사용해야 함
|
|
287
|
-
})
|
|
288
95
|
```
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
app.get('/users/:id', async (c) => {
|
|
295
|
-
const id = c.req.param('id')
|
|
296
|
-
const user = await prisma.user.findUnique({ where: { id } })
|
|
297
|
-
|
|
298
|
-
if (!user) {
|
|
299
|
-
throw new HTTPException(404, { message: 'User not found' })
|
|
300
|
-
}
|
|
301
|
-
|
|
302
|
-
return c.json({ user })
|
|
303
|
-
})
|
|
96
|
+
prisma/schema/
|
|
97
|
+
├── +base.prisma # datasource, generator
|
|
98
|
+
├── +enum.prisma # enum 정의
|
|
99
|
+
├── user.prisma # User 모델 (한글 주석 필수)
|
|
100
|
+
└── post.prisma # Post 모델
|
|
304
101
|
```
|
|
305
102
|
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
type Env = {
|
|
312
|
-
Variables: {
|
|
313
|
-
userId: string
|
|
314
|
-
}
|
|
103
|
+
```prisma
|
|
104
|
+
// +base.prisma
|
|
105
|
+
generator client {
|
|
106
|
+
provider = "prisma-client" // ✅ v7
|
|
107
|
+
output = "./generated/client" // ✅ 필수
|
|
315
108
|
}
|
|
316
|
-
|
|
317
|
-
export const authMiddleware = createMiddleware<Env>(async (c, next) => {
|
|
318
|
-
const token = c.req.header('Authorization')?.replace('Bearer ', '')
|
|
319
|
-
|
|
320
|
-
if (!token) {
|
|
321
|
-
throw new HTTPException(401, { message: 'Unauthorized' })
|
|
322
|
-
}
|
|
323
|
-
|
|
324
|
-
// JWT 검증 로직
|
|
325
|
-
const payload = verifyToken(token)
|
|
326
|
-
c.set('userId', payload.sub)
|
|
327
|
-
|
|
328
|
-
await next()
|
|
329
|
-
})
|
|
330
|
-
|
|
331
|
-
// 사용
|
|
332
|
-
app.get('/me', authMiddleware, (c) => {
|
|
333
|
-
const userId = c.get('userId')
|
|
334
|
-
return c.json({ userId })
|
|
335
|
-
})
|
|
336
109
|
```
|
|
337
110
|
|
|
338
|
-
|
|
339
|
-
```typescript
|
|
340
|
-
import { z } from 'zod'
|
|
111
|
+
---
|
|
341
112
|
|
|
342
|
-
|
|
343
|
-
email: z.email(), // ✅ v4
|
|
344
|
-
name: z.string().min(1).trim(),
|
|
345
|
-
website: z.url().optional(), // ✅ v4
|
|
346
|
-
age: z.number().min(0),
|
|
347
|
-
})
|
|
113
|
+
## 문서 구조
|
|
348
114
|
|
|
349
|
-
// 커스텀 에러 핸들링
|
|
350
|
-
app.post(
|
|
351
|
-
'/users',
|
|
352
|
-
zValidator('json', schema, (result, c) => {
|
|
353
|
-
if (!result.success) {
|
|
354
|
-
return c.json({ errors: result.error.flatten() }, 400)
|
|
355
|
-
}
|
|
356
|
-
}),
|
|
357
|
-
(c) => {
|
|
358
|
-
const data = c.req.valid('json')
|
|
359
|
-
return c.json({ user: data }, 201)
|
|
360
|
-
}
|
|
361
|
-
)
|
|
362
115
|
```
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
})
|
|
373
|
-
|
|
374
|
-
export type AppType = typeof app
|
|
375
|
-
|
|
376
|
-
// client.ts
|
|
377
|
-
import { hc } from 'hono/client'
|
|
378
|
-
import type { AppType } from './server'
|
|
379
|
-
|
|
380
|
-
const client = hc<AppType>('http://localhost:8787/')
|
|
381
|
-
|
|
382
|
-
// Type-safe API 호출
|
|
383
|
-
const res = await client.users.$get()
|
|
384
|
-
const data = await res.json() // { users: [] }
|
|
116
|
+
docs/
|
|
117
|
+
├── library/
|
|
118
|
+
│ ├── hono/ # 라우팅, 미들웨어, 검증, RPC
|
|
119
|
+
│ ├── prisma/ # CRUD, 관계, D1 연동
|
|
120
|
+
│ ├── zod/ # v4 문법, 검증 패턴
|
|
121
|
+
│ ├── ai-sdk/ # LLM 통합 (streaming, tools)
|
|
122
|
+
│ └── pino/ # 로깅
|
|
123
|
+
├── deployment/ # Docker, Railway, Vercel, Cloudflare
|
|
124
|
+
└── architecture/ # 아키텍처 패턴
|
|
385
125
|
```
|
|
386
|
-
|
|
387
|
-
---
|
|
388
|
-
|
|
389
|
-
## 🔗 Quick Links
|
|
390
|
-
|
|
391
|
-
- [Hono 가이드](./docs/library/hono/index.md)
|
|
392
|
-
- [Git 규칙](./docs/git/git.md)
|
|
393
|
-
- [MCP 가이드](./docs/mcp/index.md)
|
|
394
|
-
- [배포 가이드](./docs/deployment/index.md)
|