@simplysm/sd-cli 13.0.84 → 13.0.86
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/README.md +302 -23
- package/docs/architecture.md +311 -0
- package/docs/config-types.md +253 -0
- package/package.json +6 -6
- package/templates/init/mise.toml +2 -2
- package/templates/init/package.json.hbs +8 -4
- package/templates/init/packages/client-admin/package.json.hbs +6 -5
- package/templates/init/packages/client-admin/src/events/AuthChangeEvent.ts +3 -0
- package/templates/init/packages/client-admin/src/main.tsx.hbs +2 -2
- package/templates/init/packages/client-admin/src/providers/AppServiceProvider.tsx.hbs +4 -4
- package/templates/init/packages/client-admin/src/providers/AuthProvider.tsx.hbs +27 -2
- package/templates/init/packages/client-admin/src/providers/configureSharedData.ts.hbs +8 -8
- package/templates/init/packages/client-admin/src/views/auth/LoginView.tsx +4 -4
- package/templates/init/packages/client-admin/src/views/home/HomeView.tsx +2 -2
- package/templates/init/packages/db-main/package.json.hbs +2 -2
- package/templates/init/packages/db-main/src/MainDbContext.ts +8 -6
- package/templates/init/packages/db-main/src/dataLogExt.ts +1 -1
- package/templates/init/packages/db-main/src/index.ts +10 -6
- package/templates/init/packages/server/package.json.hbs +4 -4
- package/templates/init/pnpm-workspace.yaml +1 -0
- package/templates/init/sd.config.ts.hbs +21 -9
- package/templates/init/{tests/e2e → tests-e2e}/package.json.hbs +1 -1
- package/templates/init/{tests/e2e → tests-e2e}/vitest.setup.ts.hbs +1 -1
- package/templates/init/tsconfig.json.hbs +2 -1
- package/templates/init/vitest-e2e.config.ts +23 -0
- package/templates/init/vitest.config.ts +0 -13
- package/docs/commands.md +0 -177
- package/docs/configuration.md +0 -211
- package/docs/vite-config.md +0 -67
- /package/templates/init/packages/db-main/src/tables/{Employee.ts → base/Employee.ts} +0 -0
- /package/templates/init/packages/db-main/src/tables/{EmployeeConfig.ts → base/EmployeeConfig.ts} +0 -0
- /package/templates/init/packages/db-main/src/tables/{Role.ts → base/Role.ts} +0 -0
- /package/templates/init/packages/db-main/src/tables/{RolePermission.ts → base/RolePermission.ts} +0 -0
- /package/templates/init/packages/db-main/src/tables/{_DataLog.ts → system/_DataLog.ts} +0 -0
- /package/templates/init/packages/db-main/src/tables/{_Log.ts → system/_Log.ts} +0 -0
- /package/templates/init/{tests/e2e → tests-e2e}/src/e2e.spec.ts +0 -0
- /package/templates/init/{tests/e2e → tests-e2e}/src/employee-crud.ts +0 -0
- /package/templates/init/{tests/e2e → tests-e2e}/src/login.ts +0 -0
package/README.md
CHANGED
|
@@ -1,58 +1,337 @@
|
|
|
1
1
|
# @simplysm/sd-cli
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Simplysm 프로젝트용 CLI 도구. pnpm 모노레포 환경에서 빌드, 개발 서버, 린트, 타입체크, 배포를 오케스트레이션한다.
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## 설치
|
|
6
6
|
|
|
7
7
|
```bash
|
|
8
8
|
npm install @simplysm/sd-cli
|
|
9
9
|
```
|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
## Quick Start
|
|
11
|
+
## 빠른 시작
|
|
14
12
|
|
|
15
13
|
```bash
|
|
16
|
-
#
|
|
14
|
+
# 새 프로젝트 초기화
|
|
17
15
|
sd-cli init
|
|
18
16
|
|
|
19
|
-
#
|
|
17
|
+
# 개발 서버 시작
|
|
20
18
|
sd-cli dev
|
|
21
19
|
|
|
22
|
-
#
|
|
20
|
+
# 프로덕션 빌드
|
|
23
21
|
sd-cli build
|
|
24
22
|
|
|
25
|
-
#
|
|
23
|
+
# 코드 품질 전체 검사
|
|
26
24
|
sd-cli check
|
|
27
25
|
```
|
|
28
26
|
|
|
29
|
-
##
|
|
27
|
+
## 명령어
|
|
28
|
+
|
|
29
|
+
모든 명령어는 `sd-cli <command> [targets..] [--debug]` 형태로 실행한다.
|
|
30
|
+
`[targets..]`를 지정하지 않으면 `sd.config.ts`에 정의된 모든 패키지가 대상이 된다.
|
|
31
|
+
|
|
32
|
+
### dev
|
|
33
|
+
|
|
34
|
+
클라이언트 + 서버 패키지를 개발 모드로 실행한다.
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
sd-cli dev [targets..] [-o key=value]
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
- `client` 타겟: Vite 개발 서버 시작 (HMR 지원)
|
|
41
|
+
- `server` 타겟: esbuild watch 빌드 + Fastify 서버 런타임
|
|
42
|
+
- 서버-클라이언트 프록시 연결 자동 구성
|
|
43
|
+
- Capacitor 초기화 지원
|
|
44
|
+
- SIGINT/SIGTERM으로 종료
|
|
45
|
+
|
|
46
|
+
### build
|
|
47
|
+
|
|
48
|
+
프로덕션 빌드를 실행한다.
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
sd-cli build [targets..] [-o key=value]
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
- dist 폴더 클린 후 빌드
|
|
55
|
+
- 린트 + 빌드 병렬 실행
|
|
56
|
+
- `node`/`browser`/`neutral` 타겟: esbuild JS 빌드 + .d.ts 생성
|
|
57
|
+
- `client` 타겟: Vite 프로덕션 빌드 + 타입체크 + Capacitor/Electron 빌드
|
|
58
|
+
- `server` 타겟: esbuild 번들 빌드
|
|
59
|
+
|
|
60
|
+
### watch
|
|
61
|
+
|
|
62
|
+
라이브러리 패키지를 watch 모드로 빌드한다.
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
sd-cli watch [targets..] [-o key=value]
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
- `node`/`browser`/`neutral` 타겟 전용
|
|
69
|
+
- esbuild watch + .d.ts 생성
|
|
70
|
+
- 파일 변경 시 자동 리빌드
|
|
71
|
+
|
|
72
|
+
### lint
|
|
73
|
+
|
|
74
|
+
ESLint를 실행한다.
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
sd-cli lint [targets..] [--fix] [--timing]
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
| 옵션 | 설명 |
|
|
81
|
+
|------|------|
|
|
82
|
+
| `--fix` | 자동 수정 |
|
|
83
|
+
| `--timing` | 규칙별 실행 시간 출력 |
|
|
84
|
+
|
|
85
|
+
- `.cache/eslint.cache`에 캐시 저장 (설정 변경 시 자동 무효화)
|
|
86
|
+
|
|
87
|
+
### typecheck
|
|
88
|
+
|
|
89
|
+
TypeScript 타입 검사를 실행한다.
|
|
90
|
+
|
|
91
|
+
```bash
|
|
92
|
+
sd-cli typecheck [targets..] [-o key=value]
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
- Worker 스레드로 병렬 타입체크
|
|
96
|
+
- neutral 패키지는 node/browser 환경 분리 검사
|
|
97
|
+
- `.cache/typecheck-{env}.tsbuildinfo` 증분 컴파일
|
|
98
|
+
|
|
99
|
+
### check
|
|
100
|
+
|
|
101
|
+
타입체크 + 린트 + 테스트를 병렬로 실행한다.
|
|
102
|
+
|
|
103
|
+
```bash
|
|
104
|
+
sd-cli check [targets..] [--type typecheck,lint,test]
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
- `--type`으로 실행할 검사 종류를 선택할 수 있다 (쉼표 구분)
|
|
108
|
+
- 테스트는 vitest를 subprocess로 실행
|
|
109
|
+
|
|
110
|
+
### publish
|
|
111
|
+
|
|
112
|
+
패키지를 빌드 후 배포한다.
|
|
113
|
+
|
|
114
|
+
```bash
|
|
115
|
+
sd-cli publish [targets..] [--no-build] [--dry-run] [-o key=value]
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
배포 순서:
|
|
119
|
+
1. 사전 검증 (npm 인증, Git 상태, SSH 키)
|
|
120
|
+
2. 버전 업그레이드 (patch 또는 prerelease)
|
|
121
|
+
3. 빌드
|
|
122
|
+
4. Git commit/tag/push
|
|
123
|
+
5. 의존성 레벨 순서로 배포 (레벨 내 병렬, 레벨 간 순차)
|
|
124
|
+
6. postPublish 스크립트 실행
|
|
125
|
+
|
|
126
|
+
| 옵션 | 설명 |
|
|
127
|
+
|------|------|
|
|
128
|
+
| `--no-build` | 빌드 없이 배포만 실행 |
|
|
129
|
+
| `--dry-run` | 실제 배포 없이 시뮬레이션 |
|
|
130
|
+
|
|
131
|
+
### device
|
|
132
|
+
|
|
133
|
+
Android 기기 또는 Electron에서 앱을 실행한다.
|
|
134
|
+
|
|
135
|
+
```bash
|
|
136
|
+
sd-cli device -p <package> [-u <url>] [-o key=value]
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
| 옵션 | 설명 |
|
|
140
|
+
|------|------|
|
|
141
|
+
| `-p, --package` | 패키지명 (필수) |
|
|
142
|
+
| `-u, --url` | 개발 서버 URL (미지정 시 sd.config.ts 서버 설정 사용) |
|
|
143
|
+
|
|
144
|
+
### init
|
|
30
145
|
|
|
31
|
-
|
|
146
|
+
새 Simplysm 프로젝트를 초기화한다.
|
|
147
|
+
|
|
148
|
+
```bash
|
|
149
|
+
sd-cli init
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
- 빈 디렉토리에서 실행 필요
|
|
153
|
+
- 프로젝트명, 설명, 포트를 입력받아 Handlebars 템플릿으로 생성
|
|
154
|
+
- 자동으로 `pnpm install` 실행
|
|
155
|
+
|
|
156
|
+
### replace-deps
|
|
157
|
+
|
|
158
|
+
`sd.config.ts`의 `replaceDeps` 설정에 따라 node_modules 패키지를 로컬 소스로 심링크한다.
|
|
159
|
+
|
|
160
|
+
```bash
|
|
161
|
+
sd-cli replace-deps [-o key=value]
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
## 설정 (sd.config.ts)
|
|
165
|
+
|
|
166
|
+
프로젝트 루트에 `sd.config.ts`를 생성하여 패키지별 빌드, 배포, 옵션을 설정한다.
|
|
167
|
+
|
|
168
|
+
### 기본 구조
|
|
32
169
|
|
|
33
170
|
```typescript
|
|
34
|
-
import type { SdConfigFn } from "@simplysm/sd-cli";
|
|
171
|
+
import type { SdConfigFn, SdConfigParams } from "@simplysm/sd-cli";
|
|
35
172
|
|
|
36
|
-
const config: SdConfigFn = (params) => ({
|
|
173
|
+
const config: SdConfigFn = (params: SdConfigParams) => ({
|
|
37
174
|
packages: {
|
|
38
175
|
"core-common": { target: "neutral" },
|
|
39
176
|
"core-node": { target: "node" },
|
|
40
|
-
"
|
|
41
|
-
"my-
|
|
177
|
+
"ui-lib": { target: "browser" },
|
|
178
|
+
"my-client": {
|
|
179
|
+
target: "client",
|
|
180
|
+
server: "my-server",
|
|
181
|
+
},
|
|
182
|
+
"my-server": {
|
|
183
|
+
target: "server",
|
|
184
|
+
pm2: { name: "my-app" },
|
|
185
|
+
},
|
|
186
|
+
"scripts": { target: "scripts" },
|
|
42
187
|
},
|
|
188
|
+
replaceDeps: {
|
|
189
|
+
"@simplysm/*": "../simplysm/packages/*",
|
|
190
|
+
},
|
|
191
|
+
postPublish: [
|
|
192
|
+
{ type: "script", cmd: "ssh", args: ["user@host", "pm2 restart %PROJECT%"] },
|
|
193
|
+
],
|
|
43
194
|
});
|
|
44
195
|
|
|
45
196
|
export default config;
|
|
46
197
|
```
|
|
47
198
|
|
|
48
|
-
|
|
199
|
+
### SdConfigParams
|
|
200
|
+
|
|
201
|
+
`sd.config.ts`의 default export 함수에 전달되는 파라미터.
|
|
202
|
+
|
|
203
|
+
```typescript
|
|
204
|
+
interface SdConfigParams {
|
|
205
|
+
cwd: string; // 현재 작업 디렉토리
|
|
206
|
+
dev: boolean; // 개발 모드 여부
|
|
207
|
+
options: string[]; // CLI의 -o 플래그로 전달된 옵션
|
|
208
|
+
}
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
### 패키지 타겟 유형
|
|
212
|
+
|
|
213
|
+
| 타겟 | 설명 | 빌드 도구 |
|
|
214
|
+
|------|------|-----------|
|
|
215
|
+
| `node` | Node.js 전용 라이브러리 | esbuild (bundle: false) + .d.ts |
|
|
216
|
+
| `browser` | 브라우저 전용 라이브러리 | esbuild (bundle: false) + .d.ts |
|
|
217
|
+
| `neutral` | Node/브라우저 공용 라이브러리 | esbuild (bundle: false) + .d.ts |
|
|
218
|
+
| `client` | 클라이언트 앱 (SolidJS + Vite) | Vite + 타입체크 |
|
|
219
|
+
| `server` | 서버 앱 (Fastify) | esbuild (bundle: true, minify) |
|
|
220
|
+
| `scripts` | 스크립트 전용 (빌드/watch 제외) | 없음 |
|
|
221
|
+
|
|
222
|
+
### 배포 설정 (publish)
|
|
223
|
+
|
|
224
|
+
각 패키지의 `publish` 필드로 배포 방식을 지정한다.
|
|
225
|
+
|
|
226
|
+
```typescript
|
|
227
|
+
// npm 레지스트리
|
|
228
|
+
{ type: "npm" }
|
|
229
|
+
|
|
230
|
+
// 로컬 디렉토리 복사
|
|
231
|
+
{ type: "local-directory", path: "/deploy/%PROJECT%/%VER%" }
|
|
232
|
+
|
|
233
|
+
// FTP/FTPS/SFTP 업로드
|
|
234
|
+
{ type: "sftp", host: "example.com", port: 22, path: "/app", user: "deploy" }
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
환경 변수 치환: `%VER%` (버전), `%PROJECT%` (프로젝트 경로)
|
|
238
|
+
|
|
239
|
+
상세 API는 [설정 타입 레퍼런스](docs/config-types.md) 참조.
|
|
240
|
+
|
|
241
|
+
## 아키텍처
|
|
242
|
+
|
|
243
|
+
상세 아키텍처는 [아키텍처 문서](docs/architecture.md) 참조.
|
|
244
|
+
|
|
245
|
+
### 핵심 구조
|
|
246
|
+
|
|
247
|
+
```
|
|
248
|
+
sd-cli.ts (런처)
|
|
249
|
+
└─ sd-cli-entry.ts (CLI 파서, yargs)
|
|
250
|
+
├─ commands/ ← 각 명령어 진입점
|
|
251
|
+
├─ orchestrators/ ← 빌드 워크플로우 관리
|
|
252
|
+
├─ builders/ ← 빌더 (esbuild/dts)
|
|
253
|
+
├─ workers/ ← Worker 스레드 (병렬 처리)
|
|
254
|
+
├─ infra/ ← 인프라 (결과 수집, 시그널, 워커 관리)
|
|
255
|
+
├─ capacitor/ ← Capacitor 프로젝트 관리
|
|
256
|
+
├─ electron/ ← Electron 프로젝트 관리
|
|
257
|
+
└─ utils/ ← 유틸리티
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
### 오케스트레이터
|
|
261
|
+
|
|
262
|
+
| 클래스 | 용도 |
|
|
263
|
+
|--------|------|
|
|
264
|
+
| `BuildOrchestrator` | 프로덕션 빌드 (클린 → 린트+빌드 병렬) |
|
|
265
|
+
| `DevOrchestrator` | 개발 모드 (Vite 서버 + Fastify 서버 + 프록시) |
|
|
266
|
+
| `WatchOrchestrator` | 라이브러리 watch 모드 (esbuild watch + dts) |
|
|
267
|
+
|
|
268
|
+
### 빌더
|
|
269
|
+
|
|
270
|
+
| 클래스 | 역할 |
|
|
271
|
+
|--------|------|
|
|
272
|
+
| `BaseBuilder` | 빌더 공통 추상 클래스 |
|
|
273
|
+
| `LibraryBuilder` | esbuild 기반 라이브러리 JS 빌드 |
|
|
274
|
+
| `DtsBuilder` | TypeScript .d.ts 파일 생성 |
|
|
275
|
+
|
|
276
|
+
### 인프라
|
|
277
|
+
|
|
278
|
+
| 클래스 | 역할 |
|
|
279
|
+
|--------|------|
|
|
280
|
+
| `WorkerManager` | Worker 생성/조회/종료 관리 |
|
|
281
|
+
| `ResultCollector` | 빌드 결과 수집 및 상태 관리 |
|
|
282
|
+
| `SignalHandler` | SIGINT/SIGTERM 시그널 처리 |
|
|
283
|
+
|
|
284
|
+
## 라이브러리 API
|
|
285
|
+
|
|
286
|
+
`@simplysm/sd-cli`는 CLI 외에도 프로그래밍 방식으로 사용할 수 있는 API를 export한다.
|
|
287
|
+
|
|
288
|
+
### 설정 타입
|
|
289
|
+
|
|
290
|
+
```typescript
|
|
291
|
+
import type {
|
|
292
|
+
SdConfig,
|
|
293
|
+
SdConfigFn,
|
|
294
|
+
SdConfigParams,
|
|
295
|
+
SdPackageConfig,
|
|
296
|
+
SdBuildPackageConfig,
|
|
297
|
+
SdClientPackageConfig,
|
|
298
|
+
SdServerPackageConfig,
|
|
299
|
+
SdScriptsPackageConfig,
|
|
300
|
+
BuildTarget,
|
|
301
|
+
SdPublishConfig,
|
|
302
|
+
SdNpmPublishConfig,
|
|
303
|
+
SdLocalDirectoryPublishConfig,
|
|
304
|
+
SdStoragePublishConfig,
|
|
305
|
+
SdCapacitorConfig,
|
|
306
|
+
SdElectronConfig,
|
|
307
|
+
SdPostPublishScriptConfig,
|
|
308
|
+
} from "@simplysm/sd-cli";
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
### Vite 설정
|
|
312
|
+
|
|
313
|
+
외부 Vite 프로젝트에서 Simplysm 스타일의 Vite 설정을 생성할 때 사용한다.
|
|
49
314
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
| CLI Commands | [docs/commands.md](docs/commands.md) |
|
|
53
|
-
| Configuration Types | [docs/configuration.md](docs/configuration.md) |
|
|
54
|
-
| Vite Config API | [docs/vite-config.md](docs/vite-config.md) |
|
|
315
|
+
```typescript
|
|
316
|
+
import { createViteConfig, type ViteConfigOptions } from "@simplysm/sd-cli";
|
|
55
317
|
|
|
56
|
-
|
|
318
|
+
const config = createViteConfig({
|
|
319
|
+
pkgDir: "/path/to/package",
|
|
320
|
+
name: "my-app",
|
|
321
|
+
tsconfigPath: "/path/to/tsconfig.json",
|
|
322
|
+
compilerOptions: { /* ... */ },
|
|
323
|
+
mode: "dev", // "build" | "dev"
|
|
324
|
+
serverPort: 3000, // dev 모드 서버 포트 (0이면 자동 할당)
|
|
325
|
+
env: { API_URL: "http://localhost:8080" },
|
|
326
|
+
replaceDeps: ["@simplysm/solid"], // scope 패키지 watch 대상
|
|
327
|
+
});
|
|
328
|
+
```
|
|
57
329
|
|
|
58
|
-
|
|
330
|
+
`createViteConfig`는 다음을 자동 구성한다:
|
|
331
|
+
- SolidJS 플러그인
|
|
332
|
+
- TailwindCSS (postcss)
|
|
333
|
+
- tsconfig paths 해석
|
|
334
|
+
- PWA 지원 (vite-plugin-pwa)
|
|
335
|
+
- scope 패키지 dist 변경 감지 (sdScopeWatchPlugin)
|
|
336
|
+
- public-dev/ 디렉토리 우선 서빙 (dev 모드)
|
|
337
|
+
- process.env 치환 (define)
|
|
@@ -0,0 +1,311 @@
|
|
|
1
|
+
# 아키텍처
|
|
2
|
+
|
|
3
|
+
sd-cli의 내부 아키텍처 상세 문서.
|
|
4
|
+
|
|
5
|
+
## 실행 흐름
|
|
6
|
+
|
|
7
|
+
### CLI 진입점
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
sd-cli.ts (런처)
|
|
11
|
+
├─ 개발 모드 (.ts): CPU 어피니티 설정 → sd-cli-entry.ts 직접 import
|
|
12
|
+
└─ 프로덕션 모드 (.js):
|
|
13
|
+
1. replaceDeps 실행 (모듈 캐시 전 심링크 설정)
|
|
14
|
+
2. 새 프로세스에서 sd-cli-entry.ts 실행 (모듈 캐시 리셋)
|
|
15
|
+
--max-old-space-size=8192 --max-semi-space-size=16
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
CPU 어피니티: 전체 CPU 중 앞쪽 코어를 제외하고 남은 코어에만 바인딩. OS/다른 프로세스를 위한 코어 확보.
|
|
19
|
+
|
|
20
|
+
### CLI 파서
|
|
21
|
+
|
|
22
|
+
`sd-cli-entry.ts`에서 yargs로 명령어를 파싱한다.
|
|
23
|
+
|
|
24
|
+
```typescript
|
|
25
|
+
export function createCliParser(argv: string[]): Argv
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
전역 옵션: `--debug` (consola 로그 레벨을 debug로 설정)
|
|
29
|
+
|
|
30
|
+
## 빌드 파이프라인
|
|
31
|
+
|
|
32
|
+
### 빌드 타겟별 처리
|
|
33
|
+
|
|
34
|
+
| 타겟 | JS 빌드 | 타입 검사 | .d.ts | 기타 |
|
|
35
|
+
|------|---------|----------|-------|------|
|
|
36
|
+
| node/browser/neutral | esbuild (bundle: false) | Worker (dts.worker) | 생성 | copySrc |
|
|
37
|
+
| client | Vite (production build) | Worker (dts.worker) | 미생성 | Capacitor/Electron |
|
|
38
|
+
| server | esbuild (bundle: true, minify) | - | - | PM2 설정 생성 |
|
|
39
|
+
|
|
40
|
+
### esbuild 설정
|
|
41
|
+
|
|
42
|
+
**라이브러리 빌드** (`createLibraryEsbuildOptions`):
|
|
43
|
+
- `bundle: false` (개별 파일 트랜스파일)
|
|
44
|
+
- `format: "esm"`, `sourcemap: true`
|
|
45
|
+
- `platform`: node → `"node"`, browser/neutral → `"browser"`
|
|
46
|
+
- `target`: node → `"node20"`, browser/neutral → `"chrome84"`
|
|
47
|
+
- solid-js 의존성 감지 시 `esbuild-plugin-solid` 자동 적용
|
|
48
|
+
- 출력 후 ESM import 경로에 `.js` 확장자 자동 추가
|
|
49
|
+
|
|
50
|
+
**서버 빌드** (`createServerEsbuildOptions`):
|
|
51
|
+
- `bundle: true` (모든 의존성 포함)
|
|
52
|
+
- `minify: true` (코드 보호)
|
|
53
|
+
- `banner`: `createRequire` shim (CJS 패키지 호환)
|
|
54
|
+
- `process.env.KEY` 상수 치환 (define)
|
|
55
|
+
- 자동 external: native 모듈 (binding.gyp), 미설치 optional peer deps
|
|
56
|
+
|
|
57
|
+
### Vite 설정
|
|
58
|
+
|
|
59
|
+
`createViteConfig`가 생성하는 Vite 설정:
|
|
60
|
+
|
|
61
|
+
**플러그인:**
|
|
62
|
+
- `vite-tsconfig-paths`: tsconfig path alias 해석
|
|
63
|
+
- `vite-plugin-solid`: SolidJS JSX 컴파일
|
|
64
|
+
- `vite-plugin-pwa`: PWA manifest/service worker
|
|
65
|
+
- `sdTailwindConfigDepsPlugin`: scope 패키지 Tailwind 설정 변경 감지
|
|
66
|
+
- `sdScopeWatchPlugin`: scope 패키지 dist 변경 감지 + optimizeDeps 제외
|
|
67
|
+
- `sdPublicDevPlugin`: `public-dev/` 디렉토리 우선 서빙 (dev 모드 전용)
|
|
68
|
+
|
|
69
|
+
**CSS:**
|
|
70
|
+
- PostCSS + TailwindCSS (각 패키지의 `tailwind.config.ts` 사용)
|
|
71
|
+
|
|
72
|
+
## 오케스트레이터
|
|
73
|
+
|
|
74
|
+
### BuildOrchestrator
|
|
75
|
+
|
|
76
|
+
프로덕션 빌드 워크플로우를 관리한다.
|
|
77
|
+
|
|
78
|
+
```
|
|
79
|
+
initialize()
|
|
80
|
+
├─ sd.config.ts 로드
|
|
81
|
+
├─ 패키지 분류 (build/client/server)
|
|
82
|
+
└─ 환경 변수 준비 (VER, DEV)
|
|
83
|
+
|
|
84
|
+
start() → boolean (에러 여부)
|
|
85
|
+
├─ Phase 1: Clean (dist 폴더 삭제)
|
|
86
|
+
└─ Phase 2: Lint + Build (병렬)
|
|
87
|
+
├─ Lint Worker
|
|
88
|
+
├─ buildPackages → Library Worker + DTS Worker (병렬)
|
|
89
|
+
├─ clientPackages → Client Worker + DTS Worker (병렬) + Capacitor/Electron
|
|
90
|
+
└─ serverPackages → Server Worker
|
|
91
|
+
|
|
92
|
+
shutdown()
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
### DevOrchestrator
|
|
96
|
+
|
|
97
|
+
개발 모드 워크플로우를 관리한다.
|
|
98
|
+
|
|
99
|
+
```
|
|
100
|
+
initialize()
|
|
101
|
+
├─ sd.config.ts 로드
|
|
102
|
+
├─ replaceDeps watch 시작
|
|
103
|
+
├─ 패키지 분류 (client/server)
|
|
104
|
+
└─ 서버-클라이언트 매핑
|
|
105
|
+
|
|
106
|
+
start()
|
|
107
|
+
├─ 클라이언트 Worker 시작
|
|
108
|
+
│ ├─ standalone (server가 number이거나 서버가 dev 대상 아님)
|
|
109
|
+
│ └─ server-connected (server가 string이고 서버가 dev 대상)
|
|
110
|
+
├─ 서버 Build Worker 시작
|
|
111
|
+
│ └─ build 이벤트 → Server Runtime Worker 시작
|
|
112
|
+
│ └─ Vite 클라이언트 ready 대기 → 프록시 포트 전달
|
|
113
|
+
└─ Capacitor 초기화
|
|
114
|
+
|
|
115
|
+
awaitTermination() → SIGINT/SIGTERM 대기
|
|
116
|
+
shutdown() → 모든 Worker 종료
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
서버-클라이언트 프록시 연결:
|
|
120
|
+
1. 클라이언트의 `server` 필드가 서버 패키지명이면 프록시 대상
|
|
121
|
+
2. Vite 서버가 자동 포트를 할당받아 `serverReady` 이벤트 emit
|
|
122
|
+
3. 서버 런타임에 클라이언트 포트 맵을 전달
|
|
123
|
+
4. Fastify 서버가 `@fastify/http-proxy`로 Vite 서버에 프록시
|
|
124
|
+
|
|
125
|
+
### WatchOrchestrator
|
|
126
|
+
|
|
127
|
+
라이브러리 watch 모드를 관리한다.
|
|
128
|
+
|
|
129
|
+
```
|
|
130
|
+
initialize()
|
|
131
|
+
├─ sd.config.ts 로드
|
|
132
|
+
├─ replaceDeps watch 시작
|
|
133
|
+
├─ 라이브러리 패키지 필터링 (node/browser/neutral)
|
|
134
|
+
├─ LibraryBuilder + DtsBuilder 생성
|
|
135
|
+
└─ 빌더 초기화
|
|
136
|
+
|
|
137
|
+
start()
|
|
138
|
+
├─ copySrc watch 시작
|
|
139
|
+
├─ LibraryBuilder.startWatch()
|
|
140
|
+
├─ DtsBuilder.startWatch()
|
|
141
|
+
└─ 초기 빌드 완료 대기
|
|
142
|
+
|
|
143
|
+
awaitTermination() → SIGINT/SIGTERM 대기
|
|
144
|
+
shutdown() → 빌더 종료 + watcher 정리
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
## 빌더
|
|
148
|
+
|
|
149
|
+
### BaseBuilder (추상 클래스)
|
|
150
|
+
|
|
151
|
+
모든 빌더의 공통 로직을 제공한다.
|
|
152
|
+
|
|
153
|
+
```typescript
|
|
154
|
+
abstract class BaseBuilder implements IBuilder {
|
|
155
|
+
// 공통 메서드
|
|
156
|
+
initialize(): Promise<void>;
|
|
157
|
+
build(): Promise<void>; // 프로덕션 1회 빌드
|
|
158
|
+
startWatch(): Promise<void>; // watch 모드
|
|
159
|
+
shutdown(): Promise<void>;
|
|
160
|
+
getInitialBuildPromises(): Map<string, Promise<void>>;
|
|
161
|
+
|
|
162
|
+
// 서브클래스 구현 필수
|
|
163
|
+
abstract getBuilderType(): string;
|
|
164
|
+
abstract createWorkers(): void;
|
|
165
|
+
abstract registerEventHandlers(): void;
|
|
166
|
+
abstract buildPackage(pkg: PackageInfo): Promise<void>;
|
|
167
|
+
abstract startWatchPackage(pkg: PackageInfo): void;
|
|
168
|
+
}
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
### LibraryBuilder
|
|
172
|
+
|
|
173
|
+
esbuild 기반 JS 컴파일. Worker 키: `{패키지명}:build`.
|
|
174
|
+
|
|
175
|
+
- watch 모드: Worker의 `startWatch()` 호출, `buildStart`/`build`/`error` 이벤트 수신
|
|
176
|
+
- 종료 시 `stopWatch()` 호출 (esbuild context dispose), 3초 타임아웃
|
|
177
|
+
|
|
178
|
+
### DtsBuilder
|
|
179
|
+
|
|
180
|
+
TypeScript .d.ts 파일 생성. Worker 키: `{패키지명}:dts`.
|
|
181
|
+
|
|
182
|
+
- 환경 결정: node → `"node"`, browser/neutral/client → `"browser"`
|
|
183
|
+
|
|
184
|
+
## Worker 스레드
|
|
185
|
+
|
|
186
|
+
모든 빌드 작업은 Worker 스레드에서 실행되어 메인 스레드를 차단하지 않는다.
|
|
187
|
+
|
|
188
|
+
| Worker | 파일 | 역할 |
|
|
189
|
+
|--------|------|------|
|
|
190
|
+
| library.worker | `workers/library.worker.ts` | esbuild 라이브러리 JS 빌드 |
|
|
191
|
+
| dts.worker | `workers/dts.worker.ts` | .d.ts 생성 + 타입체크 |
|
|
192
|
+
| client.worker | `workers/client.worker.ts` | Vite 빌드/개발 서버 |
|
|
193
|
+
| server.worker | `workers/server.worker.ts` | esbuild 서버 빌드 |
|
|
194
|
+
| server-runtime.worker | `workers/server-runtime.worker.ts` | Fastify 서버 런타임 |
|
|
195
|
+
| lint.worker | `workers/lint.worker.ts` | ESLint 실행 |
|
|
196
|
+
|
|
197
|
+
### Worker 이벤트
|
|
198
|
+
|
|
199
|
+
Worker와 메인 스레드 간 이벤트 통신:
|
|
200
|
+
|
|
201
|
+
| 이벤트 | 데이터 | 발생 시점 |
|
|
202
|
+
|--------|--------|----------|
|
|
203
|
+
| `buildStart` | `{}` | 빌드/리빌드 시작 |
|
|
204
|
+
| `build` | `{ success, errors?, warnings? }` | 빌드 완료 |
|
|
205
|
+
| `serverReady` | `{ port }` | Vite/Fastify 서버 시작 |
|
|
206
|
+
| `scopeRebuild` | `{}` | scope 패키지 dist 변경 감지 |
|
|
207
|
+
| `error` | `{ message }` | 에러 발생 |
|
|
208
|
+
|
|
209
|
+
## 인프라 클래스
|
|
210
|
+
|
|
211
|
+
### WorkerManager
|
|
212
|
+
|
|
213
|
+
Worker 생명주기를 중앙 관리한다.
|
|
214
|
+
|
|
215
|
+
```typescript
|
|
216
|
+
class WorkerManager {
|
|
217
|
+
create<T>(id: string, workerPath: string): WorkerProxy<T>;
|
|
218
|
+
get<T>(id: string): WorkerProxy<T> | undefined;
|
|
219
|
+
terminate(id: string): Promise<void>;
|
|
220
|
+
terminateAll(): Promise<void>;
|
|
221
|
+
readonly size: number;
|
|
222
|
+
readonly ids: string[];
|
|
223
|
+
}
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
### ResultCollector
|
|
227
|
+
|
|
228
|
+
빌드 결과를 수집하고 상태를 관리한다.
|
|
229
|
+
|
|
230
|
+
```typescript
|
|
231
|
+
interface BuildResult {
|
|
232
|
+
name: string;
|
|
233
|
+
target: string;
|
|
234
|
+
type: "build" | "dts" | "server" | "capacitor";
|
|
235
|
+
status: "pending" | "building" | "success" | "error" | "running";
|
|
236
|
+
message?: string;
|
|
237
|
+
port?: number;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
class ResultCollector {
|
|
241
|
+
add(result: BuildResult): void;
|
|
242
|
+
get(key: string): BuildResult | undefined;
|
|
243
|
+
toMap(): Map<string, BuildResult>;
|
|
244
|
+
}
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
### SignalHandler
|
|
248
|
+
|
|
249
|
+
프로세스 종료 시그널을 처리한다.
|
|
250
|
+
|
|
251
|
+
```typescript
|
|
252
|
+
class SignalHandler {
|
|
253
|
+
waitForTermination(): Promise<void>;
|
|
254
|
+
isTerminated(): boolean;
|
|
255
|
+
requestTermination(): void; // 프로그래밍 방식 종료
|
|
256
|
+
}
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
### RebuildManager
|
|
260
|
+
|
|
261
|
+
리빌드 시 배치 완료를 추적하고 `batchComplete` 이벤트를 발생시킨다.
|
|
262
|
+
동시에 여러 패키지가 리빌드되는 경우 모두 완료된 후 한 번만 결과를 출력하기 위해 사용한다.
|
|
263
|
+
|
|
264
|
+
## Capacitor / Electron
|
|
265
|
+
|
|
266
|
+
### Capacitor 클래스
|
|
267
|
+
|
|
268
|
+
Capacitor 프로젝트를 관리한다.
|
|
269
|
+
|
|
270
|
+
```typescript
|
|
271
|
+
class Capacitor {
|
|
272
|
+
static create(pkgDir: string, config: SdCapacitorConfig): Promise<Capacitor>;
|
|
273
|
+
initialize(): Promise<void>; // .capacitor/ 프로젝트 생성/업데이트
|
|
274
|
+
build(outPath: string): Promise<void>; // APK/AAB 빌드
|
|
275
|
+
runOnDevice(serverUrl: string): Promise<void>; // 기기에서 실행
|
|
276
|
+
}
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
### Electron 클래스
|
|
280
|
+
|
|
281
|
+
Electron 프로젝트를 관리한다.
|
|
282
|
+
|
|
283
|
+
```typescript
|
|
284
|
+
class Electron {
|
|
285
|
+
static create(pkgDir: string, config: SdElectronConfig): Promise<Electron>;
|
|
286
|
+
initialize(): Promise<void>; // .electron/ 프로젝트 생성/업데이트
|
|
287
|
+
build(outPath: string): Promise<void>; // Windows exe 빌드
|
|
288
|
+
run(serverUrl: string): Promise<void>; // 개발 모드 실행
|
|
289
|
+
}
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
## 유틸리티
|
|
293
|
+
|
|
294
|
+
| 모듈 | 역할 |
|
|
295
|
+
|------|------|
|
|
296
|
+
| `sd-config.ts` | `sd.config.ts` 로드 (jiti 사용) |
|
|
297
|
+
| `tsconfig.ts` | tsconfig.json 파싱, TypecheckEnv 결정 |
|
|
298
|
+
| `esbuild-config.ts` | esbuild 빌드 옵션 생성 |
|
|
299
|
+
| `vite-config.ts` | Vite 설정 생성 |
|
|
300
|
+
| `build-env.ts` | 버전, 환경 변수 관리 |
|
|
301
|
+
| `replace-deps.ts` | replaceDeps 심링크 + watch |
|
|
302
|
+
| `copy-src.ts` | copySrc 파일 복사 + watch |
|
|
303
|
+
| `copy-public.ts` | public 파일 복사 |
|
|
304
|
+
| `output-utils.ts` | 빌드 결과 포맷팅 출력 |
|
|
305
|
+
| `rebuild-manager.ts` | 리빌드 배치 추적 |
|
|
306
|
+
| `worker-utils.ts` | Worker 유틸리티 |
|
|
307
|
+
| `worker-events.ts` | Worker 이벤트 타입/핸들러 |
|
|
308
|
+
| `package-utils.ts` | 패키지 필터링, 루트 패키지 탐색 |
|
|
309
|
+
| `template.ts` | Handlebars 템플릿 렌더링 |
|
|
310
|
+
| `typecheck-serialization.ts` | ts.Diagnostic 직렬화/역직렬화 |
|
|
311
|
+
| `tailwind-config-deps.ts` | Tailwind 설정 파일 의존성 추적 |
|