@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
@@ -0,0 +1,294 @@
1
+ import { describe, it, expect, vi, beforeEach } from "vitest";
2
+
3
+ //#region Mocks
4
+
5
+ const mocks = vi.hoisted(() => ({
6
+ loadSdConfig: vi.fn(),
7
+ deserializeDiagnostic: vi.fn((d: any) => d),
8
+ typecheckNonPackageFiles: vi.fn(),
9
+ createBuildEngine: vi.fn(),
10
+ }));
11
+
12
+ const mockEngines: Array<{
13
+ run: ReturnType<typeof vi.fn>;
14
+ stop: ReturnType<typeof vi.fn>;
15
+ }> = [];
16
+
17
+ vi.mock("../../src/utils/sd-config", () => ({
18
+ loadSdConfig: mocks.loadSdConfig,
19
+ }));
20
+
21
+ vi.mock("../../src/utils/typecheck-serialization", () => ({
22
+ deserializeDiagnostic: mocks.deserializeDiagnostic,
23
+ }));
24
+
25
+ vi.mock("../../src/utils/typecheck-non-package", () => ({
26
+ typecheckNonPackageFiles: mocks.typecheckNonPackageFiles,
27
+ }));
28
+
29
+ vi.mock("../../src/engines/index", () => ({
30
+ createBuildEngine: mocks.createBuildEngine,
31
+ }));
32
+
33
+ vi.mock("typescript", async (importOriginal) => {
34
+ const orig = await importOriginal<Record<string, unknown>>();
35
+ const origDefault = (orig["default"] ?? orig) as Record<string, unknown>;
36
+ return {
37
+ ...orig,
38
+ default: {
39
+ ...origDefault,
40
+ sortAndDeduplicateDiagnostics: vi.fn((d: unknown[]) => d),
41
+ formatDiagnosticsWithColorAndContext: vi.fn(() => "formatted diagnostics"),
42
+ },
43
+ };
44
+ });
45
+
46
+ vi.mock("consola", () => {
47
+ const fns = (): Record<string, unknown> => ({
48
+ debug: vi.fn(), start: vi.fn(), success: vi.fn(),
49
+ info: vi.fn(), error: vi.fn(), warn: vi.fn(), log: vi.fn(),
50
+ withTag: vi.fn(() => fns()),
51
+ level: 0,
52
+ });
53
+ const c = fns();
54
+ return { consola: c, default: c, LogLevels: {} };
55
+ });
56
+
57
+ const { executeTypecheck } = await import("../../src/commands/typecheck");
58
+
59
+ //#endregion
60
+
61
+ //#region Helpers
62
+
63
+ function createMockEngine() {
64
+ const engine = {
65
+ run: vi.fn().mockResolvedValue({
66
+ success: true,
67
+ js: { success: true, errors: [], warnings: [] },
68
+ dts: { success: true, errors: [], warnings: [], diagnostics: [] },
69
+ }),
70
+ startWatch: vi.fn(),
71
+ stop: vi.fn().mockResolvedValue(undefined),
72
+ };
73
+ mockEngines.push(engine);
74
+ return engine;
75
+ }
76
+
77
+ function setupDefaults(packages: Record<string, any> = {}) {
78
+ mocks.loadSdConfig.mockResolvedValue({ packages });
79
+ mocks.createBuildEngine.mockImplementation(() => createMockEngine() as any);
80
+ mocks.typecheckNonPackageFiles.mockReturnValue({
81
+ success: true, errorCount: 0, warningCount: 0, diagnostics: [],
82
+ });
83
+ }
84
+
85
+ //#endregion
86
+
87
+ //#region Tests
88
+
89
+ beforeEach(() => {
90
+ vi.clearAllMocks();
91
+ mockEngines.length = 0;
92
+ });
93
+
94
+ describe("executeTypecheck", () => {
95
+ it("uses BuildEngine.run({js:false, dts:false}) for library packages", async () => {
96
+ setupDefaults({
97
+ "core-common": { target: "neutral" },
98
+ "core-node": { target: "node" },
99
+ });
100
+
101
+ const result = await executeTypecheck({ targets: [], options: [] });
102
+
103
+ expect(result.success).toBe(true);
104
+ expect(mocks.createBuildEngine).toHaveBeenCalledTimes(2);
105
+ for (const engine of mockEngines) {
106
+ expect(engine.run).toHaveBeenCalledWith({ js: false, dts: false });
107
+ expect(engine.stop).toHaveBeenCalled();
108
+ }
109
+ });
110
+
111
+ it("uses BuildEngine.run({js:false, dts:false}) for server packages", async () => {
112
+ setupDefaults({
113
+ "demo-server": { target: "server" },
114
+ });
115
+
116
+ const result = await executeTypecheck({ targets: [], options: [] });
117
+
118
+ expect(result.success).toBe(true);
119
+ expect(mocks.createBuildEngine).toHaveBeenCalledTimes(1);
120
+ expect(mocks.createBuildEngine).toHaveBeenCalledWith(
121
+ expect.objectContaining({
122
+ name: "demo-server",
123
+ config: expect.objectContaining({ target: "server" }),
124
+ }),
125
+ expect.any(Object),
126
+ );
127
+ expect(mockEngines[0].run).toHaveBeenCalledWith({ js: false, dts: false });
128
+ });
129
+
130
+ it("excludes scripts packages from typecheck", async () => {
131
+ setupDefaults({
132
+ "core-common": { target: "neutral" },
133
+ "sd-claude": { target: "scripts" },
134
+ });
135
+
136
+ await executeTypecheck({ targets: [], options: [] });
137
+
138
+ // Only 1 engine created (for core-common), scripts excluded
139
+ expect(mocks.createBuildEngine).toHaveBeenCalledTimes(1);
140
+ expect(mocks.createBuildEngine).toHaveBeenCalledWith(
141
+ expect.objectContaining({ name: "core-common" }),
142
+ expect.any(Object),
143
+ );
144
+ });
145
+
146
+ it("excludes client packages from typecheck (no engine yet)", async () => {
147
+ setupDefaults({
148
+ "core-common": { target: "neutral" },
149
+ "my-app": { target: "client", server: "demo-server" },
150
+ });
151
+
152
+ await executeTypecheck({ targets: [], options: [] });
153
+
154
+ expect(mocks.createBuildEngine).toHaveBeenCalledTimes(1);
155
+ });
156
+
157
+ it("runs non-package typecheck when no targets specified", async () => {
158
+ setupDefaults({ "core-common": { target: "neutral" } });
159
+
160
+ await executeTypecheck({ targets: [], options: [] });
161
+
162
+ expect(mocks.typecheckNonPackageFiles).toHaveBeenCalledWith(process.cwd());
163
+ });
164
+
165
+ it("skips non-package typecheck when all targets are package paths", async () => {
166
+ setupDefaults({ "core-common": { target: "neutral" } });
167
+
168
+ await executeTypecheck({ targets: ["packages/core-common"], options: [] });
169
+
170
+ expect(mocks.typecheckNonPackageFiles).not.toHaveBeenCalled();
171
+ });
172
+
173
+ it("aggregates diagnostics from engines and non-package", async () => {
174
+ setupDefaults({ "core-common": { target: "neutral" } });
175
+
176
+ const engineDiag = { category: 1, code: 2322, messageText: "engine err" };
177
+ mocks.createBuildEngine.mockImplementation(() => {
178
+ const engine = {
179
+ run: vi.fn().mockResolvedValue({
180
+ success: false,
181
+ js: { success: true, errors: [], warnings: [] },
182
+ dts: { success: false, errors: [], warnings: [], diagnostics: [engineDiag] },
183
+ }),
184
+ startWatch: vi.fn(),
185
+ stop: vi.fn().mockResolvedValue(undefined),
186
+ };
187
+ mockEngines.push(engine);
188
+ return engine as any;
189
+ });
190
+
191
+ const nonPkgDiag = { category: 1, code: 2345, messageText: "non-pkg err" };
192
+ mocks.typecheckNonPackageFiles.mockReturnValue({
193
+ success: false, errorCount: 1, warningCount: 0, diagnostics: [nonPkgDiag],
194
+ });
195
+
196
+ const result = await executeTypecheck({ targets: [], options: [] });
197
+
198
+ expect(mocks.createBuildEngine).toHaveBeenCalledTimes(1);
199
+ expect(mocks.typecheckNonPackageFiles).toHaveBeenCalled();
200
+
201
+ expect(result.success).toBe(false);
202
+ expect(result.errorCount).toBe(2);
203
+ });
204
+
205
+ it("limits concurrency of BuildEngine workers", async () => {
206
+ const packages: Record<string, any> = {};
207
+ for (let i = 0; i < 50; i++) {
208
+ packages[`pkg-${i}`] = { target: "neutral" };
209
+ }
210
+ setupDefaults(packages);
211
+
212
+ let active = 0;
213
+ let maxActive = 0;
214
+ mocks.createBuildEngine.mockImplementation(() => {
215
+ const engine = {
216
+ run: vi.fn(async () => {
217
+ active++;
218
+ maxActive = Math.max(maxActive, active);
219
+ await new Promise((resolve) => setTimeout(resolve, 5));
220
+ active--;
221
+ return {
222
+ success: true,
223
+ js: { success: true, errors: [], warnings: [] },
224
+ dts: { success: true, errors: [], warnings: [], diagnostics: [] },
225
+ };
226
+ }),
227
+ startWatch: vi.fn(),
228
+ stop: vi.fn().mockResolvedValue(undefined),
229
+ };
230
+ mockEngines.push(engine);
231
+ return engine as any;
232
+ });
233
+
234
+ await executeTypecheck({ targets: [], options: [] });
235
+
236
+ expect(maxActive).toBeLessThan(50);
237
+ expect(maxActive).toBeGreaterThan(0);
238
+ });
239
+
240
+ it("stops engine even when run fails", async () => {
241
+ setupDefaults({ "core-common": { target: "neutral" } });
242
+ mocks.createBuildEngine.mockImplementation(() => {
243
+ const engine = {
244
+ run: vi.fn().mockRejectedValue(new Error("build error")),
245
+ startWatch: vi.fn(),
246
+ stop: vi.fn().mockResolvedValue(undefined),
247
+ };
248
+ mockEngines.push(engine);
249
+ return engine as any;
250
+ });
251
+
252
+ const result = await executeTypecheck({ targets: [], options: [] });
253
+
254
+ expect(result.success).toBe(false);
255
+ expect(mockEngines[0].stop).toHaveBeenCalled();
256
+ });
257
+
258
+ it("passes options to loadSdConfig", async () => {
259
+ setupDefaults({});
260
+
261
+ await executeTypecheck({ targets: [], options: ["key=value"] });
262
+
263
+ expect(mocks.loadSdConfig).toHaveBeenCalledWith(
264
+ expect.objectContaining({ options: ["key=value"] }),
265
+ );
266
+ });
267
+
268
+ it("filters packages by targets", async () => {
269
+ setupDefaults({
270
+ "core-common": { target: "neutral" },
271
+ "core-node": { target: "node" },
272
+ });
273
+
274
+ await executeTypecheck({ targets: ["packages/core-common"], options: [] });
275
+
276
+ // Only core-common should have an engine
277
+ expect(mocks.createBuildEngine).toHaveBeenCalledTimes(1);
278
+ expect(mocks.createBuildEngine).toHaveBeenCalledWith(
279
+ expect.objectContaining({ name: "core-common" }),
280
+ expect.any(Object),
281
+ );
282
+ });
283
+
284
+ it("returns success when no packages to typecheck", async () => {
285
+ setupDefaults({});
286
+
287
+ const result = await executeTypecheck({ targets: [], options: [] });
288
+
289
+ expect(result.success).toBe(true);
290
+ expect(mocks.createBuildEngine).not.toHaveBeenCalled();
291
+ });
292
+ });
293
+
294
+ //#endregion
@@ -0,0 +1,53 @@
1
+ import { describe, it, expect, vi, beforeEach } from "vitest";
2
+
3
+ const mocks = vi.hoisted(() => ({
4
+ initialize: vi.fn(async () => {}),
5
+ start: vi.fn(async () => {}),
6
+ awaitTermination: vi.fn(async () => {}),
7
+ shutdown: vi.fn(async () => {}),
8
+ ctor: vi.fn(),
9
+ }));
10
+
11
+ vi.mock("../../src/orchestrators/DevWatchOrchestrator", () => ({
12
+ DevWatchOrchestrator: vi.fn().mockImplementation(function (this: any, options: any) {
13
+ mocks.ctor(options);
14
+ this.initialize = mocks.initialize;
15
+ this.start = mocks.start;
16
+ this.awaitTermination = mocks.awaitTermination;
17
+ this.shutdown = mocks.shutdown;
18
+ }),
19
+ }));
20
+
21
+ const { runWatch } = await import("../../src/commands/watch");
22
+
23
+ describe("runWatch", () => {
24
+ beforeEach(() => {
25
+ vi.clearAllMocks();
26
+ mocks.initialize.mockResolvedValue(undefined);
27
+ mocks.start.mockResolvedValue(undefined);
28
+ mocks.awaitTermination.mockResolvedValue(undefined);
29
+ mocks.shutdown.mockResolvedValue(undefined);
30
+ });
31
+
32
+ it("creates DevWatchOrchestrator with mode:watch and runs lifecycle", async () => {
33
+ await runWatch({ targets: ["core-common"], options: ["-o", "fast"] });
34
+
35
+ expect(mocks.ctor).toHaveBeenCalledWith({
36
+ mode: "watch",
37
+ targets: ["core-common"],
38
+ options: ["-o", "fast"],
39
+ });
40
+
41
+ expect(mocks.initialize).toHaveBeenCalledOnce();
42
+ expect(mocks.start).toHaveBeenCalledOnce();
43
+ expect(mocks.awaitTermination).toHaveBeenCalledOnce();
44
+ expect(mocks.shutdown).toHaveBeenCalledOnce();
45
+ });
46
+
47
+ it("calls shutdown even when initialize throws", async () => {
48
+ mocks.initialize.mockRejectedValueOnce(new Error("config error"));
49
+
50
+ await expect(runWatch({ targets: [], options: [] })).rejects.toThrow("config error");
51
+ expect(mocks.shutdown).toHaveBeenCalledOnce();
52
+ });
53
+ });
@@ -0,0 +1,247 @@
1
+ import { describe, it, expect, vi, beforeEach } from "vitest";
2
+
3
+ vi.mock("consola", () => ({
4
+ consola: {
5
+ withTag: vi.fn(() => ({
6
+ debug: vi.fn(),
7
+ warn: vi.fn(),
8
+ error: vi.fn(),
9
+ })),
10
+ },
11
+ }));
12
+
13
+ vi.mock("@simplysm/core-node", () => ({
14
+ Worker: {
15
+ create: vi.fn(() => ({
16
+ build: vi.fn(),
17
+ startWatch: vi.fn(),
18
+ stopWatch: vi.fn(),
19
+ terminate: vi.fn(),
20
+ on: vi.fn(),
21
+ })),
22
+ },
23
+ }));
24
+
25
+ const mockHasAngularCompilerOptions = vi.fn<(pkgDir: string) => boolean>();
26
+ vi.mock("../../src/utils/tsconfig", () => ({
27
+ hasAngularCompilerOptions: (...args: [string]) => mockHasAngularCompilerOptions(...args),
28
+ }));
29
+
30
+ const { createBuildEngine } = await import("../../src/engines/index");
31
+ const { TscEngine } = await import("../../src/engines/TscEngine");
32
+ const { NgtscEngine } = await import("../../src/engines/NgtscEngine");
33
+ const { ServerEsbuildEngine } = await import("../../src/engines/ServerEsbuildEngine");
34
+ const { ViteEngine } = await import("../../src/engines/ViteEngine");
35
+
36
+ import type { BuildPackageInfo, ClientPackageInfo, ServerPackageInfo } from "../../src/engines/types";
37
+
38
+ describe("createBuildEngine", () => {
39
+ beforeEach(() => {
40
+ vi.clearAllMocks();
41
+ });
42
+
43
+ // Acceptance: Scenario "비-Angular Library 패키지"
44
+ it("returns TscEngine for node target package", () => {
45
+ mockHasAngularCompilerOptions.mockReturnValue(false);
46
+ const pkg: BuildPackageInfo = {
47
+ name: "test",
48
+ dir: "/packages/test",
49
+ config: { target: "node" } as any,
50
+ };
51
+
52
+ const engine = createBuildEngine(pkg, { cwd: "/root" });
53
+
54
+ expect(engine).toBeInstanceOf(TscEngine);
55
+ });
56
+
57
+ it("returns TscEngine for browser target package", () => {
58
+ mockHasAngularCompilerOptions.mockReturnValue(false);
59
+ const pkg: BuildPackageInfo = {
60
+ name: "test",
61
+ dir: "/packages/test",
62
+ config: { target: "browser" } as any,
63
+ };
64
+
65
+ const engine = createBuildEngine(pkg, { cwd: "/root" });
66
+
67
+ expect(engine).toBeInstanceOf(TscEngine);
68
+ });
69
+
70
+ it("returns TscEngine for neutral target package", () => {
71
+ mockHasAngularCompilerOptions.mockReturnValue(false);
72
+ const pkg: BuildPackageInfo = {
73
+ name: "test",
74
+ dir: "/packages/test",
75
+ config: { target: "neutral" } as any,
76
+ };
77
+
78
+ const engine = createBuildEngine(pkg, { cwd: "/root" });
79
+
80
+ expect(engine).toBeInstanceOf(TscEngine);
81
+ });
82
+
83
+ // Acceptance: Scenario "Server 패키지는 변경 없음"
84
+ it("returns ServerEsbuildEngine for server target package", () => {
85
+ mockHasAngularCompilerOptions.mockReturnValue(false);
86
+ const pkg: ServerPackageInfo = {
87
+ name: "test-server",
88
+ dir: "/packages/test-server",
89
+ config: { target: "server" } as any,
90
+ };
91
+
92
+ const engine = createBuildEngine(pkg, { cwd: "/root" });
93
+
94
+ expect(engine).toBeInstanceOf(ServerEsbuildEngine);
95
+ });
96
+
97
+ // Acceptance: Scenario "Angular Library 패키지는 변경 없음"
98
+ it("returns NgtscEngine when tsconfig has angularCompilerOptions", () => {
99
+ mockHasAngularCompilerOptions.mockReturnValue(true);
100
+ const pkg: BuildPackageInfo = {
101
+ name: "angular",
102
+ dir: "/packages/angular",
103
+ config: { target: "browser" } as any,
104
+ };
105
+
106
+ const engine = createBuildEngine(pkg, { cwd: "/root" });
107
+
108
+ expect(engine).toBeInstanceOf(NgtscEngine);
109
+ });
110
+
111
+ it("returns TscEngine when tsconfig has no angularCompilerOptions", () => {
112
+ mockHasAngularCompilerOptions.mockReturnValue(false);
113
+ const pkg: BuildPackageInfo = {
114
+ name: "core-browser",
115
+ dir: "/packages/core-browser",
116
+ config: { target: "browser" } as any,
117
+ };
118
+
119
+ const engine = createBuildEngine(pkg, { cwd: "/root" });
120
+
121
+ expect(engine).toBeInstanceOf(TscEngine);
122
+ });
123
+
124
+ // Unit: hasAngularCompilerOptions is called with the package directory
125
+ it("calls hasAngularCompilerOptions with the package dir for library targets", () => {
126
+ mockHasAngularCompilerOptions.mockReturnValue(false);
127
+ const pkg: BuildPackageInfo = {
128
+ name: "test",
129
+ dir: "/packages/test",
130
+ config: { target: "browser" } as any,
131
+ };
132
+
133
+ createBuildEngine(pkg, { cwd: "/root" });
134
+
135
+ expect(mockHasAngularCompilerOptions).toHaveBeenCalledWith("/packages/test");
136
+ });
137
+
138
+ // Unit: does not call hasAngularCompilerOptions for server targets
139
+ it("does not check angularCompilerOptions for server target", () => {
140
+ mockHasAngularCompilerOptions.mockReturnValue(false);
141
+ const pkg: ServerPackageInfo = {
142
+ name: "test-server",
143
+ dir: "/packages/test-server",
144
+ config: { target: "server" } as any,
145
+ };
146
+
147
+ createBuildEngine(pkg, { cwd: "/root" });
148
+
149
+ expect(mockHasAngularCompilerOptions).not.toHaveBeenCalled();
150
+ });
151
+
152
+ // Acceptance: Scenario "client target에 ViteEngine 생성"
153
+ it("returns ViteEngine for client target package", () => {
154
+ const pkg: ClientPackageInfo = {
155
+ name: "my-client",
156
+ dir: "/packages/my-client",
157
+ config: { target: "client", server: "my-server" } as any,
158
+ };
159
+
160
+ const engine = createBuildEngine(pkg, { cwd: "/root" });
161
+
162
+ expect(engine).toBeInstanceOf(ViteEngine);
163
+ });
164
+
165
+ // Unit: does not call hasAngularCompilerOptions for client targets
166
+ it("does not check angularCompilerOptions for client target", () => {
167
+ mockHasAngularCompilerOptions.mockReturnValue(false);
168
+ const pkg: ClientPackageInfo = {
169
+ name: "my-client",
170
+ dir: "/packages/my-client",
171
+ config: { target: "client", server: "my-server" } as any,
172
+ };
173
+
174
+ createBuildEngine(pkg, { cwd: "/root" });
175
+
176
+ expect(mockHasAngularCompilerOptions).not.toHaveBeenCalled();
177
+ });
178
+ });
179
+
180
+ // Acceptance: Scenario "ViteEngine이 어댑터 격리를 준수한다"
181
+ describe("ViteEngine adapter isolation", () => {
182
+ it("ViteEngine and its worker do not directly import @angular/* packages", async () => {
183
+ const fs = await import("node:fs");
184
+ const path = await import("node:path");
185
+
186
+ const sdCliSrc = path.resolve(import.meta.dirname, "../../src");
187
+
188
+ const filesToCheck = [
189
+ path.join(sdCliSrc, "engines", "ViteEngine.ts"),
190
+ path.join(sdCliSrc, "workers", "vite-build.worker.ts"),
191
+ ];
192
+
193
+ const angularImportPattern = /from\s+["']@angular\/(build|compiler-cli)/;
194
+
195
+ for (const filePath of filesToCheck) {
196
+ const content = fs.readFileSync(filePath, "utf-8");
197
+ const hasDirectImport = angularImportPattern.test(content);
198
+ expect(hasDirectImport, `${path.basename(filePath)} should not directly import @angular/*`).toBe(false);
199
+ }
200
+ });
201
+
202
+ it("vite-build.worker.ts imports Angular APIs through angular-build.ts adapter", async () => {
203
+ const fs = await import("node:fs");
204
+ const path = await import("node:path");
205
+
206
+ const workerFile = path.resolve(import.meta.dirname, "../../src/workers/vite-build.worker.ts");
207
+ const content = fs.readFileSync(workerFile, "utf-8");
208
+
209
+ const angularImportPattern = /from\s+["']@angular\/(build|compiler-cli)/;
210
+ expect(angularImportPattern.test(content)).toBe(false);
211
+ });
212
+ });
213
+
214
+ // Acceptance: Scenario "NgtscEngine이 어댑터 격리를 준수한다"
215
+ describe("NgtscEngine adapter isolation", () => {
216
+ it("NgtscEngine and its dependencies do not directly import @angular/* packages", async () => {
217
+ const fs = await import("node:fs");
218
+ const path = await import("node:path");
219
+
220
+ const sdCliSrc = path.resolve(import.meta.dirname, "../../src");
221
+
222
+ const filesToCheck = [
223
+ path.join(sdCliSrc, "engines", "NgtscEngine.ts"),
224
+ path.join(sdCliSrc, "workers", "ngtsc-build.worker.ts"),
225
+ path.join(sdCliSrc, "utils", "ngtsc-build-core.ts"),
226
+ path.join(sdCliSrc, "utils", "output-path-rewriter.ts"),
227
+ ];
228
+
229
+ const angularImportPattern = /from\s+["']@angular\/(build|compiler-cli)/;
230
+
231
+ for (const filePath of filesToCheck) {
232
+ const content = fs.readFileSync(filePath, "utf-8");
233
+ const hasDirectImport = angularImportPattern.test(content);
234
+ expect(hasDirectImport, `${path.basename(filePath)} should not directly import @angular/*`).toBe(false);
235
+ }
236
+ });
237
+
238
+ it("all Angular API access goes through angular-build.ts adapter", async () => {
239
+ const fs = await import("node:fs");
240
+ const path = await import("node:path");
241
+
242
+ const ngtscBuildCore = path.resolve(import.meta.dirname, "../../src/utils/ngtsc-build-core.ts");
243
+ const content = fs.readFileSync(ngtscBuildCore, "utf-8");
244
+
245
+ expect(content).toContain("./angular-build");
246
+ });
247
+ });