@simplysm/sd-cli 13.0.100 → 14.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (409) hide show
  1. package/dist/commands/build.js +29 -19
  2. package/dist/commands/build.js.map +1 -6
  3. package/dist/commands/check.d.ts +1 -0
  4. package/dist/commands/check.d.ts.map +1 -1
  5. package/dist/commands/check.js +130 -115
  6. package/dist/commands/check.js.map +1 -6
  7. package/dist/commands/dev.d.ts +6 -7
  8. package/dist/commands/dev.d.ts.map +1 -1
  9. package/dist/commands/dev.js +24 -14
  10. package/dist/commands/dev.js.map +1 -6
  11. package/dist/commands/lint.d.ts +1 -1
  12. package/dist/commands/lint.js +158 -116
  13. package/dist/commands/lint.js.map +1 -6
  14. package/dist/commands/publish.d.ts.map +1 -1
  15. package/dist/commands/publish.js +637 -510
  16. package/dist/commands/publish.js.map +1 -6
  17. package/dist/commands/replace-deps.js +12 -12
  18. package/dist/commands/replace-deps.js.map +1 -6
  19. package/dist/commands/typecheck.d.ts +5 -30
  20. package/dist/commands/typecheck.d.ts.map +1 -1
  21. package/dist/commands/typecheck.js +144 -207
  22. package/dist/commands/typecheck.js.map +1 -6
  23. package/dist/commands/watch.d.ts +6 -4
  24. package/dist/commands/watch.d.ts.map +1 -1
  25. package/dist/commands/watch.js +25 -16
  26. package/dist/commands/watch.js.map +1 -6
  27. package/dist/engines/NgtscEngine.d.ts +47 -0
  28. package/dist/engines/NgtscEngine.d.ts.map +1 -0
  29. package/dist/engines/NgtscEngine.js +151 -0
  30. package/dist/engines/NgtscEngine.js.map +1 -0
  31. package/dist/engines/ServerEsbuildEngine.d.ts +47 -0
  32. package/dist/engines/ServerEsbuildEngine.d.ts.map +1 -0
  33. package/dist/engines/ServerEsbuildEngine.js +159 -0
  34. package/dist/engines/ServerEsbuildEngine.js.map +1 -0
  35. package/dist/engines/TscEngine.d.ts +47 -0
  36. package/dist/engines/TscEngine.d.ts.map +1 -0
  37. package/dist/engines/TscEngine.js +153 -0
  38. package/dist/engines/TscEngine.js.map +1 -0
  39. package/dist/engines/ViteEngine.d.ts +49 -0
  40. package/dist/engines/ViteEngine.d.ts.map +1 -0
  41. package/dist/engines/ViteEngine.js +161 -0
  42. package/dist/engines/ViteEngine.js.map +1 -0
  43. package/dist/engines/index.d.ts +26 -0
  44. package/dist/engines/index.d.ts.map +1 -0
  45. package/dist/engines/index.js +30 -0
  46. package/dist/engines/index.js.map +1 -0
  47. package/dist/engines/types.d.ts +77 -0
  48. package/dist/engines/types.d.ts.map +1 -0
  49. package/dist/engines/types.js +2 -0
  50. package/dist/engines/types.js.map +1 -0
  51. package/dist/index.d.ts +0 -1
  52. package/dist/index.d.ts.map +1 -1
  53. package/dist/index.js +2 -2
  54. package/dist/index.js.map +1 -6
  55. package/dist/infra/ResultCollector.d.ts +1 -1
  56. package/dist/infra/ResultCollector.d.ts.map +1 -1
  57. package/dist/infra/ResultCollector.js +30 -27
  58. package/dist/infra/ResultCollector.js.map +1 -6
  59. package/dist/infra/SignalHandler.js +45 -42
  60. package/dist/infra/SignalHandler.js.map +1 -6
  61. package/dist/infra/WorkerManager.js +56 -53
  62. package/dist/infra/WorkerManager.js.map +1 -6
  63. package/dist/orchestrators/BuildOrchestrator.d.ts +33 -1
  64. package/dist/orchestrators/BuildOrchestrator.d.ts.map +1 -1
  65. package/dist/orchestrators/BuildOrchestrator.js +314 -309
  66. package/dist/orchestrators/BuildOrchestrator.js.map +1 -6
  67. package/dist/orchestrators/DevWatchOrchestrator.d.ts +60 -0
  68. package/dist/orchestrators/DevWatchOrchestrator.d.ts.map +1 -0
  69. package/dist/orchestrators/DevWatchOrchestrator.js +465 -0
  70. package/dist/orchestrators/DevWatchOrchestrator.js.map +1 -0
  71. package/dist/sd-cli-entry.d.ts.map +1 -1
  72. package/dist/sd-cli-entry.js +190 -266
  73. package/dist/sd-cli-entry.js.map +1 -6
  74. package/dist/sd-cli.js +77 -49
  75. package/dist/sd-cli.js.map +1 -6
  76. package/dist/sd-config.types.d.ts +2 -0
  77. package/dist/sd-config.types.d.ts.map +1 -1
  78. package/dist/sd-config.types.js +2 -1
  79. package/dist/sd-config.types.js.map +1 -6
  80. package/dist/utils/angular-build.d.ts +77 -0
  81. package/dist/utils/angular-build.d.ts.map +1 -0
  82. package/dist/utils/angular-build.js +84 -0
  83. package/dist/utils/angular-build.js.map +1 -0
  84. package/dist/utils/build-env.js +9 -9
  85. package/dist/utils/build-env.js.map +1 -6
  86. package/dist/utils/concurrency.d.ts +15 -0
  87. package/dist/utils/concurrency.d.ts.map +1 -0
  88. package/dist/utils/concurrency.js +38 -0
  89. package/dist/utils/concurrency.js.map +1 -0
  90. package/dist/utils/copy-public.js +104 -87
  91. package/dist/utils/copy-public.js.map +1 -6
  92. package/dist/utils/copy-src.js +49 -35
  93. package/dist/utils/copy-src.js.map +1 -6
  94. package/dist/utils/esbuild-config.d.ts +0 -29
  95. package/dist/utils/esbuild-config.d.ts.map +1 -1
  96. package/dist/utils/esbuild-config.js +151 -218
  97. package/dist/utils/esbuild-config.js.map +1 -6
  98. package/dist/utils/ngtsc-build-core.d.ts +49 -0
  99. package/dist/utils/ngtsc-build-core.d.ts.map +1 -0
  100. package/dist/utils/ngtsc-build-core.js +250 -0
  101. package/dist/utils/ngtsc-build-core.js.map +1 -0
  102. package/dist/utils/output-path-rewriter.d.ts +23 -0
  103. package/dist/utils/output-path-rewriter.d.ts.map +1 -0
  104. package/dist/utils/output-path-rewriter.js +74 -0
  105. package/dist/utils/output-path-rewriter.js.map +1 -0
  106. package/dist/utils/output-utils.js +55 -40
  107. package/dist/utils/output-utils.js.map +1 -6
  108. package/dist/utils/package-utils.d.ts +8 -0
  109. package/dist/utils/package-utils.d.ts.map +1 -1
  110. package/dist/utils/package-utils.js +103 -73
  111. package/dist/utils/package-utils.js.map +1 -6
  112. package/dist/utils/rebuild-manager.js +41 -44
  113. package/dist/utils/rebuild-manager.js.map +1 -6
  114. package/dist/utils/replace-deps.js +283 -184
  115. package/dist/utils/replace-deps.js.map +1 -6
  116. package/dist/utils/scss-compiler.d.ts +10 -0
  117. package/dist/utils/scss-compiler.d.ts.map +1 -0
  118. package/dist/utils/scss-compiler.js +36 -0
  119. package/dist/utils/scss-compiler.js.map +1 -0
  120. package/dist/utils/sd-config.js +29 -19
  121. package/dist/utils/sd-config.js.map +1 -6
  122. package/dist/utils/tsc-build.d.ts +36 -0
  123. package/dist/utils/tsc-build.d.ts.map +1 -0
  124. package/dist/utils/tsc-build.js +130 -0
  125. package/dist/utils/tsc-build.js.map +1 -0
  126. package/dist/utils/tsconfig.d.ts +7 -26
  127. package/dist/utils/tsconfig.d.ts.map +1 -1
  128. package/dist/utils/tsconfig.js +39 -64
  129. package/dist/utils/tsconfig.js.map +1 -6
  130. package/dist/utils/typecheck-non-package.d.ts +18 -0
  131. package/dist/utils/typecheck-non-package.d.ts.map +1 -0
  132. package/dist/utils/typecheck-non-package.js +64 -0
  133. package/dist/utils/typecheck-non-package.js.map +1 -0
  134. package/dist/utils/typecheck-serialization.js +58 -40
  135. package/dist/utils/typecheck-serialization.js.map +1 -6
  136. package/dist/utils/worker-events.js +48 -40
  137. package/dist/utils/worker-events.js.map +1 -6
  138. package/dist/utils/worker-utils.js +48 -28
  139. package/dist/utils/worker-utils.js.map +1 -6
  140. package/dist/vitest-plugin.d.ts +9 -0
  141. package/dist/vitest-plugin.d.ts.map +1 -0
  142. package/dist/vitest-plugin.js +85 -0
  143. package/dist/vitest-plugin.js.map +1 -0
  144. package/dist/workers/library-build.worker.d.ts +54 -0
  145. package/dist/workers/library-build.worker.d.ts.map +1 -0
  146. package/dist/workers/library-build.worker.js +97 -0
  147. package/dist/workers/library-build.worker.js.map +1 -0
  148. package/dist/workers/lint.worker.js +9 -6
  149. package/dist/workers/lint.worker.js.map +1 -6
  150. package/dist/workers/ngtsc-build.worker.d.ts +23 -0
  151. package/dist/workers/ngtsc-build.worker.d.ts.map +1 -0
  152. package/dist/workers/ngtsc-build.worker.js +98 -0
  153. package/dist/workers/ngtsc-build.worker.js.map +1 -0
  154. package/dist/workers/{server.worker.d.ts → server-build.worker.d.ts} +39 -29
  155. package/dist/workers/server-build.worker.d.ts.map +1 -0
  156. package/dist/workers/server-build.worker.js +399 -0
  157. package/dist/workers/server-build.worker.js.map +1 -0
  158. package/dist/workers/server-runtime.worker.d.ts +3 -2
  159. package/dist/workers/server-runtime.worker.d.ts.map +1 -1
  160. package/dist/workers/server-runtime.worker.js +100 -95
  161. package/dist/workers/server-runtime.worker.js.map +1 -6
  162. package/dist/workers/vite-build.worker.d.ts +56 -0
  163. package/dist/workers/vite-build.worker.d.ts.map +1 -0
  164. package/dist/workers/vite-build.worker.js +167 -0
  165. package/dist/workers/vite-build.worker.js.map +1 -0
  166. package/package.json +10 -16
  167. package/src/commands/check.ts +21 -3
  168. package/src/commands/dev.ts +10 -8
  169. package/src/commands/lint.ts +1 -1
  170. package/src/commands/publish.ts +4 -0
  171. package/src/commands/typecheck.ts +89 -256
  172. package/src/commands/watch.ts +9 -8
  173. package/src/engines/NgtscEngine.ts +190 -0
  174. package/src/engines/ServerEsbuildEngine.ts +195 -0
  175. package/src/engines/TscEngine.ts +189 -0
  176. package/src/engines/ViteEngine.ts +203 -0
  177. package/src/engines/index.ts +49 -0
  178. package/src/engines/types.ts +79 -0
  179. package/src/index.ts +0 -3
  180. package/src/infra/ResultCollector.ts +1 -1
  181. package/src/orchestrators/BuildOrchestrator.ts +87 -157
  182. package/src/orchestrators/DevWatchOrchestrator.ts +573 -0
  183. package/src/sd-cli-entry.ts +13 -116
  184. package/src/sd-config.types.ts +2 -0
  185. package/src/utils/angular-build.ts +157 -0
  186. package/src/utils/concurrency.ts +43 -0
  187. package/src/utils/esbuild-config.ts +1 -122
  188. package/src/utils/ngtsc-build-core.ts +379 -0
  189. package/src/utils/output-path-rewriter.ts +82 -0
  190. package/src/utils/package-utils.ts +20 -0
  191. package/src/utils/scss-compiler.ts +58 -0
  192. package/src/utils/tsc-build.ts +175 -0
  193. package/src/utils/tsconfig.ts +27 -95
  194. package/src/utils/typecheck-non-package.ts +87 -0
  195. package/src/vitest-plugin.ts +118 -0
  196. package/src/workers/library-build.worker.ts +153 -0
  197. package/src/workers/ngtsc-build.worker.ts +146 -0
  198. package/src/workers/server-build.worker.ts +565 -0
  199. package/src/workers/server-runtime.worker.ts +17 -26
  200. package/src/workers/vite-build.worker.ts +252 -0
  201. package/tests/commands/check.spec.ts +276 -0
  202. package/tests/commands/dev.spec.ts +53 -0
  203. package/tests/commands/lint.spec.ts +243 -0
  204. package/tests/commands/publish.spec.ts +1159 -0
  205. package/tests/commands/typecheck.spec.ts +294 -0
  206. package/tests/commands/watch.spec.ts +53 -0
  207. package/tests/engines/engine-selection.spec.ts +247 -0
  208. package/tests/engines/ngtsc-engine.spec.ts +274 -0
  209. package/tests/engines/server-esbuild-engine.spec.ts +256 -0
  210. package/tests/engines/tsc-engine.spec.ts +213 -0
  211. package/tests/engines/vite-engine.spec.ts +358 -0
  212. package/tests/infra/result-collector.spec.ts +46 -0
  213. package/tests/infra/signal-handler.spec.ts +32 -0
  214. package/tests/infra/worker-manager.spec.ts +63 -0
  215. package/tests/orchestrators/build-orchestrator.spec.ts +772 -0
  216. package/tests/orchestrators/dev-watch-orchestrator.spec.ts +1173 -0
  217. package/tests/sd-cli-entry.spec.ts +49 -0
  218. package/tests/utils/angular-build.spec.ts +251 -0
  219. package/tests/utils/build-env.spec.ts +33 -0
  220. package/tests/utils/concurrency.spec.ts +65 -0
  221. package/tests/utils/copy-src.spec.ts +144 -0
  222. package/tests/utils/esbuild-config.spec.ts +186 -0
  223. package/tests/utils/external-modules.spec.ts +161 -0
  224. package/tests/utils/ngtsc-scss-refactor.spec.ts +66 -0
  225. package/tests/utils/output-path-rewriter.spec.ts +165 -0
  226. package/tests/utils/output-utils.spec.ts +104 -0
  227. package/tests/utils/package-utils.spec.ts +52 -0
  228. package/tests/utils/rebuild-manager.spec.ts +30 -27
  229. package/tests/utils/replace-deps.spec.ts +69 -0
  230. package/tests/utils/scss-compiler.spec.ts +131 -0
  231. package/tests/utils/sd-config.spec.ts +77 -0
  232. package/tests/utils/tsc-build.spec.ts +358 -0
  233. package/tests/utils/tsconfig-angular.spec.ts +71 -0
  234. package/tests/utils/typecheck-non-package.spec.ts +120 -0
  235. package/tests/utils/worker-events.spec.ts +155 -0
  236. package/tests/utils/worker-utils.spec.ts +43 -0
  237. package/tests/vitest-plugin-cwd.spec.ts +68 -0
  238. package/tests/vitest-plugin.spec.ts +103 -0
  239. package/tests/workers/library-build-worker.spec.ts +258 -0
  240. package/tests/workers/ngtsc-build-worker.spec.ts +187 -0
  241. package/tests/workers/server-build-worker.spec.ts +566 -0
  242. package/tests/workers/server-runtime-worker.spec.ts +251 -0
  243. package/README.md +0 -295
  244. package/dist/builders/BaseBuilder.d.ts +0 -88
  245. package/dist/builders/BaseBuilder.d.ts.map +0 -1
  246. package/dist/builders/BaseBuilder.js +0 -142
  247. package/dist/builders/BaseBuilder.js.map +0 -6
  248. package/dist/builders/DtsBuilder.d.ts +0 -22
  249. package/dist/builders/DtsBuilder.d.ts.map +0 -1
  250. package/dist/builders/DtsBuilder.js +0 -72
  251. package/dist/builders/DtsBuilder.js.map +0 -6
  252. package/dist/builders/LibraryBuilder.d.ts +0 -22
  253. package/dist/builders/LibraryBuilder.d.ts.map +0 -1
  254. package/dist/builders/LibraryBuilder.js +0 -85
  255. package/dist/builders/LibraryBuilder.js.map +0 -6
  256. package/dist/builders/types.d.ts +0 -55
  257. package/dist/builders/types.d.ts.map +0 -1
  258. package/dist/builders/types.js +0 -1
  259. package/dist/builders/types.js.map +0 -6
  260. package/dist/capacitor/capacitor.d.ts +0 -151
  261. package/dist/capacitor/capacitor.d.ts.map +0 -1
  262. package/dist/capacitor/capacitor.js +0 -694
  263. package/dist/capacitor/capacitor.js.map +0 -6
  264. package/dist/commands/device.d.ts +0 -22
  265. package/dist/commands/device.d.ts.map +0 -1
  266. package/dist/commands/device.js +0 -98
  267. package/dist/commands/device.js.map +0 -6
  268. package/dist/commands/init.d.ts +0 -14
  269. package/dist/commands/init.d.ts.map +0 -1
  270. package/dist/commands/init.js +0 -72
  271. package/dist/commands/init.js.map +0 -6
  272. package/dist/electron/electron.d.ts +0 -84
  273. package/dist/electron/electron.d.ts.map +0 -1
  274. package/dist/electron/electron.js +0 -263
  275. package/dist/electron/electron.js.map +0 -6
  276. package/dist/orchestrators/DevOrchestrator.d.ts +0 -83
  277. package/dist/orchestrators/DevOrchestrator.d.ts.map +0 -1
  278. package/dist/orchestrators/DevOrchestrator.js +0 -540
  279. package/dist/orchestrators/DevOrchestrator.js.map +0 -6
  280. package/dist/orchestrators/WatchOrchestrator.d.ts +0 -57
  281. package/dist/orchestrators/WatchOrchestrator.d.ts.map +0 -1
  282. package/dist/orchestrators/WatchOrchestrator.js +0 -199
  283. package/dist/orchestrators/WatchOrchestrator.js.map +0 -6
  284. package/dist/utils/tailwind-config-deps.d.ts +0 -8
  285. package/dist/utils/tailwind-config-deps.d.ts.map +0 -1
  286. package/dist/utils/tailwind-config-deps.js +0 -82
  287. package/dist/utils/tailwind-config-deps.js.map +0 -6
  288. package/dist/utils/template.d.ts +0 -14
  289. package/dist/utils/template.d.ts.map +0 -1
  290. package/dist/utils/template.js +0 -33
  291. package/dist/utils/template.js.map +0 -6
  292. package/dist/utils/vite-config.d.ts +0 -35
  293. package/dist/utils/vite-config.d.ts.map +0 -1
  294. package/dist/utils/vite-config.js +0 -259
  295. package/dist/utils/vite-config.js.map +0 -6
  296. package/dist/workers/client.worker.d.ts +0 -83
  297. package/dist/workers/client.worker.d.ts.map +0 -1
  298. package/dist/workers/client.worker.js +0 -111
  299. package/dist/workers/client.worker.js.map +0 -6
  300. package/dist/workers/dts.worker.d.ts +0 -75
  301. package/dist/workers/dts.worker.d.ts.map +0 -1
  302. package/dist/workers/dts.worker.js +0 -270
  303. package/dist/workers/dts.worker.js.map +0 -6
  304. package/dist/workers/library.worker.d.ts +0 -75
  305. package/dist/workers/library.worker.d.ts.map +0 -1
  306. package/dist/workers/library.worker.js +0 -166
  307. package/dist/workers/library.worker.js.map +0 -6
  308. package/dist/workers/server.worker.d.ts.map +0 -1
  309. package/dist/workers/server.worker.js +0 -482
  310. package/dist/workers/server.worker.js.map +0 -6
  311. package/src/builders/BaseBuilder.ts +0 -218
  312. package/src/builders/DtsBuilder.ts +0 -92
  313. package/src/builders/LibraryBuilder.ts +0 -110
  314. package/src/builders/types.ts +0 -60
  315. package/src/capacitor/capacitor.ts +0 -931
  316. package/src/commands/device.ts +0 -140
  317. package/src/commands/init.ts +0 -113
  318. package/src/electron/electron.ts +0 -362
  319. package/src/orchestrators/DevOrchestrator.ts +0 -744
  320. package/src/orchestrators/WatchOrchestrator.ts +0 -277
  321. package/src/utils/tailwind-config-deps.ts +0 -98
  322. package/src/utils/template.ts +0 -56
  323. package/src/utils/vite-config.ts +0 -390
  324. package/src/workers/client.worker.ts +0 -250
  325. package/src/workers/dts.worker.ts +0 -453
  326. package/src/workers/library.worker.ts +0 -316
  327. package/src/workers/server.worker.ts +0 -734
  328. package/templates/init/.gitignore.hbs +0 -34
  329. package/templates/init/.npmrc.hbs +0 -1
  330. package/templates/init/.prettierignore +0 -1
  331. package/templates/init/.prettierrc.yaml +0 -12
  332. package/templates/init/eslint.config.ts +0 -15
  333. package/templates/init/mise.toml +0 -3
  334. package/templates/init/package.json.hbs +0 -32
  335. package/templates/init/packages/client-admin/index.html.hbs +0 -144
  336. package/templates/init/packages/client-admin/package.json.hbs +0 -27
  337. package/templates/init/packages/client-admin/public/assets/logo-landscape.png +0 -0
  338. package/templates/init/packages/client-admin/public/assets/logo.png +0 -0
  339. package/templates/init/packages/client-admin/public/favicon.ico +0 -0
  340. package/templates/init/packages/client-admin/src/App.tsx +0 -42
  341. package/templates/init/packages/client-admin/src/dev/DevDialog.tsx +0 -34
  342. package/templates/init/packages/client-admin/src/events/AuthChangeEvent.ts +0 -3
  343. package/templates/init/packages/client-admin/src/main.css +0 -4
  344. package/templates/init/packages/client-admin/src/main.tsx.hbs +0 -146
  345. package/templates/init/packages/client-admin/src/providers/AppServiceProvider.tsx.hbs +0 -103
  346. package/templates/init/packages/client-admin/src/providers/AppStructureProvider.tsx +0 -84
  347. package/templates/init/packages/client-admin/src/providers/AuthProvider.tsx.hbs +0 -96
  348. package/templates/init/packages/client-admin/src/providers/configureSharedData.ts.hbs +0 -67
  349. package/templates/init/packages/client-admin/src/views/auth/LoginView.tsx +0 -132
  350. package/templates/init/packages/client-admin/src/views/home/HomeView.tsx +0 -108
  351. package/templates/init/packages/client-admin/src/views/home/base/employee/EmployeeDetail.tsx.hbs +0 -243
  352. package/templates/init/packages/client-admin/src/views/home/base/employee/EmployeeSheet.tsx.hbs +0 -271
  353. package/templates/init/packages/client-admin/src/views/home/base/role-permission/RoleDetail.tsx.hbs +0 -146
  354. package/templates/init/packages/client-admin/src/views/home/base/role-permission/RolePermissionDetail.tsx.hbs +0 -121
  355. package/templates/init/packages/client-admin/src/views/home/base/role-permission/RolePermissionView.tsx +0 -52
  356. package/templates/init/packages/client-admin/src/views/home/base/role-permission/RoleSheet.tsx.hbs +0 -125
  357. package/templates/init/packages/client-admin/src/views/home/main/MainView.tsx.hbs +0 -13
  358. package/templates/init/packages/client-admin/src/views/home/my-info/MyInfoDetail.tsx.hbs +0 -241
  359. package/templates/init/packages/client-admin/src/views/home/system/system-log/SystemLogSheet.tsx.hbs +0 -169
  360. package/templates/init/packages/client-admin/src/views/not-found/NotFoundView.tsx +0 -15
  361. package/templates/init/packages/client-admin/tailwind.config.ts +0 -10
  362. package/templates/init/packages/db-main/package.json.hbs +0 -13
  363. package/templates/init/packages/db-main/src/MainDbContext.ts +0 -22
  364. package/templates/init/packages/db-main/src/dataLogExt.ts +0 -127
  365. package/templates/init/packages/db-main/src/index.ts +0 -14
  366. package/templates/init/packages/db-main/src/tables/base/Employee.ts +0 -24
  367. package/templates/init/packages/db-main/src/tables/base/EmployeeConfig.ts +0 -13
  368. package/templates/init/packages/db-main/src/tables/base/Role.ts +0 -9
  369. package/templates/init/packages/db-main/src/tables/base/RolePermission.ts +0 -13
  370. package/templates/init/packages/db-main/src/tables/system/_DataLog.ts +0 -19
  371. package/templates/init/packages/db-main/src/tables/system/_Log.ts +0 -16
  372. package/templates/init/packages/server/package.json.hbs +0 -20
  373. package/templates/init/packages/server/public-dev/dev//354/264/210/352/270/260/355/231/224.xlsx +0 -0
  374. package/templates/init/packages/server/src/index.ts +0 -4
  375. package/templates/init/packages/server/src/main.ts.hbs +0 -34
  376. package/templates/init/packages/server/src/services/AuthService.ts.hbs +0 -171
  377. package/templates/init/packages/server/src/services/DevService.ts.hbs +0 -94
  378. package/templates/init/packages/server/src/services/EmployeeService.ts.hbs +0 -122
  379. package/templates/init/packages/server/src/services/RoleService.ts.hbs +0 -59
  380. package/templates/init/pnpm-workspace.yaml +0 -15
  381. package/templates/init/sd.config.ts.hbs +0 -48
  382. package/templates/init/tsconfig.json.hbs +0 -39
  383. package/templates/init/vitest.config.ts +0 -36
  384. package/tests/capacitor-exclude.spec.ts +0 -78
  385. package/tests/capacitor.spec.ts +0 -49
  386. package/tests/copy-src.spec.ts +0 -50
  387. package/tests/electron-exclude.spec.ts +0 -61
  388. package/tests/get-compiler-options-for-package.spec.ts +0 -80
  389. package/tests/get-package-source-files.spec.ts +0 -139
  390. package/tests/get-types-from-package-json.spec.ts +0 -92
  391. package/tests/infra/ResultCollector.spec.ts +0 -30
  392. package/tests/infra/SignalHandler.spec.ts +0 -38
  393. package/tests/infra/WorkerManager.spec.ts +0 -63
  394. package/tests/load-ignore-patterns.spec.ts +0 -163
  395. package/tests/load-sd-config.spec.ts +0 -100
  396. package/tests/package-utils.spec.ts +0 -188
  397. package/tests/parse-root-tsconfig.spec.ts +0 -89
  398. package/tests/publish-config-narrowing.spec.ts +0 -20
  399. package/tests/replace-deps.spec.ts +0 -308
  400. package/tests/run-lint.spec.ts +0 -366
  401. package/tests/run-typecheck.spec.ts +0 -544
  402. package/tests/run-watch.spec.ts +0 -76
  403. package/tests/sd-cli.spec.ts +0 -265
  404. package/tests/sd-public-dev-plugin-mime.spec.ts +0 -19
  405. package/tests/tailwind-config-deps.spec.ts +0 -30
  406. package/tests/template.spec.ts +0 -70
  407. package/tests/vite-config-exclude.spec.ts +0 -35
  408. package/tests/vite-config-outdir.spec.ts +0 -38
  409. package/tests/write-changed-output-files.spec.ts +0 -97
@@ -7,6 +7,7 @@ import { env, json } from "@simplysm/core-common";
7
7
  import "@simplysm/core-common";
8
8
  import type { SdConfig, SdPublishConfig } from "../sd-config.types";
9
9
  import { loadSdConfig } from "../utils/sd-config";
10
+ import { validateTargets } from "../utils/package-utils";
10
11
  import { execa } from "execa";
11
12
  import { runBuild } from "./build";
12
13
  import { parseWorkspaceGlobs } from "../utils/replace-deps";
@@ -491,6 +492,9 @@ export async function runPublish(options: PublishOptions): Promise<void> {
491
492
  return;
492
493
  }
493
494
 
495
+ // Validate targets
496
+ validateTargets(targets, sdConfig.packages);
497
+
494
498
  // Load package.json
495
499
  const projPkgPath = path.resolve(cwd, "package.json");
496
500
  const projPkg = await fsx.readJson<PackageJson>(projPkgPath);
@@ -1,15 +1,14 @@
1
1
  import ts from "typescript";
2
2
  import path from "path";
3
- import os from "os";
4
- import { pathx, Worker, type WorkerProxy } from "@simplysm/core-node";
5
3
  import { err as errNs } from "@simplysm/core-common";
6
4
  import { consola } from "consola";
7
5
  import type { SdConfig } from "../sd-config.types";
8
- import { parseRootTsconfig, type TypecheckEnv } from "../utils/tsconfig";
9
6
  import { loadSdConfig } from "../utils/sd-config";
10
7
  import { deserializeDiagnostic } from "../utils/typecheck-serialization";
11
- import type { DtsBuildInfo, DtsBuildResult } from "../workers/dts.worker";
12
- import type * as DtsWorkerModule from "../workers/dts.worker";
8
+ import { createBuildEngine } from "../engines/index";
9
+ import { typecheckNonPackageFiles } from "../utils/typecheck-non-package";
10
+ import { runWithConcurrency, getMaxConcurrency } from "../utils/concurrency";
11
+ import type { EngineResult } from "../engines/types";
13
12
 
14
13
  //#region Types
15
14
 
@@ -33,138 +32,23 @@ export interface TypecheckResult {
33
32
  formattedOutput: string;
34
33
  }
35
34
 
36
- // Package information (for classifying files under packages/*)
37
- interface PackageInfo {
38
- name: string;
39
- dir: string;
40
- envs: TypecheckEnv[]; // neutral is ["node", "browser"], others are single environment
41
- }
42
-
43
- // Typecheck task information (internal use)
44
- interface TypecheckTask {
45
- /** Task display name (e.g., "package: core-common [node]") */
46
- displayName: string;
47
- /** Information to pass to dts.worker */
48
- buildInfo: DtsBuildInfo;
49
- }
50
-
51
35
  //#endregion
52
36
 
53
37
  //#region Utilities
54
38
 
55
- /** Regular expression for path classification */
56
- const PATH_PATTERNS = {
57
- /** packages/{pkg}/... */
58
- PACKAGE: /^packages\/([^/]+)\//,
59
- } as const;
39
+ const PACKAGE_PATH_PATTERN = /^packages\/([^/]+)/;
60
40
 
61
41
  /**
62
- * Convert package target to typecheck environment list.
63
- * - node/browser: that environment only
64
- * - neutral: both node + browser
65
- * - client: treated as browser
66
- * @param target package build target
67
- * @returns list of typecheck environments
42
+ * Extract package names from target paths.
43
+ * "packages/core-common" "core-common"
68
44
  */
69
- function toTypecheckEnvs(target: string | undefined): TypecheckEnv[] {
70
- if (target === "node") return ["node"];
71
- if (target === "browser" || target === "client") return ["browser"];
72
- // neutral or unspecified: both
73
- return ["node", "browser"];
74
- }
75
-
76
- /**
77
- * Extract package information from file paths.
78
- * Excludes packages with scripts target.
79
- * @internal exported for testing
80
- */
81
- export function extractPackages(
82
- fileNames: string[],
83
- cwd: string,
84
- config: SdConfig,
85
- ): Map<string, PackageInfo> {
86
- const packages = new Map<string, PackageInfo>();
87
-
88
- for (const fileName of fileNames) {
89
- const relativePath = pathx.posix(path.relative(cwd, fileName));
90
-
91
- // packages/{pkg}/...
92
- const packageMatch = relativePath.match(PATH_PATTERNS.PACKAGE);
93
- if (packageMatch) {
94
- const pkgName = packageMatch[1];
95
- // Exclude packages with scripts target
96
- if (config.packages[pkgName]?.target === "scripts") continue;
97
-
98
- if (!packages.has(pkgName)) {
99
- packages.set(pkgName, {
100
- name: pkgName,
101
- dir: path.resolve(cwd, "packages", pkgName),
102
- envs: toTypecheckEnvs(config.packages[pkgName]?.target),
103
- });
104
- }
105
- }
45
+ function extractTargetPackageNames(targets: string[]): Set<string> {
46
+ const names = new Set<string>();
47
+ for (const target of targets) {
48
+ const match = target.match(PACKAGE_PATH_PATTERN);
49
+ if (match) names.add(match[1]);
106
50
  }
107
-
108
- return packages;
109
- }
110
-
111
- /**
112
- * Check if there are files not under packages/ in the tsconfig file list.
113
- */
114
- function hasNonPackageFiles(fileNames: string[], cwd: string): boolean {
115
- return fileNames.some((f) => {
116
- const relativePath = pathx.posix(path.relative(cwd, f));
117
- if (!relativePath.startsWith("packages/")) return true;
118
- // Also treat files directly under package root (config files) as non-package
119
- return relativePath.split("/").length === 3;
120
- });
121
- }
122
-
123
- /**
124
- * Create typecheck task list from package information.
125
- * Neutral packages are split into node/browser environments and checked separately.
126
- * @param packages package information map
127
- * @param cwd current working directory
128
- * @param includeNonPackage add "other" task if non-package files exist
129
- * @returns array of typecheck task information
130
- */
131
- function createTypecheckTasks(
132
- packages: Map<string, PackageInfo>,
133
- cwd: string,
134
- includeNonPackage: boolean,
135
- ): TypecheckTask[] {
136
- const tasks: TypecheckTask[] = [];
137
-
138
- // packages/* - create separate task per env
139
- for (const info of packages.values()) {
140
- for (const env of info.envs) {
141
- const envSuffix = info.envs.length > 1 ? ` [${env}]` : "";
142
- tasks.push({
143
- displayName: `package: ${info.name}${envSuffix}`,
144
- buildInfo: {
145
- name: info.name,
146
- cwd,
147
- pkgDir: info.dir,
148
- env,
149
- emit: false, // Only typecheck (no dts generation)
150
- },
151
- });
152
- }
153
- }
154
-
155
- // non-package files (tests/, root *.ts, etc.)
156
- if (includeNonPackage) {
157
- tasks.push({
158
- displayName: "other",
159
- buildInfo: {
160
- name: "root",
161
- cwd,
162
- emit: false,
163
- },
164
- });
165
- }
166
-
167
- return tasks;
51
+ return names;
168
52
  }
169
53
 
170
54
  //#endregion
@@ -172,14 +56,12 @@ function createTypecheckTasks(
172
56
  //#region Main
173
57
 
174
58
  /**
175
- * Execute TypeScript typecheck and return results.
59
+ * Execute TypeScript typecheck using BuildEngine.
176
60
  *
177
- * - Load `tsconfig.json` to apply compiler options
178
- * - Load `sd.config.ts` to check package target info per package (use defaults if missing)
179
- * - Perform actual parallel typecheck using Worker threads
180
- * - Use incremental compilation (`.cache/typecheck-{env}.tsbuildinfo`)
181
- * - Show progress using consola logging
182
- * - Return results only, no stdout output or exitCode setting
61
+ * For each package in sd.config.ts:
62
+ * - Library/Server packages BuildEngine.run({js:false, dts:false})
63
+ * - Scripts/Client packages excluded
64
+ * Non-package files typecheckNonPackageFiles utility
183
65
  *
184
66
  * @param options - typecheck execution options
185
67
  * @returns typecheck result (success status, error/warning counts, formatted output string)
@@ -197,51 +79,38 @@ export async function executeTypecheck(options: TypecheckOptions): Promise<Typec
197
79
  getNewLine: () => ts.sys.newLine,
198
80
  };
199
81
 
200
- // Load and parse tsconfig.json
201
- let parsedConfig: ts.ParsedCommandLine;
202
- try {
203
- parsedConfig = parseRootTsconfig(cwd);
204
- } catch (err) {
205
- logger.error(errNs.message(err));
206
- return { success: false, errorCount: 1, warningCount: 0, formattedOutput: "" };
207
- }
208
-
209
82
  // Load sd.config.ts
210
83
  let sdConfig: SdConfig;
211
84
  try {
212
85
  sdConfig = await loadSdConfig({ cwd, dev: false, options: options.options });
213
86
  logger.debug("sd.config.ts loaded");
214
- } catch (err) {
215
- // Use defaults if sd.config.ts is missing or load fails
87
+ } catch {
216
88
  sdConfig = { packages: {} };
217
- logger.debug("sd.config.ts load failed, using defaults", err);
89
+ logger.debug("sd.config.ts load failed, using defaults");
218
90
  }
219
91
 
220
- // Filter fileNames if targets specified
221
- const fileNames = pathx.filterByTargets(parsedConfig.fileNames, targets, cwd);
92
+ // Determine target package names from path-based targets
93
+ const targetNames = extractTargetPackageNames(targets);
222
94
 
223
- if (fileNames.length === 0) {
224
- logger.info("no files to typecheck");
225
- return {
226
- success: true,
227
- errorCount: 0,
228
- warningCount: 0,
229
- formattedOutput: "✔ No files to typecheck.\n",
230
- };
231
- }
95
+ // Collect packages to typecheck (exclude scripts and client)
96
+ const typecheckPackages: Array<{ name: string; dir: string; config: any }> = [];
97
+ for (const [name, config] of Object.entries(sdConfig.packages)) {
98
+ if (config == null) continue;
99
+ if (config.target === "scripts" || config.target === "client") continue;
100
+ if (targetNames.size > 0 && !targetNames.has(name)) continue;
232
101
 
233
- // Extract package information
234
- const packages = extractPackages(fileNames, cwd, sdConfig);
235
- logger.debug("package extraction complete", {
236
- packageCount: packages.size,
237
- packages: [...packages.keys()],
238
- });
102
+ typecheckPackages.push({
103
+ name,
104
+ dir: path.join(cwd, "packages", name),
105
+ config,
106
+ });
107
+ }
239
108
 
240
- // Create typecheck tasks
241
- const nonPackage = hasNonPackageFiles(fileNames, cwd);
242
- const tasks = createTypecheckTasks(packages, cwd, nonPackage);
109
+ // Non-package typecheck: run when no targets or when targets include non-package paths
110
+ const includeNonPackage = targets.length === 0 || targets.some((t) => !t.startsWith("packages/"));
243
111
 
244
- if (tasks.length === 0) {
112
+ if (typecheckPackages.length === 0 && !includeNonPackage) {
113
+ logger.info("no typecheck targets");
245
114
  return {
246
115
  success: true,
247
116
  errorCount: 0,
@@ -250,89 +119,71 @@ export async function executeTypecheck(options: TypecheckOptions): Promise<Typec
250
119
  };
251
120
  }
252
121
 
253
- // Concurrency setting: use 7/8 of CPU cores (standard default for parallel build tools, reserves for OS/other processes, minimum 1, at most task count)
254
- const maxConcurrency = Math.max(Math.floor((os.cpus().length * 7) / 8), 1);
255
- const concurrency = Math.min(maxConcurrency, tasks.length);
256
- logger.debug("concurrency configuration", { concurrency, maxConcurrency, taskCount: tasks.length });
257
-
258
- // Create Worker pool
259
- const workerPath = import.meta.resolve("../workers/dts.worker");
260
- const workers: WorkerProxy<typeof DtsWorkerModule>[] = [];
261
- for (let i = 0; i < concurrency; i++) {
262
- workers.push(Worker.create<typeof DtsWorkerModule>(workerPath));
263
- }
264
-
265
- const allResults: { displayName: string; result: DtsBuildResult }[] = [];
266
-
267
- try {
268
- let taskIndex = 0;
122
+ // Create BuildEngine tasks with concurrency limit
123
+ const allDiagnostics: ts.Diagnostic[] = [];
124
+ let totalErrorCount = 0;
125
+ let totalWarningCount = 0;
126
+ const fileCache = new Map<string, string>();
127
+
128
+ if (typecheckPackages.length > 0) {
129
+ const tasks = typecheckPackages.map((pkg) => async (): Promise<EngineResult> => {
130
+ const engine = createBuildEngine(
131
+ { name: pkg.name, dir: pkg.dir, config: pkg.config },
132
+ { cwd },
133
+ );
134
+ try {
135
+ logger.debug(`[${pkg.name}] typecheck started`);
136
+ const result = await engine.run({ js: false, dts: false });
137
+ logger.debug(`[${pkg.name}] typecheck ${result.dts.success ? "completed" : "failed"}`);
138
+ return result;
139
+ } finally {
140
+ await engine.stop();
141
+ }
142
+ });
269
143
 
270
- async function runNextTask(worker: WorkerProxy<typeof DtsWorkerModule>): Promise<void> {
271
- while (taskIndex < tasks.length) {
272
- const currentIndex = taskIndex++;
273
- const task = tasks[currentIndex];
144
+ const concurrency = getMaxConcurrency();
145
+ logger.start(`Running typecheck... (${tasks.length} packages, concurrency: ${concurrency})`);
146
+ const results = await runWithConcurrency(tasks, concurrency);
147
+ logger.success("Typecheck execution completed");
274
148
 
275
- logger.debug(`[${task.displayName}] typecheck started`);
276
- try {
277
- const result = await worker.build(task.buildInfo);
278
- allResults.push({ displayName: task.displayName, result });
279
- if (result.success) {
280
- logger.debug(`[${task.displayName}] typecheck completed`);
281
- } else {
282
- logger.debug(`[${task.displayName}] typecheck failed`, { errorCount: result.errorCount });
283
- }
284
- } catch (err) {
285
- logger.error(`Worker error: ${task.displayName}`, {
286
- error: errNs.message(err),
287
- });
288
- allResults.push({
289
- displayName: task.displayName,
290
- result: {
291
- success: false,
292
- errors: [errNs.message(err)],
293
- diagnostics: [],
294
- errorCount: 1,
295
- warningCount: 0,
296
- },
297
- });
149
+ // Aggregate engine results
150
+ for (const settled of results) {
151
+ if (settled.status === "fulfilled") {
152
+ const engineResult = settled.value;
153
+ const dtsDiags = engineResult.dts.diagnostics.map((d) => deserializeDiagnostic(d, fileCache));
154
+ allDiagnostics.push(...dtsDiags);
155
+ // Count errors/warnings from deserialized diagnostics
156
+ // Use numeric category values (ts.DiagnosticCategory: Error=1, Warning=0)
157
+ totalErrorCount += dtsDiags.filter((d) => d.category === 1).length;
158
+ totalWarningCount += dtsDiags.filter((d) => d.category === 0).length;
159
+ if (!engineResult.dts.success && dtsDiags.length === 0) {
160
+ totalErrorCount += engineResult.dts.errors.length || 1;
298
161
  }
162
+ } else {
163
+ totalErrorCount += 1;
164
+ logger.error("Engine task failed", { error: errNs.message(settled.reason) });
299
165
  }
300
166
  }
301
-
302
- logger.start(`Running typecheck... (${tasks.length} targets, concurrency: ${concurrency})`);
303
- await Promise.all(workers.map((worker) => runNextTask(worker)));
304
- logger.success("Typecheck execution completed");
305
- } finally {
306
- await Promise.all(workers.map((w) => w.terminate()));
307
167
  }
308
168
 
309
- // Aggregate results
310
- const allDiagnostics: ts.Diagnostic[] = [];
311
- let totalErrorCount = 0;
312
- let totalWarningCount = 0;
313
- const fileCache = new Map<string, string>(); // File content cache (prevent duplicate reads of same file)
314
- for (const { result } of allResults) {
315
- totalErrorCount += result.errorCount;
316
- totalWarningCount += result.warningCount;
317
- for (const serialized of result.diagnostics) {
318
- allDiagnostics.push(deserializeDiagnostic(serialized, fileCache));
319
- }
169
+ // Non-package typecheck
170
+ if (includeNonPackage) {
171
+ logger.debug("Running non-package typecheck");
172
+ const nonPkgResult = typecheckNonPackageFiles(cwd);
173
+ totalErrorCount += nonPkgResult.errorCount;
174
+ totalWarningCount += nonPkgResult.warningCount;
175
+ const nonPkgDiags = nonPkgResult.diagnostics.map((d) => deserializeDiagnostic(d, fileCache));
176
+ allDiagnostics.push(...nonPkgDiags);
320
177
  }
321
178
 
179
+ // Log summary
322
180
  if (totalErrorCount > 0) {
323
- logger.error("typecheck errors occurred", {
324
- errorCount: totalErrorCount,
325
- warningCount: totalWarningCount,
326
- });
327
- } else if (totalWarningCount > 0) {
328
- logger.info("typecheck complete (warnings present)", {
329
- errorCount: totalErrorCount,
330
- warningCount: totalWarningCount,
331
- });
181
+ logger.error("typecheck errors occurred", { errorCount: totalErrorCount, warningCount: totalWarningCount });
332
182
  } else {
333
183
  logger.info("typecheck complete", { errorCount: totalErrorCount, warningCount: totalWarningCount });
334
184
  }
335
185
 
186
+ // Format diagnostics output
336
187
  let formattedOutput = "";
337
188
  if (allDiagnostics.length > 0) {
338
189
  const uniqueDiagnostics = ts.sortAndDeduplicateDiagnostics(allDiagnostics);
@@ -347,22 +198,4 @@ export async function executeTypecheck(options: TypecheckOptions): Promise<Typec
347
198
  };
348
199
  }
349
200
 
350
- /**
351
- * Run TypeScript typecheck.
352
- *
353
- * Calls `executeTypecheck()`, outputs results to stdout, and sets `process.exitCode` if errors occur.
354
- *
355
- * @param options - typecheck execution options
356
- * @returns resolves when complete. If errors are found, sets `process.exitCode` to 1 and resolves (does not throw)
357
- */
358
- export async function runTypecheck(options: TypecheckOptions): Promise<void> {
359
- const result = await executeTypecheck(options);
360
- if (result.formattedOutput) {
361
- process.stdout.write(result.formattedOutput);
362
- }
363
- if (!result.success) {
364
- process.exitCode = 1;
365
- }
366
- }
367
-
368
201
  //#endregion
@@ -1,22 +1,23 @@
1
- // packages/cli/src/commands/watch.ts
2
1
  import {
3
- WatchOrchestrator,
4
- type WatchOrchestratorOptions,
5
- } from "../orchestrators/WatchOrchestrator";
2
+ DevWatchOrchestrator,
3
+ type DevWatchOrchestratorOptions,
4
+ } from "../orchestrators/DevWatchOrchestrator";
6
5
 
7
6
  /**
8
- * Build library packages in watch mode.
7
+ * Build all packages in watch mode.
9
8
  *
10
9
  * - Load `sd.config.ts` to check build target info per package (required)
11
10
  * - `node`/`browser`/`neutral` target: build in esbuild watch mode + generate .d.ts
11
+ * - `server` target: build in esbuild watch mode (no runtime)
12
+ * - `scripts` target with watch config: run hook on file changes
12
13
  * - Auto rebuild on file changes
13
14
  * - Terminate with SIGINT/SIGTERM signals
14
15
  *
15
- * @param options - watch execution options
16
+ * @param options - watch execution options (targets, options)
16
17
  * @returns resolves on termination signal
17
18
  */
18
- export async function runWatch(options: WatchOrchestratorOptions): Promise<void> {
19
- const orchestrator = new WatchOrchestrator(options);
19
+ export async function runWatch(options: Omit<DevWatchOrchestratorOptions, "mode">): Promise<void> {
20
+ const orchestrator = new DevWatchOrchestrator({ mode: "watch", ...options });
20
21
 
21
22
  try {
22
23
  await orchestrator.initialize();
@@ -0,0 +1,190 @@
1
+ import { Worker, type WorkerProxy } from "@simplysm/core-node";
2
+ import { consola } from "consola";
3
+ import type * as NgtscBuildWorkerModule from "../workers/ngtsc-build.worker";
4
+ import type { BuildResult, ResultCollector } from "../infra/ResultCollector";
5
+ import type { RebuildManager } from "../utils/rebuild-manager";
6
+ import type { BuildEngine, BuildOutput, BuildPackageInfo, EngineResult } from "./types";
7
+
8
+ const logger = consola.withTag("sd:cli:engine:ngtsc");
9
+
10
+ /**
11
+ * NgtscEngine options
12
+ */
13
+ export interface NgtscEngineOptions {
14
+ cwd: string;
15
+ pkg: BuildPackageInfo;
16
+ /** ResultCollector for watch mode rebuild reporting */
17
+ resultCollector?: ResultCollector;
18
+ /** RebuildManager for watch mode batch coordination */
19
+ rebuildManager?: RebuildManager;
20
+ }
21
+
22
+ /**
23
+ * NgtscProgram-based build engine for Angular Library packages
24
+ *
25
+ * Wraps a single ngtsc-build.worker that uses NgtscProgram for AOT compilation.
26
+ * Angular packages are detected by the presence of angularCompilerOptions in tsconfig.json.
27
+ */
28
+ export class NgtscEngine implements BuildEngine {
29
+ private readonly _cwd: string;
30
+ private readonly _pkg: BuildPackageInfo;
31
+ private readonly _resultCollector: ResultCollector | undefined;
32
+ private readonly _rebuildManager: RebuildManager | undefined;
33
+
34
+ private _worker: WorkerProxy<typeof NgtscBuildWorkerModule> | undefined;
35
+ private _isWatchMode = false;
36
+
37
+ constructor(options: NgtscEngineOptions) {
38
+ this._cwd = options.cwd;
39
+ this._pkg = options.pkg;
40
+ this._resultCollector = options.resultCollector;
41
+ this._rebuildManager = options.rebuildManager;
42
+ }
43
+
44
+ /**
45
+ * One-time build (production)
46
+ */
47
+ async run(output: BuildOutput): Promise<EngineResult> {
48
+ this._createWorker();
49
+
50
+ const result = await this._worker!.build({
51
+ name: this._pkg.name,
52
+ cwd: this._cwd,
53
+ pkgDir: this._pkg.dir,
54
+ output,
55
+ });
56
+
57
+ return {
58
+ success: result.js.success && result.dts.success,
59
+ js: {
60
+ success: result.js.success,
61
+ errors: result.js.errors ?? [],
62
+ warnings: result.js.warnings ?? [],
63
+ },
64
+ dts: {
65
+ success: result.dts.success,
66
+ errors: result.dts.errors ?? [],
67
+ warnings: [],
68
+ diagnostics: result.dts.diagnostics,
69
+ },
70
+ };
71
+ }
72
+
73
+ /**
74
+ * Start watch mode
75
+ * Promise resolves when initial build completes.
76
+ */
77
+ async startWatch(output: BuildOutput): Promise<void> {
78
+ this._isWatchMode = true;
79
+ this._createWorker();
80
+
81
+ return new Promise<void>((resolve) => {
82
+ let isInitialBuild = true;
83
+ const workerKey = `${this._pkg.name}:build`;
84
+
85
+ this._worker!.on("buildStart", () => {
86
+ if (!isInitialBuild && this._rebuildManager != null) {
87
+ this._rebuildManager.registerBuild(
88
+ workerKey,
89
+ `${this._pkg.name} (${this._pkg.config.target})`,
90
+ );
91
+ }
92
+ });
93
+
94
+ this._worker!.on("build", (data) => {
95
+ const event = data;
96
+
97
+ if (event.js.warnings != null && event.js.warnings.length > 0) {
98
+ logger.warn(`${this._pkg.name}: ${event.js.warnings.join(", ")}`);
99
+ }
100
+
101
+ // Report JS result
102
+ const buildResult: BuildResult = {
103
+ name: this._pkg.name,
104
+ target: this._pkg.config.target,
105
+ type: "build",
106
+ status: event.js.success ? "success" : "error",
107
+ message: event.js.errors?.join("\n"),
108
+ };
109
+ this._resultCollector?.add(buildResult);
110
+
111
+ // Report DTS result
112
+ const dtsResult: BuildResult = {
113
+ name: this._pkg.name,
114
+ target: this._pkg.config.target,
115
+ type: "dts",
116
+ status: event.dts.success ? "success" : "error",
117
+ message: event.dts.errors?.join("\n"),
118
+ };
119
+ this._resultCollector?.add(dtsResult);
120
+
121
+ if (isInitialBuild) {
122
+ isInitialBuild = false;
123
+ resolve();
124
+ }
125
+ });
126
+
127
+ this._worker!.on("error", (data) => {
128
+ const event = data as { message: string };
129
+ const result: BuildResult = {
130
+ name: this._pkg.name,
131
+ target: this._pkg.config.target,
132
+ type: "build",
133
+ status: "error",
134
+ message: event.message,
135
+ };
136
+ this._resultCollector?.add(result);
137
+
138
+ if (isInitialBuild) {
139
+ isInitialBuild = false;
140
+ resolve();
141
+ }
142
+ });
143
+
144
+ this._worker!
145
+ .startWatch({
146
+ name: this._pkg.name,
147
+ cwd: this._cwd,
148
+ pkgDir: this._pkg.dir,
149
+ output,
150
+ })
151
+ .catch(() => {
152
+ if (isInitialBuild) {
153
+ isInitialBuild = false;
154
+ resolve();
155
+ }
156
+ });
157
+ });
158
+ }
159
+
160
+ /**
161
+ * Stop engine and clean up resources
162
+ */
163
+ async stop(): Promise<void> {
164
+ const shutdownTimeout = 3000;
165
+
166
+ if (this._isWatchMode && this._worker != null) {
167
+ try {
168
+ await Promise.race([
169
+ this._worker.stopWatch(),
170
+ new Promise<void>((resolve) => setTimeout(resolve, shutdownTimeout)),
171
+ ]);
172
+ } catch {
173
+ // Continue even if stopWatch fails
174
+ }
175
+ }
176
+
177
+ if (this._worker != null) {
178
+ await this._worker.terminate();
179
+ this._worker = undefined;
180
+ }
181
+ }
182
+
183
+ /**
184
+ * Create worker instance
185
+ */
186
+ private _createWorker(): void {
187
+ const workerPath = import.meta.resolve("../workers/ngtsc-build.worker");
188
+ this._worker = Worker.create<typeof NgtscBuildWorkerModule>(workerPath);
189
+ }
190
+ }