@archznn/xavva 3.1.2 → 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 +43 -14
- package/src/commands/DeployCommand.ts +252 -229
- package/src/commands/DepsCommand.ts +174 -174
- package/src/commands/DockerCommand.ts +35 -4
- package/src/commands/DoctorCommand.ts +252 -239
- package/src/commands/EncodingCommand.ts +26 -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 +27 -1
- 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 +25 -1
- package/src/commands/TomcatCommand.ts +232 -88
- 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 +20 -6
- 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,19 +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
|
+
|
|
12
|
+
private showHelp(): void {
|
|
13
|
+
Logger.section("Tomcat Command");
|
|
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`);
|
|
26
|
+
Logger.newline();
|
|
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`);
|
|
37
|
+
Logger.newline();
|
|
38
|
+
Logger.log(`${C.bold}Examples:${C.reset}`);
|
|
39
|
+
Logger.log(` xavva tomcat list`);
|
|
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`);
|
|
43
|
+
Logger.log(` xavva tomcat use 10.1.52`);
|
|
44
|
+
Logger.log(` xavva tomcat backup list`);
|
|
45
|
+
Logger.log(` xavva tomcat cache stats`);
|
|
46
|
+
Logger.log(` xavva tomcat mirrors test`);
|
|
47
|
+
}
|
|
48
|
+
|
|
9
49
|
async execute(config: AppConfig, args?: CLIArguments, positionals?: string[]): Promise<void> {
|
|
10
|
-
|
|
50
|
+
if (args?.help) {
|
|
51
|
+
this.showHelp();
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
|
|
11
55
|
const tomcatIndex = positionals?.indexOf("tomcat") ?? -1;
|
|
12
56
|
const action = positionals && tomcatIndex >= 0 && positionals[tomcatIndex + 1]
|
|
13
57
|
? positionals[tomcatIndex + 1]
|
|
14
58
|
: "status";
|
|
15
59
|
|
|
16
|
-
// Argumentos extras após a ação (ex: xavva tomcat install 9.0.115)
|
|
17
60
|
const extraArgs = positionals && tomcatIndex >= 0 ? positionals.slice(tomcatIndex + 2) : [];
|
|
18
61
|
|
|
19
62
|
switch (action) {
|
|
@@ -21,10 +64,10 @@ export class TomcatCommand implements Command {
|
|
|
21
64
|
await this.handleInstall(config, args, extraArgs);
|
|
22
65
|
break;
|
|
23
66
|
case "list":
|
|
24
|
-
this.handleList();
|
|
67
|
+
await this.handleList();
|
|
25
68
|
break;
|
|
26
69
|
case "installed":
|
|
27
|
-
this.handleInstalled();
|
|
70
|
+
await this.handleInstalled();
|
|
28
71
|
break;
|
|
29
72
|
case "use":
|
|
30
73
|
await this.handleUse(config, args, extraArgs);
|
|
@@ -32,61 +75,98 @@ export class TomcatCommand implements Command {
|
|
|
32
75
|
case "uninstall":
|
|
33
76
|
await this.handleUninstall(config, args, extraArgs);
|
|
34
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;
|
|
35
87
|
case "status":
|
|
36
|
-
|
|
88
|
+
Logger.info("Status", "Tomcat manager avançado em desenvolvimento");
|
|
37
89
|
break;
|
|
38
90
|
default:
|
|
39
91
|
Logger.error(`Ação desconhecida: ${action}`);
|
|
40
|
-
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");
|
|
41
93
|
}
|
|
42
94
|
}
|
|
43
95
|
|
|
44
96
|
private async handleInstall(config: AppConfig, args?: CLIArguments, extraArgs: string[] = []): Promise<void> {
|
|
45
|
-
//
|
|
46
|
-
const
|
|
47
|
-
|
|
48
|
-
//
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
version,
|
|
55
|
-
port: config.tomcat.port,
|
|
56
|
-
webappPath
|
|
57
|
-
});
|
|
58
|
-
|
|
59
|
-
if (service.checkInstallation()) {
|
|
60
|
-
Logger.info("Tomcat", `Versão ${version} já está instalada`);
|
|
61
|
-
const info = service.getInfo();
|
|
62
|
-
Logger.config("Local", info.home);
|
|
63
|
-
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"]);
|
|
64
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");
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// Remove duplicatas
|
|
118
|
+
versions = [...new Set(versions)];
|
|
65
119
|
|
|
66
|
-
const
|
|
67
|
-
|
|
68
|
-
|
|
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);
|
|
69
135
|
} else {
|
|
70
|
-
|
|
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
|
+
}
|
|
71
146
|
}
|
|
72
147
|
}
|
|
73
148
|
|
|
74
|
-
private handleList(): void {
|
|
75
|
-
Logger.section("Versões Disponíveis
|
|
76
|
-
const versions = EmbeddedTomcatService.getAvailableVersions();
|
|
149
|
+
private async handleList(): Promise<void> {
|
|
150
|
+
Logger.section("Versões Disponíveis");
|
|
77
151
|
|
|
78
|
-
|
|
79
|
-
Logger.log(` ${Logger.C.primary}•${Logger.C.reset} ${version}`);
|
|
80
|
-
}
|
|
152
|
+
const versions = ["11.0.6", "10.1.52", "10.0.27", "9.0.96", "8.5.100"];
|
|
81
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)`);
|
|
82
157
|
Logger.newline();
|
|
83
|
-
|
|
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)`);
|
|
84
163
|
Logger.newline();
|
|
164
|
+
|
|
85
165
|
Logger.info("Dica", "Use 'xavva tomcat installed' para ver versões já instaladas");
|
|
86
166
|
}
|
|
87
167
|
|
|
88
|
-
private handleInstalled(): void {
|
|
89
|
-
const installed =
|
|
168
|
+
private async handleInstalled(): Promise<void> {
|
|
169
|
+
const installed = await this.installer.listInstalled();
|
|
90
170
|
|
|
91
171
|
Logger.section("Versões Instaladas");
|
|
92
172
|
|
|
@@ -97,7 +177,9 @@ export class TomcatCommand implements Command {
|
|
|
97
177
|
}
|
|
98
178
|
|
|
99
179
|
for (const version of installed) {
|
|
100
|
-
|
|
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}`);
|
|
101
183
|
}
|
|
102
184
|
|
|
103
185
|
Logger.newline();
|
|
@@ -110,37 +192,28 @@ export class TomcatCommand implements Command {
|
|
|
110
192
|
if (!version) {
|
|
111
193
|
Logger.error("Versão não especificada");
|
|
112
194
|
Logger.info("Uso", "xavva tomcat use <version>");
|
|
113
|
-
Logger.info("Exemplo", "xavva tomcat use
|
|
195
|
+
Logger.info("Exemplo", "xavva tomcat use 10.1.52");
|
|
114
196
|
Logger.newline();
|
|
115
|
-
|
|
116
|
-
this.handleInstalled();
|
|
197
|
+
await this.handleInstalled();
|
|
117
198
|
return;
|
|
118
199
|
}
|
|
119
200
|
|
|
120
|
-
|
|
121
|
-
const service = new EmbeddedTomcatService({
|
|
122
|
-
version,
|
|
123
|
-
port: config.tomcat.port,
|
|
124
|
-
webappPath: "."
|
|
125
|
-
});
|
|
126
|
-
|
|
127
|
-
if (!service.checkInstallation()) {
|
|
201
|
+
if (!this.installer.isInstalled(version)) {
|
|
128
202
|
Logger.warn(`Tomcat ${version} não está instalado`);
|
|
129
203
|
Logger.newline();
|
|
130
204
|
Logger.info("Opções", "");
|
|
131
|
-
Logger.log(` ${
|
|
132
|
-
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`);
|
|
133
207
|
return;
|
|
134
208
|
}
|
|
135
209
|
|
|
136
|
-
// Salva a versão no xavva.json do projeto
|
|
137
210
|
await this.saveTomcatVersion(version);
|
|
138
211
|
|
|
139
212
|
Logger.success(`Tomcat ${version} configurado para este projeto!`);
|
|
140
213
|
Logger.newline();
|
|
141
214
|
Logger.info("Próximos comandos", "");
|
|
142
|
-
Logger.log(` ${
|
|
143
|
-
Logger.log(` ${
|
|
215
|
+
Logger.log(` ${C.primary}•${C.reset} xavva dev # Iniciar desenvolvimento`);
|
|
216
|
+
Logger.log(` ${C.primary}•${C.reset} xavva deploy # Fazer deploy`);
|
|
144
217
|
}
|
|
145
218
|
|
|
146
219
|
private async saveTomcatVersion(version: string): Promise<void> {
|
|
@@ -163,47 +236,118 @@ export class TomcatCommand implements Command {
|
|
|
163
236
|
}
|
|
164
237
|
|
|
165
238
|
private async handleUninstall(config: AppConfig, args?: CLIArguments, extraArgs: string[] = []): Promise<void> {
|
|
166
|
-
|
|
167
|
-
const version = args?.["tomcat-version"] || extraArgs[0] || config.tomcat.version || "10.1.52";
|
|
239
|
+
const version = args?.["tomcat-version"] || extraArgs[0] || config.tomcat.version;
|
|
168
240
|
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
}
|
|
241
|
+
if (!version) {
|
|
242
|
+
Logger.error("Versão não especificada");
|
|
243
|
+
Logger.info("Uso", "xavva tomcat uninstall <version>");
|
|
244
|
+
return;
|
|
245
|
+
}
|
|
174
246
|
|
|
175
|
-
if (!
|
|
247
|
+
if (!this.installer.isInstalled(version)) {
|
|
176
248
|
Logger.warn(`Tomcat ${version} não está instalado`);
|
|
177
249
|
return;
|
|
178
250
|
}
|
|
179
251
|
|
|
180
252
|
Logger.step(`Removendo Tomcat ${version}...`);
|
|
181
|
-
await
|
|
182
|
-
Logger.success("Removido com sucesso!");
|
|
253
|
+
await this.installer.uninstall(version);
|
|
183
254
|
}
|
|
184
255
|
|
|
185
|
-
private async
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
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");
|
|
197
297
|
}
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
const
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
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");
|
|
207
351
|
}
|
|
208
352
|
}
|
|
209
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
|
|