@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
@@ -0,0 +1,31 @@
1
+ # Web Worker 번들링 — LLM 검증
2
+
3
+ ## 검증 항목
4
+
5
+ ### bundleWebWorker 함수
6
+
7
+ - [x] buildSync 옵션: `esbuild-angular-compiler-plugin.ts:165-177` — platform: "browser", write: false, bundle: true, metafile: true, format: "esm", entryNames: "worker-[hash]", plugins: undefined, supported: undefined 모두 확인
8
+ - [x] sourcemap 전달: `esbuild-angular-compiler-plugin.ts:174` — `sourcemap` 파라미터 직접 전달
9
+ - [x] initialOptions spread: `esbuild-angular-compiler-plugin.ts:165` — `...build.initialOptions`로 target/absWorkingDir/outdir 전달
10
+ - [x] catch — errors/warnings 있으면 반환: `esbuild-angular-compiler-plugin.ts:178-186` — `"errors" in error && "warnings" in error` 확인 후 `error as esbuild.BuildResult` 반환
11
+ - [x] catch — 없으면 re-throw: `esbuild-angular-compiler-plugin.ts:187` — `throw error`
12
+
13
+ ### processWebWorker 콜백
14
+
15
+ - [x] workerFile resolve: `esbuild-angular-compiler-plugin.ts:346` — `path.join(path.dirname(containingFile), workerFile)`
16
+ - [x] 성공 — additionalResults 저장: `esbuild-angular-compiler-plugin.ts:365-368` — `additionalResults.set(fullWorkerPath, { outputFiles, metafile })`
17
+ - [x] 성공 — FileReferenceTracker 등록: `esbuild-angular-compiler-plugin.ts:371-376` — `metafile.inputs` 키를 `path.join(cwd, input)`으로 변환하여 등록
18
+ - [x] 성공 — 반환값: `esbuild-angular-compiler-plugin.ts:379-388` — `/^worker-[A-Z0-9]{8}\.[cm]?js$/` 패턴으로 검색, `path.relative(outdir, ...)` + `replaceAll("\\", "/")` forward slash 반환
19
+ - [x] 에러 — errors push: `esbuild-angular-compiler-plugin.ts:352` — `errors.push(...workerResult.errors)`
20
+ - [x] 에러 — warnings push: `esbuild-angular-compiler-plugin.ts:349` — `warnings.push(...workerResult.warnings)` (성공/실패 공통 실행)
21
+ - [x] 에러 — FileReferenceTracker 등록: `esbuild-angular-compiler-plugin.ts:354-359` — `location?.file` 필터 후 `path.join(cwd, f)` 변환
22
+ - [x] 에러 — additionalResults 저장: `esbuild-angular-compiler-plugin.ts:361` — `{ errors: workerResult.errors }`
23
+ - [x] 에러 — 원본 반환: `esbuild-angular-compiler-plugin.ts:362` — `return workerFile`
24
+
25
+ ### Plugin 통합
26
+
27
+ - [x] import: `esbuild-angular-compiler-plugin.ts:14` — `import { createWorkerTransformer } from "../angular/web-worker-transformer.js"`
28
+ - [x] transformer 생성: `esbuild-angular-compiler-plugin.ts:392` — `createWorkerTransformer(processWebWorker)`
29
+ - [x] emitAffectedFiles 전달: `esbuild-angular-compiler-plugin.ts:393-395` — `{ additionalTransformers: { before: [workerTransformer] } }`
30
+ - [x] 클로저 접근: `esbuild-angular-compiler-plugin.ts:344-389` — onStart 내부에서 생성, `errors`/`warnings`/`additionalResults`/`referencedFileTracker`/`cwd`/`build` 접근 가능
31
+ - [x] onEnd 병합: `esbuild-angular-compiler-plugin.ts:449-460` — additionalResults 순회에서 worker 결과 포함
@@ -0,0 +1,397 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import path from "path";
3
+ import type esbuild from "esbuild";
4
+ import ts from "typescript";
5
+
6
+ // 자동 테스트 가능한 순수 함수들을 테스트한다.
7
+ // Angular 프로젝트 의존 항목은 LLM 검증(.verify.md)으로 분리.
8
+
9
+ const {
10
+ createAngularCompilerPlugin,
11
+ createCompilerOptionsTransformer,
12
+ convertDiagnostic,
13
+ convertSerializedDiagnosticToEsbuild,
14
+ requiresAngularCompiler,
15
+ createMissingFileDiagnostic,
16
+ } = await import("../../src/esbuild/esbuild-angular-compiler-plugin.js");
17
+
18
+ //#region esbuild Plugin 시뮬레이션 헬퍼
19
+
20
+ function setupPlugin(plugin: esbuild.Plugin) {
21
+ let onStartCb: (() => esbuild.OnStartResult | null | void | Promise<esbuild.OnStartResult | null | void>) | undefined;
22
+ let onEndCb: ((result: esbuild.BuildResult) => void | Promise<void>) | undefined;
23
+ let onDisposeCb: (() => void) | undefined;
24
+
25
+ const initialOptions: esbuild.BuildOptions = {
26
+ define: {},
27
+ absWorkingDir: "/workspace",
28
+ };
29
+
30
+ const mockBuild = {
31
+ initialOptions,
32
+ onStart(cb: typeof onStartCb) { onStartCb = cb; },
33
+ onEnd(cb: typeof onEndCb) { onEndCb = cb; },
34
+ onLoad() { /* noop — Feature 1.2 onLoad 훅 등록을 수용 */ },
35
+ onDispose(cb: typeof onDisposeCb) { onDisposeCb = cb; },
36
+ } as unknown as esbuild.PluginBuild;
37
+
38
+ void plugin.setup(mockBuild);
39
+
40
+ return {
41
+ initialOptions,
42
+ async invokeOnStart() { return (await onStartCb?.()) ?? null; },
43
+ async invokeOnEnd(result: Partial<esbuild.BuildResult>) {
44
+ await onEndCb?.({
45
+ errors: [],
46
+ warnings: [],
47
+ mangleCache: {},
48
+ outputFiles: [],
49
+ metafile: { inputs: {}, outputs: {} },
50
+ ...result,
51
+ } as esbuild.BuildResult);
52
+ },
53
+ invokeOnDispose() { onDisposeCb?.(); },
54
+ get onStartCb() { return onStartCb; },
55
+ get onEndCb() { return onEndCb; },
56
+ get onDisposeCb() { return onDisposeCb; },
57
+ };
58
+ }
59
+
60
+ //#endregion
61
+
62
+ describe("createAngularCompilerPlugin — Plugin 구조", () => {
63
+ it("esbuild Plugin 프로토콜을 따르는 객체를 반환한다", () => {
64
+ const plugin = createAngularCompilerPlugin({
65
+ tsconfig: "/workspace/tsconfig.json",
66
+ sourcemap: false,
67
+ advancedOptimizations: false,
68
+ thirdPartySourcemaps: false,
69
+ incremental: false,
70
+ });
71
+
72
+ expect(plugin.name).toBe("sd-angular-compiler");
73
+ expect(typeof plugin.setup).toBe("function");
74
+ });
75
+
76
+ it("setup에서 onStart/onEnd/onDispose 훅이 등록된다", () => {
77
+ const plugin = createAngularCompilerPlugin({
78
+ tsconfig: "/workspace/tsconfig.json",
79
+ sourcemap: false,
80
+ advancedOptimizations: false,
81
+ thirdPartySourcemaps: false,
82
+ incremental: false,
83
+ });
84
+
85
+ const ctx = setupPlugin(plugin);
86
+ expect(ctx.onStartCb).toBeDefined();
87
+ expect(ctx.onEndCb).toBeDefined();
88
+ expect(ctx.onDisposeCb).toBeDefined();
89
+ });
90
+
91
+ it("setup에서 ngI18nClosureMode define이 주입된다", () => {
92
+ const plugin = createAngularCompilerPlugin({
93
+ tsconfig: "/workspace/tsconfig.json",
94
+ sourcemap: false,
95
+ advancedOptimizations: false,
96
+ thirdPartySourcemaps: false,
97
+ incremental: false,
98
+ });
99
+
100
+ const ctx = setupPlugin(plugin);
101
+ expect(ctx.initialOptions.define!["ngI18nClosureMode"]).toBe("false");
102
+ });
103
+ });
104
+
105
+ describe("createCompilerOptionsTransformer", () => {
106
+ const baseCompilerOptions: ts.CompilerOptions = {
107
+ target: ts.ScriptTarget.ES2015,
108
+ module: ts.ModuleKind.CommonJS,
109
+ strict: true,
110
+ };
111
+
112
+ it("target을 ES2022로, module을 ES2022로 설정한다", () => {
113
+ const transform = createCompilerOptionsTransformer(
114
+ { tsconfig: "", sourcemap: false, advancedOptimizations: false, thirdPartySourcemaps: false, incremental: false },
115
+ undefined,
116
+ );
117
+
118
+ const result = transform(baseCompilerOptions);
119
+ expect(result.target).toBe(ts.ScriptTarget.ES2022);
120
+ expect(result.module).toBe(ts.ModuleKind.ES2022);
121
+ });
122
+
123
+ it("noEmitOnError: false, composite: false를 설정한다", () => {
124
+ const transform = createCompilerOptionsTransformer(
125
+ { tsconfig: "", sourcemap: false, advancedOptimizations: false, thirdPartySourcemaps: false, incremental: false },
126
+ undefined,
127
+ );
128
+
129
+ const result = transform(baseCompilerOptions);
130
+ expect(result.noEmitOnError).toBe(false);
131
+ expect(result.composite).toBe(false);
132
+ });
133
+
134
+ it("sourcemap: true일 때 inlineSources/inlineSourceMap을 설정한다", () => {
135
+ const transform = createCompilerOptionsTransformer(
136
+ { tsconfig: "", sourcemap: true, advancedOptimizations: false, thirdPartySourcemaps: false, incremental: false },
137
+ undefined,
138
+ );
139
+
140
+ const result = transform(baseCompilerOptions);
141
+ expect(result.inlineSources).toBe(true);
142
+ expect(result.inlineSourceMap).toBe(true);
143
+ expect(result.sourceMap).toBeUndefined();
144
+ });
145
+
146
+ it("templateUpdates 제공 시 _enableHmr: true를 설정한다", () => {
147
+ const transform = createCompilerOptionsTransformer(
148
+ { tsconfig: "", sourcemap: false, advancedOptimizations: false, thirdPartySourcemaps: false, incremental: false, templateUpdates: new Map() },
149
+ undefined,
150
+ );
151
+
152
+ const result = transform(baseCompilerOptions);
153
+ expect((result as Record<string, unknown>)["_enableHmr"]).toBe(true);
154
+ });
155
+
156
+ it("includeTestMetadata: true일 때 supportTestBed/supportJitMode: true를 설정한다", () => {
157
+ const transform = createCompilerOptionsTransformer(
158
+ { tsconfig: "", sourcemap: false, advancedOptimizations: false, thirdPartySourcemaps: false, incremental: false, includeTestMetadata: true },
159
+ undefined,
160
+ );
161
+
162
+ const result = transform(baseCompilerOptions);
163
+ expect((result as Record<string, unknown>)["supportTestBed"]).toBe(true);
164
+ expect((result as Record<string, unknown>)["supportJitMode"]).toBe(true);
165
+ });
166
+
167
+ it("useDefineForClassFields가 미설정이면 false로 기본 설정한다", () => {
168
+ const transform = createCompilerOptionsTransformer(
169
+ { tsconfig: "", sourcemap: false, advancedOptimizations: false, thirdPartySourcemaps: false, incremental: false },
170
+ undefined,
171
+ );
172
+
173
+ const result = transform(baseCompilerOptions);
174
+ expect(result.useDefineForClassFields).toBe(false);
175
+ });
176
+
177
+ it("persistentCachePath 제공 시 incremental: true, tsBuildInfoFile 설정한다", () => {
178
+ const transform = createCompilerOptionsTransformer(
179
+ { tsconfig: "", sourcemap: false, advancedOptimizations: false, thirdPartySourcemaps: false, incremental: false, persistentCachePath: "/cache" },
180
+ undefined,
181
+ );
182
+
183
+ const result = transform(baseCompilerOptions);
184
+ expect(result.incremental).toBe(true);
185
+ expect(result.tsBuildInfoFile).toContain(".tsbuildinfo");
186
+ });
187
+ });
188
+
189
+ describe("stylesheetErrors / stylesheetDependencies 브릿징", () => {
190
+ it("onStart 시작 시 stylesheetErrors를 리셋한다", async () => {
191
+ const stylesheetErrors = ["SCSS error in style.scss: undefined variable", "SCSS error in other.scss: missing import"];
192
+
193
+ const plugin = createAngularCompilerPlugin({
194
+ tsconfig: "/nonexistent/tsconfig.json",
195
+ sourcemap: false,
196
+ advancedOptimizations: false,
197
+ thirdPartySourcemaps: false,
198
+ incremental: false,
199
+ stylesheetErrors,
200
+ });
201
+
202
+ const ctx = setupPlugin(plugin);
203
+
204
+ // onStart는 tsconfig 파싱 실패로 에러를 반환하지만, 그 전에 stylesheetErrors가 리셋되어야 한다
205
+ await ctx.invokeOnStart();
206
+
207
+ expect(stylesheetErrors).toHaveLength(0);
208
+ });
209
+
210
+ it("stylesheetErrors 미제공 시 onStart가 에러 없이 진행된다", async () => {
211
+ const plugin = createAngularCompilerPlugin({
212
+ tsconfig: "/nonexistent/tsconfig.json",
213
+ sourcemap: false,
214
+ advancedOptimizations: false,
215
+ thirdPartySourcemaps: false,
216
+ incremental: false,
217
+ // stylesheetErrors 미제공
218
+ });
219
+
220
+ const ctx = setupPlugin(plugin);
221
+
222
+ // TypeError 없이 정상 진행 (컴파일 에러는 발생하지만 stylesheetErrors 관련 에러는 없음)
223
+ const result = await ctx.invokeOnStart();
224
+ // 컴파일 실패 에러만 포함되어야 함
225
+ expect(result?.errors?.every((e) => !(e.text ?? "").includes("SCSS"))).toBe(true);
226
+ });
227
+ });
228
+
229
+ describe("convertDiagnostic", () => {
230
+ it("에러 진단을 esbuild PartialMessage로 변환한다", () => {
231
+ const sourceFile = ts.createSourceFile("app.ts", "const x: number = 'str';", ts.ScriptTarget.ES2022, true);
232
+ const diagnostic: ts.Diagnostic = {
233
+ file: sourceFile,
234
+ start: 0,
235
+ length: 5,
236
+ messageText: "Type 'string' is not assignable to type 'number'.",
237
+ category: ts.DiagnosticCategory.Error,
238
+ code: 2322,
239
+ };
240
+
241
+ const result = convertDiagnostic(diagnostic, "/workspace");
242
+
243
+ expect(result.text).toContain("Type 'string' is not assignable");
244
+ expect(result.location).not.toBeNull();
245
+ expect(result.location?.line).toBe(1);
246
+ });
247
+
248
+ it("파일 정보 없는 진단은 location: null을 반환한다", () => {
249
+ const diagnostic: ts.Diagnostic = {
250
+ file: undefined,
251
+ start: undefined,
252
+ length: undefined,
253
+ messageText: "Option error",
254
+ category: ts.DiagnosticCategory.Error,
255
+ code: 5000,
256
+ };
257
+
258
+ const result = convertDiagnostic(diagnostic, "/workspace");
259
+
260
+ expect(result.text).toBe("Option error");
261
+ expect(result.location).toBeNull();
262
+ });
263
+ });
264
+
265
+ describe("convertSerializedDiagnosticToEsbuild", () => {
266
+ it("파일 위치가 있는 진단을 line/column 포함 PartialMessage로 변환한다", () => {
267
+ const sourceFile = ts.createSourceFile(
268
+ "/workspace/src/app.ts",
269
+ "const x: number = 'str';",
270
+ ts.ScriptTarget.ES2022,
271
+ true,
272
+ );
273
+ // 간이 Program 생성 (getSourceFile 조회용)
274
+ const program = {
275
+ getSourceFile: (fileName: string) =>
276
+ fileName === "/workspace/src/app.ts" ? sourceFile : undefined,
277
+ } as unknown as ts.Program;
278
+
279
+ const serialized = {
280
+ category: ts.DiagnosticCategory.Error,
281
+ code: 2322,
282
+ messageText: "Type 'string' is not assignable to type 'number'.",
283
+ file: { fileName: "/workspace/src/app.ts" },
284
+ start: 0,
285
+ length: 5,
286
+ };
287
+
288
+ const result = convertSerializedDiagnosticToEsbuild(serialized, program, "/workspace");
289
+
290
+ expect(result.text).toContain("Type 'string' is not assignable");
291
+ expect(result.location).not.toBeNull();
292
+ expect(result.location?.file).toBe(path.relative("/workspace", "/workspace/src/app.ts"));
293
+ expect(result.location?.line).toBe(1);
294
+ expect(result.location?.column).toBe(0);
295
+ });
296
+
297
+ it("파일 정보 없는 진단은 location: null을 반환한다", () => {
298
+ const program = {
299
+ getSourceFile: () => undefined,
300
+ } as unknown as ts.Program;
301
+
302
+ const serialized = {
303
+ category: ts.DiagnosticCategory.Error,
304
+ code: 5000,
305
+ messageText: "Option error",
306
+ };
307
+
308
+ const result = convertSerializedDiagnosticToEsbuild(serialized, program, "/workspace");
309
+
310
+ expect(result.text).toBe("Option error");
311
+ expect(result.location).toBeNull();
312
+ });
313
+
314
+ it("program에서 소스 파일을 찾을 수 없으면 location: null을 반환한다", () => {
315
+ const program = {
316
+ getSourceFile: () => undefined,
317
+ } as unknown as ts.Program;
318
+
319
+ const serialized = {
320
+ category: ts.DiagnosticCategory.Warning,
321
+ code: 1234,
322
+ messageText: "Some warning",
323
+ file: { fileName: "/workspace/src/missing.ts" },
324
+ start: 10,
325
+ };
326
+
327
+ const result = convertSerializedDiagnosticToEsbuild(serialized, program, "/workspace");
328
+
329
+ expect(result.text).toBe("Some warning");
330
+ expect(result.location).toBeNull();
331
+ });
332
+ });
333
+
334
+ describe("requiresAngularCompiler", () => {
335
+ it("@Component 포함 시 true를 반환한다", () => {
336
+ expect(requiresAngularCompiler("import { Component } from '@angular/core'; @Component({})")).toBe(true);
337
+ });
338
+
339
+ it("@Directive 포함 시 true를 반환한다", () => {
340
+ expect(requiresAngularCompiler("@Directive({})")).toBe(true);
341
+ });
342
+
343
+ it("@Injectable 포함 시 true를 반환한다", () => {
344
+ expect(requiresAngularCompiler("@Injectable()")).toBe(true);
345
+ });
346
+
347
+ it("@Pipe 포함 시 true를 반환한다", () => {
348
+ expect(requiresAngularCompiler("@Pipe({ name: 'x' })")).toBe(true);
349
+ });
350
+
351
+ it("@NgModule 포함 시 true를 반환한다", () => {
352
+ expect(requiresAngularCompiler("@NgModule({})")).toBe(true);
353
+ });
354
+
355
+ it("@angular/core import만 있어도 true를 반환한다", () => {
356
+ expect(requiresAngularCompiler("import { inject } from '@angular/core';")).toBe(true);
357
+ });
358
+
359
+ it("Angular 관련 코드가 없으면 false를 반환한다", () => {
360
+ expect(requiresAngularCompiler("export function helper() { return 42; }")).toBe(false);
361
+ });
362
+
363
+ it("빈 문자열에 대해 false를 반환한다", () => {
364
+ expect(requiresAngularCompiler("")).toBe(false);
365
+ });
366
+ });
367
+
368
+ describe("createMissingFileDiagnostic", () => {
369
+ it("Angular 파일이면 TypeScript compilation 에러 메시지를 생성한다", () => {
370
+ const result = createMissingFileDiagnostic("/workspace/comp.ts", "/workspace/comp.ts", "/workspace", true);
371
+
372
+ expect(result.text).toContain("comp.ts");
373
+ expect(result.text).toContain("not found in TypeScript compilation");
374
+ expect(result.notes?.[0]?.text).toContain("Angular metadata");
375
+ });
376
+
377
+ it("Angular 파일이 아니면 번들링 경고 메시지를 생성한다", () => {
378
+ const result = createMissingFileDiagnostic("/workspace/helper.ts", "/workspace/helper.ts", "/workspace", false);
379
+
380
+ expect(result.text).toContain("helper.ts");
381
+ expect(result.notes?.[0]?.text).toContain("bundled and included in the output");
382
+ });
383
+
384
+ it("request와 original이 다르면 file replacement 노트를 추가한다", () => {
385
+ const result = createMissingFileDiagnostic("/workspace/replaced.ts", "/workspace/original.ts", "/workspace", false);
386
+
387
+ expect(result.notes?.length).toBe(2);
388
+ expect(result.notes?.[1]?.text).toContain("file replacement");
389
+ expect(result.notes?.[1]?.text).toContain("original.ts");
390
+ });
391
+
392
+ it("request와 original이 같으면 file replacement 노트가 없다", () => {
393
+ const result = createMissingFileDiagnostic("/workspace/same.ts", "/workspace/same.ts", "/workspace", true);
394
+
395
+ expect(result.notes?.length).toBe(1);
396
+ });
397
+ });
@@ -0,0 +1,21 @@
1
+ # esbuild Angular Compiler Plugin — LLM 검증
2
+
3
+ ## 검증 항목
4
+
5
+ - [x] **JavaScriptTransformer 초기화**: `esbuild-angular-compiler-plugin.ts:170-181` — `@angular/build/private`에서 import한 `JavaScriptTransformer`를 `{ sourcemap, thirdPartySourcemaps, advancedOptimizations, jit }` 옵션과 `maxWorkers`, `cacheStore?.createCache("jstransformer")`로 초기화. jit은 `includeTestMetadata`에 매핑됨.
6
+
7
+ - [x] **AngularCompiler 생성 시 transformStylesheet 콜백 전달**: `esbuild-angular-compiler-plugin.ts:222-229` — `AngularCompiler` 생성자에 `pluginOptions.transformStylesheet`를 직접 전달. 미제공 시 undefined로 전달되어 AngularCompiler에서 무시됨.
8
+
9
+ - [x] **AngularCompiler 생성 시 externalStylesheets 전달**: `esbuild-angular-compiler-plugin.ts:228` — `pluginOptions.externalStylesheets`가 AngularCompiler 옵션에 전달됨.
10
+
11
+ - [x] **첫 빌드 시 tsconfig 파싱 → AngularCompiler 생성 → initialize()**: `esbuild-angular-compiler-plugin.ts:214-231` — `angularCompiler == null` 조건에서 `parseTsconfigFile()` → `new AngularCompiler()` → `initialize()` 순서로 호출. compilerOptionsTransformer도 전달됨.
12
+
13
+ - [x] **emitAffectedFiles → typeScriptFileCache 저장**: `esbuild-angular-compiler-plugin.ts:235-238` — emit 결과를 `path.normalize(filename)` 키로 저장. 원본 compiler-plugin.js와 동일한 패턴.
14
+
15
+ - [x] **onDispose에서 리소스 정리**: `esbuild-angular-compiler-plugin.ts:295-299` — `angularCompiler = undefined`, `javascriptTransformer.close()`, `cacheStore?.close()` 호출. void로 fire-and-forget 처리 (원본과 동일).
16
+
17
+ - [x] **LMDB 캐시 초기화 실패 시 graceful degradation**: `esbuild-angular-compiler-plugin.ts:160-168` — try-catch로 감싸고 logger.warn 후 cacheStore = undefined 유지. JavaScriptTransformer에 cache 없이 초기화됨.
18
+
19
+ - [x] **onEnd에서 additionalResults 병합**: `esbuild-angular-compiler-plugin.ts:282-292` — outputFiles push + metafile Object.assign. result.outputFiles가 undefined일 수 있으므로 optional chaining 사용.
20
+
21
+ - [x] **onStart 에러 처리**: `esbuild-angular-compiler-plugin.ts:262-274` — catch에서 "Angular compilation failed." 에러 메시지 + stack trace를 notes에 포함. hasCompilationErrors = true 설정.
@@ -0,0 +1,13 @@
1
+ # esbuild-tsc-plugin 전환 — LLM 검증
2
+
3
+ ## 검증 항목
4
+
5
+ - [x] `esbuild-tsc-plugin.ts`에서 `runTscPackageBuild`/`parseTsconfig` import 제거됨: Grep 결과 0건
6
+ - [x] `esbuild-tsc-plugin.ts`에서 `SdTsCompiler` import 존재: `import { SdTsCompiler } from "../ts-compiler/SdTsCompiler"` (line 4)
7
+ - [x] `TscPluginOptions`에 `lint?: boolean` 필드 존재: `esbuild-tsc-plugin.ts` 인터페이스 확인
8
+ - [x] `TscPluginResult`에 `getLintResult()` getter 존재: `esbuild-tsc-plugin.ts` 인터페이스 확인
9
+ - [x] `server-build.worker.ts`에서 `runTscPackageBuild` import 제거됨: Grep 결과 0건
10
+ - [x] `server-build.worker.ts`에서 `LintWithProgramRunner` import 제거됨: Grep 결과 0건
11
+ - [x] `server-build.worker.ts`에서 `SdTsCompiler` import 존재: `import { SdTsCompiler } from "../ts-compiler/SdTsCompiler"` 확인
12
+ - [x] `server-esbuild-context.ts`에 `getTscLintResult()` 위임 메서드 존재: 코드 확인
13
+ - [x] `server-esbuild-context.ts`의 `EsbuildContextOptions.tsc`에 `lint?: boolean` 존재: 코드 확인