@uofx/cli 1.0.2 → 1.1.0

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 (240) hide show
  1. package/README.md +159 -3
  2. package/THIRD-PARTY-NOTICES.txt +84 -2
  3. package/dist/application/dtos/config/index.js +22 -0
  4. package/dist/application/dtos/config/request/index.js +19 -0
  5. package/dist/application/dtos/config/request/set-config.request.dto.js +3 -0
  6. package/dist/application/dtos/config/response/get-config.response.dto.js +8 -0
  7. package/dist/application/dtos/config/response/index.js +21 -0
  8. package/dist/application/dtos/dev/index.js +24 -0
  9. package/dist/application/dtos/dev/request/generate-component.request.dto.js +3 -0
  10. package/dist/application/dtos/dev/request/index.js +25 -0
  11. package/dist/application/dtos/dev/request/install-template.request.dto.js +3 -0
  12. package/dist/application/dtos/dev/request/new-project.request.dto.js +3 -0
  13. package/dist/application/dtos/dev/request/publish-plugin.request.dto.js +3 -0
  14. package/dist/application/dtos/dev/request/uninstall-template.request.dto.js +3 -0
  15. package/dist/application/dtos/dev/response/generate-component.response.dto.js +3 -0
  16. package/dist/application/dtos/dev/response/index.js +24 -0
  17. package/dist/application/dtos/dev/response/new-project.response.dto.js +3 -0
  18. package/dist/application/dtos/dev/response/publish-plugin.response.dto.js +3 -0
  19. package/dist/application/dtos/dev/response/template-info.response.dto.js +3 -0
  20. package/dist/application/dtos/env/index.js +24 -0
  21. package/dist/application/dtos/{request → env/request}/index.js +1 -3
  22. package/dist/application/dtos/env/request/list-running-instances.request.dto.js +3 -0
  23. package/dist/application/dtos/{response → env/response}/index.js +1 -1
  24. package/dist/application/dtos/env/response/list-running-instances.response.dto.js +3 -0
  25. package/dist/application/dtos/index.js +9 -2
  26. package/dist/application/dtos/logs/index.js +22 -0
  27. package/dist/application/dtos/logs/request/index.js +18 -0
  28. package/dist/application/dtos/logs/response/index.js +18 -0
  29. package/dist/application/index.js +1 -0
  30. package/dist/application/services/env/environment-validator.service.js +120 -0
  31. package/dist/application/services/env/index.js +11 -0
  32. package/dist/application/services/env/instance-cleanup.service.js +79 -0
  33. package/dist/application/services/index.js +21 -0
  34. package/dist/application/use-cases/config/get-all-config.use-case.js +54 -0
  35. package/dist/application/use-cases/config/get-config.use-case.js +7 -17
  36. package/dist/application/use-cases/config/index.js +23 -0
  37. package/dist/application/use-cases/config/set-config.use-case.js +49 -3
  38. package/dist/application/use-cases/dev/generate-component.use-case.js +138 -0
  39. package/dist/application/use-cases/dev/index.js +28 -0
  40. package/dist/application/use-cases/dev/install-template.use-case.js +60 -0
  41. package/dist/application/use-cases/dev/list-templates.use-case.js +45 -0
  42. package/dist/application/use-cases/dev/new-project.use-case.js +130 -0
  43. package/dist/application/use-cases/dev/publish-plugin.use-case.js +243 -0
  44. package/dist/application/use-cases/dev/uninstall-template.use-case.js +50 -0
  45. package/dist/application/use-cases/{instance → env}/delete-instance.use-case.js +2 -2
  46. package/dist/application/use-cases/{credentials → env}/get-credentials.use-case.js +1 -1
  47. package/dist/application/use-cases/{instance → env}/index.js +11 -0
  48. package/dist/application/use-cases/{instance → env}/install-instance.use-case.js +25 -136
  49. package/dist/application/use-cases/env/list-running-instances.use-case.js +47 -0
  50. package/dist/application/use-cases/{setup → env}/setup-environment.use-case.js +35 -4
  51. package/dist/application/use-cases/{instance → env}/start-instance.use-case.js +53 -41
  52. package/dist/application/use-cases/index.js +9 -6
  53. package/dist/application/use-cases/logs/index.js +21 -0
  54. package/dist/cli.js +175 -26
  55. package/dist/constants/defaults.js +8 -1
  56. package/dist/constants/oci-artifacts.js +4 -0
  57. package/dist/constants/paths.js +0 -4
  58. package/dist/constants/timeouts.js +5 -0
  59. package/dist/di/modules/application.module.js +13 -44
  60. package/dist/di/modules/config.module.js +19 -0
  61. package/dist/di/modules/dev.module.js +45 -0
  62. package/dist/di/modules/env.module.js +42 -0
  63. package/dist/di/modules/index.js +30 -0
  64. package/dist/di/modules/infrastructure.module.js +65 -82
  65. package/dist/di/modules/logs.module.js +15 -0
  66. package/dist/di/modules/presentation.module.js +18 -7
  67. package/dist/di/tokens.js +42 -30
  68. package/dist/domain/entities/credentials-resolver.entity.js +4 -1
  69. package/dist/domain/entities/credentials.entity.js +2 -5
  70. package/dist/domain/entities/delete-instance-validation.entity.js +4 -1
  71. package/dist/domain/entities/deployment-parameters.entity.js +11 -8
  72. package/dist/domain/entities/index.js +5 -1
  73. package/dist/domain/entities/instance-list-aggregator.entity.js +2 -2
  74. package/dist/domain/entities/instance-metadata.entity.js +2 -3
  75. package/dist/domain/entities/instance.entity.js +2 -1
  76. package/dist/domain/entities/log-filter.entity.js +6 -6
  77. package/dist/domain/entities/template-info.entity.js +63 -0
  78. package/dist/{infrastructure/utils/error-formatter.util.js → domain/errors/error-utils.js} +1 -1
  79. package/dist/domain/errors/index.js +19 -0
  80. package/dist/domain/index.js +6 -0
  81. package/dist/domain/interfaces/index.js +21 -0
  82. package/dist/domain/ports/dotnet-publisher.port.js +9 -0
  83. package/dist/{infrastructure/http/interfaces/http-client.interface.js → domain/ports/file-system.port.js} +1 -1
  84. package/dist/domain/ports/http-client.port.js +3 -0
  85. package/dist/domain/ports/index.js +10 -0
  86. package/dist/domain/ports/logger.port.js +3 -3
  87. package/dist/domain/ports/progress.port.js +10 -0
  88. package/dist/domain/ports/project-scaffolder.port.js +9 -0
  89. package/dist/domain/ports/schematics-runner.port.js +9 -0
  90. package/dist/domain/ports/template-manager.port.js +9 -0
  91. package/dist/domain/ports/wsl-setup.port.js +3 -0
  92. package/dist/domain/types/index.js +1 -0
  93. package/dist/domain/value-objects/acr-credentials.value-object.js +13 -1
  94. package/dist/domain/value-objects/chart-version.value-object.js +20 -3
  95. package/dist/domain/value-objects/config-log-level.value-object.js +2 -1
  96. package/dist/domain/value-objects/index.js +3 -1
  97. package/dist/domain/value-objects/instance-name.value-object.js +6 -3
  98. package/dist/domain/value-objects/jwt-key.value-object.js +27 -5
  99. package/dist/domain/value-objects/mssql-password.value-object.js +27 -5
  100. package/dist/domain/value-objects/output-path.value-object.js +85 -0
  101. package/dist/domain/value-objects/rsa-key-pair.value-object.js +29 -3
  102. package/dist/index.js +6 -1
  103. package/dist/infrastructure/config/{app-config.service.js → app-config.adapter.js} +29 -17
  104. package/dist/infrastructure/config/{config-validator.js → config-validator.util.js} +1 -1
  105. package/dist/infrastructure/config/index.js +14 -0
  106. package/dist/infrastructure/config/interfaces/index.js +3 -0
  107. package/dist/infrastructure/config/{crypto.service.js → services/crypto.service.js} +4 -1
  108. package/dist/infrastructure/config/services/index.js +9 -0
  109. package/dist/infrastructure/deployment/deployment.adapter.js +5 -5
  110. package/dist/infrastructure/deployment/index.js +9 -0
  111. package/dist/infrastructure/deployment/interfaces/index.js +3 -0
  112. package/dist/infrastructure/deployment/services/acr-credential-manager.service.js +18 -7
  113. package/dist/infrastructure/deployment/services/app-manager.service.js +3 -3
  114. package/dist/infrastructure/deployment/services/base-helm-deployment.service.js +13 -5
  115. package/dist/infrastructure/deployment/services/helm-registry.service.js +10 -3
  116. package/dist/infrastructure/deployment/services/index.js +35 -0
  117. package/dist/infrastructure/deployment/services/infra-manager.service.js +19 -15
  118. package/dist/infrastructure/deployment/services/k8s-job-runner.service.js +24 -6
  119. package/dist/infrastructure/deployment/services/mssql-database-init.service.js +75 -11
  120. package/dist/infrastructure/deployment/services/mssql-helm-deployment.service.js +17 -5
  121. package/dist/infrastructure/deployment/services/mssql-storage.service.js +5 -1
  122. package/dist/infrastructure/deployment/services/mssql-user-manager.service.js +7 -3
  123. package/dist/infrastructure/deployment/services/oci-artifact.service.js +8 -3
  124. package/dist/infrastructure/deployment/services/secret-manager.service.js +14 -5
  125. package/dist/infrastructure/deployment/services/service-manager.service.js +1 -1
  126. package/dist/infrastructure/deployment/services/version-compatibility.service.js +9 -5
  127. package/dist/infrastructure/dotnet/dotnet-publisher.adapter.js +143 -0
  128. package/dist/infrastructure/dotnet/index.js +9 -0
  129. package/dist/infrastructure/environment/index.js +11 -0
  130. package/dist/infrastructure/environment/interfaces/index.js +3 -0
  131. package/dist/infrastructure/{platform-detector.js → environment/platform-detector.util.js} +1 -1
  132. package/dist/infrastructure/environment/services/hardware-info.service.js +8 -8
  133. package/dist/infrastructure/environment/services/index.js +11 -0
  134. package/dist/infrastructure/errors/{error-handler.js → error-handler.adapter.js} +17 -17
  135. package/dist/infrastructure/errors/index.js +5 -21
  136. package/dist/infrastructure/execution/builders/base-command.builder.js +32 -11
  137. package/dist/infrastructure/execution/builders/index.js +26 -0
  138. package/dist/infrastructure/execution/builders/wsl-command.builder.js +39 -1
  139. package/dist/infrastructure/execution/command-builder.util.js +94 -0
  140. package/dist/infrastructure/execution/environments/index.js +23 -0
  141. package/dist/infrastructure/execution/environments/wsl-execution.environment.js +22 -7
  142. package/dist/infrastructure/execution/index.js +1 -2
  143. package/dist/infrastructure/execution/services/command-executor.service.js +389 -0
  144. package/dist/infrastructure/execution/services/index.js +8 -0
  145. package/dist/infrastructure/execution/{script-executor.service.js → services/script-executor.service.js} +12 -15
  146. package/dist/infrastructure/filesystem/filesystem.adapter.js +86 -0
  147. package/dist/infrastructure/filesystem/index.js +23 -0
  148. package/dist/infrastructure/http/{http-client.service.js → http-client.adapter.js} +20 -13
  149. package/dist/infrastructure/http/index.js +1 -1
  150. package/dist/infrastructure/interceptors/decorators/index.js +23 -0
  151. package/dist/infrastructure/interceptors/index.js +2 -2
  152. package/dist/infrastructure/interceptors/interceptor.factory.js +3 -3
  153. package/dist/infrastructure/interceptors/interfaces/index.js +3 -0
  154. package/dist/infrastructure/interceptors/services/index.js +6 -0
  155. package/dist/infrastructure/interceptors/{logging.interceptor.js → services/logging-interceptor.service.js} +4 -4
  156. package/dist/infrastructure/logger/services/file-log-reader.repository.js +1 -1
  157. package/dist/infrastructure/logger/services/file-log-writer.repository.js +1 -1
  158. package/dist/infrastructure/persistence/instance-metadata.adapter.js +2 -1
  159. package/dist/infrastructure/persistence/services/file-system-config.repository.js +10 -4
  160. package/dist/infrastructure/persistence/services/file-system-instance.repository.js +2 -2
  161. package/dist/infrastructure/platforms/index.js +18 -0
  162. package/dist/infrastructure/platforms/windows/index.js +13 -0
  163. package/dist/infrastructure/platforms/windows/interfaces/index.js +3 -0
  164. package/dist/infrastructure/platforms/windows/parsers/index.js +9 -0
  165. package/dist/infrastructure/platforms/windows/services/index.js +33 -0
  166. package/dist/infrastructure/platforms/windows/services/microk8s.service.js +28 -10
  167. package/dist/infrastructure/platforms/windows/services/rootfs-manager.service.js +7 -3
  168. package/dist/infrastructure/platforms/windows/services/windows-features.service.js +22 -8
  169. package/dist/infrastructure/platforms/windows/services/windows-info.service.js +10 -6
  170. package/dist/infrastructure/platforms/windows/services/wsl-config.service.js +15 -6
  171. package/dist/infrastructure/platforms/windows/services/wsl-info.service.js +12 -12
  172. package/dist/infrastructure/platforms/windows/services/wsl-instance-inspection.service.js +3 -3
  173. package/dist/infrastructure/platforms/windows/services/wsl-instance-lifecycle.service.js +76 -22
  174. package/dist/infrastructure/platforms/windows/services/wsl-updater.service.js +20 -15
  175. package/dist/infrastructure/platforms/windows/services/wslconfig-parser.service.js +3 -3
  176. package/dist/infrastructure/platforms/windows/wsl-instance-manager.adapter.js +8 -3
  177. package/dist/infrastructure/platforms/windows/wsl-setup.adapter.js +100 -0
  178. package/dist/infrastructure/schematics/index.js +11 -0
  179. package/dist/infrastructure/schematics/project-scaffolder.adapter.js +314 -0
  180. package/dist/infrastructure/schematics/schematics-runner.adapter.js +175 -0
  181. package/dist/infrastructure/template/index.js +25 -0
  182. package/dist/infrastructure/template/interfaces/index.js +22 -0
  183. package/dist/infrastructure/template/interfaces/template-downloader.interface.js +6 -0
  184. package/dist/infrastructure/template/interfaces/template-registry.interface.js +6 -0
  185. package/dist/infrastructure/template/services/index.js +24 -0
  186. package/dist/infrastructure/template/services/template-downloader.service.js +319 -0
  187. package/dist/infrastructure/template/services/template-registry.service.js +175 -0
  188. package/dist/infrastructure/template/template-manager.adapter.js +196 -0
  189. package/dist/infrastructure/utils/index.js +23 -0
  190. package/dist/infrastructure/utils/input-validator.util.js +7 -6
  191. package/dist/presentation/controllers/base.controller.js +36 -0
  192. package/dist/presentation/controllers/{config.controller.js → config/config.controller.js} +17 -62
  193. package/dist/presentation/controllers/config/index.js +21 -0
  194. package/dist/presentation/controllers/dev/dev.controller.js +202 -0
  195. package/dist/presentation/controllers/dev/index.js +23 -0
  196. package/dist/presentation/controllers/dev/template.controller.js +158 -0
  197. package/dist/presentation/controllers/{credentials.controller.js → env/credentials.controller.js} +8 -14
  198. package/dist/presentation/controllers/env/index.js +23 -0
  199. package/dist/presentation/controllers/{instance.controller.js → env/instance.controller.js} +35 -92
  200. package/dist/presentation/controllers/{setup.controller.js → env/setup.controller.js} +33 -66
  201. package/dist/presentation/controllers/index.js +9 -5
  202. package/dist/presentation/controllers/logs/index.js +21 -0
  203. package/dist/presentation/controllers/{logs.controller.js → logs/logs.controller.js} +8 -14
  204. package/dist/presentation/interfaces/index.js +21 -0
  205. package/dist/presentation/prompts/acr-credentials.prompt.js +37 -9
  206. package/dist/presentation/ui/constants/index.js +23 -0
  207. package/dist/presentation/ui/interaction.service.js +4 -4
  208. package/dist/presentation/ui/interfaces/cli-progress.interface.js +0 -6
  209. package/dist/presentation/ui/interfaces/index.js +6 -0
  210. package/package.json +6 -1
  211. package/dist/application/dtos/request/set-config.request.dto.js +0 -16
  212. package/dist/infrastructure/errors/error-handler.interface.js +0 -3
  213. package/dist/infrastructure/execution/command-builder.js +0 -252
  214. package/dist/infrastructure/execution/command-executor.service.js +0 -230
  215. /package/dist/application/dtos/{request → config/request}/get-config.request.dto.js +0 -0
  216. /package/dist/application/dtos/{request → env/request}/delete-instance.request.dto.js +0 -0
  217. /package/dist/application/dtos/{request → env/request}/get-credentials.request.dto.js +0 -0
  218. /package/dist/application/dtos/{request → env/request}/install-instance.request.dto.js +0 -0
  219. /package/dist/application/dtos/{request → env/request}/list-charts.request.dto.js +0 -0
  220. /package/dist/application/dtos/{request → env/request}/setup-environment.request.dto.js +0 -0
  221. /package/dist/application/dtos/{request → env/request}/start-instance.request.dto.js +0 -0
  222. /package/dist/application/dtos/{request → env/request}/stop-instance.request.dto.js +0 -0
  223. /package/dist/application/dtos/{response → env/response}/credentials.response.dto.js +0 -0
  224. /package/dist/application/dtos/{response → env/response}/delete-instance.response.dto.js +0 -0
  225. /package/dist/application/dtos/{response → env/response}/install-instance.response.dto.js +0 -0
  226. /package/dist/application/dtos/{response → env/response}/instance-list.response.dto.js +0 -0
  227. /package/dist/application/dtos/{response → env/response}/instance-status.response.dto.js +0 -0
  228. /package/dist/application/dtos/{response → env/response}/setup-result.response.dto.js +0 -0
  229. /package/dist/application/dtos/{response → env/response}/start-instance.response.dto.js +0 -0
  230. /package/dist/application/dtos/{response → env/response}/stop-instance.response.dto.js +0 -0
  231. /package/dist/application/dtos/{request → logs/request}/show-logs.request.dto.js +0 -0
  232. /package/dist/application/dtos/{response → logs/response}/show-logs.response.dto.js +0 -0
  233. /package/dist/application/use-cases/{instance → env}/list-charts.use-case.js +0 -0
  234. /package/dist/application/use-cases/{instance → env}/list-instances.use-case.js +0 -0
  235. /package/dist/application/use-cases/{instance → env}/stop-instance.use-case.js +0 -0
  236. /package/dist/{infrastructure → domain}/errors/app-error.js +0 -0
  237. /package/dist/{infrastructure → domain}/errors/exit-codes.js +0 -0
  238. /package/dist/infrastructure/config/{app-config.interface.js → interfaces/app-config.interface.js} +0 -0
  239. /package/dist/{domain → infrastructure/interceptors}/decorators/sensitive.decorator.js +0 -0
  240. /package/dist/infrastructure/interceptors/{interceptor.interface.js → interfaces/interceptor.interface.js} +0 -0
@@ -0,0 +1,85 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.OutputPath = void 0;
37
+ const os = __importStar(require("os"));
38
+ const path = __importStar(require("path"));
39
+ /**
40
+ * 輸出路徑 Value Object
41
+ *
42
+ * 封裝輸出路徑的安全驗證邏輯,防止寫入系統保護目錄
43
+ */
44
+ class OutputPath {
45
+ constructor(resolvedPath) {
46
+ this.resolvedPath = resolvedPath;
47
+ }
48
+ /**
49
+ * 建立輸出路徑
50
+ * @param rawPath - 原始路徑字串
51
+ * @returns 輸出路徑物件
52
+ */
53
+ static create(rawPath) {
54
+ return new OutputPath(path.resolve(rawPath));
55
+ }
56
+ /**
57
+ * 檢查路徑是否為系統保護路徑
58
+ * @param resolvedPath - 已解析的絕對路徑
59
+ * @returns 若為系統保護路徑則回傳 true
60
+ */
61
+ static isProtected(resolvedPath) {
62
+ const normalized = resolvedPath.replace(/\\/g, '/').toLowerCase();
63
+ const homeDir = os.homedir().replace(/\\/g, '/').toLowerCase();
64
+ if (normalized === homeDir) {
65
+ return true;
66
+ }
67
+ return this.FORBIDDEN_PREFIXES.some((prefix) => normalized.startsWith(prefix));
68
+ }
69
+ /**
70
+ * 取得已解析的絕對路徑
71
+ * @returns 已解析的路徑字串
72
+ */
73
+ get value() {
74
+ return this.resolvedPath;
75
+ }
76
+ }
77
+ exports.OutputPath = OutputPath;
78
+ /** 系統保護路徑前綴清單 */
79
+ OutputPath.FORBIDDEN_PREFIXES = [
80
+ '/windows',
81
+ '/system32',
82
+ 'c:/windows',
83
+ 'c:/program files',
84
+ ];
85
+ //# sourceMappingURL=output-path.value-object.js.map
@@ -5,6 +5,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.RsaKeyPair = void 0;
7
7
  const crypto_1 = __importDefault(require("crypto"));
8
+ const errors_1 = require("../errors");
8
9
  /**
9
10
  * RSA 金鑰對 Value Object
10
11
  *
@@ -32,12 +33,14 @@ class RsaKeyPair {
32
33
  const keyPair = new RsaKeyPair(privateKey, publicKey);
33
34
  // 驗證生成的金鑰對
34
35
  if (!keyPair.validate()) {
35
- throw new Error('Generated RSA key pair validation failed');
36
+ throw new errors_1.AppError('Generated RSA key pair validation failed', {
37
+ exitCode: errors_1.EXIT_CODES.VALIDATION_ERROR,
38
+ });
36
39
  }
37
40
  return keyPair;
38
41
  }
39
42
  catch (error) {
40
- throw new Error(`Failed to generate RSA key pair: ${error instanceof Error ? error.message : String(error)}`);
43
+ throw new errors_1.AppError(`Failed to generate RSA key pair: ${error instanceof Error ? error.message : String(error)}`, { exitCode: errors_1.EXIT_CODES.VALIDATION_ERROR });
41
44
  }
42
45
  }
43
46
  /**
@@ -50,7 +53,9 @@ class RsaKeyPair {
50
53
  static create(privateKey, publicKey) {
51
54
  const keyPair = new RsaKeyPair(privateKey, publicKey);
52
55
  if (!keyPair.validate()) {
53
- throw new Error('Invalid RSA key pair: keys do not match');
56
+ throw new errors_1.AppError('Invalid RSA key pair: keys do not match', {
57
+ exitCode: errors_1.EXIT_CODES.VALIDATION_ERROR,
58
+ });
54
59
  }
55
60
  return keyPair;
56
61
  }
@@ -168,6 +173,27 @@ class RsaKeyPair {
168
173
  // 第二次 Base64 編碼使用 UTF-8 (Helm 參數需求)
169
174
  return Buffer.from(first, 'utf8').toString('base64');
170
175
  }
176
+ /**
177
+ * 防止 JSON.stringify 意外洩露金鑰,回傳遮罩值
178
+ * @returns 遮罩後的物件
179
+ */
180
+ toJSON() {
181
+ return {
182
+ privateKey: '***MASKED***',
183
+ publicKey: '***MASKED***',
184
+ };
185
+ }
186
+ /**
187
+ * 回傳可安全記錄到日志的物件
188
+ * 金鑰欄位將被遮罩
189
+ * @returns 遮罩後的物件,可安全寫入日志
190
+ */
191
+ toSafeLog() {
192
+ return {
193
+ privateKey: '***MASKED***',
194
+ publicKey: '***MASKED***',
195
+ };
196
+ }
171
197
  /**
172
198
  * 比較兩個金鑰對是否相等
173
199
  * @param other - 另一個金鑰對
package/dist/index.js CHANGED
@@ -2,5 +2,10 @@
2
2
  "use strict";
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
4
  const cli_1 = require("./cli");
5
- (0, cli_1.run)(process.argv);
5
+ (0, cli_1.run)(process.argv)
6
+ .then(() => process.exit(0))
7
+ .catch(() => {
8
+ // 錯誤已由 BaseController.executeAction 和全域 ErrorHandler 處理
9
+ // 此處僅確保 Promise chain 不產生 unhandled rejection
10
+ });
6
11
  //# sourceMappingURL=index.js.map
@@ -45,15 +45,16 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
45
45
  return function (target, key) { decorator(target, key, paramIndex); }
46
46
  };
47
47
  Object.defineProperty(exports, "__esModule", { value: true });
48
- exports.AppConfig = void 0;
48
+ exports.AppConfigAdapter = void 0;
49
49
  const fs = __importStar(require("fs"));
50
50
  const path = __importStar(require("path"));
51
51
  const os = __importStar(require("os"));
52
52
  const tsyringe_1 = require("tsyringe");
53
- const config_validator_1 = require("./config-validator");
53
+ const config_validator_util_1 = require("./config-validator.util");
54
54
  const acr_credentials_value_object_1 = require("../../domain/value-objects/acr-credentials.value-object");
55
55
  const tokens_1 = require("../../di/tokens");
56
- const crypto_service_1 = require("./crypto.service");
56
+ const errors_1 = require("../../domain/errors");
57
+ const crypto_service_1 = require("./services/crypto.service");
57
58
  /**
58
59
  * 混淆用字典字串
59
60
  */
@@ -78,11 +79,9 @@ function decodeObfuscated(indices) {
78
79
  * 設定服務實作
79
80
  * 負責載入、合併與驗證配置
80
81
  *
81
- * 實作:
82
- * - IAppConfig: Infrastructure 層內部介面(完整配置功能)
83
- * - IAppConfigPort: Domain Port(供 Application 層使用)
82
+ * 實作 IAppConfigPort Domain Port,供 Application 層使用
84
83
  */
85
- let AppConfig = class AppConfig {
84
+ let AppConfigAdapter = class AppConfigAdapter {
86
85
  constructor(logger) {
87
86
  this.logger = logger;
88
87
  }
@@ -140,7 +139,7 @@ let AppConfig = class AppConfig {
140
139
  const userConfig = this.loadUserConfig();
141
140
  const merged = this.mergeConfigs(defaultConfig, userConfig);
142
141
  // 驗證設定
143
- (0, config_validator_1.validateConfig)(merged, this.logger);
142
+ (0, config_validator_util_1.validateConfig)(merged, this.logger);
144
143
  return merged;
145
144
  }
146
145
  /**
@@ -173,7 +172,7 @@ let AppConfig = class AppConfig {
173
172
  password: crypto_service_1.CryptoService.encrypt(configToSave.acr.password),
174
173
  };
175
174
  }
176
- fs.writeFileSync(configPath, JSON.stringify(configToSave, null, 2), 'utf-8');
175
+ fs.writeFileSync(configPath, JSON.stringify(configToSave, null, 2), { encoding: 'utf-8', mode: 0o600 });
177
176
  this.logger.debug('Configuration saved', { configPath });
178
177
  }
179
178
  /**
@@ -182,7 +181,7 @@ let AppConfig = class AppConfig {
182
181
  */
183
182
  getCliVersion() {
184
183
  try {
185
- // 目錄結構:dist/infrastructure/config/app-config.service.js
184
+ // 目錄結構:dist/infrastructure/config/app-config.adapter.js
186
185
  // 需要往上 3 層才能到達專案根目錄
187
186
  const possiblePaths = [
188
187
  path.resolve(__dirname, '../../../package.json'), // dist 環境
@@ -236,23 +235,36 @@ let AppConfig = class AppConfig {
236
235
  */
237
236
  loadAcrCredentialsFromFile(filePath) {
238
237
  if (!fs.existsSync(filePath)) {
239
- throw new Error(`ACR credentials file not found: ${filePath}`);
238
+ throw new errors_1.AppError(`ACR credentials file not found: ${filePath}`, {
239
+ exitCode: errors_1.EXIT_CODES.VALIDATION_ERROR,
240
+ });
240
241
  }
241
242
  try {
242
243
  const content = fs.readFileSync(filePath, 'utf-8');
243
244
  const data = JSON.parse(content);
244
245
  if (!acr_credentials_value_object_1.AcrCredentials.isValid(data.name, data.account, data.password)) {
245
- throw new Error('Invalid ACR credentials format: name, account, and password are required');
246
+ throw new errors_1.AppError('Invalid ACR credentials format: name, account, and password are required', {
247
+ exitCode: errors_1.EXIT_CODES.VALIDATION_ERROR,
248
+ });
246
249
  }
247
250
  return acr_credentials_value_object_1.AcrCredentials.create(data.name, data.account, data.password);
248
251
  }
249
252
  catch (error) {
250
253
  if (error instanceof SyntaxError) {
251
- throw new Error(`Invalid JSON in ACR credentials file: ${filePath}`);
254
+ throw new errors_1.AppError(`Invalid JSON in ACR credentials file: ${filePath}`, {
255
+ exitCode: errors_1.EXIT_CODES.VALIDATION_ERROR,
256
+ });
252
257
  }
253
258
  throw error;
254
259
  }
255
260
  }
261
+ /**
262
+ * 取得使用者配置目錄路徑
263
+ * @returns 使用者配置目錄路徑(如 ~/.uofx)
264
+ */
265
+ getUserConfigDir() {
266
+ return path.join(os.homedir(), '.uofx');
267
+ }
256
268
  /**
257
269
  * 深度合併設定物件
258
270
  * @param defaultConfig 預設設定
@@ -271,10 +283,10 @@ let AppConfig = class AppConfig {
271
283
  };
272
284
  }
273
285
  };
274
- exports.AppConfig = AppConfig;
275
- exports.AppConfig = AppConfig = __decorate([
286
+ exports.AppConfigAdapter = AppConfigAdapter;
287
+ exports.AppConfigAdapter = AppConfigAdapter = __decorate([
276
288
  (0, tsyringe_1.injectable)(),
277
289
  __param(0, (0, tsyringe_1.inject)(tokens_1.TOKENS.ILoggerPort)),
278
290
  __metadata("design:paramtypes", [Object])
279
- ], AppConfig);
280
- //# sourceMappingURL=app-config.service.js.map
291
+ ], AppConfigAdapter);
292
+ //# sourceMappingURL=app-config.adapter.js.map
@@ -28,4 +28,4 @@ function validateConfig(config, logger) {
28
28
  config.logLevel = 'error';
29
29
  }
30
30
  }
31
- //# sourceMappingURL=config-validator.js.map
31
+ //# sourceMappingURL=config-validator.util.js.map
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validateConfig = exports.validateLogLevel = exports.CryptoService = exports.AppConfigAdapter = void 0;
4
+ /**
5
+ * Infrastructure Config 模組匯出
6
+ */
7
+ var app_config_adapter_1 = require("./app-config.adapter");
8
+ Object.defineProperty(exports, "AppConfigAdapter", { enumerable: true, get: function () { return app_config_adapter_1.AppConfigAdapter; } });
9
+ var crypto_service_1 = require("./services/crypto.service");
10
+ Object.defineProperty(exports, "CryptoService", { enumerable: true, get: function () { return crypto_service_1.CryptoService; } });
11
+ var config_validator_util_1 = require("./config-validator.util");
12
+ Object.defineProperty(exports, "validateLogLevel", { enumerable: true, get: function () { return config_validator_util_1.validateLogLevel; } });
13
+ Object.defineProperty(exports, "validateConfig", { enumerable: true, get: function () { return config_validator_util_1.validateConfig; } });
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=index.js.map
@@ -35,6 +35,7 @@ var __importStar = (this && this.__importStar) || (function () {
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.CryptoService = void 0;
37
37
  const crypto = __importStar(require("crypto"));
38
+ const errors_1 = require("../../../domain/errors");
38
39
  /**
39
40
  * 混淆用字典字串
40
41
  */
@@ -93,7 +94,9 @@ class CryptoService {
93
94
  */
94
95
  static decrypt(encrypted) {
95
96
  if (!this.isEncrypted(encrypted)) {
96
- throw new Error('Invalid encrypted format');
97
+ throw new errors_1.AppError('Invalid encrypted format', {
98
+ exitCode: errors_1.EXIT_CODES.VALIDATION_ERROR,
99
+ });
97
100
  }
98
101
  const key = this.getKey();
99
102
  const data = Buffer.from(encrypted.slice(ENCRYPTED_PREFIX.length), 'base64');
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CryptoService = void 0;
4
+ /**
5
+ * Config 模組服務匯出
6
+ */
7
+ var crypto_service_1 = require("./crypto.service");
8
+ Object.defineProperty(exports, "CryptoService", { enumerable: true, get: function () { return crypto_service_1.CryptoService; } });
9
+ //# sourceMappingURL=index.js.map
@@ -107,11 +107,11 @@ exports.DeploymentAdapter = DeploymentAdapter = __decorate([
107
107
  (0, tsyringe_1.injectable)(),
108
108
  __param(0, (0, tsyringe_1.inject)(tokens_1.TOKENS.Internal.IMssqlHelmDeployment)),
109
109
  __param(1, (0, tsyringe_1.inject)(tokens_1.TOKENS.Internal.IK8sJobRunner)),
110
- __param(2, (0, tsyringe_1.inject)(tokens_1.TOKENS.Internal.InfraManagerService)),
111
- __param(3, (0, tsyringe_1.inject)(tokens_1.TOKENS.Internal.ServiceManagerService)),
112
- __param(4, (0, tsyringe_1.inject)(tokens_1.TOKENS.Internal.AppManagerService)),
113
- __param(5, (0, tsyringe_1.inject)(tokens_1.TOKENS.Internal.SecretManagerService)),
114
- __param(6, (0, tsyringe_1.inject)(tokens_1.TOKENS.Internal.HelmRegistryService)),
110
+ __param(2, (0, tsyringe_1.inject)(tokens_1.TOKENS.Internal.IInfraManager)),
111
+ __param(3, (0, tsyringe_1.inject)(tokens_1.TOKENS.Internal.IServiceManager)),
112
+ __param(4, (0, tsyringe_1.inject)(tokens_1.TOKENS.Internal.IAppManager)),
113
+ __param(5, (0, tsyringe_1.inject)(tokens_1.TOKENS.Internal.ISecretManager)),
114
+ __param(6, (0, tsyringe_1.inject)(tokens_1.TOKENS.Internal.IHelmRegistry)),
115
115
  __param(7, (0, tsyringe_1.inject)(tokens_1.TOKENS.Internal.VersionCompatibilityService)),
116
116
  __metadata("design:paramtypes", [Object, Object, Object, Object, Object, Object, Object, Object])
117
117
  ], DeploymentAdapter);
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DeploymentAdapter = void 0;
4
+ /**
5
+ * Infrastructure Deployment 模組匯出
6
+ */
7
+ var deployment_adapter_1 = require("./deployment.adapter");
8
+ Object.defineProperty(exports, "DeploymentAdapter", { enumerable: true, get: function () { return deployment_adapter_1.DeploymentAdapter; } });
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=index.js.map
@@ -49,7 +49,8 @@ exports.AcrCredentialManagerService = void 0;
49
49
  const tsyringe_1 = require("tsyringe");
50
50
  const fs = __importStar(require("fs"));
51
51
  const tokens_1 = require("../../../di/tokens");
52
- const sensitive_decorator_1 = require("../../../domain/decorators/sensitive.decorator");
52
+ const sensitive_decorator_1 = require("../../interceptors/decorators/sensitive.decorator");
53
+ const errors_1 = require("../../../domain/errors");
53
54
  let AcrCredentialManagerService = class AcrCredentialManagerService {
54
55
  constructor(appConfig) {
55
56
  this.appConfig = appConfig;
@@ -62,7 +63,9 @@ let AcrCredentialManagerService = class AcrCredentialManagerService {
62
63
  loadCredentialsFromFile(filePath) {
63
64
  // 檢查檔案存在
64
65
  if (!fs.existsSync(filePath)) {
65
- throw new Error(`Pull secret file not found: ${filePath}`);
66
+ throw new errors_1.AppError(`Pull secret file not found: ${filePath}`, {
67
+ exitCode: errors_1.EXIT_CODES.VALIDATION_ERROR,
68
+ });
66
69
  }
67
70
  // 讀取檔案
68
71
  const content = fs.readFileSync(filePath, 'utf8');
@@ -72,7 +75,9 @@ let AcrCredentialManagerService = class AcrCredentialManagerService {
72
75
  raw = JSON.parse(content);
73
76
  }
74
77
  catch {
75
- throw new Error('Invalid JSON format in pull secret file');
78
+ throw new errors_1.AppError('Invalid JSON format in pull secret file', {
79
+ exitCode: errors_1.EXIT_CODES.VALIDATION_ERROR,
80
+ });
76
81
  }
77
82
  // 正規化欄位名稱(支援舊格式相容)
78
83
  const credentials = this.normalizeCredentials(raw);
@@ -113,13 +118,19 @@ let AcrCredentialManagerService = class AcrCredentialManagerService {
113
118
  */
114
119
  validateCredentials(credentials) {
115
120
  if (!credentials.name) {
116
- throw new Error('Missing required field in pull secret: name (or acrName)');
121
+ throw new errors_1.AppError('Missing required field in pull secret: name (or acrName)', {
122
+ exitCode: errors_1.EXIT_CODES.VALIDATION_ERROR,
123
+ });
117
124
  }
118
125
  if (!credentials.account) {
119
- throw new Error('Missing required field in pull secret: account (or acrAccount)');
126
+ throw new errors_1.AppError('Missing required field in pull secret: account (or acrAccount)', {
127
+ exitCode: errors_1.EXIT_CODES.VALIDATION_ERROR,
128
+ });
120
129
  }
121
130
  if (!credentials.password) {
122
- throw new Error('Missing required field in pull secret: password (or acrPassword)');
131
+ throw new errors_1.AppError('Missing required field in pull secret: password (or acrPassword)', {
132
+ exitCode: errors_1.EXIT_CODES.VALIDATION_ERROR,
133
+ });
123
134
  }
124
135
  }
125
136
  };
@@ -138,7 +149,7 @@ __decorate([
138
149
  ], AcrCredentialManagerService.prototype, "getDefaultCredentials", null);
139
150
  exports.AcrCredentialManagerService = AcrCredentialManagerService = __decorate([
140
151
  (0, tsyringe_1.injectable)(),
141
- __param(0, (0, tsyringe_1.inject)(tokens_1.TOKENS.IAppConfig)),
152
+ __param(0, (0, tsyringe_1.inject)(tokens_1.TOKENS.IAppConfigPort)),
142
153
  __metadata("design:paramtypes", [Object])
143
154
  ], AcrCredentialManagerService);
144
155
  //# sourceMappingURL=acr-credential-manager.service.js.map
@@ -16,7 +16,7 @@ exports.AppManagerService = void 0;
16
16
  const tsyringe_1 = require("tsyringe");
17
17
  const tokens_1 = require("../../../di/tokens");
18
18
  const deployment_parameters_entity_1 = require("../../../domain/entities/deployment-parameters.entity");
19
- const sensitive_decorator_1 = require("../../../domain/decorators/sensitive.decorator");
19
+ const sensitive_decorator_1 = require("../../interceptors/decorators/sensitive.decorator");
20
20
  const base_helm_deployment_service_1 = require("./base-helm-deployment.service");
21
21
  const index_1 = require("../../../constants/index");
22
22
  /**
@@ -71,7 +71,7 @@ let AppManagerService = class AppManagerService extends base_helm_deployment_ser
71
71
  releaseName: 'uofx-blue',
72
72
  chartPath,
73
73
  wait: true,
74
- timeout: '1800s',
74
+ timeout: '3600s',
75
75
  sensitiveStdin: valuesContent,
76
76
  });
77
77
  this.logger.debug('[App] Deploying application chart', {
@@ -102,7 +102,7 @@ let AppManagerService = class AppManagerService extends base_helm_deployment_ser
102
102
  .arg('secret')
103
103
  .arg('web-appsettings-secret')
104
104
  .arg('-n', 'uofx')
105
- .arg('-p', `'${patchData}'`);
105
+ .arg('-p', patchData);
106
106
  try {
107
107
  await builder.exec();
108
108
  }
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.BaseHelmDeploymentService = void 0;
4
4
  const retry_util_1 = require("../../utils/retry.util");
5
+ const errors_1 = require("../../../domain/errors");
5
6
  /**
6
7
  * Helm 部署基類
7
8
  *
@@ -97,7 +98,9 @@ class BaseHelmDeploymentService {
97
98
  */
98
99
  createHelmUpgradeBuilder(instanceName, options) {
99
100
  if (!this.envFactory) {
100
- throw new Error('ExecutionEnvironmentFactory is required for createHelmUpgradeBuilder');
101
+ throw new errors_1.AppError('ExecutionEnvironmentFactory is required for createHelmUpgradeBuilder', {
102
+ exitCode: errors_1.EXIT_CODES.SYSTEM_ERROR,
103
+ });
101
104
  }
102
105
  const env = this.envFactory.getForInstance(instanceName);
103
106
  const builder = env.helm('upgrade')
@@ -112,7 +115,7 @@ class BaseHelmDeploymentService {
112
115
  }
113
116
  // Release 名稱和 Chart 路徑
114
117
  builder.arg(options.releaseName);
115
- builder.arg(`"${options.chartPath}"`);
118
+ builder.arg(options.chartPath);
116
119
  // 命名空間
117
120
  const namespace = options.namespace ?? 'uofx';
118
121
  builder.arg('-n', namespace);
@@ -126,7 +129,7 @@ class BaseHelmDeploymentService {
126
129
  // 添加敏感的 --set 參數
127
130
  if (options.sensitiveSetArgs) {
128
131
  for (const { key, value } of options.sensitiveSetArgs) {
129
- builder.sensitiveArg('--set', `${key}="${value}"`);
132
+ builder.sensitiveArg('--set', `${key}=${value}`);
130
133
  }
131
134
  }
132
135
  // 從 stdin 讀取 values
@@ -147,7 +150,10 @@ class BaseHelmDeploymentService {
147
150
  await (0, retry_util_1.retryWithBackoff)(async () => {
148
151
  const result = await builder.exec();
149
152
  if (result.exitCode !== 0) {
150
- throw new Error(result.stderr);
153
+ this.logger.debug('Helm deployment failed', { stderr: result.stderr });
154
+ throw new errors_1.AppError('Helm deployment failed', {
155
+ exitCode: errors_1.EXIT_CODES.SYSTEM_ERROR,
156
+ });
151
157
  }
152
158
  }, (0, retry_util_1.createHelmRetryOptions)({
153
159
  onRetry: (attempt) => {
@@ -155,7 +161,9 @@ class BaseHelmDeploymentService {
155
161
  this.logger.warn(`[${serviceName}] Retrying install (${attempt}/3)...`);
156
162
  },
157
163
  })).catch((error) => {
158
- throw new Error(`Failed to install ${chartName} chart: ${error.message}`);
164
+ throw new errors_1.AppError(`Failed to install ${chartName} chart: ${error.message}`, {
165
+ exitCode: errors_1.EXIT_CODES.SYSTEM_ERROR,
166
+ });
159
167
  });
160
168
  }
161
169
  }
@@ -16,7 +16,8 @@ exports.HelmRegistryService = void 0;
16
16
  const tsyringe_1 = require("tsyringe");
17
17
  const tokens_1 = require("../../../di/tokens");
18
18
  const acr_credentials_value_object_1 = require("../../../domain/value-objects/acr-credentials.value-object");
19
- const sensitive_decorator_1 = require("../../../domain/decorators/sensitive.decorator");
19
+ const sensitive_decorator_1 = require("../../interceptors/decorators/sensitive.decorator");
20
+ const errors_1 = require("../../../domain/errors");
20
21
  /**
21
22
  * Helm Registry 服務
22
23
  *
@@ -56,7 +57,10 @@ let HelmRegistryService = class HelmRegistryService {
56
57
  .sensitiveStdin(acrPassword);
57
58
  const result = await builder.exec();
58
59
  if (result.exitCode !== 0) {
59
- throw new Error(`Failed to login to helm registry: ${result.stderr}`);
60
+ this.logger.debug('Failed to login to helm registry', { stderr: result.stderr });
61
+ throw new errors_1.AppError('Failed to login to helm registry', {
62
+ exitCode: errors_1.EXIT_CODES.SYSTEM_ERROR,
63
+ });
60
64
  }
61
65
  this.logger.debug(`[HelmRegistry] Successfully logged in to ${registry}`);
62
66
  }
@@ -85,7 +89,10 @@ let HelmRegistryService = class HelmRegistryService {
85
89
  .arg('--destination', destDir);
86
90
  const result = await builder.exec();
87
91
  if (result.exitCode !== 0) {
88
- throw new Error(`Failed to pull ${chartName} chart: ${result.stderr}`);
92
+ this.logger.debug(`Failed to pull ${chartName} chart`, { stderr: result.stderr });
93
+ throw new errors_1.AppError(`Failed to pull ${chartName} chart`, {
94
+ exitCode: errors_1.EXIT_CODES.SYSTEM_ERROR,
95
+ });
89
96
  }
90
97
  const chartPath = `${destDir}/${chartName}-${version}.tgz`;
91
98
  this.logger.debug(`[HelmRegistry] Chart pulled successfully: ${chartPath}`);
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.VersionCompatibilityService = exports.ServiceManagerService = exports.SecretManagerService = exports.OciArtifactService = exports.MssqlUserManagerService = exports.MssqlStorageService = exports.MssqlHelmDeploymentService = exports.MssqlDatabaseInitService = exports.K8sJobRunnerService = exports.InfraManagerService = exports.HelmRegistryService = exports.BaseHelmDeploymentService = exports.AppManagerService = exports.AcrCredentialManagerService = void 0;
4
+ /**
5
+ * Deployment 模組服務匯出
6
+ */
7
+ var acr_credential_manager_service_1 = require("./acr-credential-manager.service");
8
+ Object.defineProperty(exports, "AcrCredentialManagerService", { enumerable: true, get: function () { return acr_credential_manager_service_1.AcrCredentialManagerService; } });
9
+ var app_manager_service_1 = require("./app-manager.service");
10
+ Object.defineProperty(exports, "AppManagerService", { enumerable: true, get: function () { return app_manager_service_1.AppManagerService; } });
11
+ var base_helm_deployment_service_1 = require("./base-helm-deployment.service");
12
+ Object.defineProperty(exports, "BaseHelmDeploymentService", { enumerable: true, get: function () { return base_helm_deployment_service_1.BaseHelmDeploymentService; } });
13
+ var helm_registry_service_1 = require("./helm-registry.service");
14
+ Object.defineProperty(exports, "HelmRegistryService", { enumerable: true, get: function () { return helm_registry_service_1.HelmRegistryService; } });
15
+ var infra_manager_service_1 = require("./infra-manager.service");
16
+ Object.defineProperty(exports, "InfraManagerService", { enumerable: true, get: function () { return infra_manager_service_1.InfraManagerService; } });
17
+ var k8s_job_runner_service_1 = require("./k8s-job-runner.service");
18
+ Object.defineProperty(exports, "K8sJobRunnerService", { enumerable: true, get: function () { return k8s_job_runner_service_1.K8sJobRunnerService; } });
19
+ var mssql_database_init_service_1 = require("./mssql-database-init.service");
20
+ Object.defineProperty(exports, "MssqlDatabaseInitService", { enumerable: true, get: function () { return mssql_database_init_service_1.MssqlDatabaseInitService; } });
21
+ var mssql_helm_deployment_service_1 = require("./mssql-helm-deployment.service");
22
+ Object.defineProperty(exports, "MssqlHelmDeploymentService", { enumerable: true, get: function () { return mssql_helm_deployment_service_1.MssqlHelmDeploymentService; } });
23
+ var mssql_storage_service_1 = require("./mssql-storage.service");
24
+ Object.defineProperty(exports, "MssqlStorageService", { enumerable: true, get: function () { return mssql_storage_service_1.MssqlStorageService; } });
25
+ var mssql_user_manager_service_1 = require("./mssql-user-manager.service");
26
+ Object.defineProperty(exports, "MssqlUserManagerService", { enumerable: true, get: function () { return mssql_user_manager_service_1.MssqlUserManagerService; } });
27
+ var oci_artifact_service_1 = require("./oci-artifact.service");
28
+ Object.defineProperty(exports, "OciArtifactService", { enumerable: true, get: function () { return oci_artifact_service_1.OciArtifactService; } });
29
+ var secret_manager_service_1 = require("./secret-manager.service");
30
+ Object.defineProperty(exports, "SecretManagerService", { enumerable: true, get: function () { return secret_manager_service_1.SecretManagerService; } });
31
+ var service_manager_service_1 = require("./service-manager.service");
32
+ Object.defineProperty(exports, "ServiceManagerService", { enumerable: true, get: function () { return service_manager_service_1.ServiceManagerService; } });
33
+ var version_compatibility_service_1 = require("./version-compatibility.service");
34
+ Object.defineProperty(exports, "VersionCompatibilityService", { enumerable: true, get: function () { return version_compatibility_service_1.VersionCompatibilityService; } });
35
+ //# sourceMappingURL=index.js.map
@@ -16,9 +16,10 @@ exports.InfraManagerService = void 0;
16
16
  const tsyringe_1 = require("tsyringe");
17
17
  const tokens_1 = require("../../../di/tokens");
18
18
  const deployment_parameters_entity_1 = require("../../../domain/entities/deployment-parameters.entity");
19
- const sensitive_decorator_1 = require("../../../domain/decorators/sensitive.decorator");
19
+ const sensitive_decorator_1 = require("../../interceptors/decorators/sensitive.decorator");
20
20
  const base_helm_deployment_service_1 = require("./base-helm-deployment.service");
21
21
  const paths_1 = require("../../../constants/paths");
22
+ const errors_1 = require("../../../domain/errors");
22
23
  /**
23
24
  * 基礎設施管理服務
24
25
  *
@@ -61,21 +62,21 @@ let InfraManagerService = class InfraManagerService extends base_helm_deployment
61
62
  releaseName: 'uofx-infra',
62
63
  chartPath,
63
64
  setArgs: [
64
- `k8sType="microk8s"`,
65
+ `k8sType=microk8s`,
65
66
  `traefik.web.TLS.enable=true`,
66
67
  `traefik.admin.TLS.enable=true`,
67
- `imageCredentials.registry="${registry}"`,
68
- `imageCredentials.username="${acrAccount}"`,
69
- `storage.type="local"`,
70
- `storage.local.defaultPath="${paths_1.LINUX_PATHS.UOFX_STORAGE_BASE}"`,
71
- `storage.local.mqShare.path="/rabbitmq"`,
72
- `storage.local.lokiShare.path="/loki"`,
73
- `storage.local.redisShare.path="/redis"`,
74
- `storage.local.fileShare.path="/file"`,
75
- `storage.local.syncShare.path="/system"`,
76
- `storage.local.searchShare.path="/search"`,
77
- `loki.retentionPeriod="365d"`,
78
- `installType="install"`,
68
+ `imageCredentials.registry=${registry}`,
69
+ `imageCredentials.username=${acrAccount}`,
70
+ `storage.type=local`,
71
+ `storage.local.defaultPath=${paths_1.LINUX_PATHS.UOFX_STORAGE_BASE}`,
72
+ `storage.local.mqShare.path=/rabbitmq`,
73
+ `storage.local.lokiShare.path=/loki`,
74
+ `storage.local.redisShare.path=/redis`,
75
+ `storage.local.fileShare.path=/file`,
76
+ `storage.local.syncShare.path=/system`,
77
+ `storage.local.searchShare.path=/search`,
78
+ `loki.retentionPeriod=365d`,
79
+ `installType=install`,
79
80
  `enabledSearch=true`,
80
81
  ],
81
82
  sensitiveSetArgs: [
@@ -108,7 +109,10 @@ let InfraManagerService = class InfraManagerService extends base_helm_deployment
108
109
  .args(...directories);
109
110
  const result = await builder.exec();
110
111
  if (result.exitCode !== 0) {
111
- throw new Error(`Failed to create storage directories: ${result.stderr}`);
112
+ this.logger.debug('Failed to create storage directories', { stderr: result.stderr });
113
+ throw new errors_1.AppError('Failed to create storage directories', {
114
+ exitCode: errors_1.EXIT_CODES.SYSTEM_ERROR,
115
+ });
112
116
  }
113
117
  this.logger.debug('[Infra] Storage directories created');
114
118
  }