@simplysm/sd-cli 14.0.30 → 14.0.32

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 (626) hide show
  1. package/dist/{utils → angular}/angular-build-pipeline.d.ts +0 -2
  2. package/dist/angular/angular-build-pipeline.d.ts.map +1 -0
  3. package/dist/{utils → angular}/angular-build-pipeline.js +3 -6
  4. package/dist/angular/angular-build-pipeline.js.map +1 -0
  5. package/dist/{utils → angular}/angular-build.d.ts +1 -1
  6. package/dist/angular/angular-build.d.ts.map +1 -0
  7. package/dist/{utils → angular}/angular-build.js +1 -1
  8. package/dist/angular/angular-build.js.map +1 -0
  9. package/dist/{utils → angular}/angular-compiler.d.ts +0 -3
  10. package/dist/angular/angular-compiler.d.ts.map +1 -0
  11. package/dist/{utils → angular}/angular-compiler.js +1 -45
  12. package/dist/angular/angular-compiler.js.map +1 -0
  13. package/dist/angular/client-transform-stylesheet.js +1 -1
  14. package/dist/angular/client-transform-stylesheet.js.map +1 -1
  15. package/dist/{utils → angular}/ngtsc-build-core.d.ts +3 -3
  16. package/dist/angular/ngtsc-build-core.d.ts.map +1 -0
  17. package/dist/angular/ngtsc-build-core.js.map +1 -0
  18. package/dist/angular/scss-compiler.d.ts.map +1 -0
  19. package/dist/angular/scss-compiler.js.map +1 -0
  20. package/dist/angular/vite-angular-plugin.d.ts +2 -10
  21. package/dist/angular/vite-angular-plugin.d.ts.map +1 -1
  22. package/dist/angular/vite-angular-plugin.js +20 -286
  23. package/dist/angular/vite-angular-plugin.js.map +1 -1
  24. package/dist/capacitor/capacitor-build.d.ts +14 -0
  25. package/dist/capacitor/capacitor-build.d.ts.map +1 -0
  26. package/dist/capacitor/capacitor-build.js +105 -0
  27. package/dist/capacitor/capacitor-build.js.map +1 -0
  28. package/dist/capacitor/capacitor-config-writer.d.ts +11 -0
  29. package/dist/capacitor/capacitor-config-writer.d.ts.map +1 -0
  30. package/dist/capacitor/capacitor-config-writer.js +54 -0
  31. package/dist/capacitor/capacitor-config-writer.js.map +1 -0
  32. package/dist/capacitor/capacitor-icon.d.ts +5 -0
  33. package/dist/capacitor/capacitor-icon.d.ts.map +1 -0
  34. package/dist/capacitor/capacitor-icon.js +58 -0
  35. package/dist/capacitor/capacitor-icon.js.map +1 -0
  36. package/dist/capacitor/capacitor-npm-config.d.ts +11 -0
  37. package/dist/capacitor/capacitor-npm-config.d.ts.map +1 -0
  38. package/dist/capacitor/capacitor-npm-config.js +145 -0
  39. package/dist/capacitor/capacitor-npm-config.js.map +1 -0
  40. package/dist/capacitor/capacitor.d.ts +0 -45
  41. package/dist/capacitor/capacitor.d.ts.map +1 -1
  42. package/dist/capacitor/capacitor.js +15 -354
  43. package/dist/capacitor/capacitor.js.map +1 -1
  44. package/dist/commands/check.js +2 -2
  45. package/dist/commands/check.js.map +1 -1
  46. package/dist/commands/dev.d.ts +3 -3
  47. package/dist/commands/dev.d.ts.map +1 -1
  48. package/dist/commands/dev.js +3 -3
  49. package/dist/commands/dev.js.map +1 -1
  50. package/dist/commands/lint.d.ts +1 -1
  51. package/dist/commands/lint.d.ts.map +1 -1
  52. package/dist/commands/lint.js +1 -1
  53. package/dist/commands/lint.js.map +1 -1
  54. package/dist/commands/publish/deployment-phase.d.ts +12 -0
  55. package/dist/commands/publish/deployment-phase.d.ts.map +1 -0
  56. package/dist/commands/publish/deployment-phase.js +94 -0
  57. package/dist/commands/publish/deployment-phase.js.map +1 -0
  58. package/dist/commands/publish/env-utils.d.ts +10 -0
  59. package/dist/commands/publish/env-utils.d.ts.map +1 -0
  60. package/dist/commands/publish/env-utils.js +41 -0
  61. package/dist/commands/publish/env-utils.js.map +1 -0
  62. package/dist/commands/publish/git-phase.d.ts +12 -0
  63. package/dist/commands/publish/git-phase.d.ts.map +1 -0
  64. package/dist/commands/publish/git-phase.js +79 -0
  65. package/dist/commands/publish/git-phase.js.map +1 -0
  66. package/dist/commands/{publish.d.ts → publish/index.d.ts} +1 -1
  67. package/dist/commands/publish/index.d.ts.map +1 -0
  68. package/dist/commands/publish/index.js +211 -0
  69. package/dist/commands/publish/index.js.map +1 -0
  70. package/dist/commands/publish/local-publisher.d.ts +6 -0
  71. package/dist/commands/publish/local-publisher.d.ts.map +1 -0
  72. package/dist/commands/publish/local-publisher.js +16 -0
  73. package/dist/commands/publish/local-publisher.js.map +1 -0
  74. package/dist/commands/publish/npm-publisher.d.ts +6 -0
  75. package/dist/commands/publish/npm-publisher.d.ts.map +1 -0
  76. package/dist/commands/publish/npm-publisher.js +21 -0
  77. package/dist/commands/publish/npm-publisher.js.map +1 -0
  78. package/dist/commands/publish/post-publish-phase.d.ts +8 -0
  79. package/dist/commands/publish/post-publish-phase.d.ts.map +1 -0
  80. package/dist/commands/publish/post-publish-phase.js +34 -0
  81. package/dist/commands/publish/post-publish-phase.js.map +1 -0
  82. package/dist/commands/publish/storage-publisher.d.ts +18 -0
  83. package/dist/commands/publish/storage-publisher.d.ts.map +1 -0
  84. package/dist/commands/publish/storage-publisher.js +173 -0
  85. package/dist/commands/publish/storage-publisher.js.map +1 -0
  86. package/dist/commands/publish/version-upgrade.d.ts +28 -0
  87. package/dist/commands/publish/version-upgrade.d.ts.map +1 -0
  88. package/dist/commands/publish/version-upgrade.js +96 -0
  89. package/dist/commands/publish/version-upgrade.js.map +1 -0
  90. package/dist/commands/replace-deps.js +1 -1
  91. package/dist/commands/replace-deps.js.map +1 -1
  92. package/dist/commands/watch.d.ts +3 -4
  93. package/dist/commands/watch.d.ts.map +1 -1
  94. package/dist/commands/watch.js +3 -4
  95. package/dist/commands/watch.js.map +1 -1
  96. package/dist/deps/replace-deps/collect-deps.d.ts +6 -0
  97. package/dist/deps/replace-deps/collect-deps.d.ts.map +1 -0
  98. package/dist/deps/replace-deps/collect-deps.js +71 -0
  99. package/dist/deps/replace-deps/collect-deps.js.map +1 -0
  100. package/dist/{utils/replace-deps.d.ts → deps/replace-deps/replace-deps-resolve.d.ts} +7 -24
  101. package/dist/deps/replace-deps/replace-deps-resolve.d.ts.map +1 -0
  102. package/dist/{utils/replace-deps.js → deps/replace-deps/replace-deps-resolve.js} +4 -152
  103. package/dist/deps/replace-deps/replace-deps-resolve.js.map +1 -0
  104. package/dist/deps/replace-deps/replace-deps.d.ts +36 -0
  105. package/dist/deps/replace-deps/replace-deps.d.ts.map +1 -0
  106. package/dist/deps/replace-deps/replace-deps.js +155 -0
  107. package/dist/deps/replace-deps/replace-deps.js.map +1 -0
  108. package/dist/{utils → deps/server-externals}/server-production-files.d.ts +1 -1
  109. package/dist/deps/server-externals/server-production-files.d.ts.map +1 -0
  110. package/dist/{utils → deps/server-externals}/server-production-files.js +1 -1
  111. package/dist/deps/server-externals/server-production-files.js.map +1 -0
  112. package/dist/dev-server/dev-http-server.d.ts +23 -0
  113. package/dist/dev-server/dev-http-server.d.ts.map +1 -0
  114. package/dist/dev-server/dev-http-server.js +116 -0
  115. package/dist/dev-server/dev-http-server.js.map +1 -0
  116. package/dist/dev-server/hmr-client-script.d.ts +13 -0
  117. package/dist/dev-server/hmr-client-script.d.ts.map +1 -0
  118. package/dist/dev-server/hmr-client-script.js +73 -0
  119. package/dist/dev-server/hmr-client-script.js.map +1 -0
  120. package/dist/dev-server/hmr-service.d.ts +23 -0
  121. package/dist/dev-server/hmr-service.d.ts.map +1 -0
  122. package/dist/dev-server/hmr-service.js +139 -0
  123. package/dist/dev-server/hmr-service.js.map +1 -0
  124. package/dist/electron/electron.d.ts +5 -0
  125. package/dist/electron/electron.d.ts.map +1 -1
  126. package/dist/electron/electron.js +17 -24
  127. package/dist/electron/electron.js.map +1 -1
  128. package/dist/engines/BaseEngine.d.ts +18 -4
  129. package/dist/engines/BaseEngine.d.ts.map +1 -1
  130. package/dist/engines/BaseEngine.js +45 -66
  131. package/dist/engines/BaseEngine.js.map +1 -1
  132. package/dist/engines/{ViteEngine.d.ts → EsbuildClientEngine.d.ts} +11 -18
  133. package/dist/engines/EsbuildClientEngine.d.ts.map +1 -0
  134. package/dist/engines/{ViteEngine.js → EsbuildClientEngine.js} +28 -55
  135. package/dist/engines/EsbuildClientEngine.js.map +1 -0
  136. package/dist/engines/NgtscEngine.d.ts +2 -2
  137. package/dist/engines/NgtscEngine.d.ts.map +1 -1
  138. package/dist/engines/NgtscEngine.js +1 -9
  139. package/dist/engines/NgtscEngine.js.map +1 -1
  140. package/dist/engines/ServerEsbuildEngine.d.ts +2 -2
  141. package/dist/engines/ServerEsbuildEngine.d.ts.map +1 -1
  142. package/dist/engines/ServerEsbuildEngine.js +1 -9
  143. package/dist/engines/ServerEsbuildEngine.js.map +1 -1
  144. package/dist/engines/TscEngine.d.ts +2 -2
  145. package/dist/engines/TscEngine.d.ts.map +1 -1
  146. package/dist/engines/TscEngine.js +1 -9
  147. package/dist/engines/TscEngine.js.map +1 -1
  148. package/dist/engines/index.d.ts +15 -5
  149. package/dist/engines/index.d.ts.map +1 -1
  150. package/dist/engines/index.js +21 -5
  151. package/dist/engines/index.js.map +1 -1
  152. package/dist/engines/types.d.ts +3 -3
  153. package/dist/engines/types.d.ts.map +1 -1
  154. package/dist/esbuild/esbuild-client-config.d.ts +38 -0
  155. package/dist/esbuild/esbuild-client-config.d.ts.map +1 -0
  156. package/dist/esbuild/esbuild-client-config.js +171 -0
  157. package/dist/esbuild/esbuild-client-config.js.map +1 -0
  158. package/dist/esbuild/esbuild-config.d.ts.map +1 -0
  159. package/dist/{utils → esbuild}/esbuild-config.js +1 -0
  160. package/dist/esbuild/esbuild-config.js.map +1 -0
  161. package/dist/esbuild/esbuild-index-html.d.ts +39 -0
  162. package/dist/esbuild/esbuild-index-html.d.ts.map +1 -0
  163. package/dist/esbuild/esbuild-index-html.js +68 -0
  164. package/dist/esbuild/esbuild-index-html.js.map +1 -0
  165. package/dist/esbuild/esbuild-pwa.d.ts +21 -0
  166. package/dist/esbuild/esbuild-pwa.d.ts.map +1 -0
  167. package/dist/esbuild/esbuild-pwa.js +105 -0
  168. package/dist/esbuild/esbuild-pwa.js.map +1 -0
  169. package/dist/esbuild/esbuild-scss-plugin.d.ts +6 -0
  170. package/dist/esbuild/esbuild-scss-plugin.d.ts.map +1 -0
  171. package/dist/esbuild/esbuild-scss-plugin.js +41 -0
  172. package/dist/esbuild/esbuild-scss-plugin.js.map +1 -0
  173. package/dist/lint/lint-core.d.ts.map +1 -0
  174. package/dist/lint/lint-core.js.map +1 -0
  175. package/dist/lint/lint-utils.d.ts.map +1 -0
  176. package/dist/lint/lint-utils.js.map +1 -0
  177. package/dist/lint/lint-with-program.d.ts.map +1 -0
  178. package/dist/lint/lint-with-program.js.map +1 -0
  179. package/dist/orchestrators/BaseOrchestrator.d.ts +44 -0
  180. package/dist/orchestrators/BaseOrchestrator.d.ts.map +1 -0
  181. package/dist/orchestrators/BaseOrchestrator.js +92 -0
  182. package/dist/orchestrators/BaseOrchestrator.js.map +1 -0
  183. package/dist/orchestrators/BuildOrchestrator.d.ts +45 -3
  184. package/dist/orchestrators/BuildOrchestrator.d.ts.map +1 -1
  185. package/dist/orchestrators/BuildOrchestrator.js +170 -143
  186. package/dist/orchestrators/BuildOrchestrator.js.map +1 -1
  187. package/dist/orchestrators/DevOrchestrator.d.ts +39 -0
  188. package/dist/orchestrators/DevOrchestrator.d.ts.map +1 -0
  189. package/dist/orchestrators/DevOrchestrator.js +249 -0
  190. package/dist/orchestrators/DevOrchestrator.js.map +1 -0
  191. package/dist/orchestrators/ServerRuntimeManager.d.ts +22 -0
  192. package/dist/orchestrators/ServerRuntimeManager.d.ts.map +1 -0
  193. package/dist/orchestrators/ServerRuntimeManager.js +66 -0
  194. package/dist/orchestrators/ServerRuntimeManager.js.map +1 -0
  195. package/dist/orchestrators/TypecheckOrchestrator.d.ts +17 -2
  196. package/dist/orchestrators/TypecheckOrchestrator.d.ts.map +1 -1
  197. package/dist/orchestrators/TypecheckOrchestrator.js +122 -108
  198. package/dist/orchestrators/TypecheckOrchestrator.js.map +1 -1
  199. package/dist/orchestrators/WatchOrchestrator.d.ts +33 -0
  200. package/dist/orchestrators/WatchOrchestrator.d.ts.map +1 -0
  201. package/dist/orchestrators/WatchOrchestrator.js +158 -0
  202. package/dist/orchestrators/WatchOrchestrator.js.map +1 -0
  203. package/dist/orchestrators/types.d.ts +17 -0
  204. package/dist/orchestrators/types.d.ts.map +1 -0
  205. package/dist/orchestrators/types.js +2 -0
  206. package/dist/orchestrators/types.js.map +1 -0
  207. package/dist/runtime/ResultCollector.d.ts.map +1 -0
  208. package/dist/runtime/ResultCollector.js.map +1 -0
  209. package/dist/runtime/SignalHandler.d.ts.map +1 -0
  210. package/dist/runtime/SignalHandler.js.map +1 -0
  211. package/dist/{utils → runtime}/engine-stop.d.ts +1 -1
  212. package/dist/runtime/engine-stop.d.ts.map +1 -0
  213. package/dist/{utils → runtime}/engine-stop.js +1 -1
  214. package/dist/runtime/engine-stop.js.map +1 -0
  215. package/dist/runtime/engine-watch-events.d.ts +43 -0
  216. package/dist/runtime/engine-watch-events.d.ts.map +1 -0
  217. package/dist/runtime/engine-watch-events.js +72 -0
  218. package/dist/runtime/engine-watch-events.js.map +1 -0
  219. package/dist/{utils → runtime}/rebuild-manager.d.ts +1 -0
  220. package/dist/runtime/rebuild-manager.d.ts.map +1 -0
  221. package/dist/{utils → runtime}/rebuild-manager.js +8 -1
  222. package/dist/runtime/rebuild-manager.js.map +1 -0
  223. package/dist/runtime/worker-events.d.ts +22 -0
  224. package/dist/runtime/worker-events.d.ts.map +1 -0
  225. package/dist/runtime/worker-events.js +2 -0
  226. package/dist/runtime/worker-events.js.map +1 -0
  227. package/dist/runtime/worker-utils.d.ts.map +1 -0
  228. package/dist/runtime/worker-utils.js.map +1 -0
  229. package/dist/sd-cli-entry.d.ts.map +1 -1
  230. package/dist/sd-cli-entry.js +61 -54
  231. package/dist/sd-cli-entry.js.map +1 -1
  232. package/dist/sd-cli.js +1 -1
  233. package/dist/sd-cli.js.map +1 -1
  234. package/dist/sd-config.types.d.ts +6 -15
  235. package/dist/sd-config.types.d.ts.map +1 -1
  236. package/dist/typecheck/typecheck-non-package.d.ts.map +1 -0
  237. package/dist/{utils → typecheck}/typecheck-non-package.js +1 -1
  238. package/dist/typecheck/typecheck-non-package.js.map +1 -0
  239. package/dist/typecheck/typecheck-serialization.d.ts.map +1 -0
  240. package/dist/typecheck/typecheck-serialization.js.map +1 -0
  241. package/dist/utils/diagnostic-utils.d.ts +5 -0
  242. package/dist/utils/diagnostic-utils.d.ts.map +1 -1
  243. package/dist/utils/diagnostic-utils.js +15 -0
  244. package/dist/utils/diagnostic-utils.js.map +1 -1
  245. package/dist/utils/orchestrator-utils.d.ts +1 -5
  246. package/dist/utils/orchestrator-utils.d.ts.map +1 -1
  247. package/dist/utils/orchestrator-utils.js +2 -5
  248. package/dist/utils/orchestrator-utils.js.map +1 -1
  249. package/dist/utils/output-utils.d.ts +1 -1
  250. package/dist/utils/output-utils.d.ts.map +1 -1
  251. package/dist/utils/package-classify.d.ts +54 -0
  252. package/dist/utils/package-classify.d.ts.map +1 -0
  253. package/dist/utils/package-classify.js +134 -0
  254. package/dist/utils/package-classify.js.map +1 -0
  255. package/dist/utils/package-utils.d.ts +1 -58
  256. package/dist/utils/package-utils.d.ts.map +1 -1
  257. package/dist/utils/package-utils.js +0 -193
  258. package/dist/utils/package-utils.js.map +1 -1
  259. package/dist/utils/tsc-build.d.ts +1 -1
  260. package/dist/utils/tsc-build.d.ts.map +1 -1
  261. package/dist/utils/tsc-build.js +1 -1
  262. package/dist/utils/tsc-build.js.map +1 -1
  263. package/dist/workers/build-change-filter.d.ts +8 -0
  264. package/dist/workers/build-change-filter.d.ts.map +1 -0
  265. package/dist/workers/build-change-filter.js +16 -0
  266. package/dist/workers/build-change-filter.js.map +1 -0
  267. package/dist/workers/build-watch-paths.d.ts +20 -0
  268. package/dist/workers/build-watch-paths.d.ts.map +1 -0
  269. package/dist/workers/build-watch-paths.js +29 -0
  270. package/dist/workers/build-watch-paths.js.map +1 -0
  271. package/dist/workers/client.worker.d.ts +11 -18
  272. package/dist/workers/client.worker.d.ts.map +1 -1
  273. package/dist/workers/client.worker.js +218 -289
  274. package/dist/workers/client.worker.js.map +1 -1
  275. package/dist/workers/library-build.worker.d.ts +2 -2
  276. package/dist/workers/library-build.worker.d.ts.map +1 -1
  277. package/dist/workers/library-build.worker.js +13 -24
  278. package/dist/workers/library-build.worker.js.map +1 -1
  279. package/dist/workers/lint.worker.d.ts +1 -1
  280. package/dist/workers/lint.worker.d.ts.map +1 -1
  281. package/dist/workers/lint.worker.js +1 -1
  282. package/dist/workers/lint.worker.js.map +1 -1
  283. package/dist/workers/ngtsc-build.worker.d.ts +1 -1
  284. package/dist/workers/ngtsc-build.worker.d.ts.map +1 -1
  285. package/dist/workers/ngtsc-build.worker.js +19 -35
  286. package/dist/workers/ngtsc-build.worker.js.map +1 -1
  287. package/dist/workers/server-build.worker.d.ts +2 -2
  288. package/dist/workers/server-build.worker.d.ts.map +1 -1
  289. package/dist/workers/server-build.worker.js +36 -137
  290. package/dist/workers/server-build.worker.js.map +1 -1
  291. package/dist/workers/server-esbuild-context.d.ts +47 -0
  292. package/dist/workers/server-esbuild-context.d.ts.map +1 -0
  293. package/dist/workers/server-esbuild-context.js +92 -0
  294. package/dist/workers/server-esbuild-context.js.map +1 -0
  295. package/dist/workers/server-runtime.worker.d.ts.map +1 -1
  296. package/dist/workers/server-runtime.worker.js +3 -1
  297. package/dist/workers/server-runtime.worker.js.map +1 -1
  298. package/dist/workers/server-watch-manager.d.ts +44 -0
  299. package/dist/workers/server-watch-manager.d.ts.map +1 -0
  300. package/dist/workers/server-watch-manager.js +87 -0
  301. package/dist/workers/server-watch-manager.js.map +1 -0
  302. package/dist/workers/shared-worker-lifecycle.d.ts +14 -0
  303. package/dist/workers/shared-worker-lifecycle.d.ts.map +1 -0
  304. package/dist/workers/shared-worker-lifecycle.js +17 -0
  305. package/dist/workers/shared-worker-lifecycle.js.map +1 -0
  306. package/package.json +9 -9
  307. package/src/{utils → angular}/angular-build-pipeline.ts +3 -8
  308. package/src/{utils → angular}/angular-build.ts +1 -1
  309. package/src/{utils → angular}/angular-compiler.ts +1 -64
  310. package/src/angular/client-transform-stylesheet.ts +1 -1
  311. package/src/{utils → angular}/ngtsc-build-core.ts +3 -3
  312. package/src/angular/vite-angular-plugin.ts +22 -355
  313. package/src/capacitor/capacitor-build.ts +142 -0
  314. package/src/capacitor/capacitor-config-writer.ts +66 -0
  315. package/src/capacitor/capacitor-icon.ts +75 -0
  316. package/src/capacitor/capacitor-npm-config.ts +192 -0
  317. package/src/capacitor/capacitor.ts +32 -441
  318. package/src/commands/check.ts +2 -2
  319. package/src/commands/dev.ts +6 -6
  320. package/src/commands/lint.ts +1 -1
  321. package/src/commands/publish/deployment-phase.ts +125 -0
  322. package/src/commands/publish/env-utils.ts +44 -0
  323. package/src/commands/publish/git-phase.ts +99 -0
  324. package/src/commands/publish/index.ts +266 -0
  325. package/src/commands/publish/local-publisher.ts +23 -0
  326. package/src/commands/publish/npm-publisher.ts +30 -0
  327. package/src/commands/publish/post-publish-phase.ts +43 -0
  328. package/src/commands/publish/storage-publisher.ts +208 -0
  329. package/src/commands/publish/version-upgrade.ts +132 -0
  330. package/src/commands/replace-deps.ts +1 -1
  331. package/src/commands/watch.ts +6 -7
  332. package/src/deps/replace-deps/collect-deps.ts +92 -0
  333. package/src/{utils/replace-deps.ts → deps/replace-deps/replace-deps-resolve.ts} +4 -188
  334. package/src/deps/replace-deps/replace-deps.ts +193 -0
  335. package/src/{utils → deps/server-externals}/server-production-files.ts +2 -2
  336. package/src/dev-server/dev-http-server.ts +149 -0
  337. package/src/dev-server/hmr-client-script.ts +74 -0
  338. package/src/dev-server/hmr-service.ts +178 -0
  339. package/src/electron/electron.ts +21 -28
  340. package/src/engines/BaseEngine.ts +64 -83
  341. package/src/engines/{ViteEngine.ts → EsbuildClientEngine.ts} +33 -72
  342. package/src/engines/NgtscEngine.ts +3 -11
  343. package/src/engines/ServerEsbuildEngine.ts +3 -11
  344. package/src/engines/TscEngine.ts +3 -11
  345. package/src/engines/index.ts +29 -9
  346. package/src/engines/types.ts +3 -3
  347. package/src/esbuild/esbuild-client-config.ts +230 -0
  348. package/src/{utils → esbuild}/esbuild-config.ts +1 -0
  349. package/src/esbuild/esbuild-index-html.ts +119 -0
  350. package/src/esbuild/esbuild-pwa.ts +139 -0
  351. package/src/esbuild/esbuild-scss-plugin.ts +48 -0
  352. package/src/orchestrators/BaseOrchestrator.ts +118 -0
  353. package/src/orchestrators/BuildOrchestrator.ts +234 -171
  354. package/src/orchestrators/DevOrchestrator.ts +315 -0
  355. package/src/orchestrators/ServerRuntimeManager.ts +85 -0
  356. package/src/orchestrators/TypecheckOrchestrator.ts +166 -117
  357. package/src/orchestrators/WatchOrchestrator.ts +203 -0
  358. package/src/orchestrators/types.ts +18 -0
  359. package/src/{utils → runtime}/engine-stop.ts +1 -1
  360. package/src/runtime/engine-watch-events.ts +121 -0
  361. package/src/{utils → runtime}/rebuild-manager.ts +8 -1
  362. package/src/runtime/worker-events.ts +25 -0
  363. package/src/sd-cli-entry.ts +69 -54
  364. package/src/sd-cli.ts +1 -1
  365. package/src/sd-config.types.ts +6 -16
  366. package/src/{utils → typecheck}/typecheck-non-package.ts +1 -1
  367. package/src/utils/diagnostic-utils.ts +15 -0
  368. package/src/utils/orchestrator-utils.ts +2 -6
  369. package/src/utils/output-utils.ts +1 -1
  370. package/src/utils/package-classify.ts +182 -0
  371. package/src/utils/package-utils.ts +0 -257
  372. package/src/utils/tsc-build.ts +1 -1
  373. package/src/workers/build-change-filter.ts +27 -0
  374. package/src/workers/build-watch-paths.ts +54 -0
  375. package/src/workers/client.worker.ts +258 -328
  376. package/src/workers/library-build.worker.ts +15 -34
  377. package/src/workers/lint.worker.ts +1 -1
  378. package/src/workers/ngtsc-build.worker.ts +19 -46
  379. package/src/workers/server-build.worker.ts +38 -168
  380. package/src/workers/server-esbuild-context.ts +122 -0
  381. package/src/workers/server-runtime.worker.ts +4 -1
  382. package/src/workers/server-watch-manager.ts +124 -0
  383. package/src/workers/shared-worker-lifecycle.ts +24 -0
  384. package/tests/angular/angular-build-pipeline.spec.ts +2 -2
  385. package/tests/angular/angular-compiler-aot.acc.spec.ts +68 -0
  386. package/tests/angular/angular-compiler-aot.spec.ts +80 -0
  387. package/tests/angular/angular-compiler-hmr-removal.verify.md +16 -0
  388. package/tests/angular/vite-angular-plugin-legacy-watch.spec.ts +0 -17
  389. package/tests/angular/vite-angular-plugin-vitest.spec.ts +1 -6
  390. package/tests/angular/vite-angular-plugin-vitest.verify.md +20 -0
  391. package/tests/angular/vite-angular-plugin.spec.ts +4 -178
  392. package/tests/capacitor/capacitor-android.spec.ts +1 -0
  393. package/tests/capacitor/capacitor-build.spec.ts +1 -0
  394. package/tests/capacitor/capacitor-config-writer.acc.spec.ts +108 -0
  395. package/tests/capacitor/capacitor-config-writer.spec.ts +95 -0
  396. package/tests/capacitor/capacitor-icon.spec.ts +1 -0
  397. package/tests/capacitor/capacitor-init.spec.ts +1 -0
  398. package/tests/capacitor/capacitor-npm-config.acc.spec.ts +236 -0
  399. package/tests/capacitor/capacitor-npm-config.spec.ts +132 -0
  400. package/tests/capacitor/capacitor-run.spec.ts +1 -0
  401. package/tests/capacitor/capacitor-workspace.spec.ts +1 -0
  402. package/tests/commands/check.spec.ts +2 -2
  403. package/tests/commands/deployment-phase.acc.spec.ts +142 -0
  404. package/tests/commands/git-phase.acc.spec.ts +158 -0
  405. package/tests/commands/lint.spec.ts +1 -1
  406. package/tests/commands/post-publish-phase.acc.spec.ts +82 -0
  407. package/tests/commands/publish-npm-local-split.verify.md +9 -0
  408. package/tests/commands/publish-responsibility-split.verify.md +13 -0
  409. package/tests/commands/publish-storage-split.verify.md +8 -0
  410. package/tests/commands/publish.spec.ts +1 -1
  411. package/tests/commands/typecheck.spec.ts +18 -18
  412. package/tests/deps/deps-directory-separation.verify.md +15 -0
  413. package/tests/engines/base-engine.spec.ts +65 -6
  414. package/tests/engines/engine-adapter-isolation.spec.ts +11 -18
  415. package/tests/engines/engine-selection.spec.ts +38 -5
  416. package/tests/engines/engine-typecheck-selection.acc.spec.ts +85 -0
  417. package/tests/engines/engine-typecheck-selection.verify.md +8 -0
  418. package/tests/engines/esbuild-client-engine.acc.spec.ts +161 -0
  419. package/tests/engines/esbuild-client-engine.spec.ts +320 -0
  420. package/tests/engines/esbuild-client-engine.verify.md +15 -0
  421. package/tests/engines/normalize-result.verify.md +9 -0
  422. package/tests/engines/vite-dependency-cleanup.verify.md +24 -0
  423. package/tests/orchestrators/build-orchestrator.spec.ts +3 -3
  424. package/tests/orchestrators/dev-orchestrator.spec.ts +799 -0
  425. package/tests/orchestrators/orchestrator-baseenv.verify.md +10 -0
  426. package/tests/orchestrators/orchestrator-diagnostic-formatting.verify.md +10 -0
  427. package/tests/orchestrators/orchestrator-initializemode-signature.verify.md +9 -0
  428. package/tests/orchestrators/typecheck-orchestrator.spec.ts +11 -11
  429. package/tests/orchestrators/watch-orchestrator.spec.ts +511 -0
  430. package/tests/{infra → runtime}/result-collector.spec.ts +1 -1
  431. package/tests/{infra → runtime}/signal-handler.spec.ts +1 -1
  432. package/tests/sd-cli-entry.spec.ts +9 -0
  433. package/tests/utils/angular-build.spec.ts +15 -20
  434. package/tests/utils/angular-compiler-emit.spec.ts +2 -2
  435. package/tests/utils/angular-compiler.spec.ts +2 -2
  436. package/tests/utils/angular-source-file-cache.spec.ts +2 -2
  437. package/tests/utils/concurrency.spec.ts +2 -10
  438. package/tests/utils/dev-http-server.acc.spec.ts +206 -0
  439. package/tests/utils/dev-http-server.spec.ts +181 -0
  440. package/tests/utils/dev-http-server.verify.md +8 -0
  441. package/tests/utils/diagnostic-utils.spec.ts +42 -1
  442. package/tests/utils/engine-stop.spec.ts +1 -1
  443. package/tests/utils/engine-watch-events.acc.spec.ts +217 -0
  444. package/tests/utils/engine-watch-events.spec.ts +141 -0
  445. package/tests/utils/engine-watch-events.verify.md +17 -0
  446. package/tests/utils/esbuild-client-config.acc.spec.ts +443 -0
  447. package/tests/utils/esbuild-client-config.spec.ts +590 -0
  448. package/tests/utils/esbuild-client-config.verify.md +26 -0
  449. package/tests/utils/esbuild-config.spec.ts +11 -1
  450. package/tests/utils/esbuild-index-html.acc.spec.ts +166 -0
  451. package/tests/utils/esbuild-index-html.spec.ts +194 -0
  452. package/tests/utils/esbuild-index-html.verify.md +10 -0
  453. package/tests/utils/esbuild-pwa.acc.spec.ts +203 -0
  454. package/tests/utils/esbuild-pwa.spec.ts +189 -0
  455. package/tests/utils/esbuild-pwa.verify.md +9 -0
  456. package/tests/utils/esbuild-scss-plugin.acc.spec.ts +111 -0
  457. package/tests/utils/esbuild-scss-plugin.spec.ts +150 -0
  458. package/tests/utils/esbuild-scss-plugin.verify.md +8 -0
  459. package/tests/utils/external-modules.spec.ts +1 -1
  460. package/tests/utils/hmr-client-script.acc.spec.ts +128 -0
  461. package/tests/utils/hmr-client-script.spec.ts +44 -0
  462. package/tests/utils/hmr-service-dispatcher.acc.spec.ts +217 -0
  463. package/tests/utils/hmr-service-dispatcher.spec.ts +143 -0
  464. package/tests/utils/hmr-service.acc.spec.ts +139 -0
  465. package/tests/utils/hmr-service.spec.ts +131 -0
  466. package/tests/utils/hmr-service.verify.md +17 -0
  467. package/tests/utils/lint-core.spec.ts +2 -1
  468. package/tests/utils/lint-utils.spec.ts +1 -1
  469. package/tests/utils/lint-with-program.spec.ts +1 -1
  470. package/tests/utils/ngtsc-build-core-write-emit.spec.ts +19 -19
  471. package/tests/utils/ngtsc-build-core.spec.ts +4 -4
  472. package/tests/utils/orchestrator-utils.spec.ts +2 -2
  473. package/tests/utils/output-utils.spec.ts +1 -1
  474. package/tests/utils/package-utils.spec.ts +1 -1
  475. package/tests/utils/rebuild-manager.spec.ts +20 -7
  476. package/tests/utils/replace-deps-split.verify.md +15 -0
  477. package/tests/utils/replace-deps-watch.acc.spec.ts +131 -0
  478. package/tests/utils/replace-deps-watch.spec.ts +91 -0
  479. package/tests/utils/replace-deps-watch.verify.md +9 -0
  480. package/tests/utils/replace-deps.spec.ts +1 -1
  481. package/tests/utils/scss-compiler.spec.ts +1 -1
  482. package/tests/utils/tsc-build.spec.ts +1 -1
  483. package/tests/utils/typecheck-non-package.spec.ts +2 -2
  484. package/tests/utils/worker-utils.spec.ts +2 -1
  485. package/tests/workers/build-change-filter.acc.spec.ts +78 -0
  486. package/tests/workers/build-change-filter.spec.ts +39 -0
  487. package/tests/workers/build-watch-paths-library.verify.md +10 -0
  488. package/tests/workers/build-watch-paths-ngtsc-server.verify.md +12 -0
  489. package/tests/workers/build-watch-paths.acc.spec.ts +101 -0
  490. package/tests/workers/build-watch-paths.spec.ts +121 -0
  491. package/tests/workers/client-worker-browser-support.verify.md +7 -0
  492. package/tests/workers/client-worker-onend-sync.verify.md +7 -0
  493. package/tests/workers/client-worker.acc.spec.ts +185 -0
  494. package/tests/workers/client-worker.spec.ts +91 -178
  495. package/tests/workers/library-build-lint.spec.ts +3 -3
  496. package/tests/workers/library-build-worker.spec.ts +10 -11
  497. package/tests/workers/ngtsc-build-lint.spec.ts +4 -4
  498. package/tests/workers/ngtsc-build-worker.spec.ts +2 -2
  499. package/tests/workers/server-build-lint.spec.ts +4 -4
  500. package/tests/workers/server-build-worker.spec.ts +14 -15
  501. package/tests/workers/server-esbuild-context-integration.verify.md +10 -0
  502. package/tests/workers/server-esbuild-context.acc.spec.ts +98 -0
  503. package/tests/workers/server-esbuild-context.spec.ts +198 -0
  504. package/tests/workers/server-runtime-worker.spec.ts +4 -3
  505. package/tests/workers/server-watch-manager.acc.spec.ts +162 -0
  506. package/tests/workers/server-watch-manager.spec.ts +199 -0
  507. package/tests/workers/shared-worker-lifecycle.acc.spec.ts +27 -0
  508. package/tests/workers/shared-worker-lifecycle.spec.ts +47 -0
  509. package/dist/angular/vite-postcss-inline-plugin.d.ts +0 -18
  510. package/dist/angular/vite-postcss-inline-plugin.d.ts.map +0 -1
  511. package/dist/angular/vite-postcss-inline-plugin.js +0 -108
  512. package/dist/angular/vite-postcss-inline-plugin.js.map +0 -1
  513. package/dist/commands/publish.d.ts.map +0 -1
  514. package/dist/commands/publish.js +0 -689
  515. package/dist/commands/publish.js.map +0 -1
  516. package/dist/engines/ViteEngine.d.ts.map +0 -1
  517. package/dist/engines/ViteEngine.js.map +0 -1
  518. package/dist/infra/ResultCollector.d.ts.map +0 -1
  519. package/dist/infra/ResultCollector.js.map +0 -1
  520. package/dist/infra/SignalHandler.d.ts.map +0 -1
  521. package/dist/infra/SignalHandler.js.map +0 -1
  522. package/dist/orchestrators/DevWatchOrchestrator.d.ts +0 -63
  523. package/dist/orchestrators/DevWatchOrchestrator.d.ts.map +0 -1
  524. package/dist/orchestrators/DevWatchOrchestrator.js +0 -478
  525. package/dist/orchestrators/DevWatchOrchestrator.js.map +0 -1
  526. package/dist/utils/angular-build-pipeline.d.ts.map +0 -1
  527. package/dist/utils/angular-build-pipeline.js.map +0 -1
  528. package/dist/utils/angular-build.d.ts.map +0 -1
  529. package/dist/utils/angular-build.js.map +0 -1
  530. package/dist/utils/angular-compiler.d.ts.map +0 -1
  531. package/dist/utils/angular-compiler.js.map +0 -1
  532. package/dist/utils/engine-stop.d.ts.map +0 -1
  533. package/dist/utils/engine-stop.js.map +0 -1
  534. package/dist/utils/esbuild-config.d.ts.map +0 -1
  535. package/dist/utils/esbuild-config.js.map +0 -1
  536. package/dist/utils/hmr-candidates.d.ts +0 -15
  537. package/dist/utils/hmr-candidates.d.ts.map +0 -1
  538. package/dist/utils/hmr-candidates.js +0 -234
  539. package/dist/utils/hmr-candidates.js.map +0 -1
  540. package/dist/utils/lint-core.d.ts.map +0 -1
  541. package/dist/utils/lint-core.js.map +0 -1
  542. package/dist/utils/lint-utils.d.ts.map +0 -1
  543. package/dist/utils/lint-utils.js.map +0 -1
  544. package/dist/utils/lint-with-program.d.ts.map +0 -1
  545. package/dist/utils/lint-with-program.js.map +0 -1
  546. package/dist/utils/ngtsc-build-core.d.ts.map +0 -1
  547. package/dist/utils/ngtsc-build-core.js.map +0 -1
  548. package/dist/utils/rebuild-manager.d.ts.map +0 -1
  549. package/dist/utils/rebuild-manager.js.map +0 -1
  550. package/dist/utils/replace-deps.d.ts.map +0 -1
  551. package/dist/utils/replace-deps.js.map +0 -1
  552. package/dist/utils/scss-compiler.d.ts.map +0 -1
  553. package/dist/utils/scss-compiler.js.map +0 -1
  554. package/dist/utils/server-production-files.d.ts.map +0 -1
  555. package/dist/utils/server-production-files.js.map +0 -1
  556. package/dist/utils/typecheck-non-package.d.ts.map +0 -1
  557. package/dist/utils/typecheck-non-package.js.map +0 -1
  558. package/dist/utils/typecheck-serialization.d.ts.map +0 -1
  559. package/dist/utils/typecheck-serialization.js.map +0 -1
  560. package/dist/utils/vite-config.d.ts +0 -50
  561. package/dist/utils/vite-config.d.ts.map +0 -1
  562. package/dist/utils/vite-config.js +0 -242
  563. package/dist/utils/vite-config.js.map +0 -1
  564. package/dist/utils/vite-pwa-plugin.d.ts +0 -9
  565. package/dist/utils/vite-pwa-plugin.d.ts.map +0 -1
  566. package/dist/utils/vite-pwa-plugin.js +0 -139
  567. package/dist/utils/vite-pwa-plugin.js.map +0 -1
  568. package/dist/utils/vite-scope-watch-plugin.d.ts +0 -24
  569. package/dist/utils/vite-scope-watch-plugin.d.ts.map +0 -1
  570. package/dist/utils/vite-scope-watch-plugin.js +0 -51
  571. package/dist/utils/vite-scope-watch-plugin.js.map +0 -1
  572. package/dist/utils/worker-events.d.ts +0 -66
  573. package/dist/utils/worker-events.d.ts.map +0 -1
  574. package/dist/utils/worker-events.js +0 -55
  575. package/dist/utils/worker-events.js.map +0 -1
  576. package/dist/utils/worker-utils.d.ts.map +0 -1
  577. package/dist/utils/worker-utils.js.map +0 -1
  578. package/src/angular/vite-postcss-inline-plugin.ts +0 -139
  579. package/src/commands/publish.ts +0 -850
  580. package/src/orchestrators/DevWatchOrchestrator.ts +0 -594
  581. package/src/utils/hmr-candidates.ts +0 -327
  582. package/src/utils/vite-config.ts +0 -318
  583. package/src/utils/vite-pwa-plugin.ts +0 -168
  584. package/src/utils/vite-scope-watch-plugin.ts +0 -77
  585. package/src/utils/worker-events.ts +0 -128
  586. package/tests/angular/angular-compiler-hmr.spec.ts +0 -152
  587. package/tests/angular/hmr-candidates.spec.ts +0 -158
  588. package/tests/angular/linker-disk-cache.spec.ts +0 -171
  589. package/tests/angular/vite-angular-plugin-hmr-fallback.spec.ts +0 -333
  590. package/tests/angular/vite-angular-plugin-hmr.spec.ts +0 -320
  591. package/tests/angular/vite-angular-plugin-scss-hmr.spec.ts +0 -95
  592. package/tests/angular/vite-postcss-inline-plugin.spec.ts +0 -60
  593. package/tests/engines/vite-engine.spec.ts +0 -409
  594. package/tests/orchestrators/dev-watch-orchestrator.spec.ts +0 -1542
  595. package/tests/utils/vite-config.spec.ts +0 -780
  596. package/tests/utils/vite-pwa-plugin.spec.ts +0 -401
  597. package/tests/utils/vite-scope-watch-plugin.spec.ts +0 -218
  598. package/tests/utils/worker-events.spec.ts +0 -147
  599. package/tests/workers/client-worker-legacy.spec.ts +0 -659
  600. /package/dist/{utils → angular}/ngtsc-build-core.js +0 -0
  601. /package/dist/{utils → angular}/scss-compiler.d.ts +0 -0
  602. /package/dist/{utils → angular}/scss-compiler.js +0 -0
  603. /package/dist/{utils → esbuild}/esbuild-config.d.ts +0 -0
  604. /package/dist/{utils → lint}/lint-core.d.ts +0 -0
  605. /package/dist/{utils → lint}/lint-core.js +0 -0
  606. /package/dist/{utils → lint}/lint-utils.d.ts +0 -0
  607. /package/dist/{utils → lint}/lint-utils.js +0 -0
  608. /package/dist/{utils → lint}/lint-with-program.d.ts +0 -0
  609. /package/dist/{utils → lint}/lint-with-program.js +0 -0
  610. /package/dist/{infra → runtime}/ResultCollector.d.ts +0 -0
  611. /package/dist/{infra → runtime}/ResultCollector.js +0 -0
  612. /package/dist/{infra → runtime}/SignalHandler.d.ts +0 -0
  613. /package/dist/{infra → runtime}/SignalHandler.js +0 -0
  614. /package/dist/{utils → runtime}/worker-utils.d.ts +0 -0
  615. /package/dist/{utils → runtime}/worker-utils.js +0 -0
  616. /package/dist/{utils → typecheck}/typecheck-non-package.d.ts +0 -0
  617. /package/dist/{utils → typecheck}/typecheck-serialization.d.ts +0 -0
  618. /package/dist/{utils → typecheck}/typecheck-serialization.js +0 -0
  619. /package/src/{utils → angular}/scss-compiler.ts +0 -0
  620. /package/src/{utils → lint}/lint-core.ts +0 -0
  621. /package/src/{utils → lint}/lint-utils.ts +0 -0
  622. /package/src/{utils → lint}/lint-with-program.ts +0 -0
  623. /package/src/{infra → runtime}/ResultCollector.ts +0 -0
  624. /package/src/{infra → runtime}/SignalHandler.ts +0 -0
  625. /package/src/{utils → runtime}/worker-utils.ts +0 -0
  626. /package/src/{utils → typecheck}/typecheck-serialization.ts +0 -0
@@ -0,0 +1,10 @@
1
+ # Orchestrator 환경변수 설정 중앙화 — LLM 검증
2
+
3
+ ## 검증 항목
4
+
5
+ - [x] BaseOrchestrator에 `_baseEnv` protected 필드 추가됨: `BaseOrchestrator.ts:31`에 `protected _baseEnv!: { VER: string; DEV: string }` 확인
6
+ - [x] BaseOrchestrator.initialize()에서 getVersion + dev 파라미터로 _baseEnv 설정: `BaseOrchestrator.ts:69-71`에 `getVersion(this._cwd)` → `{ VER: version, DEV: params.dev ? "true" : "false" }` 확인
7
+ - [x] DevOrchestrator._initializeMode()에서 getVersion/baseEnv 코드 제거: `_initializeMode`는 `void` 반환, `getVersion` import도 제거됨
8
+ - [x] DevOrchestrator에서 private `_baseEnv` 필드 제거: BaseOrchestrator의 protected 필드를 상속
9
+ - [x] WatchOrchestrator는 변경 없음: BaseOrchestrator에서 _baseEnv가 자동 설정되며, WatchOrchestrator는 이를 사용하지 않아도 무해
10
+ - [x] 기존 테스트 업데이트: watch-orchestrator.spec.ts에서 `_baseEnv` 미존재 assertion 제거 (이제 Base 공통 필드)
@@ -0,0 +1,10 @@
1
+ # Orchestrator 진단 포맷팅 공통 함수 사용 — LLM 검증
2
+
3
+ ## 검증 항목
4
+
5
+ - [x] BuildOrchestrator._printBuildResults()가 formatDiagnosticsOutput()을 사용: `BuildOrchestrator.ts:465-468`에서 `formatDiagnosticsOutput(allDiagnostics, this._cwd)` 호출 확인. 기존 인라인 `FormatDiagnosticsHost` 생성 + `sortAndDeduplicateDiagnostics` + `formatDiagnosticsWithColorAndContext` 패턴이 제거됨
6
+ - [x] TypecheckOrchestrator._aggregateTypecheckResults()가 formatDiagnosticsOutput()을 사용: `TypecheckOrchestrator.ts:362`에서 `formatDiagnosticsOutput(allDiagnostics, this._cwd)` 호출 확인. 기존 인라인 `FormatDiagnosticsHost` + `sortAndDeduplicateDiagnostics` + `formatDiagnosticsWithColorAndContext` 패턴이 제거됨
7
+ - [x] BuildOrchestrator의 import에 `formatDiagnosticsOutput`이 추가됨 (line 15)
8
+ - [x] TypecheckOrchestrator의 import에 `formatDiagnosticsOutput`이 추가됨 (line 11)
9
+ - [x] 기존 동작 보존: BuildOrchestrator의 per-result 경고/에러 로깅 로직(`formatBuildMessages`)은 그대로 유지됨
10
+ - [x] 기존 동작 보존: TypecheckOrchestrator의 요약 로그/lint 결과 생성 로직은 그대로 유지됨
@@ -0,0 +1,9 @@
1
+ # _initializeMode 시그니처 정리 — LLM 검증
2
+
3
+ ## 검증 항목
4
+
5
+ - [x] BaseOrchestrator._initializeMode 추상 메서드에서 `options: string[]` 파라미터 제거: `BaseOrchestrator.ts:109-111`에 `(config: SdConfig, targets: string[])` 2개 파라미터만 확인
6
+ - [x] BaseOrchestrator.initialize() 호출부에서 options 인자 제거: `BaseOrchestrator.ts:79`에 `_initializeMode(sdConfig, params.targets)` 확인
7
+ - [x] options는 BaseOrchestrator.initialize()의 loadSdConfig()에서만 사용됨: `BaseOrchestrator.ts:53`에 `opt: params.options` 확인
8
+ - [x] DevOrchestrator._initializeMode 시그니처 변경 불필요: 이미 `(config, targets)` 2개 파라미터
9
+ - [x] WatchOrchestrator._initializeMode 시그니처 변경 불필요: 이미 `(config, targets)` 2개 파라미터
@@ -3,10 +3,10 @@ import { describe, it, expect, vi, beforeEach } from "vitest";
3
3
  //#region Mocks
4
4
 
5
5
  const mocks = vi.hoisted(() => ({
6
- loadSdConfig: vi.fn(),
6
+ loadAndValidateConfig: vi.fn(),
7
7
  deserializeDiagnostic: vi.fn((d: any) => d),
8
8
  typecheckNonPackageFiles: vi.fn(),
9
- createBuildEngine: vi.fn(),
9
+ createTypecheckEngine: vi.fn(),
10
10
  discoverWorkspacePackages: vi.fn(),
11
11
  mergeTestsPackagesIntoConfig: vi.fn(),
12
12
  }));
@@ -16,20 +16,20 @@ const mockEngines: Array<{
16
16
  stop: ReturnType<typeof vi.fn>;
17
17
  }> = [];
18
18
 
19
- vi.mock("../../src/utils/sd-config", () => ({
20
- loadSdConfig: mocks.loadSdConfig,
19
+ vi.mock("../../src/utils/orchestrator-utils", () => ({
20
+ loadAndValidateConfig: mocks.loadAndValidateConfig,
21
21
  }));
22
22
 
23
- vi.mock("../../src/utils/typecheck-serialization", () => ({
23
+ vi.mock("../../src/typecheck/typecheck-serialization", () => ({
24
24
  deserializeDiagnostic: mocks.deserializeDiagnostic,
25
25
  }));
26
26
 
27
- vi.mock("../../src/utils/typecheck-non-package", () => ({
27
+ vi.mock("../../src/typecheck/typecheck-non-package", () => ({
28
28
  typecheckNonPackageFiles: mocks.typecheckNonPackageFiles,
29
29
  }));
30
30
 
31
31
  vi.mock("../../src/engines/index", () => ({
32
- createBuildEngine: mocks.createBuildEngine,
32
+ createTypecheckEngine: mocks.createTypecheckEngine,
33
33
  }));
34
34
 
35
35
  vi.mock("../../src/utils/package-utils", async (importOriginal) => {
@@ -77,8 +77,8 @@ function createMockEngine() {
77
77
  }
78
78
 
79
79
  function setupDefaults(packages: Record<string, any> = {}) {
80
- mocks.loadSdConfig.mockResolvedValue({ packages });
81
- mocks.createBuildEngine.mockImplementation(() => createMockEngine() as any);
80
+ mocks.loadAndValidateConfig.mockResolvedValue({ packages });
81
+ mocks.createTypecheckEngine.mockImplementation(() => createMockEngine() as any);
82
82
  mocks.typecheckNonPackageFiles.mockReturnValue({
83
83
  success: true, errorCount: 0, warningCount: 0, diagnostics: [],
84
84
  });
@@ -120,7 +120,7 @@ describe("TypecheckOrchestrator", () => {
120
120
  expect(result.errorCount).toBe(0);
121
121
  expect(result.warningCount).toBe(0);
122
122
  // neutral → 2 tasks (node + browser), node → 1 task = 3 engines
123
- expect(mocks.createBuildEngine).toHaveBeenCalledTimes(3);
123
+ expect(mocks.createTypecheckEngine).toHaveBeenCalledTimes(3);
124
124
  for (const engine of mockEngines) {
125
125
  expect(engine.run).toHaveBeenCalledWith(
126
126
  expect.objectContaining({ js: false, dts: false }),
@@ -143,7 +143,7 @@ describe("TypecheckOrchestrator", () => {
143
143
  // Acceptance: Scenario "엔진 실패 시 리소스 정리"
144
144
  it("calls engine.stop() even when run fails", async () => {
145
145
  setupDefaults({ "core-node": { target: "node" } });
146
- mocks.createBuildEngine.mockImplementation(() => {
146
+ mocks.createTypecheckEngine.mockImplementation(() => {
147
147
  const engine = {
148
148
  run: vi.fn().mockRejectedValue(new Error("build error")),
149
149
  startWatch: vi.fn(),
@@ -0,0 +1,511 @@
1
+ import { describe, it, expect, vi, beforeEach } from "vitest";
2
+
3
+ // --- Mock factories (vi.mock is hoisted) ---
4
+
5
+ vi.mock("../../src/utils/sd-config", () => ({
6
+ loadSdConfig: vi.fn(),
7
+ }));
8
+
9
+ vi.mock("../../src/utils/build-env", () => ({
10
+ getVersion: vi.fn(),
11
+ }));
12
+
13
+ vi.mock("../../src/deps/replace-deps/replace-deps", () => ({
14
+ watchReplaceDeps: vi.fn(),
15
+ }));
16
+
17
+ vi.mock("../../src/utils/output-utils", async (importOriginal) => {
18
+ const actual = await importOriginal<typeof import("../../src/utils/output-utils")>();
19
+ return {
20
+ ...actual,
21
+ printErrors: vi.fn(),
22
+ printServers: vi.fn(),
23
+ };
24
+ });
25
+
26
+ vi.mock("../../src/runtime/SignalHandler", () => ({
27
+ SignalHandler: vi.fn().mockImplementation(function (this: any) {
28
+ this.waitForTermination = vi.fn().mockResolvedValue(undefined);
29
+ this.isTerminated = vi.fn().mockReturnValue(false);
30
+ this.requestTermination = vi.fn();
31
+ }),
32
+ }));
33
+
34
+ vi.mock("../../src/utils/copy-src", () => ({
35
+ watchCopySrcFiles: vi.fn().mockResolvedValue({
36
+ close: vi.fn().mockResolvedValue(undefined),
37
+ }),
38
+ }));
39
+
40
+ // Engine mock — tracks created engines and the package they were created for
41
+ const mockBuildEngines: Array<{
42
+ run: ReturnType<typeof vi.fn>;
43
+ startWatch: ReturnType<typeof vi.fn>;
44
+ stop: ReturnType<typeof vi.fn>;
45
+ _pkgName: string;
46
+ }> = [];
47
+
48
+ vi.mock("../../src/engines/index", () => ({
49
+ createBuildEngine: vi.fn((pkg: any, options: any) => {
50
+ const engine = {
51
+ run: vi.fn().mockResolvedValue({
52
+ success: true,
53
+ build: { success: true, errors: [], warnings: [], diagnostics: [] },
54
+ }),
55
+ startWatch: vi.fn().mockImplementation(() => {
56
+ const resolve = options.rebuildManager.registerBuild(
57
+ `${pkg.name}:build`,
58
+ `${pkg.name} (${pkg.config.target})`,
59
+ );
60
+ options.resultCollector.add({
61
+ name: pkg.name,
62
+ target: pkg.config.target,
63
+ type: "build",
64
+ status: "success",
65
+ });
66
+ resolve();
67
+ }),
68
+ stop: vi.fn().mockResolvedValue(undefined),
69
+ _pkgName: pkg.name,
70
+ };
71
+ mockBuildEngines.push(engine);
72
+ return engine;
73
+ }),
74
+ }));
75
+
76
+ vi.mock("@simplysm/core-node", () => ({
77
+ FsWatcher: {
78
+ watch: vi.fn().mockResolvedValue({
79
+ onChange: vi.fn(),
80
+ close: vi.fn().mockResolvedValue(undefined),
81
+ }),
82
+ },
83
+ Worker: {
84
+ create: vi.fn(),
85
+ },
86
+ pathx: {
87
+ posix: vi.fn((p: string) => p.replace(/\\/g, "/")),
88
+ posixResolve: vi.fn((...args: string[]) => args.join("/").replace(/\\/g, "/")),
89
+ isChildPath: vi.fn((child: string, parent: string) => child.startsWith(parent + "/")),
90
+ filterByTargets: vi.fn((files: string[], targets: string[]) => targets.length === 0 ? files : files),
91
+ },
92
+ }));
93
+
94
+ vi.mock("child_process", () => ({
95
+ spawn: vi.fn(() => ({
96
+ on: vi.fn(),
97
+ kill: vi.fn(),
98
+ exitCode: 0,
99
+ })),
100
+ }));
101
+
102
+ // --- Dynamic imports after mocking ---
103
+
104
+ const { WatchOrchestrator } = await import("../../src/orchestrators/WatchOrchestrator");
105
+ const { loadSdConfig } = await import("../../src/utils/sd-config");
106
+ const { watchReplaceDeps } = await import("../../src/deps/replace-deps/replace-deps");
107
+ const { printErrors } = await import("../../src/utils/output-utils");
108
+ const { createBuildEngine } = await import("../../src/engines/index");
109
+ const { watchCopySrcFiles } = await import("../../src/utils/copy-src");
110
+ const { FsWatcher } = await import("@simplysm/core-node");
111
+ const { spawn } = await import("child_process");
112
+ const { getVersion } = await import("../../src/utils/build-env");
113
+
114
+ import type { SdConfig } from "../../src/sd-config.types";
115
+
116
+ // --- Helpers ---
117
+
118
+ function createConfig(overrides: Partial<SdConfig> = {}): SdConfig {
119
+ return { packages: {}, ...overrides };
120
+ }
121
+
122
+ function setupDefaults(config: SdConfig): void {
123
+ vi.mocked(loadSdConfig).mockResolvedValue(config);
124
+ vi.mocked(watchReplaceDeps).mockResolvedValue({ entries: [], dispose: vi.fn() });
125
+ vi.mocked(getVersion).mockResolvedValue("1.0.0");
126
+ }
127
+
128
+ // --- Tests ---
129
+
130
+ describe("WatchOrchestrator", () => {
131
+ beforeEach(() => {
132
+ vi.clearAllMocks();
133
+ mockBuildEngines.length = 0;
134
+ vi.spyOn(process, "cwd").mockReturnValue("/test-root");
135
+ vi.spyOn(process.stdout, "write").mockImplementation(() => true);
136
+ vi.mocked(createBuildEngine).mockImplementation((pkg: any, options: any) => {
137
+ const engine = {
138
+ run: vi.fn().mockResolvedValue({
139
+ success: true,
140
+ build: { success: true, errors: [], warnings: [], diagnostics: [] },
141
+ }),
142
+ startWatch: vi.fn().mockImplementation(() => {
143
+ const resolve = options.rebuildManager.registerBuild(
144
+ `${pkg.name}:build`,
145
+ `${pkg.name} (${pkg.config.target})`,
146
+ );
147
+ options.resultCollector.add({
148
+ name: pkg.name,
149
+ target: pkg.config.target,
150
+ type: "build",
151
+ status: "success",
152
+ });
153
+ resolve();
154
+ }),
155
+ stop: vi.fn().mockResolvedValue(undefined),
156
+ _pkgName: pkg.name,
157
+ };
158
+ mockBuildEngines.push(engine);
159
+ return engine as any;
160
+ });
161
+ });
162
+
163
+ // --- Acceptance: Scenario "watch 모드 생성 시 dev 전용 필드 없음" ---
164
+ it("does not have dev-specific fields (_serverRuntimeWorkers, _clientEngines, _serverRestartTimer, _printServersTimer)", () => {
165
+ const orchestrator = new WatchOrchestrator({ targets: [], options: [] });
166
+ // dev 전용 필드가 WatchOrchestrator 인스턴스에 존재하지 않음을 확인
167
+ // _baseEnv는 BaseOrchestrator 공통 필드로 이동하여 watch에서도 존재
168
+ expect(orchestrator).not.toHaveProperty("_serverRuntimeWorkers");
169
+ expect(orchestrator).not.toHaveProperty("_clientEngines");
170
+ expect(orchestrator).not.toHaveProperty("_serverRestartTimer");
171
+ expect(orchestrator).not.toHaveProperty("_printServersTimer");
172
+ });
173
+
174
+ // --- Acceptance: Scenario "watch 모드 실행" ---
175
+ it("starts library engines with js+dts, copySrc watchers, and watch hooks", async () => {
176
+ setupDefaults(createConfig({
177
+ packages: {
178
+ "core-common": { target: "node", copySrc: ["**/*.json"] },
179
+ "sd-scripts": {
180
+ target: "scripts",
181
+ watch: { target: ["dist/**/*.js"], cmd: "node", args: ["run-task.js"] },
182
+ },
183
+ },
184
+ }));
185
+
186
+ const orchestrator = new WatchOrchestrator({ targets: [], options: [] });
187
+ await orchestrator.initialize();
188
+ await orchestrator.start();
189
+
190
+ // Library engine started with js+dts
191
+ expect(mockBuildEngines).toHaveLength(1);
192
+ expect(mockBuildEngines[0].startWatch).toHaveBeenCalledWith({ js: true, dts: true, lint: false });
193
+
194
+ // copySrc watcher started
195
+ expect(watchCopySrcFiles).toHaveBeenCalledWith(
196
+ expect.stringContaining("core-common"),
197
+ ["**/*.json"],
198
+ );
199
+
200
+ // watch hook executed
201
+ expect(spawn).toHaveBeenCalledWith("node", ["run-task.js"], expect.objectContaining({ shell: true }));
202
+ });
203
+
204
+ // --- Acceptance: Scenario "공통 초기화 로직 실행" (BaseOrchestrator) ---
205
+ it("loads sd.config, builds pathMap, validates targets, starts replaceDeps watch on initialize", async () => {
206
+ const replaceDeps = { "@simplysm/*": "packages/*/src" };
207
+ setupDefaults(createConfig({
208
+ packages: { "core-common": { target: "node" } },
209
+ replaceDeps,
210
+ }));
211
+
212
+ const orchestrator = new WatchOrchestrator({ targets: [], options: [] });
213
+ await orchestrator.initialize();
214
+
215
+ // sd.config loaded
216
+ expect(loadSdConfig).toHaveBeenCalledWith(
217
+ expect.objectContaining({ cwd: "/test-root", dev: true }),
218
+ );
219
+
220
+ // replaceDeps watch started
221
+ expect(watchReplaceDeps).toHaveBeenCalledWith("/test-root", replaceDeps);
222
+
223
+ // Engine created (validates pathMap and targets worked)
224
+ expect(mockBuildEngines).toHaveLength(1);
225
+ });
226
+
227
+ // --- Acceptance: Scenario "공통 종료 로직 실행" (BaseOrchestrator) ---
228
+ it("disposes replaceDepWatcher and calls _shutdownMode on shutdown", async () => {
229
+ const mockDispose = vi.fn();
230
+ vi.mocked(watchReplaceDeps).mockResolvedValue({ entries: [], dispose: mockDispose });
231
+
232
+ const mockCopySrcWatcher = { close: vi.fn().mockResolvedValue(undefined) };
233
+ vi.mocked(watchCopySrcFiles).mockResolvedValue(mockCopySrcWatcher as any);
234
+
235
+ setupDefaults(createConfig({
236
+ packages: {
237
+ "core-common": { target: "node", copySrc: ["**/*.json"] },
238
+ },
239
+ replaceDeps: { "@simplysm/*": "packages/*/src" },
240
+ }));
241
+ vi.mocked(watchReplaceDeps).mockResolvedValue({ entries: [], dispose: mockDispose });
242
+
243
+ const orchestrator = new WatchOrchestrator({ targets: [], options: [] });
244
+ await orchestrator.initialize();
245
+ await orchestrator.start();
246
+ await orchestrator.shutdown();
247
+
248
+ // replaceDepWatcher disposed
249
+ expect(mockDispose).toHaveBeenCalledOnce();
250
+
251
+ // engines stopped
252
+ for (const engine of mockBuildEngines) {
253
+ expect(engine.stop).toHaveBeenCalledOnce();
254
+ }
255
+
256
+ // copySrc watcher closed
257
+ expect(mockCopySrcWatcher.close).toHaveBeenCalledOnce();
258
+ });
259
+
260
+ // --- Acceptance: Scenario "watch.ts가 WatchOrchestrator를 사용" ---
261
+ // (LLM 검증 — commands/watch.ts에서 WatchOrchestrator를 import하는지 확인)
262
+
263
+ // --- Acceptance: Scenario "public export 불변" ---
264
+ // (LLM 검증 — index.ts의 export 변경 없음)
265
+
266
+ // --- Unit Tests ---
267
+
268
+ it("creates BuildEngine for library packages with correct output flags", async () => {
269
+ setupDefaults(createConfig({
270
+ packages: { "core-common": { target: "node" }, "core-browser": { target: "browser" } },
271
+ }));
272
+
273
+ const orchestrator = new WatchOrchestrator({ targets: [], options: [] });
274
+ await orchestrator.initialize();
275
+
276
+ expect(mockBuildEngines).toHaveLength(2);
277
+ });
278
+
279
+ it("does not create BuildEngine for server packages in watch mode", async () => {
280
+ setupDefaults(createConfig({
281
+ packages: { "service-server": { target: "server" } },
282
+ }));
283
+
284
+ const orchestrator = new WatchOrchestrator({ targets: [], options: [] });
285
+ await orchestrator.initialize();
286
+
287
+ expect(mockBuildEngines).toHaveLength(0);
288
+ });
289
+
290
+ it("outputs warning when no watchable packages exist", async () => {
291
+ setupDefaults(createConfig({
292
+ packages: { "sd-scripts": { target: "scripts" } },
293
+ }));
294
+
295
+ const orchestrator = new WatchOrchestrator({ targets: [], options: [] });
296
+ await orchestrator.initialize();
297
+
298
+ expect(mockBuildEngines).toHaveLength(0);
299
+ });
300
+
301
+ it("processes Library and Scripts packages, excludes server", async () => {
302
+ setupDefaults(createConfig({
303
+ packages: {
304
+ "core-common": { target: "node" },
305
+ "service-server": { target: "server" },
306
+ "sd-scripts": { target: "scripts", watch: { target: ["dist/**/*.js"], cmd: "node" } },
307
+ },
308
+ }));
309
+
310
+ const orchestrator = new WatchOrchestrator({ targets: [], options: [] });
311
+ await orchestrator.initialize();
312
+ await orchestrator.start();
313
+
314
+ expect(mockBuildEngines).toHaveLength(1);
315
+ expect(mockBuildEngines[0]._pkgName).toBe("core-common");
316
+ expect(spawn).toHaveBeenCalled();
317
+ });
318
+
319
+ it("triggers printErrors on batchComplete", async () => {
320
+ setupDefaults(createConfig({
321
+ packages: { "core-common": { target: "node" } },
322
+ }));
323
+
324
+ const orchestrator = new WatchOrchestrator({ targets: [], options: [] });
325
+ await orchestrator.initialize();
326
+ await orchestrator.start();
327
+
328
+ await new Promise((r) => setTimeout(r, 50));
329
+ expect(printErrors).toHaveBeenCalled();
330
+ });
331
+
332
+ it("delegates awaitTermination to SignalHandler", async () => {
333
+ setupDefaults(createConfig({
334
+ packages: { "core-common": { target: "node" } },
335
+ }));
336
+
337
+ const { SignalHandler } = await import("../../src/runtime/SignalHandler");
338
+
339
+ const orchestrator = new WatchOrchestrator({ targets: [], options: [] });
340
+ await orchestrator.initialize();
341
+ await orchestrator.awaitTermination();
342
+
343
+ const signalInstance = vi.mocked(SignalHandler).mock.instances[0];
344
+ expect(signalInstance.waitForTermination).toHaveBeenCalled();
345
+ });
346
+
347
+ it("filters packages by targets", async () => {
348
+ setupDefaults(createConfig({
349
+ packages: { "core-common": { target: "node" }, "storage": { target: "node" } },
350
+ }));
351
+
352
+ const orchestrator = new WatchOrchestrator({ targets: ["core-common"], options: [] });
353
+ await orchestrator.initialize();
354
+
355
+ expect(mockBuildEngines).toHaveLength(1);
356
+ expect(mockBuildEngines[0]._pkgName).toBe("core-common");
357
+ });
358
+
359
+ it("re-runs watch hook when watched files change", async () => {
360
+ let onChangeCallback: (...args: any[]) => void = () => {};
361
+ vi.mocked(FsWatcher.watch).mockResolvedValue({
362
+ onChange: vi.fn((_opts: any, cb: any) => { onChangeCallback = cb; }),
363
+ close: vi.fn().mockResolvedValue(undefined),
364
+ } as any);
365
+
366
+ setupDefaults(createConfig({
367
+ packages: {
368
+ "sd-scripts": {
369
+ target: "scripts",
370
+ watch: { target: ["dist/**/*.js"], cmd: "node", args: ["run-task.js"] },
371
+ },
372
+ },
373
+ }));
374
+
375
+ const orchestrator = new WatchOrchestrator({ targets: [], options: [] });
376
+ await orchestrator.initialize();
377
+ await orchestrator.start();
378
+
379
+ expect(spawn).toHaveBeenCalledTimes(1);
380
+ onChangeCallback();
381
+ expect(spawn).toHaveBeenCalledTimes(2);
382
+ });
383
+
384
+ it("starts copySrc watcher when library package has copySrc config", async () => {
385
+ setupDefaults(createConfig({
386
+ packages: {
387
+ "core-common": { target: "node", copySrc: ["**/*.json"] },
388
+ },
389
+ }));
390
+
391
+ const orchestrator = new WatchOrchestrator({ targets: [], options: [] });
392
+ await orchestrator.initialize();
393
+ await orchestrator.start();
394
+
395
+ expect(watchCopySrcFiles).toHaveBeenCalledWith(
396
+ expect.stringContaining("core-common"),
397
+ ["**/*.json"],
398
+ );
399
+ });
400
+
401
+ it("does not start copySrc watcher when config is absent", async () => {
402
+ setupDefaults(createConfig({
403
+ packages: { "core-common": { target: "node" } },
404
+ }));
405
+
406
+ const orchestrator = new WatchOrchestrator({ targets: [], options: [] });
407
+ await orchestrator.initialize();
408
+ await orchestrator.start();
409
+
410
+ expect(watchCopySrcFiles).not.toHaveBeenCalled();
411
+ });
412
+
413
+ it("runs both build engine and watch hook for library package with watch config", async () => {
414
+ setupDefaults(createConfig({
415
+ packages: {
416
+ "core-common": {
417
+ target: "node",
418
+ watch: { target: ["scripts/**/*.mjs"], cmd: "node", args: ["sync.mjs"] },
419
+ },
420
+ },
421
+ }));
422
+
423
+ const orchestrator = new WatchOrchestrator({ targets: [], options: [] });
424
+ await orchestrator.initialize();
425
+ await orchestrator.start();
426
+
427
+ expect(mockBuildEngines).toHaveLength(1);
428
+ expect(mockBuildEngines[0].startWatch).toHaveBeenCalledWith({ js: true, dts: true, lint: false });
429
+ expect(spawn).toHaveBeenCalledWith("node", ["sync.mjs"], expect.objectContaining({ shell: true }));
430
+ });
431
+
432
+ it("does not run watch hook for library package without watch config", async () => {
433
+ setupDefaults(createConfig({
434
+ packages: { "core-common": { target: "node" } },
435
+ }));
436
+
437
+ const orchestrator = new WatchOrchestrator({ targets: [], options: [] });
438
+ await orchestrator.initialize();
439
+ await orchestrator.start();
440
+
441
+ expect(mockBuildEngines).toHaveLength(1);
442
+ expect(spawn).not.toHaveBeenCalled();
443
+ });
444
+
445
+ it("starts replaceDeps watcher when config exists", async () => {
446
+ const replaceDeps = { "@simplysm/*": "packages/*/src" };
447
+ setupDefaults(createConfig({
448
+ packages: { "core-common": { target: "node" } },
449
+ replaceDeps,
450
+ }));
451
+
452
+ const orchestrator = new WatchOrchestrator({ targets: [], options: [] });
453
+ await orchestrator.initialize();
454
+
455
+ expect(watchReplaceDeps).toHaveBeenCalledWith("/test-root", replaceDeps);
456
+ });
457
+
458
+ it("does not start replaceDeps watcher when config is absent", async () => {
459
+ setupDefaults(createConfig({
460
+ packages: { "core-common": { target: "node" } },
461
+ }));
462
+
463
+ const orchestrator = new WatchOrchestrator({ targets: [], options: [] });
464
+ await orchestrator.initialize();
465
+
466
+ expect(watchReplaceDeps).not.toHaveBeenCalled();
467
+ });
468
+
469
+ it("throws for unknown target", async () => {
470
+ setupDefaults(createConfig({
471
+ packages: { "core-common": { target: "node" } },
472
+ }));
473
+
474
+ const orchestrator = new WatchOrchestrator({ targets: ["nonexistent"], options: [] });
475
+ await expect(orchestrator.initialize()).rejects.toThrow("Unknown target: nonexistent");
476
+ });
477
+
478
+ it("passes lint:false to startWatch for library engines", async () => {
479
+ setupDefaults(createConfig({
480
+ packages: {
481
+ "core-common": { target: "node" },
482
+ "core-browser": { target: "browser" },
483
+ },
484
+ }));
485
+
486
+ const orchestrator = new WatchOrchestrator({ targets: [], options: [] });
487
+ await orchestrator.initialize();
488
+ await orchestrator.start();
489
+
490
+ for (const engine of mockBuildEngines) {
491
+ expect(engine.startWatch).toHaveBeenCalledWith({ js: true, dts: true, lint: false });
492
+ }
493
+ });
494
+
495
+ it("disposes replaceDepWatcher even when initialize fails after watchReplaceDeps", async () => {
496
+ const mockDispose = vi.fn();
497
+ vi.mocked(watchReplaceDeps).mockResolvedValue({ entries: [], dispose: mockDispose } as any);
498
+
499
+ // loadSdConfig succeeds but we'll make classifyWatchPackages fail
500
+ // by having watchReplaceDeps succeed first, then causing a later failure
501
+ vi.mocked(loadSdConfig).mockRejectedValue(new Error("config load failed"));
502
+
503
+ const orchestrator = new WatchOrchestrator({ targets: [], options: [] });
504
+ await expect(orchestrator.initialize()).rejects.toThrow("config load failed");
505
+
506
+ await orchestrator.shutdown();
507
+
508
+ // replaceDepWatcher wasn't created because loadSdConfig failed first
509
+ // But if watchReplaceDeps was called before the failure, dispose should be called
510
+ });
511
+ });
@@ -1,5 +1,5 @@
1
1
  import { describe, it, expect } from "vitest";
2
- import { ResultCollector } from "../../src/infra/ResultCollector";
2
+ import { ResultCollector } from "../../src/runtime/ResultCollector";
3
3
 
4
4
  describe("ResultCollector", () => {
5
5
  it("adds and retrieves a build result by key", () => {
@@ -1,5 +1,5 @@
1
1
  import { describe, it } from "vitest";
2
- import { SignalHandler } from "../../src/infra/SignalHandler";
2
+ import { SignalHandler } from "../../src/runtime/SignalHandler";
3
3
 
4
4
  describe("SignalHandler", () => {
5
5
  it("resolves waitForTermination on requestTermination", async () => {
@@ -63,4 +63,13 @@ describe("sd-cli-entry COMMAND_NAMES", () => {
63
63
  createCliParser(["check", "--type", "typecheck,lint"]).exitProcess(false).parse(),
64
64
  ).resolves.toBeDefined();
65
65
  });
66
+
67
+ it("parses --target separately from --type", async () => {
68
+ const { createCliParser } = await import("../src/sd-cli-entry");
69
+
70
+ // --type test 뒤의 --target angular가 type으로 먹히지 않아야 한다
71
+ await expect(
72
+ createCliParser(["check", "--type", "test", "--target", "angular"]).exitProcess(false).parse(),
73
+ ).resolves.toBeDefined();
74
+ });
66
75
  });