@simplysm/sd-cli 13.0.62 → 13.0.65
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/utils/esbuild-config.d.ts +1 -1
- package/dist/utils/esbuild-config.d.ts.map +1 -1
- package/dist/utils/esbuild-config.js +3 -0
- package/dist/utils/esbuild-config.js.map +1 -1
- package/dist/workers/server.worker.d.ts.map +1 -1
- package/dist/workers/server.worker.js +52 -27
- package/dist/workers/server.worker.js.map +1 -1
- package/package.json +4 -4
- package/src/utils/esbuild-config.ts +4 -2
- package/src/workers/server.worker.ts +72 -31
- 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
|
@@ -7,7 +7,7 @@ import type { TypecheckEnv } from "./tsconfig";
|
|
|
7
7
|
* - 그 외 파일(.js.map 등): 원본 그대로 비교
|
|
8
8
|
* - 기존 파일과 내용이 동일하면 쓰기를 건너뛰어 타임스탬프를 유지한다.
|
|
9
9
|
*/
|
|
10
|
-
export declare function writeChangedOutputFiles(outputFiles: esbuild.OutputFile[]): Promise<
|
|
10
|
+
export declare function writeChangedOutputFiles(outputFiles: esbuild.OutputFile[]): Promise<boolean>;
|
|
11
11
|
/**
|
|
12
12
|
* Library 빌드용 esbuild 옵션
|
|
13
13
|
* - bundle: false (개별 파일 트랜스파일)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"esbuild-config.d.ts","sourceRoot":"","sources":["..\\..\\src\\utils\\esbuild-config.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,OAAO,MAAM,SAAS,CAAC;AAEnC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C;;;;;;GAMG;AACH,wBAAsB,uBAAuB,CAAC,WAAW,EAAE,OAAO,CAAC,UAAU,EAAE,GAAG,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"esbuild-config.d.ts","sourceRoot":"","sources":["..\\..\\src\\utils\\esbuild-config.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,OAAO,MAAM,SAAS,CAAC;AAEnC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C;;;;;;GAMG;AACH,wBAAsB,uBAAuB,CAAC,WAAW,EAAE,OAAO,CAAC,UAAU,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CA2BjG;AAED;;;;GAIG;AACH,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAAC;IACvC,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC1C;AAED;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACzC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,qBAAqB;IACrB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAWD;;;;;;;GAOG;AACH,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,YAAY,CAuBhG;AAED;;;;;;;;GAQG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,YAAY,CA0B9F;AAED;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,YAAY,CAE9F;AAUD;;;;;GAKG;AACH,wBAAgB,kCAAkC,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAU3E;AA8CD;;;;;GAKG;AACH,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAUrE"}
|
|
@@ -4,6 +4,7 @@ import fs from "fs/promises";
|
|
|
4
4
|
import { createRequire } from "module";
|
|
5
5
|
import { solidPlugin } from "esbuild-plugin-solid";
|
|
6
6
|
async function writeChangedOutputFiles(outputFiles) {
|
|
7
|
+
let hasChanges = false;
|
|
7
8
|
await Promise.all(
|
|
8
9
|
outputFiles.map(async (file) => {
|
|
9
10
|
const finalText = file.path.endsWith(".js") ? file.text.replace(
|
|
@@ -18,10 +19,12 @@ async function writeChangedOutputFiles(outputFiles) {
|
|
|
18
19
|
if (existing === finalText) return;
|
|
19
20
|
} catch {
|
|
20
21
|
}
|
|
22
|
+
hasChanges = true;
|
|
21
23
|
await fs.mkdir(path.dirname(file.path), { recursive: true });
|
|
22
24
|
await fs.writeFile(file.path, finalText);
|
|
23
25
|
})
|
|
24
26
|
);
|
|
27
|
+
return hasChanges;
|
|
25
28
|
}
|
|
26
29
|
function hasSolidDependency(pkgDir) {
|
|
27
30
|
const pkgJson = JSON.parse(readFileSync(path.join(pkgDir, "package.json"), "utf-8"));
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/utils/esbuild-config.ts"],
|
|
4
|
-
"mappings": "AAAA,OAAO,UAAU;AACjB,SAAS,cAAc,kBAAkB;AACzC,OAAO,QAAQ;AACf,SAAS,qBAAqB;AAE9B,SAAS,mBAAmB;AAU5B,eAAsB,wBAAwB,
|
|
4
|
+
"mappings": "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",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.worker.d.ts","sourceRoot":"","sources":["..\\..\\src\\workers\\server.worker.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"server.worker.d.ts","sourceRoot":"","sources":["..\\..\\src\\workers\\server.worker.ts"],"names":[],"mappings":"AAsBA;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,oBAAoB;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,qCAAqC;IACrC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,wCAAwC;IACxC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,2CAA2C;IAC3C,GAAG,CAAC,EAAE;QACJ,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;KAC7B,CAAC;IACF,8EAA8E;IAC9E,cAAc,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;CACnC;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,oBAAoB;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,qCAAqC;IACrC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,wCAAwC;IACxC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,2CAA2C;IAC3C,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAmB,SAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IACjE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAClC,KAAK,EAAE,gBAAgB,CAAC;IACxB,KAAK,EAAE,gBAAgB,CAAC;CACzB;AA6MD;;GAEG;AACH,iBAAe,KAAK,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAsDtE;AA6FD;;;;GAIG;AACH,iBAAe,UAAU,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAoG9D;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"}
|
|
@@ -2,7 +2,7 @@ import path from "path";
|
|
|
2
2
|
import fs from "fs";
|
|
3
3
|
import cp from "child_process";
|
|
4
4
|
import esbuild from "esbuild";
|
|
5
|
-
import { createWorker, FsWatcher } from "@simplysm/core-node";
|
|
5
|
+
import { createWorker, FsWatcher, pathNorm } from "@simplysm/core-node";
|
|
6
6
|
import { consola } from "consola";
|
|
7
7
|
import {
|
|
8
8
|
parseRootTsconfig,
|
|
@@ -12,17 +12,20 @@ import {
|
|
|
12
12
|
import {
|
|
13
13
|
createServerEsbuildOptions,
|
|
14
14
|
collectUninstalledOptionalPeerDeps,
|
|
15
|
-
collectNativeModuleExternals
|
|
15
|
+
collectNativeModuleExternals,
|
|
16
|
+
writeChangedOutputFiles
|
|
16
17
|
} from "../utils/esbuild-config.js";
|
|
17
18
|
import { registerCleanupHandlers } from "../utils/worker-utils.js";
|
|
18
19
|
import { copyPublicFiles, watchPublicFiles } from "../utils/copy-public.js";
|
|
19
20
|
const logger = consola.withTag("sd:cli:server:worker");
|
|
20
21
|
let esbuildContext;
|
|
22
|
+
let lastMetafile;
|
|
21
23
|
let publicWatcher;
|
|
22
24
|
let srcWatcher;
|
|
23
25
|
async function cleanup() {
|
|
24
26
|
const contextToDispose = esbuildContext;
|
|
25
27
|
esbuildContext = void 0;
|
|
28
|
+
lastMetafile = void 0;
|
|
26
29
|
const watcherToClose = publicWatcher;
|
|
27
30
|
publicWatcher = void 0;
|
|
28
31
|
const srcWatcherToClose = srcWatcher;
|
|
@@ -212,6 +215,8 @@ async function createAndBuildContext(info, isFirstBuild, resolveFirstBuild) {
|
|
|
212
215
|
let isBuildFirstTime = isFirstBuild;
|
|
213
216
|
const context = await esbuild.context({
|
|
214
217
|
...baseOptions,
|
|
218
|
+
metafile: true,
|
|
219
|
+
write: false,
|
|
215
220
|
plugins: [
|
|
216
221
|
{
|
|
217
222
|
name: "watch-notify",
|
|
@@ -219,20 +224,31 @@ async function createAndBuildContext(info, isFirstBuild, resolveFirstBuild) {
|
|
|
219
224
|
pluginBuild.onStart(() => {
|
|
220
225
|
sender.send("buildStart", {});
|
|
221
226
|
});
|
|
222
|
-
pluginBuild.onEnd((result) => {
|
|
227
|
+
pluginBuild.onEnd(async (result) => {
|
|
228
|
+
if (result.metafile != null) {
|
|
229
|
+
lastMetafile = result.metafile;
|
|
230
|
+
}
|
|
223
231
|
const errors = result.errors.map((e) => e.text);
|
|
224
232
|
const warnings = result.warnings.map((w) => w.text);
|
|
225
233
|
const success = result.errors.length === 0;
|
|
234
|
+
let hasOutputChange = false;
|
|
235
|
+
if (success && result.outputFiles != null) {
|
|
236
|
+
hasOutputChange = await writeChangedOutputFiles(result.outputFiles);
|
|
237
|
+
}
|
|
226
238
|
if (isBuildFirstTime && success) {
|
|
227
239
|
const confDistPath = path.join(info.pkgDir, "dist", ".config.json");
|
|
228
240
|
fs.writeFileSync(confDistPath, JSON.stringify(info.configs ?? {}, void 0, 2));
|
|
229
241
|
}
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
242
|
+
if (isBuildFirstTime || hasOutputChange || !success) {
|
|
243
|
+
sender.send("build", {
|
|
244
|
+
success,
|
|
245
|
+
mainJsPath,
|
|
246
|
+
errors: errors.length > 0 ? errors : void 0,
|
|
247
|
+
warnings: warnings.length > 0 ? warnings : void 0
|
|
248
|
+
});
|
|
249
|
+
} else {
|
|
250
|
+
logger.debug("output \uBCC0\uACBD \uC5C6\uC74C, \uC11C\uBC84 \uC7AC\uC2DC\uC791 skip");
|
|
251
|
+
}
|
|
236
252
|
if (isBuildFirstTime) {
|
|
237
253
|
isBuildFirstTime = false;
|
|
238
254
|
resolveFirstBuild?.();
|
|
@@ -259,37 +275,46 @@ async function startWatch(info) {
|
|
|
259
275
|
await firstBuildPromise;
|
|
260
276
|
publicWatcher = await watchPublicFiles(info.pkgDir, true);
|
|
261
277
|
const watchPaths = [];
|
|
262
|
-
watchPaths.push(path.join(info.
|
|
278
|
+
watchPaths.push(path.join(info.cwd, "packages", "*", "src", "**", "*"));
|
|
279
|
+
watchPaths.push(path.join(info.cwd, "packages", "*", "*.{ts,js,css}"));
|
|
263
280
|
if (info.watchScopes != null) {
|
|
264
281
|
for (const scope of info.watchScopes) {
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
}
|
|
282
|
+
watchPaths.push(path.join(info.cwd, "node_modules", scope, "*", "dist", "**", "*.js"));
|
|
283
|
+
watchPaths.push(path.join(info.cwd, "node_modules", scope, "*", "*.{ts,js,css}"));
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
if (info.watchScopes != null) {
|
|
287
|
+
for (const scope of info.watchScopes) {
|
|
288
|
+
watchPaths.push(path.join(info.pkgDir, "node_modules", scope, "*", "dist", "**", "*.js"));
|
|
289
|
+
watchPaths.push(path.join(info.pkgDir, "node_modules", scope, "*", "*.{ts,js,css}"));
|
|
273
290
|
}
|
|
274
291
|
}
|
|
275
292
|
srcWatcher = await FsWatcher.watch(watchPaths);
|
|
276
293
|
srcWatcher.onChange({ delay: 300 }, async (changes) => {
|
|
277
294
|
try {
|
|
278
|
-
const
|
|
279
|
-
|
|
280
|
-
(
|
|
281
|
-
);
|
|
282
|
-
if (hasEntryPointChange) {
|
|
283
|
-
logger.debug("\uC11C\uBC84 \uC18C\uC2A4 \uD30C\uC77C \uCD94\uAC00/\uC0AD\uC81C \uAC10\uC9C0, context \uC7AC\uC0DD\uC131");
|
|
295
|
+
const hasFileAddOrRemove = changes.some((c) => c.event === "add" || c.event === "unlink");
|
|
296
|
+
if (hasFileAddOrRemove) {
|
|
297
|
+
logger.debug("\uD30C\uC77C \uCD94\uAC00/\uC0AD\uC81C \uAC10\uC9C0, context \uC7AC\uC0DD\uC131");
|
|
284
298
|
const oldContext = esbuildContext;
|
|
285
299
|
esbuildContext = await createAndBuildContext(info, false);
|
|
286
300
|
if (oldContext != null) {
|
|
287
301
|
await oldContext.dispose();
|
|
288
302
|
}
|
|
303
|
+
return;
|
|
304
|
+
}
|
|
305
|
+
if (esbuildContext == null) return;
|
|
306
|
+
if (lastMetafile == null) {
|
|
307
|
+
await esbuildContext.rebuild();
|
|
308
|
+
return;
|
|
309
|
+
}
|
|
310
|
+
const metafileAbsPaths = new Set(
|
|
311
|
+
Object.keys(lastMetafile.inputs).map((key) => pathNorm(info.cwd, key))
|
|
312
|
+
);
|
|
313
|
+
const hasRelevantChange = changes.some((c) => metafileAbsPaths.has(c.path));
|
|
314
|
+
if (hasRelevantChange) {
|
|
315
|
+
await esbuildContext.rebuild();
|
|
289
316
|
} else {
|
|
290
|
-
|
|
291
|
-
await esbuildContext.rebuild();
|
|
292
|
-
}
|
|
317
|
+
logger.debug("\uBCC0\uACBD\uB41C \uD30C\uC77C\uC774 \uBE4C\uB4DC\uC5D0 \uD3EC\uD568\uB418\uC9C0 \uC54A\uC74C, rebuild skip");
|
|
293
318
|
}
|
|
294
319
|
} catch (err) {
|
|
295
320
|
sender.send("error", {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/workers/server.worker.ts"],
|
|
4
|
-
"mappings": "AAAA,OAAO,UAAU;AACjB,OAAO,QAAQ;AACf,OAAO,QAAQ;AACf,OAAO,aAAa;AACpB,SAAS,cAAc,
|
|
4
|
+
"mappings": "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",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@simplysm/sd-cli",
|
|
3
|
-
"version": "13.0.
|
|
3
|
+
"version": "13.0.65",
|
|
4
4
|
"description": "심플리즘 패키지 - CLI 도구",
|
|
5
5
|
"author": "김석래",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -41,9 +41,9 @@
|
|
|
41
41
|
"vite-plugin-solid": "^2.11.10",
|
|
42
42
|
"vite-tsconfig-paths": "^6.1.1",
|
|
43
43
|
"yargs": "^18.0.0",
|
|
44
|
-
"@simplysm/core-common": "13.0.
|
|
45
|
-
"@simplysm/core-node": "13.0.
|
|
46
|
-
"@simplysm/storage": "13.0.
|
|
44
|
+
"@simplysm/core-common": "13.0.65",
|
|
45
|
+
"@simplysm/core-node": "13.0.65",
|
|
46
|
+
"@simplysm/storage": "13.0.65"
|
|
47
47
|
},
|
|
48
48
|
"devDependencies": {
|
|
49
49
|
"@types/semver": "^7.7.1",
|
|
@@ -13,7 +13,8 @@ import type { TypecheckEnv } from "./tsconfig";
|
|
|
13
13
|
* - 그 외 파일(.js.map 등): 원본 그대로 비교
|
|
14
14
|
* - 기존 파일과 내용이 동일하면 쓰기를 건너뛰어 타임스탬프를 유지한다.
|
|
15
15
|
*/
|
|
16
|
-
export async function writeChangedOutputFiles(outputFiles: esbuild.OutputFile[]): Promise<
|
|
16
|
+
export async function writeChangedOutputFiles(outputFiles: esbuild.OutputFile[]): Promise<boolean> {
|
|
17
|
+
let hasChanges = false;
|
|
17
18
|
await Promise.all(
|
|
18
19
|
outputFiles.map(async (file) => {
|
|
19
20
|
const finalText = file.path.endsWith(".js")
|
|
@@ -26,7 +27,6 @@ export async function writeChangedOutputFiles(outputFiles: esbuild.OutputFile[])
|
|
|
26
27
|
)
|
|
27
28
|
: file.text;
|
|
28
29
|
|
|
29
|
-
// Compare with existing file — skip write if unchanged
|
|
30
30
|
try {
|
|
31
31
|
const existing = await fs.readFile(file.path, "utf-8");
|
|
32
32
|
if (existing === finalText) return;
|
|
@@ -34,10 +34,12 @@ export async function writeChangedOutputFiles(outputFiles: esbuild.OutputFile[])
|
|
|
34
34
|
// File doesn't exist yet
|
|
35
35
|
}
|
|
36
36
|
|
|
37
|
+
hasChanges = true;
|
|
37
38
|
await fs.mkdir(path.dirname(file.path), { recursive: true });
|
|
38
39
|
await fs.writeFile(file.path, finalText);
|
|
39
40
|
}),
|
|
40
41
|
);
|
|
42
|
+
return hasChanges;
|
|
41
43
|
}
|
|
42
44
|
|
|
43
45
|
/**
|
|
@@ -2,7 +2,7 @@ import path from "path";
|
|
|
2
2
|
import fs from "fs";
|
|
3
3
|
import cp from "child_process";
|
|
4
4
|
import esbuild from "esbuild";
|
|
5
|
-
import { createWorker, FsWatcher } from "@simplysm/core-node";
|
|
5
|
+
import { createWorker, FsWatcher, pathNorm } from "@simplysm/core-node";
|
|
6
6
|
import { consola } from "consola";
|
|
7
7
|
import {
|
|
8
8
|
parseRootTsconfig,
|
|
@@ -13,6 +13,7 @@ import {
|
|
|
13
13
|
createServerEsbuildOptions,
|
|
14
14
|
collectUninstalledOptionalPeerDeps,
|
|
15
15
|
collectNativeModuleExternals,
|
|
16
|
+
writeChangedOutputFiles,
|
|
16
17
|
} from "../utils/esbuild-config";
|
|
17
18
|
import { registerCleanupHandlers } from "../utils/worker-utils";
|
|
18
19
|
import { copyPublicFiles, watchPublicFiles } from "../utils/copy-public";
|
|
@@ -103,6 +104,9 @@ const logger = consola.withTag("sd:cli:server:worker");
|
|
|
103
104
|
/** esbuild build context (정리 대상) */
|
|
104
105
|
let esbuildContext: esbuild.BuildContext | undefined;
|
|
105
106
|
|
|
107
|
+
/** 마지막 빌드의 metafile (rebuild 시 변경 파일 필터링용) */
|
|
108
|
+
let lastMetafile: esbuild.Metafile | undefined;
|
|
109
|
+
|
|
106
110
|
/** public 파일 watcher (정리 대상) */
|
|
107
111
|
let publicWatcher: FsWatcher | undefined;
|
|
108
112
|
|
|
@@ -117,6 +121,7 @@ async function cleanup(): Promise<void> {
|
|
|
117
121
|
// (Promise.all 대기 중 다른 호출에서 전역 변수를 수정할 수 있으므로)
|
|
118
122
|
const contextToDispose = esbuildContext;
|
|
119
123
|
esbuildContext = undefined;
|
|
124
|
+
lastMetafile = undefined;
|
|
120
125
|
|
|
121
126
|
const watcherToClose = publicWatcher;
|
|
122
127
|
publicWatcher = undefined;
|
|
@@ -385,6 +390,8 @@ async function createAndBuildContext(
|
|
|
385
390
|
|
|
386
391
|
const context = await esbuild.context({
|
|
387
392
|
...baseOptions,
|
|
393
|
+
metafile: true,
|
|
394
|
+
write: false,
|
|
388
395
|
plugins: [
|
|
389
396
|
{
|
|
390
397
|
name: "watch-notify",
|
|
@@ -393,22 +400,38 @@ async function createAndBuildContext(
|
|
|
393
400
|
sender.send("buildStart", {});
|
|
394
401
|
});
|
|
395
402
|
|
|
396
|
-
pluginBuild.onEnd((result) => {
|
|
403
|
+
pluginBuild.onEnd(async (result) => {
|
|
404
|
+
// metafile 저장
|
|
405
|
+
if (result.metafile != null) {
|
|
406
|
+
lastMetafile = result.metafile;
|
|
407
|
+
}
|
|
408
|
+
|
|
397
409
|
const errors = result.errors.map((e) => e.text);
|
|
398
410
|
const warnings = result.warnings.map((w) => w.text);
|
|
399
411
|
const success = result.errors.length === 0;
|
|
400
412
|
|
|
413
|
+
// output 파일 쓰기 및 변경 여부 확인
|
|
414
|
+
let hasOutputChange = false;
|
|
415
|
+
if (success && result.outputFiles != null) {
|
|
416
|
+
hasOutputChange = await writeChangedOutputFiles(result.outputFiles);
|
|
417
|
+
}
|
|
418
|
+
|
|
401
419
|
if (isBuildFirstTime && success) {
|
|
402
420
|
const confDistPath = path.join(info.pkgDir, "dist", ".config.json");
|
|
403
421
|
fs.writeFileSync(confDistPath, JSON.stringify(info.configs ?? {}, undefined, 2));
|
|
404
422
|
}
|
|
405
423
|
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
424
|
+
// 첫 빌드이거나, output이 변경되었거나, 에러인 경우에만 build 이벤트 발생
|
|
425
|
+
if (isBuildFirstTime || hasOutputChange || !success) {
|
|
426
|
+
sender.send("build", {
|
|
427
|
+
success,
|
|
428
|
+
mainJsPath,
|
|
429
|
+
errors: errors.length > 0 ? errors : undefined,
|
|
430
|
+
warnings: warnings.length > 0 ? warnings : undefined,
|
|
431
|
+
});
|
|
432
|
+
} else {
|
|
433
|
+
logger.debug("output 변경 없음, 서버 재시작 skip");
|
|
434
|
+
}
|
|
412
435
|
|
|
413
436
|
if (isBuildFirstTime) {
|
|
414
437
|
isBuildFirstTime = false;
|
|
@@ -455,21 +478,25 @@ async function startWatch(info: ServerWatchInfo): Promise<void> {
|
|
|
455
478
|
// FsWatcher 감시 경로 수집
|
|
456
479
|
const watchPaths: string[] = [];
|
|
457
480
|
|
|
458
|
-
// 1)
|
|
459
|
-
watchPaths.push(path.join(info.
|
|
481
|
+
// 1) workspace 패키지 소스
|
|
482
|
+
watchPaths.push(path.join(info.cwd, "packages", "*", "src", "**", "*"));
|
|
460
483
|
|
|
461
|
-
// 2)
|
|
484
|
+
// 2) workspace 패키지 루트 설정 파일
|
|
485
|
+
watchPaths.push(path.join(info.cwd, "packages", "*", "*.{ts,js,css}"));
|
|
486
|
+
|
|
487
|
+
// 3-4) scope 패키지 (루트 node_modules)
|
|
462
488
|
if (info.watchScopes != null) {
|
|
463
489
|
for (const scope of info.watchScopes) {
|
|
464
|
-
|
|
465
|
-
|
|
490
|
+
watchPaths.push(path.join(info.cwd, "node_modules", scope, "*", "dist", "**", "*.js"));
|
|
491
|
+
watchPaths.push(path.join(info.cwd, "node_modules", scope, "*", "*.{ts,js,css}"));
|
|
492
|
+
}
|
|
493
|
+
}
|
|
466
494
|
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
}
|
|
495
|
+
// 5-6) scope 패키지 (현재 패키지 node_modules, hoisting 안 된 경우)
|
|
496
|
+
if (info.watchScopes != null) {
|
|
497
|
+
for (const scope of info.watchScopes) {
|
|
498
|
+
watchPaths.push(path.join(info.pkgDir, "node_modules", scope, "*", "dist", "**", "*.js"));
|
|
499
|
+
watchPaths.push(path.join(info.pkgDir, "node_modules", scope, "*", "*.{ts,js,css}"));
|
|
473
500
|
}
|
|
474
501
|
}
|
|
475
502
|
|
|
@@ -479,16 +506,11 @@ async function startWatch(info: ServerWatchInfo): Promise<void> {
|
|
|
479
506
|
// 파일 변경 감지 시 처리
|
|
480
507
|
srcWatcher.onChange({ delay: 300 }, async (changes) => {
|
|
481
508
|
try {
|
|
482
|
-
//
|
|
483
|
-
const
|
|
484
|
-
const hasEntryPointChange = changes.some(
|
|
485
|
-
(c) =>
|
|
486
|
-
(c.event === "add" || c.event === "unlink") &&
|
|
487
|
-
c.path.startsWith(srcDir.replace(/\\/g, "/")),
|
|
488
|
-
);
|
|
509
|
+
// 파일 추가/삭제가 있으면 context 재생성 (import graph 변경 가능)
|
|
510
|
+
const hasFileAddOrRemove = changes.some((c) => c.event === "add" || c.event === "unlink");
|
|
489
511
|
|
|
490
|
-
if (
|
|
491
|
-
logger.debug("
|
|
512
|
+
if (hasFileAddOrRemove) {
|
|
513
|
+
logger.debug("파일 추가/삭제 감지, context 재생성");
|
|
492
514
|
|
|
493
515
|
const oldContext = esbuildContext;
|
|
494
516
|
esbuildContext = await createAndBuildContext(info, false);
|
|
@@ -496,10 +518,29 @@ async function startWatch(info: ServerWatchInfo): Promise<void> {
|
|
|
496
518
|
if (oldContext != null) {
|
|
497
519
|
await oldContext.dispose();
|
|
498
520
|
}
|
|
521
|
+
return;
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
// 파일 변경만 있는 경우: metafile 필터링
|
|
525
|
+
if (esbuildContext == null) return;
|
|
526
|
+
|
|
527
|
+
// metafile이 없으면 (첫 빌드 전) 무조건 rebuild
|
|
528
|
+
if (lastMetafile == null) {
|
|
529
|
+
await esbuildContext.rebuild();
|
|
530
|
+
return;
|
|
531
|
+
}
|
|
532
|
+
|
|
533
|
+
// metafile.inputs 키를 절대경로(NormPath)로 변환하여 비교
|
|
534
|
+
const metafileAbsPaths = new Set(
|
|
535
|
+
Object.keys(lastMetafile.inputs).map((key) => pathNorm(info.cwd, key)),
|
|
536
|
+
);
|
|
537
|
+
|
|
538
|
+
const hasRelevantChange = changes.some((c) => metafileAbsPaths.has(c.path));
|
|
539
|
+
|
|
540
|
+
if (hasRelevantChange) {
|
|
541
|
+
await esbuildContext.rebuild();
|
|
499
542
|
} else {
|
|
500
|
-
|
|
501
|
-
await esbuildContext.rebuild();
|
|
502
|
-
}
|
|
543
|
+
logger.debug("변경된 파일이 빌드에 포함되지 않음, rebuild skip");
|
|
503
544
|
}
|
|
504
545
|
} catch (err) {
|
|
505
546
|
sender.send("error", {
|
|
@@ -15,9 +15,9 @@
|
|
|
15
15
|
"vitest": "vitest"
|
|
16
16
|
},
|
|
17
17
|
"devDependencies": {
|
|
18
|
-
"@simplysm/sd-cli": "~13.0.
|
|
19
|
-
"@simplysm/sd-claude": "~13.0.
|
|
20
|
-
"@simplysm/lint": "~13.0.
|
|
18
|
+
"@simplysm/sd-cli": "~13.0.65",
|
|
19
|
+
"@simplysm/sd-claude": "~13.0.65",
|
|
20
|
+
"@simplysm/lint": "~13.0.65",
|
|
21
21
|
"@types/node": "^20.19.33",
|
|
22
22
|
"eslint": "^9.39.2",
|
|
23
23
|
"prettier": "^3.8.1",
|