@simplysm/sd-cli 14.0.8 → 14.0.9

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 (254) hide show
  1. package/dist/angular/client-transform-stylesheet.d.ts.map +1 -1
  2. package/dist/angular/client-transform-stylesheet.js.map +1 -1
  3. package/dist/angular/vite-angular-plugin.d.ts.map +1 -1
  4. package/dist/angular/vite-angular-plugin.js +15 -8
  5. package/dist/angular/vite-angular-plugin.js.map +1 -1
  6. package/dist/angular/vite-postcss-inline-plugin.d.ts.map +1 -1
  7. package/dist/angular/vite-postcss-inline-plugin.js.map +1 -1
  8. package/dist/capacitor/capacitor.d.ts.map +1 -1
  9. package/dist/capacitor/capacitor.js +41 -41
  10. package/dist/capacitor/capacitor.js.map +1 -1
  11. package/dist/commands/build.d.ts.map +1 -1
  12. package/dist/commands/build.js.map +1 -1
  13. package/dist/commands/check.d.ts.map +1 -1
  14. package/dist/commands/check.js.map +1 -1
  15. package/dist/commands/dev.d.ts.map +1 -1
  16. package/dist/commands/dev.js.map +1 -1
  17. package/dist/commands/lint.d.ts.map +1 -1
  18. package/dist/commands/lint.js.map +1 -1
  19. package/dist/commands/publish.d.ts.map +1 -1
  20. package/dist/commands/publish.js.map +1 -1
  21. package/dist/commands/replace-deps.d.ts.map +1 -1
  22. package/dist/commands/replace-deps.js.map +1 -1
  23. package/dist/commands/typecheck.d.ts.map +1 -1
  24. package/dist/commands/typecheck.js +12 -12
  25. package/dist/commands/typecheck.js.map +1 -1
  26. package/dist/commands/watch.d.ts.map +1 -1
  27. package/dist/commands/watch.js.map +1 -1
  28. package/dist/electron/electron.d.ts.map +1 -1
  29. package/dist/electron/electron.js +26 -27
  30. package/dist/electron/electron.js.map +1 -1
  31. package/dist/engines/BaseEngine.d.ts +1 -5
  32. package/dist/engines/BaseEngine.d.ts.map +1 -1
  33. package/dist/engines/BaseEngine.js +7 -16
  34. package/dist/engines/BaseEngine.js.map +1 -1
  35. package/dist/engines/NgtscEngine.d.ts.map +1 -1
  36. package/dist/engines/NgtscEngine.js +10 -11
  37. package/dist/engines/NgtscEngine.js.map +1 -1
  38. package/dist/engines/ServerEsbuildEngine.d.ts.map +1 -1
  39. package/dist/engines/ServerEsbuildEngine.js +10 -11
  40. package/dist/engines/ServerEsbuildEngine.js.map +1 -1
  41. package/dist/engines/TscEngine.d.ts.map +1 -1
  42. package/dist/engines/TscEngine.js +10 -11
  43. package/dist/engines/TscEngine.js.map +1 -1
  44. package/dist/engines/ViteEngine.d.ts.map +1 -1
  45. package/dist/engines/ViteEngine.js +3 -13
  46. package/dist/engines/ViteEngine.js.map +1 -1
  47. package/dist/engines/index.d.ts.map +1 -1
  48. package/dist/engines/index.js.map +1 -1
  49. package/dist/engines/types.d.ts +3 -6
  50. package/dist/engines/types.d.ts.map +1 -1
  51. package/dist/engines/types.js.map +1 -1
  52. package/dist/index.d.ts.map +1 -1
  53. package/dist/index.js.map +1 -1
  54. package/dist/infra/ResultCollector.d.ts +1 -1
  55. package/dist/infra/ResultCollector.d.ts.map +1 -1
  56. package/dist/infra/ResultCollector.js.map +1 -1
  57. package/dist/infra/SignalHandler.d.ts.map +1 -1
  58. package/dist/infra/SignalHandler.js.map +1 -1
  59. package/dist/infra/WorkerManager.d.ts.map +1 -1
  60. package/dist/infra/WorkerManager.js.map +1 -1
  61. package/dist/orchestrators/BuildOrchestrator.d.ts.map +1 -1
  62. package/dist/orchestrators/BuildOrchestrator.js +30 -61
  63. package/dist/orchestrators/BuildOrchestrator.js.map +1 -1
  64. package/dist/orchestrators/DevWatchOrchestrator.d.ts +2 -0
  65. package/dist/orchestrators/DevWatchOrchestrator.d.ts.map +1 -1
  66. package/dist/orchestrators/DevWatchOrchestrator.js +40 -44
  67. package/dist/orchestrators/DevWatchOrchestrator.js.map +1 -1
  68. package/dist/sd-cli-entry.d.ts.map +1 -1
  69. package/dist/sd-cli-entry.js +2 -13
  70. package/dist/sd-cli-entry.js.map +1 -1
  71. package/dist/sd-cli.d.ts.map +1 -1
  72. package/dist/sd-cli.js.map +1 -1
  73. package/dist/sd-config.types.d.ts.map +1 -1
  74. package/dist/sd-config.types.js.map +1 -1
  75. package/dist/utils/SdCliReporter.d.ts +18 -0
  76. package/dist/utils/SdCliReporter.d.ts.map +1 -0
  77. package/dist/utils/SdCliReporter.js +144 -0
  78. package/dist/utils/SdCliReporter.js.map +1 -0
  79. package/dist/utils/angular-build.d.ts.map +1 -1
  80. package/dist/utils/angular-build.js.map +1 -1
  81. package/dist/utils/angular-compiler.d.ts.map +1 -1
  82. package/dist/utils/angular-compiler.js +11 -4
  83. package/dist/utils/angular-compiler.js.map +1 -1
  84. package/dist/utils/build-env.d.ts.map +1 -1
  85. package/dist/utils/build-env.js +2 -1
  86. package/dist/utils/build-env.js.map +1 -1
  87. package/dist/utils/concurrency.d.ts.map +1 -1
  88. package/dist/utils/concurrency.js.map +1 -1
  89. package/dist/utils/copy-public.d.ts.map +1 -1
  90. package/dist/utils/copy-public.js +21 -21
  91. package/dist/utils/copy-public.js.map +1 -1
  92. package/dist/utils/copy-src.d.ts.map +1 -1
  93. package/dist/utils/copy-src.js +12 -12
  94. package/dist/utils/copy-src.js.map +1 -1
  95. package/dist/utils/diagnostic-utils.d.ts.map +1 -1
  96. package/dist/utils/diagnostic-utils.js +3 -2
  97. package/dist/utils/diagnostic-utils.js.map +1 -1
  98. package/dist/utils/engine-stop.d.ts.map +1 -1
  99. package/dist/utils/engine-stop.js.map +1 -1
  100. package/dist/utils/esbuild-config.d.ts.map +1 -1
  101. package/dist/utils/esbuild-config.js +2 -0
  102. package/dist/utils/esbuild-config.js.map +1 -1
  103. package/dist/utils/generate-pwa-icons.d.ts.map +1 -1
  104. package/dist/utils/generate-pwa-icons.js.map +1 -1
  105. package/dist/utils/hmr-candidates.d.ts.map +1 -1
  106. package/dist/utils/hmr-candidates.js.map +1 -1
  107. package/dist/utils/lint-utils.d.ts.map +1 -1
  108. package/dist/utils/lint-utils.js.map +1 -1
  109. package/dist/utils/lint-with-program.d.ts.map +1 -1
  110. package/dist/utils/lint-with-program.js +7 -3
  111. package/dist/utils/lint-with-program.js.map +1 -1
  112. package/dist/utils/ngtsc-build-core.d.ts +2 -10
  113. package/dist/utils/ngtsc-build-core.d.ts.map +1 -1
  114. package/dist/utils/ngtsc-build-core.js +16 -15
  115. package/dist/utils/ngtsc-build-core.js.map +1 -1
  116. package/dist/utils/orchestrator-utils.d.ts.map +1 -1
  117. package/dist/utils/orchestrator-utils.js.map +1 -1
  118. package/dist/utils/output-path-rewriter.d.ts.map +1 -1
  119. package/dist/utils/output-path-rewriter.js +7 -7
  120. package/dist/utils/output-path-rewriter.js.map +1 -1
  121. package/dist/utils/output-utils.d.ts.map +1 -1
  122. package/dist/utils/output-utils.js +1 -1
  123. package/dist/utils/output-utils.js.map +1 -1
  124. package/dist/utils/package-utils.d.ts +4 -0
  125. package/dist/utils/package-utils.d.ts.map +1 -1
  126. package/dist/utils/package-utils.js +34 -13
  127. package/dist/utils/package-utils.js.map +1 -1
  128. package/dist/utils/rebuild-manager.d.ts +1 -1
  129. package/dist/utils/rebuild-manager.d.ts.map +1 -1
  130. package/dist/utils/rebuild-manager.js +3 -1
  131. package/dist/utils/rebuild-manager.js.map +1 -1
  132. package/dist/utils/replace-deps.d.ts.map +1 -1
  133. package/dist/utils/replace-deps.js +10 -10
  134. package/dist/utils/replace-deps.js.map +1 -1
  135. package/dist/utils/scss-compiler.d.ts.map +1 -1
  136. package/dist/utils/scss-compiler.js.map +1 -1
  137. package/dist/utils/sd-config.d.ts.map +1 -1
  138. package/dist/utils/sd-config.js +2 -3
  139. package/dist/utils/sd-config.js.map +1 -1
  140. package/dist/utils/tsc-build.d.ts +3 -1
  141. package/dist/utils/tsc-build.d.ts.map +1 -1
  142. package/dist/utils/tsc-build.js +7 -4
  143. package/dist/utils/tsc-build.js.map +1 -1
  144. package/dist/utils/tsconfig.d.ts.map +1 -1
  145. package/dist/utils/tsconfig.js.map +1 -1
  146. package/dist/utils/typecheck-non-package.d.ts.map +1 -1
  147. package/dist/utils/typecheck-non-package.js +10 -5
  148. package/dist/utils/typecheck-non-package.js.map +1 -1
  149. package/dist/utils/typecheck-serialization.d.ts.map +1 -1
  150. package/dist/utils/typecheck-serialization.js.map +1 -1
  151. package/dist/utils/vite-config.d.ts.map +1 -1
  152. package/dist/utils/vite-config.js +2 -1
  153. package/dist/utils/vite-config.js.map +1 -1
  154. package/dist/utils/vite-scope-watch-plugin.d.ts.map +1 -1
  155. package/dist/utils/vite-scope-watch-plugin.js.map +1 -1
  156. package/dist/utils/worker-events.d.ts +1 -1
  157. package/dist/utils/worker-events.d.ts.map +1 -1
  158. package/dist/utils/worker-events.js +1 -0
  159. package/dist/utils/worker-events.js.map +1 -1
  160. package/dist/utils/worker-utils.d.ts +1 -1
  161. package/dist/utils/worker-utils.d.ts.map +1 -1
  162. package/dist/utils/worker-utils.js +3 -1
  163. package/dist/utils/worker-utils.js.map +1 -1
  164. package/dist/vitest-plugin.d.ts.map +1 -1
  165. package/dist/vitest-plugin.js.map +1 -1
  166. package/dist/workers/client.worker.d.ts.map +1 -1
  167. package/dist/workers/client.worker.js +4 -0
  168. package/dist/workers/client.worker.js.map +1 -1
  169. package/dist/workers/library-build.worker.d.ts +2 -10
  170. package/dist/workers/library-build.worker.d.ts.map +1 -1
  171. package/dist/workers/library-build.worker.js +38 -14
  172. package/dist/workers/library-build.worker.js.map +1 -1
  173. package/dist/workers/lint.worker.d.ts.map +1 -1
  174. package/dist/workers/lint.worker.js.map +1 -1
  175. package/dist/workers/ngtsc-build.worker.d.ts.map +1 -1
  176. package/dist/workers/ngtsc-build.worker.js +40 -14
  177. package/dist/workers/ngtsc-build.worker.js.map +1 -1
  178. package/dist/workers/server-build.worker.d.ts +2 -10
  179. package/dist/workers/server-build.worker.d.ts.map +1 -1
  180. package/dist/workers/server-build.worker.js +28 -19
  181. package/dist/workers/server-build.worker.js.map +1 -1
  182. package/dist/workers/server-runtime.worker.d.ts.map +1 -1
  183. package/dist/workers/server-runtime.worker.js.map +1 -1
  184. package/package.json +4 -4
  185. package/src/angular/vite-angular-plugin.ts +18 -9
  186. package/src/capacitor/capacitor.ts +41 -41
  187. package/src/commands/typecheck.ts +12 -12
  188. package/src/electron/electron.ts +26 -27
  189. package/src/engines/BaseEngine.ts +8 -19
  190. package/src/engines/NgtscEngine.ts +11 -11
  191. package/src/engines/ServerEsbuildEngine.ts +11 -11
  192. package/src/engines/TscEngine.ts +11 -11
  193. package/src/engines/ViteEngine.ts +3 -14
  194. package/src/engines/types.ts +3 -6
  195. package/src/infra/ResultCollector.ts +1 -1
  196. package/src/orchestrators/BuildOrchestrator.ts +31 -62
  197. package/src/orchestrators/DevWatchOrchestrator.ts +41 -44
  198. package/src/sd-cli-entry.ts +2 -12
  199. package/src/utils/SdCliReporter.ts +177 -0
  200. package/src/utils/angular-compiler.ts +11 -4
  201. package/src/utils/build-env.ts +2 -1
  202. package/src/utils/copy-public.ts +21 -21
  203. package/src/utils/copy-src.ts +12 -12
  204. package/src/utils/diagnostic-utils.ts +3 -2
  205. package/src/utils/esbuild-config.ts +2 -0
  206. package/src/utils/lint-with-program.ts +7 -3
  207. package/src/utils/ngtsc-build-core.ts +18 -18
  208. package/src/utils/output-path-rewriter.ts +7 -7
  209. package/src/utils/output-utils.ts +1 -1
  210. package/src/utils/package-utils.ts +37 -13
  211. package/src/utils/rebuild-manager.ts +4 -2
  212. package/src/utils/replace-deps.ts +10 -10
  213. package/src/utils/sd-config.ts +2 -3
  214. package/src/utils/tsc-build.ts +9 -4
  215. package/src/utils/typecheck-non-package.ts +10 -5
  216. package/src/utils/vite-config.ts +2 -1
  217. package/src/utils/worker-events.ts +2 -1
  218. package/src/utils/worker-utils.ts +3 -1
  219. package/src/workers/client.worker.ts +4 -0
  220. package/src/workers/library-build.worker.ts +48 -18
  221. package/src/workers/ngtsc-build.worker.ts +48 -13
  222. package/src/workers/server-build.worker.ts +30 -23
  223. package/tests/angular/vite-angular-plugin-hmr-fallback.spec.ts +11 -7
  224. package/tests/angular/vite-angular-plugin-lint.spec.ts +6 -1
  225. package/tests/capacitor/capacitor-build.spec.ts +5 -0
  226. package/tests/capacitor/capacitor-icon.spec.ts +5 -0
  227. package/tests/capacitor/capacitor-init.spec.ts +5 -0
  228. package/tests/capacitor/capacitor-run.spec.ts +5 -0
  229. package/tests/capacitor/capacitor-workspace.spec.ts +5 -0
  230. package/tests/commands/typecheck.spec.ts +20 -31
  231. package/tests/electron/electron.spec.ts +5 -0
  232. package/tests/engines/base-engine.spec.ts +15 -21
  233. package/tests/engines/engine-lint-integration.spec.ts +5 -10
  234. package/tests/engines/ngtsc-engine.spec.ts +27 -41
  235. package/tests/engines/server-esbuild-engine.spec.ts +18 -29
  236. package/tests/engines/tsc-engine.spec.ts +14 -23
  237. package/tests/engines/vite-engine.spec.ts +10 -15
  238. package/tests/infra/result-collector.spec.ts +2 -2
  239. package/tests/orchestrators/build-orchestrator.spec.ts +19 -29
  240. package/tests/orchestrators/dev-watch-orchestrator.spec.ts +110 -95
  241. package/tests/utils/copy-src.spec.ts +25 -19
  242. package/tests/utils/diagnostic-utils.spec.ts +72 -0
  243. package/tests/utils/ngtsc-build-core-angular-compiler.spec.ts +2 -3
  244. package/tests/utils/output-path-rewriter.spec.ts +7 -6
  245. package/tests/utils/output-utils.spec.ts +5 -5
  246. package/tests/utils/rebuild-manager.spec.ts +1 -1
  247. package/tests/utils/sd-config.spec.ts +4 -0
  248. package/tests/utils/tsc-build.spec.ts +23 -5
  249. package/tests/workers/library-build-worker.spec.ts +113 -20
  250. package/tests/workers/ngtsc-build-lint.spec.ts +3 -6
  251. package/tests/workers/ngtsc-build-worker.spec.ts +11 -13
  252. package/tests/workers/server-build-lint.spec.ts +4 -1
  253. package/tests/workers/server-build-worker.spec.ts +19 -22
  254. package/tests/angular/migration-cleanup.spec.ts +0 -59
@@ -15,8 +15,7 @@ const logger = consola.withTag("sd:cli:engine");
15
15
  export interface CommonBuildWorkerEvents extends Record<string, unknown> {
16
16
  buildStart: Record<string, never>;
17
17
  build: {
18
- js: { success: boolean; errors?: string[]; warnings?: string[] };
19
- dts: { success: boolean; errors?: string[] };
18
+ build: { success: boolean; errors?: string[]; warnings?: string[] };
20
19
  lint?: LintWithProgramResult;
21
20
  };
22
21
  error: { message: string };
@@ -132,7 +131,7 @@ export abstract class BaseEngine<
132
131
  const workerKey = `${this._pkg.name}:build`;
133
132
 
134
133
  this._worker!.on("buildStart", () => {
135
- if (!isInitialBuild && this._rebuildManager != null) {
134
+ if (this._rebuildManager != null) {
136
135
  resolver = this._rebuildManager.registerBuild(
137
136
  workerKey,
138
137
  `${this._pkg.name} (${this._getTarget()})`,
@@ -143,30 +142,20 @@ export abstract class BaseEngine<
143
142
  this._worker!.on("build", (data) => {
144
143
  const event = data;
145
144
 
146
- if (event.js.warnings != null && event.js.warnings.length > 0) {
147
- logger.warn(`${this._pkg.name}: ${event.js.warnings.join(", ")}`);
145
+ if (event.build.warnings != null && event.build.warnings.length > 0) {
146
+ logger.warn(`${this._pkg.name}: ${event.build.warnings.join(", ")}`);
148
147
  }
149
148
 
150
- // JS 결과 보고
149
+ // 빌드 결과 보고
151
150
  const buildResult: BuildResult = {
152
151
  name: this._pkg.name,
153
152
  target: this._getTarget(),
154
153
  type: "build",
155
- status: event.js.success ? "success" : "error",
156
- message: event.js.errors?.join("\n"),
154
+ status: event.build.success ? "success" : "error",
155
+ message: event.build.errors?.join("\n"),
157
156
  };
158
157
  this._resultCollector?.add(buildResult);
159
158
 
160
- // DTS 결과 보고
161
- const dtsResult: BuildResult = {
162
- name: this._pkg.name,
163
- target: this._getTarget(),
164
- type: "dts",
165
- status: event.dts.success ? "success" : "error",
166
- message: event.dts.errors?.join("\n"),
167
- };
168
- this._resultCollector?.add(dtsResult);
169
-
170
159
  // 린트 결과 보고 (있는 경우)
171
160
  if (event.lint != null) {
172
161
  const lintResult: BuildResult = {
@@ -184,7 +173,7 @@ export abstract class BaseEngine<
184
173
 
185
174
  if (isInitialBuild) {
186
175
  isInitialBuild = false;
187
- logger.debug(`[${this._pkg.name}] 초기 빌드 완료 (success: ${event.js.success})`);
176
+ logger.debug(`[${this._pkg.name}] 초기 빌드 완료 (success: ${event.build.success})`);
188
177
  resolve();
189
178
  }
190
179
  });
@@ -3,6 +3,9 @@ import type { ResultCollector } from "../infra/ResultCollector";
3
3
  import type { RebuildManager } from "../utils/rebuild-manager";
4
4
  import type { BuildOutput, BuildPackageInfo, EngineResult } from "./types";
5
5
  import { BaseEngine, type CommonBuildWorkerModule } from "./BaseEngine";
6
+ import { consola } from "consola";
7
+
8
+ const logger = consola.withTag("sd:cli:engine:ngtsc");
6
9
 
7
10
  /**
8
11
  * NgtscEngine options
@@ -41,6 +44,7 @@ export class NgtscEngine extends BaseEngine<
41
44
  }
42
45
 
43
46
  protected async _callBuild(output: BuildOutput): Promise<EngineResult> {
47
+ logger.debug(`[${this._pkg.name}] worker.build 호출`);
44
48
  const result = await this._worker!.build({
45
49
  name: this._pkg.name,
46
50
  cwd: this._cwd,
@@ -49,23 +53,19 @@ export class NgtscEngine extends BaseEngine<
49
53
  });
50
54
 
51
55
  return {
52
- success: result.js.success && result.dts.success,
53
- js: {
54
- success: result.js.success,
55
- errors: result.js.errors ?? [],
56
- warnings: result.js.warnings ?? [],
57
- },
58
- dts: {
59
- success: result.dts.success,
60
- errors: result.dts.errors ?? [],
61
- warnings: [],
62
- diagnostics: result.dts.diagnostics,
56
+ success: result.build.success,
57
+ build: {
58
+ success: result.build.success,
59
+ errors: result.build.errors ?? [],
60
+ warnings: result.build.warnings ?? [],
61
+ diagnostics: result.build.diagnostics,
63
62
  },
64
63
  lint: result.lint,
65
64
  };
66
65
  }
67
66
 
68
67
  protected async _callStartWatch(output: BuildOutput): Promise<void> {
68
+ logger.debug(`[${this._pkg.name}] worker.startWatch 호출`);
69
69
  await this._worker!.startWatch({
70
70
  name: this._pkg.name,
71
71
  cwd: this._cwd,
@@ -3,6 +3,9 @@ import type { ResultCollector } from "../infra/ResultCollector";
3
3
  import type { RebuildManager } from "../utils/rebuild-manager";
4
4
  import type { BuildOutput, EngineResult, ServerPackageInfo } from "./types";
5
5
  import { BaseEngine, type CommonBuildWorkerModule } from "./BaseEngine";
6
+ import { consola } from "consola";
7
+
8
+ const logger = consola.withTag("sd:cli:engine:server");
6
9
 
7
10
  /**
8
11
  * ServerEsbuildEngine options
@@ -41,6 +44,7 @@ export class ServerEsbuildEngine extends BaseEngine<
41
44
  }
42
45
 
43
46
  protected async _callBuild(output: BuildOutput): Promise<EngineResult> {
47
+ logger.debug(`[${this._pkg.name}] worker.build 호출`);
44
48
  const result = await this._worker!.build({
45
49
  name: this._pkg.name,
46
50
  cwd: this._cwd,
@@ -54,23 +58,19 @@ export class ServerEsbuildEngine extends BaseEngine<
54
58
  });
55
59
 
56
60
  return {
57
- success: result.js.success && result.dts.success,
58
- js: {
59
- success: result.js.success,
60
- errors: result.js.errors ?? [],
61
- warnings: result.js.warnings ?? [],
62
- },
63
- dts: {
64
- success: result.dts.success,
65
- errors: result.dts.errors ?? [],
66
- warnings: [],
67
- diagnostics: result.dts.diagnostics,
61
+ success: result.build.success,
62
+ build: {
63
+ success: result.build.success,
64
+ errors: result.build.errors ?? [],
65
+ warnings: result.build.warnings ?? [],
66
+ diagnostics: result.build.diagnostics,
68
67
  },
69
68
  lint: result.lint,
70
69
  };
71
70
  }
72
71
 
73
72
  protected async _callStartWatch(output: BuildOutput): Promise<void> {
73
+ logger.debug(`[${this._pkg.name}] worker.startWatch 호출`);
74
74
  await this._worker!.startWatch({
75
75
  name: this._pkg.name,
76
76
  cwd: this._cwd,
@@ -3,6 +3,9 @@ import type { ResultCollector } from "../infra/ResultCollector";
3
3
  import type { RebuildManager } from "../utils/rebuild-manager";
4
4
  import type { BuildOutput, BuildPackageInfo, EngineResult } from "./types";
5
5
  import { BaseEngine, type CommonBuildWorkerModule } from "./BaseEngine";
6
+ import { consola } from "consola";
7
+
8
+ const logger = consola.withTag("sd:cli:engine:tsc");
6
9
 
7
10
  /**
8
11
  * TscEngine options
@@ -41,6 +44,7 @@ export class TscEngine extends BaseEngine<
41
44
  }
42
45
 
43
46
  protected async _callBuild(output: BuildOutput): Promise<EngineResult> {
47
+ logger.debug(`[${this._pkg.name}] worker.build 호출`);
44
48
  const result = await this._worker!.build({
45
49
  name: this._pkg.name,
46
50
  config: this._pkg.config,
@@ -50,23 +54,19 @@ export class TscEngine extends BaseEngine<
50
54
  });
51
55
 
52
56
  return {
53
- success: result.js.success && result.dts.success,
54
- js: {
55
- success: result.js.success,
56
- errors: result.js.errors ?? [],
57
- warnings: result.js.warnings ?? [],
58
- },
59
- dts: {
60
- success: result.dts.success,
61
- errors: result.dts.errors ?? [],
62
- warnings: [],
63
- diagnostics: result.dts.diagnostics,
57
+ success: result.build.success,
58
+ build: {
59
+ success: result.build.success,
60
+ errors: result.build.errors ?? [],
61
+ warnings: result.build.warnings ?? [],
62
+ diagnostics: result.build.diagnostics,
64
63
  },
65
64
  lint: result.lint,
66
65
  };
67
66
  }
68
67
 
69
68
  protected async _callStartWatch(output: BuildOutput): Promise<void> {
69
+ logger.debug(`[${this._pkg.name}] worker.startWatch 호출`);
70
70
  await this._worker!.startWatch({
71
71
  name: this._pkg.name,
72
72
  config: this._pkg.config,
@@ -69,15 +69,10 @@ export class ViteEngine implements BuildEngine {
69
69
  logger.debug(`[${this._pkg.name}] ViteEngine.run 완료 (success: ${result.success})`);
70
70
  return {
71
71
  success: result.success,
72
- js: {
72
+ build: {
73
73
  success: result.success,
74
74
  errors: result.errors ?? [],
75
75
  warnings: result.warnings ?? [],
76
- },
77
- dts: {
78
- success: true,
79
- errors: [],
80
- warnings: [],
81
76
  diagnostics: [],
82
77
  },
83
78
  lint: result.lint,
@@ -185,22 +180,16 @@ export class ViteEngine implements BuildEngine {
185
180
  message: result.errors?.join("\n"),
186
181
  };
187
182
  this._resultCollector?.add(buildResult);
188
-
189
- const dtsResult: BuildResult = {
190
- name: this._pkg.name,
191
- target: "client",
192
- type: "dts",
193
- status: "success",
194
- };
195
- this._resultCollector?.add(dtsResult);
196
183
  }
197
184
 
198
185
  /**
199
186
  * 엔진을 중지하고 리소스를 정리한다
200
187
  */
201
188
  async stop(): Promise<void> {
189
+ logger.debug(`[${this._pkg.name}] ViteEngine stop 시작`);
202
190
  await stopEngineWorker(this._worker, this._isWatchMode);
203
191
  this._worker = undefined;
192
+ logger.debug(`[${this._pkg.name}] ViteEngine stop 완료`);
204
193
  }
205
194
 
206
195
  /**
@@ -37,6 +37,8 @@ export interface BuildOutput {
37
37
  lint?: boolean;
38
38
  /** Typecheck environment. When set, adjusts compilerOptions via getCompilerOptionsForEnv(). */
39
39
  env?: TypecheckEnv;
40
+ /** Include tests/ files in typecheck scope. Only used by check command. */
41
+ includeTests?: boolean;
40
42
  }
41
43
 
42
44
  /**
@@ -44,12 +46,7 @@ export interface BuildOutput {
44
46
  */
45
47
  export interface EngineResult {
46
48
  success: boolean;
47
- js: {
48
- success: boolean;
49
- errors: string[];
50
- warnings: string[];
51
- };
52
- dts: {
49
+ build: {
53
50
  success: boolean;
54
51
  errors: string[];
55
52
  warnings: string[];
@@ -4,7 +4,7 @@
4
4
  export interface BuildResult {
5
5
  name: string;
6
6
  target: string;
7
- type: "build" | "dts" | "lint" | "server";
7
+ type: "build" | "lint" | "server";
8
8
  status: "pending" | "building" | "success" | "error" | "running";
9
9
  message?: string;
10
10
  port?: number;
@@ -1,6 +1,5 @@
1
- import path from "path";
2
1
  import ts from "typescript";
3
- import { fsx } from "@simplysm/core-node";
2
+ import { fsx, pathx } from "@simplysm/core-node";
4
3
  import { consola } from "consola";
5
4
  import type {
6
5
  SdConfig,
@@ -37,7 +36,7 @@ export interface BuildOrchestratorOptions {
37
36
  interface BuildStepResult {
38
37
  name: string;
39
38
  target: string;
40
- type: "js" | "dts" | "lint";
39
+ type: "build" | "lint";
41
40
  success: boolean;
42
41
  errors?: string[];
43
42
  warnings?: string[];
@@ -101,7 +100,7 @@ export function classifyPackages(
101
100
  * Delete dist folders
102
101
  */
103
102
  async function cleanDistFolders(cwd: string, packageNames: string[]): Promise<void> {
104
- await Promise.all(packageNames.map((name) => fsx.rm(path.join(cwd, "packages", name, "dist"))));
103
+ await Promise.all(packageNames.map((name) => fsx.rm(pathx.posixResolve(cwd, "packages", name, "dist"))));
105
104
  }
106
105
 
107
106
  //#endregion
@@ -227,7 +226,7 @@ export class BuildOrchestrator {
227
226
 
228
227
  // buildPackages: JS build + dts generation via BuildEngine
229
228
  for (const { name, config } of classified.buildPackages) {
230
- const pkgDir = path.join(this._cwd, "packages", name);
229
+ const pkgDir = pathx.posixResolve(this._cwd, "packages", name);
231
230
 
232
231
  buildTasks.push(async () => {
233
232
  this._logger.debug(`[${name}] (${config.target}) 빌드 시작`);
@@ -239,28 +238,18 @@ export class BuildOrchestrator {
239
238
  try {
240
239
  const engineResult = await engine.run({ js: true, dts: true, lint: true });
241
240
 
242
- // JS 빌드 결과 처리
241
+ // 빌드 결과 처리
242
+ const diagnostics = engineResult.build.diagnostics.map((d) => deserializeDiagnostic(d, fileCache));
243
243
  results.push({
244
244
  name,
245
245
  target: config.target,
246
- type: "js",
247
- success: engineResult.js.success,
248
- errors: engineResult.js.errors.length > 0 ? engineResult.js.errors : undefined,
249
- warnings: engineResult.js.warnings.length > 0 ? engineResult.js.warnings : undefined,
250
- });
251
- if (!engineResult.js.success) state.hasError = true;
252
-
253
- // DTS 결과 처리
254
- const diagnostics = engineResult.dts.diagnostics.map((d) => deserializeDiagnostic(d, fileCache));
255
- results.push({
256
- name,
257
- target: config.target,
258
- type: "dts",
259
- success: engineResult.dts.success,
260
- errors: engineResult.dts.errors.length > 0 ? engineResult.dts.errors : undefined,
246
+ type: "build",
247
+ success: engineResult.build.success,
248
+ errors: engineResult.build.errors.length > 0 ? engineResult.build.errors : undefined,
249
+ warnings: engineResult.build.warnings.length > 0 ? engineResult.build.warnings : undefined,
261
250
  diagnostics,
262
251
  });
263
- if (!engineResult.dts.success) state.hasError = true;
252
+ if (!engineResult.build.success) state.hasError = true;
264
253
 
265
254
  // 린트 결과 처리
266
255
  if (engineResult.lint != null) {
@@ -289,7 +278,7 @@ export class BuildOrchestrator {
289
278
 
290
279
  // serverPackages: JS build + typecheck via BuildEngine
291
280
  for (const { name, config } of classified.serverPackages) {
292
- const pkgDir = path.join(this._cwd, "packages", name);
281
+ const pkgDir = pathx.posixResolve(this._cwd, "packages", name);
293
282
 
294
283
  buildTasks.push(async () => {
295
284
  this._logger.debug(`[${name}] (server) 빌드 시작`);
@@ -301,28 +290,18 @@ export class BuildOrchestrator {
301
290
  try {
302
291
  const engineResult = await engine.run({ js: true, dts: false, lint: true });
303
292
 
304
- // JS 빌드 결과 처리
293
+ // 빌드 결과 처리
294
+ const diagnostics = engineResult.build.diagnostics.map((d) => deserializeDiagnostic(d, fileCache));
305
295
  results.push({
306
296
  name,
307
297
  target: "server",
308
- type: "js",
309
- success: engineResult.js.success,
310
- errors: engineResult.js.errors.length > 0 ? engineResult.js.errors : undefined,
311
- warnings: engineResult.js.warnings.length > 0 ? engineResult.js.warnings : undefined,
312
- });
313
- if (!engineResult.js.success) state.hasError = true;
314
-
315
- // DTS/타입체크 결과 처리
316
- const diagnostics = engineResult.dts.diagnostics.map((d) => deserializeDiagnostic(d, fileCache));
317
- results.push({
318
- name,
319
- target: "server",
320
- type: "dts",
321
- success: engineResult.dts.success,
322
- errors: engineResult.dts.errors.length > 0 ? engineResult.dts.errors : undefined,
298
+ type: "build",
299
+ success: engineResult.build.success,
300
+ errors: engineResult.build.errors.length > 0 ? engineResult.build.errors : undefined,
301
+ warnings: engineResult.build.warnings.length > 0 ? engineResult.build.warnings : undefined,
323
302
  diagnostics,
324
303
  });
325
- if (!engineResult.dts.success) state.hasError = true;
304
+ if (!engineResult.build.success) state.hasError = true;
326
305
 
327
306
  // 린트 결과 처리
328
307
  if (engineResult.lint != null) {
@@ -345,7 +324,7 @@ export class BuildOrchestrator {
345
324
 
346
325
  // clientPackages: Vite production build via ViteEngine (no dts)
347
326
  for (const { name, config } of classified.clientPackages) {
348
- const pkgDir = path.join(this._cwd, "packages", name);
327
+ const pkgDir = pathx.posixResolve(this._cwd, "packages", name);
349
328
 
350
329
  buildTasks.push(async () => {
351
330
  this._logger.debug(`[${name}] (client) 빌드 시작`);
@@ -357,28 +336,18 @@ export class BuildOrchestrator {
357
336
  try {
358
337
  const engineResult = await engine.run({ js: true, dts: false, lint: true });
359
338
 
360
- // JS 빌드 결과 처리
361
- results.push({
362
- name,
363
- target: "client",
364
- type: "js",
365
- success: engineResult.js.success,
366
- errors: engineResult.js.errors.length > 0 ? engineResult.js.errors : undefined,
367
- warnings: engineResult.js.warnings.length > 0 ? engineResult.js.warnings : undefined,
368
- });
369
- if (!engineResult.js.success) state.hasError = true;
370
-
371
- // DTS 결과 처리
372
- const diagnostics = engineResult.dts.diagnostics.map((d) => deserializeDiagnostic(d, fileCache));
339
+ // 빌드 결과 처리
340
+ const diagnostics = engineResult.build.diagnostics.map((d) => deserializeDiagnostic(d, fileCache));
373
341
  results.push({
374
342
  name,
375
343
  target: "client",
376
- type: "dts",
377
- success: engineResult.dts.success,
378
- errors: engineResult.dts.errors.length > 0 ? engineResult.dts.errors : undefined,
344
+ type: "build",
345
+ success: engineResult.build.success,
346
+ errors: engineResult.build.errors.length > 0 ? engineResult.build.errors : undefined,
347
+ warnings: engineResult.build.warnings.length > 0 ? engineResult.build.warnings : undefined,
379
348
  diagnostics,
380
349
  });
381
- if (!engineResult.dts.success) state.hasError = true;
350
+ if (!engineResult.build.success) state.hasError = true;
382
351
 
383
352
  // 린트 결과 처리
384
353
  if (engineResult.lint != null) {
@@ -392,9 +361,9 @@ export class BuildOrchestrator {
392
361
  if (!engineResult.lint.success) state.hasError = true;
393
362
  }
394
363
 
395
- // 네이티브 빌드 (JS 빌드 성공 시에만 실행)
396
- if (engineResult.js.success) {
397
- const distPath = path.join(pkgDir, "dist");
364
+ // 네이티브 빌드 (빌드 성공 시에만 실행)
365
+ if (engineResult.build.success) {
366
+ const distPath = pathx.posixResolve(pkgDir, "dist");
398
367
  const nativeBuildPromises: Array<Promise<void>> = [];
399
368
 
400
369
  if (config.capacitor != null) {
@@ -462,7 +431,7 @@ export class BuildOrchestrator {
462
431
  // 결과 출력
463
432
  const allDiagnostics: ts.Diagnostic[] = [];
464
433
  for (const result of results) {
465
- const typeLabel = result.type === "dts" ? "dts" : result.type === "lint" ? "lint" : result.target;
434
+ const typeLabel = result.type === "lint" ? "lint" : result.target;
466
435
 
467
436
  // 경고 출력
468
437
  if (result.warnings != null) {
@@ -1,7 +1,6 @@
1
- import path from "path";
2
1
  import { spawn, type ChildProcess } from "child_process";
3
2
  import { consola } from "consola";
4
- import { Worker, type WorkerProxy } from "@simplysm/core-node";
3
+ import { Worker, type WorkerProxy, pathx } from "@simplysm/core-node";
5
4
  import { FsWatcher } from "@simplysm/core-node";
6
5
  import { err as errNs } from "@simplysm/core-common";
7
6
  import type {
@@ -12,7 +11,7 @@ import type {
12
11
  SdServerPackageConfig,
13
12
  } from "../sd-config.types";
14
13
  import { loadSdConfig } from "../utils/sd-config";
15
- import { discoverWorkspacePackages, filterPackagesByTargets, mergeTestsPackagesIntoConfig, validateTargets, classifyWatchPackages, classifyDevPackages } from "../utils/package-utils";
14
+ import { filterPackagesByTargets, validateTargets, classifyWatchPackages, classifyDevPackages, buildPathMapFromConfig } from "../utils/package-utils";
16
15
  import { getVersion } from "../utils/build-env";
17
16
  import { watchReplaceDeps, type WatchReplaceDepResult } from "../utils/replace-deps";
18
17
  import { printErrors, printServers } from "../utils/output-utils";
@@ -72,6 +71,7 @@ export class DevWatchOrchestrator {
72
71
  private _baseEnv: { VER: string; DEV: string } | undefined;
73
72
  private readonly _serverRuntimeWorkers = new Map<string, WorkerProxy<typeof ServerRuntimeWorkerModule>>();
74
73
  private _printServersTimer: ReturnType<typeof setTimeout> | undefined;
74
+ private _serverRestartTimer: ReturnType<typeof setTimeout> | undefined;
75
75
 
76
76
  // Watchers
77
77
  private _copySrcWatchers: FsWatcher[] = [];
@@ -107,13 +107,11 @@ export class DevWatchOrchestrator {
107
107
  throw err;
108
108
  }
109
109
 
110
- // Discover tests packages and merge into config
111
- const workspacePackages = discoverWorkspacePackages(this._cwd);
112
- const { merged, pathMap } = mergeTestsPackagesIntoConfig(sdConfig.packages, workspacePackages);
113
- this._pathMap = pathMap;
110
+ // Build pathMap from config packages only (tests packages are excluded from watch/dev)
111
+ this._pathMap = buildPathMapFromConfig(sdConfig.packages);
114
112
 
115
113
  // Validate targets
116
- validateTargets(this._options.targets, merged);
114
+ validateTargets(this._options.targets, sdConfig.packages);
117
115
 
118
116
  // Store replaceDeps for engine creation
119
117
  this._replaceDeps = sdConfig.replaceDeps;
@@ -130,7 +128,7 @@ export class DevWatchOrchestrator {
130
128
  }
131
129
 
132
130
  // Filter by targets
133
- const allPackages = filterPackagesByTargets(merged, this._options.targets);
131
+ const allPackages = filterPackagesByTargets(sdConfig.packages, this._options.targets);
134
132
 
135
133
  // Classify packages based on mode
136
134
  if (this._options.mode === "watch") {
@@ -161,12 +159,12 @@ export class DevWatchOrchestrator {
161
159
 
162
160
  // Batch complete handler
163
161
  if (this._options.mode === "watch") {
164
- this._rebuildManager.on("batchComplete", () => {
162
+ this._rebuildManager.on("batchComplete", (_completedKeys) => {
165
163
  printErrors(this._resultCollector.toMap());
166
164
  });
167
165
  } else {
168
- this._rebuildManager.on("batchComplete", () => {
169
- this._onDevBatchComplete();
166
+ this._rebuildManager.on("batchComplete", (completedKeys) => {
167
+ this._onDevBatchComplete(completedKeys);
170
168
  });
171
169
  }
172
170
 
@@ -223,8 +221,10 @@ export class DevWatchOrchestrator {
223
221
 
224
222
  async start(): Promise<void> {
225
223
  if (!this._hasPackages) {
224
+ this._logger.debug("대상 패키지 없음, start 건너뜀");
226
225
  return;
227
226
  }
227
+ this._logger.debug("start 시작");
228
228
 
229
229
  if (this._options.mode === "watch") {
230
230
  await this._startWatchMode();
@@ -244,6 +244,7 @@ export class DevWatchOrchestrator {
244
244
  if (!this._hasPackages) {
245
245
  return;
246
246
  }
247
+ this._logger.debug("shutdown 시작");
247
248
 
248
249
  process.stdout.write("⏳ 종료 중...\n");
249
250
 
@@ -280,6 +281,7 @@ export class DevWatchOrchestrator {
280
281
  // --- Watch mode ---
281
282
 
282
283
  private async _startWatchMode(): Promise<void> {
284
+ this._logger.debug("watch 모드 시작");
283
285
  // Start copySrc watchers for library packages
284
286
  for (const pkg of this._libraryPackages) {
285
287
  if (pkg.config.copySrc != null && pkg.config.copySrc.length > 0) {
@@ -295,7 +297,7 @@ export class DevWatchOrchestrator {
295
297
 
296
298
  const watchPromises = this._libraryEngines.map(async (engine, i) => {
297
299
  const pkgName = this._libraryPackages[i].name;
298
- await engine.startWatch({ js: true, dts: true, lint: true });
300
+ await engine.startWatch({ js: true, dts: true, lint: false });
299
301
  completed++;
300
302
  this._logger.info(` [${completed}/${total}] ${pkgName} 완료`);
301
303
  });
@@ -309,7 +311,7 @@ export class DevWatchOrchestrator {
309
311
  // Start watch hook watchers for scripts+watch packages
310
312
  for (const pkg of this._watchHookPackages) {
311
313
  const watchConfig = pkg.config.watch!;
312
- const watchTargets = watchConfig.target.map((t) => path.resolve(pkg.dir, t));
314
+ const watchTargets = watchConfig.target.map((t) => pathx.posixResolve(pkg.dir, t));
313
315
 
314
316
  // Run initial hook
315
317
  this._runWatchHookCmd(pkg.name, pkg.dir, watchConfig.cmd, watchConfig.args);
@@ -355,14 +357,14 @@ export class DevWatchOrchestrator {
355
357
  for (const [name, engine] of this._clientEngines) {
356
358
  initialBuildPromises.push({
357
359
  name: `${name} (client)`,
358
- promise: engine.startWatch({ js: true, dts: false, lint: true }),
360
+ promise: engine.startWatch({ js: true, dts: false, lint: false }),
359
361
  });
360
362
  }
361
363
 
362
364
  for (const [name, engine] of this._serverEngines) {
363
365
  initialBuildPromises.push({
364
366
  name: `${name} (server)`,
365
- promise: engine.startWatch({ js: true, dts: false, lint: true }),
367
+ promise: engine.startWatch({ js: true, dts: false, lint: false }),
366
368
  });
367
369
  }
368
370
 
@@ -398,34 +400,13 @@ export class DevWatchOrchestrator {
398
400
  }
399
401
  }
400
402
 
401
- // Start runtimes for successful initial builds
402
- for (const { name, config } of this._serverPackages) {
403
- const buildResult = this._resultCollector.get(`${name}:build`);
404
- if (buildResult?.status === "success") {
405
- const mainJsPath = path.join(this._cwd, "packages", name, "dist", "main.js");
406
- const clientPorts = this._collectClientPorts(name);
407
- try {
408
- await this._startServerRuntime(name, mainJsPath, { ...this._baseEnv, ...config.env }, clientPorts);
409
- } catch (err) {
410
- this._logger.error(`[${name}] 서버 런타임 시작 실패:`, errNs.message(err));
411
- this._resultCollector.add({
412
- name,
413
- target: "server",
414
- type: "server",
415
- status: "error",
416
- message: errNs.message(err),
417
- });
418
- }
419
- }
420
- }
421
-
422
403
  // Start native apps for client packages with capacitor/electron config
423
404
  for (const { name, config } of this._clientPackages) {
424
405
  const port = this._getClientPort(name);
425
406
  if (port == null) continue;
426
407
 
427
408
  const devServerUrl = `http://localhost:${port}`;
428
- const pkgDir = path.join(this._cwd, "packages", name);
409
+ const pkgDir = pathx.posixResolve(this._cwd, "packages", name);
429
410
 
430
411
  if (config.capacitor != null) {
431
412
  try {
@@ -466,12 +447,28 @@ export class DevWatchOrchestrator {
466
447
  printServers(this._resultCollector.toMap(), this._serverClientsMap);
467
448
  }
468
449
 
469
- private _onDevBatchComplete(): void {
450
+ private _onDevBatchComplete(completedKeys: string[]): void {
451
+ this._logger.debug(`배치 완료 (${completedKeys.join(", ")})`);
452
+ const serverBuildKeys = this._serverPackages.map((p) => `${p.name}:build`);
453
+ if (!completedKeys.some((k) => serverBuildKeys.includes(k))) {
454
+ printErrors(this._resultCollector.toMap());
455
+ return;
456
+ }
457
+
458
+ if (this._serverRestartTimer != null) clearTimeout(this._serverRestartTimer);
459
+ this._serverRestartTimer = setTimeout(() => {
460
+ this._serverRestartTimer = undefined;
461
+ void this._restartServers();
462
+ }, 100);
463
+ }
464
+
465
+ private async _restartServers(): Promise<void> {
466
+ this._logger.debug("서버 재시작 시작");
470
467
  const restartPromises: Array<Promise<void>> = [];
471
468
  for (const { name, config } of this._serverPackages) {
472
469
  const buildResult = this._resultCollector.get(`${name}:build`);
473
470
  if (buildResult?.status === "success") {
474
- const mainJsPath = path.join(this._cwd, "packages", name, "dist", "main.js");
471
+ const mainJsPath = pathx.posixResolve(this._cwd, "packages", name, "dist", "main.js");
475
472
  const clientPorts = this._collectClientPorts(name);
476
473
  restartPromises.push(
477
474
  this._startServerRuntime(name, mainJsPath, { ...this._baseEnv, ...config.env }, clientPorts)
@@ -488,10 +485,10 @@ export class DevWatchOrchestrator {
488
485
  );
489
486
  }
490
487
  }
491
- void Promise.all(restartPromises).then(() => {
492
- printErrors(this._resultCollector.toMap());
493
- this._schedulePrintServers();
494
- });
488
+ await Promise.all(restartPromises);
489
+ this._logger.debug("서버 재시작 완료");
490
+ printErrors(this._resultCollector.toMap());
491
+ this._schedulePrintServers();
495
492
  }
496
493
 
497
494
  private _schedulePrintServers(): void {