@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,7 +1,7 @@
|
|
|
1
1
|
import type { Command } from "./Command";
|
|
2
2
|
import type { AppConfig, CLIArguments } from "../types/config";
|
|
3
3
|
import { EncodingService } from "../services/EncodingService";
|
|
4
|
-
import { Logger } from "../utils/ui";
|
|
4
|
+
import { Logger, C } from "../utils/ui";
|
|
5
5
|
import path from "path";
|
|
6
6
|
import { existsSync } from "fs";
|
|
7
7
|
import { ProcessManager } from "../utils/processManager";
|
|
@@ -16,6 +16,13 @@ export class EncodingCommand implements Command {
|
|
|
16
16
|
async execute(config: AppConfig, args?: CLIArguments, positionals?: string[]): Promise<void> {
|
|
17
17
|
const processManager = ProcessManager.getInstance();
|
|
18
18
|
|
|
19
|
+
// Mostra help se solicitado
|
|
20
|
+
if (args?.help) {
|
|
21
|
+
this.showHelp();
|
|
22
|
+
await processManager.shutdown(0);
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
|
|
19
26
|
// Parse subcomando
|
|
20
27
|
const subcommand = positionals?.[1] || "help";
|
|
21
28
|
const fileArg = positionals?.[2]; // Arquivo específico (opcional)
|
|
@@ -47,19 +54,19 @@ export class EncodingCommand implements Command {
|
|
|
47
54
|
Logger.log("Gerencia conversão de encoding de arquivos de texto");
|
|
48
55
|
Logger.newline();
|
|
49
56
|
|
|
50
|
-
Logger.log(`${
|
|
57
|
+
Logger.log(`${C.primary}Uso:${C.reset}`);
|
|
51
58
|
Logger.log(" xavva encoding <subcomando> [arquivo] [opções]");
|
|
52
59
|
Logger.newline();
|
|
53
60
|
|
|
54
|
-
Logger.log(`${
|
|
55
|
-
Logger.log(` ${
|
|
56
|
-
Logger.log(` ${
|
|
57
|
-
Logger.log(` ${
|
|
58
|
-
Logger.log(` ${
|
|
59
|
-
Logger.log(` ${
|
|
61
|
+
Logger.log(`${C.primary}Subcomandos:${C.reset}`);
|
|
62
|
+
Logger.log(` ${C.secondary}detect${C.reset} [arquivo] Detecta encoding de um arquivo ou diretório`);
|
|
63
|
+
Logger.log(` ${C.secondary}convert${C.reset} [arquivo] Converte arquivo(s) para outro encoding`);
|
|
64
|
+
Logger.log(` ${C.secondary}fix${C.reset} [arquivo] Tenta corrigir mojibake automaticamente`);
|
|
65
|
+
Logger.log(` ${C.secondary}list${C.reset} Lista encodings de todos os arquivos do projeto`);
|
|
66
|
+
Logger.log(` ${C.secondary}help${C.reset} Mostra esta ajuda`);
|
|
60
67
|
Logger.newline();
|
|
61
68
|
|
|
62
|
-
Logger.log(`${
|
|
69
|
+
Logger.log(`${C.primary}Opções:${C.reset}`);
|
|
63
70
|
Logger.log(` --from <encoding> Encoding de origem (padrão: auto-detect)`);
|
|
64
71
|
Logger.log(` --to <encoding> Encoding de destino (padrão: do xavva.json ou UTF-8)`);
|
|
65
72
|
Logger.log(` --backup Cria backup antes de converter`);
|
|
@@ -68,13 +75,13 @@ export class EncodingCommand implements Command {
|
|
|
68
75
|
Logger.log(` --src <path> Diretório fonte (padrão: src/)`);
|
|
69
76
|
Logger.newline();
|
|
70
77
|
|
|
71
|
-
Logger.log(`${
|
|
78
|
+
Logger.log(`${C.primary}Encodings suportados:${C.reset}`);
|
|
72
79
|
Logger.log(` utf-8, utf8 UTF-8 (padrão)`);
|
|
73
80
|
Logger.log(` windows-1252, cp1252 Windows CP1252 (ANSI)`);
|
|
74
81
|
Logger.log(` iso-8859-1, latin1 ISO-8859-1 (Latin-1)`);
|
|
75
82
|
Logger.newline();
|
|
76
83
|
|
|
77
|
-
Logger.log(`${
|
|
84
|
+
Logger.log(`${C.primary}Exemplos:${C.reset}`);
|
|
78
85
|
Logger.log(` xavva encoding detect src/main/java/MinhaClasse.java`);
|
|
79
86
|
Logger.log(` xavva encoding convert --from utf-8 --to cp1252 src/main/java/`);
|
|
80
87
|
Logger.log(` xavva encoding convert --to cp1252 --backup src/main/java/MinhaClasse.java`);
|
|
@@ -128,13 +135,13 @@ export class EncodingCommand implements Command {
|
|
|
128
135
|
Logger.info("Arquivos analisados", String(detections.size));
|
|
129
136
|
Logger.newline();
|
|
130
137
|
|
|
131
|
-
Logger.log(`${
|
|
138
|
+
Logger.log(`${C.primary}Distribuição por encoding:${C.reset}`);
|
|
132
139
|
for (const [encoding, count] of byEncoding) {
|
|
133
140
|
Logger.config(encoding, `${count} arquivo(s)`);
|
|
134
141
|
}
|
|
135
142
|
|
|
136
143
|
Logger.newline();
|
|
137
|
-
Logger.log(`${
|
|
144
|
+
Logger.log(`${C.primary}Arquivos com baixa confiança:${C.reset}`);
|
|
138
145
|
let lowConfidenceFound = false;
|
|
139
146
|
for (const [file, detection] of detections) {
|
|
140
147
|
if (detection.confidence < 0.8) {
|
|
@@ -332,18 +339,18 @@ export class EncodingCommand implements Command {
|
|
|
332
339
|
// Ordena arquivos
|
|
333
340
|
const sortedFiles = Array.from(detections.entries()).sort((a, b) => a[0].localeCompare(b[0]));
|
|
334
341
|
|
|
335
|
-
Logger.log(`${
|
|
342
|
+
Logger.log(`${C.primary}Arquivos:${C.reset}`);
|
|
336
343
|
for (const [file, detection] of sortedFiles) {
|
|
337
344
|
const relativePath = path.relative(srcDir, file);
|
|
338
345
|
const confidenceStr = detection.confidence >= 0.9 ? "" :
|
|
339
|
-
` ${
|
|
340
|
-
const bomStr = detection.hasBOM ? ` ${
|
|
346
|
+
` ${C.gray}(${Math.round(detection.confidence * 100)}%)${C.reset}`;
|
|
347
|
+
const bomStr = detection.hasBOM ? ` ${C.warning}[BOM]${C.reset}` : "";
|
|
341
348
|
|
|
342
349
|
const encodingColor = detection.encoding === (config.project.encoding || "utf-8")
|
|
343
|
-
?
|
|
344
|
-
:
|
|
350
|
+
? C.success
|
|
351
|
+
: C.warning;
|
|
345
352
|
|
|
346
|
-
Logger.log(` ${encodingColor}${detection.encoding.padEnd(12)}${
|
|
353
|
+
Logger.log(` ${encodingColor}${detection.encoding.padEnd(12)}${C.reset} ${relativePath}${confidenceStr}${bomStr}`);
|
|
347
354
|
}
|
|
348
355
|
|
|
349
356
|
Logger.endSection();
|
|
@@ -4,7 +4,7 @@ import { platform, totalmem, freemem, arch } from "os";
|
|
|
4
4
|
import { existsSync } from "fs";
|
|
5
5
|
import type { Command } from "./Command";
|
|
6
6
|
import type { AppConfig, CLIArguments } from "../types/config";
|
|
7
|
-
import { Logger } from "../utils/ui";
|
|
7
|
+
import { Logger, C } from "../utils/ui";
|
|
8
8
|
|
|
9
9
|
const execAsync = promisify(exec);
|
|
10
10
|
|
|
@@ -50,16 +50,16 @@ export class HealthCommand implements Command {
|
|
|
50
50
|
|
|
51
51
|
for (const check of checks) {
|
|
52
52
|
const icon = check.status === "ok"
|
|
53
|
-
? `${
|
|
53
|
+
? `${C.success}✓${C.reset}`
|
|
54
54
|
: check.status === "warning"
|
|
55
|
-
? `${
|
|
56
|
-
: `${
|
|
55
|
+
? `${C.warning}⚠${C.reset}`
|
|
56
|
+
: `${C.error}✗${C.reset}`;
|
|
57
57
|
|
|
58
|
-
Logger.log(`${
|
|
59
|
-
Logger.log(`${
|
|
58
|
+
Logger.log(`${C.gray}│${C.reset} ${icon} ${C.bold}${check.name}${C.reset}`);
|
|
59
|
+
Logger.log(`${C.gray}│${C.reset} ${check.message}`);
|
|
60
60
|
|
|
61
61
|
if (check.details) {
|
|
62
|
-
Logger.log(`${
|
|
62
|
+
Logger.log(`${C.gray}│${C.reset} ${C.dim}${check.details}${C.reset}`);
|
|
63
63
|
}
|
|
64
64
|
|
|
65
65
|
if (check.status === "error") errors++;
|
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
import type { Command } from "./Command";
|
|
2
2
|
import type { AppConfig, CLIArguments } from "../types/config";
|
|
3
3
|
import pkg from "../../package.json";
|
|
4
|
+
import { Logger } from "../logging";
|
|
4
5
|
|
|
5
6
|
export class HelpCommand implements Command {
|
|
7
|
+
private logger = Logger.getInstance();
|
|
8
|
+
|
|
6
9
|
async execute(_config: AppConfig, _args?: CLIArguments): Promise<void> {
|
|
7
10
|
const v = pkg.version;
|
|
8
11
|
const c = this.c;
|
|
@@ -18,6 +21,7 @@ export class HelpCommand implements Command {
|
|
|
18
21
|
${c("green", "deploy")} Build and deploy to Tomcat
|
|
19
22
|
${c("green", "build")} Compile project
|
|
20
23
|
${c("green", "start")} Start Tomcat server
|
|
24
|
+
${c("green", "clean")} Clean cache, build, and logs
|
|
21
25
|
${c("green", "run")} Run a Java class
|
|
22
26
|
${c("green", "logs")} Stream Tomcat logs
|
|
23
27
|
|
|
@@ -37,27 +41,42 @@ export class HelpCommand implements Command {
|
|
|
37
41
|
${c("magenta", "redo")} Repeat last command
|
|
38
42
|
${c("magenta", "completion")} Shell completions
|
|
39
43
|
|
|
40
|
-
${c("yellow", "
|
|
41
|
-
${c("brightMagenta", "test")} Run JUnit/TestNG tests
|
|
42
|
-
${c("brightMagenta", "db")} Database migrations
|
|
44
|
+
${c("yellow", "TESTING & DB")}
|
|
45
|
+
${c("brightMagenta", "test")} Run JUnit/TestNG tests
|
|
46
|
+
${c("brightMagenta", "db")} Database migrations
|
|
43
47
|
${c("brightMagenta", "http")} HTTP client for API testing
|
|
44
48
|
${c("brightMagenta", "docker")} Docker integration
|
|
45
49
|
|
|
50
|
+
${c("yellow", "ADVANCED")}
|
|
51
|
+
${c("blue", "ide")} Generate IDE config (vscode|idea|eclipse)
|
|
52
|
+
${c("blue", "docs")} Generate API documentation
|
|
53
|
+
${c("blue", "changelog")} Generate changelog from git
|
|
54
|
+
|
|
46
55
|
${c("yellow", "GLOBAL OPTIONS")}
|
|
47
|
-
-p, --path <path> Tomcat path
|
|
48
|
-
-t, --tool <tool> maven|gradle
|
|
49
|
-
-n, --name <name> App name
|
|
50
|
-
-w, --watch Watch mode
|
|
51
|
-
-d, --debug JPDA debugger
|
|
52
|
-
-W, --war Build .war
|
|
53
|
-
|
|
56
|
+
-p, --path <path> Tomcat path --port <n> Port (8080)
|
|
57
|
+
-t, --tool <tool> maven|gradle -P, --profile <p> Build profile
|
|
58
|
+
-n, --name <name> App name -e, --encoding <enc> UTF-8|cp1252
|
|
59
|
+
-w, --watch Watch mode --tui Dashboard mode
|
|
60
|
+
-d, --debug JPDA debugger -c, --clean Clean build
|
|
61
|
+
-W, --war Build .war --cache Use build cache
|
|
62
|
+
--env <name> Environment -y, --yes Auto-install
|
|
63
|
+
--profile Show performance --dry-run Simulate only
|
|
64
|
+
-V, --verbose Detailed output -h, --help Show help
|
|
65
|
+
-v, --version Show version
|
|
54
66
|
|
|
55
67
|
${c("yellow", "EXAMPLES")}
|
|
56
|
-
xavva dev --tui --watch
|
|
57
|
-
xavva deploy --war --port 8081
|
|
58
|
-
xavva
|
|
59
|
-
xavva
|
|
68
|
+
xavva dev --tui --watch # Dev mode with dashboard
|
|
69
|
+
xavva deploy --war --port 8081 # Build WAR for port 8081
|
|
70
|
+
xavva clean # Clean cache and build
|
|
71
|
+
xavva test --watch --coverage # Test with coverage
|
|
72
|
+
xavva doctor --fix # Auto-fix issues
|
|
73
|
+
xavva ide --ide vscode # Generate VS Code config
|
|
74
|
+
xavva deps --update-safe # Update dependencies
|
|
75
|
+
xavva deploy --dry-run # Simulate deployment
|
|
76
|
+
xavva build --profile # Show performance profile
|
|
60
77
|
xavva docker init && xavva docker up # Docker setup
|
|
78
|
+
xavva tomcat install 10.1.52 --mirror auto # Install with best mirror
|
|
79
|
+
xavva tomcat cache stats # Show download cache stats
|
|
61
80
|
|
|
62
81
|
${c("gray", "Run 'xavva <command> --help' for detailed options")}
|
|
63
82
|
${c("gray", "Docs: github.com/leorsousa05/Xavva")}
|
|
@@ -74,6 +93,7 @@ export class HelpCommand implements Command {
|
|
|
74
93
|
green: "\x1b[32m",
|
|
75
94
|
yellow: "\x1b[33m",
|
|
76
95
|
blue: "\x1b[34m",
|
|
96
|
+
magenta: "\x1b[35m",
|
|
77
97
|
cyan: "\x1b[36m",
|
|
78
98
|
brightMagenta: "\x1b[95m",
|
|
79
99
|
};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { Command } from "./Command";
|
|
2
2
|
import type { AppConfig, CLIArguments } from "../types/config";
|
|
3
3
|
import { HistoryService } from "../services/HistoryService";
|
|
4
|
-
import { Logger } from "../utils/ui";
|
|
4
|
+
import { Logger, C } from "../utils/ui";
|
|
5
5
|
|
|
6
6
|
export class HistoryCommand implements Command {
|
|
7
7
|
private historyService = new HistoryService();
|
|
@@ -33,13 +33,13 @@ export class HistoryCommand implements Command {
|
|
|
33
33
|
const date = new Date(entry.timestamp);
|
|
34
34
|
const time = date.toLocaleTimeString("pt-BR", { hour: "2-digit", minute: "2-digit" });
|
|
35
35
|
const icon = entry.success
|
|
36
|
-
? `${
|
|
37
|
-
: `${
|
|
36
|
+
? `${C.success}✓${C.reset}`
|
|
37
|
+
: `${C.error}✗${C.reset}`;
|
|
38
38
|
|
|
39
39
|
const args = entry.args.length > 0 ? entry.args.join(" ") : "";
|
|
40
|
-
const duration = entry.duration ? `${
|
|
40
|
+
const duration = entry.duration ? `${C.gray}(${entry.duration.toFixed(1)}s)${C.reset}` : "";
|
|
41
41
|
|
|
42
|
-
Logger.log(`${
|
|
42
|
+
Logger.log(`${C.gray}│${C.reset} ${C.dim}${time}${C.reset} ${icon} ${C.white}xavva ${entry.command}${C.reset} ${C.gray}${args}${C.reset} ${duration}`);
|
|
43
43
|
}
|
|
44
44
|
|
|
45
45
|
Logger.endSection();
|
|
@@ -8,14 +8,40 @@ import type { Command } from "./Command";
|
|
|
8
8
|
import type { AppConfig, CLIArguments } from "../types/config";
|
|
9
9
|
import { HttpService, type HttpRequest } from "../services/HttpService";
|
|
10
10
|
import { EndpointService } from "../services/EndpointService";
|
|
11
|
-
import { Logger } from "../utils/ui";
|
|
11
|
+
import { Logger, C } from "../utils/ui";
|
|
12
12
|
import { ProcessManager } from "../utils/processManager";
|
|
13
13
|
import fs from "fs";
|
|
14
14
|
import path from "path";
|
|
15
15
|
|
|
16
16
|
export class HttpCommand implements Command {
|
|
17
|
+
private showHelp(): void {
|
|
18
|
+
Logger.section("HTTP Client");
|
|
19
|
+
Logger.log(`${C.bold}Usage:${C.reset} xavva http <method> <path> [options]`);
|
|
20
|
+
Logger.log(`${C.bold} or:${C.reset} xavva http --interactive`);
|
|
21
|
+
Logger.newline();
|
|
22
|
+
Logger.log(`${C.bold}Methods:${C.reset} GET, POST, PUT, DELETE, PATCH`);
|
|
23
|
+
Logger.newline();
|
|
24
|
+
Logger.log(`${C.bold}Options:${C.reset}`);
|
|
25
|
+
Logger.log(` --body <data> Request body (JSON)`);
|
|
26
|
+
Logger.log(` --param <k=v> Query parameter (can use multiple)`);
|
|
27
|
+
Logger.log(` --header <h> Custom header`);
|
|
28
|
+
Logger.log(` --base-url <url> Override base URL`);
|
|
29
|
+
Logger.log(` -i, --interactive Interactive mode`);
|
|
30
|
+
Logger.newline();
|
|
31
|
+
Logger.log(`${C.bold}Examples:${C.reset}`);
|
|
32
|
+
Logger.log(` xavva http GET /api/users`);
|
|
33
|
+
Logger.log(` xavva http POST /api/users --body '{"name":"John"}'`);
|
|
34
|
+
Logger.log(` xavva http GET /api/users --param page=1 --param size=10`);
|
|
35
|
+
}
|
|
36
|
+
|
|
17
37
|
async execute(config: AppConfig, args?: CLIArguments, positionals?: string[]): Promise<void> {
|
|
18
38
|
const processManager = ProcessManager.getInstance();
|
|
39
|
+
|
|
40
|
+
// Mostra help se solicitado
|
|
41
|
+
if (args?.help) {
|
|
42
|
+
this.showHelp();
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
19
45
|
|
|
20
46
|
// Modo interativo
|
|
21
47
|
if (args?.interactive || positionals?.length === 1) {
|
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Comando IDE - Gera configurações para editores
|
|
3
|
+
*
|
|
4
|
+
* Suporta:
|
|
5
|
+
* - VS Code (.vscode/)
|
|
6
|
+
* - IntelliJ IDEA (.idea/)
|
|
7
|
+
* - Eclipse (.settings/)
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { mkdir, writeFile } from "fs/promises";
|
|
11
|
+
import { existsSync } from "fs";
|
|
12
|
+
import path from "path";
|
|
13
|
+
import type { Command } from "./Command";
|
|
14
|
+
import type { AppConfig, CLIArguments } from "../types/config";
|
|
15
|
+
import { Logger } from "../logging";
|
|
16
|
+
|
|
17
|
+
interface IdeConfig {
|
|
18
|
+
name: string;
|
|
19
|
+
files: Array<{
|
|
20
|
+
path: string;
|
|
21
|
+
content: string;
|
|
22
|
+
}>;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export class IdeCommand implements Command {
|
|
26
|
+
private logger = Logger.getInstance();
|
|
27
|
+
|
|
28
|
+
async execute(config: AppConfig, args: CLIArguments): Promise<void> {
|
|
29
|
+
const ide = (args as any).ide as 'vscode' | 'idea' | 'eclipse' | undefined;
|
|
30
|
+
|
|
31
|
+
if (!ide) {
|
|
32
|
+
this.logger.error("Especifique a IDE: --ide vscode|idea|eclipse");
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
this.logger.section(`Gerando configuração para ${ide.toUpperCase()}`);
|
|
37
|
+
|
|
38
|
+
switch (ide) {
|
|
39
|
+
case 'vscode':
|
|
40
|
+
await this.generateVSCode(config);
|
|
41
|
+
break;
|
|
42
|
+
case 'idea':
|
|
43
|
+
await this.generateIdea(config);
|
|
44
|
+
break;
|
|
45
|
+
case 'eclipse':
|
|
46
|
+
await this.generateEclipse(config);
|
|
47
|
+
break;
|
|
48
|
+
default:
|
|
49
|
+
this.logger.error(`IDE não suportada: ${ide}`);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
private async generateVSCode(config: AppConfig): Promise<void> {
|
|
54
|
+
const vscodeDir = path.join(process.cwd(), ".vscode");
|
|
55
|
+
|
|
56
|
+
// launch.json - Configuração de debug
|
|
57
|
+
const launchConfig = {
|
|
58
|
+
version: "0.2.0",
|
|
59
|
+
configurations: [
|
|
60
|
+
{
|
|
61
|
+
type: "java",
|
|
62
|
+
name: "Debug (Attach) - Xavva",
|
|
63
|
+
request: "attach",
|
|
64
|
+
hostName: "localhost",
|
|
65
|
+
port: config.project.debugPort,
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
type: "java",
|
|
69
|
+
name: "Debug (Launch) - Current File",
|
|
70
|
+
request: "launch",
|
|
71
|
+
mainClass: "${file}",
|
|
72
|
+
},
|
|
73
|
+
],
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
// tasks.json - Tarefas de build
|
|
77
|
+
const tasksConfig = {
|
|
78
|
+
version: "2.0.0",
|
|
79
|
+
tasks: [
|
|
80
|
+
{
|
|
81
|
+
label: "xavva: build",
|
|
82
|
+
type: "shell",
|
|
83
|
+
command: "xavva build",
|
|
84
|
+
group: "build",
|
|
85
|
+
problemMatcher: ["$javac"],
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
label: "xavva: deploy",
|
|
89
|
+
type: "shell",
|
|
90
|
+
command: "xavva deploy",
|
|
91
|
+
group: "build",
|
|
92
|
+
problemMatcher: ["$javac"],
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
label: "xavva: dev",
|
|
96
|
+
type: "shell",
|
|
97
|
+
command: "xavva dev",
|
|
98
|
+
group: "build",
|
|
99
|
+
isBackground: true,
|
|
100
|
+
problemMatcher: {
|
|
101
|
+
pattern: {
|
|
102
|
+
regexp: ".",
|
|
103
|
+
},
|
|
104
|
+
background: {
|
|
105
|
+
activeOnStart: true,
|
|
106
|
+
beginsPattern: ".",
|
|
107
|
+
endsPattern: ".",
|
|
108
|
+
},
|
|
109
|
+
},
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
label: "xavva: test",
|
|
113
|
+
type: "shell",
|
|
114
|
+
command: "xavva test",
|
|
115
|
+
group: "test",
|
|
116
|
+
},
|
|
117
|
+
],
|
|
118
|
+
};
|
|
119
|
+
|
|
120
|
+
// settings.json - Configurações do workspace
|
|
121
|
+
const settingsConfig = {
|
|
122
|
+
"java.configuration.updateBuildConfiguration": "automatic",
|
|
123
|
+
"java.compile.nullAnalysis.mode": "automatic",
|
|
124
|
+
"editor.formatOnSave": true,
|
|
125
|
+
"files.exclude": {
|
|
126
|
+
"**/target": true,
|
|
127
|
+
"**/build": true,
|
|
128
|
+
"**/.xavva": true,
|
|
129
|
+
"**/.gradle": true,
|
|
130
|
+
},
|
|
131
|
+
};
|
|
132
|
+
|
|
133
|
+
// extensions.json - Recomendações
|
|
134
|
+
const extensionsConfig = {
|
|
135
|
+
recommendations: [
|
|
136
|
+
"vscjava.vscode-java-pack",
|
|
137
|
+
"vscjava.vscode-java-debug",
|
|
138
|
+
"vscjava.vscode-maven",
|
|
139
|
+
"redhat.vscode-xml",
|
|
140
|
+
],
|
|
141
|
+
};
|
|
142
|
+
|
|
143
|
+
await mkdir(vscodeDir, { recursive: true });
|
|
144
|
+
|
|
145
|
+
await writeFile(
|
|
146
|
+
path.join(vscodeDir, "launch.json"),
|
|
147
|
+
JSON.stringify(launchConfig, null, 4)
|
|
148
|
+
);
|
|
149
|
+
await writeFile(
|
|
150
|
+
path.join(vscodeDir, "tasks.json"),
|
|
151
|
+
JSON.stringify(tasksConfig, null, 4)
|
|
152
|
+
);
|
|
153
|
+
await writeFile(
|
|
154
|
+
path.join(vscodeDir, "settings.json"),
|
|
155
|
+
JSON.stringify(settingsConfig, null, 4)
|
|
156
|
+
);
|
|
157
|
+
await writeFile(
|
|
158
|
+
path.join(vscodeDir, "extensions.json"),
|
|
159
|
+
JSON.stringify(extensionsConfig, null, 4)
|
|
160
|
+
);
|
|
161
|
+
|
|
162
|
+
this.logger.success("Configuração VS Code gerada!");
|
|
163
|
+
this.logger.info("Arquivos criados:");
|
|
164
|
+
this.logger.info(" • .vscode/launch.json - Configuração de debug");
|
|
165
|
+
this.logger.info(" • .vscode/tasks.json - Tarefas de build");
|
|
166
|
+
this.logger.info(" • .vscode/settings.json - Configurações do workspace");
|
|
167
|
+
this.logger.info(" • .vscode/extensions.json - Extensões recomendadas");
|
|
168
|
+
this.logger.newline();
|
|
169
|
+
this.logger.info("💡 Instale as extensões recomendadas para melhor experiência");
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
private async generateIdea(config: AppConfig): Promise<void> {
|
|
173
|
+
const ideaDir = path.join(process.cwd(), ".idea");
|
|
174
|
+
const runConfigsDir = path.join(ideaDir, "runConfigurations");
|
|
175
|
+
|
|
176
|
+
// runConfigurations/Xavva_Deploy.xml
|
|
177
|
+
const deployConfig = `<component name="ProjectRunConfigurationManager">
|
|
178
|
+
<configuration default="false" name="Xavva - Deploy" type="ShConfigurationType">
|
|
179
|
+
<option name="SCRIPT_TEXT" value="xavva deploy" />
|
|
180
|
+
<option name="INDEPENDENT_SCRIPT_PATH" value="true" />
|
|
181
|
+
<option name="SCRIPT_PATH" value="" />
|
|
182
|
+
<option name="SCRIPT_OPTIONS" value="" />
|
|
183
|
+
<option name="INDEPENDENT_SCRIPT_WORKING_DIRECTORY" value="true" />
|
|
184
|
+
<option name="SCRIPT_WORKING_DIRECTORY" value="$PROJECT_DIR$" />
|
|
185
|
+
<option name="INDEPENDENT_INTERPRETER_PATH" value="true" />
|
|
186
|
+
<option name="INTERPRETER_PATH" value="" />
|
|
187
|
+
<option name="INTERPRETER_OPTIONS" value="" />
|
|
188
|
+
<option name="EXECUTE_IN_TERMINAL" value="true" />
|
|
189
|
+
<option name="EXECUTE_SCRIPT_FILE" value="false" />
|
|
190
|
+
<envs />
|
|
191
|
+
<method v="2" />
|
|
192
|
+
</configuration>
|
|
193
|
+
</component>`;
|
|
194
|
+
|
|
195
|
+
// runConfigurations/Xavva_Dev.xml
|
|
196
|
+
const devConfig = `<component name="ProjectRunConfigurationManager">
|
|
197
|
+
<configuration default="false" name="Xavva - Dev Mode" type="ShConfigurationType">
|
|
198
|
+
<option name="SCRIPT_TEXT" value="xavva dev" />
|
|
199
|
+
<option name="INDEPENDENT_SCRIPT_PATH" value="true" />
|
|
200
|
+
<option name="SCRIPT_PATH" value="" />
|
|
201
|
+
<option name="SCRIPT_OPTIONS" value="" />
|
|
202
|
+
<option name="INDEPENDENT_SCRIPT_WORKING_DIRECTORY" value="true" />
|
|
203
|
+
<option name="SCRIPT_WORKING_DIRECTORY" value="$PROJECT_DIR$" />
|
|
204
|
+
<option name="INDEPENDENT_INTERPRETER_PATH" value="true" />
|
|
205
|
+
<option name="INTERPRETER_PATH" value="" />
|
|
206
|
+
<option name="INTERPRETER_OPTIONS" value="" />
|
|
207
|
+
<option name="EXECUTE_IN_TERMINAL" value="true" />
|
|
208
|
+
<option name="EXECUTE_SCRIPT_FILE" value="false" />
|
|
209
|
+
<envs />
|
|
210
|
+
<method v="2" />
|
|
211
|
+
</configuration>
|
|
212
|
+
</component>`;
|
|
213
|
+
|
|
214
|
+
// External Tools - xavva.xml
|
|
215
|
+
const externalTools = `<toolSet name="Xavva">
|
|
216
|
+
<tool name="Build" showInMainMenu="false" showInEditor="false" showInProject="false" disabled="false" useConsole="true" showConsoleOnStdOut="false" showConsoleOnStdErr="false" synchronizeAfterRun="true">
|
|
217
|
+
<exec>
|
|
218
|
+
<option name="COMMAND" value="xavva" />
|
|
219
|
+
<option name="PARAMETERS" value="build" />
|
|
220
|
+
<option name="WORKING_DIRECTORY" value="$ProjectFileDir$" />
|
|
221
|
+
</exec>
|
|
222
|
+
</tool>
|
|
223
|
+
<tool name="Deploy" showInMainMenu="false" showInEditor="false" showInProject="false" disabled="false" useConsole="true" showConsoleOnStdOut="false" showConsoleOnStdErr="false" synchronizeAfterRun="true">
|
|
224
|
+
<exec>
|
|
225
|
+
<option name="COMMAND" value="xavva" />
|
|
226
|
+
<option name="PARAMETERS" value="deploy" />
|
|
227
|
+
<option name="WORKING_DIRECTORY" value="$ProjectFileDir$" />
|
|
228
|
+
</exec>
|
|
229
|
+
</tool>
|
|
230
|
+
</toolSet>`;
|
|
231
|
+
|
|
232
|
+
await mkdir(runConfigsDir, { recursive: true });
|
|
233
|
+
await mkdir(path.join(ideaDir, "externalTools"), { recursive: true });
|
|
234
|
+
|
|
235
|
+
await writeFile(path.join(runConfigsDir, "Xavva_Deploy.xml"), deployConfig);
|
|
236
|
+
await writeFile(path.join(runConfigsDir, "Xavva_Dev.xml"), devConfig);
|
|
237
|
+
await writeFile(
|
|
238
|
+
path.join(ideaDir, "externalTools", "xavva.xml"),
|
|
239
|
+
externalTools
|
|
240
|
+
);
|
|
241
|
+
|
|
242
|
+
this.logger.success("Configuração IntelliJ IDEA gerada!");
|
|
243
|
+
this.logger.info("Arquivos criados:");
|
|
244
|
+
this.logger.info(" • .idea/runConfigurations/Xavva_Deploy.xml");
|
|
245
|
+
this.logger.info(" • .idea/runConfigurations/Xavva_Dev.xml");
|
|
246
|
+
this.logger.info(" • .idea/externalTools/xavva.xml");
|
|
247
|
+
this.logger.newline();
|
|
248
|
+
this.logger.info("💡 Reinicie o IntelliJ para carregar as configurações");
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
private async generateEclipse(config: AppConfig): Promise<void> {
|
|
252
|
+
const settingsDir = path.join(process.cwd(), ".settings");
|
|
253
|
+
|
|
254
|
+
// External tool builders
|
|
255
|
+
const builderConfig = `<?xml version="1.0" encoding="UTF-8"?>
|
|
256
|
+
<projectDescription>
|
|
257
|
+
<name>${config.project.appName || "project"}</name>
|
|
258
|
+
<comment></comment>
|
|
259
|
+
<projects>
|
|
260
|
+
</projects>
|
|
261
|
+
<buildSpec>
|
|
262
|
+
<buildCommand>
|
|
263
|
+
<name>org.eclipse.jdt.core.javabuilder</name>
|
|
264
|
+
<arguments>
|
|
265
|
+
</arguments>
|
|
266
|
+
</buildCommand>
|
|
267
|
+
<buildCommand>
|
|
268
|
+
<name>org.eclipse.ui.externaltools.ExternalToolBuilder</name>
|
|
269
|
+
<triggers>full,incremental,</triggers>
|
|
270
|
+
<arguments>
|
|
271
|
+
<dictionary>
|
|
272
|
+
<key>LaunchConfigHandle</key>
|
|
273
|
+
<value><project>/.externalToolBuilders/Xavva Deploy.launch</value>
|
|
274
|
+
</dictionary>
|
|
275
|
+
</arguments>
|
|
276
|
+
</buildCommand>
|
|
277
|
+
</buildSpec>
|
|
278
|
+
<natures>
|
|
279
|
+
<nature>org.eclipse.jdt.core.javanature</nature>
|
|
280
|
+
</natures>
|
|
281
|
+
</projectDescription>`;
|
|
282
|
+
|
|
283
|
+
// External tool launcher
|
|
284
|
+
const launcherConfig = '<?xml version="1.0" encoding="UTF-8" standalone="no"?>\n' +
|
|
285
|
+
'<launchConfiguration type="org.eclipse.ui.externaltools.ProgramBuilderLaunchConfigurationType">\n' +
|
|
286
|
+
' <booleanAttribute key="org.eclipse.debug.ui.ATTR_LAUNCH_IN_BACKGROUND" value="false"/>\n' +
|
|
287
|
+
' <stringAttribute key="org.eclipse.ui.externaltools.ATTR_LOCATION" value="xavva"/>\n' +
|
|
288
|
+
' <stringAttribute key="org.eclipse.ui.externaltools.ATTR_TOOL_ARGUMENTS" value="deploy"/>\n' +
|
|
289
|
+
' <booleanAttribute key="org.eclipse.ui.externaltools.ATTR_TRIGGERS_CONFIGURED" value="true"/>\n' +
|
|
290
|
+
' <stringAttribute key="org.eclipse.ui.externaltools.ATTR_WORKING_DIRECTORY" value="${workspace_loc:/${project_name}}"/>\n' +
|
|
291
|
+
'</launchConfiguration>';
|
|
292
|
+
|
|
293
|
+
const externalToolsDir = path.join(process.cwd(), ".externalToolBuilders");
|
|
294
|
+
await mkdir(externalToolsDir, { recursive: true });
|
|
295
|
+
await mkdir(settingsDir, { recursive: true });
|
|
296
|
+
|
|
297
|
+
await writeFile(
|
|
298
|
+
path.join(process.cwd(), ".project"),
|
|
299
|
+
builderConfig
|
|
300
|
+
);
|
|
301
|
+
await writeFile(
|
|
302
|
+
path.join(externalToolsDir, "Xavva Deploy.launch"),
|
|
303
|
+
launcherConfig
|
|
304
|
+
);
|
|
305
|
+
|
|
306
|
+
this.logger.success("Configuração Eclipse gerada!");
|
|
307
|
+
this.logger.info("Arquivos criados:");
|
|
308
|
+
this.logger.info(" • .project");
|
|
309
|
+
this.logger.info(" • .externalToolBuilders/Xavva Deploy.launch");
|
|
310
|
+
this.logger.newline();
|
|
311
|
+
this.logger.info("💡 Importe o projeto como 'Existing Projects into Workspace'");
|
|
312
|
+
}
|
|
313
|
+
}
|