@simplysm/sd-cli 13.0.96 → 13.0.98

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 (54) hide show
  1. package/README.md +132 -292
  2. package/dist/capacitor/capacitor.d.ts +2 -1
  3. package/dist/capacitor/capacitor.d.ts.map +1 -1
  4. package/dist/capacitor/capacitor.js +11 -3
  5. package/dist/capacitor/capacitor.js.map +1 -1
  6. package/dist/commands/device.js +2 -2
  7. package/dist/commands/device.js.map +1 -1
  8. package/dist/electron/electron.d.ts +2 -1
  9. package/dist/electron/electron.d.ts.map +1 -1
  10. package/dist/electron/electron.js +12 -3
  11. package/dist/electron/electron.js.map +1 -1
  12. package/dist/orchestrators/BuildOrchestrator.js +2 -2
  13. package/dist/orchestrators/BuildOrchestrator.js.map +1 -1
  14. package/dist/orchestrators/DevOrchestrator.js +1 -1
  15. package/dist/orchestrators/DevOrchestrator.js.map +1 -1
  16. package/dist/orchestrators/WatchOrchestrator.d.ts +7 -0
  17. package/dist/orchestrators/WatchOrchestrator.d.ts.map +1 -1
  18. package/dist/orchestrators/WatchOrchestrator.js +93 -49
  19. package/dist/orchestrators/WatchOrchestrator.js.map +1 -1
  20. package/dist/sd-config.types.d.ts +16 -1
  21. package/dist/sd-config.types.d.ts.map +1 -1
  22. package/dist/utils/package-utils.js +1 -1
  23. package/dist/utils/package-utils.js.map +1 -1
  24. package/dist/utils/vite-config.d.ts +6 -0
  25. package/dist/utils/vite-config.d.ts.map +1 -1
  26. package/dist/utils/vite-config.js +7 -1
  27. package/dist/utils/vite-config.js.map +1 -1
  28. package/dist/workers/client.worker.d.ts.map +1 -1
  29. package/dist/workers/client.worker.js +10 -3
  30. package/dist/workers/client.worker.js.map +1 -1
  31. package/package.json +6 -6
  32. package/src/capacitor/capacitor.ts +16 -2
  33. package/src/commands/device.ts +2 -2
  34. package/src/electron/electron.ts +17 -2
  35. package/src/orchestrators/BuildOrchestrator.ts +2 -2
  36. package/src/orchestrators/DevOrchestrator.ts +1 -1
  37. package/src/orchestrators/WatchOrchestrator.ts +124 -67
  38. package/src/sd-config.types.ts +17 -1
  39. package/src/utils/package-utils.ts +2 -2
  40. package/src/utils/vite-config.ts +15 -1
  41. package/src/workers/client.worker.ts +11 -1
  42. package/templates/init/.gitignore.hbs +1 -2
  43. package/templates/init/package.json.hbs +5 -6
  44. package/templates/init/packages/client-admin/package.json.hbs +7 -7
  45. package/templates/init/packages/db-main/package.json.hbs +2 -2
  46. package/templates/init/packages/server/package.json.hbs +5 -5
  47. package/templates/init/tests-e2e/package.json.hbs +1 -1
  48. package/tests/capacitor-exclude.spec.ts +78 -0
  49. package/tests/electron-exclude.spec.ts +61 -0
  50. package/tests/run-watch.spec.ts +35 -0
  51. package/tests/vite-config-exclude.spec.ts +35 -0
  52. package/tests/vite-config-outdir.spec.ts +38 -0
  53. package/docs/architecture.md +0 -311
  54. package/docs/config-types.md +0 -263
@@ -1,311 +0,0 @@
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 설정 파일 의존성 추적 |
@@ -1,263 +0,0 @@
1
- # 설정 타입 레퍼런스
2
-
3
- `sd.config.ts`에서 사용하는 모든 타입의 상세 레퍼런스.
4
-
5
- ## SdConfig
6
-
7
- `sd.config.ts`의 최상위 설정 타입.
8
-
9
- ```typescript
10
- interface SdConfig {
11
- packages: Record<string, SdPackageConfig | undefined>;
12
- replaceDeps?: Record<string, string>;
13
- postPublish?: SdPostPublishScriptConfig[];
14
- }
15
- ```
16
-
17
- | 필드 | 타입 | 설명 |
18
- |------|------|------|
19
- | `packages` | `Record<string, SdPackageConfig>` | 패키지별 설정. 키는 `packages/` 하위 디렉토리명 |
20
- | `replaceDeps` | `Record<string, string>` | 의존성 교체 설정. 키: glob 패턴, 값: 로컬 경로 (`*` 치환 지원) |
21
- | `postPublish` | `SdPostPublishScriptConfig[]` | 배포 완료 후 실행할 스크립트 |
22
-
23
- ### replaceDeps 예시
24
-
25
- ```typescript
26
- replaceDeps: {
27
- "@simplysm/*": "../simplysm/packages/*"
28
- }
29
- // @simplysm/core-common -> ../simplysm/packages/core-common 으로 심링크
30
- ```
31
-
32
- ## SdConfigFn / SdConfigParams
33
-
34
- ```typescript
35
- type SdConfigFn = (params: SdConfigParams) => SdConfig | Promise<SdConfig>;
36
-
37
- interface SdConfigParams {
38
- cwd: string; // 현재 작업 디렉토리
39
- dev: boolean; // 개발 모드 여부 (dev/watch: true, build/publish: false)
40
- options: string[]; // CLI -o 플래그 값 (예: ["key=value"])
41
- }
42
- ```
43
-
44
- ## 패키지 설정 타입
45
-
46
- ### SdPackageConfig (유니온)
47
-
48
- ```typescript
49
- type SdPackageConfig =
50
- | SdBuildPackageConfig
51
- | SdClientPackageConfig
52
- | SdServerPackageConfig
53
- | SdScriptsPackageConfig;
54
- ```
55
-
56
- ### SdBuildPackageConfig
57
-
58
- 라이브러리 패키지 (node/browser/neutral) 설정.
59
-
60
- ```typescript
61
- interface SdBuildPackageConfig {
62
- target: "node" | "browser" | "neutral";
63
- publish?: SdPublishConfig;
64
- copySrc?: string[];
65
- }
66
- ```
67
-
68
- | 필드 | 타입 | 설명 |
69
- |------|------|------|
70
- | `target` | `BuildTarget` | 빌드 대상 플랫폼 |
71
- | `publish` | `SdPublishConfig` | 배포 설정 |
72
- | `copySrc` | `string[]` | `src/`에서 `dist/`로 복사할 파일 glob 패턴 (src 기준 상대 경로) |
73
-
74
- ### SdClientPackageConfig
75
-
76
- 클라이언트 앱 패키지 설정 (Vite + SolidJS).
77
-
78
- ```typescript
79
- interface SdClientPackageConfig {
80
- target: "client";
81
- server: string | number;
82
- env?: Record<string, string>;
83
- publish?: SdPublishConfig;
84
- capacitor?: SdCapacitorConfig;
85
- electron?: SdElectronConfig;
86
- configs?: Record<string, unknown>;
87
- }
88
- ```
89
-
90
- | 필드 | 타입 | 설명 |
91
- |------|------|------|
92
- | `target` | `"client"` | 고정값 |
93
- | `server` | `string \| number` | 서버 패키지명(프록시 연결) 또는 Vite 포트 번호 |
94
- | `env` | `Record<string, string>` | 빌드 시 `process.env` 치환 값 |
95
- | `publish` | `SdPublishConfig` | 배포 설정 |
96
- | `capacitor` | `SdCapacitorConfig` | Capacitor 설정 (모바일 앱) |
97
- | `electron` | `SdElectronConfig` | Electron 설정 (데스크톱 앱) |
98
- | `configs` | `Record<string, unknown>` | 런타임 설정 (`dist/.config.json`에 기록) |
99
-
100
- ### SdServerPackageConfig
101
-
102
- 서버 앱 패키지 설정 (Fastify).
103
-
104
- ```typescript
105
- interface SdServerPackageConfig {
106
- target: "server";
107
- env?: Record<string, string>;
108
- publish?: SdPublishConfig;
109
- configs?: Record<string, unknown>;
110
- externals?: string[];
111
- pm2?: {
112
- name?: string;
113
- ignoreWatchPaths?: string[];
114
- };
115
- packageManager?: "volta" | "mise";
116
- }
117
- ```
118
-
119
- | 필드 | 타입 | 설명 |
120
- |------|------|------|
121
- | `target` | `"server"` | 고정값 |
122
- | `env` | `Record<string, string>` | `process.env.KEY` 치환 값 |
123
- | `publish` | `SdPublishConfig` | 배포 설정 |
124
- | `configs` | `Record<string, unknown>` | 런타임 설정 (`dist/.config.json`에 기록) |
125
- | `externals` | `string[]` | esbuild 번들에서 제외할 외부 모듈 (binding.gyp 자동 감지 외 추가분) |
126
- | `pm2` | `object` | PM2 설정 (`dist/pm2.config.cjs` 생성) |
127
- | `packageManager` | `"volta" \| "mise"` | 패키지 매니저 설정 파일 생성 |
128
-
129
- ### SdScriptsPackageConfig
130
-
131
- 스크립트 전용 패키지 (빌드/watch/typecheck 제외).
132
-
133
- ```typescript
134
- interface SdScriptsPackageConfig {
135
- target: "scripts";
136
- publish?: SdPublishConfig;
137
- }
138
- ```
139
-
140
- ## 배포 설정 타입
141
-
142
- ### SdPublishConfig (유니온)
143
-
144
- ```typescript
145
- type SdPublishConfig = SdNpmPublishConfig | SdLocalDirectoryPublishConfig | SdStoragePublishConfig;
146
- ```
147
-
148
- ### SdNpmPublishConfig
149
-
150
- ```typescript
151
- interface SdNpmPublishConfig {
152
- type: "npm";
153
- }
154
- ```
155
-
156
- ### SdLocalDirectoryPublishConfig
157
-
158
- ```typescript
159
- interface SdLocalDirectoryPublishConfig {
160
- type: "local-directory";
161
- path: string; // %VER%, %PROJECT% 치환 지원
162
- }
163
- ```
164
-
165
- ### SdStoragePublishConfig
166
-
167
- ```typescript
168
- interface SdStoragePublishConfig {
169
- type: "ftp" | "ftps" | "sftp";
170
- host: string;
171
- port?: number;
172
- path?: string;
173
- user?: string;
174
- password?: string; // 미지정 시 SSH 키 인증 사용 (SFTP)
175
- }
176
- ```
177
-
178
- ### SdPostPublishScriptConfig
179
-
180
- ```typescript
181
- interface SdPostPublishScriptConfig {
182
- type: "script";
183
- cmd: string;
184
- args: string[]; // %VER%, %PROJECT% 치환 지원
185
- }
186
- ```
187
-
188
- ## Capacitor 설정
189
-
190
- ### SdCapacitorConfig
191
-
192
- ```typescript
193
- interface SdCapacitorConfig {
194
- appId: string; // 예: "com.example.app"
195
- appName: string;
196
- plugins?: Record<string, Record<string, unknown> | true>;
197
- icon?: string; // 패키지 디렉토리 기준 상대 경로
198
- debug?: boolean;
199
- platform?: {
200
- android?: SdCapacitorAndroidConfig;
201
- };
202
- }
203
- ```
204
-
205
- ### SdCapacitorAndroidConfig
206
-
207
- ```typescript
208
- interface SdCapacitorAndroidConfig {
209
- config?: Record<string, string>; // AndroidManifest application 속성
210
- bundle?: boolean; // true: AAB, false: APK
211
- intentFilters?: SdCapacitorIntentFilter[];
212
- sign?: SdCapacitorSignConfig;
213
- sdkVersion?: number; // minSdk, targetSdk
214
- permissions?: SdCapacitorPermission[];
215
- }
216
- ```
217
-
218
- ### SdCapacitorSignConfig
219
-
220
- ```typescript
221
- interface SdCapacitorSignConfig {
222
- keystore: string; // 패키지 디렉토리 기준 상대 경로
223
- storePassword: string;
224
- alias: string;
225
- password: string;
226
- keystoreType?: string; // 기본값: "jks"
227
- }
228
- ```
229
-
230
- ### SdCapacitorPermission
231
-
232
- ```typescript
233
- interface SdCapacitorPermission {
234
- name: string; // 예: "CAMERA"
235
- maxSdkVersion?: number;
236
- ignore?: string; // tools:ignore 속성
237
- }
238
- ```
239
-
240
- ### SdCapacitorIntentFilter
241
-
242
- ```typescript
243
- interface SdCapacitorIntentFilter {
244
- action?: string; // 예: "android.intent.action.VIEW"
245
- category?: string; // 예: "android.intent.category.DEFAULT"
246
- }
247
- ```
248
-
249
- ## Electron 설정
250
-
251
- ### SdElectronConfig
252
-
253
- ```typescript
254
- interface SdElectronConfig {
255
- appId: string; // 예: "com.example.myapp"
256
- portable?: boolean; // true: portable .exe, false: NSIS 설치
257
- installerIcon?: string; // .ico 파일 경로
258
- reinstallDependencies?: string[]; // Electron에 포함할 npm 패키지
259
- postInstallScript?: string; // npm postinstall 스크립트
260
- nsisOptions?: Record<string, unknown>;
261
- env?: Record<string, string>; // electron-main.ts에서 사용할 환경 변수
262
- }
263
- ```