@kood/claude-code 0.1.0

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.
Files changed (78) hide show
  1. package/dist/index.d.ts +2 -0
  2. package/dist/index.js +297 -0
  3. package/package.json +47 -0
  4. package/templates/hono/CLAUDE.md +376 -0
  5. package/templates/hono/docs/deployment/cloudflare.md +328 -0
  6. package/templates/hono/docs/deployment/index.md +291 -0
  7. package/templates/hono/docs/git/index.md +180 -0
  8. package/templates/hono/docs/library/hono/error-handling.md +400 -0
  9. package/templates/hono/docs/library/hono/index.md +241 -0
  10. package/templates/hono/docs/library/hono/middleware.md +334 -0
  11. package/templates/hono/docs/library/hono/rpc.md +454 -0
  12. package/templates/hono/docs/library/hono/validation.md +328 -0
  13. package/templates/hono/docs/library/prisma/index.md +427 -0
  14. package/templates/hono/docs/library/zod/index.md +413 -0
  15. package/templates/hono/docs/mcp/context7.md +106 -0
  16. package/templates/hono/docs/mcp/index.md +94 -0
  17. package/templates/hono/docs/mcp/sequential-thinking.md +101 -0
  18. package/templates/hono/docs/mcp/sgrep.md +105 -0
  19. package/templates/hono/docs/skills/gemini-review/SKILL.md +220 -0
  20. package/templates/hono/docs/skills/gemini-review/references/checklists.md +136 -0
  21. package/templates/hono/docs/skills/gemini-review/references/prompt-templates.md +303 -0
  22. package/templates/tanstack-start/CLAUDE.md +279 -0
  23. package/templates/tanstack-start/docs/architecture/architecture.md +547 -0
  24. package/templates/tanstack-start/docs/deployment/cloudflare.md +346 -0
  25. package/templates/tanstack-start/docs/deployment/index.md +102 -0
  26. package/templates/tanstack-start/docs/deployment/nitro.md +211 -0
  27. package/templates/tanstack-start/docs/deployment/railway.md +364 -0
  28. package/templates/tanstack-start/docs/deployment/vercel.md +287 -0
  29. package/templates/tanstack-start/docs/design/accessibility.md +433 -0
  30. package/templates/tanstack-start/docs/design/color.md +235 -0
  31. package/templates/tanstack-start/docs/design/components.md +409 -0
  32. package/templates/tanstack-start/docs/design/index.md +107 -0
  33. package/templates/tanstack-start/docs/design/safe-area.md +317 -0
  34. package/templates/tanstack-start/docs/design/spacing.md +341 -0
  35. package/templates/tanstack-start/docs/design/tailwind-setup.md +470 -0
  36. package/templates/tanstack-start/docs/design/typography.md +324 -0
  37. package/templates/tanstack-start/docs/git/index.md +203 -0
  38. package/templates/tanstack-start/docs/guides/best-practices.md +753 -0
  39. package/templates/tanstack-start/docs/guides/getting-started.md +304 -0
  40. package/templates/tanstack-start/docs/guides/husky-lint-staged.md +303 -0
  41. package/templates/tanstack-start/docs/guides/prettier.md +189 -0
  42. package/templates/tanstack-start/docs/guides/project-templates.md +710 -0
  43. package/templates/tanstack-start/docs/library/better-auth/2fa.md +136 -0
  44. package/templates/tanstack-start/docs/library/better-auth/advanced.md +138 -0
  45. package/templates/tanstack-start/docs/library/better-auth/index.md +83 -0
  46. package/templates/tanstack-start/docs/library/better-auth/plugins.md +111 -0
  47. package/templates/tanstack-start/docs/library/better-auth/session.md +127 -0
  48. package/templates/tanstack-start/docs/library/better-auth/setup.md +123 -0
  49. package/templates/tanstack-start/docs/library/prisma/crud.md +218 -0
  50. package/templates/tanstack-start/docs/library/prisma/index.md +165 -0
  51. package/templates/tanstack-start/docs/library/prisma/relations.md +191 -0
  52. package/templates/tanstack-start/docs/library/prisma/schema.md +177 -0
  53. package/templates/tanstack-start/docs/library/prisma/setup.md +156 -0
  54. package/templates/tanstack-start/docs/library/prisma/transactions.md +140 -0
  55. package/templates/tanstack-start/docs/library/tanstack-query/index.md +146 -0
  56. package/templates/tanstack-start/docs/library/tanstack-query/invalidation.md +146 -0
  57. package/templates/tanstack-start/docs/library/tanstack-query/optimistic-updates.md +196 -0
  58. package/templates/tanstack-start/docs/library/tanstack-query/setup.md +110 -0
  59. package/templates/tanstack-start/docs/library/tanstack-query/use-mutation.md +170 -0
  60. package/templates/tanstack-start/docs/library/tanstack-query/use-query.md +173 -0
  61. package/templates/tanstack-start/docs/library/tanstack-start/auth-patterns.md +171 -0
  62. package/templates/tanstack-start/docs/library/tanstack-start/index.md +114 -0
  63. package/templates/tanstack-start/docs/library/tanstack-start/middleware.md +142 -0
  64. package/templates/tanstack-start/docs/library/tanstack-start/routing.md +163 -0
  65. package/templates/tanstack-start/docs/library/tanstack-start/server-functions.md +128 -0
  66. package/templates/tanstack-start/docs/library/tanstack-start/setup.md +85 -0
  67. package/templates/tanstack-start/docs/library/zod/basic-types.md +186 -0
  68. package/templates/tanstack-start/docs/library/zod/complex-types.md +204 -0
  69. package/templates/tanstack-start/docs/library/zod/index.md +186 -0
  70. package/templates/tanstack-start/docs/library/zod/transforms.md +174 -0
  71. package/templates/tanstack-start/docs/library/zod/validation.md +208 -0
  72. package/templates/tanstack-start/docs/mcp/context7.md +204 -0
  73. package/templates/tanstack-start/docs/mcp/index.md +116 -0
  74. package/templates/tanstack-start/docs/mcp/sequential-thinking.md +180 -0
  75. package/templates/tanstack-start/docs/mcp/sgrep.md +174 -0
  76. package/templates/tanstack-start/docs/skills/gemini-review/SKILL.md +220 -0
  77. package/templates/tanstack-start/docs/skills/gemini-review/references/checklists.md +150 -0
  78. package/templates/tanstack-start/docs/skills/gemini-review/references/prompt-templates.md +293 -0
@@ -0,0 +1,328 @@
1
+ # Hono + Zod 검증
2
+
3
+ > @hono/zod-validator를 사용한 타입 안전 요청 검증
4
+
5
+ ---
6
+
7
+ ## 설치
8
+
9
+ ```bash
10
+ # Zod
11
+ npm install zod
12
+
13
+ # Zod Validator Middleware
14
+ npm install @hono/zod-validator
15
+ ```
16
+
17
+ ---
18
+
19
+ ## 기본 사용법
20
+
21
+ ### JSON Body 검증
22
+
23
+ ```typescript
24
+ import { Hono } from 'hono'
25
+ import { zValidator } from '@hono/zod-validator'
26
+ import { z } from 'zod'
27
+
28
+ const app = new Hono()
29
+
30
+ // ✅ Zod v4 문법
31
+ const createUserSchema = z.object({
32
+ email: z.email(), // ✅ v4
33
+ name: z.string().min(1).trim(),
34
+ website: z.url().optional(), // ✅ v4
35
+ })
36
+
37
+ app.post('/users', zValidator('json', createUserSchema), (c) => {
38
+ const data = c.req.valid('json') // 타입 추론됨
39
+ return c.json({ user: data }, 201)
40
+ })
41
+ ```
42
+
43
+ ### Query Parameter 검증
44
+
45
+ ```typescript
46
+ const searchSchema = z.object({
47
+ q: z.string(),
48
+ page: z.coerce.number().positive().optional(),
49
+ limit: z.coerce.number().max(100).optional(),
50
+ })
51
+
52
+ app.get('/search', zValidator('query', searchSchema), (c) => {
53
+ const { q, page = 1, limit = 10 } = c.req.valid('query')
54
+ return c.json({ query: q, page, limit, results: [] })
55
+ })
56
+ ```
57
+
58
+ ### Path Parameter 검증
59
+
60
+ ```typescript
61
+ const paramSchema = z.object({
62
+ id: z.string().uuid(),
63
+ })
64
+
65
+ app.get('/users/:id', zValidator('param', paramSchema), (c) => {
66
+ const { id } = c.req.valid('param')
67
+ return c.json({ id })
68
+ })
69
+ ```
70
+
71
+ ### Header 검증
72
+
73
+ ```typescript
74
+ // ⚠️ 헤더 이름은 소문자로
75
+ const headerSchema = z.object({
76
+ 'x-api-key': z.string().uuid(),
77
+ 'x-request-id': z.string().optional(),
78
+ })
79
+
80
+ app.get('/api/protected', zValidator('header', headerSchema), (c) => {
81
+ const headers = c.req.valid('header')
82
+ return c.json({ apiKey: headers['x-api-key'] })
83
+ })
84
+ ```
85
+
86
+ ### Form Data 검증
87
+
88
+ ```typescript
89
+ const formSchema = z.object({
90
+ title: z.string().min(1).max(100),
91
+ content: z.string().min(10),
92
+ })
93
+
94
+ app.post('/posts', zValidator('form', formSchema), (c) => {
95
+ const data = c.req.valid('form')
96
+ return c.json({ post: data }, 201)
97
+ })
98
+ ```
99
+
100
+ ---
101
+
102
+ ## 복합 검증
103
+
104
+ ### 여러 소스 검증
105
+
106
+ ```typescript
107
+ const postSchema = z.object({
108
+ title: z.string().min(1).max(100),
109
+ body: z.string().min(10),
110
+ })
111
+
112
+ app.post(
113
+ '/posts/:id',
114
+ zValidator('param', z.object({ id: z.string().uuid() })),
115
+ zValidator('query', z.object({ draft: z.coerce.boolean().optional() })),
116
+ zValidator('json', postSchema),
117
+ (c) => {
118
+ const { id } = c.req.valid('param')
119
+ const { draft } = c.req.valid('query')
120
+ const postData = c.req.valid('json')
121
+
122
+ return c.json({ id, draft: draft ?? false, ...postData })
123
+ }
124
+ )
125
+ ```
126
+
127
+ ---
128
+
129
+ ## 커스텀 에러 처리
130
+
131
+ ### 기본 에러 응답
132
+
133
+ ```typescript
134
+ app.post(
135
+ '/users',
136
+ zValidator('json', createUserSchema, (result, c) => {
137
+ if (!result.success) {
138
+ return c.json(
139
+ {
140
+ error: 'Validation failed',
141
+ issues: result.error.flatten(),
142
+ },
143
+ 400
144
+ )
145
+ }
146
+ }),
147
+ (c) => {
148
+ const data = c.req.valid('json')
149
+ return c.json({ user: data }, 201)
150
+ }
151
+ )
152
+ ```
153
+
154
+ ### 상세 에러 응답
155
+
156
+ ```typescript
157
+ app.post(
158
+ '/users',
159
+ zValidator('json', createUserSchema, (result, c) => {
160
+ if (!result.success) {
161
+ const errors = result.error.flatten()
162
+ return c.json(
163
+ {
164
+ error: 'Validation failed',
165
+ fieldErrors: errors.fieldErrors,
166
+ formErrors: errors.formErrors,
167
+ },
168
+ 400
169
+ )
170
+ }
171
+ }),
172
+ (c) => {
173
+ const data = c.req.valid('json')
174
+ return c.json({ user: data }, 201)
175
+ }
176
+ )
177
+ ```
178
+
179
+ ---
180
+
181
+ ## 재사용 가능한 스키마
182
+
183
+ ### validators/user.ts
184
+
185
+ ```typescript
186
+ import { z } from 'zod'
187
+
188
+ // ✅ Zod v4 문법
189
+ export const createUserSchema = z.object({
190
+ email: z.email(),
191
+ name: z.string().min(1).max(100).trim(),
192
+ password: z.string().min(8),
193
+ })
194
+
195
+ export const updateUserSchema = createUserSchema.partial()
196
+
197
+ export const userIdSchema = z.object({
198
+ id: z.string().uuid(),
199
+ })
200
+
201
+ export type CreateUserInput = z.infer<typeof createUserSchema>
202
+ export type UpdateUserInput = z.infer<typeof updateUserSchema>
203
+ ```
204
+
205
+ ### routes/users.ts
206
+
207
+ ```typescript
208
+ import { Hono } from 'hono'
209
+ import { zValidator } from '@hono/zod-validator'
210
+ import {
211
+ createUserSchema,
212
+ updateUserSchema,
213
+ userIdSchema,
214
+ } from '../validators/user'
215
+
216
+ const users = new Hono()
217
+
218
+ users.post('/', zValidator('json', createUserSchema), (c) => {
219
+ const data = c.req.valid('json')
220
+ return c.json({ user: data }, 201)
221
+ })
222
+
223
+ users.put(
224
+ '/:id',
225
+ zValidator('param', userIdSchema),
226
+ zValidator('json', updateUserSchema),
227
+ (c) => {
228
+ const { id } = c.req.valid('param')
229
+ const data = c.req.valid('json')
230
+ return c.json({ id, ...data })
231
+ }
232
+ )
233
+
234
+ export default users
235
+ ```
236
+
237
+ ---
238
+
239
+ ## 고급 스키마 패턴
240
+
241
+ ### Coerce (타입 변환)
242
+
243
+ ```typescript
244
+ const querySchema = z.object({
245
+ // string → number 변환
246
+ page: z.coerce.number().positive(),
247
+ // string → boolean 변환
248
+ active: z.coerce.boolean(),
249
+ // string → Date 변환
250
+ since: z.coerce.date(),
251
+ })
252
+ ```
253
+
254
+ ### Enum
255
+
256
+ ```typescript
257
+ const statusSchema = z.object({
258
+ status: z.enum(['pending', 'active', 'completed']),
259
+ })
260
+ ```
261
+
262
+ ### Array
263
+
264
+ ```typescript
265
+ const tagsSchema = z.object({
266
+ tags: z.array(z.string()).min(1).max(10),
267
+ })
268
+ ```
269
+
270
+ ### Union
271
+
272
+ ```typescript
273
+ const idSchema = z.union([
274
+ z.string().uuid(),
275
+ z.coerce.number().positive(),
276
+ ])
277
+ ```
278
+
279
+ ### Refinement
280
+
281
+ ```typescript
282
+ const passwordSchema = z.object({
283
+ password: z.string().min(8),
284
+ confirmPassword: z.string(),
285
+ }).refine((data) => data.password === data.confirmPassword, {
286
+ message: 'Passwords do not match',
287
+ path: ['confirmPassword'],
288
+ })
289
+ ```
290
+
291
+ ### Transform
292
+
293
+ ```typescript
294
+ const userSchema = z.object({
295
+ email: z.email().transform((email) => email.toLowerCase()),
296
+ name: z.string().transform((name) => name.trim()),
297
+ })
298
+ ```
299
+
300
+ ---
301
+
302
+ ## Standard Schema Validator
303
+
304
+ Zod 외에도 다양한 검증 라이브러리 지원:
305
+
306
+ ```typescript
307
+ import { sValidator } from '@hono/standard-validator'
308
+ import { z } from 'zod'
309
+
310
+ const schema = z.object({
311
+ name: z.string(),
312
+ age: z.number(),
313
+ })
314
+
315
+ app.post('/author', sValidator('json', schema), (c) => {
316
+ const data = c.req.valid('json')
317
+ return c.json({ success: true, message: `${data.name} is ${data.age}` })
318
+ })
319
+ ```
320
+
321
+ ---
322
+
323
+ ## 관련 문서
324
+
325
+ - [기본 사용법](./index.md)
326
+ - [미들웨어](./middleware.md)
327
+ - [에러 처리](./error-handling.md)
328
+ - [Zod 가이드](../zod/index.md)