@simplysm/sd-cli 13.0.0-beta.51 → 13.0.1
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/replace-deps.d.ts +12 -0
- package/dist/commands/replace-deps.d.ts.map +1 -0
- package/dist/commands/replace-deps.js +16 -0
- package/dist/commands/replace-deps.js.map +6 -0
- package/dist/sd-cli.d.ts.map +1 -1
- package/dist/sd-cli.js +18 -0
- package/dist/sd-cli.js.map +1 -1
- package/dist/workers/library.worker.d.ts.map +1 -1
- package/dist/workers/library.worker.js +66 -37
- package/dist/workers/library.worker.js.map +1 -1
- package/package.json +4 -4
- package/src/commands/replace-deps.ts +27 -0
- package/src/sd-cli.ts +23 -0
- package/src/workers/library.worker.ts +106 -51
- package/templates/add-client/__CLIENT__/package.json.hbs +1 -1
- package/templates/add-server/__SERVER__/package.json.hbs +2 -2
- package/templates/add-server/__SERVER__/src/main.ts.hbs +2 -2
- package/templates/init/package.json.hbs +3 -3
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* replace-deps 명령 옵션
|
|
3
|
+
*/
|
|
4
|
+
export interface ReplaceDepsOptions {
|
|
5
|
+
/** sd.config.ts에 전달할 추가 옵션 */
|
|
6
|
+
options: string[];
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* sd.config.ts의 replaceDeps 설정에 따라 node_modules 패키지를 로컬 소스로 symlink 교체한다.
|
|
10
|
+
*/
|
|
11
|
+
export declare function runReplaceDeps(opts: ReplaceDepsOptions): Promise<void>;
|
|
12
|
+
//# sourceMappingURL=replace-deps.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"replace-deps.d.ts","sourceRoot":"","sources":["../../src/commands/replace-deps.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,8BAA8B;IAC9B,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAW5E"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { consola } from "consola";
|
|
2
|
+
import { loadSdConfig } from "../utils/sd-config.js";
|
|
3
|
+
import { setupReplaceDeps } from "../utils/replace-deps.js";
|
|
4
|
+
async function runReplaceDeps(opts) {
|
|
5
|
+
const cwd = process.cwd();
|
|
6
|
+
const sdConfig = await loadSdConfig({ cwd, dev: false, opt: opts.options });
|
|
7
|
+
if (sdConfig.replaceDeps == null) {
|
|
8
|
+
consola.warn("sd.config.ts\uC5D0 replaceDeps \uC124\uC815\uC774 \uC5C6\uC2B5\uB2C8\uB2E4.");
|
|
9
|
+
return;
|
|
10
|
+
}
|
|
11
|
+
await setupReplaceDeps(cwd, sdConfig.replaceDeps);
|
|
12
|
+
}
|
|
13
|
+
export {
|
|
14
|
+
runReplaceDeps
|
|
15
|
+
};
|
|
16
|
+
//# sourceMappingURL=replace-deps.js.map
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/commands/replace-deps.ts"],
|
|
4
|
+
"mappings": "AAAA,SAAS,eAAe;AACxB,SAAS,oBAAoB;AAC7B,SAAS,wBAAwB;AAajC,eAAsB,eAAe,MAAyC;AAC5E,QAAM,MAAM,QAAQ,IAAI;AAExB,QAAM,WAAW,MAAM,aAAa,EAAE,KAAK,KAAK,OAAO,KAAK,KAAK,QAAQ,CAAC;AAE1E,MAAI,SAAS,eAAe,MAAM;AAChC,YAAQ,KAAK,6EAAqC;AAClD;AAAA,EACF;AAEA,QAAM,iBAAiB,KAAK,SAAS,WAAW;AAClD;",
|
|
5
|
+
"names": []
|
|
6
|
+
}
|
package/dist/sd-cli.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sd-cli.d.ts","sourceRoot":"","sources":["../src/sd-cli.ts"],"names":[],"mappings":";AAGA,OAAO,uBAAuB,CAAC;AAC/B,OAAc,EAAE,KAAK,IAAI,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"sd-cli.d.ts","sourceRoot":"","sources":["../src/sd-cli.ts"],"names":[],"mappings":";AAGA,OAAO,uBAAuB,CAAC;AAC/B,OAAc,EAAE,KAAK,IAAI,EAAE,MAAM,OAAO,CAAC;AAmBzC;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAuSpD"}
|
package/dist/sd-cli.js
CHANGED
|
@@ -8,6 +8,7 @@ import { runWatch } from "./commands/watch.js";
|
|
|
8
8
|
import { runDev } from "./commands/dev.js";
|
|
9
9
|
import { runBuild } from "./commands/build.js";
|
|
10
10
|
import { runPublish } from "./commands/publish.js";
|
|
11
|
+
import { runReplaceDeps } from "./commands/replace-deps.js";
|
|
11
12
|
import { runDevice } from "./commands/device.js";
|
|
12
13
|
import path from "path";
|
|
13
14
|
import fs from "fs";
|
|
@@ -236,6 +237,23 @@ function createCliParser(argv) {
|
|
|
236
237
|
options: args.options
|
|
237
238
|
});
|
|
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
|
+
}
|
|
239
257
|
).demandCommand(1, "\uBA85\uB839\uC5B4\uB97C \uC9C0\uC815\uD574\uC8FC\uC138\uC694.").strict();
|
|
240
258
|
}
|
|
241
259
|
const cliEntryPath = process.argv.at(1);
|
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": "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",
|
|
4
|
+
"mappings": "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",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"library.worker.d.ts","sourceRoot":"","sources":["../../src/workers/library.worker.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"library.worker.d.ts","sourceRoot":"","sources":["../../src/workers/library.worker.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAM/D;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,oBAAoB,CAAC;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,oBAAoB,CAAC;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAoB,SAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAClE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAClC,KAAK,EAAE,iBAAiB,CAAC;IACzB,KAAK,EAAE,iBAAiB,CAAC;CAC1B;AAwDD;;GAEG;AACH,iBAAe,KAAK,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA+BxE;AAmED;;;;GAIG;AACH,iBAAe,UAAU,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAwD/D;AAED;;;GAGG;AACH,iBAAe,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAExC;AAED,QAAA,MAAM,MAAM;;;eACD,OAAO,KAAK;oBAAc,OAAO,UAAU;mBAAa,OAAO,SAAS;;;CAMjF,CAAC;AAEH,eAAe,MAAM,CAAC"}
|
|
@@ -1,16 +1,18 @@
|
|
|
1
|
+
import path from "path";
|
|
1
2
|
import esbuild from "esbuild";
|
|
2
|
-
import { createWorker } from "@simplysm/core-node";
|
|
3
|
+
import { createWorker, FsWatcher } from "@simplysm/core-node";
|
|
3
4
|
import { consola } from "consola";
|
|
4
5
|
import { parseRootTsconfig, getPackageSourceFiles, getCompilerOptionsForPackage } from "../utils/tsconfig.js";
|
|
5
6
|
import { createLibraryEsbuildOptions, getTypecheckEnvFromTarget } from "../utils/esbuild-config.js";
|
|
6
7
|
const logger = consola.withTag("sd:cli:library:worker");
|
|
7
8
|
let esbuildContext;
|
|
9
|
+
let fsWatcher;
|
|
8
10
|
async function cleanup() {
|
|
9
11
|
const contextToDispose = esbuildContext;
|
|
10
12
|
esbuildContext = void 0;
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
13
|
+
const watcherToClose = fsWatcher;
|
|
14
|
+
fsWatcher = void 0;
|
|
15
|
+
await Promise.all([contextToDispose?.dispose(), watcherToClose?.close()]);
|
|
14
16
|
}
|
|
15
17
|
process.on("SIGTERM", () => {
|
|
16
18
|
cleanup().catch((err) => {
|
|
@@ -52,52 +54,79 @@ async function build(info) {
|
|
|
52
54
|
}
|
|
53
55
|
}
|
|
54
56
|
let isWatchStarted = false;
|
|
57
|
+
async function createAndBuildContext(pkgDir, cwd, config, isFirstBuild, resolveFirstBuild) {
|
|
58
|
+
const parsedConfig = parseRootTsconfig(cwd);
|
|
59
|
+
const entryPoints = getPackageSourceFiles(pkgDir, parsedConfig);
|
|
60
|
+
const env = getTypecheckEnvFromTarget(config.target);
|
|
61
|
+
const compilerOptions = await getCompilerOptionsForPackage(parsedConfig.options, env, pkgDir);
|
|
62
|
+
const baseOptions = createLibraryEsbuildOptions({
|
|
63
|
+
pkgDir,
|
|
64
|
+
entryPoints,
|
|
65
|
+
target: config.target,
|
|
66
|
+
compilerOptions
|
|
67
|
+
});
|
|
68
|
+
let isBuildFirstTime = isFirstBuild;
|
|
69
|
+
const context = await esbuild.context({
|
|
70
|
+
...baseOptions,
|
|
71
|
+
plugins: [
|
|
72
|
+
...baseOptions.plugins ?? [],
|
|
73
|
+
{
|
|
74
|
+
name: "watch-notify",
|
|
75
|
+
setup(pluginBuild) {
|
|
76
|
+
pluginBuild.onStart(() => {
|
|
77
|
+
sender.send("buildStart", {});
|
|
78
|
+
});
|
|
79
|
+
pluginBuild.onEnd((result) => {
|
|
80
|
+
const errors = result.errors.map((e) => e.text);
|
|
81
|
+
const success = result.errors.length === 0;
|
|
82
|
+
sender.send("build", { success, errors: errors.length > 0 ? errors : void 0 });
|
|
83
|
+
if (isBuildFirstTime) {
|
|
84
|
+
isBuildFirstTime = false;
|
|
85
|
+
resolveFirstBuild?.();
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
]
|
|
91
|
+
});
|
|
92
|
+
await context.rebuild();
|
|
93
|
+
return context;
|
|
94
|
+
}
|
|
55
95
|
async function startWatch(info) {
|
|
56
96
|
if (isWatchStarted) {
|
|
57
97
|
throw new Error("startWatch\uB294 Worker\uB2F9 \uD55C \uBC88\uB9CC \uD638\uCD9C\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4.");
|
|
58
98
|
}
|
|
59
99
|
isWatchStarted = true;
|
|
60
100
|
try {
|
|
61
|
-
const parsedConfig = parseRootTsconfig(info.cwd);
|
|
62
|
-
const entryPoints = getPackageSourceFiles(info.pkgDir, parsedConfig);
|
|
63
|
-
const env = getTypecheckEnvFromTarget(info.config.target);
|
|
64
|
-
const compilerOptions = await getCompilerOptionsForPackage(parsedConfig.options, env, info.pkgDir);
|
|
65
101
|
let resolveFirstBuild;
|
|
66
102
|
const firstBuildPromise = new Promise((resolve) => {
|
|
67
103
|
resolveFirstBuild = resolve;
|
|
68
104
|
});
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
pluginBuild.onEnd((result) => {
|
|
87
|
-
const errors = result.errors.map((e) => e.text);
|
|
88
|
-
const success = result.errors.length === 0;
|
|
89
|
-
sender.send("build", { success, errors: errors.length > 0 ? errors : void 0 });
|
|
90
|
-
if (isFirstBuild) {
|
|
91
|
-
isFirstBuild = false;
|
|
92
|
-
resolveFirstBuild();
|
|
93
|
-
}
|
|
94
|
-
});
|
|
105
|
+
esbuildContext = await createAndBuildContext(info.pkgDir, info.cwd, info.config, true, resolveFirstBuild);
|
|
106
|
+
await firstBuildPromise;
|
|
107
|
+
const srcPattern = path.join(info.pkgDir, "src", "**", "*.{ts,tsx}");
|
|
108
|
+
fsWatcher = await FsWatcher.watch([srcPattern]);
|
|
109
|
+
fsWatcher.onChange({ delay: 300 }, async (changes) => {
|
|
110
|
+
try {
|
|
111
|
+
const hasAddOrUnlink = changes.some((c) => c.event === "add" || c.event === "unlink");
|
|
112
|
+
if (hasAddOrUnlink) {
|
|
113
|
+
logger.debug("\uD30C\uC77C \uCD94\uAC00/\uC0AD\uC81C \uAC10\uC9C0, context \uC7AC\uC0DD\uC131");
|
|
114
|
+
const oldContext = esbuildContext;
|
|
115
|
+
esbuildContext = await createAndBuildContext(info.pkgDir, info.cwd, info.config, false);
|
|
116
|
+
if (oldContext != null) {
|
|
117
|
+
await oldContext.dispose();
|
|
118
|
+
}
|
|
119
|
+
} else {
|
|
120
|
+
if (esbuildContext != null) {
|
|
121
|
+
await esbuildContext.rebuild();
|
|
95
122
|
}
|
|
96
123
|
}
|
|
97
|
-
|
|
124
|
+
} catch (err) {
|
|
125
|
+
sender.send("error", {
|
|
126
|
+
message: err instanceof Error ? err.message : String(err)
|
|
127
|
+
});
|
|
128
|
+
}
|
|
98
129
|
});
|
|
99
|
-
await esbuildContext.watch();
|
|
100
|
-
await firstBuildPromise;
|
|
101
130
|
} catch (err) {
|
|
102
131
|
sender.send("error", {
|
|
103
132
|
message: err instanceof Error ? err.message : String(err)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/workers/library.worker.ts"],
|
|
4
|
-
"mappings": "AAAA,OAAO,aAAa;AACpB,SAAS,
|
|
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.1",
|
|
5
5
|
"description": "심플리즘 패키지 - CLI 도구",
|
|
6
6
|
"author": "김석래",
|
|
7
7
|
"repository": {
|
|
@@ -44,9 +44,9 @@
|
|
|
44
44
|
"vite-plugin-solid": "^2.11.10",
|
|
45
45
|
"vite-tsconfig-paths": "^6.1.0",
|
|
46
46
|
"yargs": "^18.0.0",
|
|
47
|
-
"@simplysm/core-common": "13.0.
|
|
48
|
-
"@simplysm/core-node": "13.0.
|
|
49
|
-
"@simplysm/storage": "13.0.
|
|
47
|
+
"@simplysm/core-common": "13.0.1",
|
|
48
|
+
"@simplysm/core-node": "13.0.1",
|
|
49
|
+
"@simplysm/storage": "13.0.1"
|
|
50
50
|
},
|
|
51
51
|
"devDependencies": {
|
|
52
52
|
"@types/semver": "^7.7.1",
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { consola } from "consola";
|
|
2
|
+
import { loadSdConfig } from "../utils/sd-config";
|
|
3
|
+
import { setupReplaceDeps } from "../utils/replace-deps";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* replace-deps 명령 옵션
|
|
7
|
+
*/
|
|
8
|
+
export interface ReplaceDepsOptions {
|
|
9
|
+
/** sd.config.ts에 전달할 추가 옵션 */
|
|
10
|
+
options: string[];
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* sd.config.ts의 replaceDeps 설정에 따라 node_modules 패키지를 로컬 소스로 symlink 교체한다.
|
|
15
|
+
*/
|
|
16
|
+
export async function runReplaceDeps(opts: ReplaceDepsOptions): Promise<void> {
|
|
17
|
+
const cwd = process.cwd();
|
|
18
|
+
|
|
19
|
+
const sdConfig = await loadSdConfig({ cwd, dev: false, opt: opts.options });
|
|
20
|
+
|
|
21
|
+
if (sdConfig.replaceDeps == null) {
|
|
22
|
+
consola.warn("sd.config.ts에 replaceDeps 설정이 없습니다.");
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
await setupReplaceDeps(cwd, sdConfig.replaceDeps);
|
|
27
|
+
}
|
package/src/sd-cli.ts
CHANGED
|
@@ -10,6 +10,7 @@ import { runWatch } from "./commands/watch";
|
|
|
10
10
|
import { runDev } from "./commands/dev";
|
|
11
11
|
import { runBuild } from "./commands/build";
|
|
12
12
|
import { runPublish } from "./commands/publish";
|
|
13
|
+
import { runReplaceDeps } from "./commands/replace-deps";
|
|
13
14
|
import { runDevice } from "./commands/device";
|
|
14
15
|
import path from "path";
|
|
15
16
|
import fs from "fs";
|
|
@@ -295,6 +296,28 @@ export function createCliParser(argv: string[]): Argv {
|
|
|
295
296
|
});
|
|
296
297
|
},
|
|
297
298
|
)
|
|
299
|
+
.command(
|
|
300
|
+
"replace-deps",
|
|
301
|
+
"sd.config.ts의 replaceDeps 설정에 따라 node_modules 패키지를 로컬 소스로 symlink 교체한다.",
|
|
302
|
+
(cmd) =>
|
|
303
|
+
cmd
|
|
304
|
+
.version(false)
|
|
305
|
+
.hide("help")
|
|
306
|
+
.options({
|
|
307
|
+
options: {
|
|
308
|
+
type: "string",
|
|
309
|
+
array: true,
|
|
310
|
+
alias: "o",
|
|
311
|
+
description: "sd.config.ts에 전달할 옵션 (예: -o key=value)",
|
|
312
|
+
default: [] as string[],
|
|
313
|
+
},
|
|
314
|
+
}),
|
|
315
|
+
async (args) => {
|
|
316
|
+
await runReplaceDeps({
|
|
317
|
+
options: args.options,
|
|
318
|
+
});
|
|
319
|
+
},
|
|
320
|
+
)
|
|
298
321
|
.demandCommand(1, "명령어를 지정해주세요.")
|
|
299
322
|
.strict();
|
|
300
323
|
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
import path from "path";
|
|
1
2
|
import esbuild from "esbuild";
|
|
2
|
-
import { createWorker } from "@simplysm/core-node";
|
|
3
|
+
import { createWorker, FsWatcher } from "@simplysm/core-node";
|
|
3
4
|
import { consola } from "consola";
|
|
4
5
|
import type { SdBuildPackageConfig } from "../sd-config.types";
|
|
5
6
|
import { parseRootTsconfig, getPackageSourceFiles, getCompilerOptionsForPackage } from "../utils/tsconfig";
|
|
@@ -68,6 +69,9 @@ const logger = consola.withTag("sd:cli:library:worker");
|
|
|
68
69
|
/** esbuild build context (정리 대상) */
|
|
69
70
|
let esbuildContext: esbuild.BuildContext | undefined;
|
|
70
71
|
|
|
72
|
+
/** FsWatcher (정리 대상) */
|
|
73
|
+
let fsWatcher: FsWatcher | undefined;
|
|
74
|
+
|
|
71
75
|
/**
|
|
72
76
|
* 리소스 정리
|
|
73
77
|
*/
|
|
@@ -77,9 +81,10 @@ async function cleanup(): Promise<void> {
|
|
|
77
81
|
const contextToDispose = esbuildContext;
|
|
78
82
|
esbuildContext = undefined;
|
|
79
83
|
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
84
|
+
const watcherToClose = fsWatcher;
|
|
85
|
+
fsWatcher = undefined;
|
|
86
|
+
|
|
87
|
+
await Promise.all([contextToDispose?.dispose(), watcherToClose?.close()]);
|
|
83
88
|
}
|
|
84
89
|
|
|
85
90
|
// 프로세스 종료 전 리소스 정리 (SIGTERM/SIGINT)
|
|
@@ -148,6 +153,68 @@ async function build(info: LibraryBuildInfo): Promise<LibraryBuildResult> {
|
|
|
148
153
|
/** startWatch 호출 여부 플래그 */
|
|
149
154
|
let isWatchStarted = false;
|
|
150
155
|
|
|
156
|
+
/**
|
|
157
|
+
* esbuild context 생성 및 초기 빌드 수행
|
|
158
|
+
*/
|
|
159
|
+
async function createAndBuildContext(
|
|
160
|
+
pkgDir: string,
|
|
161
|
+
cwd: string,
|
|
162
|
+
config: SdBuildPackageConfig,
|
|
163
|
+
isFirstBuild: boolean,
|
|
164
|
+
resolveFirstBuild?: () => void,
|
|
165
|
+
): Promise<esbuild.BuildContext> {
|
|
166
|
+
// tsconfig 파싱
|
|
167
|
+
const parsedConfig = parseRootTsconfig(cwd);
|
|
168
|
+
const entryPoints = getPackageSourceFiles(pkgDir, parsedConfig);
|
|
169
|
+
|
|
170
|
+
// 타겟별 compilerOptions 생성
|
|
171
|
+
const env = getTypecheckEnvFromTarget(config.target);
|
|
172
|
+
const compilerOptions = await getCompilerOptionsForPackage(parsedConfig.options, env, pkgDir);
|
|
173
|
+
|
|
174
|
+
// esbuild 옵션 생성
|
|
175
|
+
const baseOptions = createLibraryEsbuildOptions({
|
|
176
|
+
pkgDir,
|
|
177
|
+
entryPoints,
|
|
178
|
+
target: config.target,
|
|
179
|
+
compilerOptions,
|
|
180
|
+
});
|
|
181
|
+
|
|
182
|
+
let isBuildFirstTime = isFirstBuild;
|
|
183
|
+
|
|
184
|
+
// context 생성 + watch-notify 플러그인 추가
|
|
185
|
+
const context = await esbuild.context({
|
|
186
|
+
...baseOptions,
|
|
187
|
+
plugins: [
|
|
188
|
+
...(baseOptions.plugins ?? []),
|
|
189
|
+
{
|
|
190
|
+
name: "watch-notify",
|
|
191
|
+
setup(pluginBuild) {
|
|
192
|
+
pluginBuild.onStart(() => {
|
|
193
|
+
sender.send("buildStart", {});
|
|
194
|
+
});
|
|
195
|
+
|
|
196
|
+
pluginBuild.onEnd((result) => {
|
|
197
|
+
const errors = result.errors.map((e) => e.text);
|
|
198
|
+
const success = result.errors.length === 0;
|
|
199
|
+
|
|
200
|
+
sender.send("build", { success, errors: errors.length > 0 ? errors : undefined });
|
|
201
|
+
|
|
202
|
+
if (isBuildFirstTime) {
|
|
203
|
+
isBuildFirstTime = false;
|
|
204
|
+
resolveFirstBuild?.();
|
|
205
|
+
}
|
|
206
|
+
});
|
|
207
|
+
},
|
|
208
|
+
},
|
|
209
|
+
],
|
|
210
|
+
});
|
|
211
|
+
|
|
212
|
+
// 초기 빌드
|
|
213
|
+
await context.rebuild();
|
|
214
|
+
|
|
215
|
+
return context;
|
|
216
|
+
}
|
|
217
|
+
|
|
151
218
|
/**
|
|
152
219
|
* watch 시작
|
|
153
220
|
* @remarks 이 함수는 Worker당 한 번만 호출되어야 합니다.
|
|
@@ -160,62 +227,50 @@ async function startWatch(info: LibraryWatchInfo): Promise<void> {
|
|
|
160
227
|
isWatchStarted = true;
|
|
161
228
|
|
|
162
229
|
try {
|
|
163
|
-
// tsconfig 파싱
|
|
164
|
-
const parsedConfig = parseRootTsconfig(info.cwd);
|
|
165
|
-
const entryPoints = getPackageSourceFiles(info.pkgDir, parsedConfig);
|
|
166
|
-
|
|
167
|
-
// 타겟별 compilerOptions 생성
|
|
168
|
-
const env = getTypecheckEnvFromTarget(info.config.target);
|
|
169
|
-
const compilerOptions = await getCompilerOptionsForPackage(parsedConfig.options, env, info.pkgDir);
|
|
170
|
-
|
|
171
230
|
// 첫 번째 빌드 완료 대기를 위한 Promise
|
|
172
231
|
let resolveFirstBuild!: () => void;
|
|
173
232
|
const firstBuildPromise = new Promise<void>((resolve) => {
|
|
174
233
|
resolveFirstBuild = resolve;
|
|
175
234
|
});
|
|
176
235
|
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
// esbuild 기본 옵션 생성
|
|
180
|
-
const baseOptions = createLibraryEsbuildOptions({
|
|
181
|
-
pkgDir: info.pkgDir,
|
|
182
|
-
entryPoints,
|
|
183
|
-
target: info.config.target,
|
|
184
|
-
compilerOptions,
|
|
185
|
-
});
|
|
186
|
-
|
|
187
|
-
// watch용 플러그인 추가
|
|
188
|
-
esbuildContext = await esbuild.context({
|
|
189
|
-
...baseOptions,
|
|
190
|
-
plugins: [
|
|
191
|
-
...(baseOptions.plugins ?? []),
|
|
192
|
-
{
|
|
193
|
-
name: "watch-notify",
|
|
194
|
-
setup(pluginBuild) {
|
|
195
|
-
pluginBuild.onStart(() => {
|
|
196
|
-
sender.send("buildStart", {});
|
|
197
|
-
});
|
|
198
|
-
|
|
199
|
-
pluginBuild.onEnd((result) => {
|
|
200
|
-
const errors = result.errors.map((e) => e.text);
|
|
201
|
-
const success = result.errors.length === 0;
|
|
202
|
-
|
|
203
|
-
sender.send("build", { success, errors: errors.length > 0 ? errors : undefined });
|
|
204
|
-
|
|
205
|
-
if (isFirstBuild) {
|
|
206
|
-
isFirstBuild = false;
|
|
207
|
-
resolveFirstBuild();
|
|
208
|
-
}
|
|
209
|
-
});
|
|
210
|
-
},
|
|
211
|
-
},
|
|
212
|
-
],
|
|
213
|
-
});
|
|
214
|
-
|
|
215
|
-
await esbuildContext.watch();
|
|
236
|
+
// 초기 esbuild context 생성 및 빌드
|
|
237
|
+
esbuildContext = await createAndBuildContext(info.pkgDir, info.cwd, info.config, true, resolveFirstBuild);
|
|
216
238
|
|
|
217
239
|
// 첫 번째 빌드 완료 대기
|
|
218
240
|
await firstBuildPromise;
|
|
241
|
+
|
|
242
|
+
// FsWatcher 시작 (src/**/*.{ts,tsx} 감시)
|
|
243
|
+
const srcPattern = path.join(info.pkgDir, "src", "**", "*.{ts,tsx}");
|
|
244
|
+
fsWatcher = await FsWatcher.watch([srcPattern]);
|
|
245
|
+
|
|
246
|
+
// 파일 변경 감지 시 처리
|
|
247
|
+
fsWatcher.onChange({ delay: 300 }, async (changes) => {
|
|
248
|
+
try {
|
|
249
|
+
// add 또는 unlink 이벤트가 있는지 확인
|
|
250
|
+
const hasAddOrUnlink = changes.some((c) => c.event === "add" || c.event === "unlink");
|
|
251
|
+
|
|
252
|
+
if (hasAddOrUnlink) {
|
|
253
|
+
// entry points 변경이 있으므로 context 재생성
|
|
254
|
+
logger.debug("파일 추가/삭제 감지, context 재생성");
|
|
255
|
+
|
|
256
|
+
const oldContext = esbuildContext;
|
|
257
|
+
esbuildContext = await createAndBuildContext(info.pkgDir, info.cwd, info.config, false);
|
|
258
|
+
|
|
259
|
+
if (oldContext != null) {
|
|
260
|
+
await oldContext.dispose();
|
|
261
|
+
}
|
|
262
|
+
} else {
|
|
263
|
+
// 파일 내용만 변경 (change 이벤트)
|
|
264
|
+
if (esbuildContext != null) {
|
|
265
|
+
await esbuildContext.rebuild();
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
} catch (err) {
|
|
269
|
+
sender.send("error", {
|
|
270
|
+
message: err instanceof Error ? err.message : String(err),
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
});
|
|
219
274
|
} catch (err) {
|
|
220
275
|
sender.send("error", {
|
|
221
276
|
message: err instanceof Error ? err.message : String(err),
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { env } from "@simplysm/core-common";
|
|
2
|
-
import {
|
|
2
|
+
import { createServiceServer } from "@simplysm/service-server";
|
|
3
3
|
|
|
4
|
-
export const server =
|
|
4
|
+
export const server = createServiceServer({
|
|
5
5
|
rootPath: process.cwd(),
|
|
6
6
|
port: {{port}},
|
|
7
7
|
services: [],
|
|
@@ -15,9 +15,9 @@
|
|
|
15
15
|
"vitest": "vitest"
|
|
16
16
|
},
|
|
17
17
|
"devDependencies": {
|
|
18
|
-
"@simplysm/sd-cli": "~13.0.
|
|
19
|
-
"@simplysm/claude": "~13.0.
|
|
20
|
-
"@simplysm/eslint-plugin": "~13.0.
|
|
18
|
+
"@simplysm/sd-cli": "~13.0.1",
|
|
19
|
+
"@simplysm/claude": "~13.0.1",
|
|
20
|
+
"@simplysm/eslint-plugin": "~13.0.1",
|
|
21
21
|
"@types/node": "^20.19.33",
|
|
22
22
|
"eslint": "^9.39.2",
|
|
23
23
|
"prettier": "^3.8.1",
|