@simplysm/sd-cli 13.0.99 → 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
@@ -1,4 +1,3 @@
1
- import proxy from "@fastify/http-proxy";
2
1
  import { createWorker } from "@simplysm/core-node";
3
2
  import { err as errNs } from "@simplysm/core-common";
4
3
  import { consola } from "consola";
@@ -13,7 +12,8 @@ import { registerCleanupHandlers, applyDebugLevel } from "../utils/worker-utils"
13
12
  */
14
13
  export interface ServerRuntimeStartInfo {
15
14
  mainJsPath: string;
16
- clientPorts: Record<string, number>;
15
+ /** Client Vite dev server ports for @fastify/http-proxy registration */
16
+ clientPorts?: Record<string, number>;
17
17
  env?: Record<string, string>;
18
18
  }
19
19
 
@@ -108,7 +108,7 @@ async function findAvailablePort(startPort: number, maxRetries = 20): Promise<nu
108
108
 
109
109
  /**
110
110
  * Start Server Runtime
111
- * Import main.js, configure Vite proxy, then listen
111
+ * Import main.js, then listen
112
112
  */
113
113
  async function start(info: ServerRuntimeStartInfo): Promise<void> {
114
114
  try {
@@ -135,6 +135,20 @@ async function start(info: ServerRuntimeStartInfo): Promise<void> {
135
135
  // Save server instance (for cleanup)
136
136
  serverInstance = server;
137
137
 
138
+ // Register client proxies (before listen)
139
+ if (info.clientPorts != null && Object.keys(info.clientPorts).length > 0) {
140
+ const { default: proxy } = await import("@fastify/http-proxy");
141
+ for (const [name, port] of Object.entries(info.clientPorts)) {
142
+ logger.debug(`[start] Registering proxy: /${name} -> http://127.0.0.1:${String(port)}`);
143
+ await server.fastify.register(proxy, {
144
+ prefix: `/${name}`,
145
+ upstream: `http://127.0.0.1:${port}`,
146
+ rewritePrefix: `/${name}`,
147
+ websocket: true,
148
+ });
149
+ }
150
+ }
151
+
138
152
  // Find available port (auto-increment on port conflict)
139
153
  logger.debug("[start] Finding available port...");
140
154
  stepStart = performance.now();
@@ -148,29 +162,6 @@ async function start(info: ServerRuntimeStartInfo): Promise<void> {
148
162
  `[start] Port ${String(availablePort)} available (${Math.round(performance.now() - stepStart)}ms)`,
149
163
  );
150
164
 
151
- // Configure Vite proxy (only if clientPorts exists)
152
- const clientEntries = Object.entries(info.clientPorts);
153
- if (clientEntries.length > 0) {
154
- logger.debug(
155
- `[start] Configuring ${String(clientEntries.length)} Vite proxy(s)...`,
156
- );
157
- stepStart = performance.now();
158
- }
159
- for (const [name, port] of clientEntries) {
160
- logger.debug(`[start] Registering proxy: /${name} -> http://127.0.0.1:${String(port)}`);
161
- await server.fastify.register(proxy, {
162
- prefix: `/${name}`,
163
- upstream: `http://127.0.0.1:${port}`,
164
- rewritePrefix: `/${name}`,
165
- websocket: true,
166
- });
167
- }
168
- if (clientEntries.length > 0) {
169
- logger.debug(
170
- `[start] Proxies configured (${Math.round(performance.now() - stepStart)}ms)`,
171
- );
172
- }
173
-
174
165
  // Start server
175
166
  logger.debug("[start] Starting server listen...");
176
167
  stepStart = performance.now();
@@ -0,0 +1,252 @@
1
+ import path from "path";
2
+ import fs from "node:fs";
3
+ import { createWorker } from "@simplysm/core-node";
4
+ import { err as errNs } from "@simplysm/core-common";
5
+ import { consola } from "consola";
6
+ import { registerCleanupHandlers, applyDebugLevel } from "../utils/worker-utils";
7
+ import {
8
+ buildApplicationInternal,
9
+ createAngularBuilderContext,
10
+ normalizeDevServerOptions,
11
+ ResultKind,
12
+ serveWithVite,
13
+ type ApplicationBuilderOptions,
14
+ type ResultFile,
15
+ } from "../utils/angular-build";
16
+ import type { BuildOutput } from "../engines/types";
17
+
18
+ applyDebugLevel();
19
+
20
+ //#region Types (re-export for worker interface)
21
+
22
+ export interface ViteBuildInfo {
23
+ name: string;
24
+ cwd: string;
25
+ pkgDir: string;
26
+ output: BuildOutput;
27
+ /** Vite dev server port (standalone clients with server: number) */
28
+ port?: number;
29
+ }
30
+
31
+ export interface ViteBuildResult {
32
+ js: { success: boolean; errors?: string[]; warnings?: string[] };
33
+ dts: { success: boolean; errors?: string[]; diagnostics: never[] };
34
+ }
35
+
36
+ export interface ViteCombinedBuildEvent {
37
+ js: { success: boolean; errors?: string[]; warnings?: string[] };
38
+ dts: { success: boolean; errors?: string[] };
39
+ }
40
+
41
+ export interface ViteBuildWorkerEvents extends Record<string, unknown> {
42
+ buildStart: Record<string, never>;
43
+ build: ViteCombinedBuildEvent;
44
+ error: { message: string };
45
+ serverReady: { port: number };
46
+ }
47
+
48
+ //#endregion
49
+
50
+ //#region Resource Management
51
+
52
+ const logger = consola.withTag("sd:cli:vite-build:worker");
53
+
54
+ let abortController: AbortController | undefined;
55
+
56
+ function cleanup(): void {
57
+ abortController?.abort();
58
+ abortController = undefined;
59
+ }
60
+
61
+ registerCleanupHandlers(cleanup, logger);
62
+
63
+ //#endregion
64
+
65
+ //#region Helpers
66
+
67
+ function formatResultMessage(msg: {
68
+ text: string;
69
+ location?: { file: string; line: number; column: number } | null;
70
+ }): string {
71
+ if (msg.location != null) {
72
+ return `${msg.location.file}:${String(msg.location.line)}:${String(msg.location.column)} - ${msg.text}`;
73
+ }
74
+ return msg.text;
75
+ }
76
+
77
+ function createBuildOptions(info: ViteBuildInfo): ApplicationBuilderOptions {
78
+ return {
79
+ tsConfig: path.join(info.pkgDir, "tsconfig.json"),
80
+ browser: "src/main.ts",
81
+ index: "src/index.html",
82
+ outputPath: path.join(info.pkgDir, "dist"),
83
+ aot: true,
84
+ };
85
+ }
86
+
87
+ async function writeResultFiles(
88
+ files: Record<string, ResultFile>,
89
+ outputPath: string,
90
+ ): Promise<void> {
91
+ await fs.promises.rm(outputPath, { recursive: true, force: true });
92
+
93
+ for (const [filePath, file] of Object.entries(files)) {
94
+ const fullPath = path.join(outputPath, filePath);
95
+ await fs.promises.mkdir(path.dirname(fullPath), { recursive: true });
96
+
97
+ if (file.origin === "memory") {
98
+ await fs.promises.writeFile(fullPath, (file as any).contents);
99
+ } else {
100
+ await fs.promises.copyFile((file as any).inputPath, fullPath);
101
+ }
102
+ }
103
+ }
104
+
105
+ //#endregion
106
+
107
+ //#region build (one-time production build)
108
+
109
+ async function build(info: ViteBuildInfo): Promise<ViteBuildResult> {
110
+ const buildOptions = createBuildOptions(info);
111
+ const projectRoot = path.relative(info.cwd, info.pkgDir);
112
+ const outputPath = path.join(info.pkgDir, "dist");
113
+
114
+ const context = createAngularBuilderContext({
115
+ workspaceRoot: info.cwd,
116
+ projectName: info.name,
117
+ projectRoot,
118
+ buildOptions: buildOptions as unknown as Record<string, unknown>,
119
+ });
120
+
121
+ try {
122
+ for await (const result of buildApplicationInternal(
123
+ buildOptions,
124
+ context as any,
125
+ )) {
126
+ if (result.kind === ResultKind.Failure) {
127
+ const errors = result.errors.map(formatResultMessage);
128
+ const warnings = result.warnings?.map(formatResultMessage);
129
+ return {
130
+ js: { success: false, errors, warnings },
131
+ dts: { success: true, diagnostics: [] as never[] },
132
+ };
133
+ }
134
+
135
+ if (result.kind === ResultKind.Full) {
136
+ await writeResultFiles(result.files, outputPath);
137
+
138
+ const warnings = result.warnings?.map(formatResultMessage);
139
+ return {
140
+ js: { success: true, warnings },
141
+ dts: { success: true, diagnostics: [] as never[] },
142
+ };
143
+ }
144
+ }
145
+
146
+ return {
147
+ js: { success: false, errors: ["No build result received from buildApplicationInternal"] },
148
+ dts: { success: true, diagnostics: [] as never[] },
149
+ };
150
+ } catch (err) {
151
+ return {
152
+ js: { success: false, errors: [errNs.message(err)] },
153
+ dts: { success: true, diagnostics: [] as never[] },
154
+ };
155
+ } finally {
156
+ await context.disposeTeardowns();
157
+ }
158
+ }
159
+
160
+ //#endregion
161
+
162
+ //#region startWatch / stopWatch
163
+
164
+ const guardStartWatch = (() => {
165
+ let called = false;
166
+ return () => {
167
+ if (called) throw new Error("startWatch() already called");
168
+ called = true;
169
+ };
170
+ })();
171
+
172
+ async function startWatch(info: ViteBuildInfo): Promise<void> {
173
+ guardStartWatch();
174
+
175
+ abortController = new AbortController();
176
+ const buildOptions = createBuildOptions(info);
177
+ const projectRoot = path.relative(info.cwd, info.pkgDir);
178
+
179
+ const context = createAngularBuilderContext({
180
+ workspaceRoot: info.cwd,
181
+ projectName: info.name,
182
+ projectRoot,
183
+ buildOptions: buildOptions as unknown as Record<string, unknown>,
184
+ });
185
+
186
+ try {
187
+ const serverOptions = await normalizeDevServerOptions(
188
+ context as any,
189
+ info.name,
190
+ {
191
+ buildTarget: `${info.name}:build`,
192
+ hmr: true,
193
+ liveReload: true,
194
+ ...(info.port != null ? { port: info.port } : {}),
195
+ } as any,
196
+ );
197
+
198
+ let isInitialBuild = true;
199
+
200
+ for await (const output of serveWithVite(
201
+ serverOptions,
202
+ "@angular/build:application",
203
+ buildApplicationInternal as any,
204
+ context as any,
205
+ )) {
206
+ if (isInitialBuild) {
207
+ isInitialBuild = false;
208
+
209
+ // Extract port from dev server output
210
+ try {
211
+ const url = new URL(output.baseUrl);
212
+ const port = parseInt(url.port, 10);
213
+ if (!isNaN(port)) {
214
+ sender.send("serverReady", { port });
215
+ }
216
+ } catch {
217
+ // URL parsing failed — skip port reporting
218
+ }
219
+
220
+ sender.send("build", {
221
+ js: { success: output.success },
222
+ dts: { success: true },
223
+ });
224
+ } else {
225
+ sender.send("buildStart", {});
226
+ sender.send("build", {
227
+ js: { success: output.success },
228
+ dts: { success: true },
229
+ });
230
+ }
231
+ }
232
+ } catch (err) {
233
+ // AbortError is expected when stopWatch is called
234
+ if (!(err instanceof Error && err.name === "AbortError")) {
235
+ sender.send("error", { message: errNs.message(err) });
236
+ }
237
+ } finally {
238
+ await context.disposeTeardowns();
239
+ }
240
+ }
241
+
242
+ function stopWatch(): void {
243
+ cleanup();
244
+ }
245
+
246
+ //#endregion
247
+
248
+ const sender = createWorker<
249
+ { build: typeof build; startWatch: typeof startWatch; stopWatch: typeof stopWatch },
250
+ ViteBuildWorkerEvents
251
+ >({ build, startWatch, stopWatch });
252
+ export default sender;
@@ -0,0 +1,276 @@
1
+ import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
2
+
3
+ const mocks = vi.hoisted(() => ({
4
+ executeTypecheck: vi.fn(),
5
+ lintWorkerLint: vi.fn(),
6
+ lintWorkerTerminate: vi.fn(async () => {}),
7
+ workerCreate: vi.fn(),
8
+ execa: vi.fn(),
9
+ loadSdConfig: vi.fn(),
10
+ }));
11
+
12
+ vi.mock("../../src/commands/typecheck", () => ({
13
+ executeTypecheck: mocks.executeTypecheck,
14
+ }));
15
+
16
+ vi.mock("@simplysm/core-node", () => ({
17
+ Worker: {
18
+ create: mocks.workerCreate,
19
+ },
20
+ }));
21
+
22
+ vi.mock("@simplysm/core-common", () => ({
23
+ err: { message: (e: unknown) => (e instanceof Error ? e.message : String(e)) },
24
+ SdError: class SdError extends Error {
25
+ constructor(message: string) {
26
+ super(message);
27
+ this.name = "SdError";
28
+ }
29
+ },
30
+ }));
31
+
32
+ vi.mock("../../src/utils/sd-config", () => ({
33
+ loadSdConfig: mocks.loadSdConfig,
34
+ }));
35
+
36
+ vi.mock("execa", () => ({
37
+ execa: mocks.execa,
38
+ }));
39
+
40
+ vi.mock("consola", () => {
41
+ const fns = (): Record<string, unknown> => ({
42
+ debug: vi.fn(), start: vi.fn(), success: vi.fn(),
43
+ info: vi.fn(), error: vi.fn(), warn: vi.fn(), log: vi.fn(),
44
+ withTag: vi.fn(() => fns()),
45
+ level: 0,
46
+ });
47
+ const c = fns();
48
+ return { consola: c, default: c, LogLevels: {} };
49
+ });
50
+
51
+ const { runCheck } = await import("../../src/commands/check");
52
+
53
+ describe("runCheck", () => {
54
+ let savedExitCode: string | number | undefined;
55
+ let writeSpy: ReturnType<typeof vi.spyOn>;
56
+ let stdoutOutput: string;
57
+
58
+ beforeEach(() => {
59
+ vi.clearAllMocks();
60
+ savedExitCode = process.exitCode;
61
+ process.exitCode = undefined;
62
+ stdoutOutput = "";
63
+ writeSpy = vi.spyOn(process.stdout, "write").mockImplementation((chunk: unknown) => {
64
+ stdoutOutput += String(chunk);
65
+ return true;
66
+ });
67
+
68
+ // Default: sdConfig with 3 packages
69
+ mocks.loadSdConfig.mockResolvedValue({
70
+ packages: {
71
+ "core-node": { target: "node" },
72
+ "core-common": { target: "neutral" },
73
+ "storage": { target: "node" },
74
+ },
75
+ });
76
+
77
+ // Default: all pass
78
+ mocks.executeTypecheck.mockResolvedValue({
79
+ success: true, errorCount: 0, warningCount: 0, formattedOutput: "",
80
+ });
81
+ mocks.workerCreate.mockReturnValue({
82
+ lint: vi.fn().mockResolvedValue({
83
+ success: true, errorCount: 0, warningCount: 0, formattedOutput: "",
84
+ }),
85
+ terminate: mocks.lintWorkerTerminate,
86
+ });
87
+ mocks.execa.mockResolvedValue({
88
+ stdout: "Tests 1 passed", stderr: "", exitCode: 0,
89
+ });
90
+ });
91
+
92
+ afterEach(() => {
93
+ process.exitCode = savedExitCode;
94
+ writeSpy.mockRestore();
95
+ });
96
+
97
+ it("runs typecheck, lint, and test in parallel and outputs ALL PASSED", async () => {
98
+ await runCheck({ targets: [], types: ["typecheck", "lint", "test"], fix: false });
99
+
100
+ expect(mocks.executeTypecheck).toHaveBeenCalled();
101
+ expect(mocks.workerCreate).toHaveBeenCalled();
102
+ expect(mocks.execa).toHaveBeenCalled();
103
+ expect(stdoutOutput).toContain("ALL PASSED");
104
+ });
105
+
106
+ it("outputs results in TYPECHECK → LINT → TEST → SUMMARY order", async () => {
107
+ await runCheck({ targets: [], types: ["typecheck", "lint", "test"], fix: false });
108
+
109
+ const tcIdx = stdoutOutput.indexOf("TYPECHECK");
110
+ const lintIdx = stdoutOutput.indexOf("LINT");
111
+ const testIdx = stdoutOutput.indexOf("TEST");
112
+ const summaryIdx = stdoutOutput.indexOf("SUMMARY");
113
+
114
+ expect(tcIdx).toBeLessThan(lintIdx);
115
+ expect(lintIdx).toBeLessThan(testIdx);
116
+ expect(testIdx).toBeLessThan(summaryIdx);
117
+ });
118
+
119
+ it("runs only specified check types", async () => {
120
+ await runCheck({ targets: [], types: ["lint", "test"], fix: false });
121
+
122
+ expect(mocks.executeTypecheck).not.toHaveBeenCalled();
123
+ expect(mocks.workerCreate).toHaveBeenCalled();
124
+ expect(mocks.execa).toHaveBeenCalled();
125
+ });
126
+
127
+ it("outputs FAILED with failing check names when some fail", async () => {
128
+ mocks.executeTypecheck.mockResolvedValue({
129
+ success: false, errorCount: 2, warningCount: 0, formattedOutput: "type errors",
130
+ });
131
+
132
+ await runCheck({ targets: [], types: ["typecheck", "lint", "test"], fix: false });
133
+
134
+ expect(stdoutOutput).toContain("FAILED");
135
+ expect(stdoutOutput).toContain("typecheck");
136
+ expect(process.exitCode).toBe(1);
137
+ });
138
+
139
+ it("sets exitCode to 1 when any check fails", async () => {
140
+ mocks.workerCreate.mockReturnValue({
141
+ lint: vi.fn().mockResolvedValue({
142
+ success: false, errorCount: 1, warningCount: 0, formattedOutput: "lint errors",
143
+ }),
144
+ terminate: mocks.lintWorkerTerminate,
145
+ });
146
+
147
+ await runCheck({ targets: [], types: ["lint"], fix: false });
148
+
149
+ expect(process.exitCode).toBe(1);
150
+ });
151
+
152
+ it("passes targets to vitest subprocess", async () => {
153
+ await runCheck({ targets: ["core-common"], types: ["test"], fix: false });
154
+
155
+ expect(mocks.execa).toHaveBeenCalledWith(
156
+ "pnpm",
157
+ ["vitest", "packages/core-common", "--run"],
158
+ expect.any(Object),
159
+ );
160
+ });
161
+
162
+ it("parses test failure count from vitest output", async () => {
163
+ mocks.execa.mockResolvedValue({
164
+ stdout: "3 tests failed", stderr: "", exitCode: 1,
165
+ });
166
+
167
+ await runCheck({ targets: [], types: ["test"], fix: false });
168
+
169
+ expect(stdoutOutput).toContain("3 failed");
170
+ expect(process.exitCode).toBe(1);
171
+ });
172
+
173
+ it("handles vitest execution error gracefully", async () => {
174
+ mocks.execa.mockRejectedValue(new Error("vitest not found"));
175
+
176
+ await runCheck({ targets: [], types: ["test"], fix: false });
177
+
178
+ expect(process.exitCode).toBe(1);
179
+ });
180
+
181
+ it("passes fix option to lint worker", async () => {
182
+ const lintMock = vi.fn().mockResolvedValue({
183
+ success: true, errorCount: 0, warningCount: 0, formattedOutput: "",
184
+ });
185
+ mocks.workerCreate.mockReturnValue({
186
+ lint: lintMock,
187
+ terminate: mocks.lintWorkerTerminate,
188
+ });
189
+
190
+ await runCheck({ targets: [], types: ["lint"], fix: true });
191
+
192
+ expect(lintMock).toHaveBeenCalledWith(
193
+ expect.objectContaining({ fix: true }),
194
+ );
195
+ });
196
+
197
+ it("defaults fix to false when not specified", async () => {
198
+ const lintMock = vi.fn().mockResolvedValue({
199
+ success: true, errorCount: 0, warningCount: 0, formattedOutput: "",
200
+ });
201
+ mocks.workerCreate.mockReturnValue({
202
+ lint: lintMock,
203
+ terminate: mocks.lintWorkerTerminate,
204
+ });
205
+
206
+ await runCheck({ targets: [], types: ["lint"], fix: false });
207
+
208
+ expect(lintMock).toHaveBeenCalledWith(
209
+ expect.objectContaining({ fix: false }),
210
+ );
211
+ });
212
+
213
+ // --- Feature 1.1: target validation ---
214
+
215
+ it("normalizes package name target to path for typecheck", async () => {
216
+ await runCheck({ targets: ["core-node"], types: ["typecheck"], fix: false });
217
+
218
+ expect(mocks.executeTypecheck).toHaveBeenCalledWith(
219
+ expect.objectContaining({ targets: ["packages/core-node"] }),
220
+ );
221
+ });
222
+
223
+ it("normalizes multiple package name targets to paths for typecheck", async () => {
224
+ await runCheck({ targets: ["core-node", "core-common"], types: ["typecheck"], fix: false });
225
+
226
+ expect(mocks.executeTypecheck).toHaveBeenCalledWith(
227
+ expect.objectContaining({ targets: ["packages/core-node", "packages/core-common"] }),
228
+ );
229
+ });
230
+
231
+ it("normalizes package name target to path for lint", async () => {
232
+ const lintMock = vi.fn().mockResolvedValue({
233
+ success: true, errorCount: 0, warningCount: 0, formattedOutput: "",
234
+ });
235
+ mocks.workerCreate.mockReturnValue({
236
+ lint: lintMock,
237
+ terminate: mocks.lintWorkerTerminate,
238
+ });
239
+
240
+ await runCheck({ targets: ["core-node"], types: ["lint"], fix: false });
241
+
242
+ expect(lintMock).toHaveBeenCalledWith(
243
+ expect.objectContaining({ targets: ["packages/core-node"] }),
244
+ );
245
+ });
246
+
247
+ it("normalizes package name target to path for test", async () => {
248
+ await runCheck({ targets: ["core-node"], types: ["test"], fix: false });
249
+
250
+ expect(mocks.execa).toHaveBeenCalledWith(
251
+ "pnpm",
252
+ ["vitest", "packages/core-node", "--run"],
253
+ expect.any(Object),
254
+ );
255
+ });
256
+
257
+ it("throws error for unknown target", async () => {
258
+ await expect(
259
+ runCheck({ targets: ["nonexistent"], types: ["typecheck"], fix: false }),
260
+ ).rejects.toThrow("Unknown target: nonexistent");
261
+ });
262
+
263
+ it("throws error listing all unknown targets when some are invalid", async () => {
264
+ await expect(
265
+ runCheck({ targets: ["core-node", "nonexistent"], types: ["typecheck"], fix: false }),
266
+ ).rejects.toThrow("Unknown target: nonexistent");
267
+ });
268
+
269
+ it("runs all packages when targets is empty", async () => {
270
+ await runCheck({ targets: [], types: ["typecheck"], fix: false });
271
+
272
+ expect(mocks.executeTypecheck).toHaveBeenCalledWith(
273
+ expect.objectContaining({ targets: [] }),
274
+ );
275
+ });
276
+ });
@@ -0,0 +1,53 @@
1
+ import { describe, it, expect, vi, beforeEach } from "vitest";
2
+
3
+ const mocks = vi.hoisted(() => ({
4
+ initialize: vi.fn(async () => {}),
5
+ start: vi.fn(async () => {}),
6
+ awaitTermination: vi.fn(async () => {}),
7
+ shutdown: vi.fn(async () => {}),
8
+ ctor: vi.fn(),
9
+ }));
10
+
11
+ vi.mock("../../src/orchestrators/DevWatchOrchestrator", () => ({
12
+ DevWatchOrchestrator: vi.fn().mockImplementation(function (this: any, options: any) {
13
+ mocks.ctor(options);
14
+ this.initialize = mocks.initialize;
15
+ this.start = mocks.start;
16
+ this.awaitTermination = mocks.awaitTermination;
17
+ this.shutdown = mocks.shutdown;
18
+ }),
19
+ }));
20
+
21
+ const { runDev } = await import("../../src/commands/dev");
22
+
23
+ describe("runDev", () => {
24
+ beforeEach(() => {
25
+ vi.clearAllMocks();
26
+ mocks.initialize.mockResolvedValue(undefined);
27
+ mocks.start.mockResolvedValue(undefined);
28
+ mocks.awaitTermination.mockResolvedValue(undefined);
29
+ mocks.shutdown.mockResolvedValue(undefined);
30
+ });
31
+
32
+ it("creates DevWatchOrchestrator with mode:dev and runs lifecycle", async () => {
33
+ await runDev({ targets: ["service-server"], options: [] });
34
+
35
+ expect(mocks.ctor).toHaveBeenCalledWith({
36
+ mode: "dev",
37
+ targets: ["service-server"],
38
+ options: [],
39
+ });
40
+
41
+ expect(mocks.initialize).toHaveBeenCalledOnce();
42
+ expect(mocks.start).toHaveBeenCalledOnce();
43
+ expect(mocks.awaitTermination).toHaveBeenCalledOnce();
44
+ expect(mocks.shutdown).toHaveBeenCalledOnce();
45
+ });
46
+
47
+ it("calls shutdown even when start throws", async () => {
48
+ mocks.start.mockRejectedValueOnce(new Error("build error"));
49
+
50
+ await expect(runDev({ targets: [], options: [] })).rejects.toThrow("build error");
51
+ expect(mocks.shutdown).toHaveBeenCalledOnce();
52
+ });
53
+ });