@simplysm/sd-cli 13.0.7 → 13.0.10

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/dist/sd-cli.js CHANGED
@@ -1,266 +1,62 @@
1
1
  #!/usr/bin/env node
2
- import "@simplysm/core-common";
3
- import yargs, {} from "yargs";
4
- import { hideBin } from "yargs/helpers";
5
- import { runLint } from "./commands/lint.js";
6
- import { runTypecheck } from "./commands/typecheck.js";
7
- import { runWatch } from "./commands/watch.js";
8
- import { runDev } from "./commands/dev.js";
9
- import { runBuild } from "./commands/build.js";
10
- import { runPublish } from "./commands/publish.js";
11
- import { runReplaceDeps } from "./commands/replace-deps.js";
12
- import { runDevice } from "./commands/device.js";
2
+ import { exec, spawn } from "child_process";
3
+ import os from "os";
13
4
  import path from "path";
14
- import fs from "fs";
15
5
  import { fileURLToPath } from "url";
16
- import { EventEmitter } from "node:events";
17
- import { consola, LogLevels } from "consola";
18
- Error.stackTraceLimit = Infinity;
19
- EventEmitter.defaultMaxListeners = 100;
20
- function createCliParser(argv) {
21
- return yargs(argv).help("help", "\uB3C4\uC6C0\uB9D0").alias("help", "h").option("debug", {
22
- type: "boolean",
23
- describe: "debug \uB85C\uADF8 \uCD9C\uB825",
24
- default: false,
25
- global: true
26
- }).middleware((args) => {
27
- if (args.debug) consola.level = LogLevels.debug;
28
- }).command(
29
- "lint [targets..]",
30
- "ESLint + Stylelint\uB97C \uC2E4\uD589\uD55C\uB2E4.",
31
- (cmd) => cmd.version(false).hide("help").positional("targets", {
32
- type: "string",
33
- array: true,
34
- describe: "\uB9B0\uD2B8\uD560 \uACBD\uB85C (\uC608: packages/core-common, tests/orm)",
35
- default: []
36
- }).options({
37
- fix: {
38
- type: "boolean",
39
- describe: "\uC790\uB3D9 \uC218\uC815",
40
- default: false
41
- },
42
- timing: {
43
- type: "boolean",
44
- describe: "\uADDC\uCE59\uBCC4 \uC2E4\uD589 \uC2DC\uAC04 \uCD9C\uB825",
45
- default: false
46
- }
47
- }),
48
- async (args) => {
49
- await runLint({
50
- targets: args.targets,
51
- fix: args.fix,
52
- timing: args.timing
53
- });
54
- }
55
- ).command(
56
- "typecheck [targets..]",
57
- "TypeScript \uD0C0\uC785\uCCB4\uD06C\uB97C \uC2E4\uD589\uD55C\uB2E4.",
58
- (cmd) => cmd.version(false).hide("help").positional("targets", {
59
- type: "string",
60
- array: true,
61
- describe: "\uD0C0\uC785\uCCB4\uD06C\uD560 \uACBD\uB85C (\uC608: packages/core-common, tests/orm)",
62
- default: []
63
- }).options({
64
- options: {
65
- type: "string",
66
- array: true,
67
- alias: "o",
68
- description: "sd.config.ts\uC5D0 \uC804\uB2EC\uD560 \uC635\uC158 (\uC608: -o key=value)",
69
- default: []
70
- }
71
- }),
72
- async (args) => {
73
- await runTypecheck({
74
- targets: args.targets,
75
- options: args.options
76
- });
77
- }
78
- ).command(
79
- "watch [targets..]",
80
- "\uD328\uD0A4\uC9C0\uB97C watch \uBAA8\uB4DC\uB85C \uBE4C\uB4DC\uD55C\uB2E4.",
81
- (cmd) => cmd.version(false).hide("help").positional("targets", {
82
- type: "string",
83
- array: true,
84
- describe: "watch\uD560 \uD328\uD0A4\uC9C0 (\uC608: solid, solid-demo)",
85
- default: []
86
- }).options({
87
- options: {
88
- type: "string",
89
- array: true,
90
- alias: "o",
91
- description: "sd.config.ts\uC5D0 \uC804\uB2EC\uD560 \uC635\uC158 (\uC608: -o key=value)",
92
- default: []
93
- }
94
- }),
95
- async (args) => {
96
- await runWatch({
97
- targets: args.targets,
98
- options: args.options
99
- });
100
- }
101
- ).command(
102
- "dev [targets..]",
103
- "Client\uC640 Server \uD328\uD0A4\uC9C0\uB97C \uAC1C\uBC1C \uBAA8\uB4DC\uB85C \uC2E4\uD589\uD55C\uB2E4.",
104
- (cmd) => cmd.version(false).hide("help").positional("targets", {
105
- type: "string",
106
- array: true,
107
- describe: "\uC2E4\uD589\uD560 \uD328\uD0A4\uC9C0 (\uC608: solid-demo)",
108
- default: []
109
- }).options({
110
- options: {
111
- type: "string",
112
- array: true,
113
- alias: "o",
114
- description: "sd.config.ts\uC5D0 \uC804\uB2EC\uD560 \uC635\uC158 (\uC608: -o key=value)",
115
- default: []
116
- }
117
- }),
118
- async (args) => {
119
- await runDev({
120
- targets: args.targets,
121
- options: args.options
122
- });
123
- }
124
- ).command(
125
- "build [targets..]",
126
- "\uD504\uB85C\uB355\uC158 \uBE4C\uB4DC\uB97C \uC2E4\uD589\uD55C\uB2E4.",
127
- (cmd) => cmd.version(false).hide("help").positional("targets", {
128
- type: "string",
129
- array: true,
130
- describe: "\uBE4C\uB4DC\uD560 \uD328\uD0A4\uC9C0 (\uC608: solid, core-common)",
131
- default: []
132
- }).options({
133
- options: {
134
- type: "string",
135
- array: true,
136
- alias: "o",
137
- description: "sd.config.ts\uC5D0 \uC804\uB2EC\uD560 \uC635\uC158 (\uC608: -o key=value)",
138
- default: []
139
- }
140
- }),
141
- async (args) => {
142
- await runBuild({
143
- targets: args.targets,
144
- options: args.options
145
- });
146
- }
147
- ).command(
148
- "device",
149
- "Android \uB514\uBC14\uC774\uC2A4\uC5D0\uC11C \uC571\uC744 \uC2E4\uD589\uD55C\uB2E4.",
150
- (cmd) => cmd.version(false).hide("help").options({
151
- package: {
152
- type: "string",
153
- alias: "p",
154
- describe: "\uD328\uD0A4\uC9C0 \uC774\uB984",
155
- demandOption: true
156
- },
157
- url: {
158
- type: "string",
159
- alias: "u",
160
- describe: "\uAC1C\uBC1C \uC11C\uBC84 URL (\uBBF8\uC9C0\uC815 \uC2DC sd.config.ts\uC758 server \uC124\uC815 \uC0AC\uC6A9)"
161
- },
162
- options: {
163
- type: "string",
164
- array: true,
165
- alias: "o",
166
- description: "sd.config.ts\uC5D0 \uC804\uB2EC\uD560 \uC635\uC158 (\uC608: -o key=value)",
167
- default: []
168
- }
169
- }),
170
- async (args) => {
171
- await runDevice({
172
- package: args.package,
173
- url: args.url,
174
- options: args.options
175
- });
176
- }
177
- ).command(
178
- "init",
179
- "\uC0C8 \uD504\uB85C\uC81D\uD2B8\uB97C \uCD08\uAE30\uD654\uD55C\uB2E4.",
180
- (cmd) => cmd.version(false).hide("help"),
181
- async () => {
182
- const { runInit } = await import("./commands/init.js");
183
- await runInit({});
184
- }
185
- ).command(
186
- "add",
187
- "\uD504\uB85C\uC81D\uD2B8\uC5D0 \uD328\uD0A4\uC9C0\uB97C \uCD94\uAC00\uD55C\uB2E4.",
188
- (cmd) => cmd.version(false).hide("help").command(
189
- "client",
190
- "\uD074\uB77C\uC774\uC5B8\uD2B8 \uD328\uD0A4\uC9C0\uB97C \uCD94\uAC00\uD55C\uB2E4.",
191
- (subCmd) => subCmd.version(false).hide("help"),
192
- async () => {
193
- const { runAddClient } = await import("./commands/add-client.js");
194
- await runAddClient({});
195
- }
196
- ).command(
197
- "server",
198
- "\uC11C\uBC84 \uD328\uD0A4\uC9C0\uB97C \uCD94\uAC00\uD55C\uB2E4.",
199
- (subCmd) => subCmd.version(false).hide("help"),
200
- async () => {
201
- const { runAddServer } = await import("./commands/add-server.js");
202
- await runAddServer({});
203
- }
204
- ).demandCommand(1, "\uD328\uD0A4\uC9C0 \uD0C0\uC785\uC744 \uC9C0\uC815\uD574\uC8FC\uC138\uC694. (client, server)")
205
- ).command(
206
- "publish [targets..]",
207
- "\uD328\uD0A4\uC9C0\uB97C \uBC30\uD3EC\uD55C\uB2E4.",
208
- (cmd) => cmd.version(false).hide("help").positional("targets", {
209
- type: "string",
210
- array: true,
211
- describe: "\uBC30\uD3EC\uD560 \uD328\uD0A4\uC9C0 (\uC608: solid, core-common)",
212
- default: []
213
- }).options({
214
- "build": {
215
- type: "boolean",
216
- describe: "\uBE4C\uB4DC \uC2E4\uD589 (--no-build\uB85C \uC2A4\uD0B5)",
217
- default: true
218
- },
219
- "dry-run": {
220
- type: "boolean",
221
- describe: "\uC2E4\uC81C \uBC30\uD3EC \uC5C6\uC774 \uC2DC\uBBAC\uB808\uC774\uC158",
222
- default: false
223
- },
224
- "options": {
225
- type: "string",
226
- array: true,
227
- alias: "o",
228
- description: "sd.config.ts\uC5D0 \uC804\uB2EC\uD560 \uC635\uC158 (\uC608: -o key=value)",
229
- default: []
230
- }
231
- }),
232
- async (args) => {
233
- await runPublish({
234
- targets: args.targets,
235
- noBuild: !args.build,
236
- dryRun: args.dryRun,
237
- options: args.options
238
- });
239
- }
240
- ).command(
241
- "replace-deps",
242
- "sd.config.ts\uC758 replaceDeps \uC124\uC815\uC5D0 \uB530\uB77C node_modules \uD328\uD0A4\uC9C0\uB97C \uB85C\uCEEC \uC18C\uC2A4\uB85C symlink \uAD50\uCCB4\uD55C\uB2E4.",
243
- (cmd) => cmd.version(false).hide("help").options({
244
- options: {
245
- type: "string",
246
- array: true,
247
- alias: "o",
248
- description: "sd.config.ts\uC5D0 \uC804\uB2EC\uD560 \uC635\uC158 (\uC608: -o key=value)",
249
- default: []
250
- }
251
- }),
252
- async (args) => {
253
- await runReplaceDeps({
254
- options: args.options
255
- });
256
- }
257
- ).demandCommand(1, "\uBA85\uB839\uC5B4\uB97C \uC9C0\uC815\uD574\uC8FC\uC138\uC694.").strict();
6
+ const cliEntryUrl = import.meta.resolve("./sd-cli-entry");
7
+ const cliEntryFilePath = fileURLToPath(cliEntryUrl);
8
+ if (path.extname(cliEntryFilePath) === ".ts") {
9
+ configureAffinityAndPriority(process.pid);
10
+ const { createCliParser } = await import(cliEntryUrl);
11
+ await createCliParser(process.argv.slice(2)).parse();
12
+ } else {
13
+ try {
14
+ const { loadSdConfig } = await import("./utils/sd-config.js");
15
+ const { setupReplaceDeps } = await import("./utils/replace-deps.js");
16
+ const sdConfig = await loadSdConfig({ cwd: process.cwd(), dev: false, opt: [] });
17
+ if (sdConfig.replaceDeps != null) {
18
+ await setupReplaceDeps(process.cwd(), sdConfig.replaceDeps);
19
+ }
20
+ } catch {
21
+ }
22
+ const child = spawn(
23
+ "node",
24
+ ["--max-old-space-size=8192", "--max-semi-space-size=16", cliEntryFilePath, ...process.argv.slice(2)],
25
+ { stdio: "inherit" }
26
+ );
27
+ child.on("spawn", () => {
28
+ if (child.pid != null) configureAffinityAndPriority(child.pid);
29
+ });
30
+ child.on("exit", (code) => {
31
+ process.exitCode = code ?? 0;
32
+ });
33
+ }
34
+ function calculateAffinityMask(cpuCount) {
35
+ const exclude = cpuCount <= 1 ? 0 : Math.ceil(cpuCount / 4);
36
+ let mask = 0n;
37
+ for (let i = exclude; i < cpuCount; i++) {
38
+ mask |= 1n << BigInt(i);
39
+ }
40
+ return "0x" + mask.toString(16).toUpperCase();
258
41
  }
259
- const cliEntryPath = process.argv.at(1);
260
- if (cliEntryPath != null && fileURLToPath(import.meta.url) === fs.realpathSync(path.resolve(cliEntryPath))) {
261
- await createCliParser(hideBin(process.argv)).parse();
42
+ function configureAffinityAndPriority(pid) {
43
+ const cpuCount = os.cpus().length;
44
+ const mask = calculateAffinityMask(cpuCount);
45
+ let command;
46
+ if (process.platform === "win32") {
47
+ const commands = [
48
+ `$p = Get-Process -Id ${pid}`,
49
+ `$p.ProcessorAffinity = ${mask}`,
50
+ `$p.PriorityClass = 'BelowNormal'`
51
+ ].join("; ");
52
+ command = `powershell -Command "${commands}"`;
53
+ } else {
54
+ command = `taskset -p ${mask} ${pid} && renice +10 -p ${pid}`;
55
+ }
56
+ exec(command, (err) => {
57
+ if (err) {
58
+ console.warn("CPU affinity/priority \uC124\uC815 \uC2E4\uD328:", err.message);
59
+ }
60
+ });
262
61
  }
263
- export {
264
- createCliParser
265
- };
266
62
  //# sourceMappingURL=sd-cli.js.map
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/sd-cli.ts"],
4
- "mappings": "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",
4
+ "mappings": ";AASA,SAAS,MAAM,aAAa;AAC5B,OAAO,QAAQ;AACf,OAAO,UAAU;AACjB,SAAS,qBAAqB;AAE9B,MAAM,cAAc,YAAY,QAAQ,gBAAgB;AACxD,MAAM,mBAAmB,cAAc,WAAW;AAElD,IAAI,KAAK,QAAQ,gBAAgB,MAAM,OAAO;AAI5C,+BAA6B,QAAQ,GAAG;AACxC,QAAM,EAAE,gBAAgB,IAAI,MAAM,OAAO;AACzC,QAAM,gBAAgB,QAAQ,KAAK,MAAM,CAAC,CAAC,EAAE,MAAM;AACrD,OAAO;AAIL,MAAI;AACF,UAAM,EAAE,aAAa,IAAI,MAAM,OAAO,sBAAsB;AAC5D,UAAM,EAAE,iBAAiB,IAAI,MAAM,OAAO,yBAAyB;AACnE,UAAM,WAAW,MAAM,aAAa,EAAE,KAAK,QAAQ,IAAI,GAAG,KAAK,OAAO,KAAK,CAAC,EAAE,CAAC;AAC/E,QAAI,SAAS,eAAe,MAAM;AAChC,YAAM,iBAAiB,QAAQ,IAAI,GAAG,SAAS,WAAW;AAAA,IAC5D;AAAA,EACF,QAAQ;AAAA,EAER;AAGA,QAAM,QAAQ;AAAA,IACZ;AAAA,IACA,CAAC,6BAA6B,4BAA4B,kBAAkB,GAAG,QAAQ,KAAK,MAAM,CAAC,CAAC;AAAA,IACpG,EAAE,OAAO,UAAU;AAAA,EACrB;AACA,QAAM,GAAG,SAAS,MAAM;AACtB,QAAI,MAAM,OAAO,KAAM,8BAA6B,MAAM,GAAG;AAAA,EAC/D,CAAC;AACD,QAAM,GAAG,QAAQ,CAAC,SAAS;AACzB,YAAQ,WAAW,QAAQ;AAAA,EAC7B,CAAC;AACH;AAQA,SAAS,sBAAsB,UAA0B;AACvD,QAAM,UAAU,YAAY,IAAI,IAAI,KAAK,KAAK,WAAW,CAAC;AAC1D,MAAI,OAAO;AACX,WAAS,IAAI,SAAS,IAAI,UAAU,KAAK;AACvC,YAAQ,MAAM,OAAO,CAAC;AAAA,EACxB;AACA,SAAO,OAAO,KAAK,SAAS,EAAE,EAAE,YAAY;AAC9C;AAUA,SAAS,6BAA6B,KAAmB;AACvD,QAAM,WAAW,GAAG,KAAK,EAAE;AAC3B,QAAM,OAAO,sBAAsB,QAAQ;AAE3C,MAAI;AACJ,MAAI,QAAQ,aAAa,SAAS;AAChC,UAAM,WAAW;AAAA,MACf,wBAAwB,GAAG;AAAA,MAC3B,0BAA0B,IAAI;AAAA,MAC9B;AAAA,IACF,EAAE,KAAK,IAAI;AACX,cAAU,wBAAwB,QAAQ;AAAA,EAC5C,OAAO;AACL,cAAU,cAAc,IAAI,IAAI,GAAG,qBAAqB,GAAG;AAAA,EAC7D;AAEA,OAAK,SAAS,CAAC,QAAQ;AACrB,QAAI,KAAK;AAEP,cAAQ,KAAK,oDAAgC,IAAI,OAAO;AAAA,IAC1D;AAAA,EACF,CAAC;AACH;",
5
5
  "names": []
6
6
  }
@@ -19,14 +19,44 @@ export declare function resolveReplaceDepEntries(replaceDeps: Record<string, str
19
19
  */
20
20
  export declare function parseWorkspaceGlobs(content: string): string[];
21
21
  /**
22
- * replaceDeps 설정에 따라 node_modules 내 패키지를 소스 디렉토리로 symlink 교체한다.
22
+ * replaceDeps 복사 교체 항목
23
+ */
24
+ export interface ReplaceDepEntry {
25
+ targetName: string;
26
+ sourcePath: string;
27
+ targetPath: string;
28
+ resolvedSourcePath: string;
29
+ actualTargetPath: string;
30
+ }
31
+ /**
32
+ * watchReplaceDeps 반환 타입
33
+ */
34
+ export interface WatchReplaceDepResult {
35
+ entries: ReplaceDepEntry[];
36
+ dispose: () => void;
37
+ }
38
+ /**
39
+ * replaceDeps 설정에 따라 node_modules 내 패키지를 소스 디렉토리로 복사 교체한다.
23
40
  *
24
41
  * 1. pnpm-workspace.yaml 파싱 → workspace 패키지 경로 목록
25
42
  * 2. [루트, ...workspace 패키지]의 node_modules에서 매칭되는 패키지 찾기
26
- * 3. 기존 symlink/디렉토리 제거 → 소스 경로로 symlink 생성
43
+ * 3. 기존 symlink/디렉토리 제거 → 소스 경로를 복사 (node_modules, package.json, .cache, tests 제외)
27
44
  *
28
45
  * @param projectRoot - 프로젝트 루트 경로
29
46
  * @param replaceDeps - sd.config.ts의 replaceDeps 설정
30
47
  */
31
48
  export declare function setupReplaceDeps(projectRoot: string, replaceDeps: Record<string, string>): Promise<void>;
49
+ /**
50
+ * replaceDeps 설정에 따라 소스 디렉토리를 watch하여 변경 시 대상 경로로 복사한다.
51
+ *
52
+ * 1. pnpm-workspace.yaml 파싱 → workspace 패키지 경로 목록
53
+ * 2. [루트, ...workspace 패키지]의 node_modules에서 매칭되는 패키지 찾기
54
+ * 3. 소스 디렉토리를 FsWatcher로 watch (300ms delay)
55
+ * 4. 변경 시 대상 경로로 복사 (node_modules, package.json, .cache, tests 제외)
56
+ *
57
+ * @param projectRoot - 프로젝트 루트 경로
58
+ * @param replaceDeps - sd.config.ts의 replaceDeps 설정
59
+ * @returns entries와 dispose 함수
60
+ */
61
+ export declare function watchReplaceDeps(projectRoot: string, replaceDeps: Record<string, string>): Promise<WatchReplaceDepResult>;
32
62
  //# sourceMappingURL=replace-deps.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"replace-deps.d.ts","sourceRoot":"","sources":["../../src/utils/replace-deps.ts"],"names":[],"mappings":"AAKA;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CACtC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACnC,WAAW,EAAE,MAAM,EAAE,GACpB,KAAK,CAAC;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC,CA2BnD;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CA8B7D;AAED;;;;;;;;;GASG;AACH,wBAAsB,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAoE9G"}
1
+ {"version":3,"file":"replace-deps.d.ts","sourceRoot":"","sources":["../../src/utils/replace-deps.ts"],"names":[],"mappings":"AAMA;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CACtC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACnC,WAAW,EAAE,MAAM,EAAE,GACpB,KAAK,CAAC;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC,CA2BnD;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CA8B7D;AAmBD;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED;;;;;;;;;GASG;AACH,wBAAsB,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CA4E9G;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,gBAAgB,CACpC,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAClC,OAAO,CAAC,qBAAqB,CAAC,CA8IhC"}
@@ -2,6 +2,7 @@ import fs from "fs";
2
2
  import path from "path";
3
3
  import { glob } from "glob";
4
4
  import { consola } from "consola";
5
+ import { fsCopy, fsMkdir, fsRm, FsWatcher } from "@simplysm/core-node";
5
6
  function resolveReplaceDepEntries(replaceDeps, targetNames) {
6
7
  const results = [];
7
8
  for (const [pattern, sourceTemplate] of Object.entries(replaceDeps)) {
@@ -44,6 +45,11 @@ function parseWorkspaceGlobs(content) {
44
45
  }
45
46
  return globs;
46
47
  }
48
+ const EXCLUDED_NAMES = /* @__PURE__ */ new Set(["node_modules", "package.json", ".cache", "tests"]);
49
+ function replaceDepsCopyFilter(itemPath) {
50
+ const basename = path.basename(itemPath);
51
+ return !EXCLUDED_NAMES.has(basename);
52
+ }
47
53
  async function setupReplaceDeps(projectRoot, replaceDeps) {
48
54
  const logger = consola.withTag("sd:cli:replace-deps");
49
55
  const searchRoots = [projectRoot];
@@ -81,19 +87,132 @@ async function setupReplaceDeps(projectRoot, replaceDeps) {
81
87
  continue;
82
88
  }
83
89
  try {
84
- await fs.promises.rm(targetPath, { recursive: true, force: true });
85
- const relativePath = path.relative(path.dirname(targetPath), resolvedSourcePath);
86
- await fs.promises.symlink(relativePath, targetPath, "dir");
90
+ let actualTargetPath = targetPath;
91
+ try {
92
+ const stat = await fs.promises.lstat(targetPath);
93
+ if (stat.isSymbolicLink()) {
94
+ actualTargetPath = await fs.promises.realpath(targetPath);
95
+ }
96
+ } catch {
97
+ }
98
+ await fs.promises.rm(actualTargetPath, { recursive: true, force: true });
99
+ await fsCopy(resolvedSourcePath, actualTargetPath, replaceDepsCopyFilter);
87
100
  logger.info(`${targetName} \u2192 ${sourcePath}`);
88
101
  } catch (err) {
89
- logger.error(`symlink \uAD50\uCCB4 \uC2E4\uD328 (${targetName}): ${err instanceof Error ? err.message : err}`);
102
+ logger.error(`\uBCF5\uC0AC \uAD50\uCCB4 \uC2E4\uD328 (${targetName}): ${err instanceof Error ? err.message : err}`);
103
+ }
104
+ }
105
+ }
106
+ }
107
+ async function watchReplaceDeps(projectRoot, replaceDeps) {
108
+ const logger = consola.withTag("sd:cli:replace-deps:watch");
109
+ const entries = [];
110
+ const searchRoots = [projectRoot];
111
+ const workspaceYamlPath = path.join(projectRoot, "pnpm-workspace.yaml");
112
+ try {
113
+ const yamlContent = await fs.promises.readFile(workspaceYamlPath, "utf-8");
114
+ const workspaceGlobs = parseWorkspaceGlobs(yamlContent);
115
+ for (const pattern of workspaceGlobs) {
116
+ const dirs = await glob(pattern, { cwd: projectRoot, absolute: true });
117
+ searchRoots.push(...dirs);
118
+ }
119
+ } catch {
120
+ }
121
+ for (const searchRoot of searchRoots) {
122
+ const nodeModulesDir = path.join(searchRoot, "node_modules");
123
+ try {
124
+ await fs.promises.access(nodeModulesDir);
125
+ } catch {
126
+ continue;
127
+ }
128
+ const targetNames = [];
129
+ for (const pattern of Object.keys(replaceDeps)) {
130
+ const matches = await glob(pattern, { cwd: nodeModulesDir });
131
+ targetNames.push(...matches);
132
+ }
133
+ if (targetNames.length === 0) continue;
134
+ const matchedEntries = resolveReplaceDepEntries(replaceDeps, targetNames);
135
+ for (const { targetName, sourcePath } of matchedEntries) {
136
+ const targetPath = path.join(nodeModulesDir, targetName);
137
+ const resolvedSourcePath = path.resolve(projectRoot, sourcePath);
138
+ try {
139
+ await fs.promises.access(resolvedSourcePath);
140
+ } catch {
141
+ logger.warn(`\uC18C\uC2A4 \uACBD\uB85C\uAC00 \uC874\uC7AC\uD558\uC9C0 \uC54A\uC544 \uC2A4\uD0B5\uD569\uB2C8\uB2E4: ${resolvedSourcePath}`);
142
+ continue;
143
+ }
144
+ let actualTargetPath = targetPath;
145
+ try {
146
+ const stat = await fs.promises.lstat(targetPath);
147
+ if (stat.isSymbolicLink()) {
148
+ actualTargetPath = await fs.promises.realpath(targetPath);
149
+ }
150
+ } catch {
90
151
  }
152
+ entries.push({
153
+ targetName,
154
+ sourcePath,
155
+ targetPath,
156
+ resolvedSourcePath,
157
+ actualTargetPath
158
+ });
91
159
  }
92
160
  }
161
+ const watchers = [];
162
+ const watchedSources = /* @__PURE__ */ new Set();
163
+ for (const entry of entries) {
164
+ if (watchedSources.has(entry.resolvedSourcePath)) continue;
165
+ watchedSources.add(entry.resolvedSourcePath);
166
+ const watcher = await FsWatcher.watch([entry.resolvedSourcePath], { followSymlinks: false });
167
+ watcher.onChange({ delay: 300 }, async (changeInfos) => {
168
+ for (const { path: changedPath } of changeInfos) {
169
+ const basename = path.basename(changedPath);
170
+ if (EXCLUDED_NAMES.has(basename)) continue;
171
+ for (const e of entries) {
172
+ if (e.resolvedSourcePath !== entry.resolvedSourcePath) continue;
173
+ const relativePath = path.relative(e.resolvedSourcePath, changedPath);
174
+ const destPath = path.join(e.actualTargetPath, relativePath);
175
+ try {
176
+ let sourceExists = false;
177
+ try {
178
+ await fs.promises.access(changedPath);
179
+ sourceExists = true;
180
+ } catch {
181
+ }
182
+ if (sourceExists) {
183
+ const stat = await fs.promises.stat(changedPath);
184
+ if (stat.isDirectory()) {
185
+ await fsMkdir(destPath);
186
+ } else {
187
+ await fsMkdir(path.dirname(destPath));
188
+ await fsCopy(changedPath, destPath, replaceDepsCopyFilter);
189
+ }
190
+ logger.info(`\uBCF5\uC0AC: ${relativePath} \u2192 ${e.targetName}`);
191
+ } else {
192
+ await fsRm(destPath);
193
+ logger.info(`\uC0AD\uC81C: ${relativePath} (${e.targetName})`);
194
+ }
195
+ } catch (err) {
196
+ logger.error(`\uBCF5\uC0AC \uC2E4\uD328 (${e.targetName}/${relativePath}): ${err instanceof Error ? err.message : err}`);
197
+ }
198
+ }
199
+ }
200
+ });
201
+ watchers.push(watcher);
202
+ }
203
+ return {
204
+ entries,
205
+ dispose: () => {
206
+ for (const watcher of watchers) {
207
+ void watcher.close();
208
+ }
209
+ }
210
+ };
93
211
  }
94
212
  export {
95
213
  parseWorkspaceGlobs,
96
214
  resolveReplaceDepEntries,
97
- setupReplaceDeps
215
+ setupReplaceDeps,
216
+ watchReplaceDeps
98
217
  };
99
218
  //# sourceMappingURL=replace-deps.js.map
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/utils/replace-deps.ts"],
4
- "mappings": "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",
4
+ "mappings": "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",
5
5
  "names": []
6
6
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@simplysm/sd-cli",
3
3
  "sideEffects": false,
4
- "version": "13.0.7",
4
+ "version": "13.0.10",
5
5
  "description": "심플리즘 패키지 - CLI 도구",
6
6
  "author": "김석래",
7
7
  "repository": {
@@ -45,9 +45,9 @@
45
45
  "vite-plugin-solid": "^2.11.10",
46
46
  "vite-tsconfig-paths": "^6.1.1",
47
47
  "yargs": "^18.0.0",
48
- "@simplysm/core-common": "13.0.7",
49
- "@simplysm/core-node": "13.0.7",
50
- "@simplysm/storage": "13.0.7"
48
+ "@simplysm/core-common": "13.0.10",
49
+ "@simplysm/core-node": "13.0.10",
50
+ "@simplysm/storage": "13.0.10"
51
51
  },
52
52
  "devDependencies": {
53
53
  "@types/semver": "^7.7.1",
@@ -6,7 +6,7 @@ import type { SdConfig, SdClientPackageConfig, SdServerPackageConfig } from "../
6
6
  import { consola } from "consola";
7
7
  import { loadSdConfig } from "../utils/sd-config";
8
8
  import { getVersion } from "../utils/build-env";
9
- import { setupReplaceDeps } from "../utils/replace-deps";
9
+ import { setupReplaceDeps, watchReplaceDeps, type WatchReplaceDepResult } from "../utils/replace-deps";
10
10
  import type * as ClientWorkerModule from "../workers/client.worker";
11
11
  import type * as ServerWorkerModule from "../workers/server.worker";
12
12
  import type * as ServerRuntimeWorkerModule from "../workers/server-runtime.worker";
@@ -79,8 +79,10 @@ export async function runDev(options: DevOptions): Promise<void> {
79
79
  }
80
80
 
81
81
  // replaceDeps 설정이 있으면 symlink 교체
82
+ let replaceDepWatcher: WatchReplaceDepResult | undefined;
82
83
  if (sdConfig.replaceDeps != null) {
83
84
  await setupReplaceDeps(cwd, sdConfig.replaceDeps);
85
+ replaceDepWatcher = await watchReplaceDeps(cwd, sdConfig.replaceDeps);
84
86
  }
85
87
 
86
88
  // VER, DEV 환경변수 준비
@@ -426,6 +428,10 @@ export async function runDev(options: DevOptions): Promise<void> {
426
428
  status: "error",
427
429
  message: event.message,
428
430
  });
431
+ if (isFirstBuild) {
432
+ isFirstBuild = false;
433
+ serverRuntimePromises.get(name)?.resolver();
434
+ }
429
435
  serverBuild.buildResolver();
430
436
  });
431
437
  }
@@ -529,6 +535,7 @@ export async function runDev(options: DevOptions): Promise<void> {
529
535
  status: "error",
530
536
  message: err instanceof Error ? err.message : String(err),
531
537
  });
538
+ serverRuntimePromises.get(name)?.resolver();
532
539
  serverBuild.buildResolver();
533
540
  });
534
541
  }
@@ -596,6 +603,7 @@ export async function runDev(options: DevOptions): Promise<void> {
596
603
  ...[...serverBuildWorkers.values()].map(({ worker }) => worker.terminate()),
597
604
  ...[...serverRuntimeWorkers.values()].map((worker) => worker.terminate()),
598
605
  ]);
606
+ replaceDepWatcher?.dispose();
599
607
  process.stdout.write("✔ 완료\n");
600
608
  }
601
609