@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.
Files changed (80) hide show
  1. package/README.md +221 -12
  2. package/package.json +3 -2
  3. package/src/commands/AuditCommand.ts +12 -10
  4. package/src/commands/BuildCommand.ts +9 -7
  5. package/src/commands/ChangelogCommand.ts +5 -5
  6. package/src/commands/CleanCommand.ts +242 -0
  7. package/src/commands/CompletionCommand.ts +7 -7
  8. package/src/commands/DbCommand.ts +43 -14
  9. package/src/commands/DeployCommand.ts +252 -229
  10. package/src/commands/DepsCommand.ts +174 -174
  11. package/src/commands/DockerCommand.ts +35 -4
  12. package/src/commands/DoctorCommand.ts +252 -239
  13. package/src/commands/EncodingCommand.ts +26 -19
  14. package/src/commands/HealthCommand.ts +7 -7
  15. package/src/commands/HelpCommand.ts +34 -14
  16. package/src/commands/HistoryCommand.ts +5 -5
  17. package/src/commands/HttpCommand.ts +27 -1
  18. package/src/commands/IdeCommand.ts +313 -0
  19. package/src/commands/InitCommand.ts +26 -25
  20. package/src/commands/LogsCommand.ts +8 -6
  21. package/src/commands/ProfilesCommand.ts +6 -6
  22. package/src/commands/RedoCommand.ts +2 -2
  23. package/src/commands/RunCommand.ts +64 -24
  24. package/src/commands/StartCommand.ts +9 -7
  25. package/src/commands/TestCommand.ts +25 -1
  26. package/src/commands/TomcatCommand.ts +232 -88
  27. package/src/config/versions.ts +111 -9
  28. package/src/di/container.ts +239 -105
  29. package/src/errors/ErrorHandler.ts +23 -19
  30. package/src/errors/errorMessages.ts +235 -0
  31. package/src/index.ts +20 -6
  32. package/src/logging/FileLogger.ts +235 -0
  33. package/src/logging/Logger.ts +545 -0
  34. package/src/logging/OperationLogger.ts +296 -0
  35. package/src/logging/ProgressLogger.ts +187 -0
  36. package/src/logging/TableLogger.ts +246 -0
  37. package/src/logging/colors.ts +167 -0
  38. package/src/logging/constants.ts +176 -0
  39. package/src/logging/formatters.ts +337 -0
  40. package/src/logging/index.ts +93 -0
  41. package/src/logging/types.ts +64 -0
  42. package/src/plugins/PluginManager.ts +325 -0
  43. package/src/plugins/types.ts +82 -0
  44. package/src/services/AuditService.ts +5 -3
  45. package/src/services/BuildService.ts +15 -17
  46. package/src/services/DashboardService.ts +14 -3
  47. package/src/services/DbService.ts +35 -34
  48. package/src/services/DependencyAnalyzerService.ts +18 -18
  49. package/src/services/DependencyCacheService.ts +303 -0
  50. package/src/services/DeployWatcher.ts +127 -23
  51. package/src/services/DockerService.ts +3 -3
  52. package/src/services/EmbeddedTomcatService.ts +13 -12
  53. package/src/services/FileWatcher.ts +15 -7
  54. package/src/services/HttpService.ts +5 -5
  55. package/src/services/LogAnalyzer.ts +26 -22
  56. package/src/services/PerformanceProfiler.ts +267 -0
  57. package/src/services/ProjectService.ts +3 -0
  58. package/src/services/TestService.ts +3 -3
  59. package/src/services/TomcatService.ts +46 -25
  60. package/src/services/tomcat/TomcatBackupManager.ts +330 -0
  61. package/src/services/tomcat/TomcatChecksumVerifier.ts +211 -0
  62. package/src/services/tomcat/TomcatCompatibilityChecker.ts +298 -0
  63. package/src/services/tomcat/TomcatDownloadCache.ts +250 -0
  64. package/src/services/tomcat/TomcatDownloadService.ts +335 -0
  65. package/src/services/tomcat/TomcatInstallerService.ts +474 -0
  66. package/src/services/tomcat/TomcatMirrorManager.ts +181 -0
  67. package/src/services/tomcat/index.ts +36 -0
  68. package/src/services/tomcat/types.ts +120 -0
  69. package/src/types/args.ts +68 -1
  70. package/src/types/configSchema.ts +174 -0
  71. package/src/utils/ChangelogGenerator.ts +11 -11
  72. package/src/utils/LoggerLevel.ts +44 -20
  73. package/src/utils/ProgressBar.ts +87 -46
  74. package/src/utils/argsParser.ts +260 -0
  75. package/src/utils/config.ts +340 -189
  76. package/src/utils/constants.ts +87 -9
  77. package/src/utils/dryRun.ts +192 -0
  78. package/src/utils/processManager.ts +23 -7
  79. package/src/utils/security.ts +293 -0
  80. package/src/utils/ui.ts +299 -428
@@ -0,0 +1,120 @@
1
+ /**
2
+ * Tipos compartilhados para serviços Tomcat
3
+ */
4
+
5
+ /** Configuração de proxy */
6
+ export interface TomcatProxyConfig {
7
+ http?: string;
8
+ https?: string;
9
+ noProxy?: string[];
10
+ }
11
+
12
+ /** Informações de mirror */
13
+ export interface TomcatMirror {
14
+ name: string;
15
+ url: string;
16
+ region: string;
17
+ priority: number;
18
+ }
19
+
20
+ /** Configuração de download */
21
+ export interface TomcatDownloadConfig {
22
+ /** Versão do Tomcat */
23
+ version: string;
24
+ /** Mirror preferido (ou 'auto' para seleção automática) */
25
+ mirror?: string | "auto";
26
+ /** Timeout em segundos */
27
+ timeout?: number;
28
+ /** Número de retries */
29
+ retries?: number;
30
+ /** Habilitar resume */
31
+ resume?: boolean;
32
+ /** Modo silencioso */
33
+ silent?: boolean;
34
+ /** Configuração de proxy */
35
+ proxy?: TomcatProxyConfig;
36
+ /** Cache de downloads */
37
+ cache?: {
38
+ enabled: boolean;
39
+ dir: string;
40
+ };
41
+ }
42
+
43
+ /** Resultado de instalação */
44
+ export interface TomcatInstallResult {
45
+ success: boolean;
46
+ version: string;
47
+ home: string;
48
+ downloaded: boolean;
49
+ cached: boolean;
50
+ resumed: boolean;
51
+ attempts: number;
52
+ duration: number;
53
+ speed: number;
54
+ size: number;
55
+ checksum?: {
56
+ expected: string;
57
+ actual: string;
58
+ valid: boolean;
59
+ };
60
+ error?: string;
61
+ }
62
+
63
+ /** Informações de versão instalada */
64
+ export interface InstalledVersion {
65
+ version: string;
66
+ home: string;
67
+ size: number;
68
+ installedAt: Date;
69
+ lastUsed?: Date;
70
+ }
71
+
72
+ /** Resultado de backup */
73
+ export interface BackupResult {
74
+ success: boolean;
75
+ backupPath: string;
76
+ size: number;
77
+ timestamp: Date;
78
+ }
79
+
80
+ /** Resultado de restore */
81
+ export interface RestoreResult {
82
+ success: boolean;
83
+ fromVersion: string;
84
+ toVersion: string;
85
+ backupPath: string;
86
+ }
87
+
88
+ /** Compatibilidade de versão */
89
+ export interface CompatibilityResult {
90
+ compatible: boolean;
91
+ tomcatVersion: string;
92
+ servletVersion: string;
93
+ jspVersion: string;
94
+ warnings: string[];
95
+ errors: string[];
96
+ }
97
+
98
+ /** Estado do cache */
99
+ export interface CacheState {
100
+ enabled: boolean;
101
+ dir: string;
102
+ size: number;
103
+ files: CacheFile[];
104
+ }
105
+
106
+ /** Arquivo em cache */
107
+ export interface CacheFile {
108
+ name: string;
109
+ size: number;
110
+ modified: Date;
111
+ checksum: string;
112
+ }
113
+
114
+ /** Configuração de backup */
115
+ export interface BackupConfig {
116
+ enabled: boolean;
117
+ dir: string;
118
+ maxBackups: number;
119
+ autoBackup: boolean;
120
+ }
package/src/types/args.ts CHANGED
@@ -125,6 +125,65 @@ export interface CompletionArgs extends BaseArgs {
125
125
  shell?: string;
126
126
  }
127
127
 
128
+ // ===== Args do Novo Comando Clean =====
129
+ export interface CleanArgs extends BaseArgs {
130
+ all?: boolean;
131
+ cache?: boolean;
132
+ build?: boolean;
133
+ logs?: boolean;
134
+ tomcat?: boolean;
135
+ }
136
+
137
+ // ===== Args do Comando Test =====
138
+ export interface TestArgs extends BaseArgs {
139
+ watch?: boolean;
140
+ coverage?: boolean;
141
+ "fail-fast"?: boolean;
142
+ parallel?: boolean;
143
+ // Positional: filter
144
+ }
145
+
146
+ // ===== Args do Comando DB =====
147
+ export interface DbArgs extends BaseArgs {
148
+ force?: boolean;
149
+ // Positional: action (status, migrate, reset, seed)
150
+ }
151
+
152
+ // ===== Args do Comando HTTP =====
153
+ export interface HttpArgs extends BaseArgs {
154
+ "base-url"?: string;
155
+ body?: string;
156
+ file?: string;
157
+ header?: string[];
158
+ "content-type"?: string;
159
+ accept?: string;
160
+ param?: string[];
161
+ timeout?: string;
162
+ // Positional: method, path
163
+ }
164
+
165
+ // ===== Args do Comando Docker =====
166
+ export interface DockerArgs extends BaseArgs {
167
+ tag?: string;
168
+ "java-version"?: string;
169
+ detached?: boolean;
170
+ registry?: string;
171
+ namespace?: string;
172
+ // Positional: action (init, build, up, down, run, status)
173
+ }
174
+
175
+ // ===== Args do Comando Changelog =====
176
+ export interface ChangelogArgs extends BaseArgs {
177
+ output?: string;
178
+ from?: string;
179
+ to?: string;
180
+ }
181
+
182
+ // ===== Args do Novo Comando IDE =====
183
+ export interface IdeArgs extends BaseArgs {
184
+ ide?: "vscode" | "idea" | "eclipse";
185
+ }
186
+
128
187
  // ===== CLIArguments Legado (para compatibilidade) =====
129
188
  // Será gradualmente removido
130
189
  export interface CLIArguments extends
@@ -134,7 +193,15 @@ export interface CLIArguments extends
134
193
  DebugArgs,
135
194
  AnalysisArgs,
136
195
  EncodingArgs {
137
- // Campos adicionais para compatibilidade
196
+ // Propriedades de CleanArgs
197
+ all?: boolean;
198
+ cache?: boolean;
199
+ build?: boolean;
200
+ logs?: boolean;
201
+ tomcat?: boolean;
202
+ // Propriedades extras
203
+ i?: boolean;
204
+ o?: string;
138
205
  [key: string]: unknown;
139
206
  }
140
207
 
@@ -0,0 +1,174 @@
1
+ /**
2
+ * Schemas de validação Zod para configurações do XAVVA CLI
3
+ * Garante type safety e validação em runtime
4
+ */
5
+
6
+ import { z } from "zod";
7
+
8
+ // ============================================
9
+ // SCHEMAS BASE
10
+ // ============================================
11
+
12
+ export const TomcatConfigSchema = z.object({
13
+ path: z.string().min(1, "Tomcat path é obrigatório"),
14
+ port: z.number().int().min(1).max(65535).default(8080),
15
+ webapps: z.string().default("webapps"),
16
+ grep: z.string().default(""),
17
+ embedded: z.boolean().default(false),
18
+ version: z.string().regex(/^\d+\.\d+\.\d+$/, "Versão deve seguir formato semver").default("10.1.52"),
19
+ });
20
+
21
+ export const ProjectConfigSchema = z.object({
22
+ appName: z.string().default(""),
23
+ buildTool: z.enum(["maven", "gradle"]).default("maven"),
24
+ profile: z.string().default(""),
25
+ skipBuild: z.boolean().default(false),
26
+ skipScan: z.boolean().default(true),
27
+ clean: z.boolean().default(false),
28
+ cleanLogs: z.boolean().default(true),
29
+ quiet: z.boolean().default(true),
30
+ verbose: z.boolean().default(false),
31
+ debug: z.boolean().default(false),
32
+ debugPort: z.number().int().min(1).max(65535).default(5005),
33
+ grep: z.string().default(""),
34
+ tui: z.boolean().default(false),
35
+ encoding: z.string().default(""),
36
+ war: z.boolean().default(false),
37
+ cache: z.boolean().default(false),
38
+ environment: z.string().default(""),
39
+ environments: z.record(z.any()).optional(),
40
+ });
41
+
42
+ export const AppConfigSchema = z.object({
43
+ tomcat: TomcatConfigSchema,
44
+ project: ProjectConfigSchema,
45
+ });
46
+
47
+ // ============================================
48
+ // SCHEMAS DE CLI ARGS
49
+ // ============================================
50
+
51
+ export const BaseArgsSchema = z.object({
52
+ help: z.boolean().optional(),
53
+ version: z.boolean().optional(),
54
+ verbose: z.boolean().optional(),
55
+ quiet: z.boolean().optional(),
56
+ "debug-level": z.enum(["silent", "error", "warn", "info", "verbose", "trace", "silly"]).optional(),
57
+ });
58
+
59
+ export const ProjectArgsSchema = z.object({
60
+ tool: z.enum(["maven", "gradle"]).optional(),
61
+ name: z.string().optional(),
62
+ profile: z.string().optional(),
63
+ encoding: z.string().optional(),
64
+ "no-build": z.boolean().optional(),
65
+ clean: z.boolean().optional(),
66
+ war: z.boolean().optional(),
67
+ cache: z.boolean().optional(),
68
+ });
69
+
70
+ export const TomcatArgsSchema = z.object({
71
+ path: z.string().optional(),
72
+ port: z.string().optional(),
73
+ "tomcat-version": z.string().optional(),
74
+ yes: z.boolean().optional(),
75
+ });
76
+
77
+ export const DebugArgsSchema = z.object({
78
+ debug: z.boolean().optional(),
79
+ watch: z.boolean().optional(),
80
+ tui: z.boolean().optional(),
81
+ dp: z.string().optional(),
82
+ });
83
+
84
+ // ============================================
85
+ // TIPOS INFERIDOS
86
+ // ============================================
87
+
88
+ export type ValidatedTomcatConfig = z.infer<typeof TomcatConfigSchema>;
89
+ export type ValidatedProjectConfig = z.infer<typeof ProjectConfigSchema>;
90
+ export type ValidatedAppConfig = z.infer<typeof AppConfigSchema>;
91
+
92
+ // ============================================
93
+ // FUNÇÕES DE VALIDAÇÃO
94
+ // ============================================
95
+
96
+ /**
97
+ * Valida configuração completa do aplicativo
98
+ */
99
+ export function validateAppConfig(config: unknown): ValidatedAppConfig {
100
+ if (!config || typeof config !== 'object') {
101
+ throw new Error("Configuração deve ser um objeto");
102
+ }
103
+
104
+ const result = AppConfigSchema.safeParse(config);
105
+
106
+ if (!result.success) {
107
+ const issues = result.error?.issues || result.error?.errors || [];
108
+ const formattedErrors = issues.map((e: any) =>
109
+ `${e.path?.join('.') || 'root'}: ${e.message}`
110
+ ).join('\n');
111
+
112
+ throw new Error(`Configuração inválida:\n${formattedErrors || result.error?.message || 'Erro desconhecido'}`);
113
+ }
114
+
115
+ return result.data;
116
+ }
117
+
118
+ /**
119
+ * Valida config parcial (para merges)
120
+ */
121
+ export function validatePartialConfig(config: unknown): Partial<ValidatedAppConfig> {
122
+ const result = AppConfigSchema.partial().safeParse(config);
123
+
124
+ if (!result.success) {
125
+ const formattedErrors = result.error.errors.map(e =>
126
+ `${e.path.join('.')}: ${e.message}`
127
+ ).join('\n');
128
+
129
+ throw new Error(`Configuração parcial inválida:\n${formattedErrors}`);
130
+ }
131
+
132
+ return result.data;
133
+ }
134
+
135
+ /**
136
+ * Valida porta (helper)
137
+ */
138
+ export function validatePort(port: string | number): number {
139
+ const num = typeof port === 'string' ? parseInt(port, 10) : port;
140
+
141
+ if (isNaN(num) || num < 1 || num > 65535) {
142
+ throw new Error(`Porta inválida: ${port}. Deve ser entre 1 e 65535.`);
143
+ }
144
+
145
+ return num;
146
+ }
147
+
148
+ /**
149
+ * Valida versão do Tomcat
150
+ */
151
+ export function validateTomcatVersion(version: string): string {
152
+ const semverRegex = /^\d+\.\d+\.\d+$/;
153
+
154
+ if (!semverRegex.test(version)) {
155
+ throw new Error(`Versão do Tomcat inválida: ${version}. Formato esperado: x.x.x (ex: 10.1.52)`);
156
+ }
157
+
158
+ return version;
159
+ }
160
+
161
+ /**
162
+ * Merge seguro de configurações
163
+ */
164
+ export function mergeConfigs(
165
+ base: Partial<ValidatedAppConfig>,
166
+ override: Partial<ValidatedAppConfig>
167
+ ): ValidatedAppConfig {
168
+ const merged = {
169
+ tomcat: { ...base.tomcat, ...override.tomcat },
170
+ project: { ...base.project, ...override.project },
171
+ };
172
+
173
+ return validateAppConfig(merged);
174
+ }
@@ -20,17 +20,17 @@ interface Version {
20
20
 
21
21
  export class ChangelogGenerator {
22
22
  private static readonly TYPES: Record<string, { title: string; emoji: string }> = {
23
- feat: { title: "Features", emoji: "" },
24
- fix: { title: "Bug Fixes", emoji: "🐛" },
25
- docs: { title: "Documentation", emoji: "📚" },
26
- style: { title: "Styles", emoji: "💎" },
27
- refactor: { title: "Code Refactoring", emoji: "♻️" },
28
- perf: { title: "Performance", emoji: "" },
29
- test: { title: "Tests", emoji: "🧪" },
30
- build: { title: "Build System", emoji: "🏗️" },
31
- ci: { title: "CI/CD", emoji: "🔄" },
32
- chore: { title: "Chores", emoji: "🔧" },
33
- revert: { title: "Reverts", emoji: "" },
23
+ feat: { title: "Features", emoji: "+" },
24
+ fix: { title: "Bug Fixes", emoji: "!" },
25
+ docs: { title: "Documentation", emoji: "D" },
26
+ style: { title: "Styles", emoji: "S" },
27
+ refactor: { title: "Code Refactoring", emoji: "R" },
28
+ perf: { title: "Performance", emoji: "P" },
29
+ test: { title: "Tests", emoji: "T" },
30
+ build: { title: "Build System", emoji: "B" },
31
+ ci: { title: "CI/CD", emoji: "C" },
32
+ chore: { title: "Chores", emoji: "*" },
33
+ revert: { title: "Reverts", emoji: "-" },
34
34
  };
35
35
 
36
36
  static generate(): string {
@@ -1,4 +1,10 @@
1
- import { Logger } from "./ui";
1
+ /**
2
+ * LoggerLevel - Adaptador para o novo sistema de logging
3
+ *
4
+ * @deprecated Use o Logger de src/logging/ diretamente
5
+ */
6
+
7
+ import { Logger } from "../logging";
2
8
 
3
9
  export type LogLevel = "silent" | "error" | "warn" | "info" | "verbose" | "trace" | "silly";
4
10
 
@@ -8,20 +14,28 @@ interface LogLevelConfig {
8
14
  prefix: string;
9
15
  }
10
16
 
17
+ /**
18
+ * @deprecated Use Logger de src/logging/
19
+ *
20
+ * LoggerLevel - Adaptador que delega para o novo sistema de logging
21
+ */
11
22
  export class LoggerLevel {
12
23
  private static currentLevel: LogLevel = "info";
24
+ private static logger = Logger.getInstance();
25
+
13
26
  private static readonly levels: Record<LogLevel, LogLevelConfig> = {
14
27
  silent: { value: 0, color: "", prefix: "" },
15
- error: { value: 1, color: Logger.C.error, prefix: "ERR" },
16
- warn: { value: 2, color: Logger.C.warning, prefix: "WRN" },
17
- info: { value: 3, color: Logger.C.info, prefix: "INF" },
18
- verbose: { value: 4, color: Logger.C.primary, prefix: "VRB" },
19
- trace: { value: 5, color: Logger.C.gray, prefix: "TRC" },
20
- silly: { value: 6, color: Logger.C.darkGray, prefix: "SLY" },
28
+ error: { value: 1, color: Logger.getInstance()['config'].colors ? "\x1b[31m" : "", prefix: "ERR" },
29
+ warn: { value: 2, color: Logger.getInstance()['config'].colors ? "\x1b[33m" : "", prefix: "WRN" },
30
+ info: { value: 3, color: Logger.getInstance()['config'].colors ? "\x1b[34m" : "", prefix: "INF" },
31
+ verbose: { value: 4, color: Logger.getInstance()['config'].colors ? "\x1b[36m" : "", prefix: "VRB" },
32
+ trace: { value: 5, color: Logger.getInstance()['config'].colors ? "\x1b[90m" : "", prefix: "TRC" },
33
+ silly: { value: 6, color: Logger.getInstance()['config'].colors ? "\x1b[38;5;240m" : "", prefix: "SLY" },
21
34
  };
22
35
 
23
36
  static setLevel(level: LogLevel): void {
24
37
  this.currentLevel = level;
38
+ this.logger.setLevel(level);
25
39
  }
26
40
 
27
41
  static getLevel(): LogLevel {
@@ -35,17 +49,27 @@ export class LoggerLevel {
35
49
  private static log(level: LogLevel, message: string, ...args: unknown[]): void {
36
50
  if (!this.shouldLog(level)) return;
37
51
 
38
- const config = this.levels[level];
39
52
  const formatted = args.length > 0
40
53
  ? this.formatMessage(message, args)
41
54
  : message;
42
55
 
43
- if (level === "error") {
44
- Logger.error(formatted);
45
- } else if (level === "warn") {
46
- Logger.warn(formatted);
47
- } else {
48
- console.log(`${Logger.C.gray}│${Logger.C.reset} ${config.color}[${config.prefix}]${Logger.C.reset} ${formatted}`);
56
+ switch (level) {
57
+ case "error":
58
+ this.logger.error(formatted);
59
+ break;
60
+ case "warn":
61
+ this.logger.warn(formatted);
62
+ break;
63
+ case "info":
64
+ this.logger.info(formatted);
65
+ break;
66
+ case "verbose":
67
+ this.logger.debug(formatted);
68
+ break;
69
+ case "trace":
70
+ case "silly":
71
+ this.logger.trace(formatted);
72
+ break;
49
73
  }
50
74
  }
51
75
 
@@ -87,13 +111,13 @@ export class LoggerLevel {
87
111
  // Utility methods for specific debug scenarios
88
112
  static debugCommand(command: string, args: string[]): void {
89
113
  if (this.shouldLog("verbose")) {
90
- this.verbose("Executing: %1 %2", command, args.join(" "));
114
+ this.verbose("Executando: %1 %2", command, args.join(" "));
91
115
  }
92
116
  }
93
117
 
94
118
  static debugSpawn(cmd: string, options: Record<string, unknown>): void {
95
119
  if (this.shouldLog("trace")) {
96
- this.trace("Spawn: %1 with options: %2", cmd, options);
120
+ this.trace("Spawn: %1 com opções: %2", cmd, options);
97
121
  }
98
122
  }
99
123
 
@@ -106,7 +130,7 @@ export class LoggerLevel {
106
130
 
107
131
  static debugFile(operation: string, path: string, details?: unknown): void {
108
132
  if (this.shouldLog("trace")) {
109
- this.trace("File %1: %2 %3", operation, path, details || "");
133
+ this.trace("Arquivo %1: %2 %3", operation, path, details || "");
110
134
  }
111
135
  }
112
136
 
@@ -118,7 +142,7 @@ export class LoggerLevel {
118
142
 
119
143
  static debugPerformance(operation: string, durationMs: number): void {
120
144
  if (this.shouldLog("verbose")) {
121
- this.verbose("Performance: %1 took %2ms", operation, durationMs);
145
+ this.verbose("Performance: %1 levou %2ms", operation, durationMs);
122
146
  }
123
147
  }
124
148
 
@@ -128,11 +152,11 @@ export class LoggerLevel {
128
152
  }
129
153
 
130
154
  const start = performance.now();
131
- this.verbose("Timing started: %1", label);
155
+ this.verbose("Timing iniciado: %1", label);
132
156
 
133
157
  return () => {
134
158
  const duration = Math.round(performance.now() - start);
135
- this.verbose("Timing ended: %1 took %2ms", label, duration);
159
+ this.verbose("Timing finalizado: %1 levou %2ms", label, duration);
136
160
  };
137
161
  }
138
162
  }