@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
@@ -0,0 +1,146 @@
1
+ import path from "path";
2
+ import { createWorker, FsWatcher } from "@simplysm/core-node";
3
+ import { err as errNs } from "@simplysm/core-common";
4
+ import { consola } from "consola";
5
+ import { registerCleanupHandlers, createOnceGuard, applyDebugLevel } from "../utils/worker-utils";
6
+ import {
7
+ runNgtscBuild,
8
+ runNgtscRebuild,
9
+ type NgtscBuildInfo,
10
+ type NgtscBuildResult,
11
+ type NgtscCombinedBuildEvent,
12
+ } from "../utils/ngtsc-build-core";
13
+ import type { NgtscProgram } from "../utils/angular-build";
14
+ import { collectDeps } from "../utils/package-utils";
15
+
16
+ applyDebugLevel();
17
+
18
+ //#region Types (re-export for worker interface)
19
+
20
+ export type { NgtscBuildInfo, NgtscBuildResult, NgtscCombinedBuildEvent };
21
+
22
+ export interface NgtscBuildWorkerEvents extends Record<string, unknown> {
23
+ buildStart: Record<string, never>;
24
+ build: NgtscCombinedBuildEvent;
25
+ error: { message: string };
26
+ }
27
+
28
+ //#endregion
29
+
30
+ //#region Resource Management
31
+
32
+ const logger = consola.withTag("sd:cli:ngtsc-build:worker");
33
+
34
+ let fsWatcher: FsWatcher | undefined;
35
+
36
+ async function cleanup(): Promise<void> {
37
+ const watcherToClose = fsWatcher;
38
+ fsWatcher = undefined;
39
+
40
+ if (watcherToClose != null) {
41
+ await watcherToClose.close();
42
+ }
43
+ }
44
+
45
+ registerCleanupHandlers(cleanup, logger);
46
+
47
+ //#endregion
48
+
49
+ //#region build (one-time build)
50
+
51
+ async function build(info: NgtscBuildInfo): Promise<NgtscBuildResult> {
52
+ return runNgtscBuild(info);
53
+ }
54
+
55
+ //#endregion
56
+
57
+ //#region startWatch (watch mode)
58
+
59
+ const guardStartWatch = createOnceGuard("startWatch");
60
+
61
+ let watchInfo: NgtscBuildInfo | undefined;
62
+ let oldProgram: NgtscProgram | undefined;
63
+ let currentScssDependencies: Map<string, Set<string>> | undefined;
64
+
65
+ async function startWatch(info: NgtscBuildInfo): Promise<void> {
66
+ guardStartWatch();
67
+ watchInfo = info;
68
+
69
+ try {
70
+ // Initial build
71
+ const { result: initialResult, program, scssDependencies: initialDeps } =
72
+ await runNgtscRebuild(info);
73
+ oldProgram = program;
74
+ currentScssDependencies = initialDeps;
75
+ sender.send("build", initialResult);
76
+
77
+ // Collect workspace dependency paths
78
+ const { workspaceDeps } = collectDeps(info.pkgDir, info.cwd);
79
+
80
+ // Start FsWatcher — own src/ + scss/ + workspace deps' src/ + scss/
81
+ const watchPaths = [
82
+ path.join(info.pkgDir, "src", "**", "*.{ts,tsx,scss,css}"),
83
+ path.join(info.pkgDir, "scss", "**", "*.{scss,css}"),
84
+ ...workspaceDeps.flatMap((d) => {
85
+ const depDir = path.join(info.cwd, "packages", d);
86
+ return [
87
+ path.join(depDir, "src", "**", "*.{ts,tsx,scss,css}"),
88
+ path.join(depDir, "scss", "**", "*.{scss,css}"),
89
+ ];
90
+ }),
91
+ ];
92
+ fsWatcher = await FsWatcher.watch(watchPaths);
93
+
94
+ fsWatcher.onChange({ delay: 300 }, async (changedFiles) => {
95
+ try {
96
+ sender.send("buildStart", {});
97
+
98
+ // Collect modified resource files (.scss/.css)
99
+ const modifiedResourceFiles = new Set<string>();
100
+ for (const f of changedFiles) {
101
+ if (f.path.endsWith(".scss") || f.path.endsWith(".css")) {
102
+ modifiedResourceFiles.add(f.path);
103
+ // Also add files that depend on this changed file
104
+ if (currentScssDependencies != null) {
105
+ for (const [containingFile, deps] of currentScssDependencies) {
106
+ if (deps.has(f.path)) {
107
+ modifiedResourceFiles.add(containingFile);
108
+ }
109
+ }
110
+ }
111
+ }
112
+ }
113
+
114
+ const { result, program: newProgram, scssDependencies: newDeps } = await runNgtscRebuild(
115
+ watchInfo!,
116
+ oldProgram,
117
+ modifiedResourceFiles.size > 0 ? modifiedResourceFiles : undefined,
118
+ );
119
+ oldProgram = newProgram;
120
+ currentScssDependencies = newDeps;
121
+ sender.send("build", result);
122
+ } catch (err) {
123
+ sender.send("error", { message: errNs.message(err) });
124
+ }
125
+ });
126
+ } catch (err) {
127
+ sender.send("error", { message: errNs.message(err) });
128
+ }
129
+ }
130
+
131
+ async function stopWatch(): Promise<void> {
132
+ await cleanup();
133
+ }
134
+
135
+ //#endregion
136
+
137
+ const sender = createWorker<
138
+ { build: typeof build; startWatch: typeof startWatch; stopWatch: typeof stopWatch },
139
+ NgtscBuildWorkerEvents
140
+ >({
141
+ build,
142
+ startWatch,
143
+ stopWatch,
144
+ });
145
+
146
+ export default sender;
@@ -0,0 +1,565 @@
1
+ import path from "path";
2
+ import fs from "fs";
3
+ import { execaSync } from "execa";
4
+ import esbuild from "esbuild";
5
+ import { createWorker, FsWatcher, pathx } from "@simplysm/core-node";
6
+ import { err as errNs } from "@simplysm/core-common";
7
+ import { consola } from "consola";
8
+ import type { BuildOutput } from "../engines/types";
9
+ import type { SerializedDiagnostic } from "../utils/typecheck-serialization";
10
+ import {
11
+ parseTsconfig,
12
+ getPackageSourceFiles,
13
+ } from "../utils/tsconfig";
14
+ import {
15
+ createServerEsbuildOptions,
16
+ collectUninstalledOptionalPeerDeps,
17
+ collectNativeModuleExternals,
18
+ writeChangedOutputFiles,
19
+ } from "../utils/esbuild-config";
20
+ import { runTscPackageBuild } from "../utils/tsc-build";
21
+ import { registerCleanupHandlers, createOnceGuard, applyDebugLevel } from "../utils/worker-utils";
22
+ import { collectDeps } from "../utils/package-utils";
23
+ import { copyPublicFiles, watchPublicFiles } from "../utils/copy-public";
24
+
25
+ //#region Types
26
+
27
+ /**
28
+ * Server build information (one-time build)
29
+ */
30
+ export interface ServerBuildInfo {
31
+ name: string;
32
+ cwd: string;
33
+ pkgDir: string;
34
+ output: BuildOutput;
35
+ /** Environment variables to substitute during build */
36
+ env?: Record<string, string>;
37
+ /** Runtime configuration (recorded in dist/.config.json) */
38
+ configs?: Record<string, unknown>;
39
+ /** External modules manually specified in sd.config.ts */
40
+ externals?: string[];
41
+ /** PM2 configuration (generates dist/pm2.config.cjs when specified) */
42
+ pm2?: {
43
+ name?: string;
44
+ ignoreWatchPaths?: string[];
45
+ };
46
+ /** Package manager to use (affects mise.toml or volta settings generation) */
47
+ packageManager?: "volta" | "mise";
48
+ }
49
+
50
+ /**
51
+ * Server watch information
52
+ */
53
+ export interface ServerWatchInfo {
54
+ name: string;
55
+ cwd: string;
56
+ pkgDir: string;
57
+ output: BuildOutput;
58
+ /** Environment variables to substitute during build */
59
+ env?: Record<string, string>;
60
+ /** Runtime configuration (recorded in dist/.config.json) */
61
+ configs?: Record<string, unknown>;
62
+ /** External modules manually specified in sd.config.ts */
63
+ externals?: string[];
64
+ /** replaceDeps configuration from sd.config.ts */
65
+ replaceDeps?: Record<string, string>;
66
+ }
67
+
68
+ /**
69
+ * Server build result (aligned with LibraryBuildResult + mainJsPath)
70
+ */
71
+ export interface ServerBuildResult {
72
+ js: { success: boolean; errors?: string[]; warnings?: string[] };
73
+ dts: { success: boolean; errors?: string[]; diagnostics: SerializedDiagnostic[] };
74
+ mainJsPath: string;
75
+ }
76
+
77
+ /**
78
+ * Combined build event for watch mode
79
+ */
80
+ export interface ServerCombinedBuildEvent {
81
+ js: { success: boolean; errors?: string[]; warnings?: string[] };
82
+ dts: { success: boolean; errors?: string[] };
83
+ mainJsPath: string;
84
+ }
85
+
86
+ /**
87
+ * Worker event types
88
+ */
89
+ export interface ServerBuildWorkerEvents extends Record<string, unknown> {
90
+ buildStart: Record<string, never>;
91
+ build: ServerCombinedBuildEvent;
92
+ error: { message: string };
93
+ }
94
+
95
+ //#endregion
96
+
97
+ //#region Resource Management
98
+
99
+ applyDebugLevel();
100
+
101
+ const logger = consola.withTag("sd:cli:server-build:worker");
102
+
103
+ /** esbuild build context (to be cleaned up) */
104
+ let esbuildContext: esbuild.BuildContext | undefined;
105
+
106
+ /** Last build metafile (for filtering changed files on rebuild) */
107
+ let lastMetafile: esbuild.Metafile | undefined;
108
+
109
+ /** Public files watcher (to be cleaned up) */
110
+ let publicWatcher: FsWatcher | undefined;
111
+
112
+ /** Source + scope packages watcher (to be cleaned up) */
113
+ let srcWatcher: FsWatcher | undefined;
114
+
115
+ async function cleanup(): Promise<void> {
116
+ const contextToDispose = esbuildContext;
117
+ esbuildContext = undefined;
118
+ lastMetafile = undefined;
119
+
120
+ const watcherToClose = publicWatcher;
121
+ publicWatcher = undefined;
122
+
123
+ const srcWatcherToClose = srcWatcher;
124
+ srcWatcher = undefined;
125
+
126
+ if (contextToDispose != null) {
127
+ await contextToDispose.dispose();
128
+ }
129
+ if (watcherToClose != null) {
130
+ await watcherToClose.close();
131
+ }
132
+ if (srcWatcherToClose != null) {
133
+ await srcWatcherToClose.close();
134
+ }
135
+ }
136
+
137
+ /**
138
+ * Collect external modules from three sources and merge them.
139
+ */
140
+ function collectAllExternals(pkgDir: string, manualExternals?: string[]): string[] {
141
+ logger.debug("[externals] Scanning optional peer deps...");
142
+ const optionalPeerDeps = collectUninstalledOptionalPeerDeps(pkgDir);
143
+
144
+ logger.debug("[externals] Scanning native modules...");
145
+ const nativeModules = collectNativeModuleExternals(pkgDir);
146
+
147
+ const manual = manualExternals ?? [];
148
+ return [...new Set([...optionalPeerDeps, ...nativeModules, ...manual])];
149
+ }
150
+
151
+ /**
152
+ * Generate files for production deployment
153
+ */
154
+ function generateProductionFiles(
155
+ info: ServerBuildInfo,
156
+ externals: string[],
157
+ ): void {
158
+ const distDir = path.join(info.pkgDir, "dist");
159
+ const pkgJson = JSON.parse(fs.readFileSync(path.join(info.pkgDir, "package.json"), "utf-8"));
160
+
161
+ // dist/package.json
162
+ const distPkgJson: Record<string, unknown> = {
163
+ name: pkgJson.name,
164
+ version: pkgJson.version,
165
+ type: pkgJson.type,
166
+ };
167
+ if (externals.length > 0) {
168
+ const deps: Record<string, string> = {};
169
+ for (const ext of externals) {
170
+ deps[ext] = "*";
171
+ }
172
+ distPkgJson["dependencies"] = deps;
173
+ }
174
+ if (info.packageManager === "volta") {
175
+ const nodeVersion = execaSync("node", ["-v"]).stdout.trim();
176
+ distPkgJson["volta"] = { node: nodeVersion };
177
+ }
178
+ fs.writeFileSync(path.join(distDir, "package.json"), JSON.stringify(distPkgJson, undefined, 2));
179
+
180
+ // dist/mise.toml
181
+ if (info.packageManager === "mise") {
182
+ const rootMiseTomlPath = path.join(info.cwd, "mise.toml");
183
+ let nodeVersion = "20";
184
+ if (fs.existsSync(rootMiseTomlPath)) {
185
+ const miseContent = fs.readFileSync(rootMiseTomlPath, "utf-8");
186
+ const match = /node\s*=\s*"([^"]+)"/.exec(miseContent);
187
+ if (match != null) {
188
+ nodeVersion = match[1];
189
+ }
190
+ }
191
+ fs.writeFileSync(path.join(distDir, "mise.toml"), `[tools]\nnode = "${nodeVersion}"\n`);
192
+ }
193
+
194
+ // dist/openssl.cnf
195
+ fs.writeFileSync(
196
+ path.join(distDir, "openssl.cnf"),
197
+ [
198
+ "nodejs_conf = openssl_init",
199
+ "",
200
+ "[openssl_init]",
201
+ "providers = provider_sect",
202
+ "ssl_conf = ssl_sect",
203
+ "",
204
+ "[provider_sect]",
205
+ "default = default_sect",
206
+ "legacy = legacy_sect",
207
+ "",
208
+ "[default_sect]",
209
+ "activate = 1",
210
+ "",
211
+ "[legacy_sect]",
212
+ "activate = 1",
213
+ "",
214
+ "[ssl_sect]",
215
+ "system_default = system_default_sect",
216
+ "",
217
+ "[system_default_sect]",
218
+ "Options = UnsafeLegacyRenegotiation",
219
+ ].join("\n"),
220
+ );
221
+
222
+ // dist/pm2.config.cjs
223
+ if (info.pm2 != null) {
224
+ const pm2Name = info.pm2.name ?? pkgJson.name.replace(/@/g, "").replace(/[/\\]/g, "-");
225
+ const ignoreWatch = JSON.stringify([
226
+ "node_modules",
227
+ "www",
228
+ ...(info.pm2.ignoreWatchPaths ?? []),
229
+ ]);
230
+ const envObj: Record<string, string> = {
231
+ NODE_ENV: "production",
232
+ TZ: "Asia/Seoul",
233
+ ...(info.env ?? {}),
234
+ };
235
+ const envStr = JSON.stringify(envObj, undefined, 4);
236
+
237
+ const useInterpreter = info.packageManager !== "volta";
238
+
239
+ const pm2Config = [
240
+ ...(useInterpreter ? [`const cp = require("child_process");`, ``] : []),
241
+ `module.exports = {`,
242
+ ` name: ${JSON.stringify(pm2Name)},`,
243
+ ` script: "main.js",`,
244
+ ` watch: true,`,
245
+ ` watch_delay: 2000,`,
246
+ ` ignore_watch: ${ignoreWatch},`,
247
+ ...(useInterpreter ? [` interpreter: cp.execSync("mise which node").toString().trim(),`] : []),
248
+ ` interpreter_args: "--openssl-config=openssl.cnf",`,
249
+ ` env: ${envStr.replace(/\n/g, "\n ")},`,
250
+ ` arrayProcess: "concat",`,
251
+ ` useDelTargetNull: true,`,
252
+ `};`,
253
+ ].join("\n");
254
+
255
+ fs.writeFileSync(path.join(distDir, "pm2.config.cjs"), pm2Config);
256
+ }
257
+ }
258
+
259
+ registerCleanupHandlers(cleanup, logger);
260
+
261
+ //#endregion
262
+
263
+ //#region Worker
264
+
265
+ /**
266
+ * One-time build (production)
267
+ */
268
+ async function build(info: ServerBuildInfo): Promise<ServerBuildResult> {
269
+ const mainJsPath = path.join(info.pkgDir, "dist", "main.js");
270
+
271
+ try {
272
+ // Parse tsconfig
273
+ const parsedConfig = parseTsconfig(info.pkgDir);
274
+ const entryPoints = getPackageSourceFiles(info.pkgDir, parsedConfig);
275
+
276
+ // Collect externals
277
+ const external = collectAllExternals(info.pkgDir, info.externals);
278
+
279
+ // esbuild (async) ‖ tsc (sync) in parallel
280
+ const esbuildOptions = createServerEsbuildOptions({
281
+ pkgDir: info.pkgDir,
282
+ entryPoints,
283
+ env: info.env,
284
+ external,
285
+ });
286
+
287
+ const esbuildPromise = info.output.js
288
+ ? esbuild.build(esbuildOptions).then(async (result) => {
289
+ if (result.outputFiles) {
290
+ await writeChangedOutputFiles(result.outputFiles);
291
+ }
292
+ const errors = result.errors.map((e) => e.text);
293
+ const warnings = result.warnings.map((w) => w.text);
294
+ return {
295
+ success: result.errors.length === 0,
296
+ errors: errors.length > 0 ? errors : undefined,
297
+ warnings: warnings.length > 0 ? warnings : undefined,
298
+ };
299
+ }).catch((err) => ({
300
+ success: false,
301
+ errors: [errNs.message(err)],
302
+ warnings: undefined,
303
+ }))
304
+ : null;
305
+
306
+ // tsc typecheck (always runs, emit controlled by output.dts)
307
+ const tscResult = runTscPackageBuild({
308
+ pkgDir: info.pkgDir,
309
+ cwd: info.cwd,
310
+ output: { js: false, dts: info.output.dts },
311
+ parsedConfig,
312
+ });
313
+
314
+ const jsResult = esbuildPromise
315
+ ? await esbuildPromise
316
+ : { success: true, errors: undefined, warnings: undefined };
317
+
318
+ // Generate production artifacts only when JS output is requested
319
+ if (info.output.js) {
320
+ const confDistPath = path.join(info.pkgDir, "dist", ".config.json");
321
+ fs.writeFileSync(confDistPath, JSON.stringify(info.configs ?? {}, undefined, 2));
322
+
323
+ await copyPublicFiles(info.pkgDir, false);
324
+
325
+ generateProductionFiles(info, external);
326
+ }
327
+
328
+ return {
329
+ js: {
330
+ success: jsResult.success,
331
+ errors: jsResult.errors,
332
+ warnings: jsResult.warnings,
333
+ },
334
+ dts: {
335
+ success: tscResult.success,
336
+ errors: tscResult.errors,
337
+ diagnostics: tscResult.diagnostics,
338
+ },
339
+ mainJsPath,
340
+ };
341
+ } catch (err) {
342
+ return {
343
+ js: { success: false, errors: [errNs.message(err)] },
344
+ dts: { success: false, errors: [errNs.message(err)], diagnostics: [] },
345
+ mainJsPath,
346
+ };
347
+ }
348
+ }
349
+
350
+ const guardStartWatch = createOnceGuard("startWatch");
351
+
352
+ // Mutable state for watch mode
353
+ let watchInfo: ServerWatchInfo | undefined;
354
+
355
+ /**
356
+ * Rebuild esbuild + tsc in parallel (watch mode)
357
+ */
358
+ async function rebuildAll(): Promise<ServerCombinedBuildEvent> {
359
+ const info = watchInfo!;
360
+ const mainJsPath = path.join(info.pkgDir, "dist", "main.js");
361
+ const parsedConfig = parseTsconfig(info.pkgDir);
362
+
363
+ // esbuild rebuild (async)
364
+ let esbuildPromise: Promise<{ success: boolean; errors?: string[]; warnings?: string[] }> | null = null;
365
+ if (info.output.js && esbuildContext != null) {
366
+ esbuildPromise = esbuildContext.rebuild().then(async (result) => {
367
+ // Save metafile
368
+ if (result.metafile != null) {
369
+ lastMetafile = result.metafile;
370
+ }
371
+
372
+ if (result.outputFiles) {
373
+ await writeChangedOutputFiles(result.outputFiles);
374
+ }
375
+ const errors = result.errors.map((e) => e.text);
376
+ const warnings = result.warnings.map((w) => w.text);
377
+ return {
378
+ success: result.errors.length === 0,
379
+ errors: errors.length > 0 ? errors : undefined,
380
+ warnings: warnings.length > 0 ? warnings : undefined,
381
+ };
382
+ });
383
+ }
384
+
385
+ // tsc rebuild (sync, incremental)
386
+ const tscResult = runTscPackageBuild({
387
+ pkgDir: info.pkgDir,
388
+ cwd: info.cwd,
389
+ output: { js: false, dts: info.output.dts },
390
+ parsedConfig,
391
+ });
392
+
393
+ const jsResult = esbuildPromise
394
+ ? await esbuildPromise
395
+ : { success: true, errors: undefined, warnings: undefined };
396
+
397
+ return {
398
+ js: { success: jsResult.success, errors: jsResult.errors, warnings: jsResult.warnings },
399
+ dts: { success: tscResult.success, errors: tscResult.errors },
400
+ mainJsPath,
401
+ };
402
+ }
403
+
404
+ /**
405
+ * Create esbuild context for watch mode
406
+ */
407
+ async function createEsbuildWatchContext(
408
+ info: ServerWatchInfo,
409
+ entryPoints: string[],
410
+ external: string[],
411
+ ): Promise<esbuild.BuildContext> {
412
+ const baseOptions = createServerEsbuildOptions({
413
+ pkgDir: info.pkgDir,
414
+ entryPoints,
415
+ env: info.env,
416
+ external,
417
+ dev: true,
418
+ });
419
+
420
+ return esbuild.context({
421
+ ...baseOptions,
422
+ metafile: true,
423
+ write: false,
424
+ });
425
+ }
426
+
427
+ /**
428
+ * Start watch mode
429
+ */
430
+ async function startWatch(info: ServerWatchInfo): Promise<void> {
431
+ guardStartWatch();
432
+ watchInfo = info;
433
+
434
+ try {
435
+ const parsedConfig = parseTsconfig(info.pkgDir);
436
+ const entryPoints = getPackageSourceFiles(info.pkgDir, parsedConfig);
437
+
438
+ // Collect externals
439
+ const external = collectAllExternals(info.pkgDir, info.externals);
440
+
441
+ // Create esbuild context (if JS output needed)
442
+ if (info.output.js) {
443
+ esbuildContext = await createEsbuildWatchContext(info, entryPoints, external);
444
+ }
445
+
446
+ // Initial build: esbuild + tsc parallel
447
+ const initialResult = await rebuildAll();
448
+
449
+ // Write .config.json on first build
450
+ const confDistPath = path.join(info.pkgDir, "dist", ".config.json");
451
+ fs.writeFileSync(confDistPath, JSON.stringify(info.configs ?? {}, undefined, 2));
452
+
453
+ sender.send("build", initialResult);
454
+
455
+ // Watch public/ + public-dev/
456
+ publicWatcher = await watchPublicFiles(info.pkgDir, true);
457
+
458
+ // Collect watch paths based on dependencies
459
+ const { workspaceDeps, replaceDeps } = collectDeps(info.pkgDir, info.cwd, info.replaceDeps);
460
+
461
+ const watchPaths: string[] = [];
462
+
463
+ // Server package itself + workspace dependency packages source
464
+ const watchDirs = [
465
+ info.pkgDir,
466
+ ...workspaceDeps.map((d) => path.join(info.cwd, "packages", d)),
467
+ ];
468
+ for (const dir of watchDirs) {
469
+ watchPaths.push(path.join(dir, "src", "**", "*"));
470
+ watchPaths.push(path.join(dir, "*.{ts,js,css}"));
471
+ }
472
+
473
+ // ReplaceDeps dependency packages dist
474
+ for (const pkg of replaceDeps) {
475
+ watchPaths.push(path.join(info.cwd, "node_modules", ...pkg.split("/"), "dist", "**", "*.js"));
476
+ watchPaths.push(
477
+ path.join(info.pkgDir, "node_modules", ...pkg.split("/"), "dist", "**", "*.js"),
478
+ );
479
+ }
480
+
481
+ // Start FsWatcher
482
+ srcWatcher = await FsWatcher.watch(watchPaths);
483
+
484
+ srcWatcher.onChange({ delay: 300 }, async (changes) => {
485
+ try {
486
+ const hasFileAddOrRemove = changes.some((c) => c.event === "add" || c.event === "unlink");
487
+
488
+ if (hasFileAddOrRemove) {
489
+ sender.send("buildStart", {});
490
+
491
+ // Recreate context on file add/remove
492
+ const newParsedConfig = parseTsconfig(info.pkgDir);
493
+ const newEntryPoints = getPackageSourceFiles(info.pkgDir, newParsedConfig);
494
+ const newExternal = collectAllExternals(info.pkgDir, info.externals);
495
+
496
+ const oldContext = esbuildContext;
497
+ if (info.output.js) {
498
+ esbuildContext = await createEsbuildWatchContext(info, newEntryPoints, newExternal);
499
+ }
500
+ if (oldContext != null) {
501
+ await oldContext.dispose();
502
+ }
503
+
504
+ const result = await rebuildAll();
505
+ sender.send("build", result);
506
+ return;
507
+ }
508
+
509
+ // Only file changes: filter by metafile
510
+ if (esbuildContext == null) {
511
+ sender.send("buildStart", {});
512
+ const result = await rebuildAll();
513
+ sender.send("build", result);
514
+ return;
515
+ }
516
+
517
+ if (lastMetafile == null) {
518
+ sender.send("buildStart", {});
519
+ const result = await rebuildAll();
520
+ sender.send("build", result);
521
+ return;
522
+ }
523
+
524
+ // Filter by metafile inputs
525
+ const metafileAbsPaths = new Set(
526
+ Object.keys(lastMetafile.inputs).map((key) => pathx.norm(info.cwd, key)),
527
+ );
528
+
529
+ const hasRelevantChange = changes.some((c) => metafileAbsPaths.has(c.path));
530
+
531
+ if (hasRelevantChange) {
532
+ sender.send("buildStart", {});
533
+ const result = await rebuildAll();
534
+ sender.send("build", result);
535
+ } else {
536
+ logger.debug("Changed files not included in build, skipping rebuild");
537
+ }
538
+ } catch (err) {
539
+ sender.send("error", { message: errNs.message(err) });
540
+ }
541
+ });
542
+ } catch (err) {
543
+ sender.send("error", { message: errNs.message(err) });
544
+ }
545
+ }
546
+
547
+ /**
548
+ * Stop watch
549
+ */
550
+ async function stopWatch(): Promise<void> {
551
+ await cleanup();
552
+ }
553
+
554
+ const sender = createWorker<
555
+ { build: typeof build; startWatch: typeof startWatch; stopWatch: typeof stopWatch },
556
+ ServerBuildWorkerEvents
557
+ >({
558
+ build,
559
+ startWatch,
560
+ stopWatch,
561
+ });
562
+
563
+ export default sender;
564
+
565
+ //#endregion