@archznn/xavva 3.1.3 → 3.2.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/README.md +221 -12
- package/package.json +3 -2
- package/src/commands/AuditCommand.ts +12 -10
- package/src/commands/BuildCommand.ts +9 -7
- package/src/commands/ChangelogCommand.ts +5 -5
- package/src/commands/CleanCommand.ts +242 -0
- package/src/commands/CompletionCommand.ts +7 -7
- package/src/commands/DbCommand.ts +33 -31
- package/src/commands/DeployCommand.ts +252 -229
- package/src/commands/DepsCommand.ts +174 -174
- package/src/commands/DockerCommand.ts +14 -14
- package/src/commands/DoctorCommand.ts +252 -239
- package/src/commands/EncodingCommand.ts +19 -19
- package/src/commands/HealthCommand.ts +7 -7
- package/src/commands/HelpCommand.ts +34 -14
- package/src/commands/HistoryCommand.ts +5 -5
- package/src/commands/HttpCommand.ts +6 -6
- package/src/commands/IdeCommand.ts +313 -0
- package/src/commands/InitCommand.ts +26 -25
- package/src/commands/LogsCommand.ts +8 -6
- package/src/commands/ProfilesCommand.ts +6 -6
- package/src/commands/RedoCommand.ts +2 -2
- package/src/commands/RunCommand.ts +64 -24
- package/src/commands/StartCommand.ts +9 -7
- package/src/commands/TestCommand.ts +4 -4
- package/src/commands/TomcatCommand.ts +219 -100
- package/src/config/versions.ts +111 -9
- package/src/di/container.ts +239 -105
- package/src/errors/ErrorHandler.ts +23 -19
- package/src/errors/errorMessages.ts +235 -0
- package/src/index.ts +11 -3
- package/src/logging/FileLogger.ts +235 -0
- package/src/logging/Logger.ts +545 -0
- package/src/logging/OperationLogger.ts +296 -0
- package/src/logging/ProgressLogger.ts +187 -0
- package/src/logging/TableLogger.ts +246 -0
- package/src/logging/colors.ts +167 -0
- package/src/logging/constants.ts +176 -0
- package/src/logging/formatters.ts +337 -0
- package/src/logging/index.ts +93 -0
- package/src/logging/types.ts +64 -0
- package/src/plugins/PluginManager.ts +325 -0
- package/src/plugins/types.ts +82 -0
- package/src/services/AuditService.ts +5 -3
- package/src/services/BuildService.ts +15 -17
- package/src/services/DashboardService.ts +14 -3
- package/src/services/DbService.ts +35 -34
- package/src/services/DependencyAnalyzerService.ts +18 -18
- package/src/services/DependencyCacheService.ts +303 -0
- package/src/services/DeployWatcher.ts +127 -23
- package/src/services/DockerService.ts +3 -3
- package/src/services/EmbeddedTomcatService.ts +13 -12
- package/src/services/FileWatcher.ts +15 -7
- package/src/services/HttpService.ts +5 -5
- package/src/services/LogAnalyzer.ts +26 -22
- package/src/services/PerformanceProfiler.ts +267 -0
- package/src/services/ProjectService.ts +3 -0
- package/src/services/TestService.ts +3 -3
- package/src/services/TomcatService.ts +46 -25
- package/src/services/tomcat/TomcatBackupManager.ts +330 -0
- package/src/services/tomcat/TomcatChecksumVerifier.ts +211 -0
- package/src/services/tomcat/TomcatCompatibilityChecker.ts +298 -0
- package/src/services/tomcat/TomcatDownloadCache.ts +250 -0
- package/src/services/tomcat/TomcatDownloadService.ts +335 -0
- package/src/services/tomcat/TomcatInstallerService.ts +474 -0
- package/src/services/tomcat/TomcatMirrorManager.ts +181 -0
- package/src/services/tomcat/index.ts +36 -0
- package/src/services/tomcat/types.ts +120 -0
- package/src/types/args.ts +68 -1
- package/src/types/configSchema.ts +174 -0
- package/src/utils/ChangelogGenerator.ts +11 -11
- package/src/utils/LoggerLevel.ts +44 -20
- package/src/utils/ProgressBar.ts +87 -46
- package/src/utils/argsParser.ts +260 -0
- package/src/utils/config.ts +340 -189
- package/src/utils/constants.ts +87 -9
- package/src/utils/dryRun.ts +192 -0
- package/src/utils/processManager.ts +23 -7
- package/src/utils/security.ts +293 -0
- package/src/utils/ui.ts +299 -428
|
@@ -1,44 +1,62 @@
|
|
|
1
1
|
import type { Command } from "./Command";
|
|
2
2
|
import type { AppConfig, CLIArguments } from "../types/config";
|
|
3
|
-
import {
|
|
4
|
-
|
|
3
|
+
import { Logger, C } from "../utils/ui";
|
|
4
|
+
// TomcatManagerService será implementado em fase futura
|
|
5
|
+
import { TomcatInstallerService } from "../services/tomcat";
|
|
5
6
|
import path from "path";
|
|
6
7
|
import fs from "fs";
|
|
7
8
|
|
|
8
9
|
export class TomcatCommand implements Command {
|
|
10
|
+
private installer = new TomcatInstallerService();
|
|
11
|
+
|
|
9
12
|
private showHelp(): void {
|
|
10
13
|
Logger.section("Tomcat Command");
|
|
11
|
-
Logger.log(`${
|
|
14
|
+
Logger.log(`${C.bold}Usage:${C.reset} xavva tomcat <action> [options]`);
|
|
15
|
+
Logger.newline();
|
|
16
|
+
Logger.log(`${C.bold}Actions:${C.reset}`);
|
|
17
|
+
Logger.log(` ${C.primary}list${C.reset} List available Tomcat versions`);
|
|
18
|
+
Logger.log(` ${C.primary}installed${C.reset} List installed versions`);
|
|
19
|
+
Logger.log(` ${C.primary}install${C.reset} Install a version`);
|
|
20
|
+
Logger.log(` ${C.primary}use${C.reset} Set version for this project`);
|
|
21
|
+
Logger.log(` ${C.primary}uninstall${C.reset} Remove a version`);
|
|
22
|
+
Logger.log(` ${C.primary}status${C.reset} Show current configuration`);
|
|
23
|
+
Logger.log(` ${C.primary}backup${C.reset} Manage backups`);
|
|
24
|
+
Logger.log(` ${C.primary}cache${C.reset} Manage download cache`);
|
|
25
|
+
Logger.log(` ${C.primary}mirrors${C.reset} Test and select mirrors`);
|
|
12
26
|
Logger.newline();
|
|
13
|
-
Logger.log(`${
|
|
14
|
-
Logger.log(` ${
|
|
15
|
-
Logger.log(` ${
|
|
16
|
-
Logger.log(` ${
|
|
17
|
-
Logger.log(` ${
|
|
18
|
-
Logger.log(` ${
|
|
19
|
-
Logger.log(` ${
|
|
27
|
+
Logger.log(`${C.bold}Install Options:${C.reset}`);
|
|
28
|
+
Logger.log(` ${C.primary}--mirror${C.reset} <name> Use specific mirror (or 'auto')`);
|
|
29
|
+
Logger.log(` ${C.primary}--no-checksum${C.reset} Skip checksum verification`);
|
|
30
|
+
Logger.log(` ${C.primary}--no-cache${C.reset} Don't use download cache`);
|
|
31
|
+
Logger.log(` ${C.primary}--no-backup${C.reset} Skip backup if exists`);
|
|
32
|
+
Logger.log(` ${C.primary}--silent${C.reset} Silent mode (CI/CD)`);
|
|
33
|
+
Logger.log(` ${C.primary}--timeout${C.reset} <sec> Download timeout (default: 300)`);
|
|
34
|
+
Logger.log(` ${C.primary}--retries${C.reset} <n> Retry attempts (default: 3)`);
|
|
35
|
+
Logger.log(` ${C.primary}--force${C.reset} Force reinstallation`);
|
|
36
|
+
Logger.log(` ${C.primary}--parallel${C.reset} Install multiple versions`);
|
|
20
37
|
Logger.newline();
|
|
21
|
-
Logger.log(`${
|
|
38
|
+
Logger.log(`${C.bold}Examples:${C.reset}`);
|
|
22
39
|
Logger.log(` xavva tomcat list`);
|
|
23
|
-
Logger.log(` xavva tomcat install
|
|
40
|
+
Logger.log(` xavva tomcat install 10.1.52`);
|
|
41
|
+
Logger.log(` xavva tomcat install 9.0.115 --mirror auto`);
|
|
42
|
+
Logger.log(` xavva tomcat install 10.1.52 9.0.115 --parallel`);
|
|
24
43
|
Logger.log(` xavva tomcat use 10.1.52`);
|
|
25
|
-
Logger.log(` xavva tomcat
|
|
44
|
+
Logger.log(` xavva tomcat backup list`);
|
|
45
|
+
Logger.log(` xavva tomcat cache stats`);
|
|
46
|
+
Logger.log(` xavva tomcat mirrors test`);
|
|
26
47
|
}
|
|
27
48
|
|
|
28
49
|
async execute(config: AppConfig, args?: CLIArguments, positionals?: string[]): Promise<void> {
|
|
29
|
-
// Mostra help se solicitado
|
|
30
50
|
if (args?.help) {
|
|
31
51
|
this.showHelp();
|
|
32
52
|
return;
|
|
33
53
|
}
|
|
34
54
|
|
|
35
|
-
// A ação vem como positional após "tomcat" (ex: xavva tomcat list)
|
|
36
55
|
const tomcatIndex = positionals?.indexOf("tomcat") ?? -1;
|
|
37
56
|
const action = positionals && tomcatIndex >= 0 && positionals[tomcatIndex + 1]
|
|
38
57
|
? positionals[tomcatIndex + 1]
|
|
39
58
|
: "status";
|
|
40
59
|
|
|
41
|
-
// Argumentos extras após a ação (ex: xavva tomcat install 9.0.115)
|
|
42
60
|
const extraArgs = positionals && tomcatIndex >= 0 ? positionals.slice(tomcatIndex + 2) : [];
|
|
43
61
|
|
|
44
62
|
switch (action) {
|
|
@@ -46,10 +64,10 @@ export class TomcatCommand implements Command {
|
|
|
46
64
|
await this.handleInstall(config, args, extraArgs);
|
|
47
65
|
break;
|
|
48
66
|
case "list":
|
|
49
|
-
this.handleList();
|
|
67
|
+
await this.handleList();
|
|
50
68
|
break;
|
|
51
69
|
case "installed":
|
|
52
|
-
this.handleInstalled();
|
|
70
|
+
await this.handleInstalled();
|
|
53
71
|
break;
|
|
54
72
|
case "use":
|
|
55
73
|
await this.handleUse(config, args, extraArgs);
|
|
@@ -57,61 +75,98 @@ export class TomcatCommand implements Command {
|
|
|
57
75
|
case "uninstall":
|
|
58
76
|
await this.handleUninstall(config, args, extraArgs);
|
|
59
77
|
break;
|
|
78
|
+
case "backup":
|
|
79
|
+
await this.handleBackup(extraArgs);
|
|
80
|
+
break;
|
|
81
|
+
case "cache":
|
|
82
|
+
await this.handleCache(extraArgs);
|
|
83
|
+
break;
|
|
84
|
+
case "mirrors":
|
|
85
|
+
await this.handleMirrors(extraArgs);
|
|
86
|
+
break;
|
|
60
87
|
case "status":
|
|
61
|
-
|
|
88
|
+
Logger.info("Status", "Tomcat manager avançado em desenvolvimento");
|
|
62
89
|
break;
|
|
63
90
|
default:
|
|
64
91
|
Logger.error(`Ação desconhecida: ${action}`);
|
|
65
|
-
Logger.info("Ações disponíveis", "install, list, installed, use, uninstall, status");
|
|
92
|
+
Logger.info("Ações disponíveis", "install, list, installed, use, uninstall, backup, cache, mirrors, status");
|
|
66
93
|
}
|
|
67
94
|
}
|
|
68
95
|
|
|
69
96
|
private async handleInstall(config: AppConfig, args?: CLIArguments, extraArgs: string[] = []): Promise<void> {
|
|
70
|
-
//
|
|
71
|
-
const
|
|
72
|
-
|
|
73
|
-
//
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
return;
|
|
97
|
+
// Verifica modo paralelo
|
|
98
|
+
const isParallel = args?.parallel || extraArgs.includes("--parallel");
|
|
99
|
+
|
|
100
|
+
// Coleta versões para instalar
|
|
101
|
+
let versions: string[] = [];
|
|
102
|
+
|
|
103
|
+
// Versão via flag
|
|
104
|
+
if (args?.["tomcat-version"]) {
|
|
105
|
+
versions.push(args["tomcat-version"]);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// Versões via args extras (remove flags)
|
|
109
|
+
const versionArgs = extraArgs.filter(arg => !arg.startsWith("--"));
|
|
110
|
+
versions.push(...versionArgs);
|
|
111
|
+
|
|
112
|
+
// Se nenhuma versão especificada, usa padrão ou config
|
|
113
|
+
if (versions.length === 0) {
|
|
114
|
+
versions.push(config.tomcat.version || "10.1.52");
|
|
89
115
|
}
|
|
90
116
|
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
117
|
+
// Remove duplicatas
|
|
118
|
+
versions = [...new Set(versions)];
|
|
119
|
+
|
|
120
|
+
const installOptions = {
|
|
121
|
+
version: versions[0], // Será sobrescrito no loop/paralelo
|
|
122
|
+
mirror: args?.["tomcat-mirror"] as string | undefined,
|
|
123
|
+
verifyChecksum: !args?.["no-checksum"] && !extraArgs.includes("--no-checksum"),
|
|
124
|
+
useCache: !args?.["no-cache"] && !extraArgs.includes("--no-cache"),
|
|
125
|
+
backup: !args?.["no-backup"] && !extraArgs.includes("--no-backup"),
|
|
126
|
+
silent: args?.silent || extraArgs.includes("--silent"),
|
|
127
|
+
timeout: parseInt(args?.timeout as string || "300"),
|
|
128
|
+
retries: parseInt(args?.retries as string || "3"),
|
|
129
|
+
force: args?.force || extraArgs.includes("--force"),
|
|
130
|
+
projectPath: process.cwd()
|
|
131
|
+
};
|
|
132
|
+
|
|
133
|
+
if (isParallel && versions.length > 1) {
|
|
134
|
+
await this.installer.installParallel(versions, installOptions);
|
|
94
135
|
} else {
|
|
95
|
-
|
|
136
|
+
for (const version of versions) {
|
|
137
|
+
const result = await this.installer.install({
|
|
138
|
+
...installOptions,
|
|
139
|
+
version
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
if (!result.success) {
|
|
143
|
+
Logger.error(`Falha ao instalar ${version}: ${result.error}`);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
96
146
|
}
|
|
97
147
|
}
|
|
98
148
|
|
|
99
|
-
private handleList(): void {
|
|
100
|
-
Logger.section("Versões Disponíveis
|
|
101
|
-
const versions = EmbeddedTomcatService.getAvailableVersions();
|
|
149
|
+
private async handleList(): Promise<void> {
|
|
150
|
+
Logger.section("Versões Disponíveis");
|
|
102
151
|
|
|
103
|
-
|
|
104
|
-
Logger.log(` ${Logger.C.primary}•${Logger.C.reset} ${version}`);
|
|
105
|
-
}
|
|
152
|
+
const versions = ["11.0.6", "10.1.52", "10.0.27", "9.0.96", "8.5.100"];
|
|
106
153
|
|
|
154
|
+
Logger.log(`${C.bold}Recomendadas:${C.reset}`);
|
|
155
|
+
Logger.log(` ${C.success}✓${C.reset} 10.1.52 - Jakarta EE 10, Servlet 6.0`);
|
|
156
|
+
Logger.log(` ${C.success}✓${C.reset} 9.0.96 - Java EE 8, Servlet 4.0 (mais estável)`);
|
|
107
157
|
Logger.newline();
|
|
108
|
-
|
|
158
|
+
|
|
159
|
+
Logger.log(`${C.bold}Outras versões:${C.reset}`);
|
|
160
|
+
Logger.log(` ${C.primary}•${C.reset} 11.0.6 - Jakarta EE 11, requer Java 21`);
|
|
161
|
+
Logger.log(` ${C.primary}•${C.reset} 10.0.27 - Jakarta EE 9 (legado)`);
|
|
162
|
+
Logger.log(` ${C.primary}•${C.reset} 8.5.100 - Java EE 7 (legado)`);
|
|
109
163
|
Logger.newline();
|
|
164
|
+
|
|
110
165
|
Logger.info("Dica", "Use 'xavva tomcat installed' para ver versões já instaladas");
|
|
111
166
|
}
|
|
112
167
|
|
|
113
|
-
private handleInstalled(): void {
|
|
114
|
-
const installed =
|
|
168
|
+
private async handleInstalled(): Promise<void> {
|
|
169
|
+
const installed = await this.installer.listInstalled();
|
|
115
170
|
|
|
116
171
|
Logger.section("Versões Instaladas");
|
|
117
172
|
|
|
@@ -122,7 +177,9 @@ export class TomcatCommand implements Command {
|
|
|
122
177
|
}
|
|
123
178
|
|
|
124
179
|
for (const version of installed) {
|
|
125
|
-
|
|
180
|
+
const sizeMB = (version.size / 1024 / 1024).toFixed(1);
|
|
181
|
+
Logger.log(` ${C.success}✓${C.reset} ${C.bold}${version.version}${C.reset} (${sizeMB} MB)`);
|
|
182
|
+
Logger.log(` ${C.gray}Local:${C.reset} ${version.home}`);
|
|
126
183
|
}
|
|
127
184
|
|
|
128
185
|
Logger.newline();
|
|
@@ -135,37 +192,28 @@ export class TomcatCommand implements Command {
|
|
|
135
192
|
if (!version) {
|
|
136
193
|
Logger.error("Versão não especificada");
|
|
137
194
|
Logger.info("Uso", "xavva tomcat use <version>");
|
|
138
|
-
Logger.info("Exemplo", "xavva tomcat use
|
|
195
|
+
Logger.info("Exemplo", "xavva tomcat use 10.1.52");
|
|
139
196
|
Logger.newline();
|
|
140
|
-
|
|
141
|
-
this.handleInstalled();
|
|
197
|
+
await this.handleInstalled();
|
|
142
198
|
return;
|
|
143
199
|
}
|
|
144
200
|
|
|
145
|
-
|
|
146
|
-
const service = new EmbeddedTomcatService({
|
|
147
|
-
version,
|
|
148
|
-
port: config.tomcat.port,
|
|
149
|
-
webappPath: "."
|
|
150
|
-
});
|
|
151
|
-
|
|
152
|
-
if (!service.checkInstallation()) {
|
|
201
|
+
if (!this.installer.isInstalled(version)) {
|
|
153
202
|
Logger.warn(`Tomcat ${version} não está instalado`);
|
|
154
203
|
Logger.newline();
|
|
155
204
|
Logger.info("Opções", "");
|
|
156
|
-
Logger.log(` ${
|
|
157
|
-
Logger.log(` ${
|
|
205
|
+
Logger.log(` ${C.primary}1.${C.reset} Instalar agora: xavva tomcat install ${version}`);
|
|
206
|
+
Logger.log(` ${C.primary}2.${C.reset} Ver instaladas: xavva tomcat installed`);
|
|
158
207
|
return;
|
|
159
208
|
}
|
|
160
209
|
|
|
161
|
-
// Salva a versão no xavva.json do projeto
|
|
162
210
|
await this.saveTomcatVersion(version);
|
|
163
211
|
|
|
164
212
|
Logger.success(`Tomcat ${version} configurado para este projeto!`);
|
|
165
213
|
Logger.newline();
|
|
166
214
|
Logger.info("Próximos comandos", "");
|
|
167
|
-
Logger.log(` ${
|
|
168
|
-
Logger.log(` ${
|
|
215
|
+
Logger.log(` ${C.primary}•${C.reset} xavva dev # Iniciar desenvolvimento`);
|
|
216
|
+
Logger.log(` ${C.primary}•${C.reset} xavva deploy # Fazer deploy`);
|
|
169
217
|
}
|
|
170
218
|
|
|
171
219
|
private async saveTomcatVersion(version: string): Promise<void> {
|
|
@@ -188,47 +236,118 @@ export class TomcatCommand implements Command {
|
|
|
188
236
|
}
|
|
189
237
|
|
|
190
238
|
private async handleUninstall(config: AppConfig, args?: CLIArguments, extraArgs: string[] = []): Promise<void> {
|
|
191
|
-
|
|
192
|
-
const version = args?.["tomcat-version"] || extraArgs[0] || config.tomcat.version || "10.1.52";
|
|
239
|
+
const version = args?.["tomcat-version"] || extraArgs[0] || config.tomcat.version;
|
|
193
240
|
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
}
|
|
241
|
+
if (!version) {
|
|
242
|
+
Logger.error("Versão não especificada");
|
|
243
|
+
Logger.info("Uso", "xavva tomcat uninstall <version>");
|
|
244
|
+
return;
|
|
245
|
+
}
|
|
199
246
|
|
|
200
|
-
if (!
|
|
247
|
+
if (!this.installer.isInstalled(version)) {
|
|
201
248
|
Logger.warn(`Tomcat ${version} não está instalado`);
|
|
202
249
|
return;
|
|
203
250
|
}
|
|
204
251
|
|
|
205
252
|
Logger.step(`Removendo Tomcat ${version}...`);
|
|
206
|
-
await
|
|
207
|
-
Logger.success("Removido com sucesso!");
|
|
253
|
+
await this.installer.uninstall(version);
|
|
208
254
|
}
|
|
209
255
|
|
|
210
|
-
private async
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
256
|
+
private async handleBackup(extraArgs: string[] = []): Promise<void> {
|
|
257
|
+
const subAction = extraArgs[0] || "list";
|
|
258
|
+
|
|
259
|
+
switch (subAction) {
|
|
260
|
+
case "list": {
|
|
261
|
+
const version = extraArgs[1];
|
|
262
|
+
const backups = await this.installer.listBackups(version);
|
|
263
|
+
|
|
264
|
+
Logger.section("Backups Disponíveis");
|
|
265
|
+
|
|
266
|
+
if (backups.length === 0) {
|
|
267
|
+
Logger.warn("Nenhum backup encontrado");
|
|
268
|
+
return;
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
for (const backup of backups) {
|
|
272
|
+
const sizeMB = (backup.size / 1024 / 1024).toFixed(1);
|
|
273
|
+
const date = backup.timestamp.toLocaleString();
|
|
274
|
+
Logger.log(` ${C.primary}•${C.reset} ${backup.version} - ${date} (${sizeMB} MB)`);
|
|
275
|
+
}
|
|
276
|
+
break;
|
|
277
|
+
}
|
|
278
|
+
case "restore": {
|
|
279
|
+
const version = extraArgs[1];
|
|
280
|
+
if (!version) {
|
|
281
|
+
Logger.error("Versão não especificada");
|
|
282
|
+
Logger.info("Uso", "xavva tomcat backup restore <version>");
|
|
283
|
+
return;
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
const success = await this.installer.restoreBackup(version);
|
|
287
|
+
if (success) {
|
|
288
|
+
Logger.success(`Backup de ${version} restaurado!`);
|
|
289
|
+
} else {
|
|
290
|
+
Logger.error("Falha ao restaurar backup");
|
|
291
|
+
}
|
|
292
|
+
break;
|
|
293
|
+
}
|
|
294
|
+
default:
|
|
295
|
+
Logger.error(`Ação de backup desconhecida: ${subAction}`);
|
|
296
|
+
Logger.info("Ações", "list, restore");
|
|
222
297
|
}
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
const
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
private async handleCache(extraArgs: string[] = []): Promise<void> {
|
|
301
|
+
const subAction = extraArgs[0] || "stats";
|
|
302
|
+
|
|
303
|
+
switch (subAction) {
|
|
304
|
+
case "stats": {
|
|
305
|
+
const stats = await this.installer.getCacheStats();
|
|
306
|
+
const sizeMB = (stats.size / 1024 / 1024).toFixed(1);
|
|
307
|
+
|
|
308
|
+
Logger.section("Estatísticas do Cache");
|
|
309
|
+
Logger.log(` ${C.primary}•${C.reset} Arquivos: ${stats.files}`);
|
|
310
|
+
Logger.log(` ${C.primary}•${C.reset} Tamanho: ${sizeMB} MB`);
|
|
311
|
+
break;
|
|
312
|
+
}
|
|
313
|
+
case "clear":
|
|
314
|
+
await this.installer.clearCache();
|
|
315
|
+
Logger.success("Cache limpo!");
|
|
316
|
+
break;
|
|
317
|
+
default:
|
|
318
|
+
Logger.error(`Ação de cache desconhecida: ${subAction}`);
|
|
319
|
+
Logger.info("Ações", "stats, clear");
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
private async handleMirrors(extraArgs: string[] = []): Promise<void> {
|
|
324
|
+
const { TomcatMirrorManager } = await import("../services/tomcat");
|
|
325
|
+
const manager = new TomcatMirrorManager();
|
|
326
|
+
|
|
327
|
+
const subAction = extraArgs[0] || "list";
|
|
328
|
+
|
|
329
|
+
switch (subAction) {
|
|
330
|
+
case "list": {
|
|
331
|
+
const mirrors = manager.getMirrors();
|
|
332
|
+
Logger.section("Mirrors Disponíveis");
|
|
333
|
+
for (const mirror of mirrors) {
|
|
334
|
+
Logger.log(` ${C.primary}•${C.reset} ${mirror.name} (${mirror.region})`);
|
|
335
|
+
}
|
|
336
|
+
break;
|
|
337
|
+
}
|
|
338
|
+
case "test": {
|
|
339
|
+
Logger.section("Testando Mirrors");
|
|
340
|
+
const tested = await manager.testAllMirrors();
|
|
341
|
+
|
|
342
|
+
for (const mirror of tested.slice(0, 5)) {
|
|
343
|
+
const color = mirror.latency < 200 ? C.success : mirror.latency < 500 ? C.warning : C.error;
|
|
344
|
+
Logger.log(` ${color}•${C.reset} ${mirror.name}: ${mirror.latency}ms`);
|
|
345
|
+
}
|
|
346
|
+
break;
|
|
347
|
+
}
|
|
348
|
+
default:
|
|
349
|
+
Logger.error(`Ação desconhecida: ${subAction}`);
|
|
350
|
+
Logger.info("Ações", "list, test");
|
|
232
351
|
}
|
|
233
352
|
}
|
|
234
353
|
}
|
package/src/config/versions.ts
CHANGED
|
@@ -1,14 +1,18 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Configurações centralizadas de versões
|
|
3
|
-
*
|
|
2
|
+
* Configurações centralizadas de versões e constantes
|
|
3
|
+
* Fonte única da verdade para todo o XAVVA CLI
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
+
// ============================================
|
|
7
|
+
// VERSÕES
|
|
8
|
+
// ============================================
|
|
9
|
+
|
|
6
10
|
export const VERSIONS = {
|
|
7
11
|
// Versões padrão do Tomcat
|
|
8
12
|
TOMCAT: {
|
|
9
13
|
DEFAULT: "10.1.52",
|
|
10
14
|
AVAILABLE: {
|
|
11
|
-
"10.1.52": { sha512: "" },
|
|
15
|
+
"10.1.52": { sha512: "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" },
|
|
12
16
|
"9.0.115": { sha512: "" },
|
|
13
17
|
"11.0.18": { sha512: "" },
|
|
14
18
|
},
|
|
@@ -20,15 +24,113 @@ export const VERSIONS = {
|
|
|
20
24
|
URL: "https://github.com/HotswapProjects/HotswapAgent/releases/download/RELEASE-{version}/hotswap-agent-{version}.jar",
|
|
21
25
|
},
|
|
22
26
|
|
|
23
|
-
//
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
DEBOUNCE_MS: 300,
|
|
28
|
-
COOLING_MS: 1000,
|
|
27
|
+
// Requisitos
|
|
28
|
+
JDK: {
|
|
29
|
+
MIN: "11",
|
|
30
|
+
RECOMMENDED: "17",
|
|
29
31
|
},
|
|
30
32
|
} as const;
|
|
31
33
|
|
|
34
|
+
// ============================================
|
|
35
|
+
// PORTAS PADRÃO
|
|
36
|
+
// ============================================
|
|
37
|
+
|
|
38
|
+
export const PORTS = {
|
|
39
|
+
DEFAULT_TOMCAT: 8080,
|
|
40
|
+
DEFAULT_DEBUG: 5005,
|
|
41
|
+
} as const;
|
|
42
|
+
|
|
43
|
+
// ============================================
|
|
44
|
+
// TIMEOUTS (ms)
|
|
45
|
+
// ============================================
|
|
46
|
+
|
|
47
|
+
export const TIMEOUTS = {
|
|
48
|
+
SHUTDOWN: 5000,
|
|
49
|
+
DEBOUNCE: 300,
|
|
50
|
+
COOLING: 1000,
|
|
51
|
+
WATCHER_DEBOUNCE: 1500,
|
|
52
|
+
BROWSER_OPEN: 800,
|
|
53
|
+
DEPLOY_HEALTH_CHECK: 1500,
|
|
54
|
+
HOTSWAP: 500,
|
|
55
|
+
TOMCAT_CLEAN_RETRY: 50,
|
|
56
|
+
} as const;
|
|
57
|
+
|
|
58
|
+
// ============================================
|
|
59
|
+
// LIMITES E TAMANHOS
|
|
60
|
+
// ============================================
|
|
61
|
+
|
|
62
|
+
export const LIMITS = {
|
|
63
|
+
MAX_LOG_SCROLLBUFFER: 1000,
|
|
64
|
+
MAX_BUILD_ERRORS_SHOWN: 15,
|
|
65
|
+
MAX_HISTORY_ITEMS: 10,
|
|
66
|
+
MAX_DUPLICATE_LOGS: 5,
|
|
67
|
+
RATE_LIMIT_WINDOW_MS: 5000,
|
|
68
|
+
JAR_INTEGRITY_BUFFER_SIZE: 1024,
|
|
69
|
+
JAR_MIN_VALID_SIZE: 1000,
|
|
70
|
+
ZIP_EOCD_SIGNATURE_SIZE: 4,
|
|
71
|
+
} as const;
|
|
72
|
+
|
|
73
|
+
// ============================================
|
|
74
|
+
// DASHBOARD
|
|
75
|
+
// ============================================
|
|
76
|
+
|
|
77
|
+
export const DASHBOARD = {
|
|
78
|
+
REFRESH_INTERVAL_MS: 1000,
|
|
79
|
+
LOG_SLICE_LINES: 1000,
|
|
80
|
+
} as const;
|
|
81
|
+
|
|
82
|
+
// ============================================
|
|
83
|
+
// BUILD
|
|
84
|
+
// ============================================
|
|
85
|
+
|
|
86
|
+
export const BUILD = {
|
|
87
|
+
MAVEN_PARALLEL_THREADS: "1C",
|
|
88
|
+
JVM_MEMORY_OPTS: "-Xms512m -Xmx1024m -XX:+UseParallelGC",
|
|
89
|
+
GRADLE_MEMORY_OPTS: "-Xmx1024m -Dorg.gradle.daemon=true",
|
|
90
|
+
} as const;
|
|
91
|
+
|
|
92
|
+
// ============================================
|
|
93
|
+
// EXIT CODES
|
|
94
|
+
// ============================================
|
|
95
|
+
|
|
96
|
+
export const EXIT_CODES = {
|
|
97
|
+
SUCCESS: 0,
|
|
98
|
+
GENERIC_ERROR: 1,
|
|
99
|
+
INVALID_COMMAND: 2,
|
|
100
|
+
BUILD_FAILED: 3,
|
|
101
|
+
DEPLOY_FAILED: 4,
|
|
102
|
+
TOMCAT_ERROR: 5,
|
|
103
|
+
PROJECT_ERROR: 6,
|
|
104
|
+
AUDIT_ERROR: 7,
|
|
105
|
+
NETWORK_ERROR: 8,
|
|
106
|
+
FILESYSTEM_ERROR: 9,
|
|
107
|
+
COMMAND_ERROR: 10,
|
|
108
|
+
SIGINT: 130,
|
|
109
|
+
} as const;
|
|
110
|
+
|
|
111
|
+
// ============================================
|
|
112
|
+
// ARQUIVOS E DIRETÓRIOS
|
|
113
|
+
// ============================================
|
|
114
|
+
|
|
115
|
+
export const PATHS = {
|
|
116
|
+
JAVA_FILE_PATTERN: "**/*.java",
|
|
117
|
+
WAR_EXTENSION: ".war",
|
|
118
|
+
JAR_EXTENSION: ".jar",
|
|
119
|
+
XAVVA_DIR: ".xavva",
|
|
120
|
+
TARGET_DIR: "target",
|
|
121
|
+
BUILD_DIR: "build",
|
|
122
|
+
WEBAPP_DIR: "webapps",
|
|
123
|
+
} as const;
|
|
124
|
+
|
|
125
|
+
// ============================================
|
|
126
|
+
// CACHE
|
|
127
|
+
// ============================================
|
|
128
|
+
|
|
129
|
+
export const CACHE = {
|
|
130
|
+
MAX_AGE_MS: 24 * 60 * 60 * 1000,
|
|
131
|
+
VERSION: 1,
|
|
132
|
+
} as const;
|
|
133
|
+
|
|
32
134
|
// Type helpers
|
|
33
135
|
export type TomcatVersion = keyof typeof VERSIONS.TOMCAT.AVAILABLE;
|
|
34
136
|
|