@simplysm/sd-cli 14.0.42 → 14.0.43

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 (321) 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 +29 -34
  10. package/dist/angular/ngtsc-build-core.d.ts.map +1 -1
  11. package/dist/angular/ngtsc-build-core.js +90 -51
  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.js +1 -1
  36. package/dist/commands/publish/version-upgrade.js.map +1 -1
  37. package/dist/commands/replace-deps.d.ts.map +1 -1
  38. package/dist/commands/replace-deps.js +2 -1
  39. package/dist/commands/replace-deps.js.map +1 -1
  40. package/dist/deps/replace-deps/collect-deps.d.ts.map +1 -1
  41. package/dist/deps/replace-deps/collect-deps.js +5 -2
  42. package/dist/deps/replace-deps/collect-deps.js.map +1 -1
  43. package/dist/deps/replace-deps/replace-deps.d.ts +21 -3
  44. package/dist/deps/replace-deps/replace-deps.d.ts.map +1 -1
  45. package/dist/deps/replace-deps/replace-deps.js +107 -62
  46. package/dist/deps/replace-deps/replace-deps.js.map +1 -1
  47. package/dist/electron/electron.js +7 -7
  48. package/dist/electron/electron.js.map +1 -1
  49. package/dist/engines/BaseEngine.d.ts.map +1 -1
  50. package/dist/engines/BaseEngine.js +2 -5
  51. package/dist/engines/BaseEngine.js.map +1 -1
  52. package/dist/engines/EsbuildClientEngine.d.ts.map +1 -1
  53. package/dist/engines/EsbuildClientEngine.js +16 -9
  54. package/dist/engines/EsbuildClientEngine.js.map +1 -1
  55. package/dist/engines/NgtscEngine.d.ts +4 -4
  56. package/dist/engines/NgtscEngine.d.ts.map +1 -1
  57. package/dist/engines/NgtscEngine.js +5 -5
  58. package/dist/engines/NgtscEngine.js.map +1 -1
  59. package/dist/engines/TscEngine.d.ts.map +1 -1
  60. package/dist/engines/TscEngine.js +0 -2
  61. package/dist/engines/TscEngine.js.map +1 -1
  62. package/dist/engines/types.d.ts +2 -0
  63. package/dist/engines/types.d.ts.map +1 -1
  64. package/dist/esbuild/esbuild-angular-compiler-plugin.d.ts +36 -0
  65. package/dist/esbuild/esbuild-angular-compiler-plugin.d.ts.map +1 -0
  66. package/dist/esbuild/esbuild-angular-compiler-plugin.js +464 -0
  67. package/dist/esbuild/esbuild-angular-compiler-plugin.js.map +1 -0
  68. package/dist/esbuild/esbuild-client-config.d.ts +8 -2
  69. package/dist/esbuild/esbuild-client-config.d.ts.map +1 -1
  70. package/dist/esbuild/esbuild-client-config.js +48 -33
  71. package/dist/esbuild/esbuild-client-config.js.map +1 -1
  72. package/dist/esbuild/esbuild-tsc-plugin.d.ts +4 -1
  73. package/dist/esbuild/esbuild-tsc-plugin.d.ts.map +1 -1
  74. package/dist/esbuild/esbuild-tsc-plugin.js +27 -23
  75. package/dist/esbuild/esbuild-tsc-plugin.js.map +1 -1
  76. package/dist/esbuild/file-reference-tracker.d.ts +24 -0
  77. package/dist/esbuild/file-reference-tracker.d.ts.map +1 -0
  78. package/dist/esbuild/file-reference-tracker.js +57 -0
  79. package/dist/esbuild/file-reference-tracker.js.map +1 -0
  80. package/dist/esbuild/lmdb-cache-store.d.ts +18 -0
  81. package/dist/esbuild/lmdb-cache-store.d.ts.map +1 -0
  82. package/dist/esbuild/lmdb-cache-store.js +41 -0
  83. package/dist/esbuild/lmdb-cache-store.js.map +1 -0
  84. package/dist/esbuild/load-result-cache.d.ts +17 -0
  85. package/dist/esbuild/load-result-cache.d.ts.map +1 -0
  86. package/dist/esbuild/load-result-cache.js +61 -0
  87. package/dist/esbuild/load-result-cache.js.map +1 -0
  88. package/dist/index.d.ts +3 -0
  89. package/dist/index.d.ts.map +1 -1
  90. package/dist/index.js +2 -0
  91. package/dist/index.js.map +1 -1
  92. package/dist/lint/lint-core.js +7 -7
  93. package/dist/lint/lint-core.js.map +1 -1
  94. package/dist/orchestrators/BaseOrchestrator.js +2 -2
  95. package/dist/orchestrators/BaseOrchestrator.js.map +1 -1
  96. package/dist/orchestrators/BuildOrchestrator.d.ts.map +1 -1
  97. package/dist/orchestrators/BuildOrchestrator.js +5 -19
  98. package/dist/orchestrators/BuildOrchestrator.js.map +1 -1
  99. package/dist/orchestrators/DevOrchestrator.js +5 -5
  100. package/dist/orchestrators/DevOrchestrator.js.map +1 -1
  101. package/dist/orchestrators/WatchOrchestrator.js +6 -6
  102. package/dist/orchestrators/WatchOrchestrator.js.map +1 -1
  103. package/dist/runtime/ResultCollector.d.ts +1 -0
  104. package/dist/runtime/ResultCollector.d.ts.map +1 -1
  105. package/dist/runtime/ResultCollector.js.map +1 -1
  106. package/dist/runtime/engine-watch-events.d.ts.map +1 -1
  107. package/dist/runtime/engine-watch-events.js +3 -0
  108. package/dist/runtime/engine-watch-events.js.map +1 -1
  109. package/dist/runtime/rebuild-manager.js +1 -1
  110. package/dist/runtime/rebuild-manager.js.map +1 -1
  111. package/dist/runtime/worker-utils.js +1 -1
  112. package/dist/runtime/worker-utils.js.map +1 -1
  113. package/dist/sd-cli-entry.d.ts.map +1 -1
  114. package/dist/sd-cli-entry.js +4 -3
  115. package/dist/sd-cli-entry.js.map +1 -1
  116. package/dist/sd-cli.js +3 -3
  117. package/dist/sd-cli.js.map +1 -1
  118. package/dist/ts-compiler/SdTsCompiler.d.ts +39 -0
  119. package/dist/ts-compiler/SdTsCompiler.d.ts.map +1 -0
  120. package/dist/ts-compiler/SdTsCompiler.js +593 -0
  121. package/dist/ts-compiler/SdTsCompiler.js.map +1 -0
  122. package/dist/ts-compiler/sd-ts-compiler-options.d.ts +40 -0
  123. package/dist/ts-compiler/sd-ts-compiler-options.d.ts.map +1 -0
  124. package/dist/ts-compiler/sd-ts-compiler-options.js +2 -0
  125. package/dist/ts-compiler/sd-ts-compiler-options.js.map +1 -0
  126. package/dist/ts-compiler/sd-ts-compiler-result.d.ts +34 -0
  127. package/dist/ts-compiler/sd-ts-compiler-result.d.ts.map +1 -0
  128. package/dist/ts-compiler/sd-ts-compiler-result.js +2 -0
  129. package/dist/ts-compiler/sd-ts-compiler-result.js.map +1 -0
  130. package/dist/utils/copy-public.d.ts +6 -4
  131. package/dist/utils/copy-public.d.ts.map +1 -1
  132. package/dist/utils/copy-public.js +9 -7
  133. package/dist/utils/copy-public.js.map +1 -1
  134. package/dist/utils/diagnostic-utils.d.ts +2 -3
  135. package/dist/utils/diagnostic-utils.d.ts.map +1 -1
  136. package/dist/utils/diagnostic-utils.js +8 -9
  137. package/dist/utils/diagnostic-utils.js.map +1 -1
  138. package/dist/utils/output-utils.d.ts +8 -2
  139. package/dist/utils/output-utils.d.ts.map +1 -1
  140. package/dist/utils/output-utils.js +32 -8
  141. package/dist/utils/output-utils.js.map +1 -1
  142. package/dist/workers/client.worker.d.ts +1 -1
  143. package/dist/workers/client.worker.d.ts.map +1 -1
  144. package/dist/workers/client.worker.js +136 -110
  145. package/dist/workers/client.worker.js.map +1 -1
  146. package/dist/workers/library-build.worker.d.ts +0 -2
  147. package/dist/workers/library-build.worker.d.ts.map +1 -1
  148. package/dist/workers/library-build.worker.js +147 -70
  149. package/dist/workers/library-build.worker.js.map +1 -1
  150. package/dist/workers/server-build.worker.d.ts.map +1 -1
  151. package/dist/workers/server-build.worker.js +30 -57
  152. package/dist/workers/server-build.worker.js.map +1 -1
  153. package/dist/workers/server-esbuild-context.d.ts +7 -0
  154. package/dist/workers/server-esbuild-context.d.ts.map +1 -1
  155. package/dist/workers/server-esbuild-context.js +11 -2
  156. package/dist/workers/server-esbuild-context.js.map +1 -1
  157. package/package.json +5 -4
  158. package/src/angular/angular-compiler.ts +0 -502
  159. package/src/angular/hmr-candidates.ts +295 -0
  160. package/src/angular/ngtsc-build-core.ts +125 -92
  161. package/src/angular/vite-angular-plugin.ts +71 -65
  162. package/src/angular/web-worker-transformer.ts +117 -0
  163. package/src/capacitor/capacitor.ts +6 -4
  164. package/src/commands/check.ts +17 -76
  165. package/src/commands/publish/deployment-phase.ts +11 -7
  166. package/src/commands/publish/npm-publisher.ts +1 -1
  167. package/src/commands/publish/publish-command.ts +1 -1
  168. package/src/commands/publish/version-upgrade.ts +1 -1
  169. package/src/commands/replace-deps.ts +3 -1
  170. package/src/deps/replace-deps/collect-deps.ts +4 -2
  171. package/src/deps/replace-deps/replace-deps.ts +114 -66
  172. package/src/electron/electron.ts +7 -7
  173. package/src/engines/BaseEngine.ts +2 -6
  174. package/src/engines/EsbuildClientEngine.ts +16 -10
  175. package/src/engines/NgtscEngine.ts +7 -7
  176. package/src/engines/TscEngine.ts +0 -2
  177. package/src/engines/types.ts +2 -0
  178. package/src/esbuild/esbuild-angular-compiler-plugin.ts +647 -0
  179. package/src/esbuild/esbuild-client-config.ts +57 -41
  180. package/src/esbuild/esbuild-tsc-plugin.ts +33 -23
  181. package/src/esbuild/file-reference-tracker.ts +61 -0
  182. package/src/esbuild/lmdb-cache-store.ts +46 -0
  183. package/src/esbuild/load-result-cache.ts +85 -0
  184. package/src/index.ts +5 -0
  185. package/src/lint/lint-core.ts +7 -7
  186. package/src/orchestrators/BaseOrchestrator.ts +2 -2
  187. package/src/orchestrators/BuildOrchestrator.ts +5 -24
  188. package/src/orchestrators/DevOrchestrator.ts +5 -5
  189. package/src/orchestrators/WatchOrchestrator.ts +6 -6
  190. package/src/runtime/ResultCollector.ts +1 -0
  191. package/src/runtime/engine-watch-events.ts +3 -0
  192. package/src/runtime/rebuild-manager.ts +1 -1
  193. package/src/runtime/worker-utils.ts +1 -1
  194. package/src/sd-cli-entry.ts +5 -3
  195. package/src/sd-cli.ts +4 -4
  196. package/src/ts-compiler/SdTsCompiler.ts +815 -0
  197. package/src/ts-compiler/sd-ts-compiler-options.ts +46 -0
  198. package/src/ts-compiler/sd-ts-compiler-result.ts +34 -0
  199. package/src/utils/copy-public.ts +9 -6
  200. package/src/utils/diagnostic-utils.ts +8 -9
  201. package/src/utils/output-utils.ts +38 -8
  202. package/src/workers/client.worker.ts +160 -126
  203. package/src/workers/library-build.worker.ts +187 -75
  204. package/src/workers/server-build.worker.ts +31 -61
  205. package/src/workers/server-esbuild-context.ts +14 -2
  206. package/tests/angular/fixtures/packages/basic-app/dist/styles.css +3 -0
  207. package/tests/angular/fixtures/packages/basic-app/scss/styles.scss +5 -0
  208. package/tests/angular/vite-angular-plugin-sdtscompiler.verify.md +13 -0
  209. package/tests/angular/web-worker-transformer.spec.ts +154 -0
  210. package/tests/capacitor/capacitor-build.spec.ts +1 -1
  211. package/tests/capacitor/capacitor-icon.spec.ts +1 -1
  212. package/tests/capacitor/capacitor-init.spec.ts +1 -1
  213. package/tests/commands/check.spec.ts +90 -104
  214. package/tests/commands/publish.spec.ts +12 -4
  215. package/tests/commands/slice3-severity-cleanup.verify.md +12 -0
  216. package/tests/deps/replace-deps/collect-deps.acc.spec.ts +62 -0
  217. package/tests/deps/replace-deps/collect-deps.spec.ts +49 -0
  218. package/tests/deps/replace-deps/replace-deps-filter.spec.ts +103 -0
  219. package/tests/deps/replace-deps/replace-deps-setup.acc.spec.ts +156 -0
  220. package/tests/electron/electron.spec.ts +4 -1
  221. package/tests/engines/engine-adapter-isolation.spec.ts +5 -6
  222. package/tests/engines/engine-duplicate-output-removal.verify.md +10 -0
  223. package/tests/engines/esbuild-client-engine.acc.spec.ts +79 -0
  224. package/tests/engines/esbuild-client-engine.spec.ts +73 -3
  225. package/tests/esbuild/esbuild-angular-compiler-plugin-hmr.verify.md +23 -0
  226. package/tests/esbuild/esbuild-angular-compiler-plugin-onload.verify.md +21 -0
  227. package/tests/esbuild/esbuild-angular-compiler-plugin-onstart-extraction.verify.md +16 -0
  228. package/tests/esbuild/esbuild-angular-compiler-plugin-sdtscompiler.verify.md +15 -0
  229. package/tests/esbuild/esbuild-angular-compiler-plugin-stylesheet.verify.md +31 -0
  230. package/tests/esbuild/esbuild-angular-compiler-plugin-worker.verify.md +31 -0
  231. package/tests/esbuild/esbuild-angular-compiler-plugin.spec.ts +397 -0
  232. package/tests/esbuild/esbuild-angular-compiler-plugin.verify.md +21 -0
  233. package/tests/esbuild/esbuild-tsc-plugin-imports.verify.md +13 -0
  234. package/tests/esbuild/esbuild-tsc-plugin.acc.spec.ts +56 -111
  235. package/tests/esbuild/esbuild-tsc-plugin.spec.ts +116 -52
  236. package/tests/esbuild/file-reference-tracker.spec.ts +99 -0
  237. package/tests/esbuild/lmdb-cache-store.spec.ts +58 -0
  238. package/tests/esbuild/load-result-cache.acc.spec.ts +55 -0
  239. package/tests/esbuild/load-result-cache.spec.ts +133 -0
  240. package/tests/orchestrators/build-orchestrator.spec.ts +4 -3
  241. package/tests/orchestrators/dev-orchestrator.spec.ts +5 -5
  242. package/tests/orchestrators/slice1-stdout-to-consola.verify.md +10 -0
  243. package/tests/orchestrators/typecheck-orchestrator.spec.ts +1 -1
  244. package/tests/orchestrators/watch-orchestrator.spec.ts +7 -7
  245. package/tests/runtime/result-collector.spec.ts +64 -0
  246. package/tests/sd-cli-entry.spec.ts +3 -4
  247. package/tests/sd-cli-log-tag.verify.md +11 -0
  248. package/tests/ts-compiler/SdTsCompiler-affected-files.verify.md +8 -0
  249. package/tests/ts-compiler/SdTsCompiler-diagnostics.verify.md +12 -0
  250. package/tests/ts-compiler/SdTsCompiler-emit.verify.md +9 -0
  251. package/tests/ts-compiler/SdTsCompiler.acc.spec.ts +603 -0
  252. package/tests/ts-compiler/SdTsCompiler.spec.ts +265 -0
  253. package/tests/ts-compiler/SdTsCompiler.verify.md +41 -0
  254. package/tests/ts-compiler/fixtures/non-angular-pkg/.cache/typecheck-browser.tsbuildinfo +1 -0
  255. package/tests/ts-compiler/fixtures/non-angular-pkg/.cache/typecheck-node.tsbuildinfo +1 -0
  256. package/tests/ts-compiler/fixtures/non-angular-pkg/.cache/typecheck.tsbuildinfo +1 -0
  257. package/tests/ts-compiler/fixtures/non-angular-pkg/dist/index.d.ts +2 -0
  258. package/tests/ts-compiler/fixtures/non-angular-pkg/dist/index.d.ts.map +1 -0
  259. package/tests/ts-compiler/fixtures/non-angular-pkg/dist/index.js +4 -0
  260. package/tests/ts-compiler/fixtures/non-angular-pkg/dist/index.js.map +1 -0
  261. package/tests/ts-compiler/fixtures/non-angular-pkg/dist/util.d.ts +2 -0
  262. package/tests/ts-compiler/fixtures/non-angular-pkg/dist/util.d.ts.map +1 -0
  263. package/tests/ts-compiler/fixtures/non-angular-pkg/dist/util.js +4 -0
  264. package/tests/ts-compiler/fixtures/non-angular-pkg/dist/util.js.map +1 -0
  265. package/tests/ts-compiler/fixtures/non-angular-pkg/src/index.ts +3 -0
  266. package/tests/ts-compiler/fixtures/non-angular-pkg/src/util.ts +3 -0
  267. package/tests/ts-compiler/fixtures/non-angular-pkg/tests/sample.test-file.ts +3 -0
  268. package/tests/ts-compiler/fixtures/non-angular-pkg/tsconfig.json +12 -0
  269. package/tests/ts-compiler/scss-lint-integration.verify.md +14 -0
  270. package/tests/utils/angular-build.spec.ts +1 -1
  271. package/tests/utils/copy-public-outdir.verify.md +8 -0
  272. package/tests/utils/copy-public.acc.spec.ts +52 -0
  273. package/tests/utils/copy-public.spec.ts +56 -0
  274. package/tests/utils/diagnostic-utils.spec.ts +24 -15
  275. package/tests/utils/engine-watch-events.acc.spec.ts +59 -0
  276. package/tests/utils/engine-watch-events.spec.ts +58 -0
  277. package/tests/utils/esbuild-client-config-integration.verify.md +9 -0
  278. package/tests/utils/esbuild-client-config.acc.spec.ts +45 -61
  279. package/tests/utils/esbuild-client-config.spec.ts +70 -52
  280. package/tests/utils/ngtsc-build-core-write-emit.spec.ts +12 -12
  281. package/tests/utils/ngtsc-build-core.spec.ts +1 -44
  282. package/tests/utils/output-utils.spec.ts +133 -13
  283. package/tests/utils/replace-deps-watch.acc.spec.ts +7 -1
  284. package/tests/utils/replace-deps-watch.spec.ts +57 -1
  285. package/tests/utils/worker-utils.spec.ts +8 -2
  286. package/tests/workers/client-worker-initial-build-error.verify.md +2 -3
  287. package/tests/workers/client-worker-initial-build-warnings.verify.md +7 -0
  288. package/tests/workers/client-worker-refactor.verify.md +22 -0
  289. package/tests/workers/client-worker-ts-cache-invalidation.verify.md +12 -0
  290. package/tests/workers/client-worker.acc.spec.ts +6 -3
  291. package/tests/workers/library-build-lint.spec.ts +40 -45
  292. package/tests/workers/library-build-worker.spec.ts +294 -40
  293. package/tests/workers/server-build-lint.spec.ts +59 -45
  294. package/tests/workers/server-build-worker.spec.ts +63 -24
  295. package/tests/workers/server-esbuild-context.acc.spec.ts +2 -0
  296. package/tests/workers/server-esbuild-context.spec.ts +2 -0
  297. package/tests/workers/server-runtime-worker.spec.ts +1 -1
  298. package/tests/workers/shared-worker-lifecycle.acc.spec.ts +1 -1
  299. package/dist/angular/angular-build-pipeline.d.ts +0 -97
  300. package/dist/angular/angular-build-pipeline.d.ts.map +0 -1
  301. package/dist/angular/angular-build-pipeline.js +0 -285
  302. package/dist/angular/angular-build-pipeline.js.map +0 -1
  303. package/dist/utils/tsc-build.d.ts +0 -51
  304. package/dist/utils/tsc-build.d.ts.map +0 -1
  305. package/dist/utils/tsc-build.js +0 -156
  306. package/dist/utils/tsc-build.js.map +0 -1
  307. package/dist/workers/ngtsc-build.worker.d.ts +0 -23
  308. package/dist/workers/ngtsc-build.worker.d.ts.map +0 -1
  309. package/dist/workers/ngtsc-build.worker.js +0 -267
  310. package/dist/workers/ngtsc-build.worker.js.map +0 -1
  311. package/src/angular/angular-build-pipeline.ts +0 -406
  312. package/src/utils/tsc-build.ts +0 -226
  313. package/src/workers/ngtsc-build.worker.ts +0 -351
  314. package/tests/angular/angular-build-pipeline.spec.ts +0 -247
  315. package/tests/angular/angular-compiler-aot.acc.spec.ts +0 -68
  316. package/tests/angular/angular-compiler-aot.spec.ts +0 -80
  317. package/tests/utils/angular-compiler-emit.spec.ts +0 -666
  318. package/tests/utils/angular-compiler.spec.ts +0 -707
  319. package/tests/utils/tsc-build.spec.ts +0 -527
  320. package/tests/workers/ngtsc-build-lint.spec.ts +0 -141
  321. package/tests/workers/ngtsc-build-worker.spec.ts +0 -199
@@ -3,12 +3,9 @@ import path from "path";
3
3
  import ts from "typescript";
4
4
  import { consola } from "consola";
5
5
  import { pathx } from "@simplysm/core-node";
6
+ import { SdTsCompiler } from "../ts-compiler/SdTsCompiler.js";
6
7
  import { AngularSourceFileCache } from "./angular-compiler.js";
7
- import { getPackageSourceFiles } from "../utils/tsconfig.js";
8
- import {
9
- AngularBuildPipeline,
10
- type PipelineDiagnosticResult,
11
- } from "./angular-build-pipeline.js";
8
+ import type { SerializedDiagnostic } from "../typecheck/typecheck-serialization.js";
12
9
 
13
10
  const logger = consola.withTag("sd:cli:angular");
14
11
 
@@ -21,13 +18,16 @@ export interface SdAngularPluginOptions {
21
18
  /**
22
19
  * Angular AOT 컴파일을 수행하는 Vite 플러그인 (Vitest 전용).
23
20
  *
24
- * AngularBuildPipeline으로 패키지의 .ts 파일을 AOT 컴파일하고,
21
+ * SdTsCompiler로 패키지의 .ts 파일을 AOT 컴파일하고,
25
22
  * transform 훅에서 컴파일된 JS를 반환한다.
26
23
  */
27
24
  export function sdAngularPlugin(options: SdAngularPluginOptions): Plugin {
28
- let pipeline: AngularBuildPipeline | undefined;
25
+ let sdTsCompiler: SdTsCompiler | undefined;
29
26
  let sourceFileCache: AngularSourceFileCache | undefined;
30
27
 
28
+ /** emit된 파일 맵 (posix 소스 경로 → 컴파일된 JS 내용) */
29
+ const emittedFilesBySource = new Map<string, string>();
30
+
31
31
  /** Vitest watch 모드에서 변경된 파일 경로를 수집한다. buildStart 재호출 시 캐시 무효화에 사용. */
32
32
  const pendingWatchChanges = new Set<string>();
33
33
 
@@ -51,60 +51,57 @@ export function sdAngularPlugin(options: SdAngularPluginOptions): Plugin {
51
51
  }
52
52
  logger.debug("sdAngularPlugin buildStart 시작");
53
53
 
54
- // tsconfig 로드
55
- const tsconfigPath = path.join(resolvedPkgDir, "tsconfig.json");
56
- const configFile = ts.readConfigFile(tsconfigPath, ts.sys.readFile);
57
- const parsed = ts.parseJsonConfigFileContent(configFile.config, ts.sys, resolvedPkgDir);
58
- logger.debug(`tsconfig 파싱 완료: ${parsed.fileNames.length}개 파일`);
59
-
60
54
  // AngularSourceFileCache 생성 (또는 재사용)
61
55
  sourceFileCache ??= new AngularSourceFileCache();
62
56
 
63
- // Vitest watch 재빌드: 변경된 파일의 캐시 무효화
64
- let hadPendingChanges = false;
57
+ // Vitest watch 재빌드: 변경된 파일 수집
58
+ let modifiedFiles: ReadonlySet<string> | undefined;
65
59
  if (pendingWatchChanges.size > 0) {
66
- hadPendingChanges = true;
67
- logger.debug(`watch 변경 파일 ${pendingWatchChanges.size}개 캐시 무효화`);
68
- sourceFileCache.invalidate(pendingWatchChanges);
60
+ logger.debug(`watch 변경 파일 ${pendingWatchChanges.size}개`);
61
+ modifiedFiles = new Set(pendingWatchChanges);
69
62
  pendingWatchChanges.clear();
70
63
  }
71
64
 
72
- // Pipeline 생성 (최초) 또는 재사용
73
- pipeline ??= new AngularBuildPipeline({
74
- mode: "client",
75
- pkgDir: resolvedPkgDir,
76
- cwd: process.cwd(),
77
- rootNames: getPackageSourceFiles(resolvedPkgDir, parsed),
78
- compilerOptions: parsed.options,
79
- angularCompilerOptions: parsed.raw?.angularCompilerOptions as
80
- | Record<string, unknown>
81
- | undefined,
82
- sourceFileCache,
83
- compilerOptionsTransformer: (opts) => ({
84
- ...opts,
85
- noEmit: false,
86
- declaration: false,
87
- declarationMap: false,
88
- removeComments: false,
89
- sourceMap: false,
90
- inlineSourceMap: true,
91
- rootDir: process.cwd(),
92
- }),
93
- scssCacheDir: path.join(resolvedPkgDir, ".cache", "scss"),
94
- });
95
-
96
- // Pipeline 초기화 — 이미 초기화됐고 변경 파일이 없으면 건너뜀
97
- if (pipeline.getEmittedFiles().size > 0 && !hadPendingChanges) {
98
- logger.debug("Pipeline 이미 초기화됨, 변경 없음 — buildStart 건너뜀");
65
+ // SdTsCompiler 생성 (최초 또는 buildEnd 후 재시작)
66
+ if (sdTsCompiler == null) {
67
+ emittedFilesBySource.clear();
68
+ sdTsCompiler = new SdTsCompiler({
69
+ pkgDir: resolvedPkgDir,
70
+ cwd: process.cwd(),
71
+ output: { js: true, dts: false },
72
+ sourceFileCache,
73
+ compilerOptionsTransformer: (opts) => ({
74
+ ...opts,
75
+ noEmit: false,
76
+ declaration: false,
77
+ declarationMap: false,
78
+ removeComments: false,
79
+ sourceMap: false,
80
+ inlineSourceMap: true,
81
+ rootDir: process.cwd(),
82
+ }),
83
+ });
84
+ }
85
+
86
+ // 이미 초기화됐고 변경 파일이 없으면 건너뜀
87
+ if (emittedFilesBySource.size > 0 && modifiedFiles == null) {
88
+ logger.debug("이미 초기화됨, 변경 없음 — buildStart 건너뜀");
99
89
  return;
100
90
  }
101
- const pipelineResult = await pipeline.initialize();
91
+
92
+ // compileAsync
93
+ const result = await sdTsCompiler.compileAsync(modifiedFiles);
94
+
95
+ // emitResults → emittedFilesBySource 매핑
96
+ for (const { sourceFileName, contents } of result.emitResults ?? []) {
97
+ emittedFilesBySource.set(pathx.posix(sourceFileName), contents);
98
+ }
102
99
 
103
100
  // 진단 보고
104
- reportDiagnostics(pipelineResult.diagnostics);
101
+ reportDiagnostics(result.diagnostics, result.program);
105
102
 
106
103
  // SCSS 에러 보고
107
- for (const err of pipelineResult.scssErrors) {
104
+ for (const err of result.scssErrors) {
108
105
  logger.error(err);
109
106
  }
110
107
  },
@@ -113,11 +110,11 @@ export function sdAngularPlugin(options: SdAngularPluginOptions): Plugin {
113
110
  // query param 제거
114
111
  const cleanId = id.split("?")[0];
115
112
 
116
- // Pipeline이 emit .ts 파일만 처리
113
+ // emit .ts 파일만 처리
117
114
  if (!cleanId.endsWith(".ts")) return;
118
115
 
119
116
  const normalizedId = pathx.posix(cleanId);
120
- const emittedContent = pipeline?.getEmittedFile(normalizedId);
117
+ const emittedContent = emittedFilesBySource.get(normalizedId);
121
118
  if (emittedContent == null) return;
122
119
 
123
120
  // 인라인 소스맵 분리 (Vite 호환)
@@ -135,24 +132,33 @@ export function sdAngularPlugin(options: SdAngularPluginOptions): Plugin {
135
132
  },
136
133
 
137
134
  buildEnd() {
138
- pipeline = undefined;
135
+ sdTsCompiler = undefined;
139
136
  },
140
137
  };
141
138
  }
142
139
 
143
- function reportDiagnostics(diagnostics: PipelineDiagnosticResult): void {
144
- for (const error of diagnostics.errors) {
145
- const loc =
146
- error.file != null
147
- ? `${error.file}${error.line != null ? `:${String(error.line)}` : ""}`
148
- : "";
149
- logger.error(`${loc !== "" ? `(${loc}) ` : ""}${error.message}`);
150
- }
151
- for (const warning of diagnostics.warnings) {
152
- const loc =
153
- warning.file != null
154
- ? `${warning.file}${warning.line != null ? `:${String(warning.line)}` : ""}`
155
- : "";
156
- logger.warn(`${loc !== "" ? `(${loc}) ` : ""}${warning.message}`);
140
+ function reportDiagnostics(
141
+ diagnostics: readonly SerializedDiagnostic[],
142
+ program: ts.Program,
143
+ ): void {
144
+ for (const d of diagnostics) {
145
+ let loc = "";
146
+ if (d.file != null) {
147
+ loc = d.file.fileName;
148
+ if (d.start != null) {
149
+ const sf = program.getSourceFile(d.file.fileName);
150
+ if (sf != null) {
151
+ const pos = sf.getLineAndCharacterOfPosition(d.start);
152
+ loc += `:${pos.line + 1}`;
153
+ }
154
+ }
155
+ }
156
+
157
+ const prefix = loc !== "" ? `(${loc}) ` : "";
158
+ if (d.category === ts.DiagnosticCategory.Error) {
159
+ logger.error(`${prefix}${d.messageText}`);
160
+ } else if (d.category === ts.DiagnosticCategory.Warning) {
161
+ logger.warn(`${prefix}${d.messageText}`);
162
+ }
157
163
  }
158
164
  }
@@ -0,0 +1,117 @@
1
+ import ts from "typescript";
2
+
3
+ /**
4
+ * Web Worker/SharedWorker의 `new Worker(new URL('path', import.meta.url))` 패턴을
5
+ * 감지하여 fileProcessor로 번들된 경로로 치환하는 TypeScript transformer를 생성한다.
6
+ *
7
+ * @angular/build의 web-worker-transformer.js 원본을 이식한 구현.
8
+ */
9
+ export function createWorkerTransformer(
10
+ fileProcessor: (workerFile: string, containingFile: string) => string,
11
+ ): ts.TransformerFactory<ts.SourceFile> {
12
+ return (context) => {
13
+ const nodeFactory = context.factory;
14
+
15
+ const visitNode = (node: ts.Node): ts.Node => {
16
+ // new Worker(...) 또는 new SharedWorker(...) 감지
17
+ if (
18
+ !ts.isNewExpression(node) ||
19
+ !ts.isIdentifier(node.expression) ||
20
+ (node.expression.text !== "Worker" && node.expression.text !== "SharedWorker")
21
+ ) {
22
+ return ts.visitEachChild(node, visitNode, context);
23
+ }
24
+
25
+ // Worker 인자: 1개 또는 2개
26
+ if (node.arguments == null || node.arguments.length < 1 || node.arguments.length > 2) {
27
+ return node;
28
+ }
29
+
30
+ // 첫 인자: new URL(...)
31
+ const workerUrlNode = node.arguments[0];
32
+ if (
33
+ !ts.isNewExpression(workerUrlNode) ||
34
+ !ts.isIdentifier(workerUrlNode.expression) ||
35
+ workerUrlNode.expression.text !== "URL"
36
+ ) {
37
+ return node;
38
+ }
39
+
40
+ // URL 인자: 정확히 2개
41
+ if (workerUrlNode.arguments == null || workerUrlNode.arguments.length !== 2) {
42
+ return node;
43
+ }
44
+
45
+ // URL 첫 인자: 문자열 리터럴
46
+ if (!ts.isStringLiteralLike(workerUrlNode.arguments[0])) {
47
+ return node;
48
+ }
49
+
50
+ // URL 둘째 인자: import.meta.url
51
+ const secondArg = workerUrlNode.arguments[1];
52
+ if (
53
+ !ts.isPropertyAccessExpression(secondArg) ||
54
+ !ts.isMetaProperty(secondArg.expression) ||
55
+ secondArg.name.text !== "url"
56
+ ) {
57
+ return node;
58
+ }
59
+
60
+ const filePath = workerUrlNode.arguments[0].text;
61
+ const importer = node.getSourceFile().fileName;
62
+
63
+ // fileProcessor 호출
64
+ const replacementPath = fileProcessor(filePath, importer);
65
+
66
+ // 경로가 변경되지 않았으면 원본 유지
67
+ if (replacementPath === filePath) {
68
+ return node;
69
+ }
70
+
71
+ // AST 치환
72
+ return nodeFactory.updateNewExpression(
73
+ node,
74
+ node.expression,
75
+ node.typeArguments,
76
+ ts.setTextRange(
77
+ nodeFactory.createNodeArray(
78
+ [
79
+ // URL 인자 치환
80
+ nodeFactory.updateNewExpression(
81
+ workerUrlNode,
82
+ workerUrlNode.expression,
83
+ workerUrlNode.typeArguments,
84
+ ts.setTextRange(
85
+ nodeFactory.createNodeArray(
86
+ [nodeFactory.createStringLiteral(replacementPath), workerUrlNode.arguments[1]],
87
+ workerUrlNode.arguments.hasTrailingComma,
88
+ ),
89
+ workerUrlNode.arguments,
90
+ ),
91
+ ),
92
+ // 두 번째 인자: 기존 options가 있으면 유지, 없으면 { type: 'module' } 추가
93
+ node.arguments.length > 1
94
+ ? node.arguments[1]
95
+ : nodeFactory.createObjectLiteralExpression([
96
+ nodeFactory.createPropertyAssignment(
97
+ "type",
98
+ nodeFactory.createStringLiteral("module"),
99
+ ),
100
+ ]),
101
+ ],
102
+ node.arguments.hasTrailingComma,
103
+ ),
104
+ node.arguments,
105
+ ),
106
+ );
107
+ };
108
+
109
+ return (sourceFile) => {
110
+ // 'Worker' 문자열이 없으면 변환을 건너뛴다
111
+ if (!sourceFile.text.includes("Worker")) {
112
+ return sourceFile;
113
+ }
114
+ return ts.visitEachChild(sourceFile, visitNode, context);
115
+ };
116
+ };
117
+ }
@@ -95,7 +95,7 @@ export class Capacitor {
95
95
  * 5. cap sync 또는 cap copy 실행
96
96
  */
97
97
  async initialize(): Promise<void> {
98
- Capacitor._logger.debug("initialize 시작");
98
+ Capacitor._logger.start("initialize 중...");
99
99
  await this._acquireLock();
100
100
 
101
101
  try {
@@ -152,8 +152,8 @@ export class Capacitor {
152
152
  }
153
153
  } finally {
154
154
  await this._releaseLock();
155
- Capacitor._logger.debug("initialize 완료");
156
155
  }
156
+ Capacitor._logger.success("initialize 완료");
157
157
  }
158
158
 
159
159
  //#region Private - 명령어 실행
@@ -278,6 +278,7 @@ export class Capacitor {
278
278
  * 3. cap run — 기기에서 앱 실행
279
279
  */
280
280
  async run(url: string): Promise<void> {
281
+ Capacitor._logger.start(`run 중... (url: ${url})`);
281
282
  Capacitor._logger.debug(`server.url 설정: ${url}`);
282
283
  await updateServerUrl(this._capPath, url);
283
284
 
@@ -321,6 +322,7 @@ export class Capacitor {
321
322
  throw err;
322
323
  }
323
324
  }
325
+ Capacitor._logger.success("run 완료");
324
326
  }
325
327
 
326
328
  //#endregion
@@ -336,7 +338,7 @@ export class Capacitor {
336
338
  * 4. 빌드 산출물 복사
337
339
  */
338
340
  async build(outPath: string): Promise<void> {
339
- Capacitor._logger.debug("build 시작");
341
+ Capacitor._logger.start("build 중...");
340
342
 
341
343
  // 1. 웹 에셋 동기화
342
344
  Capacitor._logger.debug("cap copy 시작");
@@ -380,7 +382,7 @@ export class Capacitor {
380
382
  );
381
383
  Capacitor._logger.debug("빌드 산출물 복사 완료");
382
384
 
383
- Capacitor._logger.debug("build 완료");
385
+ Capacitor._logger.success("build 완료");
384
386
  }
385
387
 
386
388
  //#endregion
@@ -1,4 +1,3 @@
1
- import { cpx } from "@simplysm/core-node";
2
1
  import { err as errNs } from "@simplysm/core-common";
3
2
  import { executeTypecheck, type TypecheckResult } from "../orchestrators/TypecheckOrchestrator";
4
3
  import { executeLint, type LintResult } from "../lint/lint-core";
@@ -8,7 +7,7 @@ import { runLintInWorker } from "../lint/lint-utils";
8
7
 
9
8
  //#region Types
10
9
 
11
- export type CheckType = "typecheck" | "lint" | "test";
10
+ export type CheckType = "typecheck" | "lint";
12
11
 
13
12
  export interface CheckOptions {
14
13
  targets: string[];
@@ -26,62 +25,6 @@ interface CheckResult {
26
25
 
27
26
  //#endregion
28
27
 
29
- //#region Utilities
30
-
31
- async function spawnVitest(targets: string[]): Promise<CheckResult> {
32
- const logger = consola.withTag("sd:cli:test");
33
- try {
34
- const args = ["vitest", ...targets, "--run"];
35
- logger.debug("vitest 실행", { args });
36
- logger.start("테스트 실행 중...");
37
- const result = await cpx.spawn("pnpm", args, {
38
- cwd: process.cwd(),
39
- reject: false,
40
- stdio: "inherit",
41
- });
42
- const code = result.exitCode;
43
-
44
- logger.success("테스트 실행 완료");
45
- logger.info("테스트 완료", { errorCount: code === 0 ? 0 : 1, warningCount: 0 });
46
-
47
- return {
48
- name: "TEST",
49
- success: code === 0,
50
- errorCount: code === 0 ? 0 : 1,
51
- warningCount: 0,
52
- formattedOutput: "",
53
- };
54
- } catch (err) {
55
- logger.fail("테스트 실행 실패");
56
- return {
57
- name: "TEST",
58
- success: false,
59
- errorCount: 1,
60
- warningCount: 0,
61
- formattedOutput: errNs.message(err),
62
- };
63
- }
64
- }
65
-
66
- function formatSection(result: CheckResult): string {
67
- const header = `\n${"=".repeat(6)} ${result.name} ${"=".repeat(6)}`;
68
- const icon = result.success ? "✔" : "✖";
69
-
70
- let summary: string;
71
- if (result.name === "TEST") {
72
- const testCount = result.errorCount > 0 ? `${result.errorCount}개 실패` : "";
73
- summary = result.success ? `${icon} 통과` : `${icon} ${testCount}`;
74
- } else {
75
- summary = `${icon} ${result.errorCount}개 에러, ${result.warningCount}개 경고`;
76
- }
77
-
78
- const detail = !result.success && result.formattedOutput ? `\n${result.formattedOutput}` : "";
79
-
80
- return `${header}\n${summary}${detail}`;
81
- }
82
-
83
- //#endregion
84
-
85
28
  //#region Main
86
29
 
87
30
  export async function runCheck(options: CheckOptions): Promise<void> {
@@ -102,8 +45,7 @@ export async function runCheck(options: CheckOptions): Promise<void> {
102
45
 
103
46
  const needsTypecheck = types.includes("typecheck");
104
47
  const needsLint = types.includes("lint");
105
- const needsTest = types.includes("test");
106
- logger.debug("체크 구성", { needsTypecheck, needsLint, needsTest });
48
+ logger.debug("체크 구성", { needsTypecheck, needsLint });
107
49
 
108
50
  logger.start(`체크 실행 중... (${types.join(", ")})`);
109
51
 
@@ -177,11 +119,6 @@ export async function runCheck(options: CheckOptions): Promise<void> {
177
119
  );
178
120
  }
179
121
 
180
- // 테스트 (서브프로세스)
181
- if (needsTest) {
182
- tasks.push(spawnVitest(normalizedTargets));
183
- }
184
-
185
122
  const results = await Promise.allSettled(tasks);
186
123
  logger.success("체크 실행 완료");
187
124
 
@@ -200,12 +137,20 @@ export async function runCheck(options: CheckOptions): Promise<void> {
200
137
  }];
201
138
  });
202
139
 
203
- // 섹션별 출력 (순서 보장: typecheck → lint → test)
204
- const order = ["TYPECHECK", "LINT", "TEST"];
140
+ // 섹션별 출력 (순서 보장: typecheck → lint)
141
+ const order = ["TYPECHECK", "LINT"];
205
142
  checkResults.sort((a, b) => order.indexOf(a.name) - order.indexOf(b.name));
206
143
 
207
144
  for (const result of checkResults) {
208
- process.stdout.write(formatSection(result));
145
+ const header = `${result.name}: ${result.errorCount}개 에러, ${result.warningCount}개 경고`;
146
+ if (result.success) {
147
+ logger.success(header);
148
+ } else {
149
+ logger.error(header);
150
+ if (result.formattedOutput !== "") {
151
+ logger.error(result.formattedOutput);
152
+ }
153
+ }
209
154
  }
210
155
 
211
156
  // 요약
@@ -213,17 +158,13 @@ export async function runCheck(options: CheckOptions): Promise<void> {
213
158
  const totalErrors = checkResults.reduce((sum, r) => sum + r.errorCount, 0);
214
159
  const totalWarnings = checkResults.reduce((sum, r) => sum + r.warningCount, 0);
215
160
 
216
- process.stdout.write(`\n\n${"=".repeat(6)} 요약 ${"=".repeat(6)}\n`);
217
-
218
161
  if (failed.length === 0) {
219
- process.stdout.write(`✔ 전체 통과\n`);
162
+ logger.success(`전체 통과 — 합계: ${totalErrors}개 에러, ${totalWarnings}개 경고`);
220
163
  } else {
221
164
  const failedNames = failed.map((r) => r.name.toLowerCase()).join(", ");
222
- process.stdout.write(`✖ ${failed.length}/${checkResults.length}개 실패 (${failedNames})\n`);
223
- }
224
- process.stdout.write(`합계: ${totalErrors}개 에러, ${totalWarnings}개 경고\n`);
225
-
226
- if (failed.length > 0) {
165
+ logger.error(
166
+ `${failed.length}/${checkResults.length}개 실패 (${failedNames}) — 합계: ${totalErrors}개 에러, ${totalWarnings}개 경고`,
167
+ );
227
168
  process.exitCode = 1;
228
169
  }
229
170
  }
@@ -63,17 +63,21 @@ export async function runDeployment(
63
63
  for (let attempt = 1; attempt <= maxRetries; attempt++) {
64
64
  try {
65
65
  await publishPackage(pkg.path, pkg.config, version, projectPath, logger, dryRun);
66
- logger.debug(dryRun ? `[DRY-RUN] ${pkg.name}` : pkg.name);
66
+ if (dryRun) {
67
+ logger.info(`[DRY-RUN] ${pkg.name}`);
68
+ } else {
69
+ logger.debug(pkg.name);
70
+ }
67
71
  publishedPackages.push(pkg.name);
68
72
  return { status: "success" as const, name: pkg.name };
69
73
  } catch (err) {
70
74
  if (attempt < maxRetries) {
71
75
  const delay = attempt * 5_000;
72
- logger.debug(
73
- dryRun
74
- ? `[DRY-RUN] ${pkg.name} (retry ${attempt + 1}/${maxRetries})`
75
- : `${pkg.name} (retry ${attempt + 1}/${maxRetries})`,
76
- );
76
+ if (dryRun) {
77
+ logger.info(`[DRY-RUN] ${pkg.name} (retry ${attempt + 1}/${maxRetries})`);
78
+ } else {
79
+ logger.debug(`${pkg.name} (retry ${attempt + 1}/${maxRetries})`);
80
+ }
77
81
  await new Promise((resolve) => setTimeout(resolve, delay));
78
82
  } else {
79
83
  throw err;
@@ -95,7 +99,7 @@ export async function runDeployment(
95
99
  for (const r of rejectedResults) {
96
100
  logger.error(r.reason instanceof Error ? r.reason.message : r.reason);
97
101
  }
98
- logger.fail(`Level ${levelIdx + 1}/${levels.length}`);
102
+ logger.error(`Level ${levelIdx + 1}/${levels.length}`);
99
103
  } else {
100
104
  logger.success(`Level ${levelIdx + 1}/${levels.length}`);
101
105
  }
@@ -15,7 +15,7 @@ export async function publishNpm(
15
15
  const prereleaseInfo = semver.prerelease(version);
16
16
  const args = ["publish", "--access", "public", "--no-git-checks"];
17
17
 
18
- if (prereleaseInfo !== null && typeof prereleaseInfo[0] === "string") {
18
+ if (prereleaseInfo != null && typeof prereleaseInfo[0] === "string") {
19
19
  args.push("--tag", prereleaseInfo[0]);
20
20
  }
21
21
 
@@ -118,7 +118,7 @@ export async function runPublish(options: PublishOptions): Promise<void> {
118
118
  }
119
119
 
120
120
  if (publishPackages.length === 0) {
121
- process.stdout.write("배포할 패키지가 없습니다.\n");
121
+ logger.info("배포할 패키지가 없습니다.");
122
122
  return;
123
123
  }
124
124
 
@@ -33,7 +33,7 @@ export async function upgradeVersion(
33
33
 
34
34
  // 프리릴리스 여부에 따라 증가 전략 결정
35
35
  const newVersion =
36
- prereleaseInfo !== null
36
+ prereleaseInfo != null
37
37
  ? semver.inc(currentVersion, "prerelease")!
38
38
  : semver.inc(currentVersion, "patch")!;
39
39
 
@@ -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 }> = [];