@uofx/cli 1.0.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.
- package/LICENSE +40 -0
- package/README.md +444 -0
- package/THIRD-PARTY-NOTICES.txt +894 -0
- package/dist/application/dtos/index.js +24 -0
- package/dist/application/dtos/request/delete-instance.request.dto.js +3 -0
- package/dist/application/dtos/request/get-config.request.dto.js +3 -0
- package/dist/application/dtos/request/get-credentials.request.dto.js +3 -0
- package/dist/application/dtos/request/index.js +27 -0
- package/dist/application/dtos/request/install-instance.request.dto.js +3 -0
- package/dist/application/dtos/request/list-charts.request.dto.js +3 -0
- package/dist/application/dtos/request/set-config.request.dto.js +16 -0
- package/dist/application/dtos/request/setup-environment.request.dto.js +16 -0
- package/dist/application/dtos/request/show-logs.request.dto.js +19 -0
- package/dist/application/dtos/request/start-instance.request.dto.js +3 -0
- package/dist/application/dtos/request/stop-instance.request.dto.js +3 -0
- package/dist/application/dtos/response/credentials.response.dto.js +3 -0
- package/dist/application/dtos/response/delete-instance.response.dto.js +3 -0
- package/dist/application/dtos/response/index.js +26 -0
- package/dist/application/dtos/response/install-instance.response.dto.js +3 -0
- package/dist/application/dtos/response/instance-list.response.dto.js +3 -0
- package/dist/application/dtos/response/instance-status.response.dto.js +3 -0
- package/dist/application/dtos/response/setup-result.response.dto.js +3 -0
- package/dist/application/dtos/response/show-logs.response.dto.js +3 -0
- package/dist/application/dtos/response/start-instance.response.dto.js +3 -0
- package/dist/application/dtos/response/stop-instance.response.dto.js +3 -0
- package/dist/application/index.js +25 -0
- package/dist/application/interfaces/index.js +24 -0
- package/dist/application/interfaces/use-case.interface.js +3 -0
- package/dist/application/use-cases/config/get-config.use-case.js +66 -0
- package/dist/application/use-cases/config/set-config.use-case.js +49 -0
- package/dist/application/use-cases/credentials/get-credentials.use-case.js +57 -0
- package/dist/application/use-cases/index.js +28 -0
- package/dist/application/use-cases/instance/delete-instance.use-case.js +81 -0
- package/dist/application/use-cases/instance/index.js +23 -0
- package/dist/application/use-cases/instance/install-instance.use-case.js +424 -0
- package/dist/application/use-cases/instance/list-charts.use-case.js +43 -0
- package/dist/application/use-cases/instance/list-instances.use-case.js +62 -0
- package/dist/application/use-cases/instance/start-instance.use-case.js +154 -0
- package/dist/application/use-cases/instance/stop-instance.use-case.js +55 -0
- package/dist/application/use-cases/logs/show-logs.use-case.js +66 -0
- package/dist/application/use-cases/setup/setup-environment.use-case.js +53 -0
- package/dist/cli.js +286 -0
- package/dist/constants/config-defaults.js +23 -0
- package/dist/constants/defaults.js +89 -0
- package/dist/constants/deployment.js +39 -0
- package/dist/constants/environments.js +93 -0
- package/dist/constants/index.js +53 -0
- package/dist/constants/oci-artifacts.js +25 -0
- package/dist/constants/paths.js +92 -0
- package/dist/constants/timeouts.js +60 -0
- package/dist/di/container.js +34 -0
- package/dist/di/index.js +22 -0
- package/dist/di/modules/application.module.js +54 -0
- package/dist/di/modules/infrastructure.module.js +206 -0
- package/dist/di/modules/interceptor.module.js +68 -0
- package/dist/di/modules/presentation.module.js +31 -0
- package/dist/di/tokens.js +149 -0
- package/dist/domain/decorators/sensitive.decorator.js +39 -0
- package/dist/domain/entities/credentials-resolver.entity.js +127 -0
- package/dist/domain/entities/credentials.entity.js +65 -0
- package/dist/domain/entities/delete-instance-validation.entity.js +100 -0
- package/dist/domain/entities/deployment-parameters.entity.js +120 -0
- package/dist/domain/entities/environment-validation.entity.js +125 -0
- package/dist/domain/entities/index.js +29 -0
- package/dist/domain/entities/instance-lifecycle-state.entity.js +100 -0
- package/dist/domain/entities/instance-list-aggregator.entity.js +104 -0
- package/dist/domain/entities/instance-metadata.entity.js +86 -0
- package/dist/domain/entities/instance-status.entity.js +79 -0
- package/dist/domain/entities/instance.entity.js +128 -0
- package/dist/domain/entities/log-filter.entity.js +141 -0
- package/dist/domain/index.js +29 -0
- package/dist/domain/interfaces/safe-loggable.interface.js +3 -0
- package/dist/domain/ports/app-config.port.js +3 -0
- package/dist/domain/ports/base-image.port.js +3 -0
- package/dist/domain/ports/chart-version.port.js +3 -0
- package/dist/domain/ports/correlation-id.port.js +3 -0
- package/dist/domain/ports/credentials.port.js +3 -0
- package/dist/domain/ports/deployment.port.js +3 -0
- package/dist/domain/ports/error-handler.port.js +3 -0
- package/dist/domain/ports/index.js +46 -0
- package/dist/domain/ports/instance-manager.port.js +3 -0
- package/dist/domain/ports/instance-metadata.port.js +8 -0
- package/dist/domain/ports/instance-storage.port.js +3 -0
- package/dist/domain/ports/k8s-deployer.port.js +3 -0
- package/dist/domain/ports/logger.port.js +14 -0
- package/dist/domain/ports/output.port.js +3 -0
- package/dist/domain/ports/runtime-environment.port.js +6 -0
- package/dist/domain/ports/user-interaction.port.js +9 -0
- package/dist/domain/ports/user-settings.port.js +3 -0
- package/dist/domain/types/index.js +22 -0
- package/dist/domain/types/logger.types.js +29 -0
- package/dist/domain/types/validation.types.js +9 -0
- package/dist/domain/value-objects/acr-credentials.value-object.js +92 -0
- package/dist/domain/value-objects/chart-version.value-object.js +124 -0
- package/dist/domain/value-objects/config-log-level.value-object.js +84 -0
- package/dist/domain/value-objects/connection-info.value-object.js +65 -0
- package/dist/domain/value-objects/index.js +25 -0
- package/dist/domain/value-objects/instance-name.value-object.js +91 -0
- package/dist/domain/value-objects/jwt-key.value-object.js +97 -0
- package/dist/domain/value-objects/mssql-password.value-object.js +140 -0
- package/dist/domain/value-objects/rsa-key-pair.value-object.js +181 -0
- package/dist/index.js +6 -0
- package/dist/infrastructure/config/app-config.interface.js +3 -0
- package/dist/infrastructure/config/app-config.service.js +280 -0
- package/dist/infrastructure/config/config-validator.js +31 -0
- package/dist/infrastructure/config/crypto.service.js +125 -0
- package/dist/infrastructure/deployment/deployment.adapter.js +118 -0
- package/dist/infrastructure/deployment/interfaces/acr-credential-manager.interface.js +3 -0
- package/dist/infrastructure/deployment/interfaces/app-manager.interface.js +3 -0
- package/dist/infrastructure/deployment/interfaces/helm-registry.interface.js +3 -0
- package/dist/infrastructure/deployment/interfaces/infra-manager.interface.js +3 -0
- package/dist/infrastructure/deployment/interfaces/k8s-job-runner.interface.js +3 -0
- package/dist/infrastructure/deployment/interfaces/mssql-database-init.interface.js +3 -0
- package/dist/infrastructure/deployment/interfaces/mssql-helm-deployment.interface.js +3 -0
- package/dist/infrastructure/deployment/interfaces/mssql-storage.interface.js +3 -0
- package/dist/infrastructure/deployment/interfaces/mssql-user-manager.interface.js +3 -0
- package/dist/infrastructure/deployment/interfaces/oci-artifact.interface.js +3 -0
- package/dist/infrastructure/deployment/interfaces/secret-manager.interface.js +3 -0
- package/dist/infrastructure/deployment/interfaces/service-manager.interface.js +3 -0
- package/dist/infrastructure/deployment/interfaces/version-compatibility.interface.js +3 -0
- package/dist/infrastructure/deployment/services/acr-credential-manager.service.js +144 -0
- package/dist/infrastructure/deployment/services/app-manager.service.js +193 -0
- package/dist/infrastructure/deployment/services/base-helm-deployment.service.js +163 -0
- package/dist/infrastructure/deployment/services/helm-registry.service.js +126 -0
- package/dist/infrastructure/deployment/services/infra-manager.service.js +130 -0
- package/dist/infrastructure/deployment/services/k8s-job-runner.service.js +194 -0
- package/dist/infrastructure/deployment/services/mssql-database-init.service.js +139 -0
- package/dist/infrastructure/deployment/services/mssql-helm-deployment.service.js +100 -0
- package/dist/infrastructure/deployment/services/mssql-storage.service.js +54 -0
- package/dist/infrastructure/deployment/services/mssql-user-manager.service.js +66 -0
- package/dist/infrastructure/deployment/services/oci-artifact.service.js +289 -0
- package/dist/infrastructure/deployment/services/secret-manager.service.js +179 -0
- package/dist/infrastructure/deployment/services/service-manager.service.js +82 -0
- package/dist/infrastructure/deployment/services/version-compatibility.service.js +291 -0
- package/dist/infrastructure/environment/interfaces/hardware-info.interface.js +3 -0
- package/dist/infrastructure/environment/interfaces/network-checker.interface.js +3 -0
- package/dist/infrastructure/environment/services/hardware-info.service.js +135 -0
- package/dist/infrastructure/environment/services/network-checker.service.js +142 -0
- package/dist/infrastructure/environment/windows-environment.adapter.js +162 -0
- package/dist/infrastructure/errors/app-error.js +73 -0
- package/dist/infrastructure/errors/error-handler.interface.js +3 -0
- package/dist/infrastructure/errors/error-handler.js +218 -0
- package/dist/infrastructure/errors/exit-codes.js +27 -0
- package/dist/infrastructure/errors/index.js +25 -0
- package/dist/infrastructure/execution/builders/base-command.builder.js +122 -0
- package/dist/infrastructure/execution/builders/host-command.builder.js +58 -0
- package/dist/infrastructure/execution/builders/windows-host-command.builder.js +50 -0
- package/dist/infrastructure/execution/builders/wsl-command.builder.js +29 -0
- package/dist/infrastructure/execution/command-builder.js +252 -0
- package/dist/infrastructure/execution/command-executor.service.js +230 -0
- package/dist/infrastructure/execution/environments/wsl-execution.environment.js +70 -0
- package/dist/infrastructure/execution/execution-environment.factory.js +53 -0
- package/dist/infrastructure/execution/index.js +25 -0
- package/dist/infrastructure/execution/interfaces/command-builder.interface.js +3 -0
- package/dist/infrastructure/execution/interfaces/command-executor.interface.js +3 -0
- package/dist/infrastructure/execution/interfaces/execution-environment-factory.interface.js +3 -0
- package/dist/infrastructure/execution/interfaces/execution-environment.interface.js +7 -0
- package/dist/infrastructure/execution/interfaces/host-command-builder.interface.js +3 -0
- package/dist/infrastructure/execution/interfaces/index.js +23 -0
- package/dist/infrastructure/execution/interfaces/script-executor.interface.js +3 -0
- package/dist/infrastructure/execution/script-executor.service.js +171 -0
- package/dist/infrastructure/http/http-client.service.js +176 -0
- package/dist/infrastructure/http/index.js +18 -0
- package/dist/infrastructure/http/interfaces/http-client.interface.js +3 -0
- package/dist/infrastructure/interceptors/index.js +8 -0
- package/dist/infrastructure/interceptors/interceptor.factory.js +44 -0
- package/dist/infrastructure/interceptors/interceptor.interface.js +3 -0
- package/dist/infrastructure/interceptors/logging.interceptor.js +171 -0
- package/dist/infrastructure/logger/correlation-id.adapter.js +68 -0
- package/dist/infrastructure/logger/index.js +23 -0
- package/dist/infrastructure/logger/interfaces/index.js +22 -0
- package/dist/infrastructure/logger/interfaces/log-reader.repository.interface.js +7 -0
- package/dist/infrastructure/logger/interfaces/log-writer.repository.interface.js +7 -0
- package/dist/infrastructure/logger/logger.adapter.js +274 -0
- package/dist/infrastructure/logger/services/file-log-reader.repository.js +148 -0
- package/dist/infrastructure/logger/services/file-log-writer.repository.js +307 -0
- package/dist/infrastructure/logger/services/index.js +22 -0
- package/dist/infrastructure/persistence/index.js +25 -0
- package/dist/infrastructure/persistence/instance-metadata.adapter.js +100 -0
- package/dist/infrastructure/persistence/instance-storage.adapter.js +64 -0
- package/dist/infrastructure/persistence/interfaces/config.repository.interface.js +3 -0
- package/dist/infrastructure/persistence/interfaces/index.js +22 -0
- package/dist/infrastructure/persistence/interfaces/instance.repository.interface.js +3 -0
- package/dist/infrastructure/persistence/services/file-system-config.repository.js +168 -0
- package/dist/infrastructure/persistence/services/file-system-instance.repository.js +170 -0
- package/dist/infrastructure/persistence/services/index.js +22 -0
- package/dist/infrastructure/persistence/user-settings.adapter.js +55 -0
- package/dist/infrastructure/platform-detector.js +71 -0
- package/dist/infrastructure/platforms/windows/interfaces/microk8s.interface.js +3 -0
- package/dist/infrastructure/platforms/windows/interfaces/rootfs-manager.interface.js +3 -0
- package/dist/infrastructure/platforms/windows/interfaces/windows-features.interface.js +3 -0
- package/dist/infrastructure/platforms/windows/interfaces/windows-info.interface.js +3 -0
- package/dist/infrastructure/platforms/windows/interfaces/wsl-config.interface.js +3 -0
- package/dist/infrastructure/platforms/windows/interfaces/wsl-info.interface.js +3 -0
- package/dist/infrastructure/platforms/windows/interfaces/wsl-instance-inspection.interface.js +3 -0
- package/dist/infrastructure/platforms/windows/interfaces/wsl-instance-lifecycle.interface.js +3 -0
- package/dist/infrastructure/platforms/windows/interfaces/wsl-instance-naming.interface.js +3 -0
- package/dist/infrastructure/platforms/windows/interfaces/wsl-manager.interface.js +3 -0
- package/dist/infrastructure/platforms/windows/interfaces/wsl-resources.interface.js +8 -0
- package/dist/infrastructure/platforms/windows/interfaces/wsl-updater.interface.js +3 -0
- package/dist/infrastructure/platforms/windows/interfaces/wslconfig-parser.interface.js +3 -0
- package/dist/infrastructure/platforms/windows/parsers/wsl-version.parser.js +133 -0
- package/dist/infrastructure/platforms/windows/services/microk8s.service.js +168 -0
- package/dist/infrastructure/platforms/windows/services/rootfs-manager.service.js +336 -0
- package/dist/infrastructure/platforms/windows/services/windows-features.service.js +191 -0
- package/dist/infrastructure/platforms/windows/services/windows-info.service.js +138 -0
- package/dist/infrastructure/platforms/windows/services/wsl-config.service.js +171 -0
- package/dist/infrastructure/platforms/windows/services/wsl-info.service.js +226 -0
- package/dist/infrastructure/platforms/windows/services/wsl-instance-inspection.service.js +325 -0
- package/dist/infrastructure/platforms/windows/services/wsl-instance-lifecycle.service.js +442 -0
- package/dist/infrastructure/platforms/windows/services/wsl-instance-naming.service.js +93 -0
- package/dist/infrastructure/platforms/windows/services/wsl-updater.service.js +273 -0
- package/dist/infrastructure/platforms/windows/services/wslconfig-parser.service.js +222 -0
- package/dist/infrastructure/platforms/windows/wsl-base-image.adapter.js +41 -0
- package/dist/infrastructure/platforms/windows/wsl-instance-manager.adapter.js +150 -0
- package/dist/infrastructure/utils/error-formatter.util.js +29 -0
- package/dist/infrastructure/utils/file-operations.util.js +201 -0
- package/dist/infrastructure/utils/input-validator.util.js +152 -0
- package/dist/infrastructure/utils/retry.util.js +98 -0
- package/dist/presentation/controllers/config.controller.js +146 -0
- package/dist/presentation/controllers/credentials.controller.js +105 -0
- package/dist/presentation/controllers/index.js +25 -0
- package/dist/presentation/controllers/instance.controller.js +363 -0
- package/dist/presentation/controllers/logs.controller.js +103 -0
- package/dist/presentation/controllers/setup.controller.js +175 -0
- package/dist/presentation/interfaces/cli-options.interface.js +8 -0
- package/dist/presentation/prompts/acr-credentials.prompt.js +76 -0
- package/dist/presentation/prompts/index.js +21 -0
- package/dist/presentation/ui/cli-progress.service.js +193 -0
- package/dist/presentation/ui/constants/output-symbols.js +42 -0
- package/dist/presentation/ui/index.js +27 -0
- package/dist/presentation/ui/interaction.service.js +276 -0
- package/dist/presentation/ui/interfaces/cli-progress.interface.js +9 -0
- package/dist/presentation/ui/interfaces/output-formatter.interface.js +23 -0
- package/dist/presentation/ui/log-level.enum.js +66 -0
- package/dist/presentation/ui/output-builder.service.js +378 -0
- package/dist/presentation/ui/output-formatter.service.js +393 -0
- package/package.json +65 -0
|
@@ -0,0 +1,168 @@
|
|
|
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 __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
19
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
20
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
21
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
22
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
23
|
+
};
|
|
24
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
25
|
+
var ownKeys = function(o) {
|
|
26
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
27
|
+
var ar = [];
|
|
28
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
29
|
+
return ar;
|
|
30
|
+
};
|
|
31
|
+
return ownKeys(o);
|
|
32
|
+
};
|
|
33
|
+
return function (mod) {
|
|
34
|
+
if (mod && mod.__esModule) return mod;
|
|
35
|
+
var result = {};
|
|
36
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
37
|
+
__setModuleDefault(result, mod);
|
|
38
|
+
return result;
|
|
39
|
+
};
|
|
40
|
+
})();
|
|
41
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
42
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
43
|
+
};
|
|
44
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
45
|
+
exports.FileSystemConfigRepository = void 0;
|
|
46
|
+
const tsyringe_1 = require("tsyringe");
|
|
47
|
+
const fs = __importStar(require("fs/promises"));
|
|
48
|
+
const path = __importStar(require("path"));
|
|
49
|
+
const os = __importStar(require("os"));
|
|
50
|
+
const value_objects_1 = require("../../../domain/value-objects");
|
|
51
|
+
/**
|
|
52
|
+
* 檔案系統配置 Repository
|
|
53
|
+
*
|
|
54
|
+
* 實作 IConfigRepository,使用檔案系統儲存應用程式配置
|
|
55
|
+
* 儲存位置:~/.uofx/config.json
|
|
56
|
+
*/
|
|
57
|
+
let FileSystemConfigRepository = class FileSystemConfigRepository {
|
|
58
|
+
constructor() {
|
|
59
|
+
this.configPath = path.join(os.homedir(), '.uofx', 'config.json');
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* 取得 ACR 預設憑證
|
|
63
|
+
* @returns ACR 憑證,若未設定則回傳 null
|
|
64
|
+
*/
|
|
65
|
+
async getDefaultAcrCredentials() {
|
|
66
|
+
const config = await this.loadConfig();
|
|
67
|
+
if (config.acr) {
|
|
68
|
+
try {
|
|
69
|
+
return value_objects_1.AcrCredentials.create(config.acr.name, config.acr.account, config.acr.password);
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
return null;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return null;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* 儲存 ACR 預設憑證
|
|
79
|
+
* @param credentials - ACR 憑證
|
|
80
|
+
*/
|
|
81
|
+
async saveDefaultAcrCredentials(credentials) {
|
|
82
|
+
const config = await this.loadConfig();
|
|
83
|
+
config.acr = {
|
|
84
|
+
name: credentials.name,
|
|
85
|
+
account: credentials.account,
|
|
86
|
+
password: credentials.password,
|
|
87
|
+
};
|
|
88
|
+
await this.saveConfig(config);
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* 取得配置值
|
|
92
|
+
* @param key - 配置鍵
|
|
93
|
+
* @returns 配置值,若不存在則回傳 null
|
|
94
|
+
*/
|
|
95
|
+
async get(key) {
|
|
96
|
+
const config = await this.loadConfig();
|
|
97
|
+
const value = config[key];
|
|
98
|
+
if (typeof value === 'string') {
|
|
99
|
+
return value;
|
|
100
|
+
}
|
|
101
|
+
return null;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* 設定配置值
|
|
105
|
+
* @param key - 配置鍵
|
|
106
|
+
* @param value - 配置值
|
|
107
|
+
*/
|
|
108
|
+
async set(key, value) {
|
|
109
|
+
const config = await this.loadConfig();
|
|
110
|
+
config[key] = value;
|
|
111
|
+
await this.saveConfig(config);
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* 刪除配置值
|
|
115
|
+
* @param key - 配置鍵
|
|
116
|
+
*/
|
|
117
|
+
async delete(key) {
|
|
118
|
+
const config = await this.loadConfig();
|
|
119
|
+
delete config[key];
|
|
120
|
+
await this.saveConfig(config);
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* 取得所有配置
|
|
124
|
+
* @returns 配置物件
|
|
125
|
+
*/
|
|
126
|
+
async getAll() {
|
|
127
|
+
const config = await this.loadConfig();
|
|
128
|
+
const result = {};
|
|
129
|
+
for (const [key, value] of Object.entries(config)) {
|
|
130
|
+
if (typeof value === 'string') {
|
|
131
|
+
result[key] = value;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
return result;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* 載入配置檔案
|
|
138
|
+
* @returns 配置物件
|
|
139
|
+
*/
|
|
140
|
+
async loadConfig() {
|
|
141
|
+
try {
|
|
142
|
+
const data = await fs.readFile(this.configPath, 'utf8');
|
|
143
|
+
return JSON.parse(data);
|
|
144
|
+
}
|
|
145
|
+
catch {
|
|
146
|
+
// 檔案不存在或讀取失敗,回傳空配置
|
|
147
|
+
return {};
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* 儲存配置檔案
|
|
152
|
+
* @param config - 配置物件
|
|
153
|
+
*/
|
|
154
|
+
async saveConfig(config) {
|
|
155
|
+
const dir = path.dirname(this.configPath);
|
|
156
|
+
// 確保目錄存在
|
|
157
|
+
await fs.mkdir(dir, { recursive: true });
|
|
158
|
+
// 寫入配置
|
|
159
|
+
const data = JSON.stringify(config, null, 2);
|
|
160
|
+
await fs.writeFile(this.configPath, data, 'utf8');
|
|
161
|
+
}
|
|
162
|
+
};
|
|
163
|
+
exports.FileSystemConfigRepository = FileSystemConfigRepository;
|
|
164
|
+
exports.FileSystemConfigRepository = FileSystemConfigRepository = __decorate([
|
|
165
|
+
(0, tsyringe_1.injectable)(),
|
|
166
|
+
__metadata("design:paramtypes", [])
|
|
167
|
+
], FileSystemConfigRepository);
|
|
168
|
+
//# sourceMappingURL=file-system-config.repository.js.map
|
|
@@ -0,0 +1,170 @@
|
|
|
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 __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
19
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
20
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
21
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
22
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
23
|
+
};
|
|
24
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
25
|
+
var ownKeys = function(o) {
|
|
26
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
27
|
+
var ar = [];
|
|
28
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
29
|
+
return ar;
|
|
30
|
+
};
|
|
31
|
+
return ownKeys(o);
|
|
32
|
+
};
|
|
33
|
+
return function (mod) {
|
|
34
|
+
if (mod && mod.__esModule) return mod;
|
|
35
|
+
var result = {};
|
|
36
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
37
|
+
__setModuleDefault(result, mod);
|
|
38
|
+
return result;
|
|
39
|
+
};
|
|
40
|
+
})();
|
|
41
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
42
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
43
|
+
};
|
|
44
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
45
|
+
exports.FileSystemInstanceRepository = void 0;
|
|
46
|
+
const tsyringe_1 = require("tsyringe");
|
|
47
|
+
const fs = __importStar(require("fs/promises"));
|
|
48
|
+
const path = __importStar(require("path"));
|
|
49
|
+
const os = __importStar(require("os"));
|
|
50
|
+
const entities_1 = require("../../../domain/entities");
|
|
51
|
+
/**
|
|
52
|
+
* 檔案系統實例 Repository
|
|
53
|
+
*
|
|
54
|
+
* 實作 IInstanceRepository,使用檔案系統儲存實例 metadata
|
|
55
|
+
* 儲存位置:~/.uofx/instances/{name}/metadata.json
|
|
56
|
+
*/
|
|
57
|
+
let FileSystemInstanceRepository = class FileSystemInstanceRepository {
|
|
58
|
+
constructor() {
|
|
59
|
+
this.baseDir = path.join(os.homedir(), '.uofx', 'instances');
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* 儲存實例 metadata
|
|
63
|
+
* @param metadata - 實例元資料
|
|
64
|
+
*/
|
|
65
|
+
async save(metadata) {
|
|
66
|
+
const metadataPath = this.getMetadataPath(metadata.name);
|
|
67
|
+
const dir = path.dirname(metadataPath);
|
|
68
|
+
// 確保目錄存在
|
|
69
|
+
await fs.mkdir(dir, { recursive: true });
|
|
70
|
+
// 寫入 metadata
|
|
71
|
+
const data = JSON.stringify(metadata.toObject(), null, 2);
|
|
72
|
+
await fs.writeFile(metadataPath, data, 'utf8');
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* 載入實例 metadata
|
|
76
|
+
* @param name - 實例名稱
|
|
77
|
+
* @returns 實例元資料,若不存在則回傳 null
|
|
78
|
+
*/
|
|
79
|
+
async load(name) {
|
|
80
|
+
const metadataPath = this.getMetadataPath(name);
|
|
81
|
+
try {
|
|
82
|
+
const data = await fs.readFile(metadataPath, 'utf8');
|
|
83
|
+
const obj = JSON.parse(data);
|
|
84
|
+
return entities_1.InstanceMetadata.fromObject(obj);
|
|
85
|
+
}
|
|
86
|
+
catch (error) {
|
|
87
|
+
// 檔案不存在或讀取失敗
|
|
88
|
+
return null;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* 刪除實例 metadata
|
|
93
|
+
* @param name - 實例名稱
|
|
94
|
+
*/
|
|
95
|
+
async delete(name) {
|
|
96
|
+
const instanceDir = this.getInstanceDir(name);
|
|
97
|
+
try {
|
|
98
|
+
await fs.rm(instanceDir, { recursive: true, force: true });
|
|
99
|
+
}
|
|
100
|
+
catch (error) {
|
|
101
|
+
// 忽略刪除失敗(可能不存在)
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* 檢查實例 metadata 是否存在
|
|
106
|
+
* @param name - 實例名稱
|
|
107
|
+
* @returns 若存在則回傳 true
|
|
108
|
+
*/
|
|
109
|
+
async exists(name) {
|
|
110
|
+
const metadataPath = this.getMetadataPath(name);
|
|
111
|
+
try {
|
|
112
|
+
await fs.access(metadataPath);
|
|
113
|
+
return true;
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
return false;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* 列出所有實例 metadata
|
|
121
|
+
* @returns 所有實例元資料的陣列
|
|
122
|
+
*/
|
|
123
|
+
async listAll() {
|
|
124
|
+
const metadataList = [];
|
|
125
|
+
try {
|
|
126
|
+
// 確保目錄存在
|
|
127
|
+
await fs.mkdir(this.baseDir, { recursive: true });
|
|
128
|
+
const dirs = await fs.readdir(this.baseDir);
|
|
129
|
+
for (const dir of dirs) {
|
|
130
|
+
const metadataPath = path.join(this.baseDir, dir, 'metadata.json');
|
|
131
|
+
try {
|
|
132
|
+
const data = await fs.readFile(metadataPath, 'utf8');
|
|
133
|
+
const obj = JSON.parse(data);
|
|
134
|
+
const metadata = entities_1.InstanceMetadata.fromObject(obj);
|
|
135
|
+
metadataList.push(metadata);
|
|
136
|
+
}
|
|
137
|
+
catch {
|
|
138
|
+
// 跳過無效的 metadata
|
|
139
|
+
continue;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
catch {
|
|
144
|
+
// 基礎目錄不存在,回傳空陣列
|
|
145
|
+
}
|
|
146
|
+
return metadataList;
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* 取得實例目錄路徑
|
|
150
|
+
* @param name - 實例名稱
|
|
151
|
+
* @returns 目錄路徑
|
|
152
|
+
*/
|
|
153
|
+
getInstanceDir(name) {
|
|
154
|
+
return path.join(this.baseDir, name.toString());
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* 取得 metadata 檔案路徑
|
|
158
|
+
* @param name - 實例名稱
|
|
159
|
+
* @returns 檔案路徑
|
|
160
|
+
*/
|
|
161
|
+
getMetadataPath(name) {
|
|
162
|
+
return path.join(this.getInstanceDir(name), 'metadata.json');
|
|
163
|
+
}
|
|
164
|
+
};
|
|
165
|
+
exports.FileSystemInstanceRepository = FileSystemInstanceRepository;
|
|
166
|
+
exports.FileSystemInstanceRepository = FileSystemInstanceRepository = __decorate([
|
|
167
|
+
(0, tsyringe_1.injectable)(),
|
|
168
|
+
__metadata("design:paramtypes", [])
|
|
169
|
+
], FileSystemInstanceRepository);
|
|
170
|
+
//# sourceMappingURL=file-system-instance.repository.js.map
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Persistence Services
|
|
4
|
+
*/
|
|
5
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
8
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
9
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
10
|
+
}
|
|
11
|
+
Object.defineProperty(o, k2, desc);
|
|
12
|
+
}) : (function(o, m, k, k2) {
|
|
13
|
+
if (k2 === undefined) k2 = k;
|
|
14
|
+
o[k2] = m[k];
|
|
15
|
+
}));
|
|
16
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
17
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
18
|
+
};
|
|
19
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
|
+
__exportStar(require("./file-system-instance.repository"), exports);
|
|
21
|
+
__exportStar(require("./file-system-config.repository"), exports);
|
|
22
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.UserSettingsAdapter = void 0;
|
|
16
|
+
const tsyringe_1 = require("tsyringe");
|
|
17
|
+
const tokens_1 = require("../../di/tokens");
|
|
18
|
+
/**
|
|
19
|
+
* 使用者設定 Adapter
|
|
20
|
+
*
|
|
21
|
+
* 實作 IUserSettingsPort,負責寫入使用者配置到 ~/.uofx/config.json
|
|
22
|
+
*/
|
|
23
|
+
let UserSettingsAdapter = class UserSettingsAdapter {
|
|
24
|
+
constructor(configRepo) {
|
|
25
|
+
this.configRepo = configRepo;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* 儲存 ACR 憑證到使用者配置
|
|
29
|
+
*/
|
|
30
|
+
async saveAcrCredentials(credentials) {
|
|
31
|
+
await this.configRepo.saveDefaultAcrCredentials(credentials);
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* 設定日誌級別
|
|
35
|
+
*/
|
|
36
|
+
async setLogLevel(level) {
|
|
37
|
+
await this.configRepo.set('logLevel', level);
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* 設定任意配置值
|
|
41
|
+
* @param key - 配置鍵(支援 dot notation,如 'acr.name')
|
|
42
|
+
* @param value - 配置值
|
|
43
|
+
*/
|
|
44
|
+
async setConfig(key, value) {
|
|
45
|
+
const stringValue = typeof value === 'string' ? value : JSON.stringify(value);
|
|
46
|
+
await this.configRepo.set(key, stringValue);
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
exports.UserSettingsAdapter = UserSettingsAdapter;
|
|
50
|
+
exports.UserSettingsAdapter = UserSettingsAdapter = __decorate([
|
|
51
|
+
(0, tsyringe_1.injectable)(),
|
|
52
|
+
__param(0, (0, tsyringe_1.inject)(tokens_1.TOKENS.Internal.FileConfigRepository)),
|
|
53
|
+
__metadata("design:paramtypes", [Object])
|
|
54
|
+
], UserSettingsAdapter);
|
|
55
|
+
//# sourceMappingURL=user-settings.adapter.js.map
|
|
@@ -0,0 +1,71 @@
|
|
|
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.detectPlatform = detectPlatform;
|
|
37
|
+
exports.isWindows = isWindows;
|
|
38
|
+
exports.isLinux = isLinux;
|
|
39
|
+
const os = __importStar(require("os"));
|
|
40
|
+
/**
|
|
41
|
+
* 偵測當前執行平台
|
|
42
|
+
* @returns 平台類型
|
|
43
|
+
*/
|
|
44
|
+
function detectPlatform() {
|
|
45
|
+
const platform = os.platform();
|
|
46
|
+
switch (platform) {
|
|
47
|
+
case 'win32':
|
|
48
|
+
return 'windows';
|
|
49
|
+
case 'linux':
|
|
50
|
+
return 'linux';
|
|
51
|
+
case 'darwin':
|
|
52
|
+
return 'macos';
|
|
53
|
+
default:
|
|
54
|
+
return 'unknown';
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* 檢查是否為 Windows 平台
|
|
59
|
+
* @returns 若為 Windows 則回傳 true
|
|
60
|
+
*/
|
|
61
|
+
function isWindows() {
|
|
62
|
+
return detectPlatform() === 'windows';
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* 檢查是否為 Linux 平台
|
|
66
|
+
* @returns 若為 Linux 則回傳 true
|
|
67
|
+
*/
|
|
68
|
+
function isLinux() {
|
|
69
|
+
return detectPlatform() === 'linux';
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=platform-detector.js.map
|