@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,744 +0,0 @@
1
- import path from "path";
2
- import { Worker, type WorkerProxy } from "@simplysm/core-node";
3
- import { err as errNs } from "@simplysm/core-common";
4
- import type { SdConfig, SdClientPackageConfig, SdServerPackageConfig } from "../sd-config.types";
5
- import { consola } from "consola";
6
- import { loadSdConfig } from "../utils/sd-config";
7
- import { getVersion } from "../utils/build-env";
8
- import { watchReplaceDeps, type WatchReplaceDepResult } from "../utils/replace-deps";
9
- import type * as ClientWorkerModule from "../workers/client.worker";
10
- import type * as ServerWorkerModule from "../workers/server.worker";
11
- import type * as ServerRuntimeWorkerModule from "../workers/server-runtime.worker";
12
- import { Capacitor } from "../capacitor/capacitor";
13
- import { filterPackagesByTargets } from "../utils/package-utils";
14
- import type { BuildResult } from "../infra/ResultCollector";
15
- import { formatBuildMessages, printErrors, printServers } from "../utils/output-utils";
16
- import { RebuildManager } from "../utils/rebuild-manager";
17
- import {
18
- registerWorkerEventHandlers,
19
- type ServerReadyEventData,
20
- type ServerBuildEventData,
21
- type ErrorEventData,
22
- } from "../utils/worker-events";
23
- import { SignalHandler } from "../infra/SignalHandler";
24
-
25
- //#region Types
26
-
27
- /**
28
- * Dev Orchestrator options
29
- */
30
- export interface DevOrchestratorOptions {
31
- /** Filter for packages to develop (empty array means all packages) */
32
- targets: string[];
33
- options: string[];
34
- }
35
-
36
- /**
37
- * Client Worker info (for Vite dev server)
38
- */
39
- interface ClientWorkerInfo {
40
- name: string;
41
- config: SdClientPackageConfig;
42
- worker: WorkerProxy<typeof ClientWorkerModule>;
43
- isInitialBuild: boolean;
44
- buildResolver: (() => void) | undefined;
45
- }
46
-
47
- /**
48
- * Options for client worker setup
49
- */
50
- interface ClientSetupOptions {
51
- workers: ClientWorkerInfo[];
52
- /** Called on serverReady event. If undefined, completeTask is called with running status. */
53
- onServerReady?: (workerInfo: ClientWorkerInfo, port: number, completeTask: (result: BuildResult) => void) => void;
54
- /** Called on error event (in addition to default error handling) */
55
- onError?: (workerInfo: ClientWorkerInfo) => void;
56
- /** Create the config to pass to worker.startWatch() */
57
- createConfig: (workerInfo: ClientWorkerInfo) => SdClientPackageConfig;
58
- }
59
-
60
- //#endregion
61
-
62
- //#region DevOrchestrator
63
-
64
- /**
65
- * Orchestrator that coordinates dev mode execution
66
- *
67
- * Manages development mode execution for Client and Server packages.
68
- * - `client` target: Start Vite dev server
69
- * - `server` target: Server Build Worker + Server Runtime Worker
70
- * - Support for Server-Client proxy connections
71
- * - Support for Capacitor initialization
72
- * - Shutdown via SIGINT/SIGTERM signals
73
- */
74
- export class DevOrchestrator {
75
- private readonly _options: DevOrchestratorOptions;
76
- private readonly _logger = consola.withTag("sd:cli:dev");
77
- private readonly _cwd: string;
78
-
79
- // Config
80
- private _sdConfig: SdConfig | undefined;
81
- private _baseEnv: { VER: string; DEV: string } | undefined;
82
- // Package classification
83
- private readonly _serverPackages: Array<{ name: string; config: SdServerPackageConfig }> = [];
84
- private readonly _clientPackages: Array<{ name: string; config: SdClientPackageConfig }> = [];
85
- private readonly _serverClientsMap = new Map<string, string[]>();
86
- private _hasPackages = false;
87
-
88
- // Workers
89
- private _standaloneClientWorkers: ClientWorkerInfo[] = [];
90
- private _viteClientWorkers: ClientWorkerInfo[] = [];
91
- private readonly _serverBuildWorkers = new Map<
92
- string,
93
- {
94
- worker: WorkerProxy<typeof ServerWorkerModule>;
95
- buildPromise: Promise<void>;
96
- buildResolver: () => void;
97
- mainJsPath?: string;
98
- }
99
- >();
100
- private readonly _serverRuntimeWorkers = new Map<
101
- string,
102
- WorkerProxy<typeof ServerRuntimeWorkerModule>
103
- >();
104
-
105
- // State
106
- private readonly _results = new Map<string, BuildResult>();
107
- private _clientPorts: Record<string, number> = {};
108
- private _rebuildManager!: RebuildManager;
109
- private _signalHandler!: SignalHandler;
110
- private _replaceDepWatcher: WatchReplaceDepResult | undefined;
111
- private _printServersTimer: ReturnType<typeof setTimeout> | undefined;
112
-
113
- constructor(options: DevOrchestratorOptions) {
114
- this._cwd = process.cwd();
115
- this._options = options;
116
- }
117
-
118
- /**
119
- * Print server URL (debounce 300ms)
120
- *
121
- * Prevents duplicate output when server rebuild and scope rebuild occur simultaneously.
122
- */
123
- private _schedulePrintServers(): void {
124
- if (this._printServersTimer != null) clearTimeout(this._printServersTimer);
125
- this._printServersTimer = setTimeout(() => {
126
- printServers(this._results, this._serverClientsMap);
127
- }, 300);
128
- }
129
-
130
- /**
131
- * Initialize Orchestrator
132
- * - Load sd.config.ts
133
- * - Classify packages
134
- * - Prepare environment variables
135
- */
136
- async initialize(): Promise<void> {
137
- const { targets } = this._options;
138
- this._logger.debug("Starting dev mode", { targets });
139
-
140
- // Load sd.config.ts (required for dev mode to access package build information)
141
- try {
142
- this._sdConfig = await loadSdConfig({
143
- cwd: this._cwd,
144
- dev: true,
145
- options: this._options.options,
146
- });
147
- this._logger.debug("sd.config.ts loaded successfully");
148
- } catch (err) {
149
- this._logger.error(`Failed to load sd.config.ts: ${err instanceof Error ? err.message : err}`);
150
- process.exitCode = 1;
151
- throw err;
152
- }
153
-
154
- // Start watch for replaceDeps if configured (initial replacement is handled in sd-cli.ts)
155
- if (this._sdConfig.replaceDeps != null) {
156
- this._replaceDepWatcher = await watchReplaceDeps(this._cwd, this._sdConfig.replaceDeps);
157
- }
158
-
159
- // Prepare VER, DEV environment variables
160
- const version = await getVersion(this._cwd);
161
- this._baseEnv = { VER: version, DEV: "true" };
162
-
163
- // Filter targets
164
- const allPackages = filterPackagesByTargets(this._sdConfig.packages, targets);
165
-
166
- // Filter only client/server packages
167
- for (const [name, config] of Object.entries(allPackages)) {
168
- if (config.target === "server") {
169
- this._serverPackages.push({ name, config });
170
- } else if (config.target === "client") {
171
- this._clientPackages.push({ name, config });
172
- }
173
- }
174
-
175
- if (this._serverPackages.length === 0 && this._clientPackages.length === 0) {
176
- process.stdout.write("⚠ No client/server packages to develop.\n");
177
- return;
178
- }
179
-
180
- this._hasPackages = true;
181
-
182
- // Find clients connected to servers (only if server is a dev target)
183
- const serverNames = new Set(this._serverPackages.map(({ name }) => name));
184
- for (const { name, config } of this._clientPackages) {
185
- if (typeof config.server === "string" && serverNames.has(config.server)) {
186
- const clients = this._serverClientsMap.get(config.server) ?? [];
187
- clients.push(name);
188
- this._serverClientsMap.set(config.server, clients);
189
- }
190
- }
191
-
192
- // Initialize infrastructure
193
- this._rebuildManager = new RebuildManager(this._logger);
194
- this._signalHandler = new SignalHandler();
195
-
196
- // Print errors and server URL when batch is complete
197
- this._rebuildManager.on("batchComplete", () => {
198
- printErrors(this._results);
199
- this._schedulePrintServers();
200
- });
201
- }
202
-
203
- /**
204
- * Start dev mode
205
- * - Create workers
206
- * - Register event handlers
207
- * - Initial build and server startup
208
- * - Initialize Capacitor
209
- */
210
- async start(): Promise<void> {
211
- if (!this._hasPackages) {
212
- return;
213
- }
214
-
215
- const serverNames = new Set(this._serverPackages.map(({ name }) => name));
216
-
217
- // Worker paths
218
- const clientWorkerPath = import.meta.resolve("../workers/client.worker");
219
- const serverWorkerPath = import.meta.resolve("../workers/server.worker");
220
- const serverRuntimeWorkerPath = import.meta.resolve("../workers/server-runtime.worker");
221
-
222
- // Standalone client cases:
223
- // - server is a number
224
- // - server is a string but the server is not a dev target
225
- this._standaloneClientWorkers = this._clientPackages
226
- .filter(
227
- ({ config }) =>
228
- typeof config.server === "number" ||
229
- (typeof config.server === "string" && !serverNames.has(config.server)),
230
- )
231
- .map(({ name, config }) => ({
232
- name,
233
- config,
234
- worker: Worker.create<typeof ClientWorkerModule>(clientWorkerPath),
235
- isInitialBuild: true,
236
- buildResolver: undefined,
237
- }));
238
-
239
- // Vite workers for clients connected to servers (only if server is a dev target)
240
- this._viteClientWorkers = this._clientPackages
241
- .filter(({ config }) => typeof config.server === "string" && serverNames.has(config.server))
242
- .map(({ name, config }) => ({
243
- name,
244
- config,
245
- worker: Worker.create<typeof ClientWorkerModule>(clientWorkerPath),
246
- isInitialBuild: true,
247
- buildResolver: undefined,
248
- }));
249
-
250
- // Setup and start workers for each section
251
- const standaloneClientPromises = this._setupClientWorkers({
252
- workers: this._standaloneClientWorkers,
253
- createConfig: (workerInfo) => ({
254
- ...workerInfo.config,
255
- env: { ...this._baseEnv, ...workerInfo.config.env },
256
- }),
257
- });
258
-
259
- // Vite client ready promises (server waits for client ports before starting runtime)
260
- const viteClientReadyPromises = new Map<string, { promise: Promise<void>; resolver: () => void }>();
261
- for (const workerInfo of this._viteClientWorkers) {
262
- let readyResolver!: () => void;
263
- const readyPromise = new Promise<void>((resolve) => {
264
- readyResolver = resolve;
265
- });
266
- viteClientReadyPromises.set(workerInfo.name, {
267
- promise: readyPromise,
268
- resolver: readyResolver,
269
- });
270
- }
271
-
272
- const viteClientPromises = this._setupClientWorkers({
273
- workers: this._viteClientWorkers,
274
- onServerReady: (workerInfo, port, completeTask) => {
275
- this._logger.debug(`[${workerInfo.name}] Vite serverReady (port: ${String(port)})`);
276
- this._clientPorts[workerInfo.name] = port;
277
- // Notify Vite server ready (server is waiting for proxy setup)
278
- viteClientReadyPromises.get(workerInfo.name)?.resolver();
279
- // Call completeTask for build completion (Vite doesn't emit build event)
280
- completeTask({
281
- name: workerInfo.name,
282
- target: workerInfo.config.target,
283
- type: "build",
284
- status: "success",
285
- });
286
- },
287
- onError: (workerInfo) => {
288
- // Also resolve readyPromises on Vite client error
289
- // (prevent server from hanging indefinitely in await Promise.all(clientReadyPromises))
290
- viteClientReadyPromises.get(workerInfo.name)?.resolver();
291
- },
292
- createConfig: (workerInfo) => ({
293
- ...workerInfo.config,
294
- server: 0, // Vite will automatically assign port
295
- env: { ...this._baseEnv, ...workerInfo.config.env },
296
- }),
297
- });
298
-
299
- const serverPromises = this._setupServers(
300
- serverWorkerPath,
301
- serverRuntimeWorkerPath,
302
- viteClientReadyPromises,
303
- );
304
-
305
- // Wait for initial build to complete (parallel execution)
306
- this._logger.debug("Starting initial build (Promise.allSettled)");
307
- const initialBuildPromises: Array<{ name: string; promise: Promise<void> }> = [
308
- ...standaloneClientPromises,
309
- ...viteClientPromises,
310
- ...serverPromises,
311
- ];
312
-
313
- const initialResults = await Promise.allSettled(
314
- initialBuildPromises.map((item) => item.promise),
315
- );
316
-
317
- initialResults.forEach((result, index) => {
318
- const taskName = initialBuildPromises[index].name;
319
- if (result.status === "rejected") {
320
- this._logger.debug(`[${taskName}] Initial build failed:`, result.reason);
321
- } else {
322
- this._logger.debug(`[${taskName}] Initial build completed`);
323
- }
324
- });
325
-
326
- // Initialize Capacitor (for packages in client target with capacitor configuration)
327
- const capacitorPackages: Array<[string, SdClientPackageConfig]> = [];
328
- for (const { name, config } of this._clientPackages) {
329
- if (config.capacitor != null) {
330
- capacitorPackages.push([name, config]);
331
- }
332
- }
333
-
334
- if (capacitorPackages.length > 0) {
335
- for (const [name, config] of capacitorPackages) {
336
- const taskName = `${name} (capacitor)`;
337
- this._logger.start(taskName);
338
- const pkgDir = path.join(this._cwd, "packages", name);
339
- try {
340
- const cap = await Capacitor.create(pkgDir, config.capacitor!, config.exclude);
341
- await cap.initialize();
342
- this._results.set(`${name}:capacitor`, {
343
- name,
344
- target: "client",
345
- type: "capacitor",
346
- status: "success",
347
- });
348
- this._logger.success(taskName);
349
- } catch (err) {
350
- this._results.set(`${name}:capacitor`, {
351
- name,
352
- target: "client",
353
- type: "capacitor",
354
- status: "error",
355
- message: errNs.message(err),
356
- });
357
- this._logger.fail(taskName);
358
- }
359
- }
360
- }
361
-
362
- // Print initial build results
363
- printErrors(this._results);
364
- printServers(this._results, this._serverClientsMap);
365
- }
366
-
367
- /**
368
- * Setup and start client workers (unified for standalone and server-connected clients)
369
- */
370
- private _setupClientWorkers(opts: ClientSetupOptions): Array<{ name: string; promise: Promise<void> }> {
371
- const buildPromises = new Map<string, Promise<void>>();
372
- for (const workerInfo of opts.workers) {
373
- buildPromises.set(
374
- workerInfo.name,
375
- new Promise<void>((resolve) => {
376
- workerInfo.buildResolver = resolve;
377
- }),
378
- );
379
- }
380
-
381
- // Register event handlers
382
- for (const workerInfo of opts.workers) {
383
- const completeTask = registerWorkerEventHandlers(
384
- workerInfo,
385
- {
386
- resultKey: `${workerInfo.name}:build`,
387
- listrTitle: `${workerInfo.name} (client)`,
388
- resultType: "build",
389
- },
390
- this._results,
391
- this._rebuildManager,
392
- );
393
-
394
- // serverReady (Vite dev server)
395
- workerInfo.worker.on("serverReady", (data) => {
396
- const event = data as ServerReadyEventData;
397
- if (opts.onServerReady != null) {
398
- opts.onServerReady(workerInfo, event.port, completeTask);
399
- } else {
400
- completeTask({
401
- name: workerInfo.name,
402
- target: workerInfo.config.target,
403
- type: "server",
404
- status: "running",
405
- port: event.port,
406
- });
407
- }
408
- });
409
-
410
- // Additional error handling (in addition to default from registerWorkerEventHandlers)
411
- if (opts.onError != null) {
412
- workerInfo.worker.on("error", () => {
413
- opts.onError!(workerInfo);
414
- });
415
- }
416
-
417
- // Print server URL when scope package rebuild is detected
418
- workerInfo.worker.on("scopeRebuild", () => {
419
- this._schedulePrintServers();
420
- });
421
-
422
- // Start worker
423
- const pkgDir = path.join(this._cwd, "packages", workerInfo.name);
424
- const clientConfig = opts.createConfig(workerInfo);
425
- workerInfo.worker
426
- .startWatch({
427
- name: workerInfo.name,
428
- config: clientConfig,
429
- cwd: this._cwd,
430
- pkgDir,
431
- replaceDeps: this._sdConfig!.replaceDeps,
432
- })
433
- .catch((err: unknown) => {
434
- completeTask({
435
- name: workerInfo.name,
436
- target: workerInfo.config.target,
437
- type: "build",
438
- status: "error",
439
- message: errNs.message(err),
440
- });
441
- });
442
- }
443
-
444
- return opts.workers.map((workerInfo) => ({
445
- name: `${workerInfo.name} (client)`,
446
- promise: buildPromises.get(workerInfo.name) ?? Promise.resolve(),
447
- }));
448
- }
449
-
450
- /**
451
- * Setup and start Server Build/Runtime workers
452
- */
453
- private _setupServers(
454
- serverWorkerPath: string,
455
- serverRuntimeWorkerPath: string,
456
- viteClientReadyPromises: Map<string, { promise: Promise<void>; resolver: () => void }>,
457
- ): Array<{ name: string; promise: Promise<void> }> {
458
- // Create Server Build Worker and promise
459
- for (const { name } of this._serverPackages) {
460
- let resolver!: () => void;
461
- const promise = new Promise<void>((resolve) => {
462
- resolver = resolve;
463
- });
464
- this._serverBuildWorkers.set(name, {
465
- worker: Worker.create<typeof ServerWorkerModule>(serverWorkerPath),
466
- buildPromise: promise,
467
- buildResolver: resolver,
468
- });
469
- }
470
-
471
- // Server Runtime Promise (wait for initial server startup to complete)
472
- const serverRuntimePromises = new Map<
473
- string,
474
- { promise: Promise<void>; resolver: () => void }
475
- >();
476
- for (const { name } of this._serverPackages) {
477
- let resolver!: () => void;
478
- const promise = new Promise<void>((resolve) => {
479
- resolver = resolve;
480
- });
481
- serverRuntimePromises.set(name, { promise, resolver });
482
- }
483
-
484
- // Track first build state per server
485
- const isFirstBuild = new Map<string, boolean>(
486
- this._serverPackages.map(({ name }) => [name, true])
487
- );
488
-
489
- // Helper to encapsulate result + promise resolution pattern
490
- const resolveServerStep = (serverName: string, resultKey: string, result: BuildResult): void => {
491
- this._results.set(resultKey, result);
492
- if (isFirstBuild.get(serverName)) {
493
- isFirstBuild.set(serverName, false);
494
- serverRuntimePromises.get(serverName)?.resolver();
495
- }
496
- const updatedBuild = this._serverBuildWorkers.get(serverName)!;
497
- updatedBuild.buildResolver();
498
- };
499
-
500
- // Register Server Build Worker event handlers
501
- for (const { name, config } of this._serverPackages) {
502
- const serverBuild = this._serverBuildWorkers.get(name)!;
503
-
504
- serverBuild.worker.on("buildStart", () => {
505
- if (!isFirstBuild.get(name)) {
506
- // Register with RebuildManager on rebuild
507
- const resolver = this._rebuildManager.registerBuild(`${name}:server`, `${name} (server)`);
508
- this._serverBuildWorkers.set(name, {
509
- ...serverBuild,
510
- buildResolver: resolver,
511
- });
512
- }
513
- });
514
-
515
- serverBuild.worker.on("build", (data) => {
516
- const event = data as ServerBuildEventData;
517
- this._logger.debug(`[${name}] server build: success=${String(event.success)}`);
518
-
519
- // Print warnings
520
- if (event.warnings != null && event.warnings.length > 0) {
521
- this._logger.warn(formatBuildMessages(name, "server", event.warnings));
522
- }
523
-
524
- if (!event.success) {
525
- resolveServerStep(name, `${name}:build`, {
526
- name,
527
- target: "server",
528
- type: "build",
529
- status: "error",
530
- message: event.errors?.join("\n"),
531
- });
532
- return;
533
- }
534
-
535
- // Start runtime worker on build success (separate async function to prevent error propagation)
536
- void this._startServerRuntime(
537
- name,
538
- event.mainJsPath,
539
- serverRuntimeWorkerPath,
540
- serverRuntimePromises,
541
- resolveServerStep,
542
- viteClientReadyPromises,
543
- { ...this._baseEnv, ...config.env },
544
- ).catch((err: unknown) => {
545
- const message = errNs.message(err);
546
- this._logger.error(`[${name}] Error starting Server Runtime:`, message);
547
-
548
- resolveServerStep(name, `${name}:server`, {
549
- name,
550
- target: "server",
551
- type: "server",
552
- status: "error",
553
- message,
554
- });
555
- });
556
- });
557
-
558
- serverBuild.worker.on("error", (data) => {
559
- const event = data as ErrorEventData;
560
- resolveServerStep(name, `${name}:build`, {
561
- name,
562
- target: "server",
563
- type: "build",
564
- status: "error",
565
- message: event.message,
566
- });
567
- });
568
- }
569
-
570
- // Start Server Build workers
571
- for (const { name, config } of this._serverPackages) {
572
- const pkgDir = path.join(this._cwd, "packages", name);
573
- const serverBuild = this._serverBuildWorkers.get(name)!;
574
- serverBuild.worker
575
- .startWatch({
576
- name,
577
- cwd: this._cwd,
578
- pkgDir,
579
- replaceDeps: this._sdConfig!.replaceDeps,
580
- env: { ...this._baseEnv, ...config.env },
581
- configs: config.configs,
582
- externals: config.externals,
583
- })
584
- .catch((err: unknown) => {
585
- this._results.set(`${name}:build`, {
586
- name,
587
- target: "server",
588
- type: "build",
589
- status: "error",
590
- message: errNs.message(err),
591
- });
592
- serverRuntimePromises.get(name)?.resolver();
593
- serverBuild.buildResolver();
594
- });
595
- }
596
-
597
- return this._serverPackages.map(({ name }) => ({
598
- name: `${name} (server)`,
599
- promise: serverRuntimePromises.get(name)?.promise ?? Promise.resolve(),
600
- }));
601
- }
602
-
603
- /**
604
- * Start server runtime worker.
605
- * Separated as a dedicated method to catch errors from async event handlers.
606
- */
607
- private async _startServerRuntime(
608
- serverName: string,
609
- mainJsPath: string,
610
- serverRuntimeWorkerPath: string,
611
- serverRuntimePromises: Map<string, { promise: Promise<void>; resolver: () => void }>,
612
- resolveServerStep: (serverName: string, resultKey: string, result: BuildResult) => void,
613
- viteClientReadyPromises: Map<string, { promise: Promise<void>; resolver: () => void }>,
614
- env?: Record<string, string>,
615
- ): Promise<void> {
616
- const runtimeStartTime = performance.now();
617
- this._logger.debug(`[${serverName}] _startServerRuntime: ${mainJsPath}`);
618
- const updatedBuild = this._serverBuildWorkers.get(serverName)!;
619
- updatedBuild.mainJsPath = mainJsPath;
620
-
621
- // Terminate existing Server Runtime Worker
622
- const existingRuntime = this._serverRuntimeWorkers.get(serverName);
623
- if (existingRuntime != null) {
624
- this._logger.info(`[${serverName}] Restarting server...`);
625
- const terminateStart = performance.now();
626
- await existingRuntime.terminate();
627
- this._logger.debug(
628
- `[${serverName}] Previous runtime terminated (${Math.round(performance.now() - terminateStart)}ms)`,
629
- );
630
- }
631
-
632
- // Create and start new Server Runtime Worker
633
- this._logger.debug(`[${serverName}] Creating runtime worker...`);
634
- const runtimeWorker = Worker.create<typeof ServerRuntimeWorkerModule>(serverRuntimeWorkerPath);
635
- this._serverRuntimeWorkers.set(serverName, runtimeWorker);
636
-
637
- // Wait for Vite servers of clients connected to this server to be ready
638
- const connectedClients = this._serverClientsMap.get(serverName) ?? [];
639
- const clientReadyPromises = connectedClients
640
- .map((clientName) => viteClientReadyPromises.get(clientName)?.promise)
641
- .filter((p): p is Promise<void> => p != null);
642
- this._logger.debug(
643
- `[${serverName}] Waiting for clients: ${String(clientReadyPromises.length)} total`,
644
- );
645
- if (clientReadyPromises.length > 0) {
646
- const waitStart = performance.now();
647
- await Promise.all(clientReadyPromises);
648
- this._logger.debug(
649
- `[${serverName}] Clients ready (${Math.round(performance.now() - waitStart)}ms)`,
650
- );
651
- }
652
-
653
- // Collect client ports for this server
654
- const serverClientPorts: Record<string, number> = {};
655
- for (const clientName of connectedClients) {
656
- if (clientName in this._clientPorts) {
657
- serverClientPorts[clientName] = this._clientPorts[clientName];
658
- }
659
- }
660
- this._logger.debug(
661
- `[${serverName}] Client ports: ${JSON.stringify(serverClientPorts)}`,
662
- );
663
-
664
- // Server Runtime event handlers
665
- runtimeWorker.on("serverReady", (readyData) => {
666
- const readyEvent = readyData as ServerReadyEventData;
667
- resolveServerStep(serverName, `${serverName}:server`, {
668
- name: serverName,
669
- target: "server",
670
- type: "server",
671
- status: "running",
672
- port: readyEvent.port,
673
- });
674
- });
675
-
676
- runtimeWorker.on("error", (errorData) => {
677
- const errorEvent = errorData as ErrorEventData;
678
- resolveServerStep(serverName, `${serverName}:server`, {
679
- name: serverName,
680
- target: "server",
681
- type: "server",
682
- status: "error",
683
- message: errorEvent.message,
684
- });
685
- });
686
-
687
- // Start Server Runtime
688
- // If worker crashes, it terminates without emitting "serverReady"/"error" events,
689
- // so catch promise rejection to prevent hanging
690
- this._logger.debug(
691
- `[${serverName}] Starting runtime worker... (setup took ${Math.round(performance.now() - runtimeStartTime)}ms)`,
692
- );
693
- runtimeWorker
694
- .start({
695
- mainJsPath,
696
- clientPorts: serverClientPorts,
697
- env,
698
- })
699
- .catch((err: unknown) => {
700
- const message = errNs.message(err);
701
- this._logger.error(`[${serverName}] Server Runtime Worker crashed:`, message);
702
-
703
- resolveServerStep(serverName, `${serverName}:server`, {
704
- name: serverName,
705
- target: "server",
706
- type: "server",
707
- status: "error",
708
- message,
709
- });
710
- });
711
- }
712
-
713
- /**
714
- * Wait for termination signal
715
- */
716
- async awaitTermination(): Promise<void> {
717
- if (!this._hasPackages) {
718
- return;
719
- }
720
- await this._signalHandler.waitForTermination();
721
- }
722
-
723
- /**
724
- * Shutdown orchestrator
725
- */
726
- async shutdown(): Promise<void> {
727
- if (!this._hasPackages) {
728
- return;
729
- }
730
-
731
- // Terminate workers (all workers)
732
- process.stdout.write("⏳ Shutting down...\n");
733
- await Promise.all([
734
- ...this._standaloneClientWorkers.map(({ worker }) => worker.terminate()),
735
- ...this._viteClientWorkers.map(({ worker }) => worker.terminate()),
736
- ...[...this._serverBuildWorkers.values()].map(({ worker }) => worker.terminate()),
737
- ...[...this._serverRuntimeWorkers.values()].map((worker) => worker.terminate()),
738
- ]);
739
- this._replaceDepWatcher?.dispose();
740
- process.stdout.write("✔ Done\n");
741
- }
742
- }
743
-
744
- //#endregion