@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
@@ -2,6 +2,8 @@ import { consola } from "consola";
2
2
  import { loadSdConfig } from "../utils/sd-config";
3
3
  import { setupReplaceDeps } from "../deps/replace-deps/replace-deps";
4
4
 
5
+ const logger = consola.withTag("sd:cli:replace-deps");
6
+
5
7
  /**
6
8
  * replace-deps 명령어 옵션
7
9
  */
@@ -19,7 +21,7 @@ export async function runReplaceDeps(opts: ReplaceDepsOptions): Promise<void> {
19
21
  const sdConfig = await loadSdConfig({ cwd, dev: false, opt: opts.options });
20
22
 
21
23
  if (sdConfig.replaceDeps == null) {
22
- consola.warn("sd.config.ts에 replaceDeps 설정이 없습니다.");
24
+ logger.warn("sd.config.ts에 replaceDeps 설정이 없습니다.");
23
25
  return;
24
26
  }
25
27
 
@@ -12,13 +12,15 @@ export interface DepsResult {
12
12
  }
13
13
 
14
14
  /**
15
- * pnpm-workspace.yaml 기반으로 workspace 패키지의 name → 상대 디렉토리 맵을 구성한다.
15
+ * 워크스페이스 디렉토리(packages/, tests/) 스캔 기반으로 packages/ 패키지의 name → 상대 디렉토리 맵을 구성한다.
16
+ * tests/ 패키지는 제외된다.
16
17
  * 예: "@simplysm/core-node" → "packages/core-node"
17
18
  */
18
19
  function buildWorkspacePkgMap(cwd: string): Map<string, string> {
19
20
  const map = new Map<string, string>();
20
21
  const wsPkgs = discoverWorkspacePackages(cwd);
21
22
  for (const [, relDir] of wsPkgs) {
23
+ if (relDir.startsWith("tests/")) continue;
22
24
  const pkgJsonPath = pathx.posix(path.join(cwd, relDir, "package.json"));
23
25
  if (!fs.existsSync(pkgJsonPath)) continue;
24
26
  const pkgJson = JSON.parse(fs.readFileSync(pkgJsonPath, "utf-8")) as { name: string };
@@ -35,7 +37,7 @@ export function collectDeps(
35
37
  const startTime = performance.now();
36
38
  logger.debug("의존성 수집 시작");
37
39
 
38
- // pnpm-workspace.yaml에서 workspace 패키지 디렉토리 패턴을 읽어 실제 패키지 맵 구성
40
+ // 워크스페이스 디렉토리 스캔으로 packages/ 패키지 맵 구성 (tests/ 제외)
39
41
  const workspacePkgMap = buildWorkspacePkgMap(cwd);
40
42
 
41
43
  const replaceDepsPatterns: Array<{ regex: RegExp }> = [];
@@ -140,6 +140,7 @@ export async function resolveAllReplaceDepEntries(
140
140
  logger: ReturnType<typeof consola.withTag>,
141
141
  ): Promise<ReplaceDepEntry[]> {
142
142
  const entries: ReplaceDepEntry[] = [];
143
+ const seenTargetPaths = new Set<string>();
143
144
  const searchedDirs = new Set<string>();
144
145
 
145
146
  // 초기 탐색 대상: 프로젝트 루트 + workspace 패키지들의 node_modules
@@ -162,12 +163,15 @@ export async function resolveAllReplaceDepEntries(
162
163
  continue;
163
164
  }
164
165
 
165
- // replaceDeps의 각 glob 패턴으로 node_modules 디렉토리 탐색
166
- const targetNames: string[] = [];
167
- for (const pattern of Object.keys(replaceDeps)) {
168
- const matches = await glob(pattern, { cwd: nodeModulesDir });
169
- targetNames.push(...matches.map((m) => m.replaceAll("\\", "/")));
170
- }
166
+ // replaceDeps의 각 glob 패턴으로 node_modules 디렉토리 탐색 (병렬)
167
+ const globResults = await Promise.all(
168
+ Object.keys(replaceDeps).map((pattern) =>
169
+ glob(pattern, { cwd: nodeModulesDir }),
170
+ ),
171
+ );
172
+ const targetNames = globResults.flatMap((matches) =>
173
+ matches.map((m) => m.replaceAll("\\", "/")),
174
+ );
171
175
 
172
176
  logger.debug(`[replace-deps] 탐색: ${nodeModulesDir} → ${targetNames.length}개 매칭 (${targetNames.join(", ")})`);
173
177
 
@@ -200,7 +204,8 @@ export async function resolveAllReplaceDepEntries(
200
204
  }
201
205
 
202
206
  // 동일 actualTargetPath가 이미 등록된 경우 건너뜀 (pnpm 중복 방지)
203
- if (entries.some((e) => e.actualTargetPath === actualTargetPath)) continue;
207
+ if (seenTargetPaths.has(actualTargetPath)) continue;
208
+ seenTargetPaths.add(actualTargetPath);
204
209
 
205
210
  entries.push({
206
211
  targetName,
@@ -8,20 +8,106 @@ import type { ReplaceDepEntry } from "./replace-deps-resolve";
8
8
  import { resolveAllReplaceDepEntries } from "./replace-deps-resolve";
9
9
 
10
10
  /**
11
- * 복사 제외할 이름 목록
11
+ * 파일 내용이 동일한지 비교한다.
12
+ * mtime + size가 같으면 동일로 간주하고, 다르면 바이트 비교한다.
12
13
  */
13
- const EXCLUDED_NAMES = new Set(["node_modules", "package.json", ".cache", "tests"]);
14
+ async function isFileContentSame(pathA: string, pathB: string): Promise<boolean> {
15
+ try {
16
+ const [statA, statB] = await Promise.all([
17
+ fs.promises.stat(pathA),
18
+ fs.promises.stat(pathB),
19
+ ]);
20
+ if (statA.size !== statB.size) return false;
21
+ if (statA.mtimeMs === statB.mtimeMs) return true;
22
+
23
+ const [bufA, bufB] = await Promise.all([
24
+ fs.promises.readFile(pathA),
25
+ fs.promises.readFile(pathB),
26
+ ]);
27
+ return bufA.equals(bufB);
28
+ } catch {
29
+ return false;
30
+ }
31
+ }
14
32
 
15
33
  /**
16
- * replaceDeps 복사용 필터 함수
17
- * node_modules, package.json, .cache, tests제외한다.
18
- *
19
- * @param itemPath - 복사할 항목의 절대 경로
20
- * @returns 복사 대상이면 true, 제외 대상이면 false
34
+ * pnpm hard link를 끊으면서 파일/디렉토리를 복사한다.
35
+ * 대상 파일을 먼저 unlink하여 글로벌 store의 hard link끊고 새 파일을 생성한다.
36
+ * 다른 프로젝트의 node_modules에 영향을 주지 않기 위함이다.
21
37
  */
22
- function replaceDepsCopyFilter(itemPath: string): boolean {
23
- const basename = path.basename(itemPath);
24
- return !EXCLUDED_NAMES.has(basename);
38
+ async function copyWithUnlink(
39
+ sourcePath: string,
40
+ targetPath: string,
41
+ filter?: (absolutePath: string) => boolean,
42
+ ): Promise<void> {
43
+ let stats: fs.Stats;
44
+ try {
45
+ stats = await fs.promises.lstat(sourcePath);
46
+ } catch {
47
+ return;
48
+ }
49
+
50
+ if (stats.isDirectory()) {
51
+ await fsx.mkdir(targetPath);
52
+ const names = await fs.promises.readdir(sourcePath);
53
+ await Promise.all(
54
+ names
55
+ .map((name) => path.resolve(sourcePath, name))
56
+ .filter((child) => filter == null || filter(child))
57
+ .map((child) => copyWithUnlink(
58
+ child,
59
+ path.join(targetPath, path.basename(child)),
60
+ )),
61
+ );
62
+ } else {
63
+ if (await isFileContentSame(sourcePath, targetPath)) return;
64
+ await fsx.mkdir(path.dirname(targetPath));
65
+ try {
66
+ await fs.promises.unlink(targetPath);
67
+ } catch {
68
+ // 대상이 없으면 무시
69
+ }
70
+ await fs.promises.copyFile(sourcePath, targetPath);
71
+ }
72
+ }
73
+
74
+ /**
75
+ * npm publish 시 files 필드와 무관하게 항상 포함되는 파일 패턴 (대소문자 무시)
76
+ */
77
+ export const NPM_DEFAULT_FILE_PATTERN = /^(readme|license|licence|changelog|history)/i;
78
+
79
+ /**
80
+ * 소스 패키지의 package.json에서 files 필드를 읽어 반환한다.
81
+ * files 필드가 없으면 undefined를 반환한다.
82
+ */
83
+ export async function loadFilesField(sourcePath: string): Promise<string[] | undefined> {
84
+ const pkgJsonPath = pathx.posix(path.join(sourcePath, "package.json"));
85
+ const pkgJson = JSON.parse(await fs.promises.readFile(pkgJsonPath, "utf-8"));
86
+ return pkgJson.files as string[] | undefined;
87
+ }
88
+
89
+ /**
90
+ * files 필드 기반 화이트리스트 복사 필터를 생성한다.
91
+ * 소스 루트 기준 상대경로의 첫 번째 세그먼트로 판단한다.
92
+ * - files에 포함 → 허용
93
+ * - npm 기본 파일 패턴 매칭 → 허용
94
+ * - package.json → 제외
95
+ * - 그 외 → 제외
96
+ */
97
+ export function createCopyFilter(
98
+ sourcePath: string,
99
+ allowedNames: Set<string>,
100
+ ): (itemPath: string) => boolean {
101
+ return (itemPath: string) => {
102
+ const relativePath = path.relative(sourcePath, itemPath);
103
+ const firstSegment = relativePath.split(path.sep)[0];
104
+
105
+ if (firstSegment === "package.json") return false;
106
+ if (allowedNames.has(firstSegment)) return true;
107
+ if (NPM_DEFAULT_FILE_PATTERN.test(firstSegment)) return true;
108
+
109
+ return false;
110
+ };
25
111
  }
26
112
 
27
113
  /**
@@ -37,7 +123,7 @@ export interface WatchReplaceDepResult {
37
123
  *
38
124
  * 1. pnpm-workspace.yaml 파싱 → 워크스페이스 패키지 경로
39
125
  * 2. [루트, ...워크스페이스 패키지] node_modules에서 매칭 패키지 탐색
40
- * 3. 기존 symlink/디렉토리 제거 소스 경로 복사 (node_modules, package.json, .cache, tests 제외)
126
+ * 3. 소스 package.json의 files 필드 + npm 기본 파일만 대상 경로에 복사 (package.json 제외)
41
127
  *
42
128
  * @param projectRoot - 프로젝트 루트 경로
43
129
  * @param replaceDeps - sd.config.ts의 replaceDeps 설정
@@ -47,27 +133,34 @@ export async function setupReplaceDeps(
47
133
  replaceDeps: Record<string, string>,
48
134
  ): Promise<void> {
49
135
  const logger = consola.withTag("sd:cli:replace-deps");
50
- let setupCount = 0;
51
136
 
52
137
  logger.start("replace-deps 설정 중...");
53
138
 
54
139
  const entries = await resolveAllReplaceDepEntries(projectRoot, replaceDeps, logger);
55
140
 
56
- for (const { targetName, resolvedSourcePath, actualTargetPath } of entries) {
141
+ const results = await Promise.all(entries.map(async (entry) => {
57
142
  try {
58
- // 소스 파일을 actualTargetPath에 덮어쓰기 복사 (기존 디렉토리 유지, symlink 보존)
59
- await fsx.copy(resolvedSourcePath, actualTargetPath, replaceDepsCopyFilter);
143
+ const files = await loadFilesField(entry.resolvedSourcePath);
144
+ if (files == null) {
145
+ logger.warn(`[${entry.targetName}] package.json에 files 필드가 없어 건너뜀`);
146
+ return undefined;
147
+ }
60
148
 
61
- setupCount += 1;
149
+ const filter = createCopyFilter(entry.resolvedSourcePath, new Set(files));
150
+ await copyWithUnlink(entry.resolvedSourcePath, entry.actualTargetPath, filter);
151
+ return entry;
62
152
  } catch (err) {
63
- logger.error(`[${targetName}] 복사 실패: ${err instanceof Error ? err.message : err}`);
153
+ logger.error(`[${entry.targetName}] 복사 실패: ${err instanceof Error ? err.message : err}`);
154
+ return undefined;
64
155
  }
65
- }
156
+ }));
157
+
158
+ const copiedEntries = results.filter((e): e is ReplaceDepEntry => e != null);
66
159
 
67
- logger.success(`replace-deps 설정 완료 (${setupCount}개 의존성 교체)`);
160
+ logger.success(`replace-deps 설정 완료 (${copiedEntries.length}개 의존성 교체)`);
68
161
 
69
162
  // 교체된 패키지의 postinstall 스크립트 실행
70
- for (const { targetName, resolvedSourcePath, actualTargetPath } of entries) {
163
+ for (const { targetName, resolvedSourcePath, actualTargetPath } of copiedEntries) {
71
164
  const sourcePkgJsonPath = pathx.posix(path.join(resolvedSourcePath, "package.json"));
72
165
  try {
73
166
  const pkgJson = JSON.parse(await fs.promises.readFile(sourcePkgJsonPath, "utf-8"));
@@ -91,8 +184,8 @@ export async function setupReplaceDeps(
91
184
  *
92
185
  * 1. pnpm-workspace.yaml 파싱 → 워크스페이스 패키지 경로
93
186
  * 2. [루트, ...워크스페이스 패키지] node_modules에서 매칭 패키지 탐색
94
- * 3. FsWatcher로 소스 디렉토리 감시 (300ms 딜레이)
95
- * 4. 변경사항을 대상 경로에 복사 (node_modules, package.json, .cache, tests 제외)
187
+ * 3. FsWatcher로 files 항목 경로만 감시 (300ms 딜레이)
188
+ * 4. 변경사항을 대상 경로에 복사
96
189
  *
97
190
  * @param projectRoot - 프로젝트 루트 경로
98
191
  * @param replaceDeps - sd.config.ts의 replaceDeps 설정
@@ -118,66 +211,95 @@ export async function watchReplaceDeps(
118
211
  if (watchedSources.has(entry.resolvedSourcePath)) continue;
119
212
  watchedSources.add(entry.resolvedSourcePath);
120
213
 
121
- const excludedPaths = [...EXCLUDED_NAMES].map((name) =>
122
- pathx.posix(path.join(entry.resolvedSourcePath, name)),
123
- );
214
+ try {
215
+ // 소스 패키지의 files 필드를 읽어 감시 대상 경로 구성
216
+ const files = await loadFilesField(entry.resolvedSourcePath);
217
+ if (files == null) {
218
+ logger.warn(`[${entry.targetName}] package.json에 files 필드가 없어 감시 건너뜀`);
219
+ continue;
220
+ }
221
+
222
+ // files 항목 경로 + npm 기본 파일 경로
223
+ const watchPaths = files.map((f) =>
224
+ pathx.posix(path.join(entry.resolvedSourcePath, f)),
225
+ );
124
226
 
125
- const watcher = await FsWatcher.watch([entry.resolvedSourcePath], {
126
- followSymlinks: false,
127
- ignored: [...EXCLUDED_NAMES].map((name) => `**/${name}`),
128
- });
129
- watcher.onChange({ delay: 300 }, async (changeInfos) => {
130
- for (const { path: changedPath } of changeInfos) {
131
- // 제외 항목 필터: basename 매칭 또는 제외 디렉토리 내 경로
132
- if (
133
- EXCLUDED_NAMES.has(path.basename(changedPath)) ||
134
- excludedPaths.some((ep) => pathx.isChildPath(changedPath, ep))
135
- ) {
136
- continue;
227
+ // 소스 루트에서 npm 기본 파일 패턴에 매칭되는 파일 추가
228
+ try {
229
+ const rootEntries = await fs.promises.readdir(entry.resolvedSourcePath);
230
+ for (const name of rootEntries) {
231
+ if (NPM_DEFAULT_FILE_PATTERN.test(name)) {
232
+ watchPaths.push(pathx.posix(path.join(entry.resolvedSourcePath, name)));
233
+ }
137
234
  }
235
+ } catch {
236
+ // readdir 실패 시 npm 기본 파일 감시 생략
237
+ }
138
238
 
139
- // 이 소스 경로를 사용하는 모든 항목에 대해 복사
140
- for (const e of entries) {
141
- if (e.resolvedSourcePath !== entry.resolvedSourcePath) continue;
239
+ // 이 소스 경로에 해당하는 entries만 사전 필터링하여 캡처
240
+ const sourceEntries = entries.filter(
241
+ (e) => e.resolvedSourcePath === entry.resolvedSourcePath,
242
+ );
243
+
244
+ const watcher = await FsWatcher.watch(watchPaths, {
245
+ followSymlinks: false,
246
+ });
247
+ watcher.onChange({ delay: 300 }, async (changeInfos) => {
248
+ let hasActualCopy = false;
142
249
 
143
- // 소스로부터의 상대 경로 계산
144
- const relativePath = pathx.posix(path.relative(e.resolvedSourcePath, changedPath));
145
- const destPath = pathx.posix(path.join(e.actualTargetPath, relativePath));
250
+ for (const { path: changedPath } of changeInfos) {
251
+ // 사전 필터링된 항목만 순회
252
+ for (const e of sourceEntries) {
253
+ // 소스로부터의 상대 경로 계산
254
+ const relativePath = pathx.posix(path.relative(e.resolvedSourcePath, changedPath));
255
+ const destPath = pathx.posix(path.join(e.actualTargetPath, relativePath));
146
256
 
147
- try {
148
- // 소스 존재 여부 확인
149
- let sourceExists = false;
150
257
  try {
151
- await fs.promises.access(changedPath);
152
- sourceExists = true;
153
- } catch {
154
- // 소스가 삭제됨
155
- }
258
+ // 소스 존재 여부 확인
259
+ let sourceExists = false;
260
+ try {
261
+ await fs.promises.access(changedPath);
262
+ sourceExists = true;
263
+ } catch {
264
+ // 소스가 삭제됨
265
+ }
156
266
 
157
- if (sourceExists) {
158
- // 소스가 디렉토리인지 파일인지 확인
159
- const stat = await fs.promises.stat(changedPath);
160
- if (stat.isDirectory()) {
161
- await fsx.mkdir(destPath);
267
+ if (sourceExists) {
268
+ // 소스가 디렉토리인지 파일인지 확인
269
+ const stat = await fs.promises.stat(changedPath);
270
+ if (stat.isDirectory()) {
271
+ await fsx.mkdir(destPath);
272
+ } else {
273
+ // 파일 내용이 동일하면 복사 건너뜀 (불필요한 리빌드 방지)
274
+ if (await isFileContentSame(changedPath, destPath)) continue;
275
+ await fsx.mkdir(pathx.posix(path.dirname(destPath)));
276
+ await fsx.copy(changedPath, destPath);
277
+ hasActualCopy = true;
278
+ }
162
279
  } else {
163
- await fsx.mkdir(pathx.posix(path.dirname(destPath)));
164
- await fsx.copy(changedPath, destPath, replaceDepsCopyFilter);
280
+ // 소스가 삭제됨 → 대상도 삭제
281
+ await fsx.rm(destPath);
282
+ hasActualCopy = true;
165
283
  }
166
- } else {
167
- // 소스가 삭제됨 → 대상도 삭제
168
- await fsx.rm(destPath);
284
+ } catch (err) {
285
+ logger.error(
286
+ `[${e.targetName}] 복사 실패 (${relativePath}): ${err instanceof Error ? err.message : err}`,
287
+ );
169
288
  }
170
- } catch (err) {
171
- logger.error(
172
- `[${e.targetName}] 복사 실패 (${relativePath}): ${err instanceof Error ? err.message : err}`,
173
- );
174
289
  }
175
290
  }
176
- }
177
- options?.onChanged?.();
178
- });
179
291
 
180
- watchers.push(watcher);
292
+ if (hasActualCopy) {
293
+ options?.onChanged?.();
294
+ }
295
+ });
296
+
297
+ watchers.push(watcher);
298
+ } catch (err) {
299
+ logger.error(
300
+ `[${entry.targetName}] 감시 설정 실패: ${err instanceof Error ? err.message : err}`,
301
+ );
302
+ }
181
303
  }
182
304
 
183
305
  logger.success("replace-deps 워치 준비 완료");
@@ -60,7 +60,7 @@ export class Electron {
60
60
  //#region Public Methods
61
61
 
62
62
  async initialize(): Promise<void> {
63
- Electron._logger.debug("initialize 시작");
63
+ Electron._logger.start("initialize 중...");
64
64
 
65
65
  Electron._logger.debug("package.json 설정 시작");
66
66
  await this._setupNpmConf();
@@ -83,11 +83,11 @@ export class Electron {
83
83
  await this._exec("pnpm", ["exec", "electron-rebuild"], this._srcPath);
84
84
  Electron._logger.debug("electron-rebuild 완료");
85
85
  }
86
- Electron._logger.debug("initialize 완료");
86
+ Electron._logger.success("initialize 완료");
87
87
  }
88
88
 
89
89
  async run(url: string): Promise<void> {
90
- Electron._logger.debug(`run 시작 (url: ${url})`);
90
+ Electron._logger.start(`run 중... (url: ${url})`);
91
91
 
92
92
  await this.initialize();
93
93
  await this._copyPublicAssets();
@@ -126,7 +126,7 @@ export class Electron {
126
126
  setup: (build) => {
127
127
  build.onEnd(async (result) => {
128
128
  if (result.errors.length > 0) {
129
- Electron._logger.warn("번들링 실패. Electron을 재시작하지 않습니다.");
129
+ Electron._logger.error("번들링 실패. Electron을 재시작하지 않습니다.");
130
130
  return;
131
131
  }
132
132
 
@@ -181,11 +181,11 @@ export class Electron {
181
181
  process.once("SIGINT", signalHandler);
182
182
  process.once("SIGTERM", signalHandler);
183
183
  });
184
- Electron._logger.debug("run 완료");
184
+ Electron._logger.success("run 완료");
185
185
  }
186
186
 
187
187
  async build(outPath: string): Promise<void> {
188
- Electron._logger.debug("build 시작");
188
+ Electron._logger.start("build 중...");
189
189
 
190
190
  await this.initialize();
191
191
 
@@ -205,7 +205,7 @@ export class Electron {
205
205
  await this._copyBuildOutput(outPath);
206
206
  Electron._logger.debug("빌드 산출물 복사 완료");
207
207
 
208
- Electron._logger.debug("build 완료");
208
+ Electron._logger.success("build 완료");
209
209
  }
210
210
 
211
211
  //#endregion
@@ -163,14 +163,10 @@ export abstract class BaseEngine<
163
163
  (data as CommonBuildWorkerEvents["build"]).build,
164
164
  });
165
165
 
166
- // BaseEngine 전용: 경고 로깅 + 린트 결과 보고
166
+ // BaseEngine 전용: 린트 결과 보고
167
167
  this._worker!.on("build", (data) => {
168
168
  const event = data;
169
169
 
170
- if (event.build.warnings != null && event.build.warnings.length > 0) {
171
- logger.warn(`${this._pkg.name}: ${event.build.warnings.join(", ")}`);
172
- }
173
-
174
170
  if (event.lint != null) {
175
171
  const lintResult: BuildResult = {
176
172
  name: this._pkg.name,
@@ -184,7 +180,7 @@ export abstract class BaseEngine<
184
180
  });
185
181
 
186
182
  this._callStartWatch(output).catch((err: unknown) => {
187
- logger.error(`[${this._pkg.name}] startWatch 실패:`, errNs.message(err));
183
+ logger.debug(`[${this._pkg.name}] startWatch 실패:`, errNs.message(err));
188
184
  this._resultCollector?.add({
189
185
  name: this._pkg.name,
190
186
  target: this._getTarget(),
@@ -101,20 +101,14 @@ export class EsbuildClientEngine implements BuildEngine {
101
101
  });
102
102
 
103
103
  // 공통 이벤트 처리 (buildStart/build/error)
104
- setupWatchEvents(this._worker!, {
104
+ const { resolveInitialBuild } = setupWatchEvents(this._worker!, {
105
105
  name: this._pkg.name,
106
106
  target: "client",
107
107
  resultCollector: this._resultCollector,
108
108
  rebuildManager: this._rebuildManager,
109
109
  normalizeBuild: (data) => data as NormalizedBuildInfo,
110
110
  });
111
- // waitForInitialBuild 미사용 — worker.startWatch() await로 완료 감지
112
-
113
- // EsbuildClientEngine 전용: error 로깅
114
- this._worker!.on("error", (data) => {
115
- const event = data as { message: string };
116
- logger.error(`${this._pkg.name}: ${event.message}`);
117
- });
111
+ resolveInitialBuild(); // EsbuildClientEngine은 worker.startWatch() await로 초기 빌드 완료를 감지하므로 즉시 정리
118
112
 
119
113
  const port =
120
114
  typeof this._pkg.config.server === "number"
@@ -132,15 +126,27 @@ export class EsbuildClientEngine implements BuildEngine {
132
126
  browserSupport: this._pkg.config.browserSupport,
133
127
  });
134
128
 
129
+ const warningsText = result.warnings != null && result.warnings.length > 0
130
+ ? result.warnings.join("\n")
131
+ : undefined;
132
+
135
133
  if (!result.success) {
136
- const errorDetail = result.errors?.join("; ") ?? "unknown error";
137
- logger.error(`[${this._pkg.name}] 초기 빌드 실패: ${errorDetail}`);
134
+ const errorDetail = result.errors?.join("\n") ?? "unknown error";
138
135
  this._resultCollector?.add({
139
136
  name: this._pkg.name,
140
137
  target: "client",
141
138
  type: "build",
142
139
  status: "error",
143
140
  message: errorDetail,
141
+ warnings: warningsText,
142
+ });
143
+ } else if (warningsText != null) {
144
+ this._resultCollector?.add({
145
+ name: this._pkg.name,
146
+ target: "client",
147
+ type: "build",
148
+ status: "success",
149
+ warnings: warningsText,
144
150
  });
145
151
  }
146
152
  }
@@ -1,4 +1,4 @@
1
- import type * as NgtscBuildWorkerModule from "../workers/ngtsc-build.worker";
1
+ import type * as LibraryBuildWorkerModule from "../workers/library-build.worker";
2
2
  import type { ResultCollector } from "../runtime/ResultCollector";
3
3
  import type { RebuildManager } from "../runtime/rebuild-manager";
4
4
  import type { BuildOutput, BuildPackageInfo, EngineResult } from "./types";
@@ -24,19 +24,19 @@ export interface NgtscEngineOptions {
24
24
  /**
25
25
  * NgtscProgram 기반 Angular 라이브러리 패키지용 빌드 엔진
26
26
  *
27
- * NgtscProgram을 사용하여 AOT 컴파일을 수행하는 ngtsc-build.worker를 래핑한다.
28
- * package.json에 @angular/core 의존성이 있는 Angular 패키지용.
27
+ * 통합된 library-build.worker를 사용하며, globalScss: true를 전달하여
28
+ * Angular AOT 컴파일 + SCSS 빌드를 활성화한다.
29
29
  */
30
30
  export class NgtscEngine extends BaseEngine<
31
31
  BuildPackageInfo,
32
- typeof NgtscBuildWorkerModule & CommonBuildWorkerModule
32
+ typeof LibraryBuildWorkerModule & CommonBuildWorkerModule
33
33
  > {
34
34
  constructor(options: NgtscEngineOptions) {
35
35
  super(options);
36
36
  }
37
37
 
38
38
  protected _getWorkerPath(): string {
39
- return import.meta.resolve("../workers/ngtsc-build.worker");
39
+ return import.meta.resolve("../workers/library-build.worker");
40
40
  }
41
41
 
42
42
  protected _getTarget(): string {
@@ -49,7 +49,7 @@ export class NgtscEngine extends BaseEngine<
49
49
  name: this._pkg.name,
50
50
  cwd: this._cwd,
51
51
  pkgDir: this._pkg.dir,
52
- output,
52
+ output: { ...output, globalScss: true },
53
53
  });
54
54
 
55
55
  return this._normalizeResult(result);
@@ -61,7 +61,7 @@ export class NgtscEngine extends BaseEngine<
61
61
  name: this._pkg.name,
62
62
  cwd: this._cwd,
63
63
  pkgDir: this._pkg.dir,
64
- output,
64
+ output: { ...output, globalScss: true },
65
65
  replaceDeps: this._replaceDeps,
66
66
  });
67
67
  }
@@ -47,7 +47,6 @@ export class TscEngine extends BaseEngine<
47
47
  logger.debug(`[${this._pkg.name}] worker.build 호출`);
48
48
  const result = await this._worker!.build({
49
49
  name: this._pkg.name,
50
- config: this._pkg.config,
51
50
  cwd: this._cwd,
52
51
  pkgDir: this._pkg.dir,
53
52
  output,
@@ -60,7 +59,6 @@ export class TscEngine extends BaseEngine<
60
59
  logger.debug(`[${this._pkg.name}] worker.startWatch 호출`);
61
60
  await this._worker!.startWatch({
62
61
  name: this._pkg.name,
63
- config: this._pkg.config,
64
62
  cwd: this._cwd,
65
63
  pkgDir: this._pkg.dir,
66
64
  output,
@@ -39,6 +39,8 @@ export interface BuildOutput {
39
39
  env?: TypecheckEnv;
40
40
  /** 타입체크 범위에 tests/ 파일을 포함한다. check 커맨드에서만 사용된다. */
41
41
  includeTests?: boolean;
42
+ /** Angular 라이브러리의 글로벌 SCSS 컴파일 여부 */
43
+ globalScss?: boolean;
42
44
  }
43
45
 
44
46
  /**