@simplysm/sd-cli 13.0.64 → 13.0.66

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.
Files changed (39) hide show
  1. package/dist/orchestrators/DevOrchestrator.d.ts +0 -1
  2. package/dist/orchestrators/DevOrchestrator.d.ts.map +1 -1
  3. package/dist/orchestrators/DevOrchestrator.js +4 -12
  4. package/dist/orchestrators/DevOrchestrator.js.map +1 -1
  5. package/dist/utils/esbuild-config.d.ts +1 -1
  6. package/dist/utils/esbuild-config.d.ts.map +1 -1
  7. package/dist/utils/esbuild-config.js +3 -0
  8. package/dist/utils/esbuild-config.js.map +1 -1
  9. package/dist/utils/package-utils.d.ts +5 -9
  10. package/dist/utils/package-utils.d.ts.map +1 -1
  11. package/dist/utils/package-utils.js +43 -13
  12. package/dist/utils/package-utils.js.map +1 -1
  13. package/dist/utils/tailwind-config-deps.d.ts +1 -1
  14. package/dist/utils/tailwind-config-deps.d.ts.map +1 -1
  15. package/dist/utils/tailwind-config-deps.js +5 -3
  16. package/dist/utils/tailwind-config-deps.js.map +1 -1
  17. package/dist/utils/vite-config.d.ts +3 -3
  18. package/dist/utils/vite-config.d.ts.map +1 -1
  19. package/dist/utils/vite-config.js +43 -52
  20. package/dist/utils/vite-config.js.map +1 -1
  21. package/dist/workers/client.worker.d.ts +2 -2
  22. package/dist/workers/client.worker.d.ts.map +1 -1
  23. package/dist/workers/client.worker.js +3 -1
  24. package/dist/workers/client.worker.js.map +1 -1
  25. package/dist/workers/server.worker.d.ts +2 -2
  26. package/dist/workers/server.worker.d.ts.map +1 -1
  27. package/dist/workers/server.worker.js +57 -30
  28. package/dist/workers/server.worker.js.map +1 -1
  29. package/package.json +4 -4
  30. package/src/orchestrators/DevOrchestrator.ts +4 -16
  31. package/src/utils/esbuild-config.ts +4 -2
  32. package/src/utils/package-utils.ts +62 -22
  33. package/src/utils/tailwind-config-deps.ts +6 -3
  34. package/src/utils/vite-config.ts +64 -92
  35. package/src/workers/client.worker.ts +7 -3
  36. package/src/workers/server.worker.ts +78 -38
  37. package/templates/add-client/__CLIENT__/package.json.hbs +1 -1
  38. package/templates/add-server/__SERVER__/package.json.hbs +2 -2
  39. package/templates/init/package.json.hbs +3 -3
@@ -5,6 +5,7 @@ import { createWorker } from "@simplysm/core-node";
5
5
  import { consola } from "consola";
6
6
  import { parseRootTsconfig, getCompilerOptionsForPackage } from "../utils/tsconfig.js";
7
7
  import { createViteConfig } from "../utils/vite-config.js";
8
+ import { collectDeps } from "../utils/package-utils.js";
8
9
  import { registerCleanupHandlers } from "../utils/worker-utils.js";
9
10
  const logger = consola.withTag("sd:cli:client:worker");
10
11
  let viteServer;
@@ -59,6 +60,7 @@ async function startWatch(info) {
59
60
  info.pkgDir
60
61
  );
61
62
  const serverPort = typeof info.config.server === "number" ? info.config.server : 0;
63
+ const { replaceDeps } = collectDeps(info.pkgDir, info.cwd, info.replaceDeps);
62
64
  const viteConfig = createViteConfig({
63
65
  pkgDir: info.pkgDir,
64
66
  name: info.name,
@@ -67,7 +69,7 @@ async function startWatch(info) {
67
69
  env: info.config.env,
68
70
  mode: "dev",
69
71
  serverPort,
70
- watchScopes: info.watchScopes,
72
+ replaceDeps,
71
73
  onScopeRebuild: () => sender.send("scopeRebuild", {})
72
74
  });
73
75
  viteServer = await createServer(viteConfig);
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/workers/client.worker.ts"],
4
- "mappings": "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",
4
+ "mappings": "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",
5
5
  "names": []
6
6
  }
@@ -41,8 +41,8 @@ export interface ServerWatchInfo {
41
41
  configs?: Record<string, unknown>;
42
42
  /** sd.config.ts에서 수동 지정한 external 모듈 */
43
43
  externals?: string[];
44
- /** scope 패키지 감시 대상 (e.g. ["@simplysm"]) */
45
- watchScopes?: string[];
44
+ /** sd.config.ts의 replaceDeps 설정 */
45
+ replaceDeps?: Record<string, string>;
46
46
  }
47
47
  /**
48
48
  * 빌드 이벤트
@@ -1 +1 @@
1
- {"version":3,"file":"server.worker.d.ts","sourceRoot":"","sources":["..\\..\\src\\workers\\server.worker.ts"],"names":[],"mappings":"AAqBA;;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;AAyMD;;GAEG;AACH,iBAAe,KAAK,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAsDtE;AA2ED;;;;GAIG;AACH,iBAAe,UAAU,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAkF9D;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
+ {"version":3,"file":"server.worker.d.ts","sourceRoot":"","sources":["..\\..\\src\\workers\\server.worker.ts"],"names":[],"mappings":"AAuBA;;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,mCAAmC;IACnC,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACtC;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,CAkG9D;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,21 @@ 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";
19
+ import { collectDeps } from "../utils/package-utils.js";
18
20
  import { copyPublicFiles, watchPublicFiles } from "../utils/copy-public.js";
19
21
  const logger = consola.withTag("sd:cli:server:worker");
20
22
  let esbuildContext;
23
+ let lastMetafile;
21
24
  let publicWatcher;
22
25
  let srcWatcher;
23
26
  async function cleanup() {
24
27
  const contextToDispose = esbuildContext;
25
28
  esbuildContext = void 0;
29
+ lastMetafile = void 0;
26
30
  const watcherToClose = publicWatcher;
27
31
  publicWatcher = void 0;
28
32
  const srcWatcherToClose = srcWatcher;
@@ -212,6 +216,8 @@ async function createAndBuildContext(info, isFirstBuild, resolveFirstBuild) {
212
216
  let isBuildFirstTime = isFirstBuild;
213
217
  const context = await esbuild.context({
214
218
  ...baseOptions,
219
+ metafile: true,
220
+ write: false,
215
221
  plugins: [
216
222
  {
217
223
  name: "watch-notify",
@@ -219,20 +225,31 @@ async function createAndBuildContext(info, isFirstBuild, resolveFirstBuild) {
219
225
  pluginBuild.onStart(() => {
220
226
  sender.send("buildStart", {});
221
227
  });
222
- pluginBuild.onEnd((result) => {
228
+ pluginBuild.onEnd(async (result) => {
229
+ if (result.metafile != null) {
230
+ lastMetafile = result.metafile;
231
+ }
223
232
  const errors = result.errors.map((e) => e.text);
224
233
  const warnings = result.warnings.map((w) => w.text);
225
234
  const success = result.errors.length === 0;
235
+ let hasOutputChange = false;
236
+ if (success && result.outputFiles != null) {
237
+ hasOutputChange = await writeChangedOutputFiles(result.outputFiles);
238
+ }
226
239
  if (isBuildFirstTime && success) {
227
240
  const confDistPath = path.join(info.pkgDir, "dist", ".config.json");
228
241
  fs.writeFileSync(confDistPath, JSON.stringify(info.configs ?? {}, void 0, 2));
229
242
  }
230
- sender.send("build", {
231
- success,
232
- mainJsPath,
233
- errors: errors.length > 0 ? errors : void 0,
234
- warnings: warnings.length > 0 ? warnings : void 0
235
- });
243
+ if (isBuildFirstTime || hasOutputChange || !success) {
244
+ sender.send("build", {
245
+ success,
246
+ mainJsPath,
247
+ errors: errors.length > 0 ? errors : void 0,
248
+ warnings: warnings.length > 0 ? warnings : void 0
249
+ });
250
+ } else {
251
+ logger.debug("output \uBCC0\uACBD \uC5C6\uC74C, \uC11C\uBC84 \uC7AC\uC2DC\uC791 skip");
252
+ }
236
253
  if (isBuildFirstTime) {
237
254
  isBuildFirstTime = false;
238
255
  resolveFirstBuild?.();
@@ -258,38 +275,48 @@ async function startWatch(info) {
258
275
  esbuildContext = await createAndBuildContext(info, true, resolveFirstBuild);
259
276
  await firstBuildPromise;
260
277
  publicWatcher = await watchPublicFiles(info.pkgDir, true);
278
+ const { workspaceDeps, replaceDeps } = collectDeps(info.pkgDir, info.cwd, info.replaceDeps);
261
279
  const watchPaths = [];
262
- watchPaths.push(path.join(info.pkgDir, "src", "**", "*.{ts,tsx}"));
263
- if (info.watchScopes != null) {
264
- for (const scope of info.watchScopes) {
265
- const scopeDir = path.join(info.pkgDir, "node_modules", scope);
266
- if (!fs.existsSync(scopeDir)) continue;
267
- for (const pkgName of fs.readdirSync(scopeDir)) {
268
- const distDir = path.join(scopeDir, pkgName, "dist");
269
- if (fs.existsSync(distDir)) {
270
- watchPaths.push(distDir);
271
- }
272
- }
273
- }
280
+ const watchDirs = [
281
+ info.pkgDir,
282
+ ...workspaceDeps.map((d) => path.join(info.cwd, "packages", d))
283
+ ];
284
+ for (const dir of watchDirs) {
285
+ watchPaths.push(path.join(dir, "src", "**", "*"));
286
+ watchPaths.push(path.join(dir, "*.{ts,js,css}"));
287
+ }
288
+ for (const pkg of replaceDeps) {
289
+ watchPaths.push(path.join(info.cwd, "node_modules", ...pkg.split("/"), "dist", "**", "*.js"));
290
+ watchPaths.push(
291
+ path.join(info.pkgDir, "node_modules", ...pkg.split("/"), "dist", "**", "*.js")
292
+ );
274
293
  }
275
294
  srcWatcher = await FsWatcher.watch(watchPaths);
276
295
  srcWatcher.onChange({ delay: 300 }, async (changes) => {
277
296
  try {
278
- const srcDir = path.join(info.pkgDir, "src");
279
- const hasEntryPointChange = changes.some(
280
- (c) => (c.event === "add" || c.event === "unlink") && c.path.startsWith(srcDir.replace(/\\/g, "/"))
281
- );
282
- if (hasEntryPointChange) {
283
- logger.debug("\uC11C\uBC84 \uC18C\uC2A4 \uD30C\uC77C \uCD94\uAC00/\uC0AD\uC81C \uAC10\uC9C0, context \uC7AC\uC0DD\uC131");
297
+ const hasFileAddOrRemove = changes.some((c) => c.event === "add" || c.event === "unlink");
298
+ if (hasFileAddOrRemove) {
299
+ logger.debug("\uD30C\uC77C \uCD94\uAC00/\uC0AD\uC81C \uAC10\uC9C0, context \uC7AC\uC0DD\uC131");
284
300
  const oldContext = esbuildContext;
285
301
  esbuildContext = await createAndBuildContext(info, false);
286
302
  if (oldContext != null) {
287
303
  await oldContext.dispose();
288
304
  }
305
+ return;
306
+ }
307
+ if (esbuildContext == null) return;
308
+ if (lastMetafile == null) {
309
+ await esbuildContext.rebuild();
310
+ return;
311
+ }
312
+ const metafileAbsPaths = new Set(
313
+ Object.keys(lastMetafile.inputs).map((key) => pathNorm(info.cwd, key))
314
+ );
315
+ const hasRelevantChange = changes.some((c) => metafileAbsPaths.has(c.path));
316
+ if (hasRelevantChange) {
317
+ await esbuildContext.rebuild();
289
318
  } else {
290
- if (esbuildContext != null) {
291
- await esbuildContext.rebuild();
292
- }
319
+ logger.debug("\uBCC0\uACBD\uB41C \uD30C\uC77C\uC774 \uBE4C\uB4DC\uC5D0 \uD3EC\uD568\uB418\uC9C0 \uC54A\uC74C, rebuild skip");
293
320
  }
294
321
  } catch (err) {
295
322
  sender.send("error", {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/workers/server.worker.ts"],
4
- "mappings": "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",
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.64",
3
+ "version": "13.0.66",
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-node": "13.0.64",
45
- "@simplysm/core-common": "13.0.64",
46
- "@simplysm/storage": "13.0.64"
44
+ "@simplysm/core-common": "13.0.66",
45
+ "@simplysm/storage": "13.0.66",
46
+ "@simplysm/core-node": "13.0.66"
47
47
  },
48
48
  "devDependencies": {
49
49
  "@types/semver": "^7.7.1",
@@ -1,4 +1,3 @@
1
- import fs from "fs";
2
1
  import path from "path";
3
2
  import { Worker, type WorkerProxy } from "@simplysm/core-node";
4
3
  import type { SdConfig, SdClientPackageConfig, SdServerPackageConfig } from "../sd-config.types";
@@ -10,11 +9,7 @@ import type * as ClientWorkerModule from "../workers/client.worker";
10
9
  import type * as ServerWorkerModule from "../workers/server.worker";
11
10
  import type * as ServerRuntimeWorkerModule from "../workers/server-runtime.worker";
12
11
  import { Capacitor } from "../capacitor/capacitor";
13
- import {
14
- filterPackagesByTargets,
15
- getWatchScopes,
16
- type PackageResult,
17
- } from "../utils/package-utils";
12
+ import { filterPackagesByTargets, type PackageResult } from "../utils/package-utils";
18
13
  import { printErrors, printServers } from "../utils/output-utils";
19
14
  import { RebuildManager } from "../utils/rebuild-manager";
20
15
  import {
@@ -70,8 +65,6 @@ export class DevOrchestrator {
70
65
  // Config
71
66
  private _sdConfig: SdConfig | undefined;
72
67
  private _baseEnv: { VER: string; DEV: string } | undefined;
73
- private _watchScopes: string[] = [];
74
-
75
68
  // Package classification
76
69
  private readonly _serverPackages: Array<{ name: string; config: SdServerPackageConfig }> = [];
77
70
  private readonly _clientPackages: Array<{ name: string; config: SdClientPackageConfig }> = [];
@@ -153,11 +146,6 @@ export class DevOrchestrator {
153
146
  const version = await getVersion(this._cwd);
154
147
  this._baseEnv = { VER: version, DEV: "true" };
155
148
 
156
- // watchScopes 생성 (루트 package.json에서 scope 추출)
157
- const rootPkgJsonPath = path.join(this._cwd, "package.json");
158
- const rootPkgName = JSON.parse(fs.readFileSync(rootPkgJsonPath, "utf-8")).name as string;
159
- this._watchScopes = getWatchScopes(rootPkgName, this._sdConfig.replaceDeps);
160
-
161
149
  // targets 필터링
162
150
  const allPackages = filterPackagesByTargets(this._sdConfig.packages, targets);
163
151
 
@@ -586,7 +574,7 @@ export class DevOrchestrator {
586
574
  config: clientConfig,
587
575
  cwd: this._cwd,
588
576
  pkgDir,
589
- watchScopes: this._watchScopes,
577
+ replaceDeps: this._sdConfig!.replaceDeps,
590
578
  })
591
579
  .catch((err: unknown) => {
592
580
  completeTask({
@@ -615,7 +603,7 @@ export class DevOrchestrator {
615
603
  config: viteConfig,
616
604
  cwd: this._cwd,
617
605
  pkgDir,
618
- watchScopes: this._watchScopes,
606
+ replaceDeps: this._sdConfig!.replaceDeps,
619
607
  })
620
608
  .catch((err: unknown) => {
621
609
  completeTask({
@@ -637,7 +625,7 @@ export class DevOrchestrator {
637
625
  name,
638
626
  cwd: this._cwd,
639
627
  pkgDir,
640
- watchScopes: this._watchScopes,
628
+ replaceDeps: this._sdConfig!.replaceDeps,
641
629
  env: { ...this._baseEnv, ...config.env },
642
630
  configs: config.configs,
643
631
  externals: config.externals,
@@ -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<void> {
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
  /**
@@ -15,32 +15,72 @@ export function findPackageRoot(startDir: string): string {
15
15
  return dir;
16
16
  }
17
17
 
18
- /**
19
- * 패키지명과 replaceDeps 설정에서 watch scope 목록을 생성한다.
20
- * - 패키지명의 scope (예: "@myapp/root" → "@myapp")
21
- * - replaceDeps 키의 scope (예: "@simplysm/*" → "@simplysm")
22
- * @param packageName 루트 package.json의 name 필드
23
- * @param replaceDeps sd.config.ts의 replaceDeps 설정 (키: glob 패턴, 값: 소스 경로)
24
- * @returns scope 배열 (중복 제거)
25
- */
26
- export function getWatchScopes(
27
- packageName: string,
28
- replaceDeps?: Record<string, string>,
29
- ): string[] {
30
- const scopes = new Set<string>();
31
- const match = packageName.match(/^(@[^/]+)\//);
32
- if (match != null) {
33
- scopes.add(match[1]);
18
+ export interface DepsResult {
19
+ workspaceDeps: string[];
20
+ replaceDeps: string[];
21
+ }
22
+
23
+ export function collectDeps(
24
+ pkgDir: string,
25
+ cwd: string,
26
+ replaceDepsConfig?: Record<string, string>,
27
+ ): DepsResult {
28
+ const rootPkgJsonPath = path.join(cwd, "package.json");
29
+ const rootPkgJson = JSON.parse(fs.readFileSync(rootPkgJsonPath, "utf-8")) as { name: string };
30
+ const scopeMatch = rootPkgJson.name.match(/^(@[^/]+)\//);
31
+ const workspaceScope = scopeMatch != null ? scopeMatch[1] : undefined;
32
+
33
+ const replaceDepsPatterns: Array<{ regex: RegExp }> = [];
34
+ if (replaceDepsConfig != null) {
35
+ for (const pattern of Object.keys(replaceDepsConfig)) {
36
+ const regexStr = pattern.replace(/[.+]/g, (ch) => `\\${ch}`).replace(/\*/g, "[^/]+");
37
+ replaceDepsPatterns.push({ regex: new RegExp(`^${regexStr}$`) });
38
+ }
34
39
  }
35
- if (replaceDeps != null) {
36
- for (const pattern of Object.keys(replaceDeps)) {
37
- const depMatch = pattern.match(/^(@[^/]+)\//);
38
- if (depMatch != null) {
39
- scopes.add(depMatch[1]);
40
+
41
+ const workspaceDeps: string[] = [];
42
+ const replaceDeps: string[] = [];
43
+ const visited = new Set<string>();
44
+
45
+ function traverse(dir: string): void {
46
+ const pkgJsonPath = path.join(dir, "package.json");
47
+ if (!fs.existsSync(pkgJsonPath)) return;
48
+
49
+ const pkgJson = JSON.parse(fs.readFileSync(pkgJsonPath, "utf-8")) as {
50
+ dependencies?: Record<string, string>;
51
+ };
52
+ const deps = Object.keys(pkgJson.dependencies ?? {});
53
+
54
+ for (const dep of deps) {
55
+ if (visited.has(dep)) continue;
56
+ visited.add(dep);
57
+
58
+ // workspace package check
59
+ if (workspaceScope != null && dep.startsWith(workspaceScope + "/")) {
60
+ const dirName = dep.slice(workspaceScope.length + 1);
61
+ const depDir = path.join(cwd, "packages", dirName);
62
+ if (fs.existsSync(path.join(depDir, "package.json"))) {
63
+ workspaceDeps.push(dirName);
64
+ traverse(depDir);
65
+ continue;
66
+ }
67
+ }
68
+
69
+ // replaceDeps pattern check
70
+ const matched = replaceDepsPatterns.find((p) => p.regex.test(dep));
71
+ if (matched != null) {
72
+ replaceDeps.push(dep);
73
+ const depNodeModulesDir = path.join(cwd, "node_modules", ...dep.split("/"));
74
+ if (fs.existsSync(path.join(depNodeModulesDir, "package.json"))) {
75
+ traverse(depNodeModulesDir);
76
+ }
77
+ continue;
40
78
  }
41
79
  }
42
80
  }
43
- return [...scopes];
81
+
82
+ traverse(pkgDir);
83
+ return { workspaceDeps, replaceDeps };
44
84
  }
45
85
 
46
86
  /**
@@ -50,10 +50,13 @@ function resolvePackageFile(specifier: string, fromDir: string): string | null {
50
50
  * Tailwind 내장 `getModuleDependencies`는 상대 경로 import만 추적하지만,
51
51
  * 이 함수는 지정된 scope의 패키지 경로도 `node_modules` symlink를 풀어 실제 파일을 추적한다.
52
52
  */
53
- export function getTailwindConfigDeps(configPath: string, scopes: string[]): string[] {
54
- const scopePrefixes = scopes.map((s) => (s.endsWith("/") ? s : s + "/"));
53
+ export function getTailwindConfigDeps(configPath: string, replaceDeps: string[]): string[] {
55
54
  const seen = new Set<string>();
56
55
 
56
+ function isReplaceDepImport(specifier: string): boolean {
57
+ return replaceDeps.some((dep) => specifier === dep || specifier.startsWith(dep + "/"));
58
+ }
59
+
57
60
  function walk(absoluteFile: string): void {
58
61
  if (seen.has(absoluteFile)) return;
59
62
  if (!fs.existsSync(absoluteFile)) return;
@@ -80,7 +83,7 @@ export function getTailwindConfigDeps(configPath: string, scopes: string[]): str
80
83
 
81
84
  if (specifier.startsWith(".")) {
82
85
  resolved = resolveWithExtension(path.resolve(base, specifier), extensions);
83
- } else if (scopePrefixes.some((p) => specifier.startsWith(p))) {
86
+ } else if (isReplaceDepImport(specifier)) {
84
87
  resolved = resolvePackageFile(specifier, base);
85
88
  }
86
89