@simplysm/sd-cli 12.13.21 → 12.13.23

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 (237) hide show
  1. package/package.json +12 -12
  2. package/src/entry/{sd-cli-cordova.ts → SdCliCordova.ts} +2 -2
  3. package/src/entry/{sd-cli-electron.ts → SdCliElectron.ts} +3 -3
  4. package/src/entry/{sd-cli-local-update.ts → SdCliLocalUpdate.ts} +6 -4
  5. package/src/entry/{sd-cli-project.ts → SdCliProject.ts} +55 -71
  6. package/src/pkg-builders/SdProjectBuildRunner.ts +347 -0
  7. package/src/pkg-builders/client/{sd-client.build-runner.ts → SdClientBuildRunner.ts} +31 -38
  8. package/src/pkg-builders/client/{sd-ng.bundler.ts → SdNgBundler.ts} +22 -31
  9. package/src/pkg-builders/client/{sd-ng.bundler-context.ts → SdNgBundlerContext.ts} +7 -9
  10. package/src/pkg-builders/client/{sd-ng.plugin-creator.ts → createSdNgPlugin.ts} +11 -94
  11. package/src/pkg-builders/commons/{scope-path.ts → ScopePathSet.ts} +3 -3
  12. package/src/pkg-builders/commons/SdBuildRunnerBase.ts +47 -0
  13. package/src/pkg-builders/lib/{sd-cli-db-context.file-generator.ts → SdCliDbContextFileGenerator.ts} +1 -1
  14. package/src/pkg-builders/lib/{sd-js-lib.build-runner.ts → SdJsLibBuildRunner.ts} +13 -32
  15. package/src/pkg-builders/lib/SdTsLibBuildRunner.ts +47 -0
  16. package/src/pkg-builders/lib/{sd-ts-lib.builder.ts → SdTsLibBuilder.ts} +12 -14
  17. package/src/pkg-builders/server/{sd-server.build-runner.ts → SdServerBuildRunner.ts} +25 -48
  18. package/src/pkg-builders/server/{sd-server.bundler.ts → SdServerBundler.ts} +26 -23
  19. package/src/pkg-builders/server/{sd-server.plugin-creator.ts → createSdServerPlugin.ts} +9 -7
  20. package/src/sd-cli-entry.ts +6 -12
  21. package/src/sd-cli.ts +1 -15
  22. package/src/ts-compiler/{sd-dependency-analyzer.ts → SdDepAnalyzer.ts} +5 -9
  23. package/src/ts-compiler/{sd-dependency-cache.ts → SdDepCache.ts} +1 -137
  24. package/src/ts-compiler/{sd-style-bundler.ts → SdStyleBundler.ts} +5 -5
  25. package/src/ts-compiler/{sd-ts-compiler.ts → SdTsCompiler.ts} +17 -144
  26. package/src/types/{build.types.ts → build/ISdBuildMessage.ts} +0 -6
  27. package/src/types/build/ISdBuildResult.ts +9 -0
  28. package/src/types/build/ISdTsCompilerOptions.ts +15 -0
  29. package/src/types/build/ISdTsCompilerResult.ts +12 -0
  30. package/src/types/build/TStylesheetBundlingResult.ts +15 -0
  31. package/src/types/{common-configs.types.ts → common-config/INpmConfig.ts} +0 -6
  32. package/src/types/common-config/ITsConfig.ts +5 -0
  33. package/src/types/{config.types.ts → config/ISdProjectConfig.ts} +0 -1
  34. package/src/types/plugin/ISdCliNgPluginResultCache.ts +9 -0
  35. package/src/types/{build-plugin.types.ts → plugin/ISdCliServerPluginResultCache.ts} +0 -7
  36. package/src/types/worker/ISdBuildRunnerWorkerType.ts +24 -0
  37. package/src/types/worker/IServerWorkerType.ts +8 -0
  38. package/src/utils/{sd-cli-convert-message.utils.ts → SdCliConvertMessageUtils.ts} +6 -3
  39. package/src/{entry/utils → utils}/loadProjConfAsync.ts +10 -6
  40. package/src/workers/build-runner.worker.ts +30 -29
  41. package/src/workers/server.worker.ts +7 -7
  42. package/tests/deps/sd-dependency-analyzer.spec.ts +38 -69
  43. package/tests/deps/sd-dependency-cache.spec.ts +3 -6
  44. package/dist/entry/sd-cli-ai-command.d.ts +0 -3
  45. package/dist/entry/sd-cli-ai-command.js +0 -65
  46. package/dist/entry/sd-cli-ai-command.js.map +0 -1
  47. package/dist/entry/sd-cli-cordova.d.ts +0 -16
  48. package/dist/entry/sd-cli-cordova.js +0 -398
  49. package/dist/entry/sd-cli-cordova.js.map +0 -1
  50. package/dist/entry/sd-cli-electron.d.ts +0 -18
  51. package/dist/entry/sd-cli-electron.js +0 -129
  52. package/dist/entry/sd-cli-electron.js.map +0 -1
  53. package/dist/entry/sd-cli-local-update.d.ts +0 -11
  54. package/dist/entry/sd-cli-local-update.js +0 -84
  55. package/dist/entry/sd-cli-local-update.js.map +0 -1
  56. package/dist/entry/sd-cli-postinstall.d.ts +0 -3
  57. package/dist/entry/sd-cli-postinstall.js +0 -39
  58. package/dist/entry/sd-cli-postinstall.js.map +0 -1
  59. package/dist/entry/sd-cli-project.d.ts +0 -22
  60. package/dist/entry/sd-cli-project.js +0 -325
  61. package/dist/entry/sd-cli-project.js.map +0 -1
  62. package/dist/entry/utils/loadProjConfAsync.d.ts +0 -5
  63. package/dist/entry/utils/loadProjConfAsync.js +0 -8
  64. package/dist/entry/utils/loadProjConfAsync.js.map +0 -1
  65. package/dist/fix/convert-extends-sd-modal-base-to-interface.d.ts +0 -1
  66. package/dist/fix/convert-extends-sd-modal-base-to-interface.js +0 -289
  67. package/dist/fix/convert-extends-sd-modal-base-to-interface.js.map +0 -1
  68. package/dist/fix/convert-extends-sd-print-template-base-to-interface.d.ts +0 -1
  69. package/dist/fix/convert-extends-sd-print-template-base-to-interface.js +0 -179
  70. package/dist/fix/convert-extends-sd-print-template-base-to-interface.js.map +0 -1
  71. package/dist/fix/convert-flat-pages-to-flat-menus.d.ts +0 -1
  72. package/dist/fix/convert-flat-pages-to-flat-menus.js +0 -68
  73. package/dist/fix/convert-flat-pages-to-flat-menus.js.map +0 -1
  74. package/dist/fix/convert-get-menus-to-usable-menus.d.ts +0 -1
  75. package/dist/fix/convert-get-menus-to-usable-menus.js +0 -48
  76. package/dist/fix/convert-get-menus-to-usable-menus.js.map +0 -1
  77. package/dist/fix/convert-modal-show-params.d.ts +0 -1
  78. package/dist/fix/convert-modal-show-params.js +0 -29
  79. package/dist/fix/convert-modal-show-params.js.map +0 -1
  80. package/dist/fix/convert-print-params.d.ts +0 -1
  81. package/dist/fix/convert-print-params.js +0 -37
  82. package/dist/fix/convert-print-params.js.map +0 -1
  83. package/dist/fix/convert-private-to-hash.d.ts +0 -1
  84. package/dist/fix/convert-private-to-hash.js +0 -59
  85. package/dist/fix/convert-private-to-hash.js.map +0 -1
  86. package/dist/fix/convert-sd-angular-symbol-names.d.ts +0 -1
  87. package/dist/fix/convert-sd-angular-symbol-names.js +0 -23
  88. package/dist/fix/convert-sd-angular-symbol-names.js.map +0 -1
  89. package/dist/fix/convert-sd-icon-to-fa-icon.d.ts +0 -1
  90. package/dist/fix/convert-sd-icon-to-fa-icon.js +0 -80
  91. package/dist/fix/convert-sd-icon-to-fa-icon.js.map +0 -1
  92. package/dist/fix/convert-sd-sheet-bindings-safety.d.ts +0 -1
  93. package/dist/fix/convert-sd-sheet-bindings-safety.js +0 -57
  94. package/dist/fix/convert-sd-sheet-bindings-safety.js.map +0 -1
  95. package/dist/fix/convert-select-modal-button-to-select-button.d.ts +0 -1
  96. package/dist/fix/convert-select-modal-button-to-select-button.js +0 -64
  97. package/dist/fix/convert-select-modal-button-to-select-button.js.map +0 -1
  98. package/dist/fix/convert-setup-cumulate-selected-keys-to-object-param.d.ts +0 -1
  99. package/dist/fix/convert-setup-cumulate-selected-keys-to-object-param.js +0 -38
  100. package/dist/fix/convert-setup-cumulate-selected-keys-to-object-param.js.map +0 -1
  101. package/dist/fix/convert-to-use-perms-signal.d.ts +0 -1
  102. package/dist/fix/convert-to-use-perms-signal.js +0 -99
  103. package/dist/fix/convert-to-use-perms-signal.js.map +0 -1
  104. package/dist/fix/core/convert-symbol.d.ts +0 -1
  105. package/dist/fix/core/convert-symbol.js +0 -93
  106. package/dist/fix/core/convert-symbol.js.map +0 -1
  107. package/dist/fix/core/get-ts-morph-source-files.d.ts +0 -1
  108. package/dist/fix/core/get-ts-morph-source-files.js +0 -8
  109. package/dist/fix/core/get-ts-morph-source-files.js.map +0 -1
  110. package/dist/fix/core/remove-named-import.d.ts +0 -1
  111. package/dist/fix/core/remove-named-import.js +0 -14
  112. package/dist/fix/core/remove-named-import.js.map +0 -1
  113. package/dist/fix/core/remove-symbol.d.ts +0 -1
  114. package/dist/fix/core/remove-symbol.js +0 -76
  115. package/dist/fix/core/remove-symbol.js.map +0 -1
  116. package/dist/fix/remove-sd-angular-symbol-names.d.ts +0 -1
  117. package/dist/fix/remove-sd-angular-symbol-names.js +0 -9
  118. package/dist/fix/remove-sd-angular-symbol-names.js.map +0 -1
  119. package/dist/fix/remove-unused-imports.d.ts +0 -1
  120. package/dist/fix/remove-unused-imports.js +0 -42
  121. package/dist/fix/remove-unused-imports.js.map +0 -1
  122. package/dist/fix/remove-unused-injects.d.ts +0 -1
  123. package/dist/fix/remove-unused-injects.js +0 -38
  124. package/dist/fix/remove-unused-injects.js.map +0 -1
  125. package/dist/fix/remove-unused-protected-readonly.d.ts +0 -1
  126. package/dist/fix/remove-unused-protected-readonly.js +0 -52
  127. package/dist/fix/remove-unused-protected-readonly.js.map +0 -1
  128. package/dist/pkg-builders/client/sd-cli-ng-routes.file-generator.d.ts +0 -9
  129. package/dist/pkg-builders/client/sd-cli-ng-routes.file-generator.js +0 -89
  130. package/dist/pkg-builders/client/sd-cli-ng-routes.file-generator.js.map +0 -1
  131. package/dist/pkg-builders/client/sd-client.build-runner.d.ts +0 -7
  132. package/dist/pkg-builders/client/sd-client.build-runner.js +0 -119
  133. package/dist/pkg-builders/client/sd-client.build-runner.js.map +0 -1
  134. package/dist/pkg-builders/client/sd-ng.bundler-context.d.ts +0 -22
  135. package/dist/pkg-builders/client/sd-ng.bundler-context.js +0 -91
  136. package/dist/pkg-builders/client/sd-ng.bundler-context.js.map +0 -1
  137. package/dist/pkg-builders/client/sd-ng.bundler.d.ts +0 -27
  138. package/dist/pkg-builders/client/sd-ng.bundler.js +0 -489
  139. package/dist/pkg-builders/client/sd-ng.bundler.js.map +0 -1
  140. package/dist/pkg-builders/client/sd-ng.plugin-creator.d.ts +0 -13
  141. package/dist/pkg-builders/client/sd-ng.plugin-creator.js +0 -223
  142. package/dist/pkg-builders/client/sd-ng.plugin-creator.js.map +0 -1
  143. package/dist/pkg-builders/commons/build-runner.base.d.ts +0 -29
  144. package/dist/pkg-builders/commons/build-runner.base.js +0 -114
  145. package/dist/pkg-builders/commons/build-runner.base.js.map +0 -1
  146. package/dist/pkg-builders/commons/scope-path.d.ts +0 -7
  147. package/dist/pkg-builders/commons/scope-path.js +0 -14
  148. package/dist/pkg-builders/commons/scope-path.js.map +0 -1
  149. package/dist/pkg-builders/lib/sd-cli-db-context.file-generator.d.ts +0 -9
  150. package/dist/pkg-builders/lib/sd-cli-db-context.file-generator.js +0 -134
  151. package/dist/pkg-builders/lib/sd-cli-db-context.file-generator.js.map +0 -1
  152. package/dist/pkg-builders/lib/sd-cli-index.file-generator.d.ts +0 -10
  153. package/dist/pkg-builders/lib/sd-cli-index.file-generator.js +0 -61
  154. package/dist/pkg-builders/lib/sd-cli-index.file-generator.js.map +0 -1
  155. package/dist/pkg-builders/lib/sd-js-lib.build-runner.d.ts +0 -8
  156. package/dist/pkg-builders/lib/sd-js-lib.build-runner.js +0 -50
  157. package/dist/pkg-builders/lib/sd-js-lib.build-runner.js.map +0 -1
  158. package/dist/pkg-builders/lib/sd-ts-lib.build-runner.d.ts +0 -7
  159. package/dist/pkg-builders/lib/sd-ts-lib.build-runner.js +0 -41
  160. package/dist/pkg-builders/lib/sd-ts-lib.build-runner.js.map +0 -1
  161. package/dist/pkg-builders/lib/sd-ts-lib.builder.d.ts +0 -14
  162. package/dist/pkg-builders/lib/sd-ts-lib.builder.js +0 -65
  163. package/dist/pkg-builders/lib/sd-ts-lib.builder.js.map +0 -1
  164. package/dist/pkg-builders/sd-multi.build-runner.d.ts +0 -14
  165. package/dist/pkg-builders/sd-multi.build-runner.js +0 -228
  166. package/dist/pkg-builders/sd-multi.build-runner.js.map +0 -1
  167. package/dist/pkg-builders/server/sd-server.build-runner.d.ts +0 -7
  168. package/dist/pkg-builders/server/sd-server.build-runner.js +0 -264
  169. package/dist/pkg-builders/server/sd-server.build-runner.js.map +0 -1
  170. package/dist/pkg-builders/server/sd-server.bundler.d.ts +0 -22
  171. package/dist/pkg-builders/server/sd-server.bundler.js +0 -153
  172. package/dist/pkg-builders/server/sd-server.bundler.js.map +0 -1
  173. package/dist/pkg-builders/server/sd-server.plugin-creator.d.ts +0 -13
  174. package/dist/pkg-builders/server/sd-server.plugin-creator.js +0 -62
  175. package/dist/pkg-builders/server/sd-server.plugin-creator.js.map +0 -1
  176. package/dist/sd-cli-entry.d.ts +0 -2
  177. package/dist/sd-cli-entry.js +0 -263
  178. package/dist/sd-cli-entry.js.map +0 -1
  179. package/dist/sd-cli.d.ts +0 -2
  180. package/dist/sd-cli.js +0 -97
  181. package/dist/sd-cli.js.map +0 -1
  182. package/dist/ts-compiler/sd-dependency-analyzer.d.ts +0 -15
  183. package/dist/ts-compiler/sd-dependency-analyzer.js +0 -302
  184. package/dist/ts-compiler/sd-dependency-analyzer.js.map +0 -1
  185. package/dist/ts-compiler/sd-dependency-cache.d.ts +0 -43
  186. package/dist/ts-compiler/sd-dependency-cache.js +0 -310
  187. package/dist/ts-compiler/sd-dependency-cache.js.map +0 -1
  188. package/dist/ts-compiler/sd-style-bundler.d.ts +0 -16
  189. package/dist/ts-compiler/sd-style-bundler.js +0 -118
  190. package/dist/ts-compiler/sd-style-bundler.js.map +0 -1
  191. package/dist/ts-compiler/sd-ts-compiler.d.ts +0 -8
  192. package/dist/ts-compiler/sd-ts-compiler.js +0 -522
  193. package/dist/ts-compiler/sd-ts-compiler.js.map +0 -1
  194. package/dist/types/build-plugin.types.d.ts +0 -14
  195. package/dist/types/build-plugin.types.js +0 -2
  196. package/dist/types/build-plugin.types.js.map +0 -1
  197. package/dist/types/build-runner.types.d.ts +0 -10
  198. package/dist/types/build-runner.types.js +0 -2
  199. package/dist/types/build-runner.types.js.map +0 -1
  200. package/dist/types/build.types.d.ts +0 -15
  201. package/dist/types/build.types.js +0 -2
  202. package/dist/types/build.types.js.map +0 -1
  203. package/dist/types/common-configs.types.d.ts +0 -24
  204. package/dist/types/common-configs.types.js +0 -2
  205. package/dist/types/common-configs.types.js.map +0 -1
  206. package/dist/types/config.types.d.ts +0 -109
  207. package/dist/types/config.types.js +0 -2
  208. package/dist/types/config.types.js.map +0 -1
  209. package/dist/types/ts-compiler.types.d.ts +0 -37
  210. package/dist/types/ts-compiler.types.js +0 -2
  211. package/dist/types/ts-compiler.types.js.map +0 -1
  212. package/dist/types/worker.types.d.ts +0 -67
  213. package/dist/types/worker.types.js +0 -2
  214. package/dist/types/worker.types.js.map +0 -1
  215. package/dist/utils/sd-cli-convert-message.utils.d.ts +0 -21
  216. package/dist/utils/sd-cli-convert-message.utils.js +0 -137
  217. package/dist/utils/sd-cli-convert-message.utils.js.map +0 -1
  218. package/dist/utils/sd-cli-performance-time.d.ts +0 -9
  219. package/dist/utils/sd-cli-performance-time.js +0 -51
  220. package/dist/utils/sd-cli-performance-time.js.map +0 -1
  221. package/dist/workers/build-runner.worker.d.ts +0 -1
  222. package/dist/workers/build-runner.worker.js +0 -49
  223. package/dist/workers/build-runner.worker.js.map +0 -1
  224. package/dist/workers/server.worker.d.ts +0 -1
  225. package/dist/workers/server.worker.js +0 -50
  226. package/dist/workers/server.worker.js.map +0 -1
  227. package/src/pkg-builders/commons/build-runner.base.ts +0 -184
  228. package/src/pkg-builders/lib/sd-ts-lib.build-runner.ts +0 -57
  229. package/src/pkg-builders/sd-multi.build-runner.ts +0 -304
  230. package/src/types/build-runner.types.ts +0 -11
  231. package/src/types/ts-compiler.types.ts +0 -43
  232. package/src/types/worker.types.ts +0 -51
  233. /package/src/entry/{sd-cli-ai-command.ts → SdCliAiCommand.ts} +0 -0
  234. /package/src/entry/{sd-cli-postinstall.ts → SdCliPostinstall.ts} +0 -0
  235. /package/src/pkg-builders/client/{sd-cli-ng-routes.file-generator.ts → SdCliNgRoutesFileGenerator.ts} +0 -0
  236. /package/src/pkg-builders/lib/{sd-cli-index.file-generator.ts → SdCliIndexFileGenerator.ts} +0 -0
  237. /package/src/utils/{sd-cli-performance-time.ts → SdCliPerformanceTimer.ts} +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@simplysm/sd-cli",
3
- "version": "12.13.21",
3
+ "version": "12.13.23",
4
4
  "description": "심플리즘 패키지 - CLI",
5
5
  "author": "김석래",
6
6
  "repository": {
@@ -12,26 +12,26 @@
12
12
  "bin": "./dist/sd-cli.js",
13
13
  "type": "module",
14
14
  "dependencies": {
15
- "@angular/build": "^20.2.1",
16
- "@angular/compiler": "^20.2.3",
17
- "@angular/compiler-cli": "^20.2.3",
18
- "@anthropic-ai/sdk": "^0.60.0",
15
+ "@angular/build": "^20.2.2",
16
+ "@angular/compiler": "^20.2.4",
17
+ "@angular/compiler-cli": "^20.2.4",
18
+ "@anthropic-ai/sdk": "^0.61.0",
19
19
  "@electron/rebuild": "^4.0.1",
20
- "@simplysm/sd-core-common": "12.13.21",
21
- "@simplysm/sd-core-node": "12.13.21",
22
- "@simplysm/sd-service-server": "12.13.21",
23
- "@simplysm/sd-storage": "12.13.21",
20
+ "@simplysm/sd-core-common": "12.13.23",
21
+ "@simplysm/sd-core-node": "12.13.23",
22
+ "@simplysm/sd-service-server": "12.13.23",
23
+ "@simplysm/sd-storage": "12.13.23",
24
24
  "browserslist": "^4.25.4",
25
25
  "cordova": "^12.0.0",
26
- "electron": "^37.4.0",
26
+ "electron": "^38.0.0",
27
27
  "electron-builder": "26.0.12",
28
28
  "esbuild": "0.25.9",
29
29
  "esbuild-sass-plugin": "^3.3.1",
30
- "eslint": "^9.34.0",
30
+ "eslint": "^9.35.0",
31
31
  "glob": "^11.0.3",
32
32
  "node-stdlib-browser": "^1.3.1",
33
33
  "rxjs": "^7.8.2",
34
- "sass": "^1.91.0",
34
+ "sass-embedded": "^1.92.1",
35
35
  "semver": "^7.7.2",
36
36
  "specifier-resolution-node": "^1.1.4",
37
37
  "ts-morph": "^26.0.0",
@@ -1,8 +1,8 @@
1
1
  import * as path from "path";
2
2
  import { FsUtils, PathUtils, SdLogger, SdProcess } from "@simplysm/sd-core-node";
3
- import { INpmConfig } from "../types/common-configs.types";
4
- import { ISdClientBuilderCordovaConfig } from "../types/config.types";
3
+ import { ISdClientBuilderCordovaConfig } from "../types/config/ISdProjectConfig";
5
4
  import { SdZip, XmlConvert } from "@simplysm/sd-core-common";
5
+ import { INpmConfig } from "../types/common-config/INpmConfig";
6
6
 
7
7
  export class SdCliCordova {
8
8
  // 상수 정의
@@ -2,10 +2,10 @@ import { FsUtils, SdLogger, SdProcess } from "@simplysm/sd-core-node";
2
2
  import fs from "fs";
3
3
  import os from "os";
4
4
  import path from "path";
5
- import { INpmConfig } from "../types/common-configs.types";
6
- import { ISdClientBuilderElectronConfig } from "../types/config.types";
7
- import { loadProjConfAsync } from "./utils/loadProjConfAsync";
5
+ import { ISdClientBuilderElectronConfig } from "../types/config/ISdProjectConfig";
6
+ import { loadProjConfAsync } from "../utils/loadProjConfAsync";
8
7
  import electronBuilder from "electron-builder";
8
+ import { INpmConfig } from "../types/common-config/INpmConfig";
9
9
 
10
10
  export class SdCliElectron {
11
11
  static #logger = SdLogger.get(["simplysm", "sd-cli", "SdCliElectron"]);
@@ -1,6 +1,6 @@
1
1
  import { FsUtils, PathUtils, SdFsWatcher, SdLogger } from "@simplysm/sd-core-node";
2
2
  import path from "path";
3
- import { loadProjConfAsync } from "./utils/loadProjConfAsync";
3
+ import { loadProjConfAsync } from "../utils/loadProjConfAsync";
4
4
 
5
5
  export class SdCliLocalUpdate {
6
6
  static async runAsync(opt: { config: string; options?: string[] }): Promise<void> {
@@ -11,7 +11,7 @@ export class SdCliLocalUpdate {
11
11
  if (!projConf.localUpdates) return;
12
12
 
13
13
  const updatePathInfos = this.#getUpdatePathInfos(projConf.localUpdates);
14
- logger.debug("로컬 업데이트 구성", updatePathInfos);
14
+ logger.debug("로컬 업데이트 구성");
15
15
 
16
16
  logger.log("로컬 라이브러리 업데이트 시작...");
17
17
  for (const updatePathInfo of updatePathInfos) {
@@ -36,11 +36,13 @@ export class SdCliLocalUpdate {
36
36
  if (!projConf.localUpdates) return;
37
37
 
38
38
  const updatePathInfos = this.#getUpdatePathInfos(projConf.localUpdates);
39
- logger.debug("로컬 업데이트 구성", updatePathInfos);
39
+ logger.debug("로컬 업데이트 구성");
40
40
 
41
41
  const watcher = SdFsWatcher.watch(updatePathInfos.map((item) => item.source));
42
42
  watcher.onChange({ delay: 1000 }, (changedInfos) => {
43
- const changedFileInfos = changedInfos.filter((item) => ["add", "change", "unlink"].includes(item.event));
43
+ const changedFileInfos = changedInfos.filter((item) =>
44
+ ["add", "change", "unlink"].includes(item.event),
45
+ );
44
46
  if (changedFileInfos.length === 0) return;
45
47
 
46
48
  logger.log("로컬 라이브러리 변경감지...");
@@ -3,20 +3,19 @@ import { FsUtils, PathUtils, SdLogger, SdProcess } from "@simplysm/sd-core-node"
3
3
  import semver from "semver";
4
4
  import { NeverEntryError, StringUtils, Wait } from "@simplysm/sd-core-common";
5
5
  import { SdStorage } from "@simplysm/sd-storage";
6
- import { SdCliLocalUpdate } from "./sd-cli-local-update";
7
- import { SdMultiBuildRunner } from "../pkg-builders/sd-multi.build-runner";
8
- import { SdCliConvertMessageUtils } from "../utils/sd-cli-convert-message.utils";
9
- import { TSdPackageConfig } from "../types/config.types";
10
- import { INpmConfig } from "../types/common-configs.types";
11
- import { ISdBuildMessage } from "../types/build.types";
12
- import { loadProjConfAsync } from "./utils/loadProjConfAsync";
6
+ import { SdCliLocalUpdate } from "./SdCliLocalUpdate";
7
+ import { SdCliConvertMessageUtils } from "../utils/SdCliConvertMessageUtils";
8
+ import { TSdPackageConfig } from "../types/config/ISdProjectConfig";
9
+ import { ISdBuildMessage } from "../types/build/ISdBuildMessage";
10
+ import { loadProjConfAsync } from "../utils/loadProjConfAsync";
11
+ import { SdProjectBuildRunner } from "../pkg-builders/SdProjectBuildRunner";
12
+ import { INpmConfig } from "../types/common-config/INpmConfig";
13
13
 
14
14
  export class SdCliProject {
15
15
  static async watchAsync(opt: {
16
16
  config: string;
17
17
  options?: string[];
18
18
  packages?: string[];
19
- inspects?: string[];
20
19
  emitOnly?: boolean;
21
20
  noEmit?: boolean;
22
21
  }): Promise<void> {
@@ -33,14 +32,17 @@ export class SdCliProject {
33
32
  }
34
33
 
35
34
  logger.debug("프로젝트 package.json 가져오기...");
36
- const projNpmConf = FsUtils.readJson(path.resolve(process.cwd(), "package.json")) as INpmConfig;
35
+ const projNpmConf = (await FsUtils.readJsonAsync(
36
+ path.resolve(process.cwd(), "package.json"),
37
+ )) as INpmConfig;
37
38
 
38
39
  logger.debug("패키지 목록 구성...");
39
40
  if (!projNpmConf.workspaces) {
40
41
  throw new Error("프로젝트 package.json에 workspaces가 설정되어있지 않습니다.");
41
42
  }
42
- const allPkgPaths = projNpmConf.workspaces
43
- .mapMany((item) => FsUtils.glob(item))
43
+ const allPkgPaths = (
44
+ await projNpmConf.workspaces.mapManyAsync(async (item) => await FsUtils.globAsync(item))
45
+ )
44
46
  .filter((item) => !item.includes("."))
45
47
  .map((item) => PathUtils.norm(item));
46
48
  let pkgPaths = allPkgPaths.filter((pkgPath) => path.basename(pkgPath) in projConf.packages);
@@ -56,29 +58,17 @@ export class SdCliProject {
56
58
  throw new Error("패키지를 찾을 수 없습니다. (" + notExistsPkgs.join(", ") + ")");
57
59
  }
58
60
 
59
- logger.debug("빌드 프로세스 시작...");
60
- const multiBuildRunner = new SdMultiBuildRunner()
61
- .on("change", () => {
61
+ await SdProjectBuildRunner.watchAsync({
62
+ pkgPaths,
63
+ projConf,
64
+ emitOnly: opt.emitOnly ?? false,
65
+ noEmit: opt.noEmit ?? false,
66
+ onChange: () => {
62
67
  logger.debug("빌드를 시작합니다...");
63
- })
64
- .on("complete", (messages) => {
68
+ },
69
+ onComplete: (messages) => {
65
70
  this.#logging(messages, logger);
66
- });
67
-
68
- await pkgPaths.parallelAsync(async (pkgPath) => {
69
- const pkgConf = projConf.packages[path.basename(pkgPath)];
70
- if (pkgConf?.type === "library" && pkgConf.noBuild) {
71
- return;
72
- }
73
-
74
- await multiBuildRunner.runAsync({
75
- cmd: "watch",
76
- pkgPath,
77
- projConf: projConf,
78
- workspaces: projNpmConf.workspaces!,
79
- emitOnly: opt.emitOnly ?? false,
80
- noEmit: opt.noEmit ?? false,
81
- });
71
+ },
82
72
  });
83
73
  }
84
74
 
@@ -87,48 +77,47 @@ export class SdCliProject {
87
77
  options?: string[];
88
78
  packages?: string[];
89
79
  }): Promise<void> {
90
- const logger = SdLogger.get(["simplysm", "sd-cli", "SdCliProject", "buildAsync"]);
80
+ const logger = SdLogger.get(["simplysm", "sd-cli", "SdCliProject", "watchAsync"]);
91
81
 
92
82
  logger.debug("프로젝트 설정 가져오기...");
93
- const projConf = await loadProjConfAsync(process.cwd(), false, opt);
83
+ const projConf = await loadProjConfAsync(process.cwd(), true, opt);
94
84
 
95
85
  logger.debug("프로젝트 package.json 가져오기...");
96
- const projNpmConf = FsUtils.readJson(path.resolve(process.cwd(), "package.json")) as INpmConfig;
86
+ const projNpmConf = (await FsUtils.readJsonAsync(
87
+ path.resolve(process.cwd(), "package.json"),
88
+ )) as INpmConfig;
97
89
 
98
90
  logger.debug("패키지 목록 구성...");
99
91
  if (!projNpmConf.workspaces) {
100
92
  throw new Error("프로젝트 package.json에 workspaces가 설정되어있지 않습니다.");
101
93
  }
102
- const allPkgPaths = projNpmConf.workspaces
103
- .mapMany((item) => FsUtils.glob(item))
94
+ const allPkgPaths = (
95
+ await projNpmConf.workspaces.mapManyAsync(async (item) => await FsUtils.globAsync(item))
96
+ )
97
+ .filter((item) => !item.includes("."))
104
98
  .map((item) => PathUtils.norm(item));
105
99
  let pkgPaths = allPkgPaths.filter((pkgPath) => path.basename(pkgPath) in projConf.packages);
106
100
  if (opt.packages) {
107
101
  pkgPaths = pkgPaths.filter((pkgPath) => opt.packages!.includes(path.basename(pkgPath)));
108
102
  }
109
103
 
104
+ logger.debug("패키지 존재 확인...");
105
+ const notExistsPkgs = Object.keys(projConf.packages).filter((pkgConfKey) =>
106
+ allPkgPaths.every((pkgPath) => path.basename(pkgPath) !== pkgConfKey),
107
+ );
108
+ if (notExistsPkgs.length > 0) {
109
+ throw new Error("패키지를 찾을 수 없습니다. (" + notExistsPkgs.join(", ") + ")");
110
+ }
111
+
110
112
  logger.debug("프로젝트 및 패키지 버전 설정...");
111
113
  this.#upgradeVersion(projNpmConf, allPkgPaths);
112
114
 
113
115
  logger.debug("빌드 프로세스 시작...");
114
- const multiBuildRunner = new SdMultiBuildRunner();
115
-
116
- const messages = await pkgPaths.parallelAsync(async (pkgPath) => {
117
- const pkgConf = projConf.packages[path.basename(pkgPath)];
118
- if (pkgConf?.type === "library" && pkgConf.noBuild) {
119
- return [];
120
- }
121
-
122
- return await multiBuildRunner.runAsync({
123
- cmd: "build",
124
- pkgPath,
125
- projConf: projConf,
126
- workspaces: projNpmConf.workspaces!,
127
- emitOnly: false,
128
- noEmit: false,
129
- });
116
+ const messages = await SdProjectBuildRunner.buildAsync({
117
+ pkgPaths,
118
+ projConf,
130
119
  });
131
- this.#logging(messages.mapMany(), logger);
120
+ this.#logging(messages, logger);
132
121
  }
133
122
 
134
123
  static async publishAsync(opt: {
@@ -172,6 +161,14 @@ export class SdCliProject {
172
161
  pkgPaths = pkgPaths.filter((pkgPath) => opt.packages!.includes(path.basename(pkgPath)));
173
162
  }
174
163
 
164
+ logger.debug("패키지 존재 확인...");
165
+ const notExistsPkgs = Object.keys(projConf.packages).filter((pkgConfKey) =>
166
+ allPkgPaths.every((pkgPath) => path.basename(pkgPath) !== pkgConfKey),
167
+ );
168
+ if (notExistsPkgs.length > 0) {
169
+ throw new Error("패키지를 찾을 수 없습니다. (" + notExistsPkgs.join(", ") + ")");
170
+ }
171
+
175
172
  if (!opt.noBuild) {
176
173
  logger.debug("프로젝트 및 패키지 버전 설정...");
177
174
  this.#upgradeVersion(projNpmConf, allPkgPaths);
@@ -179,25 +176,12 @@ export class SdCliProject {
179
176
  // 빌드
180
177
  try {
181
178
  logger.debug("빌드 프로세스 시작...");
182
- const multiBuildRunner = new SdMultiBuildRunner();
183
-
184
- const messages = await pkgPaths.parallelAsync(async (pkgPath) => {
185
- const pkgConf = projConf.packages[path.basename(pkgPath)];
186
- if (pkgConf?.type === "library" && pkgConf.noBuild) {
187
- return [];
188
- }
189
-
190
- return await multiBuildRunner.runAsync({
191
- cmd: "build",
192
- pkgPath,
193
- projConf: projConf,
194
- workspaces: projNpmConf.workspaces!,
195
- emitOnly: false,
196
- noEmit: false,
197
- });
179
+ const messages = await SdProjectBuildRunner.buildAsync({
180
+ pkgPaths,
181
+ projConf,
198
182
  });
199
183
 
200
- this.#logging(messages.mapMany(), logger);
184
+ this.#logging(messages, logger);
201
185
  } catch (err) {
202
186
  await SdProcess.spawnAsync("git", ["checkout", "."]);
203
187
  throw err;
@@ -0,0 +1,347 @@
1
+ import {
2
+ FsUtils,
3
+ PathUtils,
4
+ SdFsWatcher,
5
+ SdLogger,
6
+ SdWorker,
7
+ TNormPath,
8
+ } from "@simplysm/sd-core-node";
9
+ import { ISdProjectConfig, ISdServerPackageConfig } from "../types/config/ISdProjectConfig";
10
+ import path from "path";
11
+ import { ISdBuildMessage } from "../types/build/ISdBuildMessage";
12
+ import { ISdBuildRunnerWorkerType } from "../types/worker/ISdBuildRunnerWorkerType";
13
+ import { IServerWorkerType } from "../types/worker/IServerWorkerType";
14
+ import { INpmConfig } from "../types/common-config/INpmConfig";
15
+
16
+ export class SdProjectBuildRunner {
17
+ static #logger = SdLogger.get(["simplysm", "sd-cli", "SdProjectBuildRunner"]);
18
+
19
+ static #buildInfoMap = new Map<
20
+ TNormPath,
21
+ {
22
+ buildWorker: SdWorker<ISdBuildRunnerWorkerType>;
23
+ watchFileSet: Set<TNormPath>;
24
+ }
25
+ >();
26
+
27
+ static #serverInfoMap = new Map<
28
+ string,
29
+ {
30
+ worker?: SdWorker<any>;
31
+ port?: number;
32
+ clientMap?: Map<
33
+ string,
34
+ {
35
+ distPath: string;
36
+ buildTypes: ("web" | "electron" | "cordova")[];
37
+ }
38
+ >;
39
+ }
40
+ >();
41
+
42
+ static #resultCache = new Map<TNormPath, ISdBuildMessage[]>();
43
+
44
+ static async watchAsync(opt: {
45
+ pkgPaths: TNormPath[];
46
+ projConf: ISdProjectConfig;
47
+ emitOnly: boolean;
48
+ noEmit: boolean;
49
+ onChange: () => void;
50
+ onComplete: (buildMessages: ISdBuildMessage[]) => void;
51
+ }) {
52
+ const scopePathSet = await this.#getScopePathSetAsync(
53
+ opt.pkgPaths,
54
+ Object.keys(opt.projConf.localUpdates ?? {}),
55
+ );
56
+
57
+ const watcher = SdFsWatcher.watch(Array.from(scopePathSet), {
58
+ ignoreInitial: false,
59
+ });
60
+ watcher.onChange({ delay: 300 }, async (changeInfos) => {
61
+ // 변경된 패키지 정보 구성
62
+ const changeFiles = changeInfos.map((item) => PathUtils.norm(item.path));
63
+ const changedPkgInfos = opt.pkgPaths
64
+ .map((pkgPath) => {
65
+ let buildInfo = this.#buildInfoMap.get(pkgPath);
66
+ if (!buildInfo) return { pkgPath };
67
+
68
+ const modifiedFileSet = new Set(
69
+ changeFiles.filter((item) => buildInfo.watchFileSet.has(item)),
70
+ );
71
+
72
+ if (modifiedFileSet.size < 1) return;
73
+
74
+ return { pkgPath, buildInfo: buildInfo, modifiedFileSet };
75
+ })
76
+ .filterExists();
77
+ if (changedPkgInfos.length < 1) return;
78
+
79
+ // 변경된 패키지들에 대한 change처리
80
+ opt.onChange();
81
+ const buildResults = await changedPkgInfos.parallelAsync(async (changedPkgInfo) => {
82
+ // 처음
83
+ if (!changedPkgInfo.buildInfo) {
84
+ const buildWorker = new SdWorker<ISdBuildRunnerWorkerType>(
85
+ import.meta.resolve("../workers/build-runner.worker"),
86
+ );
87
+ await buildWorker.run("initialize", [
88
+ {
89
+ pkgPath: changedPkgInfo.pkgPath,
90
+ projConf: opt.projConf,
91
+ watch: true,
92
+ emitOnly: opt.emitOnly,
93
+ noEmit: opt.noEmit,
94
+ scopePathSet: scopePathSet,
95
+ },
96
+ ]);
97
+
98
+ const result = await buildWorker.run("rebuild", []);
99
+
100
+ this.#buildInfoMap.set(changedPkgInfo.pkgPath, {
101
+ buildWorker,
102
+ watchFileSet: result.watchFileSet,
103
+ });
104
+
105
+ return {
106
+ isFirst: true,
107
+ pkgPath: changedPkgInfo.pkgPath,
108
+ emitFileSet: result.emitFileSet,
109
+ affectedFileSet: result.affectedFileSet,
110
+
111
+ buildMessages: result.buildMessages,
112
+ };
113
+ }
114
+ // changed
115
+ else {
116
+ const result = await changedPkgInfo.buildInfo.buildWorker.run("rebuild", [
117
+ changedPkgInfo.modifiedFileSet,
118
+ ]);
119
+ changedPkgInfo.buildInfo.watchFileSet = result.watchFileSet;
120
+
121
+ return {
122
+ isFirst: false,
123
+ pkgPath: changedPkgInfo.pkgPath,
124
+ emitFileSet: result.emitFileSet,
125
+ affectedFileSet: result.affectedFileSet,
126
+
127
+ buildMessages: result.buildMessages,
128
+ };
129
+ }
130
+ });
131
+
132
+ if (!opt.noEmit) {
133
+ // 서버 구성 및 재시작
134
+ for (const buildResult of buildResults) {
135
+ const pkgConf = opt.projConf.packages[path.basename(buildResult.pkgPath)]!;
136
+ if (pkgConf.type === "server") {
137
+ const serverName = path.basename(buildResult.pkgPath);
138
+ this.#logger.debug(`서버 '${serverName}' 재시작...`);
139
+
140
+ const serverInfo = this.#serverInfoMap.getOrCreate(serverName, {});
141
+ const restartServerResult = await this.#restartServerAsync(
142
+ serverInfo.worker,
143
+ buildResult.pkgPath,
144
+ pkgConf,
145
+ );
146
+ serverInfo.worker = restartServerResult.worker;
147
+ serverInfo.port = restartServerResult.port;
148
+
149
+ /*await serverInfo.worker.run("addPathProxy", [
150
+ "node_modules",
151
+ path.resolve(process.cwd(), "node_modules"),
152
+ ]);
153
+ if (serverInfo.clientMap) {
154
+ for (const [clientName, clientInfo] of serverInfo.clientMap.entries()) {
155
+ await serverInfo.worker.run("addPathProxy", [clientName, clientInfo.path]);
156
+ }
157
+ }*/
158
+ } else if (pkgConf.type === "client" && typeof pkgConf.server === "object") {
159
+ const serverName = pkgConf.server.port.toString();
160
+ this.#logger.debug(`서버 '${serverName}' 재시작...`);
161
+
162
+ const serverInfo = this.#serverInfoMap.getOrCreate(serverName, {});
163
+ const restartServerResult = await this.#restartServerAsync(
164
+ serverInfo.worker,
165
+ buildResult.pkgPath,
166
+ pkgConf.server.port,
167
+ );
168
+ serverInfo.worker = restartServerResult.worker;
169
+ serverInfo.port = restartServerResult.port;
170
+
171
+ /*await worker.run("addPathProxy", [
172
+ "node_modules",
173
+ path.resolve(process.cwd(), "node_modules"),
174
+ ]);*/
175
+ }
176
+ }
177
+
178
+ // 클라이언트 구성 및 변경 Reload
179
+ for (const buildResult of buildResults) {
180
+ const pkgConf = opt.projConf.packages[path.basename(buildResult.pkgPath)]!;
181
+ if (pkgConf.type === "client") {
182
+ const clientName = path.basename(buildResult.pkgPath);
183
+ const serverKey =
184
+ typeof pkgConf.server === "string"
185
+ ? pkgConf.server
186
+ : typeof pkgConf.server === "object"
187
+ ? pkgConf.server.port.toString()
188
+ : undefined;
189
+ if (serverKey == null) continue;
190
+
191
+ const serverInfo = this.#serverInfoMap.get(serverKey);
192
+ if (!serverInfo || !serverInfo.worker) continue;
193
+
194
+ const distPath = path.resolve(buildResult.pkgPath, "dist");
195
+ serverInfo.clientMap = serverInfo.clientMap ?? new Map();
196
+ serverInfo.clientMap.set(clientName, {
197
+ distPath,
198
+ buildTypes: (pkgConf.builder ? Object.keys(pkgConf.builder) : ["web"]) as any,
199
+ });
200
+
201
+ if (buildResult.isFirst) continue;
202
+
203
+ this.#logger.debug(`클라이언트 '${clientName}' 새로고침...`);
204
+ await serverInfo.worker.run("broadcastReload", [
205
+ clientName,
206
+ new Set(
207
+ Array.from(buildResult.emitFileSet)
208
+ .filter((item) => !item.endsWith(".map"))
209
+ .map((item) => path.relative(distPath, item)),
210
+ ),
211
+ ]);
212
+ }
213
+ }
214
+
215
+ // 서버 Proxy 설정
216
+ for (const serverInfo of this.#serverInfoMap.values()) {
217
+ if (!serverInfo.worker) continue;
218
+
219
+ await serverInfo.worker.run("setPathProxy", [
220
+ {
221
+ ...Array.from(serverInfo.clientMap?.entries() ?? []).toObject(
222
+ (entry) => entry[0],
223
+ (entry) => entry[1].distPath,
224
+ ),
225
+ node_modules: path.resolve(process.cwd(), "node_modules"),
226
+ },
227
+ ]);
228
+ }
229
+
230
+ // 접속주소 logging
231
+ for (const serverName of this.#serverInfoMap.keys()) {
232
+ const serverInfo = this.#serverInfoMap.get(serverName);
233
+ const clientPaths: string[] = [];
234
+ for (const [clientName, clientInfo] of serverInfo?.clientMap?.entries() ?? []) {
235
+ for (const buildType of clientInfo.buildTypes) {
236
+ if (buildType === "web") {
237
+ clientPaths.push(`http://localhost:${serverInfo!.port}/${clientName}/`);
238
+ } else {
239
+ clientPaths.push(`http://localhost:${serverInfo!.port}/${clientName}/${buildType}`);
240
+ }
241
+ }
242
+ }
243
+
244
+ this.#logger.info("클라이언트 개발 서버 접속 주소\n" + clientPaths.join("\n"));
245
+ }
246
+ }
247
+
248
+ // 빌드 완료 이벤트
249
+
250
+ for (const buildResult of buildResults) {
251
+ this.#resultCache.delete(buildResult.pkgPath);
252
+ for (const affectedFilePath of buildResult.affectedFileSet) {
253
+ this.#resultCache.delete(affectedFilePath);
254
+ }
255
+
256
+ for (const buildMessage of buildResult.buildMessages) {
257
+ if (
258
+ !buildMessage.filePath ||
259
+ PathUtils.isChildPath(buildMessage.filePath, buildResult.pkgPath)
260
+ ) {
261
+ const cacheItem = this.#resultCache.getOrCreate(
262
+ buildMessage.filePath ?? buildResult.pkgPath,
263
+ [],
264
+ );
265
+ cacheItem.push(buildMessage);
266
+ }
267
+ }
268
+ }
269
+
270
+ opt.onComplete(Array.from(this.#resultCache.values()).mapMany());
271
+ });
272
+ }
273
+
274
+ static async buildAsync(opt: { pkgPaths: TNormPath[]; projConf: ISdProjectConfig }) {
275
+ const buildResults = await opt.pkgPaths.parallelAsync(async (pkgPath) => {
276
+ const worker = new SdWorker<ISdBuildRunnerWorkerType>(
277
+ import.meta.resolve("../workers/build-runner.worker"),
278
+ );
279
+
280
+ await worker.run("initialize", [
281
+ {
282
+ pkgPath,
283
+ projConf: opt.projConf,
284
+ },
285
+ ]);
286
+
287
+ const result = await worker.run("rebuild", []);
288
+ await worker.killAsync();
289
+ return {
290
+ buildMessages: result.buildMessages,
291
+ };
292
+ });
293
+
294
+ return buildResults.mapMany((item) => item.buildMessages);
295
+ }
296
+
297
+ static async #getScopePathSetAsync(pkgPaths: TNormPath[], localUpdateGlobs: string[]) {
298
+ const workspacePaths = pkgPaths.mapMany((item) => [
299
+ path.resolve(item, "src"),
300
+ path.resolve(item, "public"),
301
+ path.resolve(item, "public-dev"),
302
+ ]);
303
+ const localUpdatePaths = (
304
+ await localUpdateGlobs.mapManyAsync(
305
+ async (key) => await FsUtils.globAsync(path.resolve(process.cwd(), "node_modules", key)),
306
+ )
307
+ ).mapMany((key) => [
308
+ path.resolve(process.cwd(), "node_modules", key, "dist"),
309
+ path.resolve(process.cwd(), "node_modules", key, "src/**/*.scss"),
310
+ ]);
311
+
312
+ return new Set([...workspacePaths, ...localUpdatePaths].map((item) => PathUtils.norm(item)));
313
+ }
314
+
315
+ static async #restartServerAsync(
316
+ prevWorker: SdWorker<IServerWorkerType> | undefined,
317
+ pkgPath: string,
318
+ pkgConfOrPort: ISdServerPackageConfig | number,
319
+ ): Promise<{
320
+ worker: SdWorker<IServerWorkerType>;
321
+ port: number;
322
+ }> {
323
+ if (prevWorker) {
324
+ await prevWorker.killAsync();
325
+ }
326
+
327
+ const npmConf = FsUtils.readJson(path.resolve(pkgPath, "package.json")) as INpmConfig;
328
+
329
+ const worker = new SdWorker<IServerWorkerType>(
330
+ import.meta.resolve("../workers/server.worker"),
331
+ {
332
+ env: {
333
+ NODE_ENV: "development",
334
+ TZ: "Asia/Seoul",
335
+ SD_VERSION: npmConf.version,
336
+ ...(typeof pkgConfOrPort === "number" ? {} : pkgConfOrPort.env),
337
+ },
338
+ },
339
+ );
340
+ const port = await worker.run("listen", [
341
+ typeof pkgConfOrPort === "number" ? pkgConfOrPort : pkgPath,
342
+ ]);
343
+ this.#logger.debug("서버가 시작되었습니다.");
344
+
345
+ return { worker, port };
346
+ }
347
+ }