@simplysm/sd-cli 13.0.65 → 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 (34) 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/package-utils.d.ts +5 -9
  6. package/dist/utils/package-utils.d.ts.map +1 -1
  7. package/dist/utils/package-utils.js +43 -13
  8. package/dist/utils/package-utils.js.map +1 -1
  9. package/dist/utils/tailwind-config-deps.d.ts +1 -1
  10. package/dist/utils/tailwind-config-deps.d.ts.map +1 -1
  11. package/dist/utils/tailwind-config-deps.js +5 -3
  12. package/dist/utils/tailwind-config-deps.js.map +1 -1
  13. package/dist/utils/vite-config.d.ts +3 -3
  14. package/dist/utils/vite-config.d.ts.map +1 -1
  15. package/dist/utils/vite-config.js +43 -52
  16. package/dist/utils/vite-config.js.map +1 -1
  17. package/dist/workers/client.worker.d.ts +2 -2
  18. package/dist/workers/client.worker.d.ts.map +1 -1
  19. package/dist/workers/client.worker.js +3 -1
  20. package/dist/workers/client.worker.js.map +1 -1
  21. package/dist/workers/server.worker.d.ts +2 -2
  22. package/dist/workers/server.worker.d.ts.map +1 -1
  23. package/dist/workers/server.worker.js +14 -12
  24. package/dist/workers/server.worker.js.map +1 -1
  25. package/package.json +4 -4
  26. package/src/orchestrators/DevOrchestrator.ts +4 -16
  27. package/src/utils/package-utils.ts +62 -22
  28. package/src/utils/tailwind-config-deps.ts +6 -3
  29. package/src/utils/vite-config.ts +64 -92
  30. package/src/workers/client.worker.ts +7 -3
  31. package/src/workers/server.worker.ts +20 -21
  32. package/templates/add-client/__CLIENT__/package.json.hbs +1 -1
  33. package/templates/add-server/__SERVER__/package.json.hbs +2 -2
  34. package/templates/init/package.json.hbs +3 -3
@@ -16,6 +16,7 @@ import {
16
16
  writeChangedOutputFiles
17
17
  } from "../utils/esbuild-config.js";
18
18
  import { registerCleanupHandlers } from "../utils/worker-utils.js";
19
+ import { collectDeps } from "../utils/package-utils.js";
19
20
  import { copyPublicFiles, watchPublicFiles } from "../utils/copy-public.js";
20
21
  const logger = consola.withTag("sd:cli:server:worker");
21
22
  let esbuildContext;
@@ -274,20 +275,21 @@ async function startWatch(info) {
274
275
  esbuildContext = await createAndBuildContext(info, true, resolveFirstBuild);
275
276
  await firstBuildPromise;
276
277
  publicWatcher = await watchPublicFiles(info.pkgDir, true);
278
+ const { workspaceDeps, replaceDeps } = collectDeps(info.pkgDir, info.cwd, info.replaceDeps);
277
279
  const watchPaths = [];
278
- watchPaths.push(path.join(info.cwd, "packages", "*", "src", "**", "*"));
279
- watchPaths.push(path.join(info.cwd, "packages", "*", "*.{ts,js,css}"));
280
- if (info.watchScopes != null) {
281
- for (const scope of info.watchScopes) {
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
- }
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}"));
285
287
  }
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}"));
290
- }
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
+ );
291
293
  }
292
294
  srcWatcher = await FsWatcher.watch(watchPaths);
293
295
  srcWatcher.onChange({ delay: 300 }, async (changes) => {
@@ -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.65",
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-common": "13.0.65",
45
- "@simplysm/core-node": "13.0.65",
46
- "@simplysm/storage": "13.0.65"
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,
@@ -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
 
@@ -17,14 +17,14 @@ import { FsWatcher, pathNorm } from "@simplysm/core-node";
17
17
  * preset 등으로 참조하는 scope 패키지의 config 변경을 감지하지 못한다.
18
18
  * 이 플러그인이 해당 파일들을 watch하고, 변경 시 Tailwind 캐시를 무효화한다.
19
19
  */
20
- function sdTailwindConfigDepsPlugin(pkgDir: string, scopes: string[]): Plugin {
20
+ function sdTailwindConfigDepsPlugin(pkgDir: string, replaceDeps: string[]): Plugin {
21
21
  return {
22
22
  name: "sd-tailwind-config-deps",
23
23
  configureServer(server) {
24
24
  const configPath = path.join(pkgDir, "tailwind.config.ts");
25
25
  if (!fs.existsSync(configPath)) return;
26
26
 
27
- const allDeps = getTailwindConfigDeps(configPath, scopes);
27
+ const allDeps = getTailwindConfigDeps(configPath, replaceDeps);
28
28
  const configAbsolute = path.resolve(configPath);
29
29
  const externalDeps = allDeps.filter((d) => d !== configAbsolute);
30
30
  if (externalDeps.length === 0) return;
@@ -133,66 +133,51 @@ function sdPublicDevPlugin(pkgDir: string): Plugin {
133
133
  * 변경 시 Vite의 내부 HMR 파이프라인을 트리거한다.
134
134
  * optimizeDeps에서 제외하여 pre-bundled 캐시로 인한 변경 무시를 방지한다.
135
135
  */
136
- function sdScopeWatchPlugin(pkgDir: string, scopes: string[], onScopeRebuild?: () => void): Plugin {
136
+ function sdScopeWatchPlugin(
137
+ pkgDir: string,
138
+ replaceDeps: string[],
139
+ onScopeRebuild?: () => void,
140
+ ): Plugin {
137
141
  return {
138
142
  name: "sd-scope-watch",
139
143
  config() {
140
144
  const excluded: string[] = [];
141
145
  const nestedDepsToInclude: string[] = [];
142
146
 
143
- for (const scope of scopes) {
144
- // scope 패키지를 pre-bundling에서 제외하여 소스 코드로 취급
145
- const scopeDir = path.join(pkgDir, "node_modules", scope);
146
- if (!fs.existsSync(scopeDir)) continue;
147
-
148
- for (const name of fs.readdirSync(scopeDir)) {
149
- excluded.push(`${scope}/${name}`);
150
-
151
- // excluded 패키지의 dependencies를 nested include로 추가하여 pre-bundling 보장
152
- // Vite nested dependency 구문: "excluded-pkg > dep"
153
- // (pnpm strict 모듈 격리에서 transitive dep resolve하기 위해 필요)
154
- const depPkgJsonPath = path.join(scopeDir, name, "package.json");
155
- try {
156
- const depPkgJson = JSON.parse(fs.readFileSync(depPkgJsonPath, "utf-8")) as {
157
- dependencies?: Record<string, string>;
158
- };
159
- const excludedPkg = `${scope}/${name}`;
160
- for (const dep of Object.keys(depPkgJson.dependencies ?? {})) {
161
- // 같은 scope 내 패키지는 이미 excluded이므로 제외
162
- if (scopes.some((s) => dep.startsWith(`${s}/`))) continue;
163
- // SolidJS 관련 패키지는 solid 플러그인 transform이 필요하므로 pre-bundling 불가
164
- if (dep === "solid-js" || dep.startsWith("@solidjs/") || dep.startsWith("solid-"))
165
- continue;
166
- // PostCSS/빌드 도구는 브라우저 pre-bundling 대상 아님
167
- if (dep === "tailwindcss") continue;
168
-
169
- // subpath-only 패키지 필터링: 두 경로를 시도하여 확인
170
- // pnpm 구조에서 realpath를 따라 .pnpm node_modules에서 먼저 찾기
171
- const realPkgPath = fs.realpathSync(path.join(scopeDir, name));
172
- const pnpmNodeModules = path.resolve(realPkgPath, "../..");
173
- const depPkgJsonResolved = path.join(pnpmNodeModules, dep, "package.json");
174
- if (isSubpathOnlyPackage(depPkgJsonResolved)) {
175
- continue;
176
- }
177
-
178
- // workspace 패키지는 realpath가 소스 디렉토리로 해석되어 .pnpm 구조가 아님
179
- // symlink 경로의 node_modules에서 fallback 시도
180
- const depPkgJsonFallback = path.join(
181
- scopeDir,
182
- name,
183
- "node_modules",
184
- dep,
185
- "package.json",
186
- );
187
- if (isSubpathOnlyPackage(depPkgJsonFallback)) {
188
- continue;
189
- }
190
-
191
- nestedDepsToInclude.push(`${excludedPkg} > ${dep}`);
192
- }
193
- } catch {
194
- // package.json 읽기 실패 시 스킵
147
+ for (const pkg of replaceDeps) {
148
+ excluded.push(pkg);
149
+
150
+ const pkgParts = pkg.split("/");
151
+ const depPkgJsonPath = path.join(pkgDir, "node_modules", ...pkgParts, "package.json");
152
+ try {
153
+ const depPkgJson = JSON.parse(fs.readFileSync(depPkgJsonPath, "utf-8")) as {
154
+ dependencies?: Record<string, string>;
155
+ };
156
+ for (const dep of Object.keys(depPkgJson.dependencies ?? {})) {
157
+ if (replaceDeps.includes(dep)) continue;
158
+ if (dep === "solid-js" || dep.startsWith("@solidjs/") || dep.startsWith("solid-"))
159
+ continue;
160
+ if (dep === "tailwindcss") continue;
161
+
162
+ const realPkgPath = fs.realpathSync(path.join(pkgDir, "node_modules", ...pkgParts));
163
+ const pnpmNodeModules = path.resolve(realPkgPath, "../..");
164
+ const depPkgJsonResolved = path.join(pnpmNodeModules, dep, "package.json");
165
+ if (isSubpathOnlyPackage(depPkgJsonResolved)) continue;
166
+
167
+ const depPkgJsonFallback = path.join(
168
+ pkgDir,
169
+ "node_modules",
170
+ ...pkgParts,
171
+ "node_modules",
172
+ dep,
173
+ "package.json",
174
+ );
175
+ if (isSubpathOnlyPackage(depPkgJsonFallback)) continue;
176
+
177
+ nestedDepsToInclude.push(`${pkg} > ${dep}`);
195
178
  }
179
+ } catch {
180
+ // package.json 읽기 실패 시 스킵
196
181
  }
197
182
  }
198
183
 
@@ -207,56 +192,43 @@ function sdScopeWatchPlugin(pkgDir: string, scopes: string[], onScopeRebuild?: (
207
192
  async configureServer(server) {
208
193
  const watchPaths: string[] = [];
209
194
 
210
- for (const scope of scopes) {
211
- const scopeDir = path.join(pkgDir, "node_modules", scope);
212
- if (!fs.existsSync(scopeDir)) continue;
213
-
214
- for (const pkgName of fs.readdirSync(scopeDir)) {
215
- const pkgRoot = path.join(scopeDir, pkgName);
195
+ for (const pkg of replaceDeps) {
196
+ const pkgParts = pkg.split("/");
197
+ const pkgRoot = path.join(pkgDir, "node_modules", ...pkgParts);
198
+ if (!fs.existsSync(pkgRoot)) continue;
216
199
 
217
- // dist 디렉토리 watch (JS/TS 빌드 결과물)
218
- const distDir = path.join(pkgRoot, "dist");
219
- if (fs.existsSync(distDir)) {
220
- watchPaths.push(distDir);
221
- }
200
+ const distDir = path.join(pkgRoot, "dist");
201
+ if (fs.existsSync(distDir)) {
202
+ watchPaths.push(distDir);
203
+ }
222
204
 
223
- // 패키지 루트의 CSS/config 파일 watch (tailwind.css, tailwind.config.ts 등)
224
- for (const file of fs.readdirSync(pkgRoot)) {
225
- if (
226
- file.endsWith(".css") ||
227
- file === "tailwind.config.ts" ||
228
- file === "tailwind.config.js"
229
- ) {
230
- watchPaths.push(path.join(pkgRoot, file));
231
- }
205
+ for (const file of fs.readdirSync(pkgRoot)) {
206
+ if (
207
+ file.endsWith(".css") ||
208
+ file === "tailwind.config.ts" ||
209
+ file === "tailwind.config.js"
210
+ ) {
211
+ watchPaths.push(path.join(pkgRoot, file));
232
212
  }
233
213
  }
234
214
  }
235
215
 
236
216
  if (watchPaths.length === 0) return;
237
217
 
238
- // Vite의 기본 watcher는 **/node_modules/**를 ignore하고
239
- // server.watcher.add()로는 이 패턴을 override할 수 없다.
240
- // 별도의 FsWatcher로 scope 패키지의 dist 디렉토리를 감시한다.
241
218
  const scopeWatcher = await FsWatcher.watch(watchPaths);
242
219
  scopeWatcher.onChange({ delay: 300 }, (changeInfos) => {
243
220
  for (const { path: changedPath } of changeInfos) {
244
- // pnpm symlink → real path 변환 (Vite module graph은 real path 사용)
245
221
  let realPath: string;
246
222
  try {
247
223
  realPath = fs.realpathSync(changedPath);
248
224
  } catch {
249
- continue; // 삭제된 파일
225
+ continue;
250
226
  }
251
-
252
- // Vite의 내부 HMR 파이프라인 트리거
253
227
  server.watcher.emit("change", realPath);
254
228
  }
255
-
256
229
  onScopeRebuild?.();
257
230
  });
258
231
 
259
- // 서버 종료 시 watcher 정리
260
232
  server.httpServer?.on("close", () => void scopeWatcher.close());
261
233
  },
262
234
  };
@@ -274,9 +246,9 @@ export interface ViteConfigOptions {
274
246
  mode: "build" | "dev";
275
247
  /** dev 모드일 때 서버 포트 (0이면 자동 할당) */
276
248
  serverPort?: number;
277
- /** watch 대상 scope 목록 (예: ["@myapp", "@simplysm"]) */
278
- watchScopes?: string[];
279
- /** scope 패키지 dist 변경 감지 시 콜백 */
249
+ /** replaceDeps 패키지명 배열 (resolve 완료된 상태) */
250
+ replaceDeps?: string[];
251
+ /** replaceDeps 패키지 dist 변경 감지 시 콜백 */
280
252
  onScopeRebuild?: () => void;
281
253
  }
282
254
 
@@ -288,7 +260,7 @@ export interface ViteConfigOptions {
288
260
  * - dev 모드: dev server (define으로 env 치환, server 설정)
289
261
  */
290
262
  export function createViteConfig(options: ViteConfigOptions): ViteUserConfig {
291
- const { pkgDir, name, tsconfigPath, compilerOptions, env, mode, serverPort, watchScopes } =
263
+ const { pkgDir, name, tsconfigPath, compilerOptions, env, mode, serverPort, replaceDeps } =
292
264
  options;
293
265
 
294
266
  // Read package.json to extract app name for PWA manifest
@@ -322,11 +294,11 @@ export function createViteConfig(options: ViteConfigOptions): ViteUserConfig {
322
294
  globPatterns: ["**/*.{js,css,html,ico,png,svg,woff2}"],
323
295
  },
324
296
  }),
325
- ...(watchScopes != null && watchScopes.length > 0
326
- ? [sdTailwindConfigDepsPlugin(pkgDir, watchScopes)]
297
+ ...(replaceDeps != null && replaceDeps.length > 0
298
+ ? [sdTailwindConfigDepsPlugin(pkgDir, replaceDeps)]
327
299
  : []),
328
- ...(watchScopes != null && watchScopes.length > 0
329
- ? [sdScopeWatchPlugin(pkgDir, watchScopes, options.onScopeRebuild)]
300
+ ...(replaceDeps != null && replaceDeps.length > 0
301
+ ? [sdScopeWatchPlugin(pkgDir, replaceDeps, options.onScopeRebuild)]
330
302
  : []),
331
303
  ...(mode === "dev" ? [sdPublicDevPlugin(pkgDir)] : []),
332
304
  ],
@@ -6,6 +6,7 @@ import { consola } from "consola";
6
6
  import type { SdClientPackageConfig } from "../sd-config.types";
7
7
  import { parseRootTsconfig, getCompilerOptionsForPackage } from "../utils/tsconfig";
8
8
  import { createViteConfig } from "../utils/vite-config";
9
+ import { collectDeps } from "../utils/package-utils";
9
10
  import { registerCleanupHandlers } from "../utils/worker-utils";
10
11
 
11
12
  //#region Types
@@ -36,8 +37,8 @@ export interface ClientWatchInfo {
36
37
  config: SdClientPackageConfig;
37
38
  cwd: string;
38
39
  pkgDir: string;
39
- /** watch 대상 scope 목록 */
40
- watchScopes?: string[];
40
+ /** sd.config.ts의 replaceDeps 설정 */
41
+ replaceDeps?: Record<string, string>;
41
42
  }
42
43
 
43
44
  /**
@@ -176,6 +177,9 @@ async function startWatch(info: ClientWatchInfo): Promise<void> {
176
177
  // server가 숫자면 해당 포트로 고정 (standalone 클라이언트)
177
178
  const serverPort = typeof info.config.server === "number" ? info.config.server : 0;
178
179
 
180
+ // 의존성 기반 replaceDeps 수집
181
+ const { replaceDeps } = collectDeps(info.pkgDir, info.cwd, info.replaceDeps);
182
+
179
183
  // Vite 설정 생성
180
184
  const viteConfig = createViteConfig({
181
185
  pkgDir: info.pkgDir,
@@ -185,7 +189,7 @@ async function startWatch(info: ClientWatchInfo): Promise<void> {
185
189
  env: info.config.env,
186
190
  mode: "dev",
187
191
  serverPort,
188
- watchScopes: info.watchScopes,
192
+ replaceDeps,
189
193
  onScopeRebuild: () => sender.send("scopeRebuild", {}),
190
194
  });
191
195
 
@@ -16,6 +16,7 @@ import {
16
16
  writeChangedOutputFiles,
17
17
  } from "../utils/esbuild-config";
18
18
  import { registerCleanupHandlers } from "../utils/worker-utils";
19
+ import { collectDeps } from "../utils/package-utils";
19
20
  import { copyPublicFiles, watchPublicFiles } from "../utils/copy-public";
20
21
 
21
22
  //#region Types
@@ -65,8 +66,8 @@ export interface ServerWatchInfo {
65
66
  configs?: Record<string, unknown>;
66
67
  /** sd.config.ts에서 수동 지정한 external 모듈 */
67
68
  externals?: string[];
68
- /** scope 패키지 감시 대상 (e.g. ["@simplysm"]) */
69
- watchScopes?: string[];
69
+ /** sd.config.ts의 replaceDeps 설정 */
70
+ replaceDeps?: Record<string, string>;
70
71
  }
71
72
 
72
73
  /**
@@ -475,29 +476,27 @@ async function startWatch(info: ServerWatchInfo): Promise<void> {
475
476
  // Watch public/ and public-dev/ (dev mode includes public-dev)
476
477
  publicWatcher = await watchPublicFiles(info.pkgDir, true);
477
478
 
478
- // FsWatcher 감시 경로 수집
479
- const watchPaths: string[] = [];
480
-
481
- // 1) workspace 패키지 소스
482
- watchPaths.push(path.join(info.cwd, "packages", "*", "src", "**", "*"));
479
+ // 의존성 기반 감시 경로 수집
480
+ const { workspaceDeps, replaceDeps } = collectDeps(info.pkgDir, info.cwd, info.replaceDeps);
483
481
 
484
- // 2) workspace 패키지 루트 설정 파일
485
- watchPaths.push(path.join(info.cwd, "packages", "*", "*.{ts,js,css}"));
482
+ const watchPaths: string[] = [];
486
483
 
487
- // 3-4) scope 패키지 (루트 node_modules)
488
- if (info.watchScopes != null) {
489
- for (const scope of info.watchScopes) {
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
- }
484
+ // 1) 서버 패키지 자신 + workspace 의존 패키지 소스
485
+ const watchDirs = [
486
+ info.pkgDir,
487
+ ...workspaceDeps.map((d) => path.join(info.cwd, "packages", d)),
488
+ ];
489
+ for (const dir of watchDirs) {
490
+ watchPaths.push(path.join(dir, "src", "**", "*"));
491
+ watchPaths.push(path.join(dir, "*.{ts,js,css}"));
493
492
  }
494
493
 
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}"));
500
- }
494
+ // 2) replaceDeps 의존 패키지 dist (루트 + 패키지 node_modules)
495
+ for (const pkg of replaceDeps) {
496
+ watchPaths.push(path.join(info.cwd, "node_modules", ...pkg.split("/"), "dist", "**", "*.js"));
497
+ watchPaths.push(
498
+ path.join(info.pkgDir, "node_modules", ...pkg.split("/"), "dist", "**", "*.js"),
499
+ );
501
500
  }
502
501
 
503
502
  // FsWatcher 시작
@@ -4,7 +4,7 @@
4
4
  "type": "module",
5
5
  "private": true,
6
6
  "dependencies": {
7
- "@simplysm/solid": "~13.0.65",
7
+ "@simplysm/solid": "~13.0.66",
8
8
  {{#if router}}
9
9
  "@solidjs/router": "^0.15.4",
10
10
  {{/if}}