@simplysm/sd-cli 13.0.0-beta.46 → 13.0.0-beta.48
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 +3 -3
- package/dist/builders/BaseBuilder.js.map +0 -1
- package/dist/builders/DtsBuilder.js.map +0 -1
- package/dist/builders/LibraryBuilder.js.map +0 -1
- package/dist/builders/index.js.map +0 -1
- package/dist/builders/types.js.map +0 -1
- package/dist/capacitor/capacitor.js.map +0 -1
- package/dist/commands/add-client.js.map +0 -1
- package/dist/commands/add-server.js.map +0 -1
- package/dist/commands/build.js.map +0 -1
- package/dist/commands/dev.js.map +0 -1
- package/dist/commands/device.js.map +0 -1
- package/dist/commands/init.js.map +0 -1
- package/dist/commands/lint.js.map +0 -1
- package/dist/commands/publish.js.map +0 -1
- package/dist/commands/typecheck.js.map +0 -1
- package/dist/commands/watch.js.map +0 -1
- package/dist/electron/electron.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/infra/ResultCollector.js.map +0 -1
- package/dist/infra/SignalHandler.js.map +0 -1
- package/dist/infra/WorkerManager.js.map +0 -1
- package/dist/infra/index.js.map +0 -1
- package/dist/orchestrators/WatchOrchestrator.js.map +0 -1
- package/dist/orchestrators/index.js.map +0 -1
- package/dist/sd-cli.js.map +0 -1
- package/dist/sd-config.types.js.map +0 -1
- package/dist/utils/build-env.js.map +0 -1
- package/dist/utils/config-editor.js.map +0 -1
- package/dist/utils/copy-src.js.map +0 -1
- package/dist/utils/esbuild-config.d.ts +1 -0
- package/dist/utils/esbuild-config.d.ts.map +1 -1
- package/dist/utils/esbuild-config.js +2 -1
- package/dist/utils/esbuild-config.js.map +1 -2
- package/dist/utils/listr-manager.js.map +0 -1
- package/dist/utils/output-utils.js.map +0 -1
- package/dist/utils/package-utils.js.map +0 -1
- package/dist/utils/replace-deps.js.map +0 -1
- package/dist/utils/sd-config.js.map +0 -1
- package/dist/utils/spawn.js.map +0 -1
- package/dist/utils/tailwind-config-deps.js.map +0 -1
- package/dist/utils/template.js.map +0 -1
- package/dist/utils/tsconfig.js.map +0 -1
- package/dist/utils/typecheck-serialization.js.map +0 -1
- package/dist/utils/vite-config.js.map +0 -1
- package/dist/utils/worker-events.js.map +0 -1
- package/dist/workers/client.worker.js.map +0 -1
- package/dist/workers/dts.worker.js.map +0 -1
- package/dist/workers/library.worker.js.map +0 -1
- package/dist/workers/server-runtime.worker.js.map +0 -1
- package/dist/workers/server.worker.js.map +0 -1
- package/package.json +5 -4
- package/src/builders/BaseBuilder.ts +141 -0
- package/src/builders/DtsBuilder.ts +138 -0
- package/src/builders/LibraryBuilder.ts +161 -0
- package/src/builders/index.ts +4 -0
- package/src/builders/types.ts +55 -0
- package/src/capacitor/capacitor.ts +827 -0
- package/src/commands/add-client.ts +135 -0
- package/src/commands/add-server.ts +150 -0
- package/src/commands/build.ts +475 -0
- package/src/commands/dev.ts +602 -0
- package/src/commands/device.ts +151 -0
- package/src/commands/init.ts +104 -0
- package/src/commands/lint.ts +216 -0
- package/src/commands/publish.ts +836 -0
- package/src/commands/typecheck.ts +329 -0
- package/src/commands/watch.ts +38 -0
- package/src/electron/electron.ts +329 -0
- package/src/index.ts +1 -0
- package/src/infra/ResultCollector.ts +81 -0
- package/src/infra/SignalHandler.ts +52 -0
- package/src/infra/WorkerManager.ts +65 -0
- package/src/infra/index.ts +3 -0
- package/src/orchestrators/WatchOrchestrator.ts +211 -0
- package/src/orchestrators/index.ts +1 -0
- package/src/sd-cli.ts +307 -0
- package/src/sd-config.types.ts +271 -0
- package/src/utils/build-env.ts +12 -0
- package/src/utils/config-editor.ts +131 -0
- package/src/utils/copy-src.ts +60 -0
- package/src/utils/esbuild-config.ts +263 -0
- package/src/utils/listr-manager.ts +89 -0
- package/src/utils/output-utils.ts +61 -0
- package/src/utils/package-utils.ts +63 -0
- package/src/utils/replace-deps.ts +163 -0
- package/src/utils/sd-config.ts +44 -0
- package/src/utils/spawn.ts +79 -0
- package/src/utils/tailwind-config-deps.ts +95 -0
- package/src/utils/template.ts +51 -0
- package/src/utils/tsconfig.ts +111 -0
- package/src/utils/typecheck-serialization.ts +82 -0
- package/src/utils/vite-config.ts +184 -0
- package/src/utils/worker-events.ts +102 -0
- package/src/workers/client.worker.ts +236 -0
- package/src/workers/dts.worker.ts +416 -0
- package/src/workers/library.worker.ts +245 -0
- package/src/workers/server-runtime.worker.ts +154 -0
- package/src/workers/server.worker.ts +435 -0
- package/templates/add-client/__CLIENT__/package.json.hbs +1 -1
- package/templates/add-server/__SERVER__/package.json.hbs +2 -2
- package/templates/init/package.json.hbs +3 -3
package/src/sd-cli.ts
ADDED
|
@@ -0,0 +1,307 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// side-effect: Map/Array 프로토타입 확장 (getOrCreate 등)
|
|
4
|
+
import "@simplysm/core-common";
|
|
5
|
+
import yargs, { type Argv } from "yargs";
|
|
6
|
+
import { hideBin } from "yargs/helpers";
|
|
7
|
+
import { runLint } from "./commands/lint";
|
|
8
|
+
import { runTypecheck } from "./commands/typecheck";
|
|
9
|
+
import { runWatch } from "./commands/watch";
|
|
10
|
+
import { runDev } from "./commands/dev";
|
|
11
|
+
import { runBuild } from "./commands/build";
|
|
12
|
+
import { runPublish } from "./commands/publish";
|
|
13
|
+
import { runDevice } from "./commands/device";
|
|
14
|
+
import path from "path";
|
|
15
|
+
import fs from "fs";
|
|
16
|
+
import { fileURLToPath } from "url";
|
|
17
|
+
import { EventEmitter } from "node:events";
|
|
18
|
+
import { consola, LogLevels } from "consola";
|
|
19
|
+
|
|
20
|
+
Error.stackTraceLimit = Infinity;
|
|
21
|
+
EventEmitter.defaultMaxListeners = 100;
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* CLI 파서를 생성한다.
|
|
25
|
+
* @internal 테스트용으로 export
|
|
26
|
+
*/
|
|
27
|
+
export function createCliParser(argv: string[]): Argv {
|
|
28
|
+
return yargs(argv)
|
|
29
|
+
.help("help", "도움말")
|
|
30
|
+
.alias("help", "h")
|
|
31
|
+
.option("debug", {
|
|
32
|
+
type: "boolean",
|
|
33
|
+
describe: "debug 로그 출력",
|
|
34
|
+
default: false,
|
|
35
|
+
global: true,
|
|
36
|
+
})
|
|
37
|
+
.middleware((args) => {
|
|
38
|
+
if (args.debug) consola.level = LogLevels.debug;
|
|
39
|
+
})
|
|
40
|
+
.command(
|
|
41
|
+
"lint [targets..]",
|
|
42
|
+
"ESLint를 실행한다.",
|
|
43
|
+
(cmd) =>
|
|
44
|
+
cmd
|
|
45
|
+
.version(false)
|
|
46
|
+
.hide("help")
|
|
47
|
+
.positional("targets", {
|
|
48
|
+
type: "string",
|
|
49
|
+
array: true,
|
|
50
|
+
describe: "린트할 경로 (예: packages/core-common, tests/orm)",
|
|
51
|
+
default: [],
|
|
52
|
+
})
|
|
53
|
+
.options({
|
|
54
|
+
fix: {
|
|
55
|
+
type: "boolean",
|
|
56
|
+
describe: "자동 수정",
|
|
57
|
+
default: false,
|
|
58
|
+
},
|
|
59
|
+
timing: {
|
|
60
|
+
type: "boolean",
|
|
61
|
+
describe: "규칙별 실행 시간 출력",
|
|
62
|
+
default: false,
|
|
63
|
+
},
|
|
64
|
+
}),
|
|
65
|
+
async (args) => {
|
|
66
|
+
await runLint({
|
|
67
|
+
targets: args.targets,
|
|
68
|
+
fix: args.fix,
|
|
69
|
+
timing: args.timing,
|
|
70
|
+
});
|
|
71
|
+
},
|
|
72
|
+
)
|
|
73
|
+
.command(
|
|
74
|
+
"typecheck [targets..]",
|
|
75
|
+
"TypeScript 타입체크를 실행한다.",
|
|
76
|
+
(cmd) =>
|
|
77
|
+
cmd
|
|
78
|
+
.version(false)
|
|
79
|
+
.hide("help")
|
|
80
|
+
.positional("targets", {
|
|
81
|
+
type: "string",
|
|
82
|
+
array: true,
|
|
83
|
+
describe: "타입체크할 경로 (예: packages/core-common, tests/orm)",
|
|
84
|
+
default: [],
|
|
85
|
+
})
|
|
86
|
+
.options({
|
|
87
|
+
options: {
|
|
88
|
+
type: "string",
|
|
89
|
+
array: true,
|
|
90
|
+
alias: "o",
|
|
91
|
+
description: "sd.config.ts에 전달할 옵션 (예: -o key=value)",
|
|
92
|
+
default: [] as string[],
|
|
93
|
+
},
|
|
94
|
+
}),
|
|
95
|
+
async (args) => {
|
|
96
|
+
await runTypecheck({
|
|
97
|
+
targets: args.targets,
|
|
98
|
+
options: args.options,
|
|
99
|
+
});
|
|
100
|
+
},
|
|
101
|
+
)
|
|
102
|
+
.command(
|
|
103
|
+
"watch [targets..]",
|
|
104
|
+
"패키지를 watch 모드로 빌드한다.",
|
|
105
|
+
(cmd) =>
|
|
106
|
+
cmd
|
|
107
|
+
.version(false)
|
|
108
|
+
.hide("help")
|
|
109
|
+
.positional("targets", {
|
|
110
|
+
type: "string",
|
|
111
|
+
array: true,
|
|
112
|
+
describe: "watch할 패키지 (예: solid, solid-demo)",
|
|
113
|
+
default: [],
|
|
114
|
+
})
|
|
115
|
+
.options({
|
|
116
|
+
options: {
|
|
117
|
+
type: "string",
|
|
118
|
+
array: true,
|
|
119
|
+
alias: "o",
|
|
120
|
+
description: "sd.config.ts에 전달할 옵션 (예: -o key=value)",
|
|
121
|
+
default: [] as string[],
|
|
122
|
+
},
|
|
123
|
+
}),
|
|
124
|
+
async (args) => {
|
|
125
|
+
await runWatch({
|
|
126
|
+
targets: args.targets,
|
|
127
|
+
options: args.options,
|
|
128
|
+
});
|
|
129
|
+
},
|
|
130
|
+
)
|
|
131
|
+
.command(
|
|
132
|
+
"dev [targets..]",
|
|
133
|
+
"Client와 Server 패키지를 개발 모드로 실행한다.",
|
|
134
|
+
(cmd) =>
|
|
135
|
+
cmd
|
|
136
|
+
.version(false)
|
|
137
|
+
.hide("help")
|
|
138
|
+
.positional("targets", {
|
|
139
|
+
type: "string",
|
|
140
|
+
array: true,
|
|
141
|
+
describe: "실행할 패키지 (예: solid-demo)",
|
|
142
|
+
default: [],
|
|
143
|
+
})
|
|
144
|
+
.options({
|
|
145
|
+
options: {
|
|
146
|
+
type: "string",
|
|
147
|
+
array: true,
|
|
148
|
+
alias: "o",
|
|
149
|
+
description: "sd.config.ts에 전달할 옵션 (예: -o key=value)",
|
|
150
|
+
default: [] as string[],
|
|
151
|
+
},
|
|
152
|
+
}),
|
|
153
|
+
async (args) => {
|
|
154
|
+
await runDev({
|
|
155
|
+
targets: args.targets,
|
|
156
|
+
options: args.options,
|
|
157
|
+
});
|
|
158
|
+
},
|
|
159
|
+
)
|
|
160
|
+
.command(
|
|
161
|
+
"build [targets..]",
|
|
162
|
+
"프로덕션 빌드를 실행한다.",
|
|
163
|
+
(cmd) =>
|
|
164
|
+
cmd
|
|
165
|
+
.version(false)
|
|
166
|
+
.hide("help")
|
|
167
|
+
.positional("targets", {
|
|
168
|
+
type: "string",
|
|
169
|
+
array: true,
|
|
170
|
+
describe: "빌드할 패키지 (예: solid, core-common)",
|
|
171
|
+
default: [],
|
|
172
|
+
})
|
|
173
|
+
.options({
|
|
174
|
+
options: {
|
|
175
|
+
type: "string",
|
|
176
|
+
array: true,
|
|
177
|
+
alias: "o",
|
|
178
|
+
description: "sd.config.ts에 전달할 옵션 (예: -o key=value)",
|
|
179
|
+
default: [] as string[],
|
|
180
|
+
},
|
|
181
|
+
}),
|
|
182
|
+
async (args) => {
|
|
183
|
+
await runBuild({
|
|
184
|
+
targets: args.targets,
|
|
185
|
+
options: args.options,
|
|
186
|
+
});
|
|
187
|
+
},
|
|
188
|
+
)
|
|
189
|
+
.command(
|
|
190
|
+
"device",
|
|
191
|
+
"Android 디바이스에서 앱을 실행한다.",
|
|
192
|
+
(cmd) =>
|
|
193
|
+
cmd
|
|
194
|
+
.version(false)
|
|
195
|
+
.hide("help")
|
|
196
|
+
.options({
|
|
197
|
+
package: {
|
|
198
|
+
type: "string",
|
|
199
|
+
alias: "p",
|
|
200
|
+
describe: "패키지 이름",
|
|
201
|
+
demandOption: true,
|
|
202
|
+
},
|
|
203
|
+
url: {
|
|
204
|
+
type: "string",
|
|
205
|
+
alias: "u",
|
|
206
|
+
describe: "개발 서버 URL (미지정 시 sd.config.ts의 server 설정 사용)",
|
|
207
|
+
},
|
|
208
|
+
options: {
|
|
209
|
+
type: "string",
|
|
210
|
+
array: true,
|
|
211
|
+
alias: "o",
|
|
212
|
+
description: "sd.config.ts에 전달할 옵션 (예: -o key=value)",
|
|
213
|
+
default: [] as string[],
|
|
214
|
+
},
|
|
215
|
+
}),
|
|
216
|
+
async (args) => {
|
|
217
|
+
await runDevice({
|
|
218
|
+
package: args.package,
|
|
219
|
+
url: args.url,
|
|
220
|
+
options: args.options,
|
|
221
|
+
});
|
|
222
|
+
},
|
|
223
|
+
)
|
|
224
|
+
.command(
|
|
225
|
+
"init",
|
|
226
|
+
"새 프로젝트를 초기화한다.",
|
|
227
|
+
(cmd) => cmd.version(false).hide("help"),
|
|
228
|
+
async () => {
|
|
229
|
+
const { runInit } = await import("./commands/init.js");
|
|
230
|
+
await runInit({});
|
|
231
|
+
},
|
|
232
|
+
)
|
|
233
|
+
.command("add", "프로젝트에 패키지를 추가한다.", (cmd) =>
|
|
234
|
+
cmd
|
|
235
|
+
.version(false)
|
|
236
|
+
.hide("help")
|
|
237
|
+
.command(
|
|
238
|
+
"client",
|
|
239
|
+
"클라이언트 패키지를 추가한다.",
|
|
240
|
+
(subCmd) => subCmd.version(false).hide("help"),
|
|
241
|
+
async () => {
|
|
242
|
+
const { runAddClient } = await import("./commands/add-client.js");
|
|
243
|
+
await runAddClient({});
|
|
244
|
+
},
|
|
245
|
+
)
|
|
246
|
+
.command(
|
|
247
|
+
"server",
|
|
248
|
+
"서버 패키지를 추가한다.",
|
|
249
|
+
(subCmd) => subCmd.version(false).hide("help"),
|
|
250
|
+
async () => {
|
|
251
|
+
const { runAddServer } = await import("./commands/add-server.js");
|
|
252
|
+
await runAddServer({});
|
|
253
|
+
},
|
|
254
|
+
)
|
|
255
|
+
.demandCommand(1, "패키지 타입을 지정해주세요. (client, server)"),
|
|
256
|
+
)
|
|
257
|
+
.command(
|
|
258
|
+
"publish [targets..]",
|
|
259
|
+
"패키지를 배포한다.",
|
|
260
|
+
(cmd) =>
|
|
261
|
+
cmd
|
|
262
|
+
.version(false)
|
|
263
|
+
.hide("help")
|
|
264
|
+
.positional("targets", {
|
|
265
|
+
type: "string",
|
|
266
|
+
array: true,
|
|
267
|
+
describe: "배포할 패키지 (예: solid, core-common)",
|
|
268
|
+
default: [],
|
|
269
|
+
})
|
|
270
|
+
.options({
|
|
271
|
+
"build": {
|
|
272
|
+
type: "boolean",
|
|
273
|
+
describe: "빌드 실행 (--no-build로 스킵)",
|
|
274
|
+
default: true,
|
|
275
|
+
},
|
|
276
|
+
"dry-run": {
|
|
277
|
+
type: "boolean",
|
|
278
|
+
describe: "실제 배포 없이 시뮬레이션",
|
|
279
|
+
default: false,
|
|
280
|
+
},
|
|
281
|
+
"options": {
|
|
282
|
+
type: "string",
|
|
283
|
+
array: true,
|
|
284
|
+
alias: "o",
|
|
285
|
+
description: "sd.config.ts에 전달할 옵션 (예: -o key=value)",
|
|
286
|
+
default: [] as string[],
|
|
287
|
+
},
|
|
288
|
+
}),
|
|
289
|
+
async (args) => {
|
|
290
|
+
await runPublish({
|
|
291
|
+
targets: args.targets,
|
|
292
|
+
noBuild: !args.build,
|
|
293
|
+
dryRun: args.dryRun,
|
|
294
|
+
options: args.options,
|
|
295
|
+
});
|
|
296
|
+
},
|
|
297
|
+
)
|
|
298
|
+
.demandCommand(1, "명령어를 지정해주세요.")
|
|
299
|
+
.strict();
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
// CLI로 직접 실행될 때만 파싱 수행
|
|
303
|
+
// ESM에서 메인 모듈 판별: import.meta.url과 process.argv[1]을 정규화하여 비교
|
|
304
|
+
const cliEntryPath = process.argv.at(1);
|
|
305
|
+
if (cliEntryPath != null && fileURLToPath(import.meta.url) === fs.realpathSync(path.resolve(cliEntryPath))) {
|
|
306
|
+
await createCliParser(hideBin(process.argv)).parse();
|
|
307
|
+
}
|
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 빌드 타겟 유형 (esbuild로 빌드)
|
|
3
|
+
* - node: Node.js 전용 패키지
|
|
4
|
+
* - browser: 브라우저 전용 패키지
|
|
5
|
+
* - neutral: Node/브라우저 공용 패키지
|
|
6
|
+
*/
|
|
7
|
+
export type BuildTarget = "node" | "browser" | "neutral";
|
|
8
|
+
|
|
9
|
+
//#region Publish 설정 타입
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* 패키지 publish 설정
|
|
13
|
+
* - "npm": npm 레지스트리에 배포
|
|
14
|
+
* - SdLocalDirectoryPublishConfig: 로컬 디렉토리에 복사
|
|
15
|
+
* - SdStoragePublishConfig: FTP/FTPS/SFTP 서버에 업로드
|
|
16
|
+
*/
|
|
17
|
+
export type SdPublishConfig = "npm" | SdLocalDirectoryPublishConfig | SdStoragePublishConfig;
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* 로컬 디렉토리 publish 설정
|
|
21
|
+
*/
|
|
22
|
+
export interface SdLocalDirectoryPublishConfig {
|
|
23
|
+
type: "local-directory";
|
|
24
|
+
/** 배포 대상 경로 (환경변수 치환 지원: %VER%, %PROJECT%) */
|
|
25
|
+
path: string;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* 스토리지 (FTP/FTPS/SFTP) publish 설정
|
|
30
|
+
*/
|
|
31
|
+
export interface SdStoragePublishConfig {
|
|
32
|
+
type: "ftp" | "ftps" | "sftp";
|
|
33
|
+
host: string;
|
|
34
|
+
port?: number;
|
|
35
|
+
path?: string;
|
|
36
|
+
user?: string;
|
|
37
|
+
pass?: string;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* postPublish 스크립트 설정
|
|
42
|
+
*/
|
|
43
|
+
export interface SdPostPublishScriptConfig {
|
|
44
|
+
type: "script";
|
|
45
|
+
cmd: string;
|
|
46
|
+
/** 스크립트 인자 (환경변수 치환 지원: %VER%, %PROJECT%) */
|
|
47
|
+
args: string[];
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
//#endregion
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* 패키지 설정 (node/browser/neutral)
|
|
54
|
+
*/
|
|
55
|
+
export interface SdBuildPackageConfig {
|
|
56
|
+
/** 빌드 타겟 */
|
|
57
|
+
target: BuildTarget;
|
|
58
|
+
/** publish 설정 */
|
|
59
|
+
publish?: SdPublishConfig;
|
|
60
|
+
/** src/에서 dist/로 복사할 파일 glob 패턴 (src/ 기준 상대 경로) */
|
|
61
|
+
copySrc?: string[];
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Capacitor Android 서명 설정
|
|
66
|
+
*/
|
|
67
|
+
export interface SdCapacitorSignConfig {
|
|
68
|
+
/** keystore 파일 경로 (패키지 디렉토리 기준 상대경로) */
|
|
69
|
+
keystore: string;
|
|
70
|
+
/** keystore 비밀번호 */
|
|
71
|
+
storePassword: string;
|
|
72
|
+
/** 키 별칭 */
|
|
73
|
+
alias: string;
|
|
74
|
+
/** 키 비밀번호 */
|
|
75
|
+
password: string;
|
|
76
|
+
/** keystore 타입 (기본값: "jks") */
|
|
77
|
+
keystoreType?: string;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Capacitor Android 권한 설정
|
|
82
|
+
*/
|
|
83
|
+
export interface SdCapacitorPermission {
|
|
84
|
+
/** 권한 이름 (예: "CAMERA", "WRITE_EXTERNAL_STORAGE") */
|
|
85
|
+
name: string;
|
|
86
|
+
/** 최대 SDK 버전 */
|
|
87
|
+
maxSdkVersion?: number;
|
|
88
|
+
/** tools:ignore 속성 값 */
|
|
89
|
+
ignore?: string;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Capacitor Android Intent Filter 설정
|
|
94
|
+
*/
|
|
95
|
+
export interface SdCapacitorIntentFilter {
|
|
96
|
+
/** intent action (예: "android.intent.action.VIEW") */
|
|
97
|
+
action?: string;
|
|
98
|
+
/** intent category (예: "android.intent.category.DEFAULT") */
|
|
99
|
+
category?: string;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Capacitor Android 플랫폼 설정
|
|
104
|
+
*/
|
|
105
|
+
export interface SdCapacitorAndroidConfig {
|
|
106
|
+
/** AndroidManifest.xml application 태그 속성 (예: { requestLegacyExternalStorage: "true" }) */
|
|
107
|
+
config?: Record<string, string>;
|
|
108
|
+
/** AAB 번들 빌드 여부 (false면 APK) */
|
|
109
|
+
bundle?: boolean;
|
|
110
|
+
/** Intent Filter 설정 */
|
|
111
|
+
intentFilters?: SdCapacitorIntentFilter[];
|
|
112
|
+
/** APK/AAB 서명 설정 */
|
|
113
|
+
sign?: SdCapacitorSignConfig;
|
|
114
|
+
/** Android SDK 버전 (minSdk, targetSdk) */
|
|
115
|
+
sdkVersion?: number;
|
|
116
|
+
/** 추가 권한 설정 */
|
|
117
|
+
permissions?: SdCapacitorPermission[];
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Capacitor 설정
|
|
122
|
+
*/
|
|
123
|
+
export interface SdCapacitorConfig {
|
|
124
|
+
/** 앱 ID (예: "com.example.app") */
|
|
125
|
+
appId: string;
|
|
126
|
+
/** 앱 이름 */
|
|
127
|
+
appName: string;
|
|
128
|
+
/** Capacitor 플러그인 설정 (키: 패키지명, 값: true 또는 플러그인 옵션) */
|
|
129
|
+
plugins?: Record<string, Record<string, unknown> | true>;
|
|
130
|
+
/** 앱 아이콘 경로 (패키지 디렉토리 기준 상대경로) */
|
|
131
|
+
icon?: string;
|
|
132
|
+
/** 디버그 빌드 여부 */
|
|
133
|
+
debug?: boolean;
|
|
134
|
+
/** 플랫폼별 설정 */
|
|
135
|
+
platform?: {
|
|
136
|
+
android?: SdCapacitorAndroidConfig;
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* Electron 설정
|
|
142
|
+
*/
|
|
143
|
+
export interface SdElectronConfig {
|
|
144
|
+
/** Electron 앱 ID (예: "com.example.myapp") */
|
|
145
|
+
appId: string;
|
|
146
|
+
/** portable .exe (true) 또는 NSIS 인스톨러 (false/미지정) */
|
|
147
|
+
portable?: boolean;
|
|
148
|
+
/** 인스톨러 아이콘 경로 (.ico, 패키지 디렉토리 기준 상대경로) */
|
|
149
|
+
installerIcon?: string;
|
|
150
|
+
/** Electron에 포함할 npm 패키지 (native 모듈 등) */
|
|
151
|
+
reinstallDependencies?: string[];
|
|
152
|
+
/** npm postinstall 스크립트 */
|
|
153
|
+
postInstallScript?: string;
|
|
154
|
+
/** NSIS 옵션 (portable이 아닌 경우) */
|
|
155
|
+
nsisOptions?: Record<string, unknown>;
|
|
156
|
+
/** 환경변수 (electron-main.ts에서 process.env로 접근) */
|
|
157
|
+
env?: Record<string, string>;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
* 클라이언트 패키지 설정 (Vite 개발 서버)
|
|
162
|
+
*/
|
|
163
|
+
export interface SdClientPackageConfig {
|
|
164
|
+
/** 빌드 타겟 */
|
|
165
|
+
target: "client";
|
|
166
|
+
/**
|
|
167
|
+
* 서버 설정
|
|
168
|
+
* - string: 연결할 서버 패키지명 (예: "solid-demo-server")
|
|
169
|
+
* - number: Vite 직접 포트 사용 (하위 호환성)
|
|
170
|
+
*/
|
|
171
|
+
server: string | number;
|
|
172
|
+
/** 빌드 시 치환할 환경변수 (process.env를 객체로 치환) */
|
|
173
|
+
env?: Record<string, string>;
|
|
174
|
+
/** publish 설정 */
|
|
175
|
+
publish?: SdPublishConfig;
|
|
176
|
+
/** Capacitor 설정 */
|
|
177
|
+
capacitor?: SdCapacitorConfig;
|
|
178
|
+
/** Electron 설정 */
|
|
179
|
+
electron?: SdElectronConfig;
|
|
180
|
+
/** runtime config (written to dist/.config.json during build) */
|
|
181
|
+
configs?: Record<string, unknown>;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* 서버 패키지 설정 (Fastify 서버)
|
|
186
|
+
*/
|
|
187
|
+
export interface SdServerPackageConfig {
|
|
188
|
+
/** 빌드 타겟 */
|
|
189
|
+
target: "server";
|
|
190
|
+
/** 빌드 시 치환할 환경변수 (process.env.KEY를 상수로 치환) */
|
|
191
|
+
env?: Record<string, string>;
|
|
192
|
+
/** publish 설정 */
|
|
193
|
+
publish?: SdPublishConfig;
|
|
194
|
+
/** runtime config (written to dist/.config.json during build) */
|
|
195
|
+
configs?: Record<string, unknown>;
|
|
196
|
+
/** esbuild에서 번들에 포함하지 않을 외부 모듈 (binding.gyp 자동 감지에 더해 수동 지정) */
|
|
197
|
+
externals?: string[];
|
|
198
|
+
/** PM2 설정 (지정 시 dist/pm2.config.cjs 생성) */
|
|
199
|
+
pm2?: {
|
|
200
|
+
/** PM2 프로세스 이름 (미지정 시 package.json name에서 생성) */
|
|
201
|
+
name?: string;
|
|
202
|
+
/** PM2 watch에서 제외할 경로 */
|
|
203
|
+
ignoreWatchPaths?: string[];
|
|
204
|
+
};
|
|
205
|
+
/** Package manager to use (affects mise.toml or volta settings generation) */
|
|
206
|
+
packageManager?: "volta" | "mise";
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
/**
|
|
210
|
+
* 스크립트 전용 패키지 설정 (watch/typecheck 제외)
|
|
211
|
+
*/
|
|
212
|
+
export interface SdScriptsPackageConfig {
|
|
213
|
+
/** 빌드 타겟 */
|
|
214
|
+
target: "scripts";
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
/**
|
|
218
|
+
* 패키지 설정
|
|
219
|
+
*/
|
|
220
|
+
export type SdPackageConfig =
|
|
221
|
+
| SdBuildPackageConfig
|
|
222
|
+
| SdClientPackageConfig
|
|
223
|
+
| SdServerPackageConfig
|
|
224
|
+
| SdScriptsPackageConfig;
|
|
225
|
+
|
|
226
|
+
/**
|
|
227
|
+
* sd.config.ts 설정 타입
|
|
228
|
+
*/
|
|
229
|
+
export interface SdConfig {
|
|
230
|
+
/** 패키지별 설정 (키: packages/ 하위 디렉토리 이름, 예: "core-common") */
|
|
231
|
+
packages: Record<string, SdPackageConfig | undefined>;
|
|
232
|
+
/**
|
|
233
|
+
* 의존성 교체 설정 (node_modules 패키지를 로컬 소스로 symlink 교체)
|
|
234
|
+
* - 키: node_modules에서 찾을 패키지 glob 패턴 (예: "@simplysm/*")
|
|
235
|
+
* - 값: 소스 디렉토리 경로 (키의 * 캡처값이 값의 *에 치환됨)
|
|
236
|
+
* - 예: { "@simplysm/*": "../simplysm/packages/*" }
|
|
237
|
+
*/
|
|
238
|
+
replaceDeps?: Record<string, string>;
|
|
239
|
+
/** 배포 완료 후 실행할 스크립트 */
|
|
240
|
+
postPublish?: SdPostPublishScriptConfig[];
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
/**
|
|
244
|
+
* sd.config.ts 함수에 전달되는 파라미터
|
|
245
|
+
*/
|
|
246
|
+
export interface SdConfigParams {
|
|
247
|
+
/** 현재 작업 디렉토리 */
|
|
248
|
+
cwd: string;
|
|
249
|
+
/** 개발 모드 여부 */
|
|
250
|
+
dev: boolean;
|
|
251
|
+
/** 추가 옵션 (CLI의 -o 플래그) */
|
|
252
|
+
opt: string[];
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
/**
|
|
256
|
+
* sd.config.ts는 다음과 같은 형태의 함수를 default export해야 한다:
|
|
257
|
+
*
|
|
258
|
+
* ```typescript
|
|
259
|
+
* import type { SdConfig, SdConfigFn, SdConfigParams } from "@simplysm/sd-cli";
|
|
260
|
+
*
|
|
261
|
+
* const config: SdConfigFn = (params: SdConfigParams) => ({
|
|
262
|
+
* packages: {
|
|
263
|
+
* "core-common": { target: "neutral" },
|
|
264
|
+
* "core-node": { target: "node" },
|
|
265
|
+
* },
|
|
266
|
+
* });
|
|
267
|
+
*
|
|
268
|
+
* export default config;
|
|
269
|
+
* ```
|
|
270
|
+
*/
|
|
271
|
+
export type SdConfigFn = (params: SdConfigParams) => SdConfig | Promise<SdConfig>;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import path from "path";
|
|
2
|
+
import fs from "fs/promises";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* 루트 package.json에서 version 가져오기
|
|
6
|
+
*/
|
|
7
|
+
export async function getVersion(cwd: string): Promise<string> {
|
|
8
|
+
const pkgJsonPath = path.join(cwd, "package.json");
|
|
9
|
+
const pkgJsonContent = await fs.readFile(pkgJsonPath, "utf-8");
|
|
10
|
+
const pkgJson = JSON.parse(pkgJsonContent) as { version?: string };
|
|
11
|
+
return pkgJson.version ?? "0.0.0";
|
|
12
|
+
}
|