@simplysm/sd-cli 13.0.100 → 14.0.1

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 (409) hide show
  1. package/dist/commands/build.js +29 -19
  2. package/dist/commands/build.js.map +1 -6
  3. package/dist/commands/check.d.ts +1 -0
  4. package/dist/commands/check.d.ts.map +1 -1
  5. package/dist/commands/check.js +130 -115
  6. package/dist/commands/check.js.map +1 -6
  7. package/dist/commands/dev.d.ts +6 -7
  8. package/dist/commands/dev.d.ts.map +1 -1
  9. package/dist/commands/dev.js +24 -14
  10. package/dist/commands/dev.js.map +1 -6
  11. package/dist/commands/lint.d.ts +1 -1
  12. package/dist/commands/lint.js +158 -116
  13. package/dist/commands/lint.js.map +1 -6
  14. package/dist/commands/publish.d.ts.map +1 -1
  15. package/dist/commands/publish.js +637 -510
  16. package/dist/commands/publish.js.map +1 -6
  17. package/dist/commands/replace-deps.js +12 -12
  18. package/dist/commands/replace-deps.js.map +1 -6
  19. package/dist/commands/typecheck.d.ts +5 -30
  20. package/dist/commands/typecheck.d.ts.map +1 -1
  21. package/dist/commands/typecheck.js +144 -207
  22. package/dist/commands/typecheck.js.map +1 -6
  23. package/dist/commands/watch.d.ts +6 -4
  24. package/dist/commands/watch.d.ts.map +1 -1
  25. package/dist/commands/watch.js +25 -16
  26. package/dist/commands/watch.js.map +1 -6
  27. package/dist/engines/NgtscEngine.d.ts +47 -0
  28. package/dist/engines/NgtscEngine.d.ts.map +1 -0
  29. package/dist/engines/NgtscEngine.js +151 -0
  30. package/dist/engines/NgtscEngine.js.map +1 -0
  31. package/dist/engines/ServerEsbuildEngine.d.ts +47 -0
  32. package/dist/engines/ServerEsbuildEngine.d.ts.map +1 -0
  33. package/dist/engines/ServerEsbuildEngine.js +159 -0
  34. package/dist/engines/ServerEsbuildEngine.js.map +1 -0
  35. package/dist/engines/TscEngine.d.ts +47 -0
  36. package/dist/engines/TscEngine.d.ts.map +1 -0
  37. package/dist/engines/TscEngine.js +153 -0
  38. package/dist/engines/TscEngine.js.map +1 -0
  39. package/dist/engines/ViteEngine.d.ts +49 -0
  40. package/dist/engines/ViteEngine.d.ts.map +1 -0
  41. package/dist/engines/ViteEngine.js +161 -0
  42. package/dist/engines/ViteEngine.js.map +1 -0
  43. package/dist/engines/index.d.ts +26 -0
  44. package/dist/engines/index.d.ts.map +1 -0
  45. package/dist/engines/index.js +30 -0
  46. package/dist/engines/index.js.map +1 -0
  47. package/dist/engines/types.d.ts +77 -0
  48. package/dist/engines/types.d.ts.map +1 -0
  49. package/dist/engines/types.js +2 -0
  50. package/dist/engines/types.js.map +1 -0
  51. package/dist/index.d.ts +0 -1
  52. package/dist/index.d.ts.map +1 -1
  53. package/dist/index.js +2 -2
  54. package/dist/index.js.map +1 -6
  55. package/dist/infra/ResultCollector.d.ts +1 -1
  56. package/dist/infra/ResultCollector.d.ts.map +1 -1
  57. package/dist/infra/ResultCollector.js +30 -27
  58. package/dist/infra/ResultCollector.js.map +1 -6
  59. package/dist/infra/SignalHandler.js +45 -42
  60. package/dist/infra/SignalHandler.js.map +1 -6
  61. package/dist/infra/WorkerManager.js +56 -53
  62. package/dist/infra/WorkerManager.js.map +1 -6
  63. package/dist/orchestrators/BuildOrchestrator.d.ts +33 -1
  64. package/dist/orchestrators/BuildOrchestrator.d.ts.map +1 -1
  65. package/dist/orchestrators/BuildOrchestrator.js +314 -309
  66. package/dist/orchestrators/BuildOrchestrator.js.map +1 -6
  67. package/dist/orchestrators/DevWatchOrchestrator.d.ts +60 -0
  68. package/dist/orchestrators/DevWatchOrchestrator.d.ts.map +1 -0
  69. package/dist/orchestrators/DevWatchOrchestrator.js +465 -0
  70. package/dist/orchestrators/DevWatchOrchestrator.js.map +1 -0
  71. package/dist/sd-cli-entry.d.ts.map +1 -1
  72. package/dist/sd-cli-entry.js +190 -266
  73. package/dist/sd-cli-entry.js.map +1 -6
  74. package/dist/sd-cli.js +77 -49
  75. package/dist/sd-cli.js.map +1 -6
  76. package/dist/sd-config.types.d.ts +2 -0
  77. package/dist/sd-config.types.d.ts.map +1 -1
  78. package/dist/sd-config.types.js +2 -1
  79. package/dist/sd-config.types.js.map +1 -6
  80. package/dist/utils/angular-build.d.ts +77 -0
  81. package/dist/utils/angular-build.d.ts.map +1 -0
  82. package/dist/utils/angular-build.js +84 -0
  83. package/dist/utils/angular-build.js.map +1 -0
  84. package/dist/utils/build-env.js +9 -9
  85. package/dist/utils/build-env.js.map +1 -6
  86. package/dist/utils/concurrency.d.ts +15 -0
  87. package/dist/utils/concurrency.d.ts.map +1 -0
  88. package/dist/utils/concurrency.js +38 -0
  89. package/dist/utils/concurrency.js.map +1 -0
  90. package/dist/utils/copy-public.js +104 -87
  91. package/dist/utils/copy-public.js.map +1 -6
  92. package/dist/utils/copy-src.js +49 -35
  93. package/dist/utils/copy-src.js.map +1 -6
  94. package/dist/utils/esbuild-config.d.ts +0 -29
  95. package/dist/utils/esbuild-config.d.ts.map +1 -1
  96. package/dist/utils/esbuild-config.js +151 -218
  97. package/dist/utils/esbuild-config.js.map +1 -6
  98. package/dist/utils/ngtsc-build-core.d.ts +49 -0
  99. package/dist/utils/ngtsc-build-core.d.ts.map +1 -0
  100. package/dist/utils/ngtsc-build-core.js +250 -0
  101. package/dist/utils/ngtsc-build-core.js.map +1 -0
  102. package/dist/utils/output-path-rewriter.d.ts +23 -0
  103. package/dist/utils/output-path-rewriter.d.ts.map +1 -0
  104. package/dist/utils/output-path-rewriter.js +74 -0
  105. package/dist/utils/output-path-rewriter.js.map +1 -0
  106. package/dist/utils/output-utils.js +55 -40
  107. package/dist/utils/output-utils.js.map +1 -6
  108. package/dist/utils/package-utils.d.ts +8 -0
  109. package/dist/utils/package-utils.d.ts.map +1 -1
  110. package/dist/utils/package-utils.js +103 -73
  111. package/dist/utils/package-utils.js.map +1 -6
  112. package/dist/utils/rebuild-manager.js +41 -44
  113. package/dist/utils/rebuild-manager.js.map +1 -6
  114. package/dist/utils/replace-deps.js +283 -184
  115. package/dist/utils/replace-deps.js.map +1 -6
  116. package/dist/utils/scss-compiler.d.ts +10 -0
  117. package/dist/utils/scss-compiler.d.ts.map +1 -0
  118. package/dist/utils/scss-compiler.js +36 -0
  119. package/dist/utils/scss-compiler.js.map +1 -0
  120. package/dist/utils/sd-config.js +29 -19
  121. package/dist/utils/sd-config.js.map +1 -6
  122. package/dist/utils/tsc-build.d.ts +36 -0
  123. package/dist/utils/tsc-build.d.ts.map +1 -0
  124. package/dist/utils/tsc-build.js +130 -0
  125. package/dist/utils/tsc-build.js.map +1 -0
  126. package/dist/utils/tsconfig.d.ts +7 -26
  127. package/dist/utils/tsconfig.d.ts.map +1 -1
  128. package/dist/utils/tsconfig.js +39 -64
  129. package/dist/utils/tsconfig.js.map +1 -6
  130. package/dist/utils/typecheck-non-package.d.ts +18 -0
  131. package/dist/utils/typecheck-non-package.d.ts.map +1 -0
  132. package/dist/utils/typecheck-non-package.js +64 -0
  133. package/dist/utils/typecheck-non-package.js.map +1 -0
  134. package/dist/utils/typecheck-serialization.js +58 -40
  135. package/dist/utils/typecheck-serialization.js.map +1 -6
  136. package/dist/utils/worker-events.js +48 -40
  137. package/dist/utils/worker-events.js.map +1 -6
  138. package/dist/utils/worker-utils.js +48 -28
  139. package/dist/utils/worker-utils.js.map +1 -6
  140. package/dist/vitest-plugin.d.ts +9 -0
  141. package/dist/vitest-plugin.d.ts.map +1 -0
  142. package/dist/vitest-plugin.js +85 -0
  143. package/dist/vitest-plugin.js.map +1 -0
  144. package/dist/workers/library-build.worker.d.ts +54 -0
  145. package/dist/workers/library-build.worker.d.ts.map +1 -0
  146. package/dist/workers/library-build.worker.js +97 -0
  147. package/dist/workers/library-build.worker.js.map +1 -0
  148. package/dist/workers/lint.worker.js +9 -6
  149. package/dist/workers/lint.worker.js.map +1 -6
  150. package/dist/workers/ngtsc-build.worker.d.ts +23 -0
  151. package/dist/workers/ngtsc-build.worker.d.ts.map +1 -0
  152. package/dist/workers/ngtsc-build.worker.js +98 -0
  153. package/dist/workers/ngtsc-build.worker.js.map +1 -0
  154. package/dist/workers/{server.worker.d.ts → server-build.worker.d.ts} +39 -29
  155. package/dist/workers/server-build.worker.d.ts.map +1 -0
  156. package/dist/workers/server-build.worker.js +399 -0
  157. package/dist/workers/server-build.worker.js.map +1 -0
  158. package/dist/workers/server-runtime.worker.d.ts +3 -2
  159. package/dist/workers/server-runtime.worker.d.ts.map +1 -1
  160. package/dist/workers/server-runtime.worker.js +100 -95
  161. package/dist/workers/server-runtime.worker.js.map +1 -6
  162. package/dist/workers/vite-build.worker.d.ts +56 -0
  163. package/dist/workers/vite-build.worker.d.ts.map +1 -0
  164. package/dist/workers/vite-build.worker.js +167 -0
  165. package/dist/workers/vite-build.worker.js.map +1 -0
  166. package/package.json +10 -16
  167. package/src/commands/check.ts +21 -3
  168. package/src/commands/dev.ts +10 -8
  169. package/src/commands/lint.ts +1 -1
  170. package/src/commands/publish.ts +4 -0
  171. package/src/commands/typecheck.ts +89 -256
  172. package/src/commands/watch.ts +9 -8
  173. package/src/engines/NgtscEngine.ts +190 -0
  174. package/src/engines/ServerEsbuildEngine.ts +195 -0
  175. package/src/engines/TscEngine.ts +189 -0
  176. package/src/engines/ViteEngine.ts +203 -0
  177. package/src/engines/index.ts +49 -0
  178. package/src/engines/types.ts +79 -0
  179. package/src/index.ts +0 -3
  180. package/src/infra/ResultCollector.ts +1 -1
  181. package/src/orchestrators/BuildOrchestrator.ts +87 -157
  182. package/src/orchestrators/DevWatchOrchestrator.ts +573 -0
  183. package/src/sd-cli-entry.ts +13 -116
  184. package/src/sd-config.types.ts +2 -0
  185. package/src/utils/angular-build.ts +157 -0
  186. package/src/utils/concurrency.ts +43 -0
  187. package/src/utils/esbuild-config.ts +1 -122
  188. package/src/utils/ngtsc-build-core.ts +379 -0
  189. package/src/utils/output-path-rewriter.ts +82 -0
  190. package/src/utils/package-utils.ts +20 -0
  191. package/src/utils/scss-compiler.ts +58 -0
  192. package/src/utils/tsc-build.ts +175 -0
  193. package/src/utils/tsconfig.ts +27 -95
  194. package/src/utils/typecheck-non-package.ts +87 -0
  195. package/src/vitest-plugin.ts +118 -0
  196. package/src/workers/library-build.worker.ts +153 -0
  197. package/src/workers/ngtsc-build.worker.ts +146 -0
  198. package/src/workers/server-build.worker.ts +565 -0
  199. package/src/workers/server-runtime.worker.ts +17 -26
  200. package/src/workers/vite-build.worker.ts +252 -0
  201. package/tests/commands/check.spec.ts +276 -0
  202. package/tests/commands/dev.spec.ts +53 -0
  203. package/tests/commands/lint.spec.ts +243 -0
  204. package/tests/commands/publish.spec.ts +1159 -0
  205. package/tests/commands/typecheck.spec.ts +294 -0
  206. package/tests/commands/watch.spec.ts +53 -0
  207. package/tests/engines/engine-selection.spec.ts +247 -0
  208. package/tests/engines/ngtsc-engine.spec.ts +274 -0
  209. package/tests/engines/server-esbuild-engine.spec.ts +256 -0
  210. package/tests/engines/tsc-engine.spec.ts +213 -0
  211. package/tests/engines/vite-engine.spec.ts +358 -0
  212. package/tests/infra/result-collector.spec.ts +46 -0
  213. package/tests/infra/signal-handler.spec.ts +32 -0
  214. package/tests/infra/worker-manager.spec.ts +63 -0
  215. package/tests/orchestrators/build-orchestrator.spec.ts +772 -0
  216. package/tests/orchestrators/dev-watch-orchestrator.spec.ts +1173 -0
  217. package/tests/sd-cli-entry.spec.ts +49 -0
  218. package/tests/utils/angular-build.spec.ts +251 -0
  219. package/tests/utils/build-env.spec.ts +33 -0
  220. package/tests/utils/concurrency.spec.ts +65 -0
  221. package/tests/utils/copy-src.spec.ts +144 -0
  222. package/tests/utils/esbuild-config.spec.ts +186 -0
  223. package/tests/utils/external-modules.spec.ts +161 -0
  224. package/tests/utils/ngtsc-scss-refactor.spec.ts +66 -0
  225. package/tests/utils/output-path-rewriter.spec.ts +165 -0
  226. package/tests/utils/output-utils.spec.ts +104 -0
  227. package/tests/utils/package-utils.spec.ts +52 -0
  228. package/tests/utils/rebuild-manager.spec.ts +30 -27
  229. package/tests/utils/replace-deps.spec.ts +69 -0
  230. package/tests/utils/scss-compiler.spec.ts +131 -0
  231. package/tests/utils/sd-config.spec.ts +77 -0
  232. package/tests/utils/tsc-build.spec.ts +358 -0
  233. package/tests/utils/tsconfig-angular.spec.ts +71 -0
  234. package/tests/utils/typecheck-non-package.spec.ts +120 -0
  235. package/tests/utils/worker-events.spec.ts +155 -0
  236. package/tests/utils/worker-utils.spec.ts +43 -0
  237. package/tests/vitest-plugin-cwd.spec.ts +68 -0
  238. package/tests/vitest-plugin.spec.ts +103 -0
  239. package/tests/workers/library-build-worker.spec.ts +258 -0
  240. package/tests/workers/ngtsc-build-worker.spec.ts +187 -0
  241. package/tests/workers/server-build-worker.spec.ts +566 -0
  242. package/tests/workers/server-runtime-worker.spec.ts +251 -0
  243. package/README.md +0 -295
  244. package/dist/builders/BaseBuilder.d.ts +0 -88
  245. package/dist/builders/BaseBuilder.d.ts.map +0 -1
  246. package/dist/builders/BaseBuilder.js +0 -142
  247. package/dist/builders/BaseBuilder.js.map +0 -6
  248. package/dist/builders/DtsBuilder.d.ts +0 -22
  249. package/dist/builders/DtsBuilder.d.ts.map +0 -1
  250. package/dist/builders/DtsBuilder.js +0 -72
  251. package/dist/builders/DtsBuilder.js.map +0 -6
  252. package/dist/builders/LibraryBuilder.d.ts +0 -22
  253. package/dist/builders/LibraryBuilder.d.ts.map +0 -1
  254. package/dist/builders/LibraryBuilder.js +0 -85
  255. package/dist/builders/LibraryBuilder.js.map +0 -6
  256. package/dist/builders/types.d.ts +0 -55
  257. package/dist/builders/types.d.ts.map +0 -1
  258. package/dist/builders/types.js +0 -1
  259. package/dist/builders/types.js.map +0 -6
  260. package/dist/capacitor/capacitor.d.ts +0 -151
  261. package/dist/capacitor/capacitor.d.ts.map +0 -1
  262. package/dist/capacitor/capacitor.js +0 -694
  263. package/dist/capacitor/capacitor.js.map +0 -6
  264. package/dist/commands/device.d.ts +0 -22
  265. package/dist/commands/device.d.ts.map +0 -1
  266. package/dist/commands/device.js +0 -98
  267. package/dist/commands/device.js.map +0 -6
  268. package/dist/commands/init.d.ts +0 -14
  269. package/dist/commands/init.d.ts.map +0 -1
  270. package/dist/commands/init.js +0 -72
  271. package/dist/commands/init.js.map +0 -6
  272. package/dist/electron/electron.d.ts +0 -84
  273. package/dist/electron/electron.d.ts.map +0 -1
  274. package/dist/electron/electron.js +0 -263
  275. package/dist/electron/electron.js.map +0 -6
  276. package/dist/orchestrators/DevOrchestrator.d.ts +0 -83
  277. package/dist/orchestrators/DevOrchestrator.d.ts.map +0 -1
  278. package/dist/orchestrators/DevOrchestrator.js +0 -540
  279. package/dist/orchestrators/DevOrchestrator.js.map +0 -6
  280. package/dist/orchestrators/WatchOrchestrator.d.ts +0 -57
  281. package/dist/orchestrators/WatchOrchestrator.d.ts.map +0 -1
  282. package/dist/orchestrators/WatchOrchestrator.js +0 -199
  283. package/dist/orchestrators/WatchOrchestrator.js.map +0 -6
  284. package/dist/utils/tailwind-config-deps.d.ts +0 -8
  285. package/dist/utils/tailwind-config-deps.d.ts.map +0 -1
  286. package/dist/utils/tailwind-config-deps.js +0 -82
  287. package/dist/utils/tailwind-config-deps.js.map +0 -6
  288. package/dist/utils/template.d.ts +0 -14
  289. package/dist/utils/template.d.ts.map +0 -1
  290. package/dist/utils/template.js +0 -33
  291. package/dist/utils/template.js.map +0 -6
  292. package/dist/utils/vite-config.d.ts +0 -35
  293. package/dist/utils/vite-config.d.ts.map +0 -1
  294. package/dist/utils/vite-config.js +0 -259
  295. package/dist/utils/vite-config.js.map +0 -6
  296. package/dist/workers/client.worker.d.ts +0 -83
  297. package/dist/workers/client.worker.d.ts.map +0 -1
  298. package/dist/workers/client.worker.js +0 -111
  299. package/dist/workers/client.worker.js.map +0 -6
  300. package/dist/workers/dts.worker.d.ts +0 -75
  301. package/dist/workers/dts.worker.d.ts.map +0 -1
  302. package/dist/workers/dts.worker.js +0 -270
  303. package/dist/workers/dts.worker.js.map +0 -6
  304. package/dist/workers/library.worker.d.ts +0 -75
  305. package/dist/workers/library.worker.d.ts.map +0 -1
  306. package/dist/workers/library.worker.js +0 -166
  307. package/dist/workers/library.worker.js.map +0 -6
  308. package/dist/workers/server.worker.d.ts.map +0 -1
  309. package/dist/workers/server.worker.js +0 -482
  310. package/dist/workers/server.worker.js.map +0 -6
  311. package/src/builders/BaseBuilder.ts +0 -218
  312. package/src/builders/DtsBuilder.ts +0 -92
  313. package/src/builders/LibraryBuilder.ts +0 -110
  314. package/src/builders/types.ts +0 -60
  315. package/src/capacitor/capacitor.ts +0 -931
  316. package/src/commands/device.ts +0 -140
  317. package/src/commands/init.ts +0 -113
  318. package/src/electron/electron.ts +0 -362
  319. package/src/orchestrators/DevOrchestrator.ts +0 -744
  320. package/src/orchestrators/WatchOrchestrator.ts +0 -277
  321. package/src/utils/tailwind-config-deps.ts +0 -98
  322. package/src/utils/template.ts +0 -56
  323. package/src/utils/vite-config.ts +0 -390
  324. package/src/workers/client.worker.ts +0 -250
  325. package/src/workers/dts.worker.ts +0 -453
  326. package/src/workers/library.worker.ts +0 -316
  327. package/src/workers/server.worker.ts +0 -734
  328. package/templates/init/.gitignore.hbs +0 -34
  329. package/templates/init/.npmrc.hbs +0 -1
  330. package/templates/init/.prettierignore +0 -1
  331. package/templates/init/.prettierrc.yaml +0 -12
  332. package/templates/init/eslint.config.ts +0 -15
  333. package/templates/init/mise.toml +0 -3
  334. package/templates/init/package.json.hbs +0 -32
  335. package/templates/init/packages/client-admin/index.html.hbs +0 -144
  336. package/templates/init/packages/client-admin/package.json.hbs +0 -27
  337. package/templates/init/packages/client-admin/public/assets/logo-landscape.png +0 -0
  338. package/templates/init/packages/client-admin/public/assets/logo.png +0 -0
  339. package/templates/init/packages/client-admin/public/favicon.ico +0 -0
  340. package/templates/init/packages/client-admin/src/App.tsx +0 -42
  341. package/templates/init/packages/client-admin/src/dev/DevDialog.tsx +0 -34
  342. package/templates/init/packages/client-admin/src/events/AuthChangeEvent.ts +0 -3
  343. package/templates/init/packages/client-admin/src/main.css +0 -4
  344. package/templates/init/packages/client-admin/src/main.tsx.hbs +0 -146
  345. package/templates/init/packages/client-admin/src/providers/AppServiceProvider.tsx.hbs +0 -103
  346. package/templates/init/packages/client-admin/src/providers/AppStructureProvider.tsx +0 -84
  347. package/templates/init/packages/client-admin/src/providers/AuthProvider.tsx.hbs +0 -96
  348. package/templates/init/packages/client-admin/src/providers/configureSharedData.ts.hbs +0 -67
  349. package/templates/init/packages/client-admin/src/views/auth/LoginView.tsx +0 -132
  350. package/templates/init/packages/client-admin/src/views/home/HomeView.tsx +0 -108
  351. package/templates/init/packages/client-admin/src/views/home/base/employee/EmployeeDetail.tsx.hbs +0 -243
  352. package/templates/init/packages/client-admin/src/views/home/base/employee/EmployeeSheet.tsx.hbs +0 -271
  353. package/templates/init/packages/client-admin/src/views/home/base/role-permission/RoleDetail.tsx.hbs +0 -146
  354. package/templates/init/packages/client-admin/src/views/home/base/role-permission/RolePermissionDetail.tsx.hbs +0 -121
  355. package/templates/init/packages/client-admin/src/views/home/base/role-permission/RolePermissionView.tsx +0 -52
  356. package/templates/init/packages/client-admin/src/views/home/base/role-permission/RoleSheet.tsx.hbs +0 -125
  357. package/templates/init/packages/client-admin/src/views/home/main/MainView.tsx.hbs +0 -13
  358. package/templates/init/packages/client-admin/src/views/home/my-info/MyInfoDetail.tsx.hbs +0 -241
  359. package/templates/init/packages/client-admin/src/views/home/system/system-log/SystemLogSheet.tsx.hbs +0 -169
  360. package/templates/init/packages/client-admin/src/views/not-found/NotFoundView.tsx +0 -15
  361. package/templates/init/packages/client-admin/tailwind.config.ts +0 -10
  362. package/templates/init/packages/db-main/package.json.hbs +0 -13
  363. package/templates/init/packages/db-main/src/MainDbContext.ts +0 -22
  364. package/templates/init/packages/db-main/src/dataLogExt.ts +0 -127
  365. package/templates/init/packages/db-main/src/index.ts +0 -14
  366. package/templates/init/packages/db-main/src/tables/base/Employee.ts +0 -24
  367. package/templates/init/packages/db-main/src/tables/base/EmployeeConfig.ts +0 -13
  368. package/templates/init/packages/db-main/src/tables/base/Role.ts +0 -9
  369. package/templates/init/packages/db-main/src/tables/base/RolePermission.ts +0 -13
  370. package/templates/init/packages/db-main/src/tables/system/_DataLog.ts +0 -19
  371. package/templates/init/packages/db-main/src/tables/system/_Log.ts +0 -16
  372. package/templates/init/packages/server/package.json.hbs +0 -20
  373. package/templates/init/packages/server/public-dev/dev//354/264/210/352/270/260/355/231/224.xlsx +0 -0
  374. package/templates/init/packages/server/src/index.ts +0 -4
  375. package/templates/init/packages/server/src/main.ts.hbs +0 -34
  376. package/templates/init/packages/server/src/services/AuthService.ts.hbs +0 -171
  377. package/templates/init/packages/server/src/services/DevService.ts.hbs +0 -94
  378. package/templates/init/packages/server/src/services/EmployeeService.ts.hbs +0 -122
  379. package/templates/init/packages/server/src/services/RoleService.ts.hbs +0 -59
  380. package/templates/init/pnpm-workspace.yaml +0 -15
  381. package/templates/init/sd.config.ts.hbs +0 -48
  382. package/templates/init/tsconfig.json.hbs +0 -39
  383. package/templates/init/vitest.config.ts +0 -36
  384. package/tests/capacitor-exclude.spec.ts +0 -78
  385. package/tests/capacitor.spec.ts +0 -49
  386. package/tests/copy-src.spec.ts +0 -50
  387. package/tests/electron-exclude.spec.ts +0 -61
  388. package/tests/get-compiler-options-for-package.spec.ts +0 -80
  389. package/tests/get-package-source-files.spec.ts +0 -139
  390. package/tests/get-types-from-package-json.spec.ts +0 -92
  391. package/tests/infra/ResultCollector.spec.ts +0 -30
  392. package/tests/infra/SignalHandler.spec.ts +0 -38
  393. package/tests/infra/WorkerManager.spec.ts +0 -63
  394. package/tests/load-ignore-patterns.spec.ts +0 -163
  395. package/tests/load-sd-config.spec.ts +0 -100
  396. package/tests/package-utils.spec.ts +0 -188
  397. package/tests/parse-root-tsconfig.spec.ts +0 -89
  398. package/tests/publish-config-narrowing.spec.ts +0 -20
  399. package/tests/replace-deps.spec.ts +0 -308
  400. package/tests/run-lint.spec.ts +0 -366
  401. package/tests/run-typecheck.spec.ts +0 -544
  402. package/tests/run-watch.spec.ts +0 -76
  403. package/tests/sd-cli.spec.ts +0 -265
  404. package/tests/sd-public-dev-plugin-mime.spec.ts +0 -19
  405. package/tests/tailwind-config-deps.spec.ts +0 -30
  406. package/tests/template.spec.ts +0 -70
  407. package/tests/vite-config-exclude.spec.ts +0 -35
  408. package/tests/vite-config-outdir.spec.ts +0 -38
  409. package/tests/write-changed-output-files.spec.ts +0 -97
@@ -0,0 +1,213 @@
1
+ import { describe, it, expect, vi, beforeEach } from "vitest";
2
+
3
+ // --- Mock factories (vi.mock is hoisted) ---
4
+
5
+ vi.mock("consola", () => ({
6
+ consola: {
7
+ withTag: vi.fn(() => ({
8
+ debug: vi.fn(),
9
+ warn: vi.fn(),
10
+ error: vi.fn(),
11
+ })),
12
+ },
13
+ }));
14
+
15
+ const mockWorker = {
16
+ build: vi.fn(),
17
+ startWatch: vi.fn(),
18
+ stopWatch: vi.fn(),
19
+ terminate: vi.fn(),
20
+ on: vi.fn(),
21
+ };
22
+
23
+ vi.mock("@simplysm/core-node", () => ({
24
+ Worker: {
25
+ create: vi.fn(() => mockWorker),
26
+ },
27
+ }));
28
+
29
+ // --- Dynamic imports after mocking ---
30
+
31
+ const { TscEngine } = await import("../../src/engines/TscEngine");
32
+
33
+ import type { BuildPackageInfo } from "../../src/engines/types";
34
+
35
+ // --- Helpers ---
36
+
37
+ function createMockPkg(overrides: Partial<BuildPackageInfo> = {}): BuildPackageInfo {
38
+ return {
39
+ name: "test-pkg",
40
+ dir: "/packages/test-pkg",
41
+ config: { target: "node" } as any,
42
+ ...overrides,
43
+ };
44
+ }
45
+
46
+ function setupDefaultBuildResult(): void {
47
+ mockWorker.build.mockResolvedValue({
48
+ js: { success: true, errors: undefined, warnings: undefined },
49
+ dts: { success: true, errors: undefined, diagnostics: [] },
50
+ });
51
+ mockWorker.terminate.mockResolvedValue(undefined);
52
+ mockWorker.stopWatch.mockResolvedValue(undefined);
53
+ }
54
+
55
+ // --- Tests ---
56
+
57
+ beforeEach(() => {
58
+ vi.clearAllMocks();
59
+ setupDefaultBuildResult();
60
+ });
61
+
62
+ describe("TscEngine", () => {
63
+ // Acceptance: Scenario "run()으로 프로덕션 빌드 실행"
64
+ describe("run()", () => {
65
+ it("creates worker, calls build, and returns EngineResult", async () => {
66
+ const { Worker } = await import("@simplysm/core-node");
67
+ const engine = new TscEngine({ cwd: "/root", pkg: createMockPkg() });
68
+
69
+ const result = await engine.run({ js: true, dts: true });
70
+
71
+ expect(Worker.create).toHaveBeenCalledTimes(1);
72
+ expect(mockWorker.build).toHaveBeenCalledWith(
73
+ expect.objectContaining({
74
+ name: "test-pkg",
75
+ pkgDir: "/packages/test-pkg",
76
+ output: { js: true, dts: true },
77
+ }),
78
+ );
79
+ expect(result.success).toBe(true);
80
+ expect(result.js.success).toBe(true);
81
+ expect(result.dts.success).toBe(true);
82
+ await engine.stop();
83
+ });
84
+
85
+ it("maps worker result to EngineResult with js/dts separation", async () => {
86
+ mockWorker.build.mockResolvedValue({
87
+ js: { success: true, errors: undefined, warnings: ["warn1"] },
88
+ dts: { success: true, errors: undefined, diagnostics: [{ code: 1, category: 0 }] },
89
+ });
90
+
91
+ const engine = new TscEngine({ cwd: "/root", pkg: createMockPkg() });
92
+ const result = await engine.run({ js: true, dts: true });
93
+
94
+ expect(result.js.warnings).toEqual(["warn1"]);
95
+ expect(result.dts.diagnostics).toEqual([{ code: 1, category: 0 }]);
96
+ await engine.stop();
97
+ });
98
+
99
+ it("reflects failure when tsc reports errors", async () => {
100
+ mockWorker.build.mockResolvedValue({
101
+ js: { success: false, errors: ["type error"], warnings: undefined },
102
+ dts: { success: false, errors: ["type error"], diagnostics: [{ code: 2322, category: 1 }] },
103
+ });
104
+
105
+ const engine = new TscEngine({ cwd: "/root", pkg: createMockPkg() });
106
+ const result = await engine.run({ js: true, dts: true });
107
+
108
+ expect(result.success).toBe(false);
109
+ expect(result.js.errors).toEqual(["type error"]);
110
+ expect(result.dts.diagnostics).toHaveLength(1);
111
+ await engine.stop();
112
+ });
113
+
114
+ it("passes output flags to worker", async () => {
115
+ const engine = new TscEngine({ cwd: "/root", pkg: createMockPkg() });
116
+ await engine.run({ js: false, dts: true });
117
+ expect(mockWorker.build).toHaveBeenCalledWith(
118
+ expect.objectContaining({ output: { js: false, dts: true } }),
119
+ );
120
+ await engine.stop();
121
+ });
122
+ });
123
+
124
+ // Acceptance: Scenario "startWatch()로 watch 모드 시작"
125
+ describe("startWatch()", () => {
126
+ it("resolves when initial build event arrives", async () => {
127
+ mockWorker.startWatch.mockImplementation(() => {
128
+ const buildHandler = mockWorker.on.mock.calls.find(
129
+ (call: any[]) => call[0] === "build",
130
+ )?.[1];
131
+ buildHandler?.({
132
+ js: { success: true },
133
+ dts: { success: true },
134
+ });
135
+ });
136
+
137
+ const engine = new TscEngine({ cwd: "/root", pkg: createMockPkg() });
138
+ await engine.startWatch({ js: true, dts: true });
139
+
140
+ expect(mockWorker.on).toHaveBeenCalledWith("build", expect.any(Function));
141
+ expect(mockWorker.on).toHaveBeenCalledWith("buildStart", expect.any(Function));
142
+ expect(mockWorker.on).toHaveBeenCalledWith("error", expect.any(Function));
143
+
144
+ await engine.stop();
145
+ });
146
+
147
+ it("reports build and dts results separately to ResultCollector", async () => {
148
+ const mockResultCollector = { add: vi.fn() };
149
+
150
+ mockWorker.startWatch.mockImplementation(() => {
151
+ const buildHandler = mockWorker.on.mock.calls.find(
152
+ (call: any[]) => call[0] === "build",
153
+ )?.[1];
154
+ buildHandler?.({
155
+ js: { success: true, errors: undefined },
156
+ dts: { success: false, errors: ["type error"] },
157
+ });
158
+ });
159
+
160
+ const engine = new TscEngine({
161
+ cwd: "/root",
162
+ pkg: createMockPkg(),
163
+ resultCollector: mockResultCollector as any,
164
+ });
165
+
166
+ await engine.startWatch({ js: true, dts: true });
167
+
168
+ const addCalls = mockResultCollector.add.mock.calls;
169
+ const buildResult = addCalls.find((c: any[]) => c[0].type === "build");
170
+ const dtsResult = addCalls.find((c: any[]) => c[0].type === "dts");
171
+
172
+ expect(buildResult).toBeDefined();
173
+ expect(buildResult![0].status).toBe("success");
174
+ expect(dtsResult).toBeDefined();
175
+ expect(dtsResult![0].status).toBe("error");
176
+
177
+ await engine.stop();
178
+ });
179
+ });
180
+
181
+ // Acceptance: Scenario "stop()으로 리소스 정리"
182
+ describe("stop()", () => {
183
+ it("calls stopWatch and terminate in watch mode", async () => {
184
+ mockWorker.startWatch.mockImplementation(() => {
185
+ const buildHandler = mockWorker.on.mock.calls.find(
186
+ (call: any[]) => call[0] === "build",
187
+ )?.[1];
188
+ buildHandler?.({ js: { success: true }, dts: { success: true } });
189
+ });
190
+
191
+ const engine = new TscEngine({ cwd: "/root", pkg: createMockPkg() });
192
+ await engine.startWatch({ js: true, dts: true });
193
+ await engine.stop();
194
+
195
+ expect(mockWorker.stopWatch).toHaveBeenCalled();
196
+ expect(mockWorker.terminate).toHaveBeenCalled();
197
+ });
198
+
199
+ it("handles stop without prior run/startWatch", async () => {
200
+ const engine = new TscEngine({ cwd: "/root", pkg: createMockPkg() });
201
+ await expect(engine.stop()).resolves.toBeUndefined();
202
+ });
203
+
204
+ it("skips stopWatch in run mode", async () => {
205
+ const engine = new TscEngine({ cwd: "/root", pkg: createMockPkg() });
206
+ await engine.run({ js: true, dts: true });
207
+ await engine.stop();
208
+
209
+ expect(mockWorker.stopWatch).not.toHaveBeenCalled();
210
+ expect(mockWorker.terminate).toHaveBeenCalled();
211
+ });
212
+ });
213
+ });
@@ -0,0 +1,358 @@
1
+ import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
2
+
3
+ // --- Mock factories (vi.mock is hoisted) ---
4
+
5
+ vi.mock("consola", () => ({
6
+ consola: {
7
+ withTag: vi.fn(() => ({
8
+ debug: vi.fn(),
9
+ warn: vi.fn(),
10
+ error: vi.fn(),
11
+ })),
12
+ },
13
+ }));
14
+
15
+ const mockWorker = {
16
+ build: vi.fn(),
17
+ startWatch: vi.fn(),
18
+ stopWatch: vi.fn(),
19
+ terminate: vi.fn(),
20
+ on: vi.fn(),
21
+ };
22
+
23
+ vi.mock("@simplysm/core-node", () => ({
24
+ Worker: {
25
+ create: vi.fn(() => mockWorker),
26
+ },
27
+ }));
28
+
29
+ // --- Dynamic imports after mocking ---
30
+
31
+ const { ViteEngine } = await import("../../src/engines/ViteEngine");
32
+
33
+ import type { ClientPackageInfo } from "../../src/engines/types";
34
+
35
+ // --- Helpers ---
36
+
37
+ function createMockPkg(overrides: Partial<ClientPackageInfo> = {}): ClientPackageInfo {
38
+ return {
39
+ name: "my-client",
40
+ dir: "/packages/my-client",
41
+ config: { target: "client", server: "my-server" } as any,
42
+ ...overrides,
43
+ };
44
+ }
45
+
46
+ // --- Tests ---
47
+
48
+ beforeEach(() => {
49
+ vi.clearAllMocks();
50
+ mockWorker.terminate.mockResolvedValue(undefined);
51
+ mockWorker.stopWatch.mockResolvedValue(undefined);
52
+ });
53
+
54
+ afterEach(() => {
55
+ vi.restoreAllMocks();
56
+ });
57
+
58
+ describe("ViteEngine", () => {
59
+ describe("run()", () => {
60
+ // Acceptance: Scenario "프로덕션 빌드 성공"
61
+ it("creates worker, calls build, and returns EngineResult with js success and dts always-success", async () => {
62
+ mockWorker.build.mockResolvedValue({
63
+ js: { success: true, errors: undefined, warnings: undefined },
64
+ dts: { success: true, errors: undefined, diagnostics: [] },
65
+ });
66
+
67
+ const engine = new ViteEngine({ cwd: "/root", pkg: createMockPkg() });
68
+ const result = await engine.run({ js: true, dts: false });
69
+
70
+ const { Worker } = await import("@simplysm/core-node");
71
+ expect(Worker.create).toHaveBeenCalledTimes(1);
72
+ expect(mockWorker.build).toHaveBeenCalledWith(
73
+ expect.objectContaining({
74
+ name: "my-client",
75
+ pkgDir: "/packages/my-client",
76
+ output: { js: true, dts: false },
77
+ }),
78
+ );
79
+ expect(result.success).toBe(true);
80
+ expect(result.js.success).toBe(true);
81
+ expect(result.js.errors).toEqual([]);
82
+ expect(result.dts.success).toBe(true);
83
+ expect(result.dts.diagnostics).toEqual([]);
84
+ await engine.stop();
85
+ });
86
+
87
+ // Acceptance: Scenario "TypeScript 또는 Angular 에러로 빌드 실패"
88
+ it("returns failure EngineResult when build fails", async () => {
89
+ mockWorker.build.mockResolvedValue({
90
+ js: { success: false, errors: ["TS2345: Argument of type..."], warnings: undefined },
91
+ dts: { success: true, errors: undefined, diagnostics: [] },
92
+ });
93
+
94
+ const engine = new ViteEngine({ cwd: "/root", pkg: createMockPkg() });
95
+ const result = await engine.run({ js: true, dts: false });
96
+
97
+ expect(result.success).toBe(false);
98
+ expect(result.js.success).toBe(false);
99
+ expect(result.js.errors).toContain("TS2345: Argument of type...");
100
+ await engine.stop();
101
+ });
102
+
103
+ // Unit: warnings are mapped through
104
+ it("maps worker warnings to EngineResult", async () => {
105
+ mockWorker.build.mockResolvedValue({
106
+ js: { success: true, errors: undefined, warnings: ["deprecation warning"] },
107
+ dts: { success: true, errors: undefined, diagnostics: [] },
108
+ });
109
+
110
+ const engine = new ViteEngine({ cwd: "/root", pkg: createMockPkg() });
111
+ const result = await engine.run({ js: true, dts: false });
112
+
113
+ expect(result.js.warnings).toEqual(["deprecation warning"]);
114
+ await engine.stop();
115
+ });
116
+
117
+ // Unit: dts is always success for client packages (D2)
118
+ it("always returns dts success regardless of build outcome", async () => {
119
+ mockWorker.build.mockResolvedValue({
120
+ js: { success: false, errors: ["error"], warnings: undefined },
121
+ dts: { success: true, errors: undefined, diagnostics: [] },
122
+ });
123
+
124
+ const engine = new ViteEngine({ cwd: "/root", pkg: createMockPkg() });
125
+ const result = await engine.run({ js: true, dts: false });
126
+
127
+ expect(result.dts.success).toBe(true);
128
+ expect(result.dts.diagnostics).toEqual([]);
129
+ await engine.stop();
130
+ });
131
+ });
132
+
133
+ describe("stop()", () => {
134
+ // Acceptance: Scenario "stop()으로 엔진 정리"
135
+ it("terminates worker on stop", async () => {
136
+ mockWorker.build.mockResolvedValue({
137
+ js: { success: true, errors: undefined, warnings: undefined },
138
+ dts: { success: true, errors: undefined, diagnostics: [] },
139
+ });
140
+
141
+ const engine = new ViteEngine({ cwd: "/root", pkg: createMockPkg() });
142
+ await engine.run({ js: true, dts: false });
143
+ await engine.stop();
144
+
145
+ expect(mockWorker.terminate).toHaveBeenCalled();
146
+ });
147
+
148
+ it("handles stop without prior run", async () => {
149
+ const engine = new ViteEngine({ cwd: "/root", pkg: createMockPkg() });
150
+ await expect(engine.stop()).resolves.toBeUndefined();
151
+ });
152
+
153
+ // Unit: run mode doesn't call stopWatch
154
+ it("skips stopWatch in run mode", async () => {
155
+ mockWorker.build.mockResolvedValue({
156
+ js: { success: true, errors: undefined, warnings: undefined },
157
+ dts: { success: true, errors: undefined, diagnostics: [] },
158
+ });
159
+
160
+ const engine = new ViteEngine({ cwd: "/root", pkg: createMockPkg() });
161
+ await engine.run({ js: true, dts: false });
162
+ await engine.stop();
163
+
164
+ expect(mockWorker.stopWatch).not.toHaveBeenCalled();
165
+ expect(mockWorker.terminate).toHaveBeenCalled();
166
+ });
167
+
168
+ // Unit: watch mode calls stopWatch
169
+ it("calls stopWatch in watch mode before terminate", async () => {
170
+ mockWorker.startWatch.mockImplementation(() => {
171
+ const buildHandler = mockWorker.on.mock.calls.find(
172
+ (call: any[]) => call[0] === "build",
173
+ )?.[1];
174
+ buildHandler?.({
175
+ js: { success: true },
176
+ dts: { success: true },
177
+ });
178
+ });
179
+
180
+ const engine = new ViteEngine({ cwd: "/root", pkg: createMockPkg() });
181
+ await engine.startWatch({ js: true, dts: false });
182
+ await engine.stop();
183
+
184
+ expect(mockWorker.stopWatch).toHaveBeenCalled();
185
+ expect(mockWorker.terminate).toHaveBeenCalled();
186
+ });
187
+ });
188
+
189
+ describe("startWatch()", () => {
190
+ // Acceptance: Scenario "개발 서버 시작 및 initial build 완료"
191
+ it("resolves when initial build event arrives", async () => {
192
+ mockWorker.startWatch.mockImplementation(() => {
193
+ const buildHandler = mockWorker.on.mock.calls.find(
194
+ (call: any[]) => call[0] === "build",
195
+ )?.[1];
196
+ buildHandler?.({
197
+ js: { success: true },
198
+ dts: { success: true },
199
+ });
200
+ });
201
+
202
+ const { Worker } = await import("@simplysm/core-node");
203
+ const engine = new ViteEngine({ cwd: "/root", pkg: createMockPkg() });
204
+
205
+ await engine.startWatch({ js: true, dts: false });
206
+
207
+ expect(Worker.create).toHaveBeenCalledTimes(1);
208
+ expect(mockWorker.on).toHaveBeenCalledWith("build", expect.any(Function));
209
+ expect(mockWorker.on).toHaveBeenCalledWith("buildStart", expect.any(Function));
210
+ expect(mockWorker.on).toHaveBeenCalledWith("error", expect.any(Function));
211
+ expect(mockWorker.on).toHaveBeenCalledWith("serverReady", expect.any(Function));
212
+
213
+ await engine.stop();
214
+ });
215
+
216
+ // Acceptance: Scenario "파일 변경 시 rebuild 보고"
217
+ it("reports build and dts results separately to ResultCollector", async () => {
218
+ const mockResultCollector = { add: vi.fn() };
219
+
220
+ mockWorker.startWatch.mockImplementation(() => {
221
+ const buildHandler = mockWorker.on.mock.calls.find(
222
+ (call: any[]) => call[0] === "build",
223
+ )?.[1];
224
+ buildHandler?.({
225
+ js: { success: true, errors: undefined },
226
+ dts: { success: true, errors: undefined },
227
+ });
228
+ });
229
+
230
+ const engine = new ViteEngine({
231
+ cwd: "/root",
232
+ pkg: createMockPkg(),
233
+ resultCollector: mockResultCollector as any,
234
+ });
235
+
236
+ await engine.startWatch({ js: true, dts: false });
237
+
238
+ const addCalls = mockResultCollector.add.mock.calls;
239
+ const buildResult = addCalls.find((c: any[]) => c[0].type === "build");
240
+ const dtsResult = addCalls.find((c: any[]) => c[0].type === "dts");
241
+
242
+ expect(buildResult).toBeDefined();
243
+ expect(buildResult![0].status).toBe("success");
244
+ expect(dtsResult).toBeDefined();
245
+ expect(dtsResult![0].status).toBe("success");
246
+
247
+ await engine.stop();
248
+ });
249
+
250
+ // Acceptance: Scenario "dev server 포트가 ViteEngine에 보고된다" (D1)
251
+ it("stores port from serverReady event", async () => {
252
+ mockWorker.startWatch.mockImplementation(() => {
253
+ // Emit serverReady before build
254
+ const serverReadyHandler = mockWorker.on.mock.calls.find(
255
+ (call: any[]) => call[0] === "serverReady",
256
+ )?.[1];
257
+ serverReadyHandler?.({ port: 4200 });
258
+
259
+ const buildHandler = mockWorker.on.mock.calls.find(
260
+ (call: any[]) => call[0] === "build",
261
+ )?.[1];
262
+ buildHandler?.({
263
+ js: { success: true },
264
+ dts: { success: true },
265
+ });
266
+ });
267
+
268
+ const engine = new ViteEngine({ cwd: "/root", pkg: createMockPkg() });
269
+
270
+ await engine.startWatch({ js: true, dts: false });
271
+
272
+ expect(engine.port).toBe(4200);
273
+
274
+ await engine.stop();
275
+ });
276
+
277
+ // Acceptance: Scenario "독립 클라이언트의 Vite dev server 시작 (지정 포트)"
278
+ it("passes port to worker startWatch when config.server is a number", async () => {
279
+ mockWorker.startWatch.mockImplementation(() => {
280
+ const buildHandler = mockWorker.on.mock.calls.find(
281
+ (call: any[]) => call[0] === "build",
282
+ )?.[1];
283
+ buildHandler?.({
284
+ js: { success: true },
285
+ dts: { success: true },
286
+ });
287
+ });
288
+
289
+ const engine = new ViteEngine({
290
+ cwd: "/root",
291
+ pkg: createMockPkg({
292
+ config: { target: "client", server: 3000 } as any,
293
+ }),
294
+ });
295
+
296
+ await engine.startWatch({ js: true, dts: false });
297
+
298
+ expect(mockWorker.startWatch).toHaveBeenCalledWith(
299
+ expect.objectContaining({ port: 3000 }),
300
+ );
301
+
302
+ await engine.stop();
303
+ });
304
+
305
+ // Unit: server: string does not pass port
306
+ it("does not pass port when config.server is a string", async () => {
307
+ mockWorker.startWatch.mockImplementation(() => {
308
+ const buildHandler = mockWorker.on.mock.calls.find(
309
+ (call: any[]) => call[0] === "build",
310
+ )?.[1];
311
+ buildHandler?.({
312
+ js: { success: true },
313
+ dts: { success: true },
314
+ });
315
+ });
316
+
317
+ const engine = new ViteEngine({
318
+ cwd: "/root",
319
+ pkg: createMockPkg({
320
+ config: { target: "client", server: "my-server" } as any,
321
+ }),
322
+ });
323
+
324
+ await engine.startWatch({ js: true, dts: false });
325
+
326
+ const callArgs = mockWorker.startWatch.mock.calls[0][0];
327
+ expect(callArgs.port).toBeUndefined();
328
+
329
+ await engine.stop();
330
+ });
331
+
332
+ // Unit: error event also resolves startWatch
333
+ it("resolves when error event arrives on initial build", async () => {
334
+ const mockResultCollector = { add: vi.fn() };
335
+
336
+ mockWorker.startWatch.mockImplementation(() => {
337
+ const errorHandler = mockWorker.on.mock.calls.find(
338
+ (call: any[]) => call[0] === "error",
339
+ )?.[1];
340
+ errorHandler?.({ message: "Build failed" });
341
+ });
342
+
343
+ const engine = new ViteEngine({
344
+ cwd: "/root",
345
+ pkg: createMockPkg(),
346
+ resultCollector: mockResultCollector as any,
347
+ });
348
+
349
+ await engine.startWatch({ js: true, dts: false });
350
+
351
+ const addCalls = mockResultCollector.add.mock.calls;
352
+ const errorResult = addCalls.find((c: any[]) => c[0].status === "error");
353
+ expect(errorResult).toBeDefined();
354
+
355
+ await engine.stop();
356
+ });
357
+ });
358
+ });
@@ -0,0 +1,46 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { ResultCollector } from "../../src/infra/ResultCollector";
3
+
4
+ describe("ResultCollector", () => {
5
+ it("adds and retrieves a build result by key", () => {
6
+ const collector = new ResultCollector();
7
+ collector.add({ name: "core", target: "node", type: "build", status: "success" });
8
+
9
+ const result = collector.get("core:build");
10
+ expect(result).toBeDefined();
11
+ expect(result!.name).toBe("core");
12
+ expect(result!.status).toBe("success");
13
+ });
14
+
15
+ it("overwrites result with same key on re-add", () => {
16
+ const collector = new ResultCollector();
17
+ collector.add({ name: "core", target: "node", type: "build", status: "building" });
18
+ collector.add({ name: "core", target: "node", type: "build", status: "success" });
19
+
20
+ expect(collector.get("core:build")!.status).toBe("success");
21
+ });
22
+
23
+ it("returns all results via toMap", () => {
24
+ const collector = new ResultCollector();
25
+ collector.add({ name: "core", target: "node", type: "build", status: "success" });
26
+ collector.add({ name: "core", target: "node", type: "dts", status: "building" });
27
+
28
+ const map = collector.toMap();
29
+ expect(map.size).toBe(2);
30
+ expect(map.has("core:build")).toBe(true);
31
+ expect(map.has("core:dts")).toBe(true);
32
+ });
33
+
34
+ it("returns undefined for non-existent key", () => {
35
+ const collector = new ResultCollector();
36
+ expect(collector.get("nonexistent")).toBeUndefined();
37
+ });
38
+
39
+ it("uses name:type as key format", () => {
40
+ const collector = new ResultCollector();
41
+ collector.add({ name: "storage", target: "node", type: "server", status: "running", port: 3000 });
42
+
43
+ expect(collector.get("storage:server")).toBeDefined();
44
+ expect(collector.get("storage:build")).toBeUndefined();
45
+ });
46
+ });
@@ -0,0 +1,32 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { SignalHandler } from "../../src/infra/SignalHandler";
3
+
4
+ describe("SignalHandler", () => {
5
+ it("resolves waitForTermination on requestTermination", async () => {
6
+ const handler = new SignalHandler();
7
+
8
+ expect(handler.isTerminated()).toBe(false);
9
+
10
+ handler.requestTermination();
11
+
12
+ await handler.waitForTermination();
13
+ expect(handler.isTerminated()).toBe(true);
14
+ });
15
+
16
+ it("is not terminated initially", () => {
17
+ const handler = new SignalHandler();
18
+ expect(handler.isTerminated()).toBe(false);
19
+ // Clean up: prevent dangling signal listeners
20
+ handler.requestTermination();
21
+ });
22
+
23
+ it("handles double requestTermination gracefully", async () => {
24
+ const handler = new SignalHandler();
25
+
26
+ handler.requestTermination();
27
+ handler.requestTermination();
28
+
29
+ await handler.waitForTermination();
30
+ expect(handler.isTerminated()).toBe(true);
31
+ });
32
+ });