create-sonamu 0.0.1 → 0.0.2

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 (71) hide show
  1. package/README.md +365 -2
  2. package/index.js +632 -0
  3. package/package.json +30 -20
  4. package/template/src/README.md +274 -0
  5. package/template/src/packages/api/.swcrc +18 -0
  6. package/template/src/packages/api/custom-sequencer.ts +23 -0
  7. package/template/src/packages/api/database/docker-compose.yml +19 -0
  8. package/template/src/packages/api/database/fixtures/init.sh +15 -0
  9. package/template/src/packages/api/database/scripts/dump.sh +62 -0
  10. package/template/src/packages/api/database/scripts/seed.sh +60 -0
  11. package/template/src/packages/api/package.json +55 -0
  12. package/template/src/packages/api/src/application/.gitkeep +1 -0
  13. package/template/src/packages/api/src/i18n/en.ts +59 -0
  14. package/template/src/packages/api/src/i18n/ko.ts +57 -0
  15. package/template/src/packages/api/src/index.ts +6 -0
  16. package/template/src/packages/api/src/migrations/.gitkeep +1 -0
  17. package/template/src/packages/api/src/sonamu.config.ts +162 -0
  18. package/template/src/packages/api/src/testing/fixture.ts +6 -0
  19. package/template/src/packages/api/src/testing/global.ts +6 -0
  20. package/template/src/packages/api/src/testing/setup-mocks.ts +44 -0
  21. package/template/src/packages/api/src/typings/fastify.d.ts +7 -0
  22. package/template/src/packages/api/src/typings/sonamu.d.ts +19 -0
  23. package/template/src/packages/api/src/utils/subset-loaders.ts +11 -0
  24. package/template/src/packages/api/tsconfig.json +60 -0
  25. package/template/src/packages/api/tsconfig.schemas.json +5 -0
  26. package/template/src/packages/api/tsconfig.types.json +5 -0
  27. package/template/src/packages/api/vitest.config.ts +36 -0
  28. package/template/src/packages/web/.sonamu.env +2 -0
  29. package/template/src/{web → packages/web}/index.html +3 -3
  30. package/template/src/packages/web/package.json +49 -0
  31. package/template/src/packages/web/src/App.tsx +17 -0
  32. package/template/src/packages/web/src/admin-common/ApiLogViewer.tsx +285 -0
  33. package/template/src/packages/web/src/admin-common/CommonModal.tsx +91 -0
  34. package/template/src/packages/web/src/contexts/sonamu-provider.tsx +41 -0
  35. package/template/src/packages/web/src/entry-client.tsx +72 -0
  36. package/template/src/packages/web/src/entry-server.generated.tsx +58 -0
  37. package/template/src/packages/web/src/i18n/en.ts +63 -0
  38. package/template/src/packages/web/src/i18n/ko.ts +61 -0
  39. package/template/src/packages/web/src/routeTree.gen.ts +27 -0
  40. package/template/src/packages/web/src/routes/__root.tsx +44 -0
  41. package/template/src/packages/web/src/routes/index.tsx +14 -0
  42. package/template/src/packages/web/src/styles/tailwind.css +5 -0
  43. package/template/src/packages/web/src/vite-env.d.ts +2 -0
  44. package/template/src/packages/web/tailwind.config.ts +8 -0
  45. package/template/src/{web → packages/web}/tsconfig.json +5 -3
  46. package/template/src/packages/web/vite.config.ts +51 -0
  47. package/template/src/api/README.md +0 -3
  48. package/template/src/api/database/docker-compose.yml +0 -17
  49. package/template/src/api/package.json +0 -39
  50. package/template/src/api/sonamu.config.json +0 -11
  51. package/template/src/api/src/configs/db.ts +0 -25
  52. package/template/src/api/src/index.ts +0 -36
  53. package/template/src/api/src/testing/bootstrap.ts +0 -20
  54. package/template/src/api/src/testing/fixture.ts +0 -18
  55. package/template/src/api/src/testing/global.ts +0 -7
  56. package/template/src/api/src/typings/sonamu.d.ts +0 -5
  57. package/template/src/api/tsconfig.json +0 -115
  58. package/template/src/api/vite.config.mts +0 -15
  59. package/template/src/web/package.json +0 -40
  60. package/template/src/web/public/vite.svg +0 -1
  61. package/template/src/web/src/App.css +0 -34
  62. package/template/src/web/src/App.tsx +0 -15
  63. package/template/src/web/src/assets/react.svg +0 -1
  64. package/template/src/web/src/index.css +0 -76
  65. package/template/src/web/src/main.tsx +0 -30
  66. package/template/src/web/src/pages/index.tsx +0 -11
  67. package/template/src/web/src/vite-env.d.ts +0 -1
  68. package/template/src/web/vite.config.ts +0 -20
  69. /package/template/src/{web/src/services → packages/api/database/dumps}/.gitkeep +0 -0
  70. /package/template/src/{api/database/scripts/init.sql → packages/web/src/services/.gitkeep} +0 -0
  71. /package/template/src/{web → packages/web}/tsconfig.node.json +0 -0
package/README.md CHANGED
@@ -1,3 +1,366 @@
1
- # create-test
1
+ # 🌲 create-sonamu
2
2
 
3
- https://www.npmjs.com/package/@nakkim/create-test
3
+ > Sonamu 프로젝트를 30초 만에 시작하세요.
4
+
5
+ [![npm version](https://img.shields.io/npm/v/create-sonamu.svg)](https://www.npmjs.com/package/create-sonamu)
6
+ [![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](https://opensource.org/licenses/MIT)
7
+
8
+ Sonamu는 **Entity-driven 풀스택 TypeScript 프레임워크**입니다. 엔티티를 정의하면 타입, API, 프론트엔드 서비스 코드가 자동으로 생성됩니다.
9
+
10
+ ---
11
+
12
+ ## 주요 특징
13
+
14
+ - **즉시 시작** - 프로젝트 생성부터 개발 서버 실행까지 1분
15
+ - **코드 자동 생성** - 엔티티 정의 → 타입, API, 서비스 코드 자동 생성
16
+ - **타입 안전성** - Zod 스키마 기반 End-to-End 타입 보장
17
+ - **HMR 지원** - 코드 변경 시 서버 재시작 없이 즉시 반영
18
+ - **SSR 지원** - React Server-Side Rendering 기본 탑재
19
+ - **PostgreSQL** - Docker로 간편한 데이터베이스 설정
20
+ - **Sonamu UI** - 브라우저에서 엔티티 관리 및 마이그레이션
21
+ - **Modern Stack** - TanStack Router, React Query, Tailwind CSS
22
+
23
+ ---
24
+
25
+ ## 빠른 시작
26
+
27
+ ### 대화형 모드
28
+
29
+ ```bash
30
+ pnpm create sonamu
31
+ ```
32
+
33
+ ```
34
+ ? Project name: my_app
35
+ ? Would you like to set up pnpm? Yes
36
+ ? Would you like to set up a database using Docker? Yes
37
+ ? Enter the Docker project name: my-app-container
38
+ ? Enter the database user: postgres
39
+ ? Enter the container name: my-app-pg
40
+ ? Enter the database name: my-app
41
+ ? Enter the database password: ****
42
+ ```
43
+
44
+ > **프로젝트명 규칙**
45
+ > - 공백(space) 사용 불가
46
+ > - 하이픈(`-`) 사용 불가 (PostgreSQL DB 이름, 환경변수 호환성)
47
+ > - 언더스코어(`_`) 권장 (예: `my_project`, `test_app`)
48
+
49
+ ### CLI 옵션 모드
50
+
51
+ ```bash
52
+ # 프로젝트명만 지정 (언더스코어 사용)
53
+ pnpm create sonamu my_project
54
+
55
+ # 모든 질문을 기본값으로 자동 응답
56
+ pnpm create sonamu my_project --yes
57
+
58
+ # pnpm/docker 설정 여부를 명시적으로 지정
59
+ pnpm create sonamu my_app --pnpm y --docker y
60
+
61
+ # pnpm만 자동 진행 (docker는 프롬프트로 물어봄)
62
+ pnpm create sonamu my_app --pnpm y
63
+
64
+ # docker만 자동 진행 (pnpm은 프롬프트로 물어봄, DB 옵션은 기본값)
65
+ pnpm create sonamu my_app --docker y
66
+
67
+ # pnpm 설치 스킵
68
+ pnpm create sonamu my_app --pnpm n
69
+ # 또는
70
+ pnpm create sonamu my_app --skip-pnpm
71
+
72
+ # Docker 설정 스킵
73
+ pnpm create sonamu my_app --docker n
74
+ # 또는
75
+ pnpm create sonamu my_app --skip-docker
76
+
77
+ # 완전한 비대화형 모드 (모든 옵션 지정)
78
+ pnpm create sonamu my_app \
79
+ --pnpm y \
80
+ --docker y \
81
+ --db-user=postgres \
82
+ --db-password=1234 \
83
+ --db-name=myapp \
84
+ --container-name=myapp-pg \
85
+ --docker-project=myapp-docker
86
+
87
+ # DB 옵션만 지정 (pnpm/docker 설정은 프롬프트로 물어봄)
88
+ pnpm create sonamu my_app \
89
+ --db-name=myapp \
90
+ --db-password=1234
91
+ ```
92
+
93
+ #### 사용 가능한 옵션
94
+
95
+ | 옵션 | 설명 | 기본값 |
96
+ | ------------------ | -------------------------------- | ---------------------- |
97
+ | `--yes`, `-y` | 모든 질문에 기본값으로 자동 응답 | - |
98
+ | `--pnpm` | pnpm 설치 여부 (`y`/`n`) | (프롬프트로 질문) |
99
+ | `--docker` | Docker DB 설정 여부 (`y`/`n`) | (프롬프트로 질문) |
100
+ | `--skip-pnpm` | pnpm 설치 건너뛰기 (`--pnpm n`과 동일) | false |
101
+ | `--skip-docker` | Docker DB 설정 건너뛰기 (`--docker n`과 동일) | false |
102
+ | `--db-user` | 데이터베이스 사용자 | postgres |
103
+ | `--db-password` | 데이터베이스 비밀번호 | 1234 |
104
+ | `--db-name` | 데이터베이스 이름 | {프로젝트명} |
105
+ | `--container-name` | Docker 컨테이너 이름 | {프로젝트명}-container |
106
+ | `--docker-project`, `--docker-pj-name` | Docker Compose 프로젝트명 | {프로젝트명}-docker |
107
+
108
+ > **참고**: `--pnpm y`, `--docker y`에서 `y`는 `yes`, `true`, `1`로도 지정할 수 있습니다. 마찬가지로 `n`은 `no`, `false`, `0`으로도 지정할 수 있습니다.
109
+
110
+ ### 실행하기
111
+
112
+ ```bash
113
+ # 1. 데이터베이스 시작
114
+ cd my_app/packages/api
115
+ pnpm docker:up
116
+
117
+ # 2. API 서버 시작 (Sonamu UI 포함)
118
+ pnpm dev
119
+
120
+ # 3. Web 서버 시작 (새 터미널)
121
+ cd my_app/packages/web
122
+ pnpm dev
123
+ ```
124
+
125
+ 🎉 **완료!**
126
+
127
+ - API: http://localhost:1028
128
+ - Sonamu UI: http://localhost:1028/sonamu-ui (엔티티 관리)
129
+ - Web: http://localhost:3028
130
+
131
+ ---
132
+
133
+ ## 📁 생성되는 프로젝트 구조
134
+
135
+ ```
136
+ ├── packages/
137
+ │ ├── api/ # 백엔드 (Sonamu based on Fastify)
138
+ │ │ ├── src/
139
+ │ │ │ ├── application/ # 엔티티, 모델, 타입 (Entity 추가 후 생성)
140
+ │ │ │ ├── i18n/ # 다국어 지원 (ko, en)
141
+ │ │ │ ├── testing/ # 테스트 유틸리티
142
+ │ │ │ ├── index.ts # 서버 엔트리포인트
143
+ │ │ │ └── sonamu.config.ts # Sonamu 설정
144
+ │ │ ├── database/
145
+ │ │ │ ├── docker-compose.yml
146
+ │ │ │ ├── fixtures/ # DB 초기화 스크립트
147
+ │ │ │ └── scripts/ # dump, seed 스크립트
148
+ │ │ └── vitest.config.ts # 테스트 설정
149
+ │ │
150
+ │ └── web/ # 프론트엔드 (React + Vite + SSR)
151
+ │ └── src/
152
+ │ ├── routes/ # TanStack Router (파일 기반 라우팅)
153
+ │ ├── services/ # API 클라이언트 (Entity 추가 후 생성)
154
+ │ ├── i18n/ # 다국어 지원
155
+ │ ├── contexts/ # React Context (Sonamu Provider)
156
+ │ ├── admin-common/ # 공통 컴포넌트 (ApiLogViewer 등)
157
+ │ ├── entry-client.tsx # 클라이언트 엔트리
158
+ │ └── entry-server.generated.tsx # SSR 엔트리
159
+ └── pnpm-workspace.yaml # pnpm workspace 설정
160
+ ```
161
+
162
+ ---
163
+
164
+ ## 포트 구성
165
+
166
+ > 여러 프로젝트를 동시에 실행할 수 있습니다.
167
+
168
+ | 서비스 | 포트 | URL |
169
+ | -------------- | ------------------ | -------------------------------- |
170
+ | **API 서버** | `BASE_PORT` (1028) | http://localhost:1028 |
171
+ | **Sonamu UI** | - | http://localhost:1028/sonamu-ui |
172
+ | **Web 개발** | `BASE_PORT + 2000` (3028) | http://localhost:3028 |
173
+ | **PostgreSQL** | 5432 | - |
174
+
175
+ **참고**:
176
+ - Sonamu UI는 API 서버에 통합되어 있어 별도 실행이 필요 없습니다
177
+ - Web은 개발 중에는 Vite dev 서버(3028)로, 프로덕션에서는 빌드 후 API 서버에서 서빙됩니다
178
+
179
+ ---
180
+
181
+ ## 📜 스크립트 레퍼런스
182
+
183
+ ### API (`api/`)
184
+
185
+ | 명령어 | 설명 |
186
+ | ---------------- | ----------------------------------------- |
187
+ | `pnpm dev` | 개발 서버 시작 (HMR, Sonamu UI 포함) |
188
+ | `pnpm build` | 프로덕션 빌드 |
189
+ | `pnpm start` | 프로덕션 서버 실행 |
190
+ | `pnpm test` | 테스트 실행 |
191
+ | `pnpm db:up` | Docker 데이터베이스 시작 |
192
+ | `pnpm db:down` | Docker 데이터베이스 중지 |
193
+ | `pnpm db:reset` | 데이터베이스 초기화 (볼륨 삭제 후 재시작) |
194
+ | `pnpm dump` | 테스트 DB → 덤프 파일 생성 |
195
+ | `pnpm seed` | 덤프 파일 → fixture DB 적용 |
196
+
197
+ ### Web (`web/`)
198
+
199
+ | 명령어 | 설명 |
200
+ | -------------- | ----------------------------- |
201
+ | `pnpm dev` | 개발 서버 시작 (Vite) |
202
+ | `pnpm build` | 프로덕션 빌드 (Client + SSR) |
203
+ | `pnpm preview` | 빌드 결과 미리보기 |
204
+
205
+ **참고**: `pnpm build`는 클라이언트와 SSR 서버를 모두 빌드합니다. 빌드 결과는 `api/public/web`과 `api/dist/ssr`에 복사됩니다.
206
+
207
+ ---
208
+
209
+ ## 🔄 개발 워크플로우
210
+
211
+ ### 1. 엔티티 생성
212
+
213
+ API 서버를 실행한 상태에서 http://localhost:1028/sonamu-ui 접속 → **Entities** 탭 → **+ Entity** 클릭
214
+
215
+ ### 2. 자동 생성되는 파일들
216
+
217
+ **주의**: 프로젝트를 처음 생성했을 때는 Entity가 없으므로 이 파일들이 생성되지 않습니다.
218
+ 첫 번째 Entity를 추가하면 다음 파일들이 자동으로 생성됩니다:
219
+
220
+ ```
221
+ api/src/application/
222
+ ├── user/
223
+ │ ├── user.entity.json # 엔티티 정의 (SSoT)
224
+ │ ├── user.types.ts # Zod 스키마 & 타입
225
+ │ └── user.model.ts # 비즈니스 로직
226
+ ├── sonamu.generated.ts # 모든 Entity의 공통 타입 (자동 생성)
227
+ └── sonamu.generated.sso.ts # 서브셋 쿼리 (자동 생성)
228
+
229
+ web/src/services/
230
+ ├── user/
231
+ │ ├── user.types.ts # (api에서 복사됨)
232
+ │ └── user.service.ts # API 클라이언트 (자동 생성)
233
+ ├── sonamu.generated.ts # (api에서 복사됨)
234
+ ├── sonamu.shared.ts # 공통 유틸 (josa, dateReviver 등)
235
+ └── services.generated.ts # 통합 서비스 (자동 생성)
236
+ ```
237
+
238
+ **초기 상태**: 빌드 가능하도록 최소한의 스텁 파일들이 포함되어 있습니다.
239
+ **Entity 추가 후**: 실제 코드 생성 파일들로 자동 교체됩니다.
240
+
241
+ ### 3. API 작성
242
+
243
+ ```typescript
244
+ // api/src/application/user/user.model.ts
245
+ import { api } from "sonamu";
246
+
247
+ class UserModelClass extends BaseModelClass {
248
+ @api({ httpMethod: "GET" })
249
+ async findById(id: number): Promise<UserSubsetA | null> {
250
+ // 구현
251
+ }
252
+
253
+ @api({ httpMethod: "POST" })
254
+ async create(params: UserCreateParams): Promise<number> {
255
+ // 구현
256
+ }
257
+ }
258
+ ```
259
+
260
+ 저장하면 프론트엔드 서비스 코드가 자동 생성됩니다:
261
+
262
+ ```typescript
263
+ // web/src/services/user/user.service.ts (자동 생성)
264
+ export const UserService = {
265
+ findById: (id: number) => fetch<UserSubsetA | null>({ ... }),
266
+ create: (params: UserCreateParams) => fetch<number>({ ... }),
267
+ };
268
+ ```
269
+
270
+ ### 4. 프론트엔드에서 사용
271
+
272
+ ```tsx
273
+ // web/src/routes/users/index.tsx
274
+ import { createFileRoute } from "@tanstack/react-router";
275
+ import { useQuery } from "@tanstack/react-query";
276
+ import { UserService } from "@/services/user/user.service";
277
+
278
+ export const Route = createFileRoute("/users/")({
279
+ component: UserListPage,
280
+ });
281
+
282
+ function UserListPage() {
283
+ const { data: users } = useQuery({
284
+ queryKey: ["users"],
285
+ queryFn: () => UserService.findMany({ num: 10, page: 1 }),
286
+ });
287
+ // users는 ListResult<UserSubsetA> 타입으로 자동 추론됨
288
+
289
+ return <div>{/* ... */}</div>;
290
+ }
291
+ ```
292
+
293
+ ---
294
+
295
+ ## 🗄️ 데이터베이스
296
+
297
+ ### Docker 이미지
298
+
299
+ 기본적으로 `pgvector/pgvector:pg18` 이미지를 사용합니다. 이 이미지에는 다음 extension이 포함되어 있습니다:
300
+
301
+ - **pgvector** - 벡터 검색 (AI/임베딩용)
302
+
303
+ > **pgroonga (전문 검색)가 필요한 경우**
304
+ >
305
+ > pgroonga는 C 라이브러리 기반으로 별도 컴파일이 필요하여 기본 이미지에 포함되어 있지 않습니다.
306
+ > 전문 검색이 필요하다면 [pgroonga Docker 이미지](https://hub.docker.com/r/groonga/pgroonga)를 사용하거나,
307
+ > 직접 Dockerfile을 작성하여 pgroonga를 설치하세요.
308
+
309
+ ### 데이터베이스 구성
310
+
311
+ | DB 이름 | 용도 |
312
+ | ------------------ | --------------- |
313
+ | `{name}` | 메인 개발 DB |
314
+ | `{name}_fixture` | fixture DB |
315
+ | `{name}_test` | 테스트 실행용 |
316
+
317
+ ### Fixture 워크플로우
318
+
319
+ ```bash
320
+ # 테스트 데이터 수정 후
321
+ pnpm dump # 덤프 생성
322
+ git add database/dumps/
323
+ git commit -m "update fixture"
324
+
325
+ # 동료가 받을 때
326
+ git pull
327
+ pnpm seed # fixture DB에 적용
328
+ pnpm sonamu fixture sync # 테스트 DB로 동기화
329
+ ```
330
+
331
+ ---
332
+
333
+ ## 📋 요구사항
334
+
335
+ - **Node.js** >= 18
336
+ - **pnpm** >= 10
337
+ - **Docker** (데이터베이스용)
338
+
339
+ ---
340
+
341
+ ## ❓ FAQ
342
+
343
+ ### Q: yarn이나 npm으로도 사용할 수 있나요?
344
+
345
+ - 프로젝트는 pnpm workspace를 사용하도록 설계되었습니다. pnpm 사용을 권장합니다.
346
+
347
+ ### Q: MySQL을 사용할 수 있나요?
348
+
349
+ - PostgreSQL만 지원합니다. create-sonamu 템플릿은 PostgreSQL 기준으로 설정되어 있습니다.
350
+
351
+ ### Q: 기존 프로젝트에 Sonamu를 추가할 수 있나요?
352
+
353
+ - `create-sonamu`는 새 프로젝트용입니다. 기존 프로젝트에는 `sonamu` 패키지를 직접 설치하고 설정하세요.
354
+
355
+ ---
356
+
357
+ ## 📚 더 알아보기
358
+
359
+ - 📖 [Sonamu 공식 문서](https://rurruur.github.io/test-docs)
360
+ - 💬 [이슈 & 피드백](https://github.com/cartanova-ai/sonamu/issues)
361
+
362
+ ---
363
+
364
+ ## 📄 라이선스
365
+
366
+ MIT