@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
@@ -1,734 +0,0 @@
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 {
9
- parseRootTsconfig,
10
- getPackageSourceFiles,
11
- getCompilerOptionsForPackage,
12
- } from "../utils/tsconfig";
13
- import {
14
- createServerEsbuildOptions,
15
- collectUninstalledOptionalPeerDeps,
16
- collectNativeModuleExternals,
17
- writeChangedOutputFiles,
18
- } from "../utils/esbuild-config";
19
- import { registerCleanupHandlers, createOnceGuard, applyDebugLevel } from "../utils/worker-utils";
20
- import { collectDeps } from "../utils/package-utils";
21
- import { copyPublicFiles, watchPublicFiles } from "../utils/copy-public";
22
-
23
- //#region Types
24
-
25
- /**
26
- * Server build information (for one-time build)
27
- */
28
- export interface ServerBuildInfo {
29
- name: string;
30
- cwd: string;
31
- pkgDir: string;
32
- /** Environment variables to substitute during build */
33
- env?: Record<string, string>;
34
- /** Runtime configuration (recorded in dist/.config.json) */
35
- configs?: Record<string, unknown>;
36
- /** External modules manually specified in sd.config.ts */
37
- externals?: string[];
38
- /** PM2 configuration (generates dist/pm2.config.cjs when specified) */
39
- pm2?: {
40
- name?: string;
41
- ignoreWatchPaths?: string[];
42
- };
43
- /** Package manager to use (affects mise.toml or volta settings generation) */
44
- packageManager?: "volta" | "mise";
45
- }
46
-
47
- /**
48
- * Server build result
49
- */
50
- export interface ServerBuildResult {
51
- success: boolean;
52
- mainJsPath: string;
53
- errors?: string[];
54
- warnings?: string[];
55
- }
56
-
57
- /**
58
- * Server watch information
59
- */
60
- export interface ServerWatchInfo {
61
- name: string;
62
- cwd: string;
63
- pkgDir: string;
64
- /** Environment variables to substitute during build */
65
- env?: Record<string, string>;
66
- /** Runtime configuration (recorded in dist/.config.json) */
67
- configs?: Record<string, unknown>;
68
- /** External modules manually specified in sd.config.ts */
69
- externals?: string[];
70
- /** replaceDeps configuration from sd.config.ts */
71
- replaceDeps?: Record<string, string>;
72
- }
73
-
74
- /**
75
- * Build event
76
- */
77
- export interface ServerBuildEvent {
78
- success: boolean;
79
- mainJsPath: string;
80
- errors?: string[];
81
- warnings?: string[];
82
- }
83
-
84
- /**
85
- * Error event
86
- */
87
- export interface ServerErrorEvent {
88
- message: string;
89
- }
90
-
91
- /**
92
- * Worker event types
93
- */
94
- export interface ServerWorkerEvents extends Record<string, unknown> {
95
- buildStart: Record<string, never>;
96
- build: ServerBuildEvent;
97
- error: ServerErrorEvent;
98
- }
99
-
100
- //#endregion
101
-
102
- //#region Resource Management
103
-
104
- applyDebugLevel();
105
-
106
- const logger = consola.withTag("sd:cli:server:worker");
107
-
108
- /** esbuild build context (to be cleaned up) */
109
- let esbuildContext: esbuild.BuildContext | undefined;
110
-
111
- /** Last build metafile (for filtering changed files on rebuild) */
112
- let lastMetafile: esbuild.Metafile | undefined;
113
-
114
- /** Public files watcher (to be cleaned up) */
115
- let publicWatcher: FsWatcher | undefined;
116
-
117
- /** Source + scope packages watcher (to be cleaned up) */
118
- let srcWatcher: FsWatcher | undefined;
119
-
120
- /**
121
- * Clean up resources
122
- */
123
- async function cleanup(): Promise<void> {
124
- // Capture global variables to temporary variables and initialize
125
- // (other calls can modify global variables while Promise.all is waiting)
126
- const contextToDispose = esbuildContext;
127
- esbuildContext = undefined;
128
- lastMetafile = undefined;
129
-
130
- const watcherToClose = publicWatcher;
131
- publicWatcher = undefined;
132
-
133
- const srcWatcherToClose = srcWatcher;
134
- srcWatcher = undefined;
135
-
136
- if (contextToDispose != null) {
137
- await contextToDispose.dispose();
138
- }
139
-
140
- if (watcherToClose != null) {
141
- await watcherToClose.close();
142
- }
143
-
144
- if (srcWatcherToClose != null) {
145
- await srcWatcherToClose.close();
146
- }
147
- }
148
-
149
- /**
150
- * Collect external modules from three sources and merge them.
151
- * 1. Uninstalled optional peer dependencies
152
- * 2. Native modules from binding.gyp
153
- * 3. Manually specified in sd.config.ts
154
- */
155
- function collectAllExternals(pkgDir: string, manualExternals?: string[]): string[] {
156
- logger.debug("[externals] Scanning optional peer deps...");
157
- let stepStart = performance.now();
158
- const optionalPeerDeps = collectUninstalledOptionalPeerDeps(pkgDir);
159
- logger.debug(
160
- `[externals] Optional peer deps done: ${String(optionalPeerDeps.length)} found (${Math.round(performance.now() - stepStart)}ms)`,
161
- );
162
-
163
- logger.debug("[externals] Scanning native modules...");
164
- stepStart = performance.now();
165
- const nativeModules = collectNativeModuleExternals(pkgDir);
166
- logger.debug(
167
- `[externals] Native modules done: ${String(nativeModules.length)} found (${Math.round(performance.now() - stepStart)}ms)`,
168
- );
169
-
170
- const manual = manualExternals ?? [];
171
-
172
- const merged = [...new Set([...optionalPeerDeps, ...nativeModules, ...manual])];
173
-
174
- if (optionalPeerDeps.length > 0) {
175
- logger.debug("Uninstalled optional peer deps (external):", optionalPeerDeps);
176
- }
177
- if (nativeModules.length > 0) {
178
- logger.debug("Native modules (external):", nativeModules);
179
- }
180
- if (manual.length > 0) {
181
- logger.debug("Manually specified (external):", manual);
182
- }
183
-
184
- return merged;
185
- }
186
-
187
- /**
188
- * Generate files for production deployment (called only in one-time build)
189
- *
190
- * - dist/package.json: include external modules as dependencies (add volta field if volta is used)
191
- * - dist/mise.toml: specify Node version (only when packageManager === "mise")
192
- * - dist/openssl.cnf: enable legacy OpenSSL provider
193
- * - dist/pm2.config.cjs: PM2 process configuration (only when pm2 option is present)
194
- */
195
- function generateProductionFiles(info: ServerBuildInfo, externals: string[]): void {
196
- const distDir = path.join(info.pkgDir, "dist");
197
- const pkgJson = JSON.parse(fs.readFileSync(path.join(info.pkgDir, "package.json"), "utf-8"));
198
-
199
- // dist/package.json
200
- logger.debug("GEN package.json...");
201
- const distPkgJson: Record<string, unknown> = {
202
- name: pkgJson.name,
203
- version: pkgJson.version,
204
- type: pkgJson.type,
205
- };
206
- if (externals.length > 0) {
207
- const deps: Record<string, string> = {};
208
- for (const ext of externals) {
209
- deps[ext] = "*";
210
- }
211
- distPkgJson["dependencies"] = deps;
212
- }
213
- if (info.packageManager === "volta") {
214
- const nodeVersion = execaSync("node", ["-v"]).stdout.trim();
215
- distPkgJson["volta"] = { node: nodeVersion };
216
- }
217
- fs.writeFileSync(path.join(distDir, "package.json"), JSON.stringify(distPkgJson, undefined, 2));
218
-
219
- // dist/mise.toml (only when packageManager === "mise")
220
- if (info.packageManager === "mise") {
221
- logger.debug("GEN mise.toml...");
222
- const rootMiseTomlPath = path.join(info.cwd, "mise.toml");
223
- let nodeVersion = "20";
224
- if (fs.existsSync(rootMiseTomlPath)) {
225
- const miseContent = fs.readFileSync(rootMiseTomlPath, "utf-8");
226
- const match = /node\s*=\s*"([^"]+)"/.exec(miseContent);
227
- if (match != null) {
228
- nodeVersion = match[1];
229
- }
230
- }
231
- fs.writeFileSync(path.join(distDir, "mise.toml"), `[tools]\nnode = "${nodeVersion}"\n`);
232
- }
233
-
234
- // dist/openssl.cnf
235
- logger.debug("GEN openssl.cnf...");
236
- fs.writeFileSync(
237
- path.join(distDir, "openssl.cnf"),
238
- [
239
- "nodejs_conf = openssl_init",
240
- "",
241
- "[openssl_init]",
242
- "providers = provider_sect",
243
- "ssl_conf = ssl_sect",
244
- "",
245
- "[provider_sect]",
246
- "default = default_sect",
247
- "legacy = legacy_sect",
248
- "",
249
- "[default_sect]",
250
- "activate = 1",
251
- "",
252
- "[legacy_sect]",
253
- "activate = 1",
254
- "",
255
- "[ssl_sect]",
256
- "system_default = system_default_sect",
257
- "",
258
- "[system_default_sect]",
259
- "Options = UnsafeLegacyRenegotiation",
260
- ].join("\n"),
261
- );
262
-
263
- // dist/pm2.config.cjs (only when pm2 option is present)
264
- if (info.pm2 != null) {
265
- logger.debug("GEN pm2.config.cjs...");
266
-
267
- const pm2Name = info.pm2.name ?? pkgJson.name.replace(/@/g, "").replace(/[/\\]/g, "-");
268
- const ignoreWatch = JSON.stringify([
269
- "node_modules",
270
- "www",
271
- ...(info.pm2.ignoreWatchPaths ?? []),
272
- ]);
273
- const envObj: Record<string, string> = {
274
- NODE_ENV: "production",
275
- TZ: "Asia/Seoul",
276
- ...(info.env ?? {}),
277
- };
278
- const envStr = JSON.stringify(envObj, undefined, 4);
279
-
280
- const interpreterLine =
281
- info.packageManager === "volta"
282
- ? ""
283
- : ` interpreter: cp.execSync("mise which node").toString().trim(),\n`;
284
-
285
- const pm2Config = [
286
- ...(info.packageManager !== "volta" ? [`const cp = require("child_process");`, ``] : []),
287
- `module.exports = {`,
288
- ` name: ${JSON.stringify(pm2Name)},`,
289
- ` script: "main.js",`,
290
- ` watch: true,`,
291
- ` watch_delay: 2000,`,
292
- ` ignore_watch: ${ignoreWatch},`,
293
- interpreterLine.trimEnd(),
294
- ` interpreter_args: "--openssl-config=openssl.cnf",`,
295
- ` env: ${envStr.replace(/\n/g, "\n ")},`,
296
- ` arrayProcess: "concat",`,
297
- ` useDelTargetNull: true,`,
298
- `};`,
299
- ]
300
- .filter((line) => line !== "")
301
- .join("\n");
302
-
303
- fs.writeFileSync(path.join(distDir, "pm2.config.cjs"), pm2Config);
304
- }
305
- }
306
-
307
- // Clean up resources before process termination (SIGTERM/SIGINT)
308
- // Note: worker.terminate() does not call these handlers and terminates immediately.
309
- // However, normal shutdown in watch mode is handled via SIGINT/SIGTERM from the main process, so this is fine.
310
- registerCleanupHandlers(cleanup, logger);
311
-
312
- //#endregion
313
-
314
- //#region Worker
315
-
316
- /**
317
- * One-time build
318
- */
319
- async function build(info: ServerBuildInfo): Promise<ServerBuildResult> {
320
- const mainJsPath = path.join(info.pkgDir, "dist", "main.js");
321
-
322
- try {
323
- // Parse tsconfig
324
- logger.debug("[build] Parsing tsconfig...");
325
- let stepStart = performance.now();
326
- const parsedConfig = parseRootTsconfig(info.cwd);
327
- logger.debug(`[build] tsconfig parsed (${Math.round(performance.now() - stepStart)}ms)`);
328
-
329
- stepStart = performance.now();
330
- const entryPoints = getPackageSourceFiles(info.pkgDir, parsedConfig);
331
- logger.debug(
332
- `[build] Found ${String(entryPoints.length)} source files (${Math.round(performance.now() - stepStart)}ms)`,
333
- );
334
-
335
- // Server target is node environment
336
- logger.debug("[build] Getting compiler options...");
337
- stepStart = performance.now();
338
- const compilerOptions = await getCompilerOptionsForPackage(
339
- parsedConfig.options,
340
- "node",
341
- info.pkgDir,
342
- );
343
- logger.debug(
344
- `[build] Compiler options ready (${Math.round(performance.now() - stepStart)}ms)`,
345
- );
346
-
347
- // Collect all externals (optional peer deps + native modules + manual)
348
- logger.debug("[build] Collecting externals...");
349
- stepStart = performance.now();
350
- const external = collectAllExternals(info.pkgDir, info.externals);
351
- logger.debug(
352
- `[build] Collected ${String(external.length)} externals (${Math.round(performance.now() - stepStart)}ms)`,
353
- );
354
-
355
- // One-time esbuild
356
- logger.debug("[build] Creating esbuild options...");
357
- const esbuildOptions = createServerEsbuildOptions({
358
- pkgDir: info.pkgDir,
359
- entryPoints,
360
- compilerOptions,
361
- env: info.env,
362
- external,
363
- });
364
-
365
- logger.debug("[build] Running esbuild...");
366
- stepStart = performance.now();
367
- const result = await esbuild.build(esbuildOptions);
368
- logger.debug(`[build] esbuild done (${Math.round(performance.now() - stepStart)}ms)`);
369
-
370
- // Generate .config.json
371
- const confDistPath = path.join(info.pkgDir, "dist", ".config.json");
372
- fs.writeFileSync(confDistPath, JSON.stringify(info.configs ?? {}, undefined, 2));
373
-
374
- // Copy public/ to dist/ (production build: no public-dev)
375
- logger.debug("[build] Copying public files...");
376
- stepStart = performance.now();
377
- await copyPublicFiles(info.pkgDir, false);
378
- logger.debug(
379
- `[build] Public files copied (${Math.round(performance.now() - stepStart)}ms)`,
380
- );
381
-
382
- // Generate production files (package.json, mise.toml, openssl.cnf, pm2.config.cjs)
383
- logger.debug("[build] Generating production files...");
384
- stepStart = performance.now();
385
- generateProductionFiles(info, external);
386
- logger.debug(
387
- `[build] Production files generated (${Math.round(performance.now() - stepStart)}ms)`,
388
- );
389
-
390
- const errors = result.errors.map((e) => e.text);
391
- const warnings = result.warnings.map((w) => w.text);
392
- return {
393
- success: result.errors.length === 0,
394
- mainJsPath,
395
- errors: errors.length > 0 ? errors : undefined,
396
- warnings: warnings.length > 0 ? warnings : undefined,
397
- };
398
- } catch (err) {
399
- return {
400
- success: false,
401
- mainJsPath,
402
- errors: [errNs.message(err)],
403
- };
404
- }
405
- }
406
-
407
- const guardStartWatch = createOnceGuard("startWatch");
408
-
409
- /**
410
- * Create esbuild context and perform initial build
411
- */
412
- async function createAndBuildContext(
413
- info: ServerWatchInfo,
414
- isFirstBuild: boolean,
415
- resolveFirstBuild?: () => void,
416
- ): Promise<esbuild.BuildContext> {
417
- const contextStart = performance.now();
418
-
419
- logger.debug("[context] Parsing tsconfig...");
420
- let stepStart = performance.now();
421
- const parsedConfig = parseRootTsconfig(info.cwd);
422
- logger.debug(`[context] tsconfig parsed (${Math.round(performance.now() - stepStart)}ms)`);
423
-
424
- stepStart = performance.now();
425
- const entryPoints = getPackageSourceFiles(info.pkgDir, parsedConfig);
426
- logger.debug(
427
- `[context] Found ${String(entryPoints.length)} source files (${Math.round(performance.now() - stepStart)}ms)`,
428
- );
429
-
430
- logger.debug("[context] Getting compiler options...");
431
- stepStart = performance.now();
432
- const compilerOptions = await getCompilerOptionsForPackage(
433
- parsedConfig.options,
434
- "node",
435
- info.pkgDir,
436
- );
437
- logger.debug(
438
- `[context] Compiler options ready (${Math.round(performance.now() - stepStart)}ms)`,
439
- );
440
-
441
- const mainJsPath = path.join(info.pkgDir, "dist", "main.js");
442
-
443
- logger.debug("[context] Collecting externals...");
444
- stepStart = performance.now();
445
- const external = collectAllExternals(info.pkgDir, info.externals);
446
- logger.debug(
447
- `[context] Collected ${String(external.length)} externals (${Math.round(performance.now() - stepStart)}ms)`,
448
- );
449
-
450
- logger.debug("[context] Creating esbuild options (dev mode, minify disabled)...");
451
- const baseOptions = createServerEsbuildOptions({
452
- pkgDir: info.pkgDir,
453
- entryPoints,
454
- compilerOptions,
455
- env: info.env,
456
- external,
457
- dev: true,
458
- });
459
-
460
- let isBuildFirstTime = isFirstBuild;
461
-
462
- logger.debug("[context] Creating esbuild context...");
463
- stepStart = performance.now();
464
- const context = await esbuild.context({
465
- ...baseOptions,
466
- metafile: true,
467
- write: false,
468
- plugins: [
469
- {
470
- name: "watch-notify",
471
- setup(pluginBuild) {
472
- let consecutiveStarts = 0;
473
-
474
- pluginBuild.onStart(() => {
475
- consecutiveStarts++;
476
- logger.debug(`[esbuild] onStart (#${String(consecutiveStarts)})`);
477
-
478
- if (consecutiveStarts > 3) {
479
- // esbuild context.rebuild() silently retries on build errors (esbuild bug).
480
- // Stop the retry loop and diagnose via esbuild.build().
481
- void context.dispose().catch(() => {});
482
-
483
- void esbuild
484
- .build(baseOptions)
485
- .catch((err: unknown) => {
486
- sender.send("build", {
487
- success: false,
488
- mainJsPath,
489
- errors: [errNs.message(err)],
490
- });
491
- })
492
- .finally(() => {
493
- resolveFirstBuild?.();
494
- });
495
- } else {
496
- sender.send("buildStart", {});
497
- }
498
- });
499
-
500
- pluginBuild.onEnd(async (result) => {
501
- consecutiveStarts = 0;
502
-
503
- // Save metafile
504
- if (result.metafile != null) {
505
- lastMetafile = result.metafile;
506
- logger.debug(
507
- `[esbuild] Metafile: ${String(Object.keys(result.metafile.inputs).length)} inputs, ${String(Object.keys(result.metafile.outputs).length)} outputs`,
508
- );
509
- }
510
-
511
- const errors = result.errors.map((e) => e.text);
512
- const warnings = result.warnings.map((w) => w.text);
513
- const success = result.errors.length === 0;
514
-
515
- // Write output files and check for changes
516
- let hasOutputChange = false;
517
- if (success && result.outputFiles != null) {
518
- const writeStart = performance.now();
519
- hasOutputChange = await writeChangedOutputFiles(result.outputFiles);
520
- logger.debug(
521
- `[esbuild] Output files written: changed=${String(hasOutputChange)}, count=${String(result.outputFiles.length)} (${Math.round(performance.now() - writeStart)}ms)`,
522
- );
523
- }
524
-
525
- if (isBuildFirstTime && success) {
526
- const confDistPath = path.join(info.pkgDir, "dist", ".config.json");
527
- fs.writeFileSync(confDistPath, JSON.stringify(info.configs ?? {}, undefined, 2));
528
- }
529
-
530
- // Only emit build event on first build, output change, or error
531
- if (isBuildFirstTime || hasOutputChange || !success) {
532
- sender.send("build", {
533
- success,
534
- mainJsPath,
535
- errors: errors.length > 0 ? errors : undefined,
536
- warnings: warnings.length > 0 ? warnings : undefined,
537
- });
538
- } else {
539
- logger.debug("No output changes, skipping server restart");
540
- }
541
-
542
- if (isBuildFirstTime) {
543
- isBuildFirstTime = false;
544
- resolveFirstBuild?.();
545
- }
546
- });
547
- },
548
- },
549
- ],
550
- });
551
- logger.debug(
552
- `[context] esbuild context created (${Math.round(performance.now() - stepStart)}ms)`,
553
- );
554
-
555
- logger.debug("[context] Running initial rebuild...");
556
- stepStart = performance.now();
557
- const progressTimer = setInterval(() => {
558
- logger.debug(
559
- `[esbuild] Still building... (${Math.round((performance.now() - stepStart) / 1000)}s elapsed)`,
560
- );
561
- }, 5000);
562
- try {
563
- await context.rebuild();
564
- } catch {
565
- // context.rebuild() may reject with "Cannot rebuild" when disposed
566
- // from onStart guard. The real error is reported via esbuild.build()
567
- // fallback in onStart, so we suppress this rejection.
568
- } finally {
569
- clearInterval(progressTimer);
570
- }
571
- logger.debug(
572
- `[context] Initial rebuild done (${Math.round(performance.now() - stepStart)}ms)`,
573
- );
574
-
575
- logger.debug(
576
- `[context] Total context setup: ${Math.round(performance.now() - contextStart)}ms`,
577
- );
578
-
579
- return context;
580
- }
581
-
582
- /**
583
- * Start watch
584
- * @remarks This function should be called only once per Worker.
585
- * @throws If watch has already been started
586
- */
587
- async function startWatch(info: ServerWatchInfo): Promise<void> {
588
- guardStartWatch();
589
-
590
- try {
591
- const watchStart = performance.now();
592
- logger.debug("[startWatch] Starting watch setup...");
593
-
594
- // Promise to wait for first build completion
595
- let resolveFirstBuild!: () => void;
596
- const firstBuildPromise = new Promise<void>((resolve) => {
597
- resolveFirstBuild = resolve;
598
- });
599
-
600
- // Create initial esbuild context and build
601
- logger.debug("[startWatch] Creating initial esbuild context...");
602
- let stepStart = performance.now();
603
- esbuildContext = await createAndBuildContext(info, true, resolveFirstBuild);
604
- logger.debug(
605
- `[startWatch] Initial context created (${Math.round(performance.now() - stepStart)}ms)`,
606
- );
607
-
608
- // Wait for first build completion
609
- logger.debug("[startWatch] Waiting for first build completion...");
610
- stepStart = performance.now();
611
- await firstBuildPromise;
612
- logger.debug(
613
- `[startWatch] First build completed (${Math.round(performance.now() - stepStart)}ms)`,
614
- );
615
-
616
- // Watch public/ and public-dev/ (dev mode includes public-dev)
617
- logger.debug("[startWatch] Setting up public file watcher...");
618
- stepStart = performance.now();
619
- publicWatcher = await watchPublicFiles(info.pkgDir, true);
620
- logger.debug(
621
- `[startWatch] Public watcher ready (${Math.round(performance.now() - stepStart)}ms)`,
622
- );
623
-
624
- // Collect watch paths based on dependencies
625
- logger.debug("[startWatch] Collecting dependencies for watch paths...");
626
- stepStart = performance.now();
627
- const { workspaceDeps, replaceDeps } = collectDeps(info.pkgDir, info.cwd, info.replaceDeps);
628
- logger.debug(
629
- `[startWatch] Deps collected: workspace=${String(workspaceDeps.length)}, replace=${String(replaceDeps.length)} (${Math.round(performance.now() - stepStart)}ms)`,
630
- );
631
-
632
- const watchPaths: string[] = [];
633
-
634
- // 1) Server package itself + workspace dependency packages source
635
- const watchDirs = [
636
- info.pkgDir,
637
- ...workspaceDeps.map((d) => path.join(info.cwd, "packages", d)),
638
- ];
639
- for (const dir of watchDirs) {
640
- watchPaths.push(path.join(dir, "src", "**", "*"));
641
- watchPaths.push(path.join(dir, "*.{ts,js,css}"));
642
- }
643
-
644
- // 2) ReplaceDeps dependency packages dist (root + package node_modules)
645
- for (const pkg of replaceDeps) {
646
- watchPaths.push(path.join(info.cwd, "node_modules", ...pkg.split("/"), "dist", "**", "*.js"));
647
- watchPaths.push(
648
- path.join(info.pkgDir, "node_modules", ...pkg.split("/"), "dist", "**", "*.js"),
649
- );
650
- }
651
-
652
- // Start FsWatcher
653
- logger.debug(`[startWatch] Starting FsWatcher with ${String(watchPaths.length)} paths...`);
654
- stepStart = performance.now();
655
- srcWatcher = await FsWatcher.watch(watchPaths);
656
- logger.debug(
657
- `[startWatch] FsWatcher ready (${Math.round(performance.now() - stepStart)}ms)`,
658
- );
659
- logger.debug(
660
- `[startWatch] Total watch setup: ${Math.round(performance.now() - watchStart)}ms`,
661
- );
662
-
663
- // Handle file changes
664
- srcWatcher.onChange({ delay: 300 }, async (changes) => {
665
- try {
666
- // If files are added/removed, recreate context (import graph may change)
667
- const hasFileAddOrRemove = changes.some((c) => c.event === "add" || c.event === "unlink");
668
-
669
- if (hasFileAddOrRemove) {
670
- logger.debug("File add/remove detected, recreating context");
671
-
672
- const oldContext = esbuildContext;
673
- esbuildContext = await createAndBuildContext(info, false);
674
-
675
- if (oldContext != null) {
676
- await oldContext.dispose();
677
- }
678
- return;
679
- }
680
-
681
- // Only file changes: filter by metafile
682
- if (esbuildContext == null) return;
683
-
684
- // If no metafile (before first build), always rebuild
685
- if (lastMetafile == null) {
686
- await esbuildContext.rebuild();
687
- return;
688
- }
689
-
690
- // Convert metafile.inputs keys to absolute paths (NormPath) for comparison
691
- const metafileAbsPaths = new Set(
692
- Object.keys(lastMetafile.inputs).map((key) => pathx.norm(info.cwd, key)),
693
- );
694
-
695
- const hasRelevantChange = changes.some((c) => metafileAbsPaths.has(c.path));
696
-
697
- if (hasRelevantChange) {
698
- await esbuildContext.rebuild();
699
- } else {
700
- logger.debug("Changed files not included in build, skipping rebuild");
701
- }
702
- } catch (err) {
703
- sender.send("error", {
704
- message: errNs.message(err),
705
- });
706
- }
707
- });
708
- } catch (err) {
709
- sender.send("error", {
710
- message: errNs.message(err),
711
- });
712
- }
713
- }
714
-
715
- /**
716
- * Stop watch
717
- * @remarks Cleans up esbuild context.
718
- */
719
- async function stopWatch(): Promise<void> {
720
- await cleanup();
721
- }
722
-
723
- const sender = createWorker<
724
- { build: typeof build; startWatch: typeof startWatch; stopWatch: typeof stopWatch },
725
- ServerWorkerEvents
726
- >({
727
- build,
728
- startWatch,
729
- stopWatch,
730
- });
731
-
732
- export default sender;
733
-
734
- //#endregion