@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
|
@@ -3,182 +3,182 @@ import type { AppConfig, CLIArguments } from "../types/config";
|
|
|
3
3
|
import type { DependencyAnalysisResult } from "../services/DependencyAnalyzerService";
|
|
4
4
|
import { DependencyAnalyzerService } from "../services/DependencyAnalyzerService";
|
|
5
5
|
import { AuditService } from "../services/AuditService";
|
|
6
|
-
import { Logger } from "../
|
|
6
|
+
import { Logger } from "../logging";
|
|
7
7
|
import { ProcessManager } from "../utils/processManager";
|
|
8
8
|
import fs from "fs";
|
|
9
|
+
import path from "path";
|
|
9
10
|
|
|
10
11
|
export class DepsCommand implements Command {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
12
|
+
private logger = Logger.getInstance();
|
|
13
|
+
private config!: AppConfig;
|
|
14
|
+
|
|
15
|
+
async execute(config: AppConfig, args?: CLIArguments): Promise<void> {
|
|
16
|
+
this.config = config;
|
|
17
|
+
const analyzer = new DependencyAnalyzerService(config.project);
|
|
18
|
+
analyzer.setVerbose(!!args?.verbose);
|
|
19
|
+
|
|
20
|
+
this.logger.section("Análise de Dependências");
|
|
21
|
+
this.logger.config("Ferramenta", config.project.buildTool.toUpperCase());
|
|
22
|
+
this.logger.config("Diretório", process.cwd());
|
|
23
|
+
|
|
24
|
+
const spinner = this.logger.spinner("Analisando dependências...");
|
|
25
|
+
|
|
26
|
+
try {
|
|
27
|
+
const result = await analyzer.analyze();
|
|
28
|
+
spinner.stop();
|
|
29
|
+
|
|
30
|
+
// Se não encontrou dependências, mostrar ajuda
|
|
31
|
+
if (result.dependencies.length === 0) {
|
|
32
|
+
this.logger.warn("Nenhuma dependência encontrada!");
|
|
33
|
+
this.logger.info("Possíveis causas:");
|
|
34
|
+
console.log(" • Projeto não foi compilado ainda (execute: mvn compile)");
|
|
35
|
+
console.log(" • Maven não está no PATH");
|
|
36
|
+
console.log(" • Arquivo pom.xml/build.gradle não encontrado");
|
|
37
|
+
console.log(" • Erro de parsing no arquivo de configuração");
|
|
38
|
+
this.logger.newline();
|
|
39
|
+
console.log(`Dica: Execute com --verbose para mais detalhes`);
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// Verificar vulnerabilidades se solicitado
|
|
44
|
+
if (args?.["scan"] !== false) {
|
|
45
|
+
this.logger.step("Verificando vulnerabilidades");
|
|
46
|
+
// Integração com AuditService para check de vulnerabilidades
|
|
47
|
+
// nas dependências do projeto
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// Exibir relatório
|
|
51
|
+
const report = analyzer.generateReport(result);
|
|
52
|
+
console.log(report);
|
|
53
|
+
|
|
54
|
+
// Ações adicionais baseadas em flags
|
|
55
|
+
if (args?.["update-safe"] || args?.["updateSafe"]) {
|
|
56
|
+
await this.performUpdateSafe(analyzer, result, config.project.buildTool);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
if (args?.["fix"]) {
|
|
60
|
+
await this.suggestFixes(result, config.project.buildTool);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// Exportar resultado se solicitado
|
|
64
|
+
if (args?.["output"]) {
|
|
65
|
+
this.exportReport(result, args["output"] as string);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// Sair com erro se houver conflitos críticos
|
|
69
|
+
const hasErrors = result.conflicts.some(c => c.severity === "error");
|
|
70
|
+
if (hasErrors && args?.["strict"]) {
|
|
71
|
+
await ProcessManager.getInstance().shutdown(1);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
} catch (error) {
|
|
75
|
+
spinner.stop(false);
|
|
76
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
77
|
+
this.logger.error(`Falha na análise: ${message}`);
|
|
78
|
+
throw error;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
private async suggestFixes(result: DependencyAnalysisResult, buildTool: string): Promise<void> {
|
|
83
|
+
if (result.conflicts.length === 0) {
|
|
84
|
+
this.logger.success("Nenhum conflito para resolver!");
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
this.logger.newline();
|
|
89
|
+
this.logger.section("Sugestões de Correção");
|
|
90
|
+
|
|
91
|
+
for (const conflict of result.conflicts) {
|
|
92
|
+
console.log(`\n${conflict.groupId}:${conflict.artifactId}`);
|
|
93
|
+
|
|
94
|
+
if (buildTool === "maven") {
|
|
95
|
+
console.log(" Adicione ao pom.xml:");
|
|
96
|
+
console.log(` <dependencyManagement>`);
|
|
97
|
+
console.log(` <dependencies>`);
|
|
98
|
+
console.log(` <dependency>`);
|
|
99
|
+
console.log(` <groupId>${conflict.groupId}</groupId>`);
|
|
100
|
+
console.log(` <artifactId>${conflict.artifactId}</artifactId>`);
|
|
101
|
+
console.log(` <version>${conflict.versions[conflict.versions.length - 1]}</version>`);
|
|
102
|
+
console.log(` </dependency>`);
|
|
103
|
+
console.log(` </dependencies>`);
|
|
104
|
+
console.log(` </dependencyManagement>`);
|
|
105
|
+
} else {
|
|
106
|
+
console.log(" Adicione ao build.gradle:");
|
|
107
|
+
console.log(` implementation("${conflict.groupId}:${conflict.artifactId}:${conflict.versions[conflict.versions.length - 1]}")`);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
private async performUpdateSafe(
|
|
113
|
+
analyzer: DependencyAnalyzerService,
|
|
114
|
+
result: DependencyAnalysisResult,
|
|
115
|
+
buildTool: string
|
|
116
|
+
): Promise<void> {
|
|
117
|
+
const safeUpdates = result.updates.filter(u => !u.isMajor);
|
|
118
|
+
|
|
119
|
+
if (safeUpdates.length === 0) {
|
|
120
|
+
this.logger.info("Nenhuma atualização segura disponível");
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
this.logger.newline();
|
|
125
|
+
this.logger.section("Atualizando Dependências (Safe Mode)");
|
|
126
|
+
this.logger.config("Atualizações a aplicar", String(safeUpdates.length));
|
|
127
|
+
|
|
128
|
+
const spinner = this.logger.spinner("Atualizando arquivos de configuração...");
|
|
129
|
+
|
|
130
|
+
try {
|
|
131
|
+
const updateResult = await analyzer.updateSafe(safeUpdates);
|
|
132
|
+
spinner.stop();
|
|
133
|
+
|
|
134
|
+
if (updateResult.updated > 0) {
|
|
135
|
+
this.logger.success(`${updateResult.updated} dependências atualizadas`);
|
|
136
|
+
this.logger.info(`Backup criado: ${buildTool === "maven" ? "pom.xml.backup" : "build.gradle.backup"}`);
|
|
137
|
+
|
|
138
|
+
// Listar o que foi atualizado
|
|
139
|
+
for (const update of safeUpdates.slice(0, 5)) {
|
|
140
|
+
console.log(` ↑ ${update.groupId}:${update.artifactId} ${update.currentVersion} → ${update.latestVersion}`);
|
|
141
|
+
}
|
|
142
|
+
if (safeUpdates.length > 5) {
|
|
143
|
+
console.log(` ... e mais ${safeUpdates.length - 5}`);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
this.logger.newline();
|
|
147
|
+
console.log(`! Execute 'xavva build' para compilar e aplicar as mudancas`);
|
|
148
|
+
console.log(`* Dica: Execute 'xavva audit' para verificar vulnerabilidades nas novas versoes`);
|
|
149
|
+
} else {
|
|
150
|
+
this.logger.warn("Nenhuma dependência foi atualizada");
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
if (updateResult.skipped > 0) {
|
|
154
|
+
this.logger.config("Dependências ignoradas", `${updateResult.skipped} (definidas via propriedades)`);
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
if (updateResult.errors.length > 0) {
|
|
158
|
+
for (const error of updateResult.errors) {
|
|
159
|
+
this.logger.warn(error);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
} catch (error) {
|
|
163
|
+
spinner.stop(false);
|
|
164
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
165
|
+
this.logger.error(`Falha na atualização: ${message}`);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
private exportReport(
|
|
170
|
+
result: DependencyAnalysisResult,
|
|
171
|
+
outputPath: string
|
|
172
|
+
): void {
|
|
173
|
+
const pkg = JSON.parse(fs.readFileSync(path.join(__dirname, "../../package.json"), "utf-8"));
|
|
174
|
+
const data = {
|
|
175
|
+
timestamp: new Date().toISOString(),
|
|
176
|
+
tool: "xavva",
|
|
177
|
+
version: pkg.version,
|
|
178
|
+
result
|
|
179
|
+
};
|
|
180
|
+
|
|
181
|
+
fs.writeFileSync(outputPath, JSON.stringify(data, null, 2));
|
|
182
|
+
this.logger.success(`Relatório exportado para: ${outputPath}`);
|
|
183
|
+
}
|
|
182
184
|
}
|
|
183
|
-
|
|
184
|
-
import path from "path";
|
|
@@ -6,12 +6,43 @@
|
|
|
6
6
|
import type { Command } from "./Command";
|
|
7
7
|
import type { AppConfig, CLIArguments } from "../types/config";
|
|
8
8
|
import { DockerService, type DockerConfig } from "../services/DockerService";
|
|
9
|
-
import { Logger } from "../utils/ui";
|
|
9
|
+
import { Logger, C } from "../utils/ui";
|
|
10
10
|
import { ProcessManager } from "../utils/processManager";
|
|
11
11
|
|
|
12
12
|
export class DockerCommand implements Command {
|
|
13
|
+
private showHelp(): void {
|
|
14
|
+
Logger.section("Docker Command");
|
|
15
|
+
Logger.log(`${C.bold}Usage:${C.reset} xavva docker <action> [options]`);
|
|
16
|
+
Logger.newline();
|
|
17
|
+
Logger.log(`${C.bold}Actions:${C.reset}`);
|
|
18
|
+
Logger.log(` ${C.primary}init${C.reset} Generate Dockerfile & docker-compose.yml`);
|
|
19
|
+
Logger.log(` ${C.primary}build${C.reset} Build Docker image`);
|
|
20
|
+
Logger.log(` ${C.primary}run${C.reset} Run development container`);
|
|
21
|
+
Logger.log(` ${C.primary}up${C.reset} Start with docker-compose`);
|
|
22
|
+
Logger.log(` ${C.primary}down${C.reset} Stop containers`);
|
|
23
|
+
Logger.log(` ${C.primary}status${C.reset} Show container status`);
|
|
24
|
+
Logger.newline();
|
|
25
|
+
Logger.log(`${C.bold}Options:${C.reset}`);
|
|
26
|
+
Logger.log(` --name <n> Image name`);
|
|
27
|
+
Logger.log(` --tag <t> Image tag`);
|
|
28
|
+
Logger.log(` --port <p> Port mapping`);
|
|
29
|
+
Logger.log(` -d, --detached Run in background`);
|
|
30
|
+
Logger.newline();
|
|
31
|
+
Logger.log(`${C.bold}Examples:${C.reset}`);
|
|
32
|
+
Logger.log(` xavva docker init`);
|
|
33
|
+
Logger.log(` xavva docker build --tag myapp:1.0`);
|
|
34
|
+
Logger.log(` xavva docker up -d`);
|
|
35
|
+
}
|
|
36
|
+
|
|
13
37
|
async execute(config: AppConfig, args?: CLIArguments, positionals?: string[]): Promise<void> {
|
|
14
38
|
const processManager = ProcessManager.getInstance();
|
|
39
|
+
|
|
40
|
+
// Mostra help se solicitado
|
|
41
|
+
if (args?.help) {
|
|
42
|
+
this.showHelp();
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
|
|
15
46
|
const action = positionals?.[1] || "status";
|
|
16
47
|
|
|
17
48
|
const service = new DockerService();
|
|
@@ -109,9 +140,9 @@ export class DockerCommand implements Command {
|
|
|
109
140
|
|
|
110
141
|
Logger.divider();
|
|
111
142
|
Logger.info("Next steps", "");
|
|
112
|
-
Logger.log(` ${
|
|
113
|
-
Logger.log(` ${
|
|
114
|
-
Logger.log(` ${
|
|
143
|
+
Logger.log(` ${C.gray}│${C.reset} ${C.primary}xavva docker build${C.reset} ${C.gray}- Build image${C.reset}`);
|
|
144
|
+
Logger.log(` ${C.gray}│${C.reset} ${C.primary}xavva docker up${C.reset} ${C.gray}- Start containers${C.reset}`);
|
|
145
|
+
Logger.log(` ${C.gray}│${C.reset} ${C.primary}xavva docker run${C.reset} ${C.gray}- Run dev mode${C.reset}`);
|
|
115
146
|
Logger.endSection();
|
|
116
147
|
}
|
|
117
148
|
|