@simplysm/sd-cli 13.0.99 → 14.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (409) hide show
  1. package/dist/commands/build.js +29 -19
  2. package/dist/commands/build.js.map +1 -6
  3. package/dist/commands/check.d.ts +1 -0
  4. package/dist/commands/check.d.ts.map +1 -1
  5. package/dist/commands/check.js +130 -115
  6. package/dist/commands/check.js.map +1 -6
  7. package/dist/commands/dev.d.ts +6 -7
  8. package/dist/commands/dev.d.ts.map +1 -1
  9. package/dist/commands/dev.js +24 -14
  10. package/dist/commands/dev.js.map +1 -6
  11. package/dist/commands/lint.d.ts +1 -1
  12. package/dist/commands/lint.js +158 -116
  13. package/dist/commands/lint.js.map +1 -6
  14. package/dist/commands/publish.d.ts.map +1 -1
  15. package/dist/commands/publish.js +637 -510
  16. package/dist/commands/publish.js.map +1 -6
  17. package/dist/commands/replace-deps.js +12 -12
  18. package/dist/commands/replace-deps.js.map +1 -6
  19. package/dist/commands/typecheck.d.ts +5 -30
  20. package/dist/commands/typecheck.d.ts.map +1 -1
  21. package/dist/commands/typecheck.js +144 -207
  22. package/dist/commands/typecheck.js.map +1 -6
  23. package/dist/commands/watch.d.ts +6 -4
  24. package/dist/commands/watch.d.ts.map +1 -1
  25. package/dist/commands/watch.js +25 -16
  26. package/dist/commands/watch.js.map +1 -6
  27. package/dist/engines/NgtscEngine.d.ts +47 -0
  28. package/dist/engines/NgtscEngine.d.ts.map +1 -0
  29. package/dist/engines/NgtscEngine.js +151 -0
  30. package/dist/engines/NgtscEngine.js.map +1 -0
  31. package/dist/engines/ServerEsbuildEngine.d.ts +47 -0
  32. package/dist/engines/ServerEsbuildEngine.d.ts.map +1 -0
  33. package/dist/engines/ServerEsbuildEngine.js +159 -0
  34. package/dist/engines/ServerEsbuildEngine.js.map +1 -0
  35. package/dist/engines/TscEngine.d.ts +47 -0
  36. package/dist/engines/TscEngine.d.ts.map +1 -0
  37. package/dist/engines/TscEngine.js +153 -0
  38. package/dist/engines/TscEngine.js.map +1 -0
  39. package/dist/engines/ViteEngine.d.ts +49 -0
  40. package/dist/engines/ViteEngine.d.ts.map +1 -0
  41. package/dist/engines/ViteEngine.js +161 -0
  42. package/dist/engines/ViteEngine.js.map +1 -0
  43. package/dist/engines/index.d.ts +26 -0
  44. package/dist/engines/index.d.ts.map +1 -0
  45. package/dist/engines/index.js +30 -0
  46. package/dist/engines/index.js.map +1 -0
  47. package/dist/engines/types.d.ts +77 -0
  48. package/dist/engines/types.d.ts.map +1 -0
  49. package/dist/engines/types.js +2 -0
  50. package/dist/engines/types.js.map +1 -0
  51. package/dist/index.d.ts +0 -1
  52. package/dist/index.d.ts.map +1 -1
  53. package/dist/index.js +2 -2
  54. package/dist/index.js.map +1 -6
  55. package/dist/infra/ResultCollector.d.ts +1 -1
  56. package/dist/infra/ResultCollector.d.ts.map +1 -1
  57. package/dist/infra/ResultCollector.js +30 -27
  58. package/dist/infra/ResultCollector.js.map +1 -6
  59. package/dist/infra/SignalHandler.js +45 -42
  60. package/dist/infra/SignalHandler.js.map +1 -6
  61. package/dist/infra/WorkerManager.js +56 -53
  62. package/dist/infra/WorkerManager.js.map +1 -6
  63. package/dist/orchestrators/BuildOrchestrator.d.ts +33 -1
  64. package/dist/orchestrators/BuildOrchestrator.d.ts.map +1 -1
  65. package/dist/orchestrators/BuildOrchestrator.js +314 -309
  66. package/dist/orchestrators/BuildOrchestrator.js.map +1 -6
  67. package/dist/orchestrators/DevWatchOrchestrator.d.ts +60 -0
  68. package/dist/orchestrators/DevWatchOrchestrator.d.ts.map +1 -0
  69. package/dist/orchestrators/DevWatchOrchestrator.js +465 -0
  70. package/dist/orchestrators/DevWatchOrchestrator.js.map +1 -0
  71. package/dist/sd-cli-entry.d.ts.map +1 -1
  72. package/dist/sd-cli-entry.js +190 -266
  73. package/dist/sd-cli-entry.js.map +1 -6
  74. package/dist/sd-cli.js +77 -49
  75. package/dist/sd-cli.js.map +1 -6
  76. package/dist/sd-config.types.d.ts +2 -0
  77. package/dist/sd-config.types.d.ts.map +1 -1
  78. package/dist/sd-config.types.js +2 -1
  79. package/dist/sd-config.types.js.map +1 -6
  80. package/dist/utils/angular-build.d.ts +77 -0
  81. package/dist/utils/angular-build.d.ts.map +1 -0
  82. package/dist/utils/angular-build.js +84 -0
  83. package/dist/utils/angular-build.js.map +1 -0
  84. package/dist/utils/build-env.js +9 -9
  85. package/dist/utils/build-env.js.map +1 -6
  86. package/dist/utils/concurrency.d.ts +15 -0
  87. package/dist/utils/concurrency.d.ts.map +1 -0
  88. package/dist/utils/concurrency.js +38 -0
  89. package/dist/utils/concurrency.js.map +1 -0
  90. package/dist/utils/copy-public.js +104 -87
  91. package/dist/utils/copy-public.js.map +1 -6
  92. package/dist/utils/copy-src.js +49 -35
  93. package/dist/utils/copy-src.js.map +1 -6
  94. package/dist/utils/esbuild-config.d.ts +0 -29
  95. package/dist/utils/esbuild-config.d.ts.map +1 -1
  96. package/dist/utils/esbuild-config.js +151 -218
  97. package/dist/utils/esbuild-config.js.map +1 -6
  98. package/dist/utils/ngtsc-build-core.d.ts +49 -0
  99. package/dist/utils/ngtsc-build-core.d.ts.map +1 -0
  100. package/dist/utils/ngtsc-build-core.js +250 -0
  101. package/dist/utils/ngtsc-build-core.js.map +1 -0
  102. package/dist/utils/output-path-rewriter.d.ts +23 -0
  103. package/dist/utils/output-path-rewriter.d.ts.map +1 -0
  104. package/dist/utils/output-path-rewriter.js +74 -0
  105. package/dist/utils/output-path-rewriter.js.map +1 -0
  106. package/dist/utils/output-utils.js +55 -40
  107. package/dist/utils/output-utils.js.map +1 -6
  108. package/dist/utils/package-utils.d.ts +8 -0
  109. package/dist/utils/package-utils.d.ts.map +1 -1
  110. package/dist/utils/package-utils.js +103 -73
  111. package/dist/utils/package-utils.js.map +1 -6
  112. package/dist/utils/rebuild-manager.js +41 -44
  113. package/dist/utils/rebuild-manager.js.map +1 -6
  114. package/dist/utils/replace-deps.js +283 -184
  115. package/dist/utils/replace-deps.js.map +1 -6
  116. package/dist/utils/scss-compiler.d.ts +10 -0
  117. package/dist/utils/scss-compiler.d.ts.map +1 -0
  118. package/dist/utils/scss-compiler.js +36 -0
  119. package/dist/utils/scss-compiler.js.map +1 -0
  120. package/dist/utils/sd-config.js +29 -19
  121. package/dist/utils/sd-config.js.map +1 -6
  122. package/dist/utils/tsc-build.d.ts +36 -0
  123. package/dist/utils/tsc-build.d.ts.map +1 -0
  124. package/dist/utils/tsc-build.js +130 -0
  125. package/dist/utils/tsc-build.js.map +1 -0
  126. package/dist/utils/tsconfig.d.ts +7 -26
  127. package/dist/utils/tsconfig.d.ts.map +1 -1
  128. package/dist/utils/tsconfig.js +39 -64
  129. package/dist/utils/tsconfig.js.map +1 -6
  130. package/dist/utils/typecheck-non-package.d.ts +18 -0
  131. package/dist/utils/typecheck-non-package.d.ts.map +1 -0
  132. package/dist/utils/typecheck-non-package.js +64 -0
  133. package/dist/utils/typecheck-non-package.js.map +1 -0
  134. package/dist/utils/typecheck-serialization.js +58 -40
  135. package/dist/utils/typecheck-serialization.js.map +1 -6
  136. package/dist/utils/worker-events.js +48 -40
  137. package/dist/utils/worker-events.js.map +1 -6
  138. package/dist/utils/worker-utils.js +48 -28
  139. package/dist/utils/worker-utils.js.map +1 -6
  140. package/dist/vitest-plugin.d.ts +9 -0
  141. package/dist/vitest-plugin.d.ts.map +1 -0
  142. package/dist/vitest-plugin.js +85 -0
  143. package/dist/vitest-plugin.js.map +1 -0
  144. package/dist/workers/library-build.worker.d.ts +54 -0
  145. package/dist/workers/library-build.worker.d.ts.map +1 -0
  146. package/dist/workers/library-build.worker.js +97 -0
  147. package/dist/workers/library-build.worker.js.map +1 -0
  148. package/dist/workers/lint.worker.js +9 -6
  149. package/dist/workers/lint.worker.js.map +1 -6
  150. package/dist/workers/ngtsc-build.worker.d.ts +23 -0
  151. package/dist/workers/ngtsc-build.worker.d.ts.map +1 -0
  152. package/dist/workers/ngtsc-build.worker.js +98 -0
  153. package/dist/workers/ngtsc-build.worker.js.map +1 -0
  154. package/dist/workers/{server.worker.d.ts → server-build.worker.d.ts} +39 -29
  155. package/dist/workers/server-build.worker.d.ts.map +1 -0
  156. package/dist/workers/server-build.worker.js +399 -0
  157. package/dist/workers/server-build.worker.js.map +1 -0
  158. package/dist/workers/server-runtime.worker.d.ts +3 -2
  159. package/dist/workers/server-runtime.worker.d.ts.map +1 -1
  160. package/dist/workers/server-runtime.worker.js +100 -95
  161. package/dist/workers/server-runtime.worker.js.map +1 -6
  162. package/dist/workers/vite-build.worker.d.ts +56 -0
  163. package/dist/workers/vite-build.worker.d.ts.map +1 -0
  164. package/dist/workers/vite-build.worker.js +167 -0
  165. package/dist/workers/vite-build.worker.js.map +1 -0
  166. package/package.json +10 -16
  167. package/src/commands/check.ts +21 -3
  168. package/src/commands/dev.ts +10 -8
  169. package/src/commands/lint.ts +1 -1
  170. package/src/commands/publish.ts +4 -0
  171. package/src/commands/typecheck.ts +89 -256
  172. package/src/commands/watch.ts +9 -8
  173. package/src/engines/NgtscEngine.ts +190 -0
  174. package/src/engines/ServerEsbuildEngine.ts +195 -0
  175. package/src/engines/TscEngine.ts +189 -0
  176. package/src/engines/ViteEngine.ts +203 -0
  177. package/src/engines/index.ts +49 -0
  178. package/src/engines/types.ts +79 -0
  179. package/src/index.ts +0 -3
  180. package/src/infra/ResultCollector.ts +1 -1
  181. package/src/orchestrators/BuildOrchestrator.ts +87 -157
  182. package/src/orchestrators/DevWatchOrchestrator.ts +573 -0
  183. package/src/sd-cli-entry.ts +13 -116
  184. package/src/sd-config.types.ts +2 -0
  185. package/src/utils/angular-build.ts +157 -0
  186. package/src/utils/concurrency.ts +43 -0
  187. package/src/utils/esbuild-config.ts +1 -122
  188. package/src/utils/ngtsc-build-core.ts +379 -0
  189. package/src/utils/output-path-rewriter.ts +82 -0
  190. package/src/utils/package-utils.ts +20 -0
  191. package/src/utils/scss-compiler.ts +58 -0
  192. package/src/utils/tsc-build.ts +175 -0
  193. package/src/utils/tsconfig.ts +27 -95
  194. package/src/utils/typecheck-non-package.ts +87 -0
  195. package/src/vitest-plugin.ts +118 -0
  196. package/src/workers/library-build.worker.ts +153 -0
  197. package/src/workers/ngtsc-build.worker.ts +146 -0
  198. package/src/workers/server-build.worker.ts +565 -0
  199. package/src/workers/server-runtime.worker.ts +17 -26
  200. package/src/workers/vite-build.worker.ts +252 -0
  201. package/tests/commands/check.spec.ts +276 -0
  202. package/tests/commands/dev.spec.ts +53 -0
  203. package/tests/commands/lint.spec.ts +243 -0
  204. package/tests/commands/publish.spec.ts +1159 -0
  205. package/tests/commands/typecheck.spec.ts +294 -0
  206. package/tests/commands/watch.spec.ts +53 -0
  207. package/tests/engines/engine-selection.spec.ts +247 -0
  208. package/tests/engines/ngtsc-engine.spec.ts +274 -0
  209. package/tests/engines/server-esbuild-engine.spec.ts +256 -0
  210. package/tests/engines/tsc-engine.spec.ts +213 -0
  211. package/tests/engines/vite-engine.spec.ts +358 -0
  212. package/tests/infra/result-collector.spec.ts +46 -0
  213. package/tests/infra/signal-handler.spec.ts +32 -0
  214. package/tests/infra/worker-manager.spec.ts +63 -0
  215. package/tests/orchestrators/build-orchestrator.spec.ts +772 -0
  216. package/tests/orchestrators/dev-watch-orchestrator.spec.ts +1173 -0
  217. package/tests/sd-cli-entry.spec.ts +49 -0
  218. package/tests/utils/angular-build.spec.ts +251 -0
  219. package/tests/utils/build-env.spec.ts +33 -0
  220. package/tests/utils/concurrency.spec.ts +65 -0
  221. package/tests/utils/copy-src.spec.ts +144 -0
  222. package/tests/utils/esbuild-config.spec.ts +186 -0
  223. package/tests/utils/external-modules.spec.ts +161 -0
  224. package/tests/utils/ngtsc-scss-refactor.spec.ts +66 -0
  225. package/tests/utils/output-path-rewriter.spec.ts +165 -0
  226. package/tests/utils/output-utils.spec.ts +104 -0
  227. package/tests/utils/package-utils.spec.ts +52 -0
  228. package/tests/utils/rebuild-manager.spec.ts +30 -27
  229. package/tests/utils/replace-deps.spec.ts +69 -0
  230. package/tests/utils/scss-compiler.spec.ts +131 -0
  231. package/tests/utils/sd-config.spec.ts +77 -0
  232. package/tests/utils/tsc-build.spec.ts +358 -0
  233. package/tests/utils/tsconfig-angular.spec.ts +71 -0
  234. package/tests/utils/typecheck-non-package.spec.ts +120 -0
  235. package/tests/utils/worker-events.spec.ts +155 -0
  236. package/tests/utils/worker-utils.spec.ts +43 -0
  237. package/tests/vitest-plugin-cwd.spec.ts +68 -0
  238. package/tests/vitest-plugin.spec.ts +103 -0
  239. package/tests/workers/library-build-worker.spec.ts +258 -0
  240. package/tests/workers/ngtsc-build-worker.spec.ts +187 -0
  241. package/tests/workers/server-build-worker.spec.ts +566 -0
  242. package/tests/workers/server-runtime-worker.spec.ts +251 -0
  243. package/README.md +0 -295
  244. package/dist/builders/BaseBuilder.d.ts +0 -88
  245. package/dist/builders/BaseBuilder.d.ts.map +0 -1
  246. package/dist/builders/BaseBuilder.js +0 -142
  247. package/dist/builders/BaseBuilder.js.map +0 -6
  248. package/dist/builders/DtsBuilder.d.ts +0 -22
  249. package/dist/builders/DtsBuilder.d.ts.map +0 -1
  250. package/dist/builders/DtsBuilder.js +0 -72
  251. package/dist/builders/DtsBuilder.js.map +0 -6
  252. package/dist/builders/LibraryBuilder.d.ts +0 -22
  253. package/dist/builders/LibraryBuilder.d.ts.map +0 -1
  254. package/dist/builders/LibraryBuilder.js +0 -85
  255. package/dist/builders/LibraryBuilder.js.map +0 -6
  256. package/dist/builders/types.d.ts +0 -55
  257. package/dist/builders/types.d.ts.map +0 -1
  258. package/dist/builders/types.js +0 -1
  259. package/dist/builders/types.js.map +0 -6
  260. package/dist/capacitor/capacitor.d.ts +0 -151
  261. package/dist/capacitor/capacitor.d.ts.map +0 -1
  262. package/dist/capacitor/capacitor.js +0 -694
  263. package/dist/capacitor/capacitor.js.map +0 -6
  264. package/dist/commands/device.d.ts +0 -22
  265. package/dist/commands/device.d.ts.map +0 -1
  266. package/dist/commands/device.js +0 -98
  267. package/dist/commands/device.js.map +0 -6
  268. package/dist/commands/init.d.ts +0 -14
  269. package/dist/commands/init.d.ts.map +0 -1
  270. package/dist/commands/init.js +0 -72
  271. package/dist/commands/init.js.map +0 -6
  272. package/dist/electron/electron.d.ts +0 -84
  273. package/dist/electron/electron.d.ts.map +0 -1
  274. package/dist/electron/electron.js +0 -263
  275. package/dist/electron/electron.js.map +0 -6
  276. package/dist/orchestrators/DevOrchestrator.d.ts +0 -83
  277. package/dist/orchestrators/DevOrchestrator.d.ts.map +0 -1
  278. package/dist/orchestrators/DevOrchestrator.js +0 -540
  279. package/dist/orchestrators/DevOrchestrator.js.map +0 -6
  280. package/dist/orchestrators/WatchOrchestrator.d.ts +0 -57
  281. package/dist/orchestrators/WatchOrchestrator.d.ts.map +0 -1
  282. package/dist/orchestrators/WatchOrchestrator.js +0 -199
  283. package/dist/orchestrators/WatchOrchestrator.js.map +0 -6
  284. package/dist/utils/tailwind-config-deps.d.ts +0 -8
  285. package/dist/utils/tailwind-config-deps.d.ts.map +0 -1
  286. package/dist/utils/tailwind-config-deps.js +0 -82
  287. package/dist/utils/tailwind-config-deps.js.map +0 -6
  288. package/dist/utils/template.d.ts +0 -14
  289. package/dist/utils/template.d.ts.map +0 -1
  290. package/dist/utils/template.js +0 -33
  291. package/dist/utils/template.js.map +0 -6
  292. package/dist/utils/vite-config.d.ts +0 -35
  293. package/dist/utils/vite-config.d.ts.map +0 -1
  294. package/dist/utils/vite-config.js +0 -259
  295. package/dist/utils/vite-config.js.map +0 -6
  296. package/dist/workers/client.worker.d.ts +0 -83
  297. package/dist/workers/client.worker.d.ts.map +0 -1
  298. package/dist/workers/client.worker.js +0 -111
  299. package/dist/workers/client.worker.js.map +0 -6
  300. package/dist/workers/dts.worker.d.ts +0 -75
  301. package/dist/workers/dts.worker.d.ts.map +0 -1
  302. package/dist/workers/dts.worker.js +0 -270
  303. package/dist/workers/dts.worker.js.map +0 -6
  304. package/dist/workers/library.worker.d.ts +0 -75
  305. package/dist/workers/library.worker.d.ts.map +0 -1
  306. package/dist/workers/library.worker.js +0 -166
  307. package/dist/workers/library.worker.js.map +0 -6
  308. package/dist/workers/server.worker.d.ts.map +0 -1
  309. package/dist/workers/server.worker.js +0 -482
  310. package/dist/workers/server.worker.js.map +0 -6
  311. package/src/builders/BaseBuilder.ts +0 -218
  312. package/src/builders/DtsBuilder.ts +0 -92
  313. package/src/builders/LibraryBuilder.ts +0 -110
  314. package/src/builders/types.ts +0 -60
  315. package/src/capacitor/capacitor.ts +0 -931
  316. package/src/commands/device.ts +0 -140
  317. package/src/commands/init.ts +0 -113
  318. package/src/electron/electron.ts +0 -362
  319. package/src/orchestrators/DevOrchestrator.ts +0 -744
  320. package/src/orchestrators/WatchOrchestrator.ts +0 -277
  321. package/src/utils/tailwind-config-deps.ts +0 -98
  322. package/src/utils/template.ts +0 -56
  323. package/src/utils/vite-config.ts +0 -390
  324. package/src/workers/client.worker.ts +0 -250
  325. package/src/workers/dts.worker.ts +0 -453
  326. package/src/workers/library.worker.ts +0 -316
  327. package/src/workers/server.worker.ts +0 -734
  328. package/templates/init/.gitignore.hbs +0 -34
  329. package/templates/init/.npmrc.hbs +0 -1
  330. package/templates/init/.prettierignore +0 -1
  331. package/templates/init/.prettierrc.yaml +0 -12
  332. package/templates/init/eslint.config.ts +0 -15
  333. package/templates/init/mise.toml +0 -3
  334. package/templates/init/package.json.hbs +0 -32
  335. package/templates/init/packages/client-admin/index.html.hbs +0 -144
  336. package/templates/init/packages/client-admin/package.json.hbs +0 -27
  337. package/templates/init/packages/client-admin/public/assets/logo-landscape.png +0 -0
  338. package/templates/init/packages/client-admin/public/assets/logo.png +0 -0
  339. package/templates/init/packages/client-admin/public/favicon.ico +0 -0
  340. package/templates/init/packages/client-admin/src/App.tsx +0 -42
  341. package/templates/init/packages/client-admin/src/dev/DevDialog.tsx +0 -34
  342. package/templates/init/packages/client-admin/src/events/AuthChangeEvent.ts +0 -3
  343. package/templates/init/packages/client-admin/src/main.css +0 -4
  344. package/templates/init/packages/client-admin/src/main.tsx.hbs +0 -146
  345. package/templates/init/packages/client-admin/src/providers/AppServiceProvider.tsx.hbs +0 -103
  346. package/templates/init/packages/client-admin/src/providers/AppStructureProvider.tsx +0 -84
  347. package/templates/init/packages/client-admin/src/providers/AuthProvider.tsx.hbs +0 -96
  348. package/templates/init/packages/client-admin/src/providers/configureSharedData.ts.hbs +0 -67
  349. package/templates/init/packages/client-admin/src/views/auth/LoginView.tsx +0 -132
  350. package/templates/init/packages/client-admin/src/views/home/HomeView.tsx +0 -108
  351. package/templates/init/packages/client-admin/src/views/home/base/employee/EmployeeDetail.tsx.hbs +0 -243
  352. package/templates/init/packages/client-admin/src/views/home/base/employee/EmployeeSheet.tsx.hbs +0 -271
  353. package/templates/init/packages/client-admin/src/views/home/base/role-permission/RoleDetail.tsx.hbs +0 -146
  354. package/templates/init/packages/client-admin/src/views/home/base/role-permission/RolePermissionDetail.tsx.hbs +0 -121
  355. package/templates/init/packages/client-admin/src/views/home/base/role-permission/RolePermissionView.tsx +0 -52
  356. package/templates/init/packages/client-admin/src/views/home/base/role-permission/RoleSheet.tsx.hbs +0 -125
  357. package/templates/init/packages/client-admin/src/views/home/main/MainView.tsx.hbs +0 -13
  358. package/templates/init/packages/client-admin/src/views/home/my-info/MyInfoDetail.tsx.hbs +0 -241
  359. package/templates/init/packages/client-admin/src/views/home/system/system-log/SystemLogSheet.tsx.hbs +0 -169
  360. package/templates/init/packages/client-admin/src/views/not-found/NotFoundView.tsx +0 -15
  361. package/templates/init/packages/client-admin/tailwind.config.ts +0 -10
  362. package/templates/init/packages/db-main/package.json.hbs +0 -13
  363. package/templates/init/packages/db-main/src/MainDbContext.ts +0 -22
  364. package/templates/init/packages/db-main/src/dataLogExt.ts +0 -127
  365. package/templates/init/packages/db-main/src/index.ts +0 -14
  366. package/templates/init/packages/db-main/src/tables/base/Employee.ts +0 -24
  367. package/templates/init/packages/db-main/src/tables/base/EmployeeConfig.ts +0 -13
  368. package/templates/init/packages/db-main/src/tables/base/Role.ts +0 -9
  369. package/templates/init/packages/db-main/src/tables/base/RolePermission.ts +0 -13
  370. package/templates/init/packages/db-main/src/tables/system/_DataLog.ts +0 -19
  371. package/templates/init/packages/db-main/src/tables/system/_Log.ts +0 -16
  372. package/templates/init/packages/server/package.json.hbs +0 -20
  373. package/templates/init/packages/server/public-dev/dev//354/264/210/352/270/260/355/231/224.xlsx +0 -0
  374. package/templates/init/packages/server/src/index.ts +0 -4
  375. package/templates/init/packages/server/src/main.ts.hbs +0 -34
  376. package/templates/init/packages/server/src/services/AuthService.ts.hbs +0 -171
  377. package/templates/init/packages/server/src/services/DevService.ts.hbs +0 -94
  378. package/templates/init/packages/server/src/services/EmployeeService.ts.hbs +0 -122
  379. package/templates/init/packages/server/src/services/RoleService.ts.hbs +0 -59
  380. package/templates/init/pnpm-workspace.yaml +0 -15
  381. package/templates/init/sd.config.ts.hbs +0 -48
  382. package/templates/init/tsconfig.json.hbs +0 -39
  383. package/templates/init/vitest.config.ts +0 -36
  384. package/tests/capacitor-exclude.spec.ts +0 -78
  385. package/tests/capacitor.spec.ts +0 -49
  386. package/tests/copy-src.spec.ts +0 -50
  387. package/tests/electron-exclude.spec.ts +0 -61
  388. package/tests/get-compiler-options-for-package.spec.ts +0 -80
  389. package/tests/get-package-source-files.spec.ts +0 -139
  390. package/tests/get-types-from-package-json.spec.ts +0 -92
  391. package/tests/infra/ResultCollector.spec.ts +0 -30
  392. package/tests/infra/SignalHandler.spec.ts +0 -38
  393. package/tests/infra/WorkerManager.spec.ts +0 -63
  394. package/tests/load-ignore-patterns.spec.ts +0 -163
  395. package/tests/load-sd-config.spec.ts +0 -100
  396. package/tests/package-utils.spec.ts +0 -188
  397. package/tests/parse-root-tsconfig.spec.ts +0 -89
  398. package/tests/publish-config-narrowing.spec.ts +0 -20
  399. package/tests/replace-deps.spec.ts +0 -308
  400. package/tests/run-lint.spec.ts +0 -366
  401. package/tests/run-typecheck.spec.ts +0 -544
  402. package/tests/run-watch.spec.ts +0 -76
  403. package/tests/sd-cli.spec.ts +0 -265
  404. package/tests/sd-public-dev-plugin-mime.spec.ts +0 -19
  405. package/tests/tailwind-config-deps.spec.ts +0 -30
  406. package/tests/template.spec.ts +0 -70
  407. package/tests/vite-config-exclude.spec.ts +0 -35
  408. package/tests/vite-config-outdir.spec.ts +0 -38
  409. package/tests/write-changed-output-files.spec.ts +0 -97
@@ -0,0 +1,49 @@
1
+ import { describe, it, expect } from "vitest";
2
+
3
+ describe("sd-cli-entry COMMAND_NAMES", () => {
4
+ it("does not include device command", async () => {
5
+ // Import the module to check COMMAND_NAMES indirectly via createCliParser
6
+ const { createCliParser } = await import("../src/sd-cli-entry");
7
+
8
+ // device command should not be registered — parsing "device" should fail
9
+ let errorThrown = false;
10
+ const origExit = process.exit;
11
+ const origError = console.error;
12
+ const origLog = console.log;
13
+
14
+ // Suppress yargs output during test
15
+ console.error = () => {};
16
+ console.log = () => {};
17
+ process.exit = (() => {
18
+ errorThrown = true;
19
+ }) as never;
20
+
21
+ try {
22
+ await createCliParser(["device"]).exitProcess(false).fail(() => {
23
+ errorThrown = true;
24
+ }).parse();
25
+ } catch {
26
+ errorThrown = true;
27
+ } finally {
28
+ process.exit = origExit;
29
+ console.error = origError;
30
+ console.log = origLog;
31
+ }
32
+
33
+ expect(errorThrown).toBe(true);
34
+ });
35
+
36
+ it("includes expected commands", async () => {
37
+ const { createCliParser } = await import("../src/sd-cli-entry");
38
+
39
+ // These commands should be registered without throwing
40
+ const expectedCommands = ["lint", "typecheck", "check", "watch", "dev", "build", "init", "publish", "replace-deps"];
41
+
42
+ for (const cmd of expectedCommands) {
43
+ // Verify command exists by checking help doesn't throw for "unknown command"
44
+ const parser = createCliParser([cmd, "--help"]).exitProcess(false);
45
+ // Just verify it can be created without error
46
+ expect(parser).toBeDefined();
47
+ }
48
+ });
49
+ });
@@ -0,0 +1,251 @@
1
+ import { describe, it, expect, vi, beforeAll } from "vitest";
2
+ import fs from "node:fs";
3
+ import path from "node:path";
4
+ import {
5
+ buildApplicationInternal,
6
+ createAngularBuilderContext,
7
+ ResultKind,
8
+ } from "../../src/utils/angular-build";
9
+
10
+ describe("Angular Build Adapter - Slice 1", () => {
11
+ // Rule: 어댑터는 @angular/build/private 임포트를 단일 모듈에 격리한다
12
+ it("exports buildApplicationInternal from adapter module", () => {
13
+ expect(typeof buildApplicationInternal).toBe("function");
14
+ });
15
+
16
+ it("exports ResultKind enum from adapter module", () => {
17
+ expect(ResultKind.Failure).toBeDefined();
18
+ expect(ResultKind.Full).toBeDefined();
19
+ expect(ResultKind.Incremental).toBeDefined();
20
+ expect(ResultKind.ComponentUpdate).toBeDefined();
21
+ });
22
+
23
+ // Rule: 어댑터는 BuilderContext를 내부적으로 생성한다
24
+ describe("createAngularBuilderContext", () => {
25
+ const baseOptions = {
26
+ workspaceRoot: "/test/workspace",
27
+ projectName: "test-app",
28
+ projectRoot: "packages/test-app",
29
+ buildOptions: { tsConfig: "./tsconfig.json", aot: true },
30
+ };
31
+
32
+ it("creates context with workspaceRoot", () => {
33
+ const ctx = createAngularBuilderContext(baseOptions);
34
+ expect(ctx.workspaceRoot).toBe("/test/workspace");
35
+ });
36
+
37
+ it("creates context with target containing project name", () => {
38
+ const ctx = createAngularBuilderContext(baseOptions);
39
+ expect(ctx.target.project).toBe("test-app");
40
+ });
41
+
42
+ it("creates context with logger that has info/warn/error methods", () => {
43
+ const ctx = createAngularBuilderContext(baseOptions);
44
+ expect(typeof ctx.logger.info).toBe("function");
45
+ expect(typeof ctx.logger.warn).toBe("function");
46
+ expect(typeof ctx.logger.error).toBe("function");
47
+ });
48
+
49
+ it("getProjectMetadata returns root and sourceRoot", async () => {
50
+ const ctx = createAngularBuilderContext(baseOptions);
51
+ const metadata = await ctx.getProjectMetadata("test-app");
52
+ expect(metadata).toEqual(
53
+ expect.objectContaining({
54
+ root: "packages/test-app",
55
+ sourceRoot: "src",
56
+ }),
57
+ );
58
+ });
59
+
60
+ it("getProjectMetadata uses custom sourceRoot when provided", async () => {
61
+ const ctx = createAngularBuilderContext({
62
+ ...baseOptions,
63
+ sourceRoot: "lib",
64
+ });
65
+ const metadata = await ctx.getProjectMetadata("test-app");
66
+ expect(metadata).toEqual(
67
+ expect.objectContaining({
68
+ root: "packages/test-app",
69
+ sourceRoot: "lib",
70
+ }),
71
+ );
72
+ });
73
+
74
+ it("addTeardown registers cleanup callback and disposeTeardowns executes them", async () => {
75
+ const ctx = createAngularBuilderContext(baseOptions);
76
+ const teardownFn1 = vi.fn();
77
+ const teardownFn2 = vi.fn();
78
+ ctx.addTeardown(teardownFn1);
79
+ ctx.addTeardown(teardownFn2);
80
+
81
+ expect(teardownFn1).not.toHaveBeenCalled();
82
+ expect(teardownFn2).not.toHaveBeenCalled();
83
+
84
+ await ctx.disposeTeardowns();
85
+
86
+ expect(teardownFn1).toHaveBeenCalledOnce();
87
+ expect(teardownFn2).toHaveBeenCalledOnce();
88
+ });
89
+
90
+ it("passes signal to context when provided", () => {
91
+ const controller = new AbortController();
92
+ const ctx = createAngularBuilderContext({
93
+ ...baseOptions,
94
+ signal: controller.signal as AbortSignal,
95
+ }) as { signal?: AbortSignal };
96
+ expect(ctx.signal).toBe(controller.signal);
97
+ });
98
+ });
99
+
100
+ // Rule: 어댑터는 AOT 전용이다
101
+ it("exports checkPort utility from adapter module", async () => {
102
+ const { checkPort } = await import("../../src/utils/angular-build");
103
+ expect(typeof checkPort).toBe("function");
104
+ });
105
+
106
+ it("exports emitFilesToDisk utility from adapter module", async () => {
107
+ const { emitFilesToDisk } = await import("../../src/utils/angular-build");
108
+ expect(typeof emitFilesToDisk).toBe("function");
109
+ });
110
+ });
111
+
112
+ describe("Angular Build Adapter - Library Compilation API", () => {
113
+ // Rule: 어댑터는 Library 빌드에 필요한 Angular 컴파일러 API를 노출한다
114
+
115
+ it("exports NgtscProgram from adapter module", async () => {
116
+ const { NgtscProgram } = await import("../../src/utils/angular-build");
117
+ expect(typeof NgtscProgram).toBe("function");
118
+ });
119
+
120
+ it("exports OptimizeFor enum from adapter module", async () => {
121
+ const { OptimizeFor } = await import("../../src/utils/angular-build");
122
+ expect(OptimizeFor.WholeProgram).toBeDefined();
123
+ expect(OptimizeFor.SingleFile).toBeDefined();
124
+ });
125
+
126
+ it("NgtscProgram accepts ts.CompilerHost augmented with AngularLibraryHostExtensions", async () => {
127
+ const mod = await import("../../src/utils/angular-build");
128
+ // AngularLibraryHostExtensions는 타입 전용이므로 런타임 값은 없다.
129
+ // NgtscProgram이 export되어 있으면 소비자가 타입을 조합하여 host를 만들 수 있다.
130
+ expect(typeof mod.NgtscProgram).toBe("function");
131
+ // 타입 검증: AngularLibraryHostExtensions가 export되는지는 TypeScript 컴파일로 확인
132
+ });
133
+ });
134
+
135
+ describe("Angular Build Adapter - Slice 2", () => {
136
+ // Rule: 어댑터는 Dev Server API를 제공한다
137
+ it("exports serveWithVite from adapter module", async () => {
138
+ const { serveWithVite } = await import("../../src/utils/angular-build");
139
+ expect(typeof serveWithVite).toBe("function");
140
+ });
141
+
142
+ it("exports normalizeDevServerOptions from adapter module", async () => {
143
+ const { normalizeDevServerOptions } = await import("../../src/utils/angular-build");
144
+ expect(typeof normalizeDevServerOptions).toBe("function");
145
+ });
146
+
147
+ // Rule: 어댑터는 IndexHtmlGenerator를 제공한다
148
+ it("exports IndexHtmlGenerator from adapter module", async () => {
149
+ const { IndexHtmlGenerator } = await import("../../src/utils/angular-build");
150
+ expect(typeof IndexHtmlGenerator).toBe("function");
151
+ });
152
+
153
+ // BuilderContext dev server 필드 테스트
154
+ describe("createAngularBuilderContext - dev server fields", () => {
155
+ const baseOptions = {
156
+ workspaceRoot: "/test/workspace",
157
+ projectName: "test-app",
158
+ projectRoot: "packages/test-app",
159
+ buildOptions: { tsConfig: "./tsconfig.json", aot: true, browser: "./src/main.ts" },
160
+ };
161
+
162
+ it("getTargetOptions returns provided buildOptions", async () => {
163
+ const ctx = createAngularBuilderContext(baseOptions);
164
+ const opts = await ctx.getTargetOptions({ project: "test-app", target: "build" });
165
+ expect(opts).toEqual(baseOptions.buildOptions);
166
+ });
167
+
168
+ it("getBuilderNameForTarget returns @angular/build:application", async () => {
169
+ const ctx = createAngularBuilderContext(baseOptions);
170
+ const name = await ctx.getBuilderNameForTarget({ project: "test-app", target: "build" });
171
+ expect(name).toBe("@angular/build:application");
172
+ });
173
+
174
+ it("validateOptions returns options as passthrough", async () => {
175
+ const ctx = createAngularBuilderContext(baseOptions);
176
+ const input = { tsConfig: "./tsconfig.json", aot: true };
177
+ const result = await ctx.validateOptions(input, "@angular/build:application");
178
+ expect(result).toEqual(input);
179
+ });
180
+ });
181
+ });
182
+
183
+ describe("Angular Build Adapter - Isolation & Scope", () => {
184
+ const sdCliSrcDir = path.resolve(import.meta.dirname, "../../src");
185
+ const adapterFileName = "angular-build.ts";
186
+ let srcFiles: string[];
187
+
188
+ beforeAll(() => {
189
+ const collectFiles = (dir: string): string[] => {
190
+ const entries = fs.readdirSync(dir, { withFileTypes: true });
191
+ return entries.flatMap((e) =>
192
+ e.isDirectory()
193
+ ? collectFiles(path.join(dir, e.name))
194
+ : e.name.endsWith(".ts")
195
+ ? [path.join(dir, e.name)]
196
+ : [],
197
+ );
198
+ };
199
+ srcFiles = collectFiles(sdCliSrcDir).filter(
200
+ (f) => !f.endsWith(adapterFileName),
201
+ );
202
+ });
203
+
204
+ // Rule: 모든 Angular private/internal API 접근은 어댑터 모듈을 통해서만 한다
205
+ it("no src file outside adapter imports @angular/build/private", () => {
206
+ for (const file of srcFiles) {
207
+ const content = fs.readFileSync(file, "utf-8");
208
+ expect(
209
+ content.includes("@angular/build/private"),
210
+ `${path.relative(sdCliSrcDir, file)} imports @angular/build/private directly`,
211
+ ).toBe(false);
212
+ }
213
+ });
214
+
215
+ it("no src file outside adapter imports @angular/compiler-cli", () => {
216
+ for (const file of srcFiles) {
217
+ const content = fs.readFileSync(file, "utf-8");
218
+ expect(
219
+ content.includes("@angular/compiler-cli"),
220
+ `${path.relative(sdCliSrcDir, file)} imports @angular/compiler-cli directly`,
221
+ ).toBe(false);
222
+ }
223
+ });
224
+
225
+ // Rule: @angular/compiler-cli는 sd-cli의 직접 의존성이다
226
+ it("package.json includes @angular/compiler-cli in dependencies", () => {
227
+ const pkgJson = JSON.parse(
228
+ fs.readFileSync(
229
+ path.resolve(import.meta.dirname, "../../package.json"),
230
+ "utf-8",
231
+ ),
232
+ );
233
+ expect(pkgJson.dependencies["@angular/compiler-cli"]).toBeDefined();
234
+ });
235
+
236
+ // Rule: 래핑 범위는 현재 필요한 API만 포함한다
237
+ it("adapter does not export browserslist/PostCSS APIs", async () => {
238
+ const mod = await import("../../src/utils/angular-build");
239
+ const exports = Object.keys(mod);
240
+ expect(exports).not.toContain("transformSupportedBrowsersToTargets");
241
+ expect(exports).not.toContain("getSupportedBrowsers");
242
+ expect(exports).not.toContain("loadPostcssConfiguration");
243
+ });
244
+
245
+ it("adapter does not export ServiceWorker/i18n APIs", async () => {
246
+ const mod = await import("../../src/utils/angular-build");
247
+ const exports = Object.keys(mod);
248
+ expect(exports).not.toContain("augmentAppWithServiceWorker");
249
+ expect(exports).not.toContain("createI18nOptions");
250
+ });
251
+ });
@@ -0,0 +1,33 @@
1
+ import { describe, it, expect, afterEach } from "vitest";
2
+ import { getVersion } from "../../src/utils/build-env";
3
+ import path from "path";
4
+ import fs from "fs/promises";
5
+ import os from "os";
6
+
7
+ describe("getVersion", () => {
8
+ const tmpDirs: string[] = [];
9
+
10
+ async function createTmpDir(pkgJson: Record<string, unknown>): Promise<string> {
11
+ const dir = await fs.mkdtemp(path.join(os.tmpdir(), "sd-cli-test-"));
12
+ tmpDirs.push(dir);
13
+ await fs.writeFile(path.join(dir, "package.json"), JSON.stringify(pkgJson));
14
+ return dir;
15
+ }
16
+
17
+ afterEach(async () => {
18
+ for (const dir of tmpDirs) {
19
+ await fs.rm(dir, { recursive: true, force: true });
20
+ }
21
+ tmpDirs.length = 0;
22
+ });
23
+
24
+ it("returns version from package.json", async () => {
25
+ const dir = await createTmpDir({ version: "14.0.0" });
26
+ expect(await getVersion(dir)).toBe("14.0.0");
27
+ });
28
+
29
+ it("returns '0.0.0' when version field is missing", async () => {
30
+ const dir = await createTmpDir({ name: "test-pkg" });
31
+ expect(await getVersion(dir)).toBe("0.0.0");
32
+ });
33
+ });
@@ -0,0 +1,65 @@
1
+ import { describe, it, expect } from "vitest";
2
+
3
+ describe("runWithConcurrency", () => {
4
+ it("limits concurrent task execution to specified concurrency", async () => {
5
+ const { runWithConcurrency } = await import("../../src/utils/concurrency");
6
+
7
+ let activeTasks = 0;
8
+ let maxActiveTasks = 0;
9
+
10
+ const tasks = Array.from({ length: 10 }, () => async () => {
11
+ activeTasks++;
12
+ maxActiveTasks = Math.max(maxActiveTasks, activeTasks);
13
+ await new Promise((resolve) => setTimeout(resolve, 10));
14
+ activeTasks--;
15
+ return "done";
16
+ });
17
+
18
+ const results = await runWithConcurrency(tasks, 3);
19
+
20
+ expect(maxActiveTasks).toBeLessThanOrEqual(3);
21
+ expect(results).toHaveLength(10);
22
+ expect(results.every((r) => r.status === "fulfilled")).toBe(true);
23
+ });
24
+
25
+ it("returns all results in order even when individual tasks fail", async () => {
26
+ const { runWithConcurrency } = await import("../../src/utils/concurrency");
27
+
28
+ const tasks = [
29
+ () => Promise.resolve("a"),
30
+ () => { throw new Error("fail"); },
31
+ () => Promise.resolve("c"),
32
+ ];
33
+
34
+ const results = await runWithConcurrency(tasks, 2);
35
+
36
+ expect(results).toHaveLength(3);
37
+ expect(results[0]).toEqual({ status: "fulfilled", value: "a" });
38
+ expect(results[1].status).toBe("rejected");
39
+ expect(results[2]).toEqual({ status: "fulfilled", value: "c" });
40
+ });
41
+
42
+ it("handles empty task list", async () => {
43
+ const { runWithConcurrency } = await import("../../src/utils/concurrency");
44
+
45
+ const results = await runWithConcurrency([], 3);
46
+ expect(results).toHaveLength(0);
47
+ });
48
+
49
+ it("works when concurrency exceeds task count", async () => {
50
+ const { runWithConcurrency } = await import("../../src/utils/concurrency");
51
+
52
+ const tasks = [() => Promise.resolve(1), () => Promise.resolve(2)];
53
+ const results = await runWithConcurrency(tasks, 10);
54
+
55
+ expect(results).toHaveLength(2);
56
+ expect(results.every((r) => r.status === "fulfilled")).toBe(true);
57
+ });
58
+ });
59
+
60
+ describe("getMaxConcurrency", () => {
61
+ it("returns at least 1", async () => {
62
+ const { getMaxConcurrency } = await import("../../src/utils/concurrency");
63
+ expect(getMaxConcurrency()).toBeGreaterThanOrEqual(1);
64
+ });
65
+ });
@@ -0,0 +1,144 @@
1
+ import { describe, it, expect, vi, beforeEach } from "vitest";
2
+ import path from "path";
3
+
4
+ const mockOnChange = vi.fn();
5
+ const mockWatcherClose = vi.fn();
6
+
7
+ vi.mock("@simplysm/core-node", () => ({
8
+ fsx: {
9
+ glob: vi.fn(),
10
+ mkdir: vi.fn(),
11
+ copy: vi.fn(),
12
+ rm: vi.fn(),
13
+ },
14
+ FsWatcher: {
15
+ watch: vi.fn(() => Promise.resolve({
16
+ onChange: mockOnChange,
17
+ close: mockWatcherClose,
18
+ })),
19
+ },
20
+ }));
21
+
22
+ const { fsx, FsWatcher } = await import("@simplysm/core-node");
23
+ const { copySrcFiles, watchCopySrcFiles } = await import("../../src/utils/copy-src");
24
+
25
+ const pkgDir = path.resolve("/workspace/packages/my-pkg");
26
+ const srcDir = path.join(pkgDir, "src");
27
+ const distDir = path.join(pkgDir, "dist");
28
+
29
+ describe("copySrcFiles", () => {
30
+ beforeEach(() => {
31
+ vi.mocked(fsx.glob).mockReset();
32
+ vi.mocked(fsx.mkdir).mockReset();
33
+ vi.mocked(fsx.copy).mockReset();
34
+ vi.mocked(fsx.mkdir).mockResolvedValue(undefined as any);
35
+ vi.mocked(fsx.copy).mockResolvedValue(undefined as any);
36
+ });
37
+
38
+ it("copies files matching glob patterns preserving relative paths", async () => {
39
+ vi.mocked(fsx.glob).mockResolvedValue([
40
+ path.join(srcDir, "styles", "app.css"),
41
+ ]);
42
+
43
+ await copySrcFiles(pkgDir, ["**/*.css"]);
44
+
45
+ expect(fsx.glob).toHaveBeenCalledWith("**/*.css", { cwd: srcDir, absolute: true });
46
+ expect(fsx.mkdir).toHaveBeenCalledWith(path.join(distDir, "styles"));
47
+ expect(fsx.copy).toHaveBeenCalledWith(
48
+ path.join(srcDir, "styles", "app.css"),
49
+ path.join(distDir, "styles", "app.css"),
50
+ );
51
+ });
52
+
53
+ it("handles multiple patterns", async () => {
54
+ vi.mocked(fsx.glob)
55
+ .mockResolvedValueOnce([path.join(srcDir, "a.css")])
56
+ .mockResolvedValueOnce([path.join(srcDir, "b.json")]);
57
+
58
+ await copySrcFiles(pkgDir, ["**/*.css", "**/*.json"]);
59
+
60
+ expect(fsx.glob).toHaveBeenCalledTimes(2);
61
+ expect(fsx.copy).toHaveBeenCalledTimes(2);
62
+ });
63
+
64
+ it("does nothing when no files match", async () => {
65
+ vi.mocked(fsx.glob).mockResolvedValue([]);
66
+
67
+ await copySrcFiles(pkgDir, ["**/*.css"]);
68
+
69
+ expect(fsx.copy).not.toHaveBeenCalled();
70
+ });
71
+ });
72
+
73
+ describe("watchCopySrcFiles", () => {
74
+ beforeEach(() => {
75
+ vi.mocked(fsx.glob).mockReset();
76
+ vi.mocked(fsx.mkdir).mockReset();
77
+ vi.mocked(fsx.copy).mockReset();
78
+ vi.mocked(fsx.rm).mockReset();
79
+ mockOnChange.mockReset();
80
+ vi.mocked(fsx.glob).mockResolvedValue([]);
81
+ vi.mocked(fsx.mkdir).mockResolvedValue(undefined as any);
82
+ vi.mocked(fsx.copy).mockResolvedValue(undefined as any);
83
+ vi.mocked(fsx.rm).mockResolvedValue(undefined as any);
84
+ });
85
+
86
+ it("performs initial copy then starts watch", async () => {
87
+ const watcher = await watchCopySrcFiles(pkgDir, ["**/*.css"]);
88
+
89
+ expect(fsx.glob).toHaveBeenCalledWith("**/*.css", { cwd: srcDir, absolute: true });
90
+ expect(FsWatcher.watch).toHaveBeenCalledWith([path.join(srcDir, "**/*.css")]);
91
+ expect(mockOnChange).toHaveBeenCalledWith({ delay: 300 }, expect.any(Function));
92
+ expect(watcher).toBeDefined();
93
+ });
94
+
95
+ it("copies file on add/change event", async () => {
96
+ await watchCopySrcFiles(pkgDir, ["**/*.css"]);
97
+
98
+ // Get the onChange callback
99
+ const onChangeCallback = mockOnChange.mock.calls[0][1] as (
100
+ changes: Array<{ event: string; path: string }>,
101
+ ) => Promise<void>;
102
+
103
+ await onChangeCallback([
104
+ { event: "change", path: path.join(srcDir, "styles", "app.css") },
105
+ ]);
106
+
107
+ expect(fsx.mkdir).toHaveBeenCalledWith(path.join(distDir, "styles"));
108
+ expect(fsx.copy).toHaveBeenCalledWith(
109
+ path.join(srcDir, "styles", "app.css"),
110
+ path.join(distDir, "styles", "app.css"),
111
+ );
112
+ });
113
+
114
+ it("deletes dist file on unlink event", async () => {
115
+ await watchCopySrcFiles(pkgDir, ["**/*.css"]);
116
+
117
+ const onChangeCallback = mockOnChange.mock.calls[0][1] as (
118
+ changes: Array<{ event: string; path: string }>,
119
+ ) => Promise<void>;
120
+
121
+ await onChangeCallback([
122
+ { event: "unlink", path: path.join(srcDir, "styles", "old.css") },
123
+ ]);
124
+
125
+ expect(fsx.rm).toHaveBeenCalledWith(path.join(distDir, "styles", "old.css"));
126
+ });
127
+
128
+ it("handles add event same as change event", async () => {
129
+ await watchCopySrcFiles(pkgDir, ["**/*.css"]);
130
+
131
+ const onChangeCallback = mockOnChange.mock.calls[0][1] as (
132
+ changes: Array<{ event: string; path: string }>,
133
+ ) => Promise<void>;
134
+
135
+ await onChangeCallback([
136
+ { event: "add", path: path.join(srcDir, "new.css") },
137
+ ]);
138
+
139
+ expect(fsx.copy).toHaveBeenCalledWith(
140
+ path.join(srcDir, "new.css"),
141
+ path.join(distDir, "new.css"),
142
+ );
143
+ });
144
+ });