@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/commands/dev.d.ts.map +1 -1
- package/dist/commands/dev.js +9 -1
- package/dist/commands/dev.js.map +1 -1
- package/dist/orchestrators/WatchOrchestrator.d.ts +1 -0
- package/dist/orchestrators/WatchOrchestrator.d.ts.map +1 -1
- package/dist/orchestrators/WatchOrchestrator.js +4 -1
- package/dist/orchestrators/WatchOrchestrator.js.map +1 -1
- package/dist/sd-cli-entry.d.ts +9 -0
- package/dist/sd-cli-entry.d.ts.map +1 -0
- package/dist/sd-cli-entry.js +266 -0
- package/dist/sd-cli-entry.js.map +6 -0
- package/dist/sd-cli.d.ts +5 -5
- package/dist/sd-cli.d.ts.map +1 -1
- package/dist/sd-cli.js +56 -260
- package/dist/sd-cli.js.map +1 -1
- package/dist/utils/replace-deps.d.ts +32 -2
- package/dist/utils/replace-deps.d.ts.map +1 -1
- package/dist/utils/replace-deps.js +124 -5
- package/dist/utils/replace-deps.js.map +1 -1
- package/package.json +4 -4
- package/src/commands/dev.ts +9 -1
- package/src/orchestrators/WatchOrchestrator.ts +4 -1
- package/src/sd-cli-entry.ts +330 -0
- package/src/sd-cli.ts +88 -319
- package/src/utils/replace-deps.ts +213 -9
- 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/dist/sd-cli.js
CHANGED
|
@@ -1,266 +1,62 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import "
|
|
3
|
-
import
|
|
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
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
if (
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
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
|
-
|
|
260
|
-
|
|
261
|
-
|
|
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
|
package/dist/sd-cli.js.map
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/sd-cli.ts"],
|
|
4
|
-
"mappings": ";
|
|
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
|
|
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/디렉토리 제거 → 소스
|
|
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":"
|
|
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
|
-
|
|
85
|
-
|
|
86
|
-
|
|
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(
|
|
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": "AAAA,OAAO,QAAQ;AACf,OAAO,UAAU;AACjB,SAAS,YAAY;AACrB,SAAS,eAAe;
|
|
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.
|
|
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.
|
|
49
|
-
"@simplysm/core-node": "13.0.
|
|
50
|
-
"@simplysm/storage": "13.0.
|
|
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",
|
package/src/commands/dev.ts
CHANGED
|
@@ -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
|
|