@simplysm/sd-cli 14.0.29 → 14.0.32

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 (626) hide show
  1. package/dist/{utils → angular}/angular-build-pipeline.d.ts +0 -2
  2. package/dist/angular/angular-build-pipeline.d.ts.map +1 -0
  3. package/dist/{utils → angular}/angular-build-pipeline.js +3 -6
  4. package/dist/angular/angular-build-pipeline.js.map +1 -0
  5. package/dist/{utils → angular}/angular-build.d.ts +1 -1
  6. package/dist/angular/angular-build.d.ts.map +1 -0
  7. package/dist/{utils → angular}/angular-build.js +1 -1
  8. package/dist/angular/angular-build.js.map +1 -0
  9. package/dist/{utils → angular}/angular-compiler.d.ts +0 -3
  10. package/dist/angular/angular-compiler.d.ts.map +1 -0
  11. package/dist/{utils → angular}/angular-compiler.js +1 -45
  12. package/dist/angular/angular-compiler.js.map +1 -0
  13. package/dist/angular/client-transform-stylesheet.js +1 -1
  14. package/dist/angular/client-transform-stylesheet.js.map +1 -1
  15. package/dist/{utils → angular}/ngtsc-build-core.d.ts +3 -3
  16. package/dist/angular/ngtsc-build-core.d.ts.map +1 -0
  17. package/dist/angular/ngtsc-build-core.js.map +1 -0
  18. package/dist/angular/scss-compiler.d.ts.map +1 -0
  19. package/dist/angular/scss-compiler.js.map +1 -0
  20. package/dist/angular/vite-angular-plugin.d.ts +2 -10
  21. package/dist/angular/vite-angular-plugin.d.ts.map +1 -1
  22. package/dist/angular/vite-angular-plugin.js +20 -286
  23. package/dist/angular/vite-angular-plugin.js.map +1 -1
  24. package/dist/capacitor/capacitor-build.d.ts +14 -0
  25. package/dist/capacitor/capacitor-build.d.ts.map +1 -0
  26. package/dist/capacitor/capacitor-build.js +105 -0
  27. package/dist/capacitor/capacitor-build.js.map +1 -0
  28. package/dist/capacitor/capacitor-config-writer.d.ts +11 -0
  29. package/dist/capacitor/capacitor-config-writer.d.ts.map +1 -0
  30. package/dist/capacitor/capacitor-config-writer.js +54 -0
  31. package/dist/capacitor/capacitor-config-writer.js.map +1 -0
  32. package/dist/capacitor/capacitor-icon.d.ts +5 -0
  33. package/dist/capacitor/capacitor-icon.d.ts.map +1 -0
  34. package/dist/capacitor/capacitor-icon.js +58 -0
  35. package/dist/capacitor/capacitor-icon.js.map +1 -0
  36. package/dist/capacitor/capacitor-npm-config.d.ts +11 -0
  37. package/dist/capacitor/capacitor-npm-config.d.ts.map +1 -0
  38. package/dist/capacitor/capacitor-npm-config.js +145 -0
  39. package/dist/capacitor/capacitor-npm-config.js.map +1 -0
  40. package/dist/capacitor/capacitor.d.ts +0 -45
  41. package/dist/capacitor/capacitor.d.ts.map +1 -1
  42. package/dist/capacitor/capacitor.js +15 -354
  43. package/dist/capacitor/capacitor.js.map +1 -1
  44. package/dist/commands/check.js +2 -2
  45. package/dist/commands/check.js.map +1 -1
  46. package/dist/commands/dev.d.ts +3 -3
  47. package/dist/commands/dev.d.ts.map +1 -1
  48. package/dist/commands/dev.js +3 -3
  49. package/dist/commands/dev.js.map +1 -1
  50. package/dist/commands/lint.d.ts +1 -1
  51. package/dist/commands/lint.d.ts.map +1 -1
  52. package/dist/commands/lint.js +1 -1
  53. package/dist/commands/lint.js.map +1 -1
  54. package/dist/commands/publish/deployment-phase.d.ts +12 -0
  55. package/dist/commands/publish/deployment-phase.d.ts.map +1 -0
  56. package/dist/commands/publish/deployment-phase.js +94 -0
  57. package/dist/commands/publish/deployment-phase.js.map +1 -0
  58. package/dist/commands/publish/env-utils.d.ts +10 -0
  59. package/dist/commands/publish/env-utils.d.ts.map +1 -0
  60. package/dist/commands/publish/env-utils.js +41 -0
  61. package/dist/commands/publish/env-utils.js.map +1 -0
  62. package/dist/commands/publish/git-phase.d.ts +12 -0
  63. package/dist/commands/publish/git-phase.d.ts.map +1 -0
  64. package/dist/commands/publish/git-phase.js +79 -0
  65. package/dist/commands/publish/git-phase.js.map +1 -0
  66. package/dist/commands/{publish.d.ts → publish/index.d.ts} +1 -1
  67. package/dist/commands/publish/index.d.ts.map +1 -0
  68. package/dist/commands/publish/index.js +211 -0
  69. package/dist/commands/publish/index.js.map +1 -0
  70. package/dist/commands/publish/local-publisher.d.ts +6 -0
  71. package/dist/commands/publish/local-publisher.d.ts.map +1 -0
  72. package/dist/commands/publish/local-publisher.js +16 -0
  73. package/dist/commands/publish/local-publisher.js.map +1 -0
  74. package/dist/commands/publish/npm-publisher.d.ts +6 -0
  75. package/dist/commands/publish/npm-publisher.d.ts.map +1 -0
  76. package/dist/commands/publish/npm-publisher.js +21 -0
  77. package/dist/commands/publish/npm-publisher.js.map +1 -0
  78. package/dist/commands/publish/post-publish-phase.d.ts +8 -0
  79. package/dist/commands/publish/post-publish-phase.d.ts.map +1 -0
  80. package/dist/commands/publish/post-publish-phase.js +34 -0
  81. package/dist/commands/publish/post-publish-phase.js.map +1 -0
  82. package/dist/commands/publish/storage-publisher.d.ts +18 -0
  83. package/dist/commands/publish/storage-publisher.d.ts.map +1 -0
  84. package/dist/commands/publish/storage-publisher.js +173 -0
  85. package/dist/commands/publish/storage-publisher.js.map +1 -0
  86. package/dist/commands/publish/version-upgrade.d.ts +28 -0
  87. package/dist/commands/publish/version-upgrade.d.ts.map +1 -0
  88. package/dist/commands/publish/version-upgrade.js +96 -0
  89. package/dist/commands/publish/version-upgrade.js.map +1 -0
  90. package/dist/commands/replace-deps.js +1 -1
  91. package/dist/commands/replace-deps.js.map +1 -1
  92. package/dist/commands/watch.d.ts +3 -4
  93. package/dist/commands/watch.d.ts.map +1 -1
  94. package/dist/commands/watch.js +3 -4
  95. package/dist/commands/watch.js.map +1 -1
  96. package/dist/deps/replace-deps/collect-deps.d.ts +6 -0
  97. package/dist/deps/replace-deps/collect-deps.d.ts.map +1 -0
  98. package/dist/deps/replace-deps/collect-deps.js +71 -0
  99. package/dist/deps/replace-deps/collect-deps.js.map +1 -0
  100. package/dist/{utils/replace-deps.d.ts → deps/replace-deps/replace-deps-resolve.d.ts} +7 -24
  101. package/dist/deps/replace-deps/replace-deps-resolve.d.ts.map +1 -0
  102. package/dist/{utils/replace-deps.js → deps/replace-deps/replace-deps-resolve.js} +4 -152
  103. package/dist/deps/replace-deps/replace-deps-resolve.js.map +1 -0
  104. package/dist/deps/replace-deps/replace-deps.d.ts +36 -0
  105. package/dist/deps/replace-deps/replace-deps.d.ts.map +1 -0
  106. package/dist/deps/replace-deps/replace-deps.js +155 -0
  107. package/dist/deps/replace-deps/replace-deps.js.map +1 -0
  108. package/dist/{utils → deps/server-externals}/server-production-files.d.ts +1 -1
  109. package/dist/deps/server-externals/server-production-files.d.ts.map +1 -0
  110. package/dist/{utils → deps/server-externals}/server-production-files.js +1 -1
  111. package/dist/deps/server-externals/server-production-files.js.map +1 -0
  112. package/dist/dev-server/dev-http-server.d.ts +23 -0
  113. package/dist/dev-server/dev-http-server.d.ts.map +1 -0
  114. package/dist/dev-server/dev-http-server.js +116 -0
  115. package/dist/dev-server/dev-http-server.js.map +1 -0
  116. package/dist/dev-server/hmr-client-script.d.ts +13 -0
  117. package/dist/dev-server/hmr-client-script.d.ts.map +1 -0
  118. package/dist/dev-server/hmr-client-script.js +73 -0
  119. package/dist/dev-server/hmr-client-script.js.map +1 -0
  120. package/dist/dev-server/hmr-service.d.ts +23 -0
  121. package/dist/dev-server/hmr-service.d.ts.map +1 -0
  122. package/dist/dev-server/hmr-service.js +139 -0
  123. package/dist/dev-server/hmr-service.js.map +1 -0
  124. package/dist/electron/electron.d.ts +5 -0
  125. package/dist/electron/electron.d.ts.map +1 -1
  126. package/dist/electron/electron.js +17 -24
  127. package/dist/electron/electron.js.map +1 -1
  128. package/dist/engines/BaseEngine.d.ts +18 -4
  129. package/dist/engines/BaseEngine.d.ts.map +1 -1
  130. package/dist/engines/BaseEngine.js +45 -66
  131. package/dist/engines/BaseEngine.js.map +1 -1
  132. package/dist/engines/{ViteEngine.d.ts → EsbuildClientEngine.d.ts} +11 -18
  133. package/dist/engines/EsbuildClientEngine.d.ts.map +1 -0
  134. package/dist/engines/{ViteEngine.js → EsbuildClientEngine.js} +28 -55
  135. package/dist/engines/EsbuildClientEngine.js.map +1 -0
  136. package/dist/engines/NgtscEngine.d.ts +2 -2
  137. package/dist/engines/NgtscEngine.d.ts.map +1 -1
  138. package/dist/engines/NgtscEngine.js +1 -9
  139. package/dist/engines/NgtscEngine.js.map +1 -1
  140. package/dist/engines/ServerEsbuildEngine.d.ts +2 -2
  141. package/dist/engines/ServerEsbuildEngine.d.ts.map +1 -1
  142. package/dist/engines/ServerEsbuildEngine.js +1 -9
  143. package/dist/engines/ServerEsbuildEngine.js.map +1 -1
  144. package/dist/engines/TscEngine.d.ts +2 -2
  145. package/dist/engines/TscEngine.d.ts.map +1 -1
  146. package/dist/engines/TscEngine.js +1 -9
  147. package/dist/engines/TscEngine.js.map +1 -1
  148. package/dist/engines/index.d.ts +15 -5
  149. package/dist/engines/index.d.ts.map +1 -1
  150. package/dist/engines/index.js +21 -5
  151. package/dist/engines/index.js.map +1 -1
  152. package/dist/engines/types.d.ts +3 -3
  153. package/dist/engines/types.d.ts.map +1 -1
  154. package/dist/esbuild/esbuild-client-config.d.ts +38 -0
  155. package/dist/esbuild/esbuild-client-config.d.ts.map +1 -0
  156. package/dist/esbuild/esbuild-client-config.js +171 -0
  157. package/dist/esbuild/esbuild-client-config.js.map +1 -0
  158. package/dist/esbuild/esbuild-config.d.ts.map +1 -0
  159. package/dist/{utils → esbuild}/esbuild-config.js +1 -0
  160. package/dist/esbuild/esbuild-config.js.map +1 -0
  161. package/dist/esbuild/esbuild-index-html.d.ts +39 -0
  162. package/dist/esbuild/esbuild-index-html.d.ts.map +1 -0
  163. package/dist/esbuild/esbuild-index-html.js +68 -0
  164. package/dist/esbuild/esbuild-index-html.js.map +1 -0
  165. package/dist/esbuild/esbuild-pwa.d.ts +21 -0
  166. package/dist/esbuild/esbuild-pwa.d.ts.map +1 -0
  167. package/dist/esbuild/esbuild-pwa.js +105 -0
  168. package/dist/esbuild/esbuild-pwa.js.map +1 -0
  169. package/dist/esbuild/esbuild-scss-plugin.d.ts +6 -0
  170. package/dist/esbuild/esbuild-scss-plugin.d.ts.map +1 -0
  171. package/dist/esbuild/esbuild-scss-plugin.js +41 -0
  172. package/dist/esbuild/esbuild-scss-plugin.js.map +1 -0
  173. package/dist/lint/lint-core.d.ts.map +1 -0
  174. package/dist/lint/lint-core.js.map +1 -0
  175. package/dist/lint/lint-utils.d.ts.map +1 -0
  176. package/dist/lint/lint-utils.js.map +1 -0
  177. package/dist/lint/lint-with-program.d.ts.map +1 -0
  178. package/dist/lint/lint-with-program.js.map +1 -0
  179. package/dist/orchestrators/BaseOrchestrator.d.ts +44 -0
  180. package/dist/orchestrators/BaseOrchestrator.d.ts.map +1 -0
  181. package/dist/orchestrators/BaseOrchestrator.js +92 -0
  182. package/dist/orchestrators/BaseOrchestrator.js.map +1 -0
  183. package/dist/orchestrators/BuildOrchestrator.d.ts +45 -3
  184. package/dist/orchestrators/BuildOrchestrator.d.ts.map +1 -1
  185. package/dist/orchestrators/BuildOrchestrator.js +170 -143
  186. package/dist/orchestrators/BuildOrchestrator.js.map +1 -1
  187. package/dist/orchestrators/DevOrchestrator.d.ts +39 -0
  188. package/dist/orchestrators/DevOrchestrator.d.ts.map +1 -0
  189. package/dist/orchestrators/DevOrchestrator.js +249 -0
  190. package/dist/orchestrators/DevOrchestrator.js.map +1 -0
  191. package/dist/orchestrators/ServerRuntimeManager.d.ts +22 -0
  192. package/dist/orchestrators/ServerRuntimeManager.d.ts.map +1 -0
  193. package/dist/orchestrators/ServerRuntimeManager.js +66 -0
  194. package/dist/orchestrators/ServerRuntimeManager.js.map +1 -0
  195. package/dist/orchestrators/TypecheckOrchestrator.d.ts +17 -2
  196. package/dist/orchestrators/TypecheckOrchestrator.d.ts.map +1 -1
  197. package/dist/orchestrators/TypecheckOrchestrator.js +122 -108
  198. package/dist/orchestrators/TypecheckOrchestrator.js.map +1 -1
  199. package/dist/orchestrators/WatchOrchestrator.d.ts +33 -0
  200. package/dist/orchestrators/WatchOrchestrator.d.ts.map +1 -0
  201. package/dist/orchestrators/WatchOrchestrator.js +158 -0
  202. package/dist/orchestrators/WatchOrchestrator.js.map +1 -0
  203. package/dist/orchestrators/types.d.ts +17 -0
  204. package/dist/orchestrators/types.d.ts.map +1 -0
  205. package/dist/orchestrators/types.js +2 -0
  206. package/dist/orchestrators/types.js.map +1 -0
  207. package/dist/runtime/ResultCollector.d.ts.map +1 -0
  208. package/dist/runtime/ResultCollector.js.map +1 -0
  209. package/dist/runtime/SignalHandler.d.ts.map +1 -0
  210. package/dist/runtime/SignalHandler.js.map +1 -0
  211. package/dist/{utils → runtime}/engine-stop.d.ts +1 -1
  212. package/dist/runtime/engine-stop.d.ts.map +1 -0
  213. package/dist/{utils → runtime}/engine-stop.js +1 -1
  214. package/dist/runtime/engine-stop.js.map +1 -0
  215. package/dist/runtime/engine-watch-events.d.ts +43 -0
  216. package/dist/runtime/engine-watch-events.d.ts.map +1 -0
  217. package/dist/runtime/engine-watch-events.js +72 -0
  218. package/dist/runtime/engine-watch-events.js.map +1 -0
  219. package/dist/{utils → runtime}/rebuild-manager.d.ts +1 -0
  220. package/dist/runtime/rebuild-manager.d.ts.map +1 -0
  221. package/dist/{utils → runtime}/rebuild-manager.js +8 -1
  222. package/dist/runtime/rebuild-manager.js.map +1 -0
  223. package/dist/runtime/worker-events.d.ts +22 -0
  224. package/dist/runtime/worker-events.d.ts.map +1 -0
  225. package/dist/runtime/worker-events.js +2 -0
  226. package/dist/runtime/worker-events.js.map +1 -0
  227. package/dist/runtime/worker-utils.d.ts.map +1 -0
  228. package/dist/runtime/worker-utils.js.map +1 -0
  229. package/dist/sd-cli-entry.d.ts.map +1 -1
  230. package/dist/sd-cli-entry.js +61 -54
  231. package/dist/sd-cli-entry.js.map +1 -1
  232. package/dist/sd-cli.js +1 -1
  233. package/dist/sd-cli.js.map +1 -1
  234. package/dist/sd-config.types.d.ts +6 -15
  235. package/dist/sd-config.types.d.ts.map +1 -1
  236. package/dist/typecheck/typecheck-non-package.d.ts.map +1 -0
  237. package/dist/{utils → typecheck}/typecheck-non-package.js +1 -1
  238. package/dist/typecheck/typecheck-non-package.js.map +1 -0
  239. package/dist/typecheck/typecheck-serialization.d.ts.map +1 -0
  240. package/dist/typecheck/typecheck-serialization.js.map +1 -0
  241. package/dist/utils/diagnostic-utils.d.ts +5 -0
  242. package/dist/utils/diagnostic-utils.d.ts.map +1 -1
  243. package/dist/utils/diagnostic-utils.js +15 -0
  244. package/dist/utils/diagnostic-utils.js.map +1 -1
  245. package/dist/utils/orchestrator-utils.d.ts +1 -5
  246. package/dist/utils/orchestrator-utils.d.ts.map +1 -1
  247. package/dist/utils/orchestrator-utils.js +2 -5
  248. package/dist/utils/orchestrator-utils.js.map +1 -1
  249. package/dist/utils/output-utils.d.ts +1 -1
  250. package/dist/utils/output-utils.d.ts.map +1 -1
  251. package/dist/utils/package-classify.d.ts +54 -0
  252. package/dist/utils/package-classify.d.ts.map +1 -0
  253. package/dist/utils/package-classify.js +134 -0
  254. package/dist/utils/package-classify.js.map +1 -0
  255. package/dist/utils/package-utils.d.ts +1 -58
  256. package/dist/utils/package-utils.d.ts.map +1 -1
  257. package/dist/utils/package-utils.js +0 -193
  258. package/dist/utils/package-utils.js.map +1 -1
  259. package/dist/utils/tsc-build.d.ts +1 -1
  260. package/dist/utils/tsc-build.d.ts.map +1 -1
  261. package/dist/utils/tsc-build.js +1 -1
  262. package/dist/utils/tsc-build.js.map +1 -1
  263. package/dist/workers/build-change-filter.d.ts +8 -0
  264. package/dist/workers/build-change-filter.d.ts.map +1 -0
  265. package/dist/workers/build-change-filter.js +16 -0
  266. package/dist/workers/build-change-filter.js.map +1 -0
  267. package/dist/workers/build-watch-paths.d.ts +20 -0
  268. package/dist/workers/build-watch-paths.d.ts.map +1 -0
  269. package/dist/workers/build-watch-paths.js +29 -0
  270. package/dist/workers/build-watch-paths.js.map +1 -0
  271. package/dist/workers/client.worker.d.ts +11 -18
  272. package/dist/workers/client.worker.d.ts.map +1 -1
  273. package/dist/workers/client.worker.js +218 -289
  274. package/dist/workers/client.worker.js.map +1 -1
  275. package/dist/workers/library-build.worker.d.ts +2 -2
  276. package/dist/workers/library-build.worker.d.ts.map +1 -1
  277. package/dist/workers/library-build.worker.js +13 -24
  278. package/dist/workers/library-build.worker.js.map +1 -1
  279. package/dist/workers/lint.worker.d.ts +1 -1
  280. package/dist/workers/lint.worker.d.ts.map +1 -1
  281. package/dist/workers/lint.worker.js +1 -1
  282. package/dist/workers/lint.worker.js.map +1 -1
  283. package/dist/workers/ngtsc-build.worker.d.ts +1 -1
  284. package/dist/workers/ngtsc-build.worker.d.ts.map +1 -1
  285. package/dist/workers/ngtsc-build.worker.js +19 -35
  286. package/dist/workers/ngtsc-build.worker.js.map +1 -1
  287. package/dist/workers/server-build.worker.d.ts +2 -2
  288. package/dist/workers/server-build.worker.d.ts.map +1 -1
  289. package/dist/workers/server-build.worker.js +36 -137
  290. package/dist/workers/server-build.worker.js.map +1 -1
  291. package/dist/workers/server-esbuild-context.d.ts +47 -0
  292. package/dist/workers/server-esbuild-context.d.ts.map +1 -0
  293. package/dist/workers/server-esbuild-context.js +92 -0
  294. package/dist/workers/server-esbuild-context.js.map +1 -0
  295. package/dist/workers/server-runtime.worker.d.ts.map +1 -1
  296. package/dist/workers/server-runtime.worker.js +3 -1
  297. package/dist/workers/server-runtime.worker.js.map +1 -1
  298. package/dist/workers/server-watch-manager.d.ts +44 -0
  299. package/dist/workers/server-watch-manager.d.ts.map +1 -0
  300. package/dist/workers/server-watch-manager.js +87 -0
  301. package/dist/workers/server-watch-manager.js.map +1 -0
  302. package/dist/workers/shared-worker-lifecycle.d.ts +14 -0
  303. package/dist/workers/shared-worker-lifecycle.d.ts.map +1 -0
  304. package/dist/workers/shared-worker-lifecycle.js +17 -0
  305. package/dist/workers/shared-worker-lifecycle.js.map +1 -0
  306. package/package.json +9 -9
  307. package/src/{utils → angular}/angular-build-pipeline.ts +3 -8
  308. package/src/{utils → angular}/angular-build.ts +1 -1
  309. package/src/{utils → angular}/angular-compiler.ts +1 -64
  310. package/src/angular/client-transform-stylesheet.ts +1 -1
  311. package/src/{utils → angular}/ngtsc-build-core.ts +3 -3
  312. package/src/angular/vite-angular-plugin.ts +22 -355
  313. package/src/capacitor/capacitor-build.ts +142 -0
  314. package/src/capacitor/capacitor-config-writer.ts +66 -0
  315. package/src/capacitor/capacitor-icon.ts +75 -0
  316. package/src/capacitor/capacitor-npm-config.ts +192 -0
  317. package/src/capacitor/capacitor.ts +32 -441
  318. package/src/commands/check.ts +2 -2
  319. package/src/commands/dev.ts +6 -6
  320. package/src/commands/lint.ts +1 -1
  321. package/src/commands/publish/deployment-phase.ts +125 -0
  322. package/src/commands/publish/env-utils.ts +44 -0
  323. package/src/commands/publish/git-phase.ts +99 -0
  324. package/src/commands/publish/index.ts +266 -0
  325. package/src/commands/publish/local-publisher.ts +23 -0
  326. package/src/commands/publish/npm-publisher.ts +30 -0
  327. package/src/commands/publish/post-publish-phase.ts +43 -0
  328. package/src/commands/publish/storage-publisher.ts +208 -0
  329. package/src/commands/publish/version-upgrade.ts +132 -0
  330. package/src/commands/replace-deps.ts +1 -1
  331. package/src/commands/watch.ts +6 -7
  332. package/src/deps/replace-deps/collect-deps.ts +92 -0
  333. package/src/{utils/replace-deps.ts → deps/replace-deps/replace-deps-resolve.ts} +4 -188
  334. package/src/deps/replace-deps/replace-deps.ts +193 -0
  335. package/src/{utils → deps/server-externals}/server-production-files.ts +2 -2
  336. package/src/dev-server/dev-http-server.ts +149 -0
  337. package/src/dev-server/hmr-client-script.ts +74 -0
  338. package/src/dev-server/hmr-service.ts +178 -0
  339. package/src/electron/electron.ts +21 -28
  340. package/src/engines/BaseEngine.ts +64 -83
  341. package/src/engines/{ViteEngine.ts → EsbuildClientEngine.ts} +33 -72
  342. package/src/engines/NgtscEngine.ts +3 -11
  343. package/src/engines/ServerEsbuildEngine.ts +3 -11
  344. package/src/engines/TscEngine.ts +3 -11
  345. package/src/engines/index.ts +29 -9
  346. package/src/engines/types.ts +3 -3
  347. package/src/esbuild/esbuild-client-config.ts +230 -0
  348. package/src/{utils → esbuild}/esbuild-config.ts +1 -0
  349. package/src/esbuild/esbuild-index-html.ts +119 -0
  350. package/src/esbuild/esbuild-pwa.ts +139 -0
  351. package/src/esbuild/esbuild-scss-plugin.ts +48 -0
  352. package/src/orchestrators/BaseOrchestrator.ts +118 -0
  353. package/src/orchestrators/BuildOrchestrator.ts +234 -171
  354. package/src/orchestrators/DevOrchestrator.ts +315 -0
  355. package/src/orchestrators/ServerRuntimeManager.ts +85 -0
  356. package/src/orchestrators/TypecheckOrchestrator.ts +166 -117
  357. package/src/orchestrators/WatchOrchestrator.ts +203 -0
  358. package/src/orchestrators/types.ts +18 -0
  359. package/src/{utils → runtime}/engine-stop.ts +1 -1
  360. package/src/runtime/engine-watch-events.ts +121 -0
  361. package/src/{utils → runtime}/rebuild-manager.ts +8 -1
  362. package/src/runtime/worker-events.ts +25 -0
  363. package/src/sd-cli-entry.ts +69 -54
  364. package/src/sd-cli.ts +1 -1
  365. package/src/sd-config.types.ts +6 -16
  366. package/src/{utils → typecheck}/typecheck-non-package.ts +1 -1
  367. package/src/utils/diagnostic-utils.ts +15 -0
  368. package/src/utils/orchestrator-utils.ts +2 -6
  369. package/src/utils/output-utils.ts +1 -1
  370. package/src/utils/package-classify.ts +182 -0
  371. package/src/utils/package-utils.ts +0 -257
  372. package/src/utils/tsc-build.ts +1 -1
  373. package/src/workers/build-change-filter.ts +27 -0
  374. package/src/workers/build-watch-paths.ts +54 -0
  375. package/src/workers/client.worker.ts +258 -328
  376. package/src/workers/library-build.worker.ts +15 -34
  377. package/src/workers/lint.worker.ts +1 -1
  378. package/src/workers/ngtsc-build.worker.ts +19 -46
  379. package/src/workers/server-build.worker.ts +38 -168
  380. package/src/workers/server-esbuild-context.ts +122 -0
  381. package/src/workers/server-runtime.worker.ts +4 -1
  382. package/src/workers/server-watch-manager.ts +124 -0
  383. package/src/workers/shared-worker-lifecycle.ts +24 -0
  384. package/tests/angular/angular-build-pipeline.spec.ts +2 -2
  385. package/tests/angular/angular-compiler-aot.acc.spec.ts +68 -0
  386. package/tests/angular/angular-compiler-aot.spec.ts +80 -0
  387. package/tests/angular/angular-compiler-hmr-removal.verify.md +16 -0
  388. package/tests/angular/vite-angular-plugin-legacy-watch.spec.ts +0 -17
  389. package/tests/angular/vite-angular-plugin-vitest.spec.ts +1 -6
  390. package/tests/angular/vite-angular-plugin-vitest.verify.md +20 -0
  391. package/tests/angular/vite-angular-plugin.spec.ts +4 -178
  392. package/tests/capacitor/capacitor-android.spec.ts +1 -0
  393. package/tests/capacitor/capacitor-build.spec.ts +1 -0
  394. package/tests/capacitor/capacitor-config-writer.acc.spec.ts +108 -0
  395. package/tests/capacitor/capacitor-config-writer.spec.ts +95 -0
  396. package/tests/capacitor/capacitor-icon.spec.ts +1 -0
  397. package/tests/capacitor/capacitor-init.spec.ts +1 -0
  398. package/tests/capacitor/capacitor-npm-config.acc.spec.ts +236 -0
  399. package/tests/capacitor/capacitor-npm-config.spec.ts +132 -0
  400. package/tests/capacitor/capacitor-run.spec.ts +1 -0
  401. package/tests/capacitor/capacitor-workspace.spec.ts +1 -0
  402. package/tests/commands/check.spec.ts +2 -2
  403. package/tests/commands/deployment-phase.acc.spec.ts +142 -0
  404. package/tests/commands/git-phase.acc.spec.ts +158 -0
  405. package/tests/commands/lint.spec.ts +1 -1
  406. package/tests/commands/post-publish-phase.acc.spec.ts +82 -0
  407. package/tests/commands/publish-npm-local-split.verify.md +9 -0
  408. package/tests/commands/publish-responsibility-split.verify.md +13 -0
  409. package/tests/commands/publish-storage-split.verify.md +8 -0
  410. package/tests/commands/publish.spec.ts +1 -1
  411. package/tests/commands/typecheck.spec.ts +18 -18
  412. package/tests/deps/deps-directory-separation.verify.md +15 -0
  413. package/tests/engines/base-engine.spec.ts +65 -6
  414. package/tests/engines/engine-adapter-isolation.spec.ts +11 -18
  415. package/tests/engines/engine-selection.spec.ts +38 -5
  416. package/tests/engines/engine-typecheck-selection.acc.spec.ts +85 -0
  417. package/tests/engines/engine-typecheck-selection.verify.md +8 -0
  418. package/tests/engines/esbuild-client-engine.acc.spec.ts +161 -0
  419. package/tests/engines/esbuild-client-engine.spec.ts +320 -0
  420. package/tests/engines/esbuild-client-engine.verify.md +15 -0
  421. package/tests/engines/normalize-result.verify.md +9 -0
  422. package/tests/engines/vite-dependency-cleanup.verify.md +24 -0
  423. package/tests/orchestrators/build-orchestrator.spec.ts +3 -3
  424. package/tests/orchestrators/dev-orchestrator.spec.ts +799 -0
  425. package/tests/orchestrators/orchestrator-baseenv.verify.md +10 -0
  426. package/tests/orchestrators/orchestrator-diagnostic-formatting.verify.md +10 -0
  427. package/tests/orchestrators/orchestrator-initializemode-signature.verify.md +9 -0
  428. package/tests/orchestrators/typecheck-orchestrator.spec.ts +11 -11
  429. package/tests/orchestrators/watch-orchestrator.spec.ts +511 -0
  430. package/tests/{infra → runtime}/result-collector.spec.ts +1 -1
  431. package/tests/{infra → runtime}/signal-handler.spec.ts +1 -1
  432. package/tests/sd-cli-entry.spec.ts +9 -0
  433. package/tests/utils/angular-build.spec.ts +15 -20
  434. package/tests/utils/angular-compiler-emit.spec.ts +2 -2
  435. package/tests/utils/angular-compiler.spec.ts +2 -2
  436. package/tests/utils/angular-source-file-cache.spec.ts +2 -2
  437. package/tests/utils/concurrency.spec.ts +2 -10
  438. package/tests/utils/dev-http-server.acc.spec.ts +206 -0
  439. package/tests/utils/dev-http-server.spec.ts +181 -0
  440. package/tests/utils/dev-http-server.verify.md +8 -0
  441. package/tests/utils/diagnostic-utils.spec.ts +42 -1
  442. package/tests/utils/engine-stop.spec.ts +1 -1
  443. package/tests/utils/engine-watch-events.acc.spec.ts +217 -0
  444. package/tests/utils/engine-watch-events.spec.ts +141 -0
  445. package/tests/utils/engine-watch-events.verify.md +17 -0
  446. package/tests/utils/esbuild-client-config.acc.spec.ts +443 -0
  447. package/tests/utils/esbuild-client-config.spec.ts +590 -0
  448. package/tests/utils/esbuild-client-config.verify.md +26 -0
  449. package/tests/utils/esbuild-config.spec.ts +11 -1
  450. package/tests/utils/esbuild-index-html.acc.spec.ts +166 -0
  451. package/tests/utils/esbuild-index-html.spec.ts +194 -0
  452. package/tests/utils/esbuild-index-html.verify.md +10 -0
  453. package/tests/utils/esbuild-pwa.acc.spec.ts +203 -0
  454. package/tests/utils/esbuild-pwa.spec.ts +189 -0
  455. package/tests/utils/esbuild-pwa.verify.md +9 -0
  456. package/tests/utils/esbuild-scss-plugin.acc.spec.ts +111 -0
  457. package/tests/utils/esbuild-scss-plugin.spec.ts +150 -0
  458. package/tests/utils/esbuild-scss-plugin.verify.md +8 -0
  459. package/tests/utils/external-modules.spec.ts +1 -1
  460. package/tests/utils/hmr-client-script.acc.spec.ts +128 -0
  461. package/tests/utils/hmr-client-script.spec.ts +44 -0
  462. package/tests/utils/hmr-service-dispatcher.acc.spec.ts +217 -0
  463. package/tests/utils/hmr-service-dispatcher.spec.ts +143 -0
  464. package/tests/utils/hmr-service.acc.spec.ts +139 -0
  465. package/tests/utils/hmr-service.spec.ts +131 -0
  466. package/tests/utils/hmr-service.verify.md +17 -0
  467. package/tests/utils/lint-core.spec.ts +2 -1
  468. package/tests/utils/lint-utils.spec.ts +1 -1
  469. package/tests/utils/lint-with-program.spec.ts +1 -1
  470. package/tests/utils/ngtsc-build-core-write-emit.spec.ts +19 -19
  471. package/tests/utils/ngtsc-build-core.spec.ts +4 -4
  472. package/tests/utils/orchestrator-utils.spec.ts +2 -2
  473. package/tests/utils/output-utils.spec.ts +1 -1
  474. package/tests/utils/package-utils.spec.ts +1 -1
  475. package/tests/utils/rebuild-manager.spec.ts +20 -7
  476. package/tests/utils/replace-deps-split.verify.md +15 -0
  477. package/tests/utils/replace-deps-watch.acc.spec.ts +131 -0
  478. package/tests/utils/replace-deps-watch.spec.ts +91 -0
  479. package/tests/utils/replace-deps-watch.verify.md +9 -0
  480. package/tests/utils/replace-deps.spec.ts +1 -1
  481. package/tests/utils/scss-compiler.spec.ts +1 -1
  482. package/tests/utils/tsc-build.spec.ts +1 -1
  483. package/tests/utils/typecheck-non-package.spec.ts +2 -2
  484. package/tests/utils/worker-utils.spec.ts +2 -1
  485. package/tests/workers/build-change-filter.acc.spec.ts +78 -0
  486. package/tests/workers/build-change-filter.spec.ts +39 -0
  487. package/tests/workers/build-watch-paths-library.verify.md +10 -0
  488. package/tests/workers/build-watch-paths-ngtsc-server.verify.md +12 -0
  489. package/tests/workers/build-watch-paths.acc.spec.ts +101 -0
  490. package/tests/workers/build-watch-paths.spec.ts +121 -0
  491. package/tests/workers/client-worker-browser-support.verify.md +7 -0
  492. package/tests/workers/client-worker-onend-sync.verify.md +7 -0
  493. package/tests/workers/client-worker.acc.spec.ts +185 -0
  494. package/tests/workers/client-worker.spec.ts +91 -178
  495. package/tests/workers/library-build-lint.spec.ts +3 -3
  496. package/tests/workers/library-build-worker.spec.ts +10 -11
  497. package/tests/workers/ngtsc-build-lint.spec.ts +4 -4
  498. package/tests/workers/ngtsc-build-worker.spec.ts +2 -2
  499. package/tests/workers/server-build-lint.spec.ts +4 -4
  500. package/tests/workers/server-build-worker.spec.ts +14 -15
  501. package/tests/workers/server-esbuild-context-integration.verify.md +10 -0
  502. package/tests/workers/server-esbuild-context.acc.spec.ts +98 -0
  503. package/tests/workers/server-esbuild-context.spec.ts +198 -0
  504. package/tests/workers/server-runtime-worker.spec.ts +4 -3
  505. package/tests/workers/server-watch-manager.acc.spec.ts +162 -0
  506. package/tests/workers/server-watch-manager.spec.ts +199 -0
  507. package/tests/workers/shared-worker-lifecycle.acc.spec.ts +27 -0
  508. package/tests/workers/shared-worker-lifecycle.spec.ts +47 -0
  509. package/dist/angular/vite-postcss-inline-plugin.d.ts +0 -18
  510. package/dist/angular/vite-postcss-inline-plugin.d.ts.map +0 -1
  511. package/dist/angular/vite-postcss-inline-plugin.js +0 -108
  512. package/dist/angular/vite-postcss-inline-plugin.js.map +0 -1
  513. package/dist/commands/publish.d.ts.map +0 -1
  514. package/dist/commands/publish.js +0 -689
  515. package/dist/commands/publish.js.map +0 -1
  516. package/dist/engines/ViteEngine.d.ts.map +0 -1
  517. package/dist/engines/ViteEngine.js.map +0 -1
  518. package/dist/infra/ResultCollector.d.ts.map +0 -1
  519. package/dist/infra/ResultCollector.js.map +0 -1
  520. package/dist/infra/SignalHandler.d.ts.map +0 -1
  521. package/dist/infra/SignalHandler.js.map +0 -1
  522. package/dist/orchestrators/DevWatchOrchestrator.d.ts +0 -63
  523. package/dist/orchestrators/DevWatchOrchestrator.d.ts.map +0 -1
  524. package/dist/orchestrators/DevWatchOrchestrator.js +0 -478
  525. package/dist/orchestrators/DevWatchOrchestrator.js.map +0 -1
  526. package/dist/utils/angular-build-pipeline.d.ts.map +0 -1
  527. package/dist/utils/angular-build-pipeline.js.map +0 -1
  528. package/dist/utils/angular-build.d.ts.map +0 -1
  529. package/dist/utils/angular-build.js.map +0 -1
  530. package/dist/utils/angular-compiler.d.ts.map +0 -1
  531. package/dist/utils/angular-compiler.js.map +0 -1
  532. package/dist/utils/engine-stop.d.ts.map +0 -1
  533. package/dist/utils/engine-stop.js.map +0 -1
  534. package/dist/utils/esbuild-config.d.ts.map +0 -1
  535. package/dist/utils/esbuild-config.js.map +0 -1
  536. package/dist/utils/hmr-candidates.d.ts +0 -15
  537. package/dist/utils/hmr-candidates.d.ts.map +0 -1
  538. package/dist/utils/hmr-candidates.js +0 -234
  539. package/dist/utils/hmr-candidates.js.map +0 -1
  540. package/dist/utils/lint-core.d.ts.map +0 -1
  541. package/dist/utils/lint-core.js.map +0 -1
  542. package/dist/utils/lint-utils.d.ts.map +0 -1
  543. package/dist/utils/lint-utils.js.map +0 -1
  544. package/dist/utils/lint-with-program.d.ts.map +0 -1
  545. package/dist/utils/lint-with-program.js.map +0 -1
  546. package/dist/utils/ngtsc-build-core.d.ts.map +0 -1
  547. package/dist/utils/ngtsc-build-core.js.map +0 -1
  548. package/dist/utils/rebuild-manager.d.ts.map +0 -1
  549. package/dist/utils/rebuild-manager.js.map +0 -1
  550. package/dist/utils/replace-deps.d.ts.map +0 -1
  551. package/dist/utils/replace-deps.js.map +0 -1
  552. package/dist/utils/scss-compiler.d.ts.map +0 -1
  553. package/dist/utils/scss-compiler.js.map +0 -1
  554. package/dist/utils/server-production-files.d.ts.map +0 -1
  555. package/dist/utils/server-production-files.js.map +0 -1
  556. package/dist/utils/typecheck-non-package.d.ts.map +0 -1
  557. package/dist/utils/typecheck-non-package.js.map +0 -1
  558. package/dist/utils/typecheck-serialization.d.ts.map +0 -1
  559. package/dist/utils/typecheck-serialization.js.map +0 -1
  560. package/dist/utils/vite-config.d.ts +0 -50
  561. package/dist/utils/vite-config.d.ts.map +0 -1
  562. package/dist/utils/vite-config.js +0 -242
  563. package/dist/utils/vite-config.js.map +0 -1
  564. package/dist/utils/vite-pwa-plugin.d.ts +0 -9
  565. package/dist/utils/vite-pwa-plugin.d.ts.map +0 -1
  566. package/dist/utils/vite-pwa-plugin.js +0 -139
  567. package/dist/utils/vite-pwa-plugin.js.map +0 -1
  568. package/dist/utils/vite-scope-watch-plugin.d.ts +0 -24
  569. package/dist/utils/vite-scope-watch-plugin.d.ts.map +0 -1
  570. package/dist/utils/vite-scope-watch-plugin.js +0 -51
  571. package/dist/utils/vite-scope-watch-plugin.js.map +0 -1
  572. package/dist/utils/worker-events.d.ts +0 -66
  573. package/dist/utils/worker-events.d.ts.map +0 -1
  574. package/dist/utils/worker-events.js +0 -55
  575. package/dist/utils/worker-events.js.map +0 -1
  576. package/dist/utils/worker-utils.d.ts.map +0 -1
  577. package/dist/utils/worker-utils.js.map +0 -1
  578. package/src/angular/vite-postcss-inline-plugin.ts +0 -139
  579. package/src/commands/publish.ts +0 -850
  580. package/src/orchestrators/DevWatchOrchestrator.ts +0 -594
  581. package/src/utils/hmr-candidates.ts +0 -327
  582. package/src/utils/vite-config.ts +0 -318
  583. package/src/utils/vite-pwa-plugin.ts +0 -168
  584. package/src/utils/vite-scope-watch-plugin.ts +0 -77
  585. package/src/utils/worker-events.ts +0 -128
  586. package/tests/angular/angular-compiler-hmr.spec.ts +0 -152
  587. package/tests/angular/hmr-candidates.spec.ts +0 -158
  588. package/tests/angular/linker-disk-cache.spec.ts +0 -171
  589. package/tests/angular/vite-angular-plugin-hmr-fallback.spec.ts +0 -333
  590. package/tests/angular/vite-angular-plugin-hmr.spec.ts +0 -320
  591. package/tests/angular/vite-angular-plugin-scss-hmr.spec.ts +0 -95
  592. package/tests/angular/vite-postcss-inline-plugin.spec.ts +0 -60
  593. package/tests/engines/vite-engine.spec.ts +0 -409
  594. package/tests/orchestrators/dev-watch-orchestrator.spec.ts +0 -1542
  595. package/tests/utils/vite-config.spec.ts +0 -780
  596. package/tests/utils/vite-pwa-plugin.spec.ts +0 -401
  597. package/tests/utils/vite-scope-watch-plugin.spec.ts +0 -218
  598. package/tests/utils/worker-events.spec.ts +0 -147
  599. package/tests/workers/client-worker-legacy.spec.ts +0 -659
  600. /package/dist/{utils → angular}/ngtsc-build-core.js +0 -0
  601. /package/dist/{utils → angular}/scss-compiler.d.ts +0 -0
  602. /package/dist/{utils → angular}/scss-compiler.js +0 -0
  603. /package/dist/{utils → esbuild}/esbuild-config.d.ts +0 -0
  604. /package/dist/{utils → lint}/lint-core.d.ts +0 -0
  605. /package/dist/{utils → lint}/lint-core.js +0 -0
  606. /package/dist/{utils → lint}/lint-utils.d.ts +0 -0
  607. /package/dist/{utils → lint}/lint-utils.js +0 -0
  608. /package/dist/{utils → lint}/lint-with-program.d.ts +0 -0
  609. /package/dist/{utils → lint}/lint-with-program.js +0 -0
  610. /package/dist/{infra → runtime}/ResultCollector.d.ts +0 -0
  611. /package/dist/{infra → runtime}/ResultCollector.js +0 -0
  612. /package/dist/{infra → runtime}/SignalHandler.d.ts +0 -0
  613. /package/dist/{infra → runtime}/SignalHandler.js +0 -0
  614. /package/dist/{utils → runtime}/worker-utils.d.ts +0 -0
  615. /package/dist/{utils → runtime}/worker-utils.js +0 -0
  616. /package/dist/{utils → typecheck}/typecheck-non-package.d.ts +0 -0
  617. /package/dist/{utils → typecheck}/typecheck-serialization.d.ts +0 -0
  618. /package/dist/{utils → typecheck}/typecheck-serialization.js +0 -0
  619. /package/src/{utils → angular}/scss-compiler.ts +0 -0
  620. /package/src/{utils → lint}/lint-core.ts +0 -0
  621. /package/src/{utils → lint}/lint-utils.ts +0 -0
  622. /package/src/{utils → lint}/lint-with-program.ts +0 -0
  623. /package/src/{infra → runtime}/ResultCollector.ts +0 -0
  624. /package/src/{infra → runtime}/SignalHandler.ts +0 -0
  625. /package/src/{utils → runtime}/worker-utils.ts +0 -0
  626. /package/src/{utils → typecheck}/typecheck-serialization.ts +0 -0
@@ -0,0 +1,208 @@
1
+ import path from "path";
2
+ import os from "os";
3
+ import fs from "fs";
4
+ import ssh2 from "ssh2";
5
+ import { password as passwordPrompt } from "@inquirer/prompts";
6
+ import { StorageFactory } from "@simplysm/storage";
7
+ import { env } from "@simplysm/core-common";
8
+ import type { consola } from "consola";
9
+ import type { SdPublishConfig, SdStoragePublishConfig } from "../../sd-config.types";
10
+
11
+ const { Client: SshClient, utils } = ssh2;
12
+
13
+ /**
14
+ * 스토리지(FTP/FTPS/SFTP) 서버에 dist 디렉토리를 업로드한다
15
+ */
16
+ export async function publishToStorage(
17
+ pkgPath: string,
18
+ pkgName: string,
19
+ config: SdStoragePublishConfig,
20
+ logger: ReturnType<typeof consola.withTag>,
21
+ dryRun: boolean,
22
+ ): Promise<void> {
23
+ const distPath = path.resolve(pkgPath, "dist");
24
+ const remotePath = config.path ?? "/";
25
+
26
+ if (dryRun) {
27
+ logger.info(`[DRY-RUN] [${pkgName}] ${config.type} 업로드: ${distPath} → ${remotePath}`);
28
+ } else {
29
+ logger.debug(`[${pkgName}] ${config.type} 업로드: ${distPath} → ${remotePath}`);
30
+ await StorageFactory.connect(
31
+ config.type,
32
+ {
33
+ host: config.host,
34
+ port: config.port,
35
+ user: config.user,
36
+ password: config.password,
37
+ },
38
+ async (storage) => {
39
+ await storage.uploadDir(distPath, remotePath);
40
+ },
41
+ );
42
+ }
43
+ }
44
+
45
+ /**
46
+ * SSH 키 인증을 사전 검증하고 설정한다
47
+ *
48
+ * 비밀번호 없는 SFTP 서버의 경우:
49
+ * 1. SSH 키 파일이 없으면 생성
50
+ * 2. 키 인증을 테스트하고, 실패하면 비밀번호로 공개키를 등록
51
+ */
52
+ export async function ensureSshAuth(
53
+ publishPackages: Array<{ name: string; config: SdPublishConfig }>,
54
+ logger: ReturnType<typeof consola.withTag>,
55
+ ): Promise<void> {
56
+ // 비밀번호 없는 SFTP 서버 수집 (user@host 기준 중복 제거)
57
+ const sshTargets = new Map<string, { host: string; port?: number; user: string }>();
58
+ for (const pkg of publishPackages) {
59
+ if (pkg.config.type === "npm") continue;
60
+ if (pkg.config.type !== "sftp") continue;
61
+ if (pkg.config.password != null) continue;
62
+ if (pkg.config.user == null) {
63
+ throw new Error(`[${pkg.name}] SFTP 설정에 user가 누락되었습니다.`);
64
+ }
65
+ const key = `${pkg.config.user}@${pkg.config.host}`;
66
+ sshTargets.set(key, {
67
+ host: pkg.config.host,
68
+ port: pkg.config.port,
69
+ user: pkg.config.user,
70
+ });
71
+ }
72
+
73
+ if (sshTargets.size === 0) return;
74
+
75
+ // SSH 키 파일 확인/생성
76
+ const sshDir = path.join(os.homedir(), ".ssh");
77
+ const keyPath = path.join(sshDir, "id_ed25519");
78
+ const pubKeyPath = path.join(sshDir, "id_ed25519.pub");
79
+
80
+ if (!fs.existsSync(keyPath)) {
81
+ logger.info("SSH 키를 찾을 수 없습니다. 생성 중...");
82
+
83
+ if (!fs.existsSync(sshDir)) {
84
+ fs.mkdirSync(sshDir, { mode: 0o700 });
85
+ }
86
+
87
+ const keyPair = utils.generateKeyPairSync("ed25519");
88
+ fs.writeFileSync(keyPath, keyPair.private, { mode: 0o600 });
89
+ fs.writeFileSync(pubKeyPath, keyPair.public + "\n", { mode: 0o644 });
90
+
91
+ logger.info(`SSH 키 생성 완료: ${keyPath}`);
92
+ }
93
+
94
+ const privateKeyData = fs.readFileSync(keyPath);
95
+ const publicKey = fs.readFileSync(pubKeyPath, "utf-8").trim();
96
+
97
+ // 개인키 파싱 시도 (암호화 또는 형식 오류 시 Error 반환)
98
+ const parsed = utils.parseKey(privateKeyData);
99
+ const isKeyEncrypted = parsed instanceof Error;
100
+ const sshAgent = env("SSH_AUTH_SOCK");
101
+
102
+ // 각 서버에 대해 키 인증 검증
103
+ for (const [label, target] of sshTargets) {
104
+ const canAuth = await testSshKeyAuth(target, {
105
+ privateKey: isKeyEncrypted ? undefined : privateKeyData,
106
+ agent: sshAgent,
107
+ });
108
+ if (canAuth) {
109
+ logger.debug(`SSH 키 인증 확인됨: ${label}`);
110
+ continue;
111
+ }
112
+
113
+ // 키 인증 실패 → 비밀번호로 공개키 등록
114
+ logger.info(`${label}: SSH 키가 서버에 등록되어 있지 않습니다.`);
115
+ const pass = await passwordPrompt({
116
+ message: `${label} 비밀번호 (공개키 등록용):`,
117
+ });
118
+
119
+ await registerSshPublicKey(target, pass, publicKey);
120
+ logger.info(`SSH 공개키 등록 완료: ${label}`);
121
+ }
122
+ }
123
+
124
+ /**
125
+ * SSH 키 인증 테스트 (연결 후 즉시 종료)
126
+ */
127
+ function testSshKeyAuth(
128
+ target: { host: string; port?: number; user: string },
129
+ auth: { privateKey?: Buffer; agent?: string },
130
+ ): Promise<boolean> {
131
+ if (auth.privateKey == null && auth.agent == null) {
132
+ return Promise.resolve(false);
133
+ }
134
+
135
+ return new Promise((resolve) => {
136
+ const conn = new SshClient();
137
+ conn.on("ready", () => {
138
+ conn.end();
139
+ resolve(true);
140
+ });
141
+ conn.on("error", () => {
142
+ resolve(false);
143
+ });
144
+ conn.connect({
145
+ host: target.host,
146
+ port: target.port ?? 22,
147
+ username: target.user,
148
+ ...(auth.privateKey != null ? { privateKey: auth.privateKey } : {}),
149
+ ...(auth.agent != null ? { agent: auth.agent } : {}),
150
+ readyTimeout: 10_000,
151
+ });
152
+ });
153
+ }
154
+
155
+ /**
156
+ * 비밀번호로 서버에 연결하여 SSH 공개키를 등록한다
157
+ */
158
+ function registerSshPublicKey(
159
+ target: { host: string; port?: number; user: string },
160
+ pass: string,
161
+ publicKey: string,
162
+ ): Promise<void> {
163
+ return new Promise((resolve, reject) => {
164
+ const conn = new SshClient();
165
+ conn.on("ready", () => {
166
+ // authorized_keys에 공개키 추가
167
+ const escapedKey = publicKey.replace(/'/g, "'\\''");
168
+ const cmd = [
169
+ "mkdir -p ~/.ssh",
170
+ "chmod 700 ~/.ssh",
171
+ `echo '${escapedKey}' >> ~/.ssh/authorized_keys`,
172
+ "chmod 600 ~/.ssh/authorized_keys",
173
+ ].join(" && ");
174
+
175
+ conn.exec(cmd, (err, stream) => {
176
+ if (err) {
177
+ conn.end();
178
+ reject(new Error(`SSH 명령 실행 실패: ${err.message}`));
179
+ return;
180
+ }
181
+
182
+ let stderr = "";
183
+ stream.on("data", () => {}); // stdout 소비 (소비하지 않으면 스트림이 닫히지 않음)
184
+ stream.stderr.on("data", (data: Uint8Array) => {
185
+ stderr += data.toString();
186
+ });
187
+ stream.on("exit", (code: number | null) => {
188
+ conn.end();
189
+ if (code !== 0) {
190
+ reject(new Error(`SSH 공개키 등록 실패 (종료 코드: ${code}): ${stderr}`));
191
+ } else {
192
+ resolve();
193
+ }
194
+ });
195
+ });
196
+ });
197
+ conn.on("error", (err) => {
198
+ reject(new Error(`SSH 연결 실패 (${target.host}): ${err.message}`));
199
+ });
200
+ conn.connect({
201
+ host: target.host,
202
+ port: target.port ?? 22,
203
+ username: target.user,
204
+ password: pass,
205
+ readyTimeout: 10_000,
206
+ });
207
+ });
208
+ }
@@ -0,0 +1,132 @@
1
+ import path from "path";
2
+ import semver from "semver";
3
+ import { fsx } from "@simplysm/core-node";
4
+ import { json } from "@simplysm/core-common";
5
+
6
+ /**
7
+ * package.json 타입 (필수 필드만)
8
+ */
9
+ export interface PackageJson {
10
+ name: string;
11
+ version: string;
12
+ dependencies?: Record<string, string>;
13
+ devDependencies?: Record<string, string>;
14
+ peerDependencies?: Record<string, string>;
15
+ optionalDependencies?: Record<string, string>;
16
+ }
17
+
18
+ /**
19
+ * 프로젝트 및 패키지 버전 업그레이드
20
+ * @param dryRun true이면 파일을 수정하지 않고 새 버전만 계산
21
+ */
22
+ export async function upgradeVersion(
23
+ cwd: string,
24
+ allPkgPaths: string[],
25
+ dryRun: boolean,
26
+ ): Promise<{ version: string; changedFiles: string[] }> {
27
+ const changedFiles: string[] = [];
28
+ const projPkgPath = path.resolve(cwd, "package.json");
29
+ const projPkg = await fsx.readJson<PackageJson>(projPkgPath);
30
+
31
+ const currentVersion = projPkg.version;
32
+ const prereleaseInfo = semver.prerelease(currentVersion);
33
+
34
+ // 프리릴리스 여부에 따라 증가 전략 결정
35
+ const newVersion =
36
+ prereleaseInfo !== null
37
+ ? semver.inc(currentVersion, "prerelease")!
38
+ : semver.inc(currentVersion, "patch")!;
39
+
40
+ if (dryRun) {
41
+ // dry-run: 파일을 수정하지 않고 새 버전만 반환
42
+ return { version: newVersion, changedFiles: [] };
43
+ }
44
+
45
+ projPkg.version = newVersion;
46
+ await fsx.write(projPkgPath, json.stringify(projPkg, { space: 2 }) + "\n");
47
+ changedFiles.push(projPkgPath);
48
+
49
+ // 각 패키지의 package.json에 버전 설정
50
+ for (const pkgPath of allPkgPaths) {
51
+ const pkgJsonPath = path.resolve(pkgPath, "package.json");
52
+ const pkgJson = await fsx.readJson<PackageJson>(pkgJsonPath);
53
+ pkgJson.version = newVersion;
54
+ await fsx.write(pkgJsonPath, json.stringify(pkgJson, { space: 2 }) + "\n");
55
+ changedFiles.push(pkgJsonPath);
56
+ }
57
+
58
+ // 템플릿 파일의 @simplysm 패키지 버전 동기화
59
+ const templateFiles = await fsx.glob(path.resolve(cwd, "packages/sd-cli/templates/**/*.hbs"));
60
+ const versionRegex = /("@simplysm\/[^"]+"\s*:\s*)"~[^"]+"/g;
61
+
62
+ for (const templatePath of templateFiles) {
63
+ const content = await fsx.read(templatePath);
64
+ const newContent = content.replace(versionRegex, `$1"~${newVersion}"`);
65
+
66
+ if (content !== newContent) {
67
+ await fsx.write(templatePath, newContent);
68
+ changedFiles.push(templatePath);
69
+ }
70
+ }
71
+
72
+ return { version: newVersion, changedFiles };
73
+ }
74
+
75
+ /**
76
+ * 배포할 패키지의 의존성 레벨을 계산한다.
77
+ * 의존성이 없는 패키지 → Level 0, Level 0에만 의존하는 패키지 → Level 1, ...
78
+ */
79
+ export async function computePublishLevels<T extends { name: string; path: string }>(
80
+ publishPkgs: T[],
81
+ ): Promise<T[][]> {
82
+ const pkgNames = new Set(publishPkgs.map((p) => p.name));
83
+
84
+ // 각 패키지의 워크스페이스 의존성 수집
85
+ const depsMap = new Map<string, Set<string>>();
86
+ for (const pkg of publishPkgs) {
87
+ const pkgJson = await fsx.readJson<PackageJson>(path.resolve(pkg.path, "package.json"));
88
+ const allDeps = {
89
+ ...pkgJson.dependencies,
90
+ ...pkgJson.peerDependencies,
91
+ ...pkgJson.optionalDependencies,
92
+ };
93
+
94
+ const workspaceDeps = new Set<string>();
95
+ for (const depName of Object.keys(allDeps)) {
96
+ const shortName = depName.replace(/^@simplysm\//, "");
97
+ if (shortName !== depName && pkgNames.has(shortName)) {
98
+ workspaceDeps.add(shortName);
99
+ }
100
+ }
101
+ depsMap.set(pkg.name, workspaceDeps);
102
+ }
103
+
104
+ // 위상 정렬로 레벨 분류
105
+ const levels: T[][] = [];
106
+ const assigned = new Set<string>();
107
+ const remaining = new Map(publishPkgs.map((p) => [p.name, p]));
108
+
109
+ while (remaining.size > 0) {
110
+ const level: T[] = [];
111
+ for (const [name, pkg] of remaining) {
112
+ const deps = depsMap.get(name)!;
113
+ if ([...deps].every((d) => assigned.has(d))) {
114
+ level.push(pkg);
115
+ }
116
+ }
117
+
118
+ if (level.length === 0) {
119
+ // 순환 의존성 — 나머지 패키지를 마지막 레벨에 배치
120
+ levels.push([...remaining.values()]);
121
+ break;
122
+ }
123
+
124
+ for (const pkg of level) {
125
+ assigned.add(pkg.name);
126
+ remaining.delete(pkg.name);
127
+ }
128
+ levels.push(level);
129
+ }
130
+
131
+ return levels;
132
+ }
@@ -1,6 +1,6 @@
1
1
  import { consola } from "consola";
2
2
  import { loadSdConfig } from "../utils/sd-config";
3
- import { setupReplaceDeps } from "../utils/replace-deps";
3
+ import { setupReplaceDeps } from "../deps/replace-deps/replace-deps";
4
4
 
5
5
  /**
6
6
  * replace-deps 명령어 옵션
@@ -1,14 +1,13 @@
1
1
  import {
2
- DevWatchOrchestrator,
3
- type DevWatchOrchestratorOptions,
4
- } from "../orchestrators/DevWatchOrchestrator";
2
+ WatchOrchestrator,
3
+ type WatchOrchestratorOptions,
4
+ } from "../orchestrators/WatchOrchestrator";
5
5
 
6
6
  /**
7
- * DevWatchOrchestrator를 통해 모든 패키지를 watch 모드로 빌드한다.
7
+ * WatchOrchestrator를 통해 모든 패키지를 watch 모드로 빌드한다.
8
8
  *
9
9
  * - `sd.config.ts`를 로드하여 패키지별 빌드 대상 정보를 확인한다
10
10
  * - `node`/`browser`/`neutral` target: esbuild watch 모드 빌드 + .d.ts 생성
11
- * - `server` target: esbuild watch 모드 빌드 (런타임 없음)
12
11
  * - `scripts` target (watch 설정 있을 때): 파일 변경 시 hook 실행
13
12
  * - 파일 변경 시 자동 재빌드
14
13
  * - SIGINT/SIGTERM 시그널로 종료
@@ -16,8 +15,8 @@ import {
16
15
  * @param options - watch 실행 옵션 (targets, options)
17
16
  * @returns 종료 시그널 수신 시 resolve
18
17
  */
19
- export async function runWatch(options: Omit<DevWatchOrchestratorOptions, "mode">): Promise<void> {
20
- const orchestrator = new DevWatchOrchestrator({ mode: "watch", ...options });
18
+ export async function runWatch(options: WatchOrchestratorOptions): Promise<void> {
19
+ const orchestrator = new WatchOrchestrator(options);
21
20
 
22
21
  try {
23
22
  await orchestrator.initialize();
@@ -0,0 +1,92 @@
1
+ import path from "path";
2
+ import fs from "fs";
3
+ import { consola } from "consola";
4
+ import { pathx } from "@simplysm/core-node";
5
+ import { discoverWorkspacePackages } from "../../utils/package-utils";
6
+
7
+ const logger = consola.withTag("sd:cli:collect-deps");
8
+
9
+ export interface DepsResult {
10
+ workspaceDeps: string[];
11
+ replaceDeps: string[];
12
+ }
13
+
14
+ /**
15
+ * pnpm-workspace.yaml 기반으로 workspace 패키지의 name → 상대 디렉토리 맵을 구성한다.
16
+ * 예: "@simplysm/core-node" → "packages/core-node"
17
+ */
18
+ function buildWorkspacePkgMap(cwd: string): Map<string, string> {
19
+ const map = new Map<string, string>();
20
+ const wsPkgs = discoverWorkspacePackages(cwd);
21
+ for (const [, relDir] of wsPkgs) {
22
+ const pkgJsonPath = pathx.posix(path.join(cwd, relDir, "package.json"));
23
+ if (!fs.existsSync(pkgJsonPath)) continue;
24
+ const pkgJson = JSON.parse(fs.readFileSync(pkgJsonPath, "utf-8")) as { name: string };
25
+ map.set(pkgJson.name, relDir);
26
+ }
27
+ return map;
28
+ }
29
+
30
+ export function collectDeps(
31
+ pkgDir: string,
32
+ cwd: string,
33
+ replaceDepsConfig?: Record<string, string>,
34
+ ): DepsResult {
35
+ const startTime = performance.now();
36
+ logger.debug("의존성 수집 시작");
37
+
38
+ // pnpm-workspace.yaml에서 workspace 패키지 디렉토리 패턴을 읽어 실제 패키지 맵 구성
39
+ const workspacePkgMap = buildWorkspacePkgMap(cwd);
40
+
41
+ const replaceDepsPatterns: Array<{ regex: RegExp }> = [];
42
+ if (replaceDepsConfig != null) {
43
+ for (const pattern of Object.keys(replaceDepsConfig)) {
44
+ const regexStr = pattern.replace(/[.+]/g, (ch) => `\\${ch}`).replace(/\*/g, "[^/]+");
45
+ replaceDepsPatterns.push({ regex: new RegExp(`^${regexStr}$`) });
46
+ }
47
+ }
48
+
49
+ const workspaceDeps: string[] = [];
50
+ const replaceDeps: string[] = [];
51
+ const visited = new Set<string>();
52
+
53
+ function traverse(dir: string): void {
54
+ const pkgJsonPath = pathx.posix(path.join(dir, "package.json"));
55
+ if (!fs.existsSync(pkgJsonPath)) return;
56
+
57
+ const pkgJson = JSON.parse(fs.readFileSync(pkgJsonPath, "utf-8")) as {
58
+ dependencies?: Record<string, string>;
59
+ };
60
+ const deps = Object.keys(pkgJson.dependencies ?? {});
61
+
62
+ for (const dep of deps) {
63
+ if (visited.has(dep)) continue;
64
+ visited.add(dep);
65
+
66
+ // 워크스페이스 패키지 확인
67
+ const wsDir = workspacePkgMap.get(dep);
68
+ if (wsDir != null) {
69
+ workspaceDeps.push(path.basename(wsDir));
70
+ traverse(pathx.posix(path.join(cwd, wsDir)));
71
+ continue;
72
+ }
73
+
74
+ // replaceDeps 패턴 확인
75
+ const matched = replaceDepsPatterns.find((p) => p.regex.test(dep));
76
+ if (matched != null) {
77
+ replaceDeps.push(dep);
78
+ const depNodeModulesDir = pathx.posix(path.join(cwd, "node_modules", ...dep.split("/")));
79
+ if (fs.existsSync(pathx.posix(path.join(depNodeModulesDir, "package.json")))) {
80
+ traverse(depNodeModulesDir);
81
+ }
82
+ continue;
83
+ }
84
+ }
85
+ }
86
+
87
+ traverse(pkgDir);
88
+ logger.debug(
89
+ `의존성 수집 완료: workspace=${String(workspaceDeps.length)}, replace=${String(replaceDeps.length)} (${Math.round(performance.now() - startTime)}ms)`,
90
+ );
91
+ return { workspaceDeps, replaceDeps };
92
+ }
@@ -1,10 +1,8 @@
1
1
  import fs from "fs";
2
2
  import path from "path";
3
3
  import { glob } from "glob";
4
- import { consola } from "consola";
5
- import { fsx, pathx, FsWatcher } from "@simplysm/core-node";
6
- import { exec } from "child_process";
7
- import { promisify } from "util";
4
+ import type { consola } from "consola";
5
+ import { pathx } from "@simplysm/core-node";
8
6
 
9
7
  /**
10
8
  * replaceDeps 설정의 glob 패턴을 대상 패키지 목록과 매칭하여
@@ -85,23 +83,6 @@ export function parseWorkspaceGlobs(content: string): string[] {
85
83
  return globs;
86
84
  }
87
85
 
88
- /**
89
- * 복사 시 제외할 이름 목록
90
- */
91
- const EXCLUDED_NAMES = new Set(["node_modules", "package.json", ".cache", "tests"]);
92
-
93
- /**
94
- * replaceDeps 복사용 필터 함수
95
- * node_modules, package.json, .cache, tests를 제외한다.
96
- *
97
- * @param itemPath - 복사할 항목의 절대 경로
98
- * @returns 복사 대상이면 true, 제외 대상이면 false
99
- */
100
- function replaceDepsCopyFilter(itemPath: string): boolean {
101
- const basename = path.basename(itemPath);
102
- return !EXCLUDED_NAMES.has(basename);
103
- }
104
-
105
86
  /**
106
87
  * replaceDeps 복사/교체 항목
107
88
  */
@@ -113,14 +94,6 @@ export interface ReplaceDepEntry {
113
94
  actualTargetPath: string;
114
95
  }
115
96
 
116
- /**
117
- * watchReplaceDeps의 반환 타입
118
- */
119
- export interface WatchReplaceDepResult {
120
- entries: ReplaceDepEntry[];
121
- dispose: () => void;
122
- }
123
-
124
97
  /**
125
98
  * 프로젝트 루트 및 워크스페이스 패키지 경로를 수집한다.
126
99
  *
@@ -161,7 +134,7 @@ async function collectSearchRoots(projectRoot: string): Promise<string[]> {
161
134
  * @param logger - consola 로거
162
135
  * @returns 해결된 교체 대상 항목 배열
163
136
  */
164
- async function resolveAllReplaceDepEntries(
137
+ export async function resolveAllReplaceDepEntries(
165
138
  projectRoot: string,
166
139
  replaceDeps: Record<string, string>,
167
140
  logger: ReturnType<typeof consola.withTag>,
@@ -193,7 +166,7 @@ async function resolveAllReplaceDepEntries(
193
166
  const targetNames: string[] = [];
194
167
  for (const pattern of Object.keys(replaceDeps)) {
195
168
  const matches = await glob(pattern, { cwd: nodeModulesDir });
196
- targetNames.push(...matches);
169
+ targetNames.push(...matches.map((m) => m.replaceAll("\\", "/")));
197
170
  }
198
171
 
199
172
  logger.debug(`[replace-deps] 탐색: ${nodeModulesDir} → ${targetNames.length}개 매칭 (${targetNames.join(", ")})`);
@@ -248,160 +221,3 @@ async function resolveAllReplaceDepEntries(
248
221
 
249
222
  return entries;
250
223
  }
251
-
252
- /**
253
- * replaceDeps 설정에 따라 node_modules의 패키지를 소스 디렉토리로 교체한다.
254
- *
255
- * 1. pnpm-workspace.yaml 파싱 → 워크스페이스 패키지 경로
256
- * 2. [루트, ...워크스페이스 패키지] node_modules에서 매칭 패키지 탐색
257
- * 3. 기존 symlink/디렉토리 제거 → 소스 경로 복사 (node_modules, package.json, .cache, tests 제외)
258
- *
259
- * @param projectRoot - 프로젝트 루트 경로
260
- * @param replaceDeps - sd.config.ts의 replaceDeps 설정
261
- */
262
- export async function setupReplaceDeps(
263
- projectRoot: string,
264
- replaceDeps: Record<string, string>,
265
- ): Promise<void> {
266
- const logger = consola.withTag("sd:cli:replace-deps");
267
- let setupCount = 0;
268
-
269
- logger.start("replace-deps 설정 중...");
270
-
271
- const entries = await resolveAllReplaceDepEntries(projectRoot, replaceDeps, logger);
272
-
273
- for (const { targetName, resolvedSourcePath, actualTargetPath } of entries) {
274
- try {
275
- // 소스 파일을 actualTargetPath에 덮어쓰기 복사 (기존 디렉토리 유지, symlink 보존)
276
- await fsx.copy(resolvedSourcePath, actualTargetPath, replaceDepsCopyFilter);
277
-
278
- setupCount += 1;
279
- } catch (err) {
280
- logger.error(`[${targetName}] 복사 실패: ${err instanceof Error ? err.message : err}`);
281
- }
282
- }
283
-
284
- logger.success(`replace-deps 설정 완료 (${setupCount}개 의존성 교체)`);
285
-
286
- // 교체된 패키지의 postinstall 스크립트 실행
287
- for (const { targetName, resolvedSourcePath, actualTargetPath } of entries) {
288
- const sourcePkgJsonPath = pathx.posix(path.join(resolvedSourcePath, "package.json"));
289
- try {
290
- const pkgJson = JSON.parse(await fs.promises.readFile(sourcePkgJsonPath, "utf-8"));
291
- const postinstall = pkgJson.scripts?.postinstall as string | undefined;
292
- if (postinstall == null) continue;
293
-
294
- logger.warn(`[${targetName}] postinstall 스크립트 실행: ${postinstall}`);
295
- logger.start(`[${targetName}] postinstall 실행 중...`);
296
- await promisify(exec)(postinstall, { cwd: actualTargetPath });
297
- logger.success(`[${targetName}] postinstall 실행 완료`);
298
- } catch (err) {
299
- logger.error(
300
- `[${targetName}] postinstall 실패: ${err instanceof Error ? err.message : err}`,
301
- );
302
- }
303
- }
304
- }
305
-
306
- /**
307
- * replaceDeps 설정에 따라 소스 디렉토리를 감시하고 변경사항을 대상 경로에 복사한다.
308
- *
309
- * 1. pnpm-workspace.yaml 파싱 → 워크스페이스 패키지 경로
310
- * 2. [루트, ...워크스페이스 패키지] node_modules에서 매칭 패키지 탐색
311
- * 3. FsWatcher로 소스 디렉토리 감시 (300ms 딜레이)
312
- * 4. 변경사항을 대상 경로에 복사 (node_modules, package.json, .cache, tests 제외)
313
- *
314
- * @param projectRoot - 프로젝트 루트 경로
315
- * @param replaceDeps - sd.config.ts의 replaceDeps 설정
316
- * @returns entries 및 dispose 함수
317
- */
318
- export async function watchReplaceDeps(
319
- projectRoot: string,
320
- replaceDeps: Record<string, string>,
321
- ): Promise<WatchReplaceDepResult> {
322
- const logger = consola.withTag("sd:cli:replace-deps:watch");
323
-
324
- const entries = await resolveAllReplaceDepEntries(projectRoot, replaceDeps, logger);
325
-
326
- // 소스 디렉토리 감시자 설정
327
- const watchers: FsWatcher[] = [];
328
- const watchedSources = new Set<string>();
329
-
330
- logger.start(`replace-deps 워치 시작 중... (${entries.length}개 대상)`);
331
-
332
- for (const entry of entries) {
333
- if (watchedSources.has(entry.resolvedSourcePath)) continue;
334
- watchedSources.add(entry.resolvedSourcePath);
335
-
336
- const excludedPaths = [...EXCLUDED_NAMES].map((name) =>
337
- pathx.posix(path.join(entry.resolvedSourcePath, name)),
338
- );
339
-
340
- const watcher = await FsWatcher.watch([entry.resolvedSourcePath], {
341
- followSymlinks: false,
342
- ignored: [...EXCLUDED_NAMES].map((name) => `**/${name}`),
343
- });
344
- watcher.onChange({ delay: 300 }, async (changeInfos) => {
345
- for (const { path: changedPath } of changeInfos) {
346
- // 제외 항목 필터: basename 매칭 또는 제외 디렉토리 내 경로
347
- if (
348
- EXCLUDED_NAMES.has(path.basename(changedPath)) ||
349
- excludedPaths.some((ep) => pathx.isChildPath(changedPath, ep))
350
- ) {
351
- continue;
352
- }
353
-
354
- // 이 소스 경로를 사용하는 모든 항목에 대해 복사
355
- for (const e of entries) {
356
- if (e.resolvedSourcePath !== entry.resolvedSourcePath) continue;
357
-
358
- // 소스로부터의 상대 경로 계산
359
- const relativePath = pathx.posix(path.relative(e.resolvedSourcePath, changedPath));
360
- const destPath = pathx.posix(path.join(e.actualTargetPath, relativePath));
361
-
362
- try {
363
- // 소스 존재 여부 확인
364
- let sourceExists = false;
365
- try {
366
- await fs.promises.access(changedPath);
367
- sourceExists = true;
368
- } catch {
369
- // 소스가 삭제됨
370
- }
371
-
372
- if (sourceExists) {
373
- // 소스가 디렉토리인지 파일인지 확인
374
- const stat = await fs.promises.stat(changedPath);
375
- if (stat.isDirectory()) {
376
- await fsx.mkdir(destPath);
377
- } else {
378
- await fsx.mkdir(pathx.posix(path.dirname(destPath)));
379
- await fsx.copy(changedPath, destPath, replaceDepsCopyFilter);
380
- }
381
- } else {
382
- // 소스가 삭제됨 → 대상도 삭제
383
- await fsx.rm(destPath);
384
- }
385
- } catch (err) {
386
- logger.error(
387
- `[${e.targetName}] 복사 실패 (${relativePath}): ${err instanceof Error ? err.message : err}`,
388
- );
389
- }
390
- }
391
- }
392
- });
393
-
394
- watchers.push(watcher);
395
- }
396
-
397
- logger.success("replace-deps 워치 준비 완료");
398
-
399
- return {
400
- entries,
401
- dispose: () => {
402
- for (const watcher of watchers) {
403
- void watcher.close();
404
- }
405
- },
406
- };
407
- }