@simplysm/sd-cli 14.0.41 โ†’ 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 +7 -6
  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
@@ -0,0 +1,49 @@
1
+ import { describe, it, expect, beforeEach, afterEach } from "vitest";
2
+ import fs from "fs";
3
+ import os from "os";
4
+ import path from "path";
5
+ import { collectDeps } from "../../../src/deps/replace-deps/collect-deps";
6
+ import { pathx } from "@simplysm/core-node";
7
+
8
+ describe("collectDeps", () => {
9
+ let tmpDir: string;
10
+
11
+ beforeEach(() => {
12
+ tmpDir = pathx.posix(fs.mkdtempSync(path.join(os.tmpdir(), "sd-cli-test-")));
13
+ });
14
+
15
+ afterEach(() => {
16
+ fs.rmSync(tmpDir, { recursive: true, force: true });
17
+ });
18
+
19
+ function createPkg(relDir: string, name: string, deps: Record<string, string> = {}): void {
20
+ const dir = pathx.posix(path.join(tmpDir, relDir));
21
+ fs.mkdirSync(dir, { recursive: true });
22
+ fs.writeFileSync(
23
+ pathx.posix(path.join(dir, "package.json")),
24
+ JSON.stringify({ name, dependencies: deps }),
25
+ );
26
+ }
27
+
28
+ it("tests/ ํŒจํ‚ค์ง€๋งŒ ์˜์กดํ•˜๋ฉด workspaceDeps๊ฐ€ ๋นˆ ๋ฐฐ์—ด์ด๋‹ค", () => {
29
+ createPkg("tests/orm", "@test/orm");
30
+ createPkg("tests/service", "@test/service");
31
+ createPkg("packages/my-lib", "@test/my-lib", {
32
+ "@test/orm": "workspace:*",
33
+ "@test/service": "workspace:*",
34
+ });
35
+
36
+ const result = collectDeps(pathx.posix(path.join(tmpDir, "packages/my-lib")), tmpDir);
37
+
38
+ expect(result.workspaceDeps).toEqual([]);
39
+ });
40
+
41
+ it("์˜์กด์„ฑ์ด ์—†๋Š” ํŒจํ‚ค์ง€๋Š” ๋นˆ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค", () => {
42
+ createPkg("packages/my-lib", "@test/my-lib");
43
+
44
+ const result = collectDeps(pathx.posix(path.join(tmpDir, "packages/my-lib")), tmpDir);
45
+
46
+ expect(result.workspaceDeps).toEqual([]);
47
+ expect(result.replaceDeps).toEqual([]);
48
+ });
49
+ });
@@ -0,0 +1,103 @@
1
+ import { describe, it, expect, beforeEach, afterEach } from "vitest";
2
+ import fs from "fs";
3
+ import path from "path";
4
+ import os from "os";
5
+ import { pathx } from "@simplysm/core-node";
6
+ import {
7
+ createCopyFilter,
8
+ loadFilesField,
9
+ NPM_DEFAULT_FILE_PATTERN,
10
+ } from "../../../src/deps/replace-deps/replace-deps";
11
+
12
+ describe("NPM_DEFAULT_FILE_PATTERN", () => {
13
+ it("README ๋ณ€ํ˜•์„ ๋งค์นญํ•œ๋‹ค", () => {
14
+ expect(NPM_DEFAULT_FILE_PATTERN.test("README")).toBe(true);
15
+ expect(NPM_DEFAULT_FILE_PATTERN.test("README.md")).toBe(true);
16
+ expect(NPM_DEFAULT_FILE_PATTERN.test("readme.txt")).toBe(true);
17
+ });
18
+
19
+ it("LICENSE/LICENCE ๋ณ€ํ˜•์„ ๋งค์นญํ•œ๋‹ค", () => {
20
+ expect(NPM_DEFAULT_FILE_PATTERN.test("LICENSE")).toBe(true);
21
+ expect(NPM_DEFAULT_FILE_PATTERN.test("LICENCE")).toBe(true);
22
+ expect(NPM_DEFAULT_FILE_PATTERN.test("license.md")).toBe(true);
23
+ });
24
+
25
+ it("CHANGELOG/HISTORY ๋ณ€ํ˜•์„ ๋งค์นญํ•œ๋‹ค", () => {
26
+ expect(NPM_DEFAULT_FILE_PATTERN.test("CHANGELOG")).toBe(true);
27
+ expect(NPM_DEFAULT_FILE_PATTERN.test("CHANGELOG.md")).toBe(true);
28
+ expect(NPM_DEFAULT_FILE_PATTERN.test("HISTORY.md")).toBe(true);
29
+ });
30
+
31
+ it("๊ด€๋ จ์—†๋Š” ํŒŒ์ผ๋ช…์€ ๋งค์นญํ•˜์ง€ ์•Š๋Š”๋‹ค", () => {
32
+ expect(NPM_DEFAULT_FILE_PATTERN.test("tsconfig.json")).toBe(false);
33
+ expect(NPM_DEFAULT_FILE_PATTERN.test("CLAUDE.md")).toBe(false);
34
+ expect(NPM_DEFAULT_FILE_PATTERN.test("package.json")).toBe(false);
35
+ });
36
+ });
37
+
38
+ describe("createCopyFilter", () => {
39
+ const sourcePath = "/source/pkg";
40
+
41
+ it("allowedNames์— ํฌํ•จ๋œ ์ฒซ ๋ฒˆ์งธ ์„ธ๊ทธ๋จผํŠธ๋Š” ํ—ˆ์šฉํ•œ๋‹ค", () => {
42
+ const filter = createCopyFilter(sourcePath, new Set(["dist", "src"]));
43
+
44
+ expect(filter(path.join(sourcePath, "dist"))).toBe(true);
45
+ expect(filter(path.join(sourcePath, "src"))).toBe(true);
46
+ expect(filter(path.join(sourcePath, "dist", "index.js"))).toBe(true);
47
+ expect(filter(path.join(sourcePath, "src", "utils", "helper.ts"))).toBe(true);
48
+ });
49
+
50
+ it("allowedNames์— ์—†๋Š” ํ•ญ๋ชฉ์€ ๊ฑฐ๋ถ€ํ•œ๋‹ค", () => {
51
+ const filter = createCopyFilter(sourcePath, new Set(["dist", "src"]));
52
+
53
+ expect(filter(path.join(sourcePath, "tsconfig.json"))).toBe(false);
54
+ expect(filter(path.join(sourcePath, "CLAUDE.md"))).toBe(false);
55
+ expect(filter(path.join(sourcePath, "node_modules"))).toBe(false);
56
+ });
57
+
58
+ it("package.json์€ ํ•ญ์ƒ ๊ฑฐ๋ถ€ํ•œ๋‹ค", () => {
59
+ const filter = createCopyFilter(sourcePath, new Set(["dist", "src"]));
60
+
61
+ expect(filter(path.join(sourcePath, "package.json"))).toBe(false);
62
+ });
63
+
64
+ it("npm ๊ธฐ๋ณธ ํŒŒ์ผ ํŒจํ„ด์€ allowedNames์— ์—†์–ด๋„ ํ—ˆ์šฉํ•œ๋‹ค", () => {
65
+ const filter = createCopyFilter(sourcePath, new Set(["dist"]));
66
+
67
+ expect(filter(path.join(sourcePath, "README.md"))).toBe(true);
68
+ expect(filter(path.join(sourcePath, "LICENSE"))).toBe(true);
69
+ expect(filter(path.join(sourcePath, "CHANGELOG.md"))).toBe(true);
70
+ });
71
+ });
72
+
73
+ describe("loadFilesField", () => {
74
+ let tmpDir: string;
75
+
76
+ beforeEach(async () => {
77
+ tmpDir = pathx.posix(await fs.promises.mkdtemp(path.join(os.tmpdir(), "sd-load-files-")));
78
+ });
79
+
80
+ afterEach(async () => {
81
+ await fs.promises.rm(tmpDir, { recursive: true, force: true });
82
+ });
83
+
84
+ it("files ํ•„๋“œ๊ฐ€ ์žˆ์œผ๋ฉด ๋ฌธ์ž์—ด ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค", async () => {
85
+ await fs.promises.writeFile(
86
+ pathx.posix(path.join(tmpDir, "package.json")),
87
+ JSON.stringify({ name: "test", files: ["dist", "src"] }),
88
+ );
89
+
90
+ const result = await loadFilesField(tmpDir);
91
+ expect(result).toEqual(["dist", "src"]);
92
+ });
93
+
94
+ it("files ํ•„๋“œ๊ฐ€ ์—†์œผ๋ฉด undefined๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค", async () => {
95
+ await fs.promises.writeFile(
96
+ pathx.posix(path.join(tmpDir, "package.json")),
97
+ JSON.stringify({ name: "test" }),
98
+ );
99
+
100
+ const result = await loadFilesField(tmpDir);
101
+ expect(result).toBeUndefined();
102
+ });
103
+ });
@@ -0,0 +1,156 @@
1
+ import { describe, it, expect, beforeEach, afterEach } from "vitest";
2
+ import fs from "fs";
3
+ import path from "path";
4
+ import os from "os";
5
+ import { setupReplaceDeps } from "../../../src/deps/replace-deps/replace-deps";
6
+ import { pathx } from "@simplysm/core-node";
7
+
8
+ describe("setupReplaceDeps ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ ๋ณต์‚ฌ", () => {
9
+ let tmpDir: string;
10
+
11
+ beforeEach(async () => {
12
+ tmpDir = pathx.posix(await fs.promises.mkdtemp(path.join(os.tmpdir(), "sd-replace-deps-")));
13
+
14
+ // pnpm-workspace.yaml
15
+ const projectRoot = pathx.posix(path.join(tmpDir, "project"));
16
+ await fs.promises.mkdir(projectRoot, { recursive: true });
17
+ await fs.promises.writeFile(
18
+ pathx.posix(path.join(projectRoot, "pnpm-workspace.yaml")),
19
+ "packages:\n",
20
+ );
21
+
22
+ // ํƒ€๊ฒŸ (node_modules์— ๊ธฐ์กด ํŒจํ‚ค์ง€)
23
+ const targetPkgDir = pathx.posix(
24
+ path.join(projectRoot, "node_modules", "@test", "pkg"),
25
+ );
26
+ await fs.promises.mkdir(targetPkgDir, { recursive: true });
27
+ await fs.promises.writeFile(
28
+ pathx.posix(path.join(targetPkgDir, "package.json")),
29
+ JSON.stringify({ name: "@test/pkg", version: "2.0.0" }),
30
+ );
31
+ });
32
+
33
+ afterEach(async () => {
34
+ await fs.promises.rm(tmpDir, { recursive: true, force: true });
35
+ });
36
+
37
+ /**
38
+ * ์†Œ์Šค ํŒจํ‚ค์ง€๋ฅผ ์ƒ์„ฑํ•˜๋Š” ํ—ฌํผ
39
+ */
40
+ async function createSourcePkg(opts: {
41
+ files?: string[];
42
+ extraFiles?: Record<string, string>;
43
+ }): Promise<string> {
44
+ const sourcePath = pathx.posix(path.join(tmpDir, "source-pkg"));
45
+ await fs.promises.mkdir(sourcePath, { recursive: true });
46
+
47
+ // package.json
48
+ const pkgJson: Record<string, unknown> = { name: "@test/pkg", version: "1.0.0" };
49
+ if (opts.files != null) {
50
+ pkgJson["files"] = opts.files;
51
+ }
52
+ await fs.promises.writeFile(
53
+ pathx.posix(path.join(sourcePath, "package.json")),
54
+ JSON.stringify(pkgJson),
55
+ );
56
+
57
+ // ๊ธฐ๋ณธ ๋””๋ ‰ํ† ๋ฆฌ/ํŒŒ์ผ ์ƒ์„ฑ
58
+ await fs.promises.mkdir(pathx.posix(path.join(sourcePath, "dist")), { recursive: true });
59
+ await fs.promises.writeFile(
60
+ pathx.posix(path.join(sourcePath, "dist", "index.js")),
61
+ "module.exports = {};",
62
+ );
63
+ await fs.promises.mkdir(pathx.posix(path.join(sourcePath, "src")), { recursive: true });
64
+ await fs.promises.writeFile(
65
+ pathx.posix(path.join(sourcePath, "src", "index.ts")),
66
+ "export const v = 1;",
67
+ );
68
+ // files์— ์—†๋Š” ํŒŒ์ผ๋“ค
69
+ await fs.promises.writeFile(
70
+ pathx.posix(path.join(sourcePath, "tsconfig.json")),
71
+ "{}",
72
+ );
73
+ await fs.promises.writeFile(
74
+ pathx.posix(path.join(sourcePath, "CLAUDE.md")),
75
+ "# CLAUDE",
76
+ );
77
+
78
+ // ์ถ”๊ฐ€ ํŒŒ์ผ
79
+ if (opts.extraFiles != null) {
80
+ for (const [relPath, content] of Object.entries(opts.extraFiles)) {
81
+ const fullPath = pathx.posix(path.join(sourcePath, relPath));
82
+ await fs.promises.mkdir(pathx.posix(path.dirname(fullPath)), { recursive: true });
83
+ await fs.promises.writeFile(fullPath, content);
84
+ }
85
+ }
86
+
87
+ return sourcePath;
88
+ }
89
+
90
+ it("files์— ํฌํ•จ๋œ ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ ๋ณต์‚ฌ๋˜๊ณ , files์— ์—†๋Š” ํŒŒ์ผ์€ ๋ณต์‚ฌ๋˜์ง€ ์•Š๋Š”๋‹ค", async () => {
91
+ const sourcePath = await createSourcePkg({ files: ["dist", "src"] });
92
+ const projectRoot = pathx.posix(path.join(tmpDir, "project"));
93
+ const targetPkgDir = pathx.posix(
94
+ path.join(projectRoot, "node_modules", "@test", "pkg"),
95
+ );
96
+
97
+ await setupReplaceDeps(projectRoot, { "@test/pkg": sourcePath });
98
+
99
+ // files์— ํฌํ•จ๋œ ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ ๋ณต์‚ฌ๋จ
100
+ expect(fs.existsSync(pathx.posix(path.join(targetPkgDir, "dist", "index.js")))).toBe(true);
101
+ expect(fs.existsSync(pathx.posix(path.join(targetPkgDir, "src", "index.ts")))).toBe(true);
102
+
103
+ // files์— ์—†๋Š” ํŒŒ์ผ์€ ๋ณต์‚ฌ๋˜์ง€ ์•Š์Œ
104
+ expect(fs.existsSync(pathx.posix(path.join(targetPkgDir, "tsconfig.json")))).toBe(false);
105
+ expect(fs.existsSync(pathx.posix(path.join(targetPkgDir, "CLAUDE.md")))).toBe(false);
106
+ });
107
+
108
+ it("npm ๊ธฐ๋ณธ ํฌํ•จ ํŒŒ์ผ(README, LICENSE)์€ files์— ์—†์–ด๋„ ๋ณต์‚ฌ๋œ๋‹ค", async () => {
109
+ const sourcePath = await createSourcePkg({
110
+ files: ["dist", "src"],
111
+ extraFiles: {
112
+ "README.md": "# README",
113
+ "LICENSE": "MIT License",
114
+ },
115
+ });
116
+ const projectRoot = pathx.posix(path.join(tmpDir, "project"));
117
+ const targetPkgDir = pathx.posix(
118
+ path.join(projectRoot, "node_modules", "@test", "pkg"),
119
+ );
120
+
121
+ await setupReplaceDeps(projectRoot, { "@test/pkg": sourcePath });
122
+
123
+ expect(fs.existsSync(pathx.posix(path.join(targetPkgDir, "README.md")))).toBe(true);
124
+ expect(fs.existsSync(pathx.posix(path.join(targetPkgDir, "LICENSE")))).toBe(true);
125
+ });
126
+
127
+ it("package.json์€ ๋ณต์‚ฌ๋˜์ง€ ์•Š๊ณ  ๋Œ€์ƒ์˜ ๊ธฐ์กด package.json์ด ๋ณด์กด๋œ๋‹ค", async () => {
128
+ const sourcePath = await createSourcePkg({ files: ["dist", "src"] });
129
+ const projectRoot = pathx.posix(path.join(tmpDir, "project"));
130
+ const targetPkgDir = pathx.posix(
131
+ path.join(projectRoot, "node_modules", "@test", "pkg"),
132
+ );
133
+
134
+ await setupReplaceDeps(projectRoot, { "@test/pkg": sourcePath });
135
+
136
+ // ๋Œ€์ƒ์˜ ๊ธฐ์กด package.json์ด ๋ณด์กด๋จ (์†Œ์Šค์˜ ๊ฒƒ์œผ๋กœ ๋ฎ์–ด์”Œ์›Œ์ง€์ง€ ์•Š์Œ)
137
+ const targetPkgJson = JSON.parse(
138
+ fs.readFileSync(pathx.posix(path.join(targetPkgDir, "package.json")), "utf-8"),
139
+ );
140
+ expect(targetPkgJson.version).toBe("2.0.0");
141
+ });
142
+
143
+ it("files ํ•„๋“œ๊ฐ€ ์—†๋Š” ํŒจํ‚ค์ง€๋Š” ๊ฑด๋„ˆ๋›ฐ๊ณ  ๋ณต์‚ฌํ•˜์ง€ ์•Š๋Š”๋‹ค", async () => {
144
+ const sourcePath = await createSourcePkg({ files: undefined });
145
+ const projectRoot = pathx.posix(path.join(tmpDir, "project"));
146
+ const targetPkgDir = pathx.posix(
147
+ path.join(projectRoot, "node_modules", "@test", "pkg"),
148
+ );
149
+
150
+ await setupReplaceDeps(projectRoot, { "@test/pkg": sourcePath });
151
+
152
+ // ๋ณต์‚ฌ๊ฐ€ ์ˆ˜ํ–‰๋˜์ง€ ์•Š์Œ
153
+ expect(fs.existsSync(pathx.posix(path.join(targetPkgDir, "dist")))).toBe(false);
154
+ expect(fs.existsSync(pathx.posix(path.join(targetPkgDir, "src")))).toBe(false);
155
+ });
156
+ });
@@ -70,7 +70,10 @@ vi.mock("esbuild", () => ({
70
70
  const mockLoggerDebug = vi.fn();
71
71
  const mockLoggerWarn = vi.fn();
72
72
  const mockLoggerInfo = vi.fn();
73
- vi.spyOn(consola, "withTag").mockReturnValue({ debug: mockLoggerDebug, warn: mockLoggerWarn, info: mockLoggerInfo } as any);
73
+ const mockLoggerStart = vi.fn();
74
+ const mockLoggerSuccess = vi.fn();
75
+ const mockLoggerError = vi.fn();
76
+ vi.spyOn(consola, "withTag").mockReturnValue({ debug: mockLoggerDebug, warn: mockLoggerWarn, info: mockLoggerInfo, start: mockLoggerStart, success: mockLoggerSuccess, error: mockLoggerError } as any);
74
77
 
75
78
  //#endregion
76
79
 
@@ -49,7 +49,6 @@ describe("NgtscEngine adapter isolation", () => {
49
49
 
50
50
  const filesToCheck = [
51
51
  path.join(sdCliSrc, "engines", "NgtscEngine.ts"),
52
- path.join(sdCliSrc, "workers", "ngtsc-build.worker.ts"),
53
52
  path.join(sdCliSrc, "angular", "ngtsc-build-core.ts"),
54
53
  path.join(sdCliSrc, "utils", "output-path-rewriter.ts"),
55
54
  ];
@@ -68,13 +67,13 @@ describe("NgtscEngine adapter isolation", () => {
68
67
 
69
68
  it("all Angular API access goes through angular-compiler.ts adapter", () => {
70
69
 
71
- // Angular API ์ ‘๊ทผ์€ angular-build-pipeline.ts๋ฅผ ํ†ตํ•ด angular-compiler.ts๋กœ ์ด๋ฃจ์–ด์ง„๋‹ค
72
- const buildPipeline = path.resolve(
70
+ // Angular API ์ ‘๊ทผ์€ ngtsc-build-core.ts โ†’ angular-compiler.ts ๋˜๋Š” SdTsCompiler โ†’ angular-compiler.ts๋กœ ์ด๋ฃจ์–ด์ง„๋‹ค
71
+ const compilerFile = path.resolve(
73
72
  import.meta.dirname,
74
- "../../src/angular/angular-build-pipeline.ts",
73
+ "../../src/ts-compiler/SdTsCompiler.ts",
75
74
  );
76
- const content = fs.readFileSync(buildPipeline, "utf-8");
75
+ const content = fs.readFileSync(compilerFile, "utf-8");
77
76
 
78
- expect(content).toContain("./angular-compiler");
77
+ expect(content).toContain("angular-compiler");
79
78
  });
80
79
  });
@@ -0,0 +1,10 @@
1
+ # ์—”์ง„๋ณ„ ์ค‘๋ณต ์ถœ๋ ฅ ์ œ๊ฑฐ โ€” LLM ๊ฒ€์ฆ
2
+
3
+ ## ๊ฒ€์ฆ ํ•ญ๋ชฉ
4
+
5
+ - [x] esbuild-client-config.ts logLevel์ด ๋ชจ๋“  ๋ชจ๋“œ์—์„œ "silent"์ธ์ง€: `esbuild-client-config.ts:191` โ€” `logLevel: "silent"` ํ™•์ธ. ๊ธฐ์กด `isDev ? "warning" : "silent"` ์‚ผํ•ญ ์—ฐ์‚ฐ์ž ์ œ๊ฑฐ๋จ
6
+ - [x] EsbuildClientEngine์— ์ค‘๋ณต error ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์—†๋Š”์ง€: `EsbuildClientEngine.ts:103-110` โ€” setupWatchEvents๋งŒ error ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ. ๊ธฐ์กด `worker.on("error", ...)` ํ•ธ๋“ค๋Ÿฌ(logger.error ํ˜ธ์ถœ) ์ œ๊ฑฐ๋จ
7
+ - [x] EsbuildClientEngine ์ดˆ๊ธฐ ๋นŒ๋“œ ์‹คํŒจ ์‹œ logger.error ๋ฏธํ˜ธ์ถœ: `EsbuildClientEngine.ts:129-138` โ€” `!result.success` ๋ถ„๊ธฐ์—์„œ `resultCollector.add()`๋งŒ ํ˜ธ์ถœ. logger.error ์ค„ ์ œ๊ฑฐ๋จ
8
+ - [x] BaseEngine์— logger.warn() ๋ธ”๋ก์ด ์—†๋Š”์ง€: `BaseEngine.ts:166-180` โ€” build ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ์— lint ๊ฒฐ๊ณผ ๋ณด๊ณ ๋งŒ ์กด์žฌ. warnings์— ๋Œ€ํ•œ logger.warn() ๋ธ”๋ก ์ œ๊ฑฐ๋จ
9
+ - [x] BaseEngine startWatch ์‹คํŒจ ์‹œ logger.debug ์‚ฌ์šฉ: `BaseEngine.ts:182-183` โ€” `logger.debug(...)` ํ™•์ธ. ๊ธฐ์กด `logger.error(...)` โ†’ `logger.debug(...)` ๋ณ€๊ฒฝ๋จ
10
+ - [x] BaseEngine lint ๊ฒฐ๊ณผ ๋ณด๊ณ  ๋กœ์ง ์œ ์ง€: `BaseEngine.ts:170-179` โ€” `event.lint != null` ์กฐ๊ฑด์˜ ResultCollector ๋ณด๊ณ  ๋กœ์ง์ด ๊ทธ๋Œ€๋กœ ์œ ์ง€๋จ
@@ -163,6 +163,85 @@ describe("EsbuildClientEngine Acceptance", () => {
163
163
  await engine.stop();
164
164
  });
165
165
 
166
+ //#region Feature 2.1: ์ดˆ๊ธฐ ๋นŒ๋“œ warnings โ†’ ResultCollector
167
+
168
+ it("์ดˆ๊ธฐ ๋นŒ๋“œ ์„ฑ๊ณต + warnings โ†’ ResultCollector์— success + warnings ์ €์žฅ", async () => {
169
+ const mockResultCollector = { add: vi.fn() };
170
+
171
+ mockWorker.startWatch.mockResolvedValue({
172
+ success: true,
173
+ warnings: ["unused variable"],
174
+ });
175
+
176
+ const engine = new EsbuildClientEngine({
177
+ cwd: "/root",
178
+ pkg: createMockPkg(),
179
+ resultCollector: mockResultCollector as any,
180
+ });
181
+
182
+ await engine.startWatch({ js: true, dts: false });
183
+
184
+ const warningReport = mockResultCollector.add.mock.calls.find(
185
+ (c: any[]) => c[0].type === "build" && c[0].warnings != null,
186
+ );
187
+ expect(warningReport).toBeDefined();
188
+ expect(warningReport![0].status).toBe("success");
189
+ expect(warningReport![0].warnings).toBe("unused variable");
190
+
191
+ await engine.stop();
192
+ });
193
+
194
+ it("์ดˆ๊ธฐ ๋นŒ๋“œ ์‹คํŒจ + warnings โ†’ ResultCollector์— error + warnings ๋ชจ๋‘ ์ €์žฅ", async () => {
195
+ const mockResultCollector = { add: vi.fn() };
196
+
197
+ mockWorker.startWatch.mockResolvedValue({
198
+ success: false,
199
+ errors: ["type error"],
200
+ warnings: ["deprecated API"],
201
+ });
202
+
203
+ const engine = new EsbuildClientEngine({
204
+ cwd: "/root",
205
+ pkg: createMockPkg(),
206
+ resultCollector: mockResultCollector as any,
207
+ });
208
+
209
+ await engine.startWatch({ js: true, dts: false });
210
+
211
+ const errorReport = mockResultCollector.add.mock.calls.find(
212
+ (c: any[]) => c[0].type === "build" && c[0].status === "error",
213
+ );
214
+ expect(errorReport).toBeDefined();
215
+ expect(errorReport![0].message).toContain("type error");
216
+ expect(errorReport![0].warnings).toBe("deprecated API");
217
+
218
+ await engine.stop();
219
+ });
220
+
221
+ it("์ดˆ๊ธฐ ๋นŒ๋“œ ์„ฑ๊ณต + warnings ์—†์Œ โ†’ ResultCollector์— ์ถ”๊ฐ€ ์ €์žฅ ์—†์Œ", async () => {
222
+ const mockResultCollector = { add: vi.fn() };
223
+
224
+ mockWorker.startWatch.mockResolvedValue({ success: true });
225
+
226
+ const engine = new EsbuildClientEngine({
227
+ cwd: "/root",
228
+ pkg: createMockPkg(),
229
+ resultCollector: mockResultCollector as any,
230
+ });
231
+
232
+ await engine.startWatch({ js: true, dts: false });
233
+
234
+ // setupWatchEvents์— ์˜ํ•œ ํ˜ธ์ถœ์€ ์žˆ์„ ์ˆ˜ ์žˆ์œผ๋‚˜, startWatch ๊ฒฐ๊ณผ์— ์˜ํ•œ ์ถ”๊ฐ€ ์ €์žฅ์€ ์—†์Œ
235
+ const warningReport = mockResultCollector.add.mock.calls.find(
236
+ (c: any[]) => c[0].warnings != null,
237
+ );
238
+ expect(warningReport).toBeUndefined();
239
+
240
+ await engine.stop();
241
+ });
242
+
243
+ //#endregion
244
+
166
245
  // Scenario: ์—”์ง„ ์ค‘์ง€
167
246
  it("stop()์œผ๋กœ worker๋ฅผ ์ข…๋ฃŒํ•˜๊ณ  .dev-port๋ฅผ ์‚ญ์ œํ•œ๋‹ค", async () => {
168
247
  // Given: dev watch ๋ชจ๋“œ๊ฐ€ ์‹คํ–‰ ์ค‘์ด๋‹ค
@@ -271,7 +271,7 @@ describe("EsbuildClientEngine", () => {
271
271
  await engine.stop();
272
272
  });
273
273
 
274
- it("์ดˆ๊ธฐ ๋นŒ๋“œ ์‹คํŒจ ์‹œ ์—๋Ÿฌ๋ฅผ logger.error๋กœ ์ถœ๋ ฅํ•œ๋‹ค", async () => {
274
+ it("์ดˆ๊ธฐ ๋นŒ๋“œ ์‹คํŒจ ์‹œ rejectํ•˜์ง€ ์•Š๊ณ  ์ •์ƒ ์™„๋ฃŒ๋œ๋‹ค", async () => {
275
275
  mockWorker.startWatch.mockResolvedValue({
276
276
  success: false,
277
277
  errors: ["Module not found: @angular/core", "Syntax error in app.ts"],
@@ -280,8 +280,7 @@ describe("EsbuildClientEngine", () => {
280
280
  const engine = new EsbuildClientEngine({ cwd: "/root", pkg: createMockPkg() });
281
281
  await engine.startWatch({ js: true, dts: false });
282
282
 
283
- // startWatch๊ฐ€ rejectํ•˜์ง€ ์•Š๊ณ  ์ •์ƒ ์™„๋ฃŒ๋˜๋Š”์ง€ ํ™•์ธ (๊ธฐ์กด ๋™์ž‘ ์œ ์ง€)
284
- // ์—๋Ÿฌ ๋กœ๊น…์€ verify.md์—์„œ ๊ฒ€์ฆ
283
+ // startWatch๊ฐ€ rejectํ•˜์ง€ ์•Š๊ณ  ์ •์ƒ ์™„๋ฃŒ๋˜๋Š”์ง€ ํ™•์ธ
285
284
  expect(mockWorker.startWatch).toHaveBeenCalled();
286
285
 
287
286
  await engine.stop();
@@ -297,6 +296,77 @@ describe("EsbuildClientEngine", () => {
297
296
  await engine.stop();
298
297
  });
299
298
 
299
+ it("์ดˆ๊ธฐ ๋นŒ๋“œ ๏ฟฝ๏ฟฝ๊ณต + warnings ์‹œ ResultCollector์— success์™€ warnings๊ฐ€ ์ €์žฅ๋œ๋‹ค", async () => {
300
+ const mockResultCollector = { add: vi.fn(), get: vi.fn(), toMap: vi.fn() };
301
+ mockWorker.startWatch.mockResolvedValue({ success: true, warnings: ["w1", "w2"] });
302
+
303
+ const engine = new EsbuildClientEngine({
304
+ cwd: "/root",
305
+ pkg: createMockPkg(),
306
+ resultCollector: mockResultCollector as any,
307
+ });
308
+ await engine.startWatch({ js: true, dts: false });
309
+
310
+ const addCall = mockResultCollector.add.mock.calls.find(
311
+ (c: any[]) => c[0].warnings != null,
312
+ );
313
+ expect(addCall).toBeDefined();
314
+ expect(addCall![0]).toMatchObject({
315
+ status: "success",
316
+ warnings: "w1\nw2",
317
+ });
318
+
319
+ await engine.stop();
320
+ });
321
+
322
+ it("์ดˆ๊ธฐ ๋นŒ๋“œ ์‹คํŒจ + warnings ์‹œ ResultCollector์— ์—๋Ÿฌ์™€ ๊ฒฝ๊ณ  ๋ชจ๋‘ ์ €์žฅ๋œ๋‹ค", async () => {
323
+ const mockResultCollector = { add: vi.fn(), get: vi.fn(), toMap: vi.fn() };
324
+ mockWorker.startWatch.mockResolvedValue({
325
+ success: false,
326
+ errors: ["e1"],
327
+ warnings: ["w1"],
328
+ });
329
+
330
+ const engine = new EsbuildClientEngine({
331
+ cwd: "/root",
332
+ pkg: createMockPkg(),
333
+ resultCollector: mockResultCollector as any,
334
+ });
335
+ await engine.startWatch({ js: true, dts: false });
336
+
337
+ const errorResult = mockResultCollector.add.mock.calls.find(
338
+ (c: any[]) => c[0].status === "error",
339
+ );
340
+ expect(errorResult).toBeDefined();
341
+ expect(errorResult![0]).toMatchObject({
342
+ status: "error",
343
+ message: "e1",
344
+ warnings: "w1",
345
+ });
346
+
347
+ await engine.stop();
348
+ });
349
+
350
+ it("์ดˆ๊ธฐ ๋นŒ๋“œ ์„ฑ๊ณต + warnings ์—†์Œ ์‹œ ResultCollector์— ์ถ”๊ฐ€ ์ €์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค", async () => {
351
+ const mockResultCollector = { add: vi.fn(), get: vi.fn(), toMap: vi.fn() };
352
+ mockWorker.startWatch.mockResolvedValue({ success: true });
353
+
354
+ const engine = new EsbuildClientEngine({
355
+ cwd: "/root",
356
+ pkg: createMockPkg(),
357
+ resultCollector: mockResultCollector as any,
358
+ });
359
+ await engine.startWatch({ js: true, dts: false });
360
+
361
+ // setupWatchEvents์— ์˜ํ•œ add ํ˜ธ์ถœ๋งŒ ์žˆ๊ณ , ์ดˆ๊ธฐ ๋นŒ๋“œ ๊ฒฝ๋กœ์˜ add ํ˜ธ์ถœ์€ ์—†์–ด์•ผ ํ•œ๋‹ค
362
+ const directAdd = mockResultCollector.add.mock.calls.find(
363
+ (c: any[]) => c[0].target === "client" && (c[0].message != null || c[0].warnings != null),
364
+ );
365
+ expect(directAdd).toBeUndefined();
366
+
367
+ await engine.stop();
368
+ });
369
+
300
370
  it("scopeRebuild ์ด๋ฒคํŠธ๋ฅผ ๊ตฌ๋…ํ•˜์ง€ ์•Š๋Š”๋‹ค", async () => {
301
371
  mockWorker.startWatch.mockResolvedValue({ success: true });
302
372
 
@@ -0,0 +1,23 @@
1
+ # esbuild Angular Compiler Plugin โ€” ์ฆ๋ถ„ ๋นŒ๋“œ + HMR โ€” LLM ๊ฒ€์ฆ
2
+
3
+ ## ๊ฒ€์ฆ ํ•ญ๋ชฉ
4
+
5
+ - [x] **์ฆ๋ถ„ ๋นŒ๋“œ ์กฐ๊ฑด ํŒ๋‹จ**: `esbuild-angular-compiler-plugin.ts:200` โ€” `angularCompiler != null && sourceFileCache != null && sourceFileCache.modifiedFiles.size > 0`์œผ๋กœ ์ฆ๋ถ„ ๋นŒ๋“œ ๊ฐ์ง€. ์ฒซ ๋นŒ๋“œ๋Š” `angularCompiler == null` ๊ฒฝ๋กœ๋กœ ์ง„์ž….
6
+
7
+ - [x] **staleSourceFiles ์บก์ฒ˜ ํƒ€์ด๋ฐ**: `esbuild-angular-compiler-plugin.ts:208-219` โ€” `invalidate()` ํ˜ธ์ถœ ์ „์— ์ด์ „ `ts.Program`์—์„œ stale source files๋ฅผ ์บก์ฒ˜. `invalidate` ํ›„์—๋Š” ์บ์‹œ์—์„œ ์‚ญ์ œ๋˜๋ฏ€๋กœ ์ˆœ์„œ๊ฐ€ ์ค‘์š”.
8
+
9
+ - [x] **FileReferenceTracker.update โ†’ sourceFileCache.invalidate**: `esbuild-angular-compiler-plugin.ts:221-224` โ€” `referencedFileTracker.update()`๋กœ ์ „์ด์  ์˜์กด์„ฑ ํ™•์žฅ ํ›„ `invalidate()` ํ˜ธ์ถœ. ํ™•์žฅ๋œ ํŒŒ์ผ ์ง‘ํ•ฉ์ด ์ „๋‹ฌ๋จ.
10
+
11
+ - [x] **stale additionalResults ์ œ๊ฑฐ**: `esbuild-angular-compiler-plugin.ts:226-229` โ€” expandedModifiedFiles์˜ ๊ฐ ํŒŒ์ผ์— ๋Œ€ํ•ด `additionalResults.delete()` ํ˜ธ์ถœ.
12
+
13
+ - [x] **HMR ํ™œ์„ฑํ™” ์กฐ๊ฑด**: `esbuild-angular-compiler-plugin.ts:204-206` โ€” `templateUpdates != null && modifiedFiles.size <= 32`. 32๊ฐœ ์ดˆ๊ณผ ์‹œ HMR ๊ฑด๋„ˆ๋œ€.
14
+
15
+ - [x] **collectHmrCandidates ํ˜ธ์ถœ**: `esbuild-angular-compiler-plugin.ts:235-239` โ€” `ngtscProgram`๊ณผ `staleSourceFiles`๋ฅผ ์ „๋‹ฌ. `sourceFileCache.modifiedFiles`(ํ™•์žฅ ์ „ ์›๋ณธ)์„ ๋Œ€์ƒ์œผ๋กœ ๋ถ„์„.
16
+
17
+ - [x] **emitHmrUpdateModule ํ˜ธ์ถœ ๋ฐ null ์ฒ˜๋ฆฌ**: `esbuild-angular-compiler-plugin.ts:259-264` โ€” `emitHmrUpdateModule`์ด null/undefined ๋ฐ˜ํ™˜ ์‹œ break (templateUpdates ์ „ํŒŒ ์ค‘๋‹จ). NgCompiler API๋ฅผ Record ์บ์ŠคํŒ…์œผ๋กœ ์ ‘๊ทผ (ํƒ€์ž…์ด private์ด๋ฏ€๋กœ).
18
+
19
+ - [x] **templateUpdates Map ์ „ํŒŒ**: `esbuild-angular-compiler-plugin.ts:266` โ€” `pluginOptions.templateUpdates!.set(updateId, updateText)`๋กœ ์™ธ๋ถ€ Map์— ์ง์ ‘ ๊ธฐ๋ก.
20
+
21
+ - [x] **updateId ํ˜•์‹**: `esbuild-angular-compiler-plugin.ts:256-258` โ€” `encodeURIComponent("{relativePath}@{className}")`. relativePath๋Š” hostDir ๊ธฐ์ค€ ์ƒ๋Œ€๊ฒฝ๋กœ, ๋ฐฑ์Šฌ๋ž˜์‹œ๋ฅผ ์Šฌ๋ž˜์‹œ๋กœ ๋ณ€ํ™˜.
22
+
23
+ - [x] **hmr-candidates.ts ๊ตฌ์กฐ**: `hmr-candidates.ts` โ€” `collectHmrCandidates` ํ•จ์ˆ˜๊ฐ€ ์›๋ณธ `hmr-candidates.js`์˜ ๋กœ์ง์„ TypeScript๋กœ ์ด์‹. `analyzeFileUpdates`, `analyzeMetaUpdates`, `equalRangeText` ํ—ฌํผ ํฌํ•จ. SUPPORTED_FIELD_NAMES = {template, templateUrl, styles, styleUrl, stylesUrl}.
@@ -0,0 +1,21 @@
1
+ # onLoad ํ›… โ€” LLM ๊ฒ€์ฆ
2
+
3
+ ## ๊ฒ€์ฆ ํ•ญ๋ชฉ
4
+
5
+ - [x] TS onLoad ํ›…์ด `/\.[cm]?[jt]sx?$/` ํ•„ํ„ฐ๋กœ ๋“ฑ๋ก๋œ๋‹ค: :517 `build.onLoad({ filter: /\.[cm]?[jt]sx?$/ }, ...)`
6
+ - [x] JS onLoad ํ›…์ด `/\.[cm]?js$/` ํ•„ํ„ฐ๋กœ ๋“ฑ๋ก๋œ๋‹ค: :584 `build.onLoad({ filter: /\.[cm]?js$/ }, ...)`
7
+ - [x] TS onLoad: shouldTsIgnoreJs=true์ด๊ณ  JS ํŒŒ์ผ์ด๋ฉด undefined ๋ฐ˜ํ™˜: :522 `if (shouldTsIgnoreJs && isJS) return undefined`
8
+ - [x] TS onLoad: ์บ์‹œ ๋ฏธ์Šค + hasCompilationErrors์ด๋ฉด `{ contents: '', loader: 'js' }` ๋ฐ˜ํ™˜: :530
9
+ - [x] TS onLoad: ์บ์‹œ ๋ฏธ์Šค + allowJs + JS์ด๋ฉด undefined ๋ฐ˜ํ™˜: :535
10
+ - [x] TS onLoad: ์บ์‹œ ๋ฏธ์Šค + Angular ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ์—†์œผ๋ฉด warning ๋ฐ˜ํ™˜: :541-547
11
+ - [x] TS onLoad: ์บ์‹œ ๋ฏธ์Šค + Angular ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ์žˆ์œผ๋ฉด error ๋ฐ˜ํ™˜: :550-552
12
+ - [x] TS onLoad: string ์บ์‹œ + (useTypeScriptTranspilation || isJS)์ด๋ฉด transformData ํ˜ธ์ถœ โ†’ Uint8Array ์žฌ์บ์‹ฑ: :556-565
13
+ - [x] TS onLoad: Uint8Array ์บ์‹œ์ด๋ฉด ์žฌ๋ณ€ํ™˜ ์—†์ด ๊ทธ๋Œ€๋กœ ๋ฐ˜ํ™˜: :556 ์กฐ๊ฑด `typeof contents === "string"` โ€” Uint8Array๋Š” ์กฐ๊ฑด ๋ถˆ์ผ์น˜๋กœ ํ†ต๊ณผ
14
+ - [x] TS onLoad: loader ๊ฒฐ์ • โ€” (useTypeScriptTranspilation || isJS) โ†’ 'js', .tsx โ†’ 'tsx', ๊ธฐํƒ€ โ†’ 'ts': :569-574
15
+ - [x] JS onLoad: createCachedLoad(loadResultCache, callback)์œผ๋กœ ๋ž˜ํ•‘: :586
16
+ - [x] JS onLoad: transformFile(request, false, sideEffects) ํ˜ธ์ถœ: :589
17
+ - [x] hasSideEffects: advancedOptimizations=false โ†’ undefined ๋ฐ˜ํ™˜: :292-293
18
+ - [x] hasSideEffects: advancedOptimizations=true โ†’ build.resolve() ํ˜ธ์ถœ: :295-298
19
+ - [x] shouldTsIgnoreJs: onStart์—์„œ !compilerOptions.allowJs๋กœ ๊ฒฐ์ •: :405
20
+ - [x] useTypeScriptTranspilation: !isolatedModules || !!sourceMap || !!inlineSourceMap์œผ๋กœ ๊ฒฐ์ •: :406-407
21
+ - [x] loadResultCache ์˜ต์…˜์ด AngularCompilerPluginOptions์— ์ถ”๊ฐ€๋จ: :33
@@ -0,0 +1,16 @@
1
+ # onStart ์„œ๋ธŒํ•จ์ˆ˜ ์ถ”์ถœ โ€” LLM ๊ฒ€์ฆ
2
+
3
+ ## ๊ฒ€์ฆ ํ•ญ๋ชฉ
4
+
5
+ - [x] **handleIncrementalBuild ํด๋กœ์ € ๋ณ€์ˆ˜ ์ ‘๊ทผ**: `pluginOptions.sourceFileCache!` (314์ค„), `pluginOptions.templateUpdates` (316์ค„), `angularCompiler!` (322, 342, 345, 353์ค„), `referencedFileTracker` (332์ค„), `additionalResults` (339์ค„), `cwd` (359์ค„) โ€” ๋ชจ๋‘ setup ์Šค์ฝ”ํ”„(248-289์ค„)์—์„œ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ ์—†์ด ์ง์ ‘ ์ ‘๊ทผ. ์›๋ณธ์—์„œ `errors`/`warnings`๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„ ํŒŒ๋ผ๋ฏธํ„ฐ ๋ถˆํ•„์š” (lint ์—๋Ÿฌ๋กœ ํ™•์ธ, ์ œ๊ฑฐ)
6
+ - [x] **handleFirstBuild ํด๋กœ์ € ๋ณ€์ˆ˜ ์ ‘๊ทผ**: `pluginOptions` (378, 387-390์ค„), `preserveSymlinks` (381์ค„), `angularCompiler` (394์ค„ ๋Œ€์ž…), `shouldTsIgnoreJs` (398์ค„ ๋Œ€์ž…), `useTypeScriptTranspilation` (399์ค„ ๋Œ€์ž…) โ€” ๋ชจ๋‘ setup ์Šค์ฝ”ํ”„ ๋ณ€์ˆ˜ ์ง์ ‘ ์ ‘๊ทผ. ํŒŒ๋ผ๋ฏธํ„ฐ ์—†์Œ
7
+ - [x] **createWebWorkerProcessor ํด๋กœ์ € ๋ณ€์ˆ˜ ์ ‘๊ทผ**: `build` (410์ค„), `pluginOptions.sourcemap` (410์ค„), `cwd` (422, 437์ค„), `referencedFileTracker` (417, 435์ค„), `additionalResults` (424, 428์ค„) โ€” ๋ชจ๋‘ setup ์Šค์ฝ”ํ”„ ๋ณ€์ˆ˜ ์ง์ ‘ ์ ‘๊ทผ. `errors`/`warnings`๋งŒ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌ
8
+ - [x] **onStart ๋ฐ˜ํ™˜๊ฐ’ ๋™์ผ**: onStart ์ฝœ๋ฐฑ(456-526์ค„)์ด ๋™์ผํ•œ `result` ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ (`errors`/`warnings` ํ• ๋‹น ๋กœ์ง 523-525์ค„ ์œ ์ง€). ์ถ”์ถœ ์ „๊ณผ ๋™์ผํ•œ `{errors, warnings}` ๊ตฌ์กฐ
9
+ - [x] **๋‚ด๋ถ€ ์ƒํƒœ ๋ณ€ํ™” ๋™์ผ**: `handleIncrementalBuild`์—์„œ `sourceFileCache.invalidate()` (328์ค„), `additionalResults.delete()` (332์ค„), `angularCompiler.update()` (335์ค„), `templateUpdates.set()/clear()` (366, 370์ค„) โ€” ์›๋ณธ ์ฝ”๋“œ(316-383์ค„)์™€ ๋™์ผํ•œ mutation ์ˆœ์„œ์™€ ๋กœ์ง
10
+ - [x] **handleFirstBuild ์ƒํƒœ ์„ค์ •**: `angularCompiler = compiler` (394์ค„), `shouldTsIgnoreJs = !co.allowJs` (398์ค„), `useTypeScriptTranspilation` (399-400์ค„) โ€” ์›๋ณธ ์ฝ”๋“œ(384-409์ค„)์™€ ๋™์ผ
11
+ - [x] **HMR ์‹คํŒจ ์‹œ templateUpdates ์ดˆ๊ธฐํ™”**: `updateText === null || updateText === undefined` ์กฐ๊ฑด(364์ค„) โ†’ `pluginOptions.templateUpdates!.clear()` (366์ค„) + `break` (367์ค„) โ€” ์›๋ณธ๊ณผ ๋™์ผ
12
+ - [x] **Worker ๋นŒ๋“œ ์„ฑ๊ณต ๊ฒฝ๋กœ**: `additionalResults.set(fullWorkerPath, {outputFiles, metafile})` (428-431์ค„) โ†’ `workerCodeFile` ์ฐพ๊ธฐ (442-444์ค„) โ†’ ์ƒ๋Œ€ ๊ฒฝ๋กœ ๋ฐ˜ํ™˜ (450-451์ค„) โ€” ์›๋ณธ๊ณผ ๋™์ผ
13
+ - [x] **Worker ๋นŒ๋“œ ์‹คํŒจ ๊ฒฝ๋กœ**: `errors.push(...workerResult.errors)` (415์ค„) โ†’ `referencedFileTracker.add()` (417-423์ค„) โ†’ `additionalResults.set()` (424์ค„) โ†’ `return workerFile` (425์ค„) โ€” ์›๋ณธ๊ณผ ๋™์ผ
14
+ - [x] **onStart ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ ์ถ•์†Œ**: onStart ์ฝœ๋ฐฑ์ด 456-526์ค„ = ~70์ค„๋กœ ์ถ•์†Œ๋จ. ๊ตฌ์„ฑ: stylesheetErrors ๋ฆฌ์…‹(4์ค„) + ๋ถ„๊ธฐ ํ˜ธ์ถœ(5์ค„) + processWebWorker ์ƒ์„ฑ(1์ค„) + emit(5์ค„) + diagnostics(8์ค„) + stylesheet ๋ธŒ๋ฆฟ์ง•(12์ค„) + ์—๋Ÿฌ ํ•ธ๋“ค๋ง(13์ค„) + ๊ฒฐ๊ณผ ๋ฐ˜ํ™˜(3์ค„)
15
+ - [x] **onLoad/onEnd/onDispose ๋ฏธ๋ณ€๊ฒฝ**: 528์ค„ ์ดํ›„์˜ onLoad(528-593์ค„), onEnd(615-625์ค„), onDispose(628-632์ค„) ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Œ
16
+ - [x] **๊ธฐ์กด ํ…Œ์ŠคํŠธ 26๊ฐœ ํ†ต๊ณผ**: vitest run ์‹คํ–‰ ๊ฒฐ๊ณผ 26 passed, 0 failed
@@ -0,0 +1,15 @@
1
+ # esbuild-angular-compiler-plugin SdTsCompiler ์ „ํ™˜ โ€” LLM ๊ฒ€์ฆ
2
+
3
+ ## ๊ฒ€์ฆ ํ•ญ๋ชฉ
4
+
5
+ - [x] SdTsCompiler ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ: `:402-414` โ€” `new SdTsCompiler({ pkgDir: path.dirname(pluginOptions.tsconfig), cwd, output: { js: true, dts: false }, sourceFileCache, transformStylesheet, externalStylesheets, compilerOptionsTransformer })` ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ตฌ์„ฑ
6
+ - [x] compileAsync ํ˜ธ์ถœ: `:422-425` โ€” ์ฒซ ๋นŒ๋“œ ์‹œ `compileAsync(undefined, { additionalTransformers })`, ์ฆ๋ถ„ ๋นŒ๋“œ ์‹œ `compileAsync(expandedModifiedFiles, { additionalTransformers })`
7
+ - [x] emitResults โ†’ typeScriptFileCache ๋งคํ•‘: `:428-430` โ€” `compileResult.emitResults`๋ฅผ ์ˆœํšŒํ•˜์—ฌ `path.normalize(sourceFileName)` ํ‚ค๋กœ ์ €์žฅ
8
+ - [x] diagnostics ๋ณ€ํ™˜: `:441-448` โ€” `convertSerializedDiagnosticToEsbuild(d, compileResult.program, cwd)` ์‚ฌ์šฉ, `d.category` ๊ธฐ๋ฐ˜ ๋ถ„๋ฅ˜
9
+ - [x] HMR staleSourceFiles ์บก์ฒ˜: `:380-388` โ€” `lastResult.program.getSourceFile(modifiedFile)` ์‚ฌ์šฉ, compileAsync ์ „์— ์ˆ˜ํ–‰
10
+ - [x] HMR collectHmrCandidates: `:468-471` โ€” `compileResult.ngtscProgram` ์‚ฌ์šฉ, staleSourceFiles ์ „๋‹ฌ
11
+ - [x] SCSS bridging: `:451-462` โ€” `pluginOptions.stylesheetDependencies`/`stylesheetErrors` ์ง์ ‘ ์ฝ๊ธฐ (plugin-owned maps)
12
+ - [x] parseTsconfigFile ํ•จ์ˆ˜ ์ œ๊ฑฐ ํ™•์ธ: ํŒŒ์ผ ์ „์ฒด์—์„œ `parseTsconfigFile` ๋ฏธ๋ฐœ๊ฒฌ
13
+ - [x] AngularCompiler import ์ œ๊ฑฐ ํ™•์ธ: `:7` โ€” `import type { AngularSourceFileCache }` (type import๋งŒ ์œ ์ง€)
14
+ - [x] onDispose์—์„œ ์ฐธ์กฐ ํ•ด์ œ: `sdTsCompiler = undefined; lastResult = undefined;` ํ™•์ธ
15
+ - [x] onLoad ํ”Œ๋ž˜๊ทธ ๊ฒฐ์ •: `:432-438` โ€” `lastResult == null` ์กฐ๊ฑด์œผ๋กœ ์ฒซ ๋นŒ๋“œ์—์„œ๋งŒ ๊ฒฐ์ •
@@ -0,0 +1,31 @@
1
+ # Feature 2.1 ์ปดํฌ๋„ŒํŠธ ์Šคํƒ€์ผ์‹œํŠธ ๋ฒˆ๋“ค๋ง โ€” LLM ๊ฒ€์ฆ
2
+
3
+ ## ๊ฒ€์ฆ ํ•ญ๋ชฉ
4
+
5
+ ### AngularCompilerPluginOptions ์ธํ„ฐํŽ˜์ด์Šค ํ™•์žฅ
6
+
7
+ - [x] `stylesheetDependencies?: Map<string, Set<string>>` ํ•„๋“œ ์กด์žฌ: `esbuild-angular-compiler-plugin.ts:42` โ€” `Map<string, Set<string>>` ํƒ€์ž…์œผ๋กœ ์„ ์–ธ๋จ. `createClientTransformStylesheet`์˜ `scssDependencies` ํƒ€์ž…๊ณผ ์ผ์น˜
8
+ - [x] `stylesheetErrors?: string[]` ํ•„๋“œ ์กด์žฌ: `esbuild-angular-compiler-plugin.ts:44` โ€” `string[]` ํƒ€์ž…์œผ๋กœ ์„ ์–ธ๋จ. `createClientTransformStylesheet`์˜ `scssErrors` ํƒ€์ž…๊ณผ ์ผ์น˜
9
+
10
+ ### onStart โ€” stylesheetErrors ๋ฆฌ์…‹
11
+
12
+ - [x] ๋ฆฌ์…‹ ์ฝ”๋“œ๊ฐ€ try ๋ธ”๋ก **์•ž**์— ์œ„์น˜: `esbuild-angular-compiler-plugin.ts:204-207` โ€” `if (pluginOptions.stylesheetErrors != null) { pluginOptions.stylesheetErrors.length = 0; }` ๊ฐ€ `try {` (`:209`) ์ด์ „์— ์œ„์น˜. ์ปดํŒŒ์ผ ์‹คํŒจ ์‹œ์—๋„ ๋ฆฌ์…‹์ด ๋ณด์žฅ๋จ
13
+ - [x] null guard ์กด์žฌ: `pluginOptions.stylesheetErrors != null` ์ฒดํฌ๋กœ ๋ฏธ์ œ๊ณต ์‹œ TypeError ๋ฐฉ์ง€
14
+
15
+ ### onStart โ€” stylesheetDependencies โ†’ FileReferenceTracker ๋ธŒ๋ฆฟ์ง•
16
+
17
+ - [x] ๋ธŒ๋ฆฟ์ง• ์ฝ”๋“œ๊ฐ€ emit ํ›„, additionalResults ์ˆ˜์ง‘ ์ „์— ์œ„์น˜: `esbuild-angular-compiler-plugin.ts:315-320` โ€” `emitAffectedFiles` ๋ฃจํ”„(`:300-303`)์™€ `diagnostics ์ˆ˜์ง‘`(`:305-313`) ํ›„, `additionalResults ์—๋Ÿฌ ์ˆ˜์ง‘`(`:322`) ์ „์— ์œ„์น˜
18
+ - [x] `referencedFileTracker.add(containingFile, deps)` ํ˜ธ์ถœ: `:318` โ€” Map์˜ ๊ฐ ์—”ํŠธ๋ฆฌ์— ๋Œ€ํ•ด `referencedFileTracker.add(containingFile, deps)` ํ˜ธ์ถœ. `FileReferenceTracker.add()` ์‹œ๊ทธ๋‹ˆ์ฒ˜(`file-reference-tracker.ts:22`)์™€ ์ผ์น˜
19
+ - [x] null guard ์กด์žฌ: `:316` โ€” `pluginOptions.stylesheetDependencies != null` ์ฒดํฌ
20
+
21
+ ### onStart โ€” stylesheetErrors โ†’ esbuild errors ๋ณ€ํ™˜
22
+
23
+ - [x] ๋ณ€ํ™˜ ์ฝ”๋“œ๊ฐ€ additionalResults ์—๋Ÿฌ ์ˆ˜์ง‘ ํ›„์— ์œ„์น˜: `esbuild-angular-compiler-plugin.ts:329-334` โ€” `additionalResults` ๋ฃจํ”„(`:322-327`) ํ›„์— ์œ„์น˜
24
+ - [x] `{ text: errText, location: null }` ํ˜•์‹์œผ๋กœ push: `:332` โ€” `errors.push({ text: errText, location: null })`. esbuild `PartialMessage` ํ˜•์‹์— ๋ถ€ํ•ฉ
25
+ - [x] null guard ์กด์žฌ: `:330` โ€” `pluginOptions.stylesheetErrors != null` ์ฒดํฌ
26
+ - [x] ๋นˆ ๋ฐฐ์—ด ์‹œ push ์—†์Œ: `for...of` ๋ฃจํ”„์ด๋ฏ€๋กœ ๋นˆ ๋ฐฐ์—ด์ผ ๋•Œ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ 0ํšŒ ์‹คํ–‰
27
+
28
+ ### ์ฆ๋ถ„ ๋นŒ๋“œ ์ „์ด์  ์žฌ์ปดํŒŒ์ผ ๊ฒฝ๋กœ
29
+
30
+ - [x] `referencedFileTracker.update(sourceFileCache.modifiedFiles)` ํ˜ธ์ถœ: `:231-233` โ€” ์ฆ๋ถ„ ๋นŒ๋“œ ๊ฒฝ๋กœ์—์„œ `referencedFileTracker.update()`๊ฐ€ ํ˜ธ์ถœ๋จ. Feature 2.1์—์„œ ๋“ฑ๋กํ•œ SCSS ์˜์กด์„ฑ์ด ์—ฌ๊ธฐ์„œ ์ „์ด์ ์œผ๋กœ ํ™•์žฅ๋จ
31
+ - [x] ํ™•์žฅ๋œ ํŒŒ์ผ์ด `sourceFileCache.invalidate()`์— ์ „๋‹ฌ๋จ: `:234` โ€” `sourceFileCache.invalidate(expandedModifiedFiles)`. SCSS ์˜์กด์„ฑ ํŒŒ์ผ ๋ณ€๊ฒฝ ์‹œ ํ•ด๋‹น ์Šคํƒ€์ผ์‹œํŠธ ํŒŒ์ผ๋„ ๋ฌดํšจํ™”๋˜์–ด Angular compiler๊ฐ€ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์žฌ์ปดํŒŒ์ผ