@simplysm/sd-cli 14.0.42 → 14.0.44

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 (338) hide show
  1. package/dist/angular/angular-compiler.d.ts +0 -35
  2. package/dist/angular/angular-compiler.d.ts.map +1 -1
  3. package/dist/angular/angular-compiler.js +0 -374
  4. package/dist/angular/angular-compiler.js.map +1 -1
  5. package/dist/angular/hmr-candidates.d.ts +13 -0
  6. package/dist/angular/hmr-candidates.d.ts.map +1 -0
  7. package/dist/angular/hmr-candidates.js +230 -0
  8. package/dist/angular/hmr-candidates.js.map +1 -0
  9. package/dist/angular/ngtsc-build-core.d.ts +41 -37
  10. package/dist/angular/ngtsc-build-core.d.ts.map +1 -1
  11. package/dist/angular/ngtsc-build-core.js +155 -52
  12. package/dist/angular/ngtsc-build-core.js.map +1 -1
  13. package/dist/angular/vite-angular-plugin.d.ts +1 -1
  14. package/dist/angular/vite-angular-plugin.d.ts.map +1 -1
  15. package/dist/angular/vite-angular-plugin.js +63 -56
  16. package/dist/angular/vite-angular-plugin.js.map +1 -1
  17. package/dist/angular/web-worker-transformer.d.ts +9 -0
  18. package/dist/angular/web-worker-transformer.d.ts.map +1 -0
  19. package/dist/angular/web-worker-transformer.js +73 -0
  20. package/dist/angular/web-worker-transformer.js.map +1 -0
  21. package/dist/capacitor/capacitor.d.ts.map +1 -1
  22. package/dist/capacitor/capacitor.js +6 -4
  23. package/dist/capacitor/capacitor.js.map +1 -1
  24. package/dist/commands/check.d.ts +1 -1
  25. package/dist/commands/check.d.ts.map +1 -1
  26. package/dist/commands/check.js +15 -65
  27. package/dist/commands/check.js.map +1 -1
  28. package/dist/commands/publish/deployment-phase.d.ts.map +1 -1
  29. package/dist/commands/publish/deployment-phase.js +13 -5
  30. package/dist/commands/publish/deployment-phase.js.map +1 -1
  31. package/dist/commands/publish/npm-publisher.js +1 -1
  32. package/dist/commands/publish/npm-publisher.js.map +1 -1
  33. package/dist/commands/publish/publish-command.js +1 -1
  34. package/dist/commands/publish/publish-command.js.map +1 -1
  35. package/dist/commands/publish/version-upgrade.d.ts.map +1 -1
  36. package/dist/commands/publish/version-upgrade.js +16 -13
  37. package/dist/commands/publish/version-upgrade.js.map +1 -1
  38. package/dist/commands/replace-deps.d.ts.map +1 -1
  39. package/dist/commands/replace-deps.js +2 -1
  40. package/dist/commands/replace-deps.js.map +1 -1
  41. package/dist/deps/replace-deps/collect-deps.d.ts.map +1 -1
  42. package/dist/deps/replace-deps/collect-deps.js +5 -2
  43. package/dist/deps/replace-deps/collect-deps.js.map +1 -1
  44. package/dist/deps/replace-deps/replace-deps-resolve.d.ts.map +1 -1
  45. package/dist/deps/replace-deps/replace-deps-resolve.js +6 -7
  46. package/dist/deps/replace-deps/replace-deps-resolve.js.map +1 -1
  47. package/dist/deps/replace-deps/replace-deps.d.ts +21 -3
  48. package/dist/deps/replace-deps/replace-deps.d.ts.map +1 -1
  49. package/dist/deps/replace-deps/replace-deps.js +175 -66
  50. package/dist/deps/replace-deps/replace-deps.js.map +1 -1
  51. package/dist/electron/electron.js +7 -7
  52. package/dist/electron/electron.js.map +1 -1
  53. package/dist/engines/BaseEngine.d.ts.map +1 -1
  54. package/dist/engines/BaseEngine.js +2 -5
  55. package/dist/engines/BaseEngine.js.map +1 -1
  56. package/dist/engines/EsbuildClientEngine.d.ts.map +1 -1
  57. package/dist/engines/EsbuildClientEngine.js +16 -9
  58. package/dist/engines/EsbuildClientEngine.js.map +1 -1
  59. package/dist/engines/NgtscEngine.d.ts +4 -4
  60. package/dist/engines/NgtscEngine.d.ts.map +1 -1
  61. package/dist/engines/NgtscEngine.js +5 -5
  62. package/dist/engines/NgtscEngine.js.map +1 -1
  63. package/dist/engines/TscEngine.d.ts.map +1 -1
  64. package/dist/engines/TscEngine.js +0 -2
  65. package/dist/engines/TscEngine.js.map +1 -1
  66. package/dist/engines/types.d.ts +2 -0
  67. package/dist/engines/types.d.ts.map +1 -1
  68. package/dist/esbuild/esbuild-angular-compiler-plugin.d.ts +36 -0
  69. package/dist/esbuild/esbuild-angular-compiler-plugin.d.ts.map +1 -0
  70. package/dist/esbuild/esbuild-angular-compiler-plugin.js +464 -0
  71. package/dist/esbuild/esbuild-angular-compiler-plugin.js.map +1 -0
  72. package/dist/esbuild/esbuild-client-config.d.ts +8 -2
  73. package/dist/esbuild/esbuild-client-config.d.ts.map +1 -1
  74. package/dist/esbuild/esbuild-client-config.js +48 -33
  75. package/dist/esbuild/esbuild-client-config.js.map +1 -1
  76. package/dist/esbuild/esbuild-postcss-plugin.d.ts.map +1 -1
  77. package/dist/esbuild/esbuild-postcss-plugin.js +9 -6
  78. package/dist/esbuild/esbuild-postcss-plugin.js.map +1 -1
  79. package/dist/esbuild/esbuild-tsc-plugin.d.ts +4 -1
  80. package/dist/esbuild/esbuild-tsc-plugin.d.ts.map +1 -1
  81. package/dist/esbuild/esbuild-tsc-plugin.js +27 -23
  82. package/dist/esbuild/esbuild-tsc-plugin.js.map +1 -1
  83. package/dist/esbuild/file-reference-tracker.d.ts +24 -0
  84. package/dist/esbuild/file-reference-tracker.d.ts.map +1 -0
  85. package/dist/esbuild/file-reference-tracker.js +57 -0
  86. package/dist/esbuild/file-reference-tracker.js.map +1 -0
  87. package/dist/esbuild/lmdb-cache-store.d.ts +18 -0
  88. package/dist/esbuild/lmdb-cache-store.d.ts.map +1 -0
  89. package/dist/esbuild/lmdb-cache-store.js +41 -0
  90. package/dist/esbuild/lmdb-cache-store.js.map +1 -0
  91. package/dist/esbuild/load-result-cache.d.ts +17 -0
  92. package/dist/esbuild/load-result-cache.d.ts.map +1 -0
  93. package/dist/esbuild/load-result-cache.js +61 -0
  94. package/dist/esbuild/load-result-cache.js.map +1 -0
  95. package/dist/index.d.ts +3 -0
  96. package/dist/index.d.ts.map +1 -1
  97. package/dist/index.js +2 -0
  98. package/dist/index.js.map +1 -1
  99. package/dist/lint/lint-core.js +7 -7
  100. package/dist/lint/lint-core.js.map +1 -1
  101. package/dist/orchestrators/BaseOrchestrator.js +2 -2
  102. package/dist/orchestrators/BaseOrchestrator.js.map +1 -1
  103. package/dist/orchestrators/BuildOrchestrator.d.ts.map +1 -1
  104. package/dist/orchestrators/BuildOrchestrator.js +5 -19
  105. package/dist/orchestrators/BuildOrchestrator.js.map +1 -1
  106. package/dist/orchestrators/DevOrchestrator.js +5 -5
  107. package/dist/orchestrators/DevOrchestrator.js.map +1 -1
  108. package/dist/orchestrators/WatchOrchestrator.js +6 -6
  109. package/dist/orchestrators/WatchOrchestrator.js.map +1 -1
  110. package/dist/runtime/ResultCollector.d.ts +1 -0
  111. package/dist/runtime/ResultCollector.d.ts.map +1 -1
  112. package/dist/runtime/ResultCollector.js.map +1 -1
  113. package/dist/runtime/engine-watch-events.d.ts.map +1 -1
  114. package/dist/runtime/engine-watch-events.js +3 -0
  115. package/dist/runtime/engine-watch-events.js.map +1 -1
  116. package/dist/runtime/rebuild-manager.js +1 -1
  117. package/dist/runtime/rebuild-manager.js.map +1 -1
  118. package/dist/runtime/worker-utils.js +1 -1
  119. package/dist/runtime/worker-utils.js.map +1 -1
  120. package/dist/sd-cli-entry.d.ts.map +1 -1
  121. package/dist/sd-cli-entry.js +4 -3
  122. package/dist/sd-cli-entry.js.map +1 -1
  123. package/dist/sd-cli.js +3 -3
  124. package/dist/sd-cli.js.map +1 -1
  125. package/dist/ts-compiler/SdTsCompiler.d.ts +39 -0
  126. package/dist/ts-compiler/SdTsCompiler.d.ts.map +1 -0
  127. package/dist/ts-compiler/SdTsCompiler.js +593 -0
  128. package/dist/ts-compiler/SdTsCompiler.js.map +1 -0
  129. package/dist/ts-compiler/sd-ts-compiler-options.d.ts +40 -0
  130. package/dist/ts-compiler/sd-ts-compiler-options.d.ts.map +1 -0
  131. package/dist/ts-compiler/sd-ts-compiler-options.js +2 -0
  132. package/dist/ts-compiler/sd-ts-compiler-options.js.map +1 -0
  133. package/dist/ts-compiler/sd-ts-compiler-result.d.ts +34 -0
  134. package/dist/ts-compiler/sd-ts-compiler-result.d.ts.map +1 -0
  135. package/dist/ts-compiler/sd-ts-compiler-result.js +2 -0
  136. package/dist/ts-compiler/sd-ts-compiler-result.js.map +1 -0
  137. package/dist/utils/copy-public.d.ts +6 -4
  138. package/dist/utils/copy-public.d.ts.map +1 -1
  139. package/dist/utils/copy-public.js +9 -7
  140. package/dist/utils/copy-public.js.map +1 -1
  141. package/dist/utils/diagnostic-utils.d.ts +2 -3
  142. package/dist/utils/diagnostic-utils.d.ts.map +1 -1
  143. package/dist/utils/diagnostic-utils.js +8 -9
  144. package/dist/utils/diagnostic-utils.js.map +1 -1
  145. package/dist/utils/output-utils.d.ts +8 -2
  146. package/dist/utils/output-utils.d.ts.map +1 -1
  147. package/dist/utils/output-utils.js +32 -8
  148. package/dist/utils/output-utils.js.map +1 -1
  149. package/dist/workers/client.worker.d.ts +1 -1
  150. package/dist/workers/client.worker.d.ts.map +1 -1
  151. package/dist/workers/client.worker.js +115 -110
  152. package/dist/workers/client.worker.js.map +1 -1
  153. package/dist/workers/incremental-mtime-tracker.d.ts +13 -0
  154. package/dist/workers/incremental-mtime-tracker.d.ts.map +1 -0
  155. package/dist/workers/incremental-mtime-tracker.js +65 -0
  156. package/dist/workers/incremental-mtime-tracker.js.map +1 -0
  157. package/dist/workers/library-build.worker.d.ts +0 -2
  158. package/dist/workers/library-build.worker.d.ts.map +1 -1
  159. package/dist/workers/library-build.worker.js +169 -70
  160. package/dist/workers/library-build.worker.js.map +1 -1
  161. package/dist/workers/server-build.worker.d.ts.map +1 -1
  162. package/dist/workers/server-build.worker.js +30 -57
  163. package/dist/workers/server-build.worker.js.map +1 -1
  164. package/dist/workers/server-esbuild-context.d.ts +7 -0
  165. package/dist/workers/server-esbuild-context.d.ts.map +1 -1
  166. package/dist/workers/server-esbuild-context.js +11 -2
  167. package/dist/workers/server-esbuild-context.js.map +1 -1
  168. package/package.json +5 -4
  169. package/src/angular/angular-compiler.ts +0 -502
  170. package/src/angular/hmr-candidates.ts +295 -0
  171. package/src/angular/ngtsc-build-core.ts +192 -91
  172. package/src/angular/vite-angular-plugin.ts +71 -65
  173. package/src/angular/web-worker-transformer.ts +117 -0
  174. package/src/capacitor/capacitor.ts +6 -4
  175. package/src/commands/check.ts +17 -76
  176. package/src/commands/publish/deployment-phase.ts +11 -7
  177. package/src/commands/publish/npm-publisher.ts +1 -1
  178. package/src/commands/publish/publish-command.ts +1 -1
  179. package/src/commands/publish/version-upgrade.ts +44 -35
  180. package/src/commands/replace-deps.ts +3 -1
  181. package/src/deps/replace-deps/collect-deps.ts +4 -2
  182. package/src/deps/replace-deps/replace-deps-resolve.ts +12 -7
  183. package/src/deps/replace-deps/replace-deps.ts +191 -69
  184. package/src/electron/electron.ts +7 -7
  185. package/src/engines/BaseEngine.ts +2 -6
  186. package/src/engines/EsbuildClientEngine.ts +16 -10
  187. package/src/engines/NgtscEngine.ts +7 -7
  188. package/src/engines/TscEngine.ts +0 -2
  189. package/src/engines/types.ts +2 -0
  190. package/src/esbuild/esbuild-angular-compiler-plugin.ts +647 -0
  191. package/src/esbuild/esbuild-client-config.ts +57 -41
  192. package/src/esbuild/esbuild-postcss-plugin.ts +9 -6
  193. package/src/esbuild/esbuild-tsc-plugin.ts +33 -23
  194. package/src/esbuild/file-reference-tracker.ts +61 -0
  195. package/src/esbuild/lmdb-cache-store.ts +46 -0
  196. package/src/esbuild/load-result-cache.ts +85 -0
  197. package/src/index.ts +5 -0
  198. package/src/lint/lint-core.ts +7 -7
  199. package/src/orchestrators/BaseOrchestrator.ts +2 -2
  200. package/src/orchestrators/BuildOrchestrator.ts +5 -24
  201. package/src/orchestrators/DevOrchestrator.ts +5 -5
  202. package/src/orchestrators/WatchOrchestrator.ts +6 -6
  203. package/src/runtime/ResultCollector.ts +1 -0
  204. package/src/runtime/engine-watch-events.ts +3 -0
  205. package/src/runtime/rebuild-manager.ts +1 -1
  206. package/src/runtime/worker-utils.ts +1 -1
  207. package/src/sd-cli-entry.ts +5 -3
  208. package/src/sd-cli.ts +4 -4
  209. package/src/ts-compiler/SdTsCompiler.ts +815 -0
  210. package/src/ts-compiler/sd-ts-compiler-options.ts +46 -0
  211. package/src/ts-compiler/sd-ts-compiler-result.ts +34 -0
  212. package/src/utils/copy-public.ts +9 -6
  213. package/src/utils/diagnostic-utils.ts +8 -9
  214. package/src/utils/output-utils.ts +38 -8
  215. package/src/workers/client.worker.ts +141 -126
  216. package/src/workers/incremental-mtime-tracker.ts +68 -0
  217. package/src/workers/library-build.worker.ts +214 -75
  218. package/src/workers/server-build.worker.ts +31 -61
  219. package/src/workers/server-esbuild-context.ts +14 -2
  220. package/tests/angular/fixtures/packages/basic-app/dist/styles.css +3 -0
  221. package/tests/angular/fixtures/packages/basic-app/scss/styles.scss +5 -0
  222. package/tests/angular/ngtsc-build-core.acc.spec.ts +210 -0
  223. package/tests/angular/ngtsc-build-core.spec.ts +52 -0
  224. package/tests/angular/vite-angular-plugin-sdtscompiler.verify.md +13 -0
  225. package/tests/angular/web-worker-transformer.spec.ts +154 -0
  226. package/tests/capacitor/capacitor-build.spec.ts +1 -1
  227. package/tests/capacitor/capacitor-icon.spec.ts +1 -1
  228. package/tests/capacitor/capacitor-init.spec.ts +1 -1
  229. package/tests/commands/check.spec.ts +90 -104
  230. package/tests/commands/publish.spec.ts +12 -4
  231. package/tests/commands/slice3-severity-cleanup.verify.md +12 -0
  232. package/tests/commands/version-upgrade.acc.spec.ts +210 -0
  233. package/tests/commands/version-upgrade.spec.ts +148 -0
  234. package/tests/deps/replace-deps/collect-deps.acc.spec.ts +62 -0
  235. package/tests/deps/replace-deps/collect-deps.spec.ts +49 -0
  236. package/tests/deps/replace-deps/replace-deps-filter.spec.ts +103 -0
  237. package/tests/deps/replace-deps/replace-deps-perf.verify.md +15 -0
  238. package/tests/deps/replace-deps/replace-deps-resolve.acc.spec.ts +124 -0
  239. package/tests/deps/replace-deps/replace-deps-setup.acc.spec.ts +156 -0
  240. package/tests/electron/electron.spec.ts +4 -1
  241. package/tests/engines/engine-adapter-isolation.spec.ts +5 -6
  242. package/tests/engines/engine-duplicate-output-removal.verify.md +10 -0
  243. package/tests/engines/esbuild-client-engine.acc.spec.ts +79 -0
  244. package/tests/engines/esbuild-client-engine.spec.ts +73 -3
  245. package/tests/esbuild/esbuild-angular-compiler-plugin-hmr.verify.md +23 -0
  246. package/tests/esbuild/esbuild-angular-compiler-plugin-onload.verify.md +21 -0
  247. package/tests/esbuild/esbuild-angular-compiler-plugin-onstart-extraction.verify.md +16 -0
  248. package/tests/esbuild/esbuild-angular-compiler-plugin-sdtscompiler.verify.md +15 -0
  249. package/tests/esbuild/esbuild-angular-compiler-plugin-stylesheet.verify.md +31 -0
  250. package/tests/esbuild/esbuild-angular-compiler-plugin-worker.verify.md +31 -0
  251. package/tests/esbuild/esbuild-angular-compiler-plugin.spec.ts +397 -0
  252. package/tests/esbuild/esbuild-angular-compiler-plugin.verify.md +21 -0
  253. package/tests/esbuild/esbuild-postcss-plugin-chunking.verify.md +17 -0
  254. package/tests/esbuild/esbuild-postcss-plugin.acc.spec.ts +152 -0
  255. package/tests/esbuild/esbuild-tsc-plugin-imports.verify.md +13 -0
  256. package/tests/esbuild/esbuild-tsc-plugin.acc.spec.ts +56 -111
  257. package/tests/esbuild/esbuild-tsc-plugin.spec.ts +116 -52
  258. package/tests/esbuild/file-reference-tracker.spec.ts +99 -0
  259. package/tests/esbuild/lmdb-cache-store.spec.ts +58 -0
  260. package/tests/esbuild/load-result-cache.acc.spec.ts +55 -0
  261. package/tests/esbuild/load-result-cache.spec.ts +133 -0
  262. package/tests/orchestrators/build-orchestrator.spec.ts +4 -3
  263. package/tests/orchestrators/dev-orchestrator.spec.ts +5 -5
  264. package/tests/orchestrators/slice1-stdout-to-consola.verify.md +10 -0
  265. package/tests/orchestrators/typecheck-orchestrator.spec.ts +1 -1
  266. package/tests/orchestrators/watch-orchestrator.spec.ts +7 -7
  267. package/tests/runtime/result-collector.spec.ts +64 -0
  268. package/tests/sd-cli-entry.spec.ts +3 -4
  269. package/tests/sd-cli-log-tag.verify.md +11 -0
  270. package/tests/ts-compiler/SdTsCompiler-affected-files.verify.md +8 -0
  271. package/tests/ts-compiler/SdTsCompiler-diagnostics.verify.md +12 -0
  272. package/tests/ts-compiler/SdTsCompiler-emit.verify.md +9 -0
  273. package/tests/ts-compiler/SdTsCompiler.acc.spec.ts +603 -0
  274. package/tests/ts-compiler/SdTsCompiler.spec.ts +265 -0
  275. package/tests/ts-compiler/SdTsCompiler.verify.md +41 -0
  276. package/tests/ts-compiler/fixtures/non-angular-pkg/.cache/typecheck-browser.tsbuildinfo +1 -0
  277. package/tests/ts-compiler/fixtures/non-angular-pkg/.cache/typecheck-node.tsbuildinfo +1 -0
  278. package/tests/ts-compiler/fixtures/non-angular-pkg/.cache/typecheck.tsbuildinfo +1 -0
  279. package/tests/ts-compiler/fixtures/non-angular-pkg/src/index.ts +3 -0
  280. package/tests/ts-compiler/fixtures/non-angular-pkg/src/util.ts +3 -0
  281. package/tests/ts-compiler/fixtures/non-angular-pkg/tests/sample.test-file.ts +3 -0
  282. package/tests/ts-compiler/fixtures/non-angular-pkg/tsconfig.json +12 -0
  283. package/tests/ts-compiler/scss-lint-integration.verify.md +14 -0
  284. package/tests/utils/angular-build.spec.ts +1 -1
  285. package/tests/utils/copy-public-outdir.verify.md +8 -0
  286. package/tests/utils/copy-public.acc.spec.ts +52 -0
  287. package/tests/utils/copy-public.spec.ts +56 -0
  288. package/tests/utils/diagnostic-utils.spec.ts +24 -15
  289. package/tests/utils/engine-watch-events.acc.spec.ts +59 -0
  290. package/tests/utils/engine-watch-events.spec.ts +58 -0
  291. package/tests/utils/esbuild-client-config-integration.verify.md +9 -0
  292. package/tests/utils/esbuild-client-config.acc.spec.ts +45 -61
  293. package/tests/utils/esbuild-client-config.spec.ts +70 -52
  294. package/tests/utils/ngtsc-build-core-write-emit.spec.ts +136 -12
  295. package/tests/utils/ngtsc-build-core.spec.ts +1 -44
  296. package/tests/utils/output-utils.spec.ts +133 -13
  297. package/tests/utils/replace-deps-watch.acc.spec.ts +7 -1
  298. package/tests/utils/replace-deps-watch.spec.ts +57 -1
  299. package/tests/utils/worker-utils.spec.ts +8 -2
  300. package/tests/workers/client-worker-initial-build-error.verify.md +2 -3
  301. package/tests/workers/client-worker-initial-build-warnings.verify.md +7 -0
  302. package/tests/workers/client-worker-mtime-incremental.verify.md +10 -0
  303. package/tests/workers/client-worker-refactor.verify.md +22 -0
  304. package/tests/workers/client-worker-ts-cache-invalidation.verify.md +12 -0
  305. package/tests/workers/client-worker.acc.spec.ts +6 -3
  306. package/tests/workers/incremental-mtime-tracker.acc.spec.ts +144 -0
  307. package/tests/workers/incremental-mtime-tracker.spec.ts +102 -0
  308. package/tests/workers/library-build-lint.spec.ts +40 -45
  309. package/tests/workers/library-build-worker.spec.ts +298 -40
  310. package/tests/workers/server-build-lint.spec.ts +59 -45
  311. package/tests/workers/server-build-worker.spec.ts +63 -24
  312. package/tests/workers/server-esbuild-context.acc.spec.ts +2 -0
  313. package/tests/workers/server-esbuild-context.spec.ts +2 -0
  314. package/tests/workers/server-runtime-worker.spec.ts +1 -1
  315. package/tests/workers/shared-worker-lifecycle.acc.spec.ts +1 -1
  316. package/dist/angular/angular-build-pipeline.d.ts +0 -97
  317. package/dist/angular/angular-build-pipeline.d.ts.map +0 -1
  318. package/dist/angular/angular-build-pipeline.js +0 -285
  319. package/dist/angular/angular-build-pipeline.js.map +0 -1
  320. package/dist/utils/tsc-build.d.ts +0 -51
  321. package/dist/utils/tsc-build.d.ts.map +0 -1
  322. package/dist/utils/tsc-build.js +0 -156
  323. package/dist/utils/tsc-build.js.map +0 -1
  324. package/dist/workers/ngtsc-build.worker.d.ts +0 -23
  325. package/dist/workers/ngtsc-build.worker.d.ts.map +0 -1
  326. package/dist/workers/ngtsc-build.worker.js +0 -267
  327. package/dist/workers/ngtsc-build.worker.js.map +0 -1
  328. package/src/angular/angular-build-pipeline.ts +0 -406
  329. package/src/utils/tsc-build.ts +0 -226
  330. package/src/workers/ngtsc-build.worker.ts +0 -351
  331. package/tests/angular/angular-build-pipeline.spec.ts +0 -247
  332. package/tests/angular/angular-compiler-aot.acc.spec.ts +0 -68
  333. package/tests/angular/angular-compiler-aot.spec.ts +0 -80
  334. package/tests/utils/angular-compiler-emit.spec.ts +0 -666
  335. package/tests/utils/angular-compiler.spec.ts +0 -707
  336. package/tests/utils/tsc-build.spec.ts +0 -527
  337. package/tests/workers/ngtsc-build-lint.spec.ts +0 -141
  338. package/tests/workers/ngtsc-build-worker.spec.ts +0 -199
@@ -50,29 +50,38 @@ describe("isWorkspaceDiagnostic", () => {
50
50
  });
51
51
 
52
52
  describe("formatDiagnosticError", () => {
53
- it("formats diagnostic with file info", () => {
54
- const diag = {
55
- file: {
56
- fileName: "/workspace/src/index.ts",
57
- getLineAndCharacterOfPosition: () => ({ line: 5, character: 10 }),
58
- },
59
- start: 100,
53
+ it("파일 정보가 있는 diagnostic 컬러+코드 컨텍스트로 포맷한다", () => {
54
+ const sourceFile = ts.createSourceFile(
55
+ "/workspace/src/index.ts",
56
+ "const x = 1;\nconst y: string = 123;\n",
57
+ ts.ScriptTarget.Latest,
58
+ );
59
+ const diag: ts.Diagnostic = {
60
+ file: sourceFile,
61
+ start: 27,
62
+ length: 3,
63
+ category: ts.DiagnosticCategory.Error,
60
64
  code: 2345,
61
65
  messageText: "Type error",
62
66
  };
63
- const result = formatDiagnosticError(diag as any);
64
- expect(result).toBe("/workspace/src/index.ts:6:11: TS2345: Type error");
67
+ const result = formatDiagnosticError(diag, "/workspace");
68
+ expect(result).toContain("TS2345");
69
+ expect(result).toContain("Type error");
70
+ expect(result).toContain("index.ts");
65
71
  });
66
72
 
67
- it("formats diagnostic without file info", () => {
68
- const diag = {
69
- file: null,
70
- start: null,
73
+ it("파일 정보가 없는 diagnostic을 포맷한다", () => {
74
+ const diag: ts.Diagnostic = {
75
+ file: undefined,
76
+ start: undefined,
77
+ length: undefined,
78
+ category: ts.DiagnosticCategory.Error,
71
79
  code: 1001,
72
80
  messageText: "Global error",
73
81
  };
74
- const result = formatDiagnosticError(diag as any);
75
- expect(result).toBe("TS1001: Global error");
82
+ const result = formatDiagnosticError(diag, "/workspace");
83
+ expect(result).toContain("TS1001");
84
+ expect(result).toContain("Global error");
76
85
  });
77
86
  });
78
87
 
@@ -192,6 +192,65 @@ describe("setupWatchEvents (Acceptance)", () => {
192
192
  await expect(promise).resolves.toBeUndefined();
193
193
  });
194
194
 
195
+ it("build 성공 + warnings 시 ResultCollector에 warnings가 저장된다", () => {
196
+ const worker = new MockWorker();
197
+ const resultCollector = new ResultCollector();
198
+
199
+ setupWatchEvents(worker, {
200
+ name: "test-pkg",
201
+ target: "node",
202
+ resultCollector,
203
+ normalizeBuild: (d) => d as NormalizedBuildInfo,
204
+ });
205
+
206
+ worker.emit("build", { success: true, warnings: ["warn1"] });
207
+
208
+ const result = resultCollector.get("test-pkg:build");
209
+ expect(result).toMatchObject({
210
+ status: "success",
211
+ warnings: "warn1",
212
+ });
213
+ });
214
+
215
+ it("build 성공 + warnings 없음 시 ResultCollector에 warnings가 undefined이다", () => {
216
+ const worker = new MockWorker();
217
+ const resultCollector = new ResultCollector();
218
+
219
+ setupWatchEvents(worker, {
220
+ name: "test-pkg",
221
+ target: "node",
222
+ resultCollector,
223
+ normalizeBuild: (d) => d as NormalizedBuildInfo,
224
+ });
225
+
226
+ worker.emit("build", { success: true });
227
+
228
+ const result = resultCollector.get("test-pkg:build");
229
+ expect(result?.status).toBe("success");
230
+ expect(result?.warnings).toBeUndefined();
231
+ });
232
+
233
+ it("build 실패 + warnings 시 에러와 경고 모두 저장된다", () => {
234
+ const worker = new MockWorker();
235
+ const resultCollector = new ResultCollector();
236
+
237
+ setupWatchEvents(worker, {
238
+ name: "test-pkg",
239
+ target: "node",
240
+ resultCollector,
241
+ normalizeBuild: (d) => d as NormalizedBuildInfo,
242
+ });
243
+
244
+ worker.emit("build", { success: false, errors: ["err1"], warnings: ["warn1"] });
245
+
246
+ const result = resultCollector.get("test-pkg:build");
247
+ expect(result).toMatchObject({
248
+ status: "error",
249
+ message: "err1",
250
+ warnings: "warn1",
251
+ });
252
+ });
253
+
195
254
  it("두 번째 build 이벤트에서는 waitForInitialBuild가 다시 resolve되지 않는다", async () => {
196
255
  const worker = new MockWorker();
197
256
  const resultCollector = new ResultCollector();
@@ -138,4 +138,62 @@ describe("setupWatchEvents", () => {
138
138
  expect(() => resolveInitialBuild()).not.toThrow();
139
139
  });
140
140
  });
141
+
142
+ //#region Feature 1.1 Slice 1: engine-watch-events warnings 전달
143
+
144
+ describe("warnings 전달", () => {
145
+ it("build 이벤트의 warnings를 ResultCollector에 저장한다", () => {
146
+ const worker = new MockWorker();
147
+ const resultCollector = new ResultCollector();
148
+
149
+ setupWatchEvents(worker, {
150
+ name: "client-app",
151
+ target: "client",
152
+ resultCollector,
153
+ normalizeBuild: (d) => d as { success: boolean; warnings?: string[] },
154
+ });
155
+
156
+ worker.emit("build", { success: true, warnings: ["warn1"] });
157
+
158
+ const result = resultCollector.get("client-app:build");
159
+ expect(result?.status).toBe("success");
160
+ expect(result?.warnings).toBe("warn1");
161
+ });
162
+
163
+ it("build 이벤트에 warnings가 없으면 undefined이다", () => {
164
+ const worker = new MockWorker();
165
+ const resultCollector = new ResultCollector();
166
+
167
+ setupWatchEvents(worker, {
168
+ name: "client-app",
169
+ target: "client",
170
+ resultCollector,
171
+ normalizeBuild: (d) => d as { success: boolean },
172
+ });
173
+
174
+ worker.emit("build", { success: true });
175
+
176
+ const result = resultCollector.get("client-app:build");
177
+ expect(result?.warnings).toBeUndefined();
178
+ });
179
+
180
+ it("여러 warnings를 줄바꿈으로 결합하여 저장한다", () => {
181
+ const worker = new MockWorker();
182
+ const resultCollector = new ResultCollector();
183
+
184
+ setupWatchEvents(worker, {
185
+ name: "client-app",
186
+ target: "client",
187
+ resultCollector,
188
+ normalizeBuild: (d) => d as { success: boolean; warnings?: string[] },
189
+ });
190
+
191
+ worker.emit("build", { success: true, warnings: ["warn1", "warn2"] });
192
+
193
+ const result = resultCollector.get("client-app:build");
194
+ expect(result?.warnings).toBe("warn1\nwarn2");
195
+ });
196
+ });
197
+
198
+ //#endregion
141
199
  });
@@ -0,0 +1,9 @@
1
+ # Feature 3.1 esbuild-client-config.ts 통합 — LLM 검증
2
+
3
+ ## 검증 항목
4
+
5
+ - [x] `@angular/build/private`에서 `createCompilerPlugin`, `SourceFileCache`, `CompilerPluginOptions`, `BundleStylesheetOptions` import가 없다: grep 결과 `@angular/build/private` 매치 없음
6
+ - [x] `createAngularCompilerPlugin`이 `./esbuild-angular-compiler-plugin.js`에서 import되어 있다: line 10에서 import, line 119에서 호출 확인
7
+ - [x] `ClientSourceFileCache`가 `AngularSourceFileCache`를 확장하고 `typeScriptFileCache`, `loadResultCache` 프로퍼티를 가진다: line 46-49에서 `extends AngularSourceFileCache` + 두 프로퍼티 확인
8
+ - [x] `ClientEsbuildResult.sourceFileCache` 타입이 `ClientSourceFileCache`이다: line 53 확인
9
+ - [x] `client.worker.ts`의 `sourceFileCache.loadResultCache.watchFiles`, `sourceFileCache.typeScriptFileCache.keys()`, `sourceFileCache.invalidate()` 접근이 새 구조와 타입 호환된다: typecheck 0 에러로 타입 호환성 확인됨
@@ -15,23 +15,17 @@ vi.mock("esbuild", () => ({
15
15
  },
16
16
  }));
17
17
 
18
- const mockSourceFileCache = {
19
- loadResultCache: { name: "mockLoadResultCache" },
20
- invalidate: vi.fn(),
21
- modifiedFiles: new Set<string>(),
22
- };
18
+ const mockAngularPlugin = { name: "sd-angular-compiler" };
23
19
 
24
- const mockAngularPlugin = { name: "angular-compiler" };
20
+ vi.mock("../../src/esbuild/esbuild-angular-compiler-plugin", () => ({
21
+ createAngularCompilerPlugin: vi.fn(() => mockAngularPlugin),
22
+ }));
25
23
 
26
- vi.mock("@angular/build/private", () => {
27
- function MockSourceFileCache() {
28
- return mockSourceFileCache;
29
- }
30
- return {
31
- createCompilerPlugin: vi.fn(() => mockAngularPlugin),
32
- SourceFileCache: vi.fn(MockSourceFileCache),
33
- };
34
- });
24
+ const mockTransformStylesheet = vi.fn();
25
+
26
+ vi.mock("../../src/angular/client-transform-stylesheet", () => ({
27
+ createClientTransformStylesheet: vi.fn(() => mockTransformStylesheet),
28
+ }));
35
29
 
36
30
  vi.mock("browserslist-to-esbuild", () => ({
37
31
  default: vi.fn(() => ["chrome61"]),
@@ -52,11 +46,16 @@ vi.mock("module", async (importOriginal) => {
52
46
 
53
47
  // --- Imports (after mocks) ---
54
48
 
55
- const { createClientEsbuildContext } = await import(
49
+ const { createClientEsbuildContext, ClientSourceFileCache } = await import(
56
50
  "../../src/esbuild/esbuild-client-config"
57
51
  );
58
52
  const esbuild = (await import("esbuild")).default;
59
- const { createCompilerPlugin, SourceFileCache } = await import("@angular/build/private");
53
+ const { createAngularCompilerPlugin } = await import(
54
+ "../../src/esbuild/esbuild-angular-compiler-plugin"
55
+ );
56
+ const { createClientTransformStylesheet } = await import(
57
+ "../../src/angular/client-transform-stylesheet"
58
+ );
60
59
  const browserslistToEsbuild = (await import("browserslist-to-esbuild")).default;
61
60
 
62
61
  describe("createClientEsbuildContext — Acceptance", () => {
@@ -65,10 +64,10 @@ describe("createClientEsbuildContext — Acceptance", () => {
65
64
  });
66
65
 
67
66
  // Scenario: Angular main.ts를 ESM 번들로 빌드
68
- // + CompilerPluginOptions와 BundleStylesheetOptions로 플러그인 생성
69
- // + SourceFileCacheLMDB 기반 증분 캐시
67
+ // + AngularCompilerPluginOptions로 플러그인 생성
68
+ // + ClientSourceFileCache로 증분 캐시
70
69
  // + dev 모드 Angular 플래그 + 소스맵
71
- it("dev 모드: ESM 번들 설정, Angular 플래그, 소스맵, SourceFileCache로 esbuild context 생성", async () => {
70
+ it("dev 모드: ESM 번들 설정, Angular 플래그, 소스맵, ClientSourceFileCache로 esbuild context 생성", async () => {
72
71
  const result = await createClientEsbuildContext({
73
72
  pkgDir: "/workspace/packages/my-app",
74
73
  cwd: "/workspace",
@@ -102,16 +101,14 @@ describe("createClientEsbuildContext — Acceptance", () => {
102
101
  expect(esbuildOptions.define!["ngDevMode"]).toBeUndefined();
103
102
  expect(esbuildOptions.define!["ngHmrMode"]).toBeUndefined();
104
103
 
105
- // SourceFileCache 생성
106
- expect(SourceFileCache).toHaveBeenCalledWith(
107
- path.join("/workspace/packages/my-app", ".angular", "cache"),
108
- );
104
+ // ClientSourceFileCache 인스턴스
105
+ expect(result.sourceFileCache).toBeInstanceOf(ClientSourceFileCache);
109
106
 
110
- // createCompilerPlugin 호출 검증
111
- expect(createCompilerPlugin).toHaveBeenCalledOnce();
112
- const [pluginOpts, styleOpts] = vi.mocked(createCompilerPlugin).mock.calls[0];
107
+ // createAngularCompilerPlugin 호출 검증
108
+ expect(createAngularCompilerPlugin).toHaveBeenCalledOnce();
109
+ const pluginOpts = vi.mocked(createAngularCompilerPlugin).mock.calls[0][0];
113
110
 
114
- // CompilerPluginOptions
111
+ // AngularCompilerPluginOptions
115
112
  expect(pluginOpts.tsconfig).toBe(
116
113
  path.join("/workspace/packages/my-app", "tsconfig.json"),
117
114
  );
@@ -119,20 +116,20 @@ describe("createClientEsbuildContext — Acceptance", () => {
119
116
  expect(pluginOpts.advancedOptimizations).toBe(false);
120
117
  expect(pluginOpts.thirdPartySourcemaps).toBe(true);
121
118
  expect(pluginOpts.incremental).toBe(true);
122
- expect(pluginOpts.sourceFileCache).toBe(mockSourceFileCache);
123
- expect(pluginOpts.loadResultCache).toBe(mockSourceFileCache.loadResultCache);
119
+ expect(pluginOpts.sourceFileCache).toBe(result.sourceFileCache);
120
+ expect(pluginOpts.typeScriptFileCache).toBe(result.sourceFileCache.typeScriptFileCache);
121
+ expect(pluginOpts.loadResultCache).toBe(result.sourceFileCache.loadResultCache);
124
122
  expect(pluginOpts.includeTestMetadata).toBe(true);
123
+ expect(pluginOpts.persistentCachePath).toBe(
124
+ path.join("/workspace/packages/my-app", ".angular", "cache"),
125
+ );
125
126
 
126
- // BundleStylesheetOptions
127
- expect(styleOpts.workspaceRoot).toBe("/workspace");
128
- expect(styleOpts.optimization).toBe(false);
129
- expect(styleOpts.sourcemap).toBe("linked");
130
- expect(styleOpts.inlineStyleLanguage).toBe("scss");
131
- expect(styleOpts.cacheOptions.enabled).toBe(true);
127
+ // transformStylesheet 콜백 전달
128
+ expect(pluginOpts.transformStylesheet).toBe(mockTransformStylesheet);
129
+ expect(createClientTransformStylesheet).toHaveBeenCalledOnce();
132
130
 
133
131
  // 반환값
134
132
  expect(result.context).toBe(mockContext);
135
- expect(result.sourceFileCache).toBe(mockSourceFileCache);
136
133
 
137
134
  // angularPlugin이 plugins에 포함됨
138
135
  expect(esbuildOptions.plugins).toContainEqual(mockAngularPlugin);
@@ -169,18 +166,13 @@ describe("createClientEsbuildContext — Acceptance", () => {
169
166
  expect(esbuildOptions.define!["ngJitMode"]).toBe("false");
170
167
  expect(esbuildOptions.define!["ngHmrMode"]).toBe("false");
171
168
 
172
- // CompilerPluginOptions
173
- const [pluginOpts, styleOpts] = vi.mocked(createCompilerPlugin).mock.calls[0];
169
+ // AngularCompilerPluginOptions
170
+ const pluginOpts = vi.mocked(createAngularCompilerPlugin).mock.calls[0][0];
174
171
  expect(pluginOpts.sourcemap).toBe(false);
175
172
  expect(pluginOpts.advancedOptimizations).toBe(true);
176
173
  expect(pluginOpts.thirdPartySourcemaps).toBe(false);
177
174
  expect(pluginOpts.incremental).toBe(false);
178
175
  expect(pluginOpts.includeTestMetadata).toBe(false);
179
- expect((pluginOpts as unknown as Record<string, unknown>)["browserOnlyBuild"]).toBeUndefined();
180
-
181
- // BundleStylesheetOptions
182
- expect(styleOpts.optimization).toBe(true);
183
- expect(styleOpts.sourcemap).toBe(false);
184
176
  });
185
177
 
186
178
  // Scenario: 커스텀 env 주입
@@ -198,8 +190,8 @@ describe("createClientEsbuildContext — Acceptance", () => {
198
190
  );
199
191
  });
200
192
 
201
- // Scenario: PostCSS 설정 — postcssConfiguration 비활성화 + sd-postcss 등록
202
- it("postcssPlugins 전달 시 postcssConfiguration은 undefined이고 sd-postcss 플러그인이 등록된다", async () => {
193
+ // Scenario: PostCSS 설정 — sd-postcss 등록 + transformStylesheet에 postcssPlugins 전달
194
+ it("postcssPlugins 전달 시 sd-postcss 플러그인이 등록되고 transformStylesheet에도 전달된다", async () => {
203
195
  await createClientEsbuildContext({
204
196
  pkgDir: "/workspace/packages/my-app",
205
197
  cwd: "/workspace",
@@ -207,12 +199,13 @@ describe("createClientEsbuildContext — Acceptance", () => {
207
199
  postcssPlugins: [["autoprefixer", {}]],
208
200
  });
209
201
 
210
- const [, styleOpts] = vi.mocked(createCompilerPlugin).mock.calls[0];
211
- expect(styleOpts.postcssConfiguration).toBeUndefined();
212
-
213
202
  const esbuildOptions = vi.mocked(esbuild.context).mock.calls[0][0];
214
203
  const pluginNames = esbuildOptions.plugins!.map((p: any) => p.name);
215
204
  expect(pluginNames).toContain("sd-postcss");
205
+
206
+ const transformOpts = vi.mocked(createClientTransformStylesheet).mock.calls[0][0];
207
+ expect(transformOpts.postcssPlugins).toBeDefined();
208
+ expect(transformOpts.postcssPlugins).toHaveLength(1);
216
209
  });
217
210
 
218
211
  // Scenario: 프로덕션 일회성 빌드
@@ -306,7 +299,7 @@ describe("createClientEsbuildContext — Acceptance", () => {
306
299
  });
307
300
 
308
301
  // Scenario: browserslist 미설정 시 기본 target "es2022"
309
- it("browserslist 미설정 시 esbuild target과 BundleStylesheetOptions.target이 [es2022]", async () => {
302
+ it("browserslist 미설정 시 esbuild target이 [es2022]", async () => {
310
303
  await createClientEsbuildContext({
311
304
  pkgDir: "/workspace/packages/my-app",
312
305
  cwd: "/workspace",
@@ -315,9 +308,6 @@ describe("createClientEsbuildContext — Acceptance", () => {
315
308
 
316
309
  const esbuildOptions = vi.mocked(esbuild.context).mock.calls[0][0];
317
310
  expect(esbuildOptions.target).toEqual(["es2022"]);
318
-
319
- const [, styleOpts] = vi.mocked(createCompilerPlugin).mock.calls[0];
320
- expect(styleOpts.target).toEqual(["es2022"]);
321
311
  });
322
312
 
323
313
  // Scenario: browserslist 문자열 설정 시 변환
@@ -335,9 +325,6 @@ describe("createClientEsbuildContext — Acceptance", () => {
335
325
 
336
326
  const esbuildOptions = vi.mocked(esbuild.context).mock.calls[0][0];
337
327
  expect(esbuildOptions.target).toEqual(["chrome61"]);
338
-
339
- const [, styleOpts] = vi.mocked(createCompilerPlugin).mock.calls[0];
340
- expect(styleOpts.target).toEqual(["chrome61"]);
341
328
  });
342
329
 
343
330
  // Scenario: polyfills 경로 전달 시 entryPoints에 추가
@@ -413,9 +400,6 @@ describe("createClientEsbuildContext — Acceptance", () => {
413
400
 
414
401
  const esbuildOptions = vi.mocked(esbuild.context).mock.calls[0][0];
415
402
  expect(esbuildOptions.target).toEqual(["chrome61", "firefox60"]);
416
-
417
- const [, styleOpts] = vi.mocked(createCompilerPlugin).mock.calls[0];
418
- expect(styleOpts.target).toEqual(["chrome61", "firefox60"]);
419
403
  });
420
404
 
421
405
  // Scenario: esbuild context에 tsconfig 옵션이 전달된다
@@ -447,12 +431,12 @@ describe("createClientEsbuildContext — Acceptance", () => {
447
431
  const pluginNames = esbuildOptions.plugins!.map((p: any) => p.name);
448
432
 
449
433
  expect(pluginNames).toContain("custom");
450
- expect(pluginNames).toContain("angular-compiler");
434
+ expect(pluginNames).toContain("sd-angular-compiler");
451
435
  expect(pluginNames).toContain("sd-scss");
452
436
  expect(pluginNames[pluginNames.length - 1]).toBe("sd-on-end");
453
437
 
454
438
  const customIdx = pluginNames.indexOf("custom");
455
- const angularIdx = pluginNames.indexOf("angular-compiler");
439
+ const angularIdx = pluginNames.indexOf("sd-angular-compiler");
456
440
  const scssIdx = pluginNames.indexOf("sd-scss");
457
441
  expect(customIdx).toBeLessThan(angularIdx);
458
442
  expect(angularIdx).toBeLessThan(scssIdx);
@@ -16,24 +16,17 @@ vi.mock("esbuild", () => ({
16
16
  },
17
17
  }));
18
18
 
19
- const mockSourceFileCache = {
20
- loadResultCache: { name: "mockLoadResultCache" },
21
- invalidate: vi.fn(),
22
- modifiedFiles: new Set<string>(),
23
- };
19
+ const mockAngularPlugin = { name: "sd-angular-compiler" };
24
20
 
25
- const mockAngularPlugin = { name: "angular-compiler" };
21
+ vi.mock("../../src/esbuild/esbuild-angular-compiler-plugin", () => ({
22
+ createAngularCompilerPlugin: vi.fn(() => mockAngularPlugin),
23
+ }));
26
24
 
27
- vi.mock("@angular/build/private", () => {
28
- // vi.fn()의 arrow function은 new로 호출 불가 — 일반 function 사용
29
- function MockSourceFileCache() {
30
- return mockSourceFileCache;
31
- }
32
- return {
33
- createCompilerPlugin: vi.fn(() => mockAngularPlugin),
34
- SourceFileCache: vi.fn(MockSourceFileCache),
35
- };
36
- });
25
+ const mockTransformStylesheet = vi.fn();
26
+
27
+ vi.mock("../../src/angular/client-transform-stylesheet", () => ({
28
+ createClientTransformStylesheet: vi.fn(() => mockTransformStylesheet),
29
+ }));
37
30
 
38
31
  vi.mock("browserslist-to-esbuild", () => ({
39
32
  default: vi.fn(() => ["chrome61"]),
@@ -54,11 +47,16 @@ vi.mock("module", async (importOriginal) => {
54
47
 
55
48
  // --- Imports (after mocks) ---
56
49
 
57
- const { createClientEsbuildContext } = await import(
50
+ const { createClientEsbuildContext, ClientSourceFileCache } = await import(
58
51
  "../../src/esbuild/esbuild-client-config"
59
52
  );
60
53
  const esbuild = (await import("esbuild")).default;
61
- const { createCompilerPlugin, SourceFileCache } = await import("@angular/build/private");
54
+ const { createAngularCompilerPlugin } = await import(
55
+ "../../src/esbuild/esbuild-angular-compiler-plugin"
56
+ );
57
+ const { createClientTransformStylesheet } = await import(
58
+ "../../src/angular/client-transform-stylesheet"
59
+ );
62
60
  const browserslistToEsbuild = (await import("browserslist-to-esbuild")).default;
63
61
 
64
62
  // --- Helpers ---
@@ -140,43 +138,55 @@ describe("createClientEsbuildContext — define 생성", () => {
140
138
  describe("createClientEsbuildContext — 소스맵 설정", () => {
141
139
  beforeEach(() => vi.clearAllMocks());
142
140
 
143
- it("dev 모드: esbuild sourcemap=linked, CompilerPlugin sourcemap=true, StyleOptions sourcemap=linked", async () => {
141
+ it("dev 모드: esbuild sourcemap=linked, AngularCompilerPlugin sourcemap=true", async () => {
144
142
  await createClientEsbuildContext(baseDev);
145
143
  const opts = vi.mocked(esbuild.context).mock.calls[0][0];
146
144
  expect(opts.sourcemap).toBe("linked");
147
145
 
148
- const [pluginOpts, styleOpts] = vi.mocked(createCompilerPlugin).mock.calls[0];
146
+ const pluginOpts = vi.mocked(createAngularCompilerPlugin).mock.calls[0][0];
149
147
  expect(pluginOpts.sourcemap).toBe(true);
150
- expect(styleOpts.sourcemap).toBe("linked");
151
148
  });
152
149
 
153
- it("build 모드: esbuild sourcemap=false, CompilerPlugin sourcemap=false, StyleOptions sourcemap=false", async () => {
150
+ it("build 모드: esbuild sourcemap=false, AngularCompilerPlugin sourcemap=false", async () => {
154
151
  await createClientEsbuildContext(baseBuild);
155
152
  const opts = vi.mocked(esbuild.context).mock.calls[0][0];
156
153
  expect(opts.sourcemap).toBe(false);
157
154
 
158
- const [pluginOpts, styleOpts] = vi.mocked(createCompilerPlugin).mock.calls[0];
155
+ const pluginOpts = vi.mocked(createAngularCompilerPlugin).mock.calls[0][0];
159
156
  expect(pluginOpts.sourcemap).toBe(false);
160
- expect(styleOpts.sourcemap).toBe(false);
161
157
  });
162
158
  });
163
159
 
164
- describe("createClientEsbuildContext — PostCSS 설정", () => {
160
+ describe("createClientEsbuildContext — transformStylesheet 설정", () => {
165
161
  beforeEach(() => vi.clearAllMocks());
166
162
 
167
- it("postcssPlugins 미전달 postcssConfiguration이 undefined", async () => {
163
+ it("transformStylesheet 콜백이 createAngularCompilerPlugin에 전달된다", async () => {
164
+ await createClientEsbuildContext(baseBuild);
165
+ const pluginOpts = vi.mocked(createAngularCompilerPlugin).mock.calls[0][0];
166
+ expect(pluginOpts.transformStylesheet).toBe(mockTransformStylesheet);
167
+ });
168
+
169
+ it("stylesheetDependencies와 stylesheetErrors가 createAngularCompilerPlugin에 전달된다", async () => {
168
170
  await createClientEsbuildContext(baseBuild);
169
- const [, styleOpts] = vi.mocked(createCompilerPlugin).mock.calls[0];
170
- expect(styleOpts.postcssConfiguration).toBeUndefined();
171
+ const pluginOpts = vi.mocked(createAngularCompilerPlugin).mock.calls[0][0];
172
+ expect(pluginOpts.stylesheetDependencies).toBeInstanceOf(Map);
173
+ expect(pluginOpts.stylesheetErrors).toBeInstanceOf(Array);
171
174
  });
172
175
 
173
- it("postcssPlugins 전달해도 postcssConfiguration은 항상 undefined", async () => {
176
+ it("postcssPlugins createClientTransformStylesheet에 전달된다", async () => {
174
177
  await createClientEsbuildContext({
175
178
  ...baseBuild,
176
179
  postcssPlugins: [["autoprefixer"]],
177
180
  });
178
- const [, styleOpts] = vi.mocked(createCompilerPlugin).mock.calls[0];
179
- expect(styleOpts.postcssConfiguration).toBeUndefined();
181
+ const transformOpts = vi.mocked(createClientTransformStylesheet).mock.calls[0][0];
182
+ expect(transformOpts.postcssPlugins).toBeDefined();
183
+ expect(transformOpts.postcssPlugins).toHaveLength(1);
184
+ });
185
+
186
+ it("postcssPlugins 미전달 시 createClientTransformStylesheet에 postcssPlugins가 undefined", async () => {
187
+ await createClientEsbuildContext(baseBuild);
188
+ const transformOpts = vi.mocked(createClientTransformStylesheet).mock.calls[0][0];
189
+ expect(transformOpts.postcssPlugins).toBeUndefined();
180
190
  });
181
191
  });
182
192
 
@@ -232,21 +242,28 @@ describe("createClientEsbuildContext — PostCSS 플러그인 통합", () => {
232
242
  });
233
243
  });
234
244
 
235
- describe("createClientEsbuildContext — SourceFileCache", () => {
245
+ describe("createClientEsbuildContext — ClientSourceFileCache", () => {
236
246
  beforeEach(() => vi.clearAllMocks());
237
247
 
238
- it("SourceFileCache.angular/cache 경로로 생성됨", async () => {
239
- await createClientEsbuildContext(baseDev);
240
- expect(SourceFileCache).toHaveBeenCalledWith(
241
- path.join("/workspace/packages/my-app", ".angular", "cache"),
242
- );
248
+ it("반환된 sourceFileCacheClientSourceFileCache 인스턴스", async () => {
249
+ const result = await createClientEsbuildContext(baseDev);
250
+ expect(result.sourceFileCache).toBeInstanceOf(ClientSourceFileCache);
251
+ });
252
+
253
+ it("sourceFileCache의 typeScriptFileCache와 loadResultCache가 AngularCompilerPlugin에 전달됨", async () => {
254
+ const result = await createClientEsbuildContext(baseDev);
255
+ const pluginOpts = vi.mocked(createAngularCompilerPlugin).mock.calls[0][0];
256
+ expect(pluginOpts.sourceFileCache).toBe(result.sourceFileCache);
257
+ expect(pluginOpts.typeScriptFileCache).toBe(result.sourceFileCache.typeScriptFileCache);
258
+ expect(pluginOpts.loadResultCache).toBe(result.sourceFileCache.loadResultCache);
243
259
  });
244
260
 
245
- it("sourceFileCache와 loadResultCacheCompilerPluginOptions에 전달됨", async () => {
261
+ it("persistentCachePath.angular/cache 경로로 전달됨", async () => {
246
262
  await createClientEsbuildContext(baseDev);
247
- const [pluginOpts] = vi.mocked(createCompilerPlugin).mock.calls[0];
248
- expect(pluginOpts.sourceFileCache).toBe(mockSourceFileCache);
249
- expect(pluginOpts.loadResultCache).toBe(mockSourceFileCache.loadResultCache);
263
+ const pluginOpts = vi.mocked(createAngularCompilerPlugin).mock.calls[0][0];
264
+ expect(pluginOpts.persistentCachePath).toBe(
265
+ path.join("/workspace/packages/my-app", ".angular", "cache"),
266
+ );
250
267
  });
251
268
  });
252
269
 
@@ -258,7 +275,7 @@ describe("createClientEsbuildContext — 추가 옵션", () => {
258
275
  ...baseDev,
259
276
  tsconfig: "/workspace/packages/my-app/tsconfig.build.json",
260
277
  });
261
- const [pluginOpts] = vi.mocked(createCompilerPlugin).mock.calls[0];
278
+ const pluginOpts = vi.mocked(createAngularCompilerPlugin).mock.calls[0][0];
262
279
  expect(pluginOpts.tsconfig).toBe(
263
280
  "/workspace/packages/my-app/tsconfig.build.json",
264
281
  );
@@ -283,13 +300,13 @@ describe("createClientEsbuildContext — 추가 옵션", () => {
283
300
  expect(opts.plugins).toContainEqual(customPlugin);
284
301
  });
285
302
 
286
- it("templateUpdates가 CompilerPluginOptions에 전달됨", async () => {
303
+ it("templateUpdates가 AngularCompilerPluginOptions에 전달됨", async () => {
287
304
  const updates = new Map([["comp1", "template1"]]);
288
305
  await createClientEsbuildContext({
289
306
  ...baseDev,
290
307
  templateUpdates: updates,
291
308
  });
292
- const [pluginOpts] = vi.mocked(createCompilerPlugin).mock.calls[0];
309
+ const pluginOpts = vi.mocked(createAngularCompilerPlugin).mock.calls[0][0];
293
310
  expect(pluginOpts.templateUpdates).toBe(updates);
294
311
  });
295
312
  });
@@ -303,10 +320,13 @@ describe("createClientEsbuildContext — browserslist → target 변환", () =>
303
320
  expect(opts.target).toEqual(["es2022"]);
304
321
  });
305
322
 
306
- it("browserslist 미설정 시 BundleStylesheetOptions.target이 [es2022]", async () => {
323
+ it("browserslist 미설정 시 createClientTransformStylesheet의 loadPaths가 설정됨", async () => {
307
324
  await createClientEsbuildContext(baseDev);
308
- const [, styleOpts] = vi.mocked(createCompilerPlugin).mock.calls[0];
309
- expect(styleOpts.target).toEqual(["es2022"]);
325
+ const transformOpts = vi.mocked(createClientTransformStylesheet).mock.calls[0][0];
326
+ expect(transformOpts.loadPaths).toEqual([
327
+ path.join("/workspace/packages/my-app", "node_modules"),
328
+ path.join("/workspace", "node_modules"),
329
+ ]);
310
330
  });
311
331
 
312
332
  it("browserslist 문자열은 배열로 변환하여 browserslistToEsbuild에 전달", async () => {
@@ -324,16 +344,14 @@ describe("createClientEsbuildContext — browserslist → target 변환", () =>
324
344
  expect(browserslistToEsbuild).toHaveBeenCalledWith(["Chrome 61", "Firefox 60"]);
325
345
  });
326
346
 
327
- it("browserslistToEsbuild 결과가 esbuild target과 styleOptions.target동일하게 적용", async () => {
347
+ it("browserslistToEsbuild 결과가 esbuild target에 적용", async () => {
328
348
  vi.mocked(browserslistToEsbuild).mockReturnValueOnce(["chrome61", "firefox60"]);
329
349
  await createClientEsbuildContext({
330
350
  ...baseDev,
331
351
  browserslist: ["Chrome 61", "Firefox 60"],
332
352
  });
333
353
  const opts = vi.mocked(esbuild.context).mock.calls[0][0];
334
- const [, styleOpts] = vi.mocked(createCompilerPlugin).mock.calls[0];
335
354
  expect(opts.target).toEqual(["chrome61", "firefox60"]);
336
- expect(styleOpts.target).toEqual(["chrome61", "firefox60"]);
337
355
  });
338
356
  });
339
357
 
@@ -448,7 +466,7 @@ describe("createClientEsbuildContext — onEnd 플러그인", () => {
448
466
  const opts = vi.mocked(esbuild.context).mock.calls[0][0];
449
467
  const pluginNames = opts.plugins!.map((p: any) => p.name);
450
468
  const customIdx = pluginNames.indexOf("custom");
451
- const angularIdx = pluginNames.indexOf("angular-compiler");
469
+ const angularIdx = pluginNames.indexOf("sd-angular-compiler");
452
470
  expect(customIdx).toBeLessThan(angularIdx);
453
471
  });
454
472
  });
@@ -493,7 +511,7 @@ describe("createClientEsbuildContext — SCSS 플러그인 통합", () => {
493
511
  const opts = vi.mocked(esbuild.context).mock.calls[0][0];
494
512
  const pluginNames = opts.plugins!.map((p: any) => p.name);
495
513
 
496
- const angularIdx = pluginNames.indexOf("angular-compiler");
514
+ const angularIdx = pluginNames.indexOf("sd-angular-compiler");
497
515
  const scssIdx = pluginNames.indexOf("sd-scss");
498
516
 
499
517
  expect(scssIdx).toBe(angularIdx + 1);