@silasfmartins/testhub 1.0.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 (296) hide show
  1. package/.github/copilot-instructions.md +520 -0
  2. package/biome.json +37 -0
  3. package/dist/index.d.ts +45 -0
  4. package/dist/index.js +169 -0
  5. package/dist/scripts/consumer-postinstall.d.ts +15 -0
  6. package/dist/scripts/consumer-postinstall.js +785 -0
  7. package/dist/scripts/generate-docs.d.ts +16 -0
  8. package/dist/scripts/generate-docs.js +1363 -0
  9. package/dist/scripts/generate-index.d.ts +2 -0
  10. package/dist/scripts/generate-index.js +314 -0
  11. package/dist/scripts/init-api.d.ts +2 -0
  12. package/dist/scripts/init-api.js +525 -0
  13. package/dist/scripts/init-banco.d.ts +2 -0
  14. package/dist/scripts/init-banco.js +347 -0
  15. package/dist/scripts/init-frontend.d.ts +2 -0
  16. package/dist/scripts/init-frontend.js +627 -0
  17. package/dist/scripts/init-mobile.d.ts +2 -0
  18. package/dist/scripts/init-mobile.js +481 -0
  19. package/dist/scripts/init-scenarios.d.ts +2 -0
  20. package/dist/scripts/init-scenarios.js +846 -0
  21. package/dist/scripts/init-ssh.d.ts +2 -0
  22. package/dist/scripts/init-ssh.js +639 -0
  23. package/dist/scripts/package-versions.d.ts +57 -0
  24. package/dist/scripts/package-versions.js +768 -0
  25. package/dist/scripts/postinstall.d.ts +1 -0
  26. package/dist/scripts/postinstall.js +527 -0
  27. package/dist/scripts/robust-build.d.ts +7 -0
  28. package/dist/scripts/robust-build.js +88 -0
  29. package/dist/scripts/setup-local-packages.d.ts +31 -0
  30. package/dist/scripts/setup-local-packages.js +237 -0
  31. package/dist/scripts/smart-override.d.ts +2 -0
  32. package/dist/scripts/smart-override.js +1360 -0
  33. package/dist/scripts/sync-configs.d.ts +27 -0
  34. package/dist/scripts/sync-configs.js +248 -0
  35. package/dist/scripts/test-biome-parse.d.ts +5 -0
  36. package/dist/scripts/test-biome-parse.js +84 -0
  37. package/dist/scripts/ultracite-setup.d.ts +4 -0
  38. package/dist/scripts/ultracite-setup.js +310 -0
  39. package/dist/scripts/update-all-init-scripts.d.ts +2 -0
  40. package/dist/scripts/update-all-init-scripts.js +52 -0
  41. package/dist/scripts/update-biome-schema.d.ts +15 -0
  42. package/dist/scripts/update-biome-schema.js +124 -0
  43. package/dist/src/AutoCoreFacade.d.ts +145 -0
  44. package/dist/src/AutoCoreFacade.js +217 -0
  45. package/dist/src/api/ApiActions.d.ts +297 -0
  46. package/dist/src/api/ApiActions.js +1905 -0
  47. package/dist/src/api/Certificate.d.ts +60 -0
  48. package/dist/src/api/Certificate.js +79 -0
  49. package/dist/src/api/JsonResponse.d.ts +116 -0
  50. package/dist/src/api/JsonResponse.js +206 -0
  51. package/dist/src/appium/DeviceFarmViewer.d.ts +79 -0
  52. package/dist/src/appium/DeviceFarmViewer.js +1083 -0
  53. package/dist/src/appium/MobileActions.d.ts +347 -0
  54. package/dist/src/appium/MobileActions.js +1632 -0
  55. package/dist/src/appium/MobileConnection.d.ts +160 -0
  56. package/dist/src/appium/MobileConnection.js +772 -0
  57. package/dist/src/config/envLoader.d.ts +123 -0
  58. package/dist/src/config/envLoader.js +361 -0
  59. package/dist/src/config/jest-safe-setup.d.ts +19 -0
  60. package/dist/src/config/jest-safe-setup.js +369 -0
  61. package/dist/src/config/timeouts.d.ts +32 -0
  62. package/dist/src/config/timeouts.js +38 -0
  63. package/dist/src/desktop/DesktopActions.d.ts +46 -0
  64. package/dist/src/desktop/DesktopActions.js +398 -0
  65. package/dist/src/desktop/DesktopConnection.d.ts +32 -0
  66. package/dist/src/desktop/DesktopConnection.js +84 -0
  67. package/dist/src/domain/entities/TestExecution.d.ts +117 -0
  68. package/dist/src/domain/entities/TestExecution.js +150 -0
  69. package/dist/src/domain/entities/TestReport.d.ts +114 -0
  70. package/dist/src/domain/entities/TestReport.js +179 -0
  71. package/dist/src/domain/repositories/ITestRepository.d.ts +196 -0
  72. package/dist/src/domain/repositories/ITestRepository.js +14 -0
  73. package/dist/src/domain/schemas/ValidationSchemas.d.ts +159 -0
  74. package/dist/src/domain/schemas/ValidationSchemas.js +181 -0
  75. package/dist/src/functions/errors/BaseError.d.ts +78 -0
  76. package/dist/src/functions/errors/BaseError.js +245 -0
  77. package/dist/src/functions/errors/ConfigurationError.d.ts +16 -0
  78. package/dist/src/functions/errors/ConfigurationError.js +48 -0
  79. package/dist/src/functions/errors/ErrorCatalog.d.ts +148 -0
  80. package/dist/src/functions/errors/ErrorCatalog.js +157 -0
  81. package/dist/src/functions/errors/GlobalErrorHandler.d.ts +101 -0
  82. package/dist/src/functions/errors/GlobalErrorHandler.js +281 -0
  83. package/dist/src/functions/errors/IntegrationError.d.ts +17 -0
  84. package/dist/src/functions/errors/IntegrationError.js +51 -0
  85. package/dist/src/functions/errors/SecurityError.d.ts +14 -0
  86. package/dist/src/functions/errors/SecurityError.js +42 -0
  87. package/dist/src/functions/errors/SystemError.d.ts +12 -0
  88. package/dist/src/functions/errors/SystemError.js +36 -0
  89. package/dist/src/functions/errors/ValidationError.d.ts +14 -0
  90. package/dist/src/functions/errors/ValidationError.js +61 -0
  91. package/dist/src/functions/errors/index.d.ts +12 -0
  92. package/dist/src/functions/errors/index.js +13 -0
  93. package/dist/src/global-setup.d.ts +1 -0
  94. package/dist/src/global-setup.js +1037 -0
  95. package/dist/src/helpers/BancoActions.d.ts +188 -0
  96. package/dist/src/helpers/BancoActions.js +581 -0
  97. package/dist/src/helpers/EnviromentHelper.d.ts +17 -0
  98. package/dist/src/helpers/EnviromentHelper.js +66 -0
  99. package/dist/src/helpers/ParallelExecutionHelper.d.ts +183 -0
  100. package/dist/src/helpers/ParallelExecutionHelper.js +375 -0
  101. package/dist/src/helpers/SyncSignal.d.ts +15 -0
  102. package/dist/src/helpers/SyncSignal.js +44 -0
  103. package/dist/src/hubdocs/CategoryDetector.d.ts +83 -0
  104. package/dist/src/hubdocs/CategoryDetector.js +401 -0
  105. package/dist/src/hubdocs/DirectStatementInterceptor.d.ts +54 -0
  106. package/dist/src/hubdocs/DirectStatementInterceptor.js +243 -0
  107. package/dist/src/hubdocs/ExecutionTracker.d.ts +107 -0
  108. package/dist/src/hubdocs/ExecutionTracker.js +702 -0
  109. package/dist/src/hubdocs/HubDocs.d.ts +395 -0
  110. package/dist/src/hubdocs/HubDocs.js +3586 -0
  111. package/dist/src/hubdocs/StatementMethodFilter.d.ts +71 -0
  112. package/dist/src/hubdocs/StatementMethodFilter.js +618 -0
  113. package/dist/src/hubdocs/StatementTracker.d.ts +417 -0
  114. package/dist/src/hubdocs/StatementTracker.js +2419 -0
  115. package/dist/src/hubdocs/SwaggerGenerator.d.ts +59 -0
  116. package/dist/src/hubdocs/SwaggerGenerator.js +405 -0
  117. package/dist/src/hubdocs/index.d.ts +9 -0
  118. package/dist/src/hubdocs/index.js +9 -0
  119. package/dist/src/hubdocs/types.d.ts +114 -0
  120. package/dist/src/hubdocs/types.js +5 -0
  121. package/dist/src/infrastructure/DependencyContainer.d.ts +142 -0
  122. package/dist/src/infrastructure/DependencyContainer.js +250 -0
  123. package/dist/src/infrastructure/adapters/AppiumAdapter.d.ts +168 -0
  124. package/dist/src/infrastructure/adapters/AppiumAdapter.js +468 -0
  125. package/dist/src/infrastructure/adapters/OracleAdapter.d.ts +150 -0
  126. package/dist/src/infrastructure/adapters/OracleAdapter.js +388 -0
  127. package/dist/src/infrastructure/adapters/PlaywrightAdapter.d.ts +192 -0
  128. package/dist/src/infrastructure/adapters/PlaywrightAdapter.js +382 -0
  129. package/dist/src/infrastructure/adapters/SSHAdapter.d.ts +141 -0
  130. package/dist/src/infrastructure/adapters/SSHAdapter.js +428 -0
  131. package/dist/src/interfaces.d.ts +501 -0
  132. package/dist/src/interfaces.js +25 -0
  133. package/dist/src/internal/fakes/__fake-actions__.d.ts +17 -0
  134. package/dist/src/internal/fakes/__fake-actions__.js +21 -0
  135. package/dist/src/internal/fakes/__forbidden__.d.ts +10 -0
  136. package/dist/src/internal/fakes/__forbidden__.js +18 -0
  137. package/dist/src/internal/fakes/__honeypot__.d.ts +15 -0
  138. package/dist/src/internal/fakes/__honeypot__.js +24 -0
  139. package/dist/src/octane/OctaneReporter.d.ts +13 -0
  140. package/dist/src/octane/OctaneReporter.js +61 -0
  141. package/dist/src/playwright/CryptoActions.d.ts +20 -0
  142. package/dist/src/playwright/CryptoActions.js +75 -0
  143. package/dist/src/playwright/EnhancedWebActions.d.ts +7 -0
  144. package/dist/src/playwright/EnhancedWebActions.js +65 -0
  145. package/dist/src/playwright/WebActions.d.ts +1599 -0
  146. package/dist/src/playwright/WebActions.js +11788 -0
  147. package/dist/src/playwright/actions/ActionTimeline.d.ts +36 -0
  148. package/dist/src/playwright/actions/ActionTimeline.js +101 -0
  149. package/dist/src/playwright/actions/RecoveryQueue.d.ts +82 -0
  150. package/dist/src/playwright/actions/RecoveryQueue.js +130 -0
  151. package/dist/src/playwright/actions/SelectorCache.d.ts +53 -0
  152. package/dist/src/playwright/actions/SelectorCache.js +96 -0
  153. package/dist/src/playwright/actions/index.d.ts +13 -0
  154. package/dist/src/playwright/actions/index.js +14 -0
  155. package/dist/src/playwright/actions/types.d.ts +147 -0
  156. package/dist/src/playwright/actions/types.js +5 -0
  157. package/dist/src/playwright/fixtures.d.ts +112 -0
  158. package/dist/src/playwright/fixtures.js +718 -0
  159. package/dist/src/playwright/network-logs-reporter.d.ts +7 -0
  160. package/dist/src/playwright/network-logs-reporter.js +66 -0
  161. package/dist/src/playwright/registerRecoveryWrappers.d.ts +1 -0
  162. package/dist/src/playwright/registerRecoveryWrappers.js +54 -0
  163. package/dist/src/security/BuildSecurity.d.ts +12 -0
  164. package/dist/src/security/BuildSecurity.js +138 -0
  165. package/dist/src/security/EulaProtection.d.ts +70 -0
  166. package/dist/src/security/EulaProtection.js +155 -0
  167. package/dist/src/security/HoneypotManager.d.ts +46 -0
  168. package/dist/src/security/HoneypotManager.js +234 -0
  169. package/dist/src/security/KeysManager.d.ts +36 -0
  170. package/dist/src/security/KeysManager.js +158 -0
  171. package/dist/src/security/ProofOfWorkIntegration.d.ts +64 -0
  172. package/dist/src/security/ProofOfWorkIntegration.js +206 -0
  173. package/dist/src/security/SecurityValidation.d.ts +21 -0
  174. package/dist/src/security/SecurityValidation.js +163 -0
  175. package/dist/src/security/SourceMapProtection.d.ts +55 -0
  176. package/dist/src/security/SourceMapProtection.js +220 -0
  177. package/dist/src/security/protector.d.ts +1 -0
  178. package/dist/src/security/protector.js +97 -0
  179. package/dist/src/ssh/SSHActions.d.ts +262 -0
  180. package/dist/src/ssh/SSHActions.js +790 -0
  181. package/dist/src/ssh/SSHClient.d.ts +99 -0
  182. package/dist/src/ssh/SSHClient.js +409 -0
  183. package/dist/src/statements/BaseStatement.d.ts +38 -0
  184. package/dist/src/statements/BaseStatement.js +78 -0
  185. package/dist/src/testContext/AuthStateManager.d.ts +93 -0
  186. package/dist/src/testContext/AuthStateManager.js +256 -0
  187. package/dist/src/testContext/CoverageManager.d.ts +198 -0
  188. package/dist/src/testContext/CoverageManager.js +917 -0
  189. package/dist/src/testContext/TestAnnotations.d.ts +476 -0
  190. package/dist/src/testContext/TestAnnotations.js +2647 -0
  191. package/dist/src/testContext/TestContext.d.ts +138 -0
  192. package/dist/src/testContext/TestContext.js +369 -0
  193. package/dist/src/testContext/UnifiedHtmlGenerator.d.ts +7 -0
  194. package/dist/src/testContext/UnifiedHtmlGenerator.js +264 -0
  195. package/dist/src/testContext/UnifiedReportManager.d.ts +211 -0
  196. package/dist/src/testContext/UnifiedReportManager.js +1206 -0
  197. package/dist/src/testhub/DynamicConfigManager.d.ts +121 -0
  198. package/dist/src/testhub/DynamicConfigManager.js +320 -0
  199. package/dist/src/testhub/SystemsManager.d.ts +119 -0
  200. package/dist/src/testhub/SystemsManager.js +365 -0
  201. package/dist/src/testhub/TestHubClient.d.ts +335 -0
  202. package/dist/src/testhub/TestHubClient.js +1215 -0
  203. package/dist/src/testhub/TestHubReporter.d.ts +62 -0
  204. package/dist/src/testhub/TestHubReporter.js +576 -0
  205. package/dist/src/testhub/TestHubVars.d.ts +116 -0
  206. package/dist/src/testhub/TestHubVars.js +273 -0
  207. package/dist/src/utils/ActionInterceptor.d.ts +59 -0
  208. package/dist/src/utils/ActionInterceptor.js +741 -0
  209. package/dist/src/utils/ArtifactsCompressor.d.ts +43 -0
  210. package/dist/src/utils/ArtifactsCompressor.js +181 -0
  211. package/dist/src/utils/AutoLogsFinal.d.ts +47 -0
  212. package/dist/src/utils/AutoLogsFinal.js +148 -0
  213. package/dist/src/utils/CodeGenSession.d.ts +114 -0
  214. package/dist/src/utils/CodeGenSession.js +264 -0
  215. package/dist/src/utils/ConfigLogger.d.ts +133 -0
  216. package/dist/src/utils/ConfigLogger.js +611 -0
  217. package/dist/src/utils/CustomReporter.d.ts +22 -0
  218. package/dist/src/utils/CustomReporter.js +352 -0
  219. package/dist/src/utils/DataStore.d.ts +171 -0
  220. package/dist/src/utils/DataStore.js +484 -0
  221. package/dist/src/utils/DatabaseInterceptor.d.ts +19 -0
  222. package/dist/src/utils/DatabaseInterceptor.js +295 -0
  223. package/dist/src/utils/DateHelper.d.ts +16 -0
  224. package/dist/src/utils/DateHelper.js +120 -0
  225. package/dist/src/utils/DateValidator.d.ts +4 -0
  226. package/dist/src/utils/DateValidator.js +51 -0
  227. package/dist/src/utils/DocumentGenerator.d.ts +35 -0
  228. package/dist/src/utils/DocumentGenerator.js +129 -0
  229. package/dist/src/utils/EvidenceCapture.d.ts +90 -0
  230. package/dist/src/utils/EvidenceCapture.js +600 -0
  231. package/dist/src/utils/EvidenceReportGenerator.d.ts +70 -0
  232. package/dist/src/utils/EvidenceReportGenerator.js +799 -0
  233. package/dist/src/utils/FrameManagementUtil.d.ts +42 -0
  234. package/dist/src/utils/FrameManagementUtil.js +75 -0
  235. package/dist/src/utils/GlobalStatementsInterceptor.d.ts +1 -0
  236. package/dist/src/utils/GlobalStatementsInterceptor.js +1 -0
  237. package/dist/src/utils/HTMLTemplate.d.ts +1 -0
  238. package/dist/src/utils/HTMLTemplate.js +1034 -0
  239. package/dist/src/utils/InterceptacaoMagica.d.ts +23 -0
  240. package/dist/src/utils/InterceptacaoMagica.js +365 -0
  241. package/dist/src/utils/LogSanitizer.d.ts +35 -0
  242. package/dist/src/utils/LogSanitizer.js +110 -0
  243. package/dist/src/utils/Logger.d.ts +65 -0
  244. package/dist/src/utils/Logger.js +284 -0
  245. package/dist/src/utils/McpLocalClient.d.ts +141 -0
  246. package/dist/src/utils/McpLocalClient.js +871 -0
  247. package/dist/src/utils/PDFEvidenceGenerator.d.ts +20 -0
  248. package/dist/src/utils/PDFEvidenceGenerator.js +156 -0
  249. package/dist/src/utils/SpecFileAnalyzer.d.ts +35 -0
  250. package/dist/src/utils/SpecFileAnalyzer.js +209 -0
  251. package/dist/src/utils/StatementInterceptor.d.ts +18 -0
  252. package/dist/src/utils/StatementInterceptor.js +87 -0
  253. package/dist/src/utils/StatementLogger.d.ts +33 -0
  254. package/dist/src/utils/StatementLogger.js +113 -0
  255. package/dist/src/utils/StatementsInterceptor.d.ts +1 -0
  256. package/dist/src/utils/StatementsInterceptor.js +1 -0
  257. package/dist/src/utils/TeamsFlushHook.d.ts +17 -0
  258. package/dist/src/utils/TeamsFlushHook.js +168 -0
  259. package/dist/src/utils/TerminalLogCapture.d.ts +158 -0
  260. package/dist/src/utils/TerminalLogCapture.js +531 -0
  261. package/dist/src/utils/TestMethodLogger.d.ts +70 -0
  262. package/dist/src/utils/TestMethodLogger.js +95 -0
  263. package/dist/src/utils/UnifiedTeardown.d.ts +4 -0
  264. package/dist/src/utils/UnifiedTeardown.js +400 -0
  265. package/dist/src/utils/XPathCatalog.d.ts +152 -0
  266. package/dist/src/utils/XPathCatalog.js +350 -0
  267. package/dist/src/utils/generators.d.ts +90 -0
  268. package/dist/src/utils/generators.js +167 -0
  269. package/dist/src/utils/testRecovery/ResilientPlaywright.d.ts +152 -0
  270. package/dist/src/utils/testRecovery/ResilientPlaywright.js +715 -0
  271. package/dist/src/utils/testRecovery/TestRecoveryClient.d.ts +801 -0
  272. package/dist/src/utils/testRecovery/TestRecoveryClient.js +1415 -0
  273. package/dist/src/utils/testRecovery/autoFixCode.d.ts +65 -0
  274. package/dist/src/utils/testRecovery/autoFixCode.js +32 -0
  275. package/dist/vitest.config.d.ts +2 -0
  276. package/dist/vitest.config.js +59 -0
  277. package/dist/wdio.conf.d.ts +1 -0
  278. package/dist/wdio.conf.js +420 -0
  279. package/package.json +137 -0
  280. package/protect-loader.mjs +643 -0
  281. package/scripts/consumer-postinstall.ts +975 -0
  282. package/scripts/generate-index.ts +343 -0
  283. package/scripts/init-api.ts +613 -0
  284. package/scripts/init-banco.ts +437 -0
  285. package/scripts/init-frontend.ts +727 -0
  286. package/scripts/init-mobile.ts +558 -0
  287. package/scripts/init-scenarios.ts +925 -0
  288. package/scripts/init-ssh.ts +734 -0
  289. package/scripts/package-versions.ts +978 -0
  290. package/scripts/postinstall.ts +605 -0
  291. package/scripts/smart-override.ts +1675 -0
  292. package/scripts/sync-configs.ts +302 -0
  293. package/scripts/ultracite-setup.ts +370 -0
  294. package/src/types/globals.d.ts +48 -0
  295. package/tsconfig.json +29 -0
  296. package/types/autocore-sync-signal.d.ts +10 -0
@@ -0,0 +1,531 @@
1
+ /**
2
+ * 📋 Sistema de Captura Completa de Logs do Terminal
3
+ * @description Captura TODOS os logs (console.log, Logger, etc.) que aparecem no terminal
4
+ * @author AutoCore Team
5
+ * @version 1.1.0
6
+ * 🔧 ATUALIZAÇÃO: Logs são persistidos em arquivo para compartilhar entre workers do Playwright
7
+ */
8
+ import { appendFileSync, existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
9
+ import { resolve } from 'node:path';
10
+ // 🆕 Caminho do arquivo de logs compartilhado entre workers
11
+ const SHARED_LOGS_PATH = resolve(process.cwd(), '.rbqa', 'captured-logs.json');
12
+ /**
13
+ * 📊 Sistema de captura de logs do terminal
14
+ * 🔧 NOTA: Cada worker do Playwright tem sua própria instância em memória,
15
+ * mas os logs são persistidos em arquivo para compartilhamento.
16
+ */
17
+ export class TerminalLogCapture {
18
+ static isActive = false;
19
+ static logs = [];
20
+ static logsByTest = new Map();
21
+ static currentTestName = null;
22
+ static currentCTName = null; // 🆕 Nome do CT atual
23
+ static workerId = TerminalLogCapture.generateWorkerId(); // 🆕 ID único do worker
24
+ static globalLogIndex = 0; // 🆕 Contador global de logs
25
+ static logListeners = new Map();
26
+ // Guardar funções originais do console
27
+ static originalConsole = {
28
+ log: console.log,
29
+ info: console.info,
30
+ warn: console.warn,
31
+ error: console.error,
32
+ debug: console.debug,
33
+ };
34
+ // Flag para evitar recursão infinita
35
+ static isCapturing = false;
36
+ /**
37
+ * 🆕 Gera um ID único para este worker
38
+ */
39
+ static generateWorkerId() {
40
+ // Tentar usar variáveis de ambiente padrão do Playwright
41
+ const workerIndex = process.env.TEST_WORKER_INDEX || process.env.PLAYWRIGHT_TEST_WORKER_INDEX;
42
+ if (workerIndex !== undefined) {
43
+ return `worker-${workerIndex}`;
44
+ }
45
+ // Fallback: gerar ID baseado em timestamp + random
46
+ return `worker-${Date.now().toString(36)}-${Math.random().toString(36).substring(2, 7)}`;
47
+ }
48
+ /**
49
+ * 🚀 Inicia captura de logs
50
+ */
51
+ static start() {
52
+ if (TerminalLogCapture.isActive) {
53
+ return;
54
+ }
55
+ TerminalLogCapture.isActive = true;
56
+ TerminalLogCapture.logs = [];
57
+ TerminalLogCapture.logsByTest.clear();
58
+ // 🆕 Sincronizar índice global com arquivo existente
59
+ TerminalLogCapture.syncGlobalIndex();
60
+ globalThis.TerminalLogCapture = TerminalLogCapture;
61
+ // Interceptar console.log
62
+ console.log = (...args) => {
63
+ TerminalLogCapture.captureLog('log', args);
64
+ TerminalLogCapture.originalConsole.log.apply(console, args);
65
+ };
66
+ // Interceptar console.info
67
+ console.info = (...args) => {
68
+ TerminalLogCapture.captureLog('info', args);
69
+ TerminalLogCapture.originalConsole.info.apply(console, args);
70
+ };
71
+ // Interceptar console.warn
72
+ console.warn = (...args) => {
73
+ TerminalLogCapture.captureLog('warn', args);
74
+ TerminalLogCapture.originalConsole.warn.apply(console, args);
75
+ };
76
+ // Interceptar console.error
77
+ console.error = (...args) => {
78
+ TerminalLogCapture.captureLog('error', args);
79
+ TerminalLogCapture.originalConsole.error.apply(console, args);
80
+ };
81
+ // Interceptar console.debug
82
+ console.debug = (...args) => {
83
+ TerminalLogCapture.captureLog('debug', args);
84
+ TerminalLogCapture.originalConsole.debug.apply(console, args);
85
+ };
86
+ }
87
+ /**
88
+ * 🔄 Sincroniza índice global com arquivo existente
89
+ */
90
+ static syncGlobalIndex() {
91
+ try {
92
+ if (existsSync(SHARED_LOGS_PATH)) {
93
+ const data = JSON.parse(readFileSync(SHARED_LOGS_PATH, 'utf8'));
94
+ TerminalLogCapture.globalLogIndex = data.globalIndex || 0;
95
+ }
96
+ }
97
+ catch {
98
+ // Se erro, começar do zero
99
+ TerminalLogCapture.globalLogIndex = 0;
100
+ }
101
+ }
102
+ /**
103
+ * 📝 Captura um log
104
+ * 🔧 ATUALIZADO: Persiste logs em arquivo JSON compartilhado entre workers
105
+ */
106
+ static captureLog(level, args) {
107
+ // Evitar recursão infinita
108
+ if (TerminalLogCapture.isCapturing) {
109
+ return;
110
+ }
111
+ TerminalLogCapture.isCapturing = true;
112
+ try {
113
+ // Converter argumentos em string
114
+ const message = args
115
+ .map((arg) => {
116
+ if (typeof arg === 'string')
117
+ return arg;
118
+ if (typeof arg === 'object') {
119
+ try {
120
+ return JSON.stringify(arg, null, 2);
121
+ }
122
+ catch {
123
+ return String(arg);
124
+ }
125
+ }
126
+ return String(arg);
127
+ })
128
+ .join(' ');
129
+ // Capturar stack trace para logs de erro
130
+ let stackTrace;
131
+ if (level === 'error') {
132
+ try {
133
+ const stack = new Error().stack;
134
+ if (stack) {
135
+ stackTrace = stack.split('\n').slice(2).join('\n');
136
+ }
137
+ }
138
+ catch {
139
+ // Ignorar erro ao capturar stack
140
+ }
141
+ }
142
+ // 🆕 Incrementar índice global
143
+ TerminalLogCapture.globalLogIndex++;
144
+ const capturedLog = {
145
+ timestamp: new Date().toISOString(),
146
+ level,
147
+ message,
148
+ testName: TerminalLogCapture.currentTestName || undefined,
149
+ ctName: TerminalLogCapture.currentCTName || undefined, // 🆕 CT atual
150
+ workerId: TerminalLogCapture.workerId, // 🆕 ID do worker
151
+ stackTrace,
152
+ index: TerminalLogCapture.globalLogIndex, // 🆕 Índice global
153
+ };
154
+ // Adicionar ao array geral
155
+ TerminalLogCapture.logs.push(capturedLog);
156
+ // Adicionar ao array do teste atual (se houver)
157
+ if (TerminalLogCapture.currentTestName) {
158
+ if (!TerminalLogCapture.logsByTest.has(TerminalLogCapture.currentTestName)) {
159
+ TerminalLogCapture.logsByTest.set(TerminalLogCapture.currentTestName, []);
160
+ }
161
+ TerminalLogCapture.logsByTest
162
+ .get(TerminalLogCapture.currentTestName)
163
+ .push(capturedLog);
164
+ }
165
+ // 🆕 SEMPRE persistir em arquivo JSON compartilhado (essencial para multi-worker)
166
+ TerminalLogCapture.persistLogToSharedFile(capturedLog);
167
+ // Notificar listeners em tempo real
168
+ TerminalLogCapture.notifyListeners(capturedLog);
169
+ // Salvar em arquivo em tempo real (opcional - log de texto)
170
+ if (process.env.SAVE_LOGS_REALTIME === 'true') {
171
+ TerminalLogCapture.appendToLogFile(capturedLog);
172
+ }
173
+ }
174
+ finally {
175
+ TerminalLogCapture.isCapturing = false;
176
+ }
177
+ }
178
+ /**
179
+ * 🆕 Persiste log no arquivo JSON compartilhado entre workers
180
+ */
181
+ static persistLogToSharedFile(log) {
182
+ try {
183
+ const dir = resolve(process.cwd(), '.rbqa');
184
+ if (!existsSync(dir)) {
185
+ mkdirSync(dir, { recursive: true });
186
+ }
187
+ // 🆕 Usar arquivo específico do worker para evitar race conditions
188
+ const workerId = TerminalLogCapture.getWorkerId();
189
+ const workerLogPath = resolve(dir, `captured-logs-${workerId}.json`);
190
+ // Ler logs existentes DESTE WORKER
191
+ let existingData = { globalIndex: 0, logs: [] };
192
+ if (existsSync(workerLogPath)) {
193
+ try {
194
+ existingData = JSON.parse(readFileSync(workerLogPath, 'utf8'));
195
+ }
196
+ catch {
197
+ // Se arquivo corrompido, criar novo
198
+ existingData = { globalIndex: 0, logs: [] };
199
+ }
200
+ }
201
+ // Adicionar novo log
202
+ existingData.logs.push(log);
203
+ existingData.globalIndex = log.index || existingData.globalIndex + 1;
204
+ // Salvar arquivo (com retry para evitar conflitos entre workers)
205
+ TerminalLogCapture.writeWithRetry(workerLogPath, JSON.stringify(existingData, null, 2));
206
+ }
207
+ catch {
208
+ // Silenciosamente ignorar erros de persistência
209
+ }
210
+ }
211
+ /**
212
+ * 🆕 Escreve arquivo com retry para evitar conflitos
213
+ */
214
+ static writeWithRetry(filePath, content, maxRetries = 3) {
215
+ for (let i = 0; i < maxRetries; i++) {
216
+ try {
217
+ writeFileSync(filePath, content, 'utf8');
218
+ return;
219
+ }
220
+ catch {
221
+ if (i === maxRetries - 1)
222
+ throw new Error('Failed to write after retries');
223
+ // Esperar um pouco antes de tentar novamente
224
+ const waitTime = Math.random() * 50 + 10;
225
+ const start = Date.now();
226
+ while (Date.now() - start < waitTime) { /* busy wait */ }
227
+ }
228
+ }
229
+ }
230
+ /**
231
+ * 🆕 Obtém todos os logs do arquivo compartilhado (para uso cross-worker)
232
+ */
233
+ static getSharedLogs() {
234
+ try {
235
+ const dir = resolve(process.cwd(), '.rbqa');
236
+ if (!existsSync(dir))
237
+ return [];
238
+ // 🆕 Ler de TODOS os arquivos de logs (worker-specific)
239
+ // Usar require('fs') dinâmico para garantir acesso ao readdirSync
240
+ const fs = require('fs');
241
+ const files = fs.readdirSync(dir).filter((f) => f.startsWith('captured-logs-') && f.endsWith('.json'));
242
+ let allLogs = [];
243
+ for (const file of files) {
244
+ try {
245
+ const content = readFileSync(resolve(dir, file), 'utf8');
246
+ const data = JSON.parse(content);
247
+ if (Array.isArray(data.logs)) {
248
+ allLogs = allLogs.concat(data.logs);
249
+ }
250
+ }
251
+ catch {
252
+ // Ignore
253
+ }
254
+ }
255
+ // Ordenar por timestamp pois índices são locais por worker
256
+ return allLogs.sort((a, b) => new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime());
257
+ }
258
+ catch {
259
+ // Se erro, retornar vazio
260
+ return [];
261
+ }
262
+ }
263
+ /**
264
+ * 🆕 Obtém índice global atual do arquivo compartilhado
265
+ */
266
+ static getSharedGlobalIndex() {
267
+ try {
268
+ if (existsSync(SHARED_LOGS_PATH)) {
269
+ const data = JSON.parse(readFileSync(SHARED_LOGS_PATH, 'utf8'));
270
+ return data.globalIndex || 0;
271
+ }
272
+ }
273
+ catch {
274
+ // Se erro, retornar 0
275
+ }
276
+ return 0;
277
+ }
278
+ /**
279
+ * 🆕 Obtém o índice global atual em memória (sem acessar arquivo)
280
+ */
281
+ static getCurrentGlobalIndex() {
282
+ return TerminalLogCapture.globalLogIndex;
283
+ }
284
+ /**
285
+ * 🆕 Registra listener para receber logs em tempo real (usado pelos CTs)
286
+ */
287
+ static addListener(id, listener) {
288
+ TerminalLogCapture.logListeners.set(id, listener);
289
+ }
290
+ /**
291
+ * 🆕 Remove listener registrado
292
+ */
293
+ static removeListener(id) {
294
+ TerminalLogCapture.logListeners.delete(id);
295
+ }
296
+ static notifyListeners(log) {
297
+ if (TerminalLogCapture.logListeners.size === 0) {
298
+ return;
299
+ }
300
+ for (const listener of TerminalLogCapture.logListeners.values()) {
301
+ try {
302
+ listener(log);
303
+ }
304
+ catch {
305
+ // Ignorar erros de listeners para não quebrar captura principal
306
+ }
307
+ }
308
+ }
309
+ /**
310
+ * 🆕 Limpa arquivo de logs compartilhado (usar no início de nova execução)
311
+ */
312
+ static clearSharedLogs() {
313
+ try {
314
+ if (existsSync(SHARED_LOGS_PATH)) {
315
+ writeFileSync(SHARED_LOGS_PATH, JSON.stringify({ globalIndex: 0, logs: [] }, null, 2), 'utf8');
316
+ }
317
+ TerminalLogCapture.globalLogIndex = 0;
318
+ }
319
+ catch {
320
+ // Silenciosamente ignorar
321
+ }
322
+ }
323
+ /**
324
+ * 🔄 Define o teste atual
325
+ */
326
+ static setCurrentTest(testName) {
327
+ TerminalLogCapture.currentTestName = testName;
328
+ if (!TerminalLogCapture.logsByTest.has(testName)) {
329
+ TerminalLogCapture.logsByTest.set(testName, []);
330
+ // ✅ USAR CONSOLE NORMAL para aparecer nos logs
331
+ }
332
+ else {
333
+ const existingLogs = TerminalLogCapture.logsByTest.get(testName).length;
334
+ }
335
+ }
336
+ /**
337
+ * 🏁 Limpa o teste atual
338
+ */
339
+ static clearCurrentTest() {
340
+ TerminalLogCapture.currentTestName = null;
341
+ }
342
+ /**
343
+ * 🆕 Define o CT atual (para filtros mais precisos)
344
+ */
345
+ static setCurrentCT(ctName) {
346
+ TerminalLogCapture.currentCTName = ctName;
347
+ }
348
+ /**
349
+ * 🆕 Limpa o CT atual
350
+ */
351
+ static clearCurrentCT() {
352
+ TerminalLogCapture.currentCTName = null;
353
+ }
354
+ /**
355
+ * 🆕 Obtém o worker ID atual
356
+ */
357
+ static getWorkerId() {
358
+ return TerminalLogCapture.workerId;
359
+ }
360
+ /**
361
+ * 🆕 Obtém logs filtrados por CT name (funciona em single e multi-worker)
362
+ */
363
+ static getLogsForCT(ctName, testName) {
364
+ // 1. Primeiro tentar da memória local (single-worker ou mesmo worker)
365
+ let logs = TerminalLogCapture.logs.filter(log => {
366
+ const matchCT = log.ctName === ctName || log.message.includes(ctName);
367
+ const matchTest = !testName || log.testName === testName || log.message.includes(testName);
368
+ return matchCT && matchTest;
369
+ });
370
+ // 2. Se não encontrou, tentar do arquivo compartilhado (multi-worker)
371
+ if (logs.length === 0) {
372
+ const sharedLogs = TerminalLogCapture.getSharedLogs();
373
+ logs = sharedLogs.filter(log => {
374
+ const matchCT = log.ctName === ctName || log.message.includes(ctName);
375
+ const matchTest = !testName || log.testName === testName || log.message.includes(testName);
376
+ return matchCT && matchTest;
377
+ });
378
+ }
379
+ // 3. Ordenar por índice global
380
+ return logs.sort((a, b) => (a.index || 0) - (b.index || 0));
381
+ }
382
+ /**
383
+ * 🆕 Obtém todos os logs combinando memória e arquivo compartilhado (para multi-worker)
384
+ */
385
+ static getAllLogsCombined() {
386
+ // Combinar logs da memória com logs do arquivo compartilhado
387
+ const memoryLogs = TerminalLogCapture.logs;
388
+ const sharedLogs = TerminalLogCapture.getSharedLogs();
389
+ // Usar Map para deduplicar por índice
390
+ const logsMap = new Map();
391
+ for (const log of sharedLogs) {
392
+ if (log.index) {
393
+ logsMap.set(log.index, log);
394
+ }
395
+ }
396
+ // Logs da memória têm prioridade (mais recentes)
397
+ for (const log of memoryLogs) {
398
+ if (log.index) {
399
+ logsMap.set(log.index, log);
400
+ }
401
+ }
402
+ // Retornar ordenado por índice
403
+ return Array.from(logsMap.values()).sort((a, b) => (a.index || 0) - (b.index || 0));
404
+ }
405
+ /**
406
+ * 🆕 Obtém logs por range de índice (funciona em single e multi-worker)
407
+ */
408
+ static getLogsByIndexRange(startIndex, endIndex) {
409
+ // Combinar todas as fontes
410
+ const allLogs = TerminalLogCapture.getAllLogsCombined();
411
+ return allLogs.filter(log => {
412
+ const logIndex = log.index || 0;
413
+ if (endIndex !== undefined) {
414
+ return logIndex >= startIndex && logIndex <= endIndex;
415
+ }
416
+ return logIndex >= startIndex;
417
+ });
418
+ }
419
+ /**
420
+ * 📊 Retorna todos os logs capturados
421
+ */
422
+ static getAllLogs() {
423
+ return [...TerminalLogCapture.logs];
424
+ }
425
+ /**
426
+ * 📋 Retorna logs de um teste específico
427
+ */
428
+ static getLogsForTest(testName) {
429
+ return TerminalLogCapture.logsByTest.get(testName) || [];
430
+ }
431
+ /**
432
+ * 📊 Retorna todos os logs organizados por teste
433
+ */
434
+ static getLogsByTest() {
435
+ return new Map(TerminalLogCapture.logsByTest);
436
+ }
437
+ /**
438
+ * 💾 Salva logs em arquivo JSON
439
+ */
440
+ static saveToFile(outputPath = './test-results/terminal-logs.json') {
441
+ try {
442
+ const dir = outputPath.substring(0, outputPath.lastIndexOf('/'));
443
+ if (!existsSync(dir)) {
444
+ mkdirSync(dir, { recursive: true });
445
+ }
446
+ const data = {
447
+ captureStarted: TerminalLogCapture.logs[0]?.timestamp || new Date().toISOString(),
448
+ captureEnded: new Date().toISOString(),
449
+ totalLogs: TerminalLogCapture.logs.length,
450
+ logsByTest: Object.fromEntries(Array.from(TerminalLogCapture.logsByTest.entries()).map(([testName, logs]) => [
451
+ testName,
452
+ {
453
+ count: logs.length,
454
+ logs,
455
+ },
456
+ ])),
457
+ allLogs: TerminalLogCapture.logs,
458
+ };
459
+ writeFileSync(outputPath, JSON.stringify(data, null, 2), 'utf8');
460
+ TerminalLogCapture.originalConsole.info(`✅ Logs salvos em: ${outputPath}`);
461
+ }
462
+ catch (error) {
463
+ TerminalLogCapture.originalConsole.error(`❌ Erro ao salvar logs: ${error}`);
464
+ }
465
+ }
466
+ /**
467
+ * 📝 Adiciona log em arquivo em tempo real
468
+ */
469
+ static appendToLogFile(log) {
470
+ try {
471
+ const logPath = './test-results/terminal-logs-realtime.log';
472
+ const dir = logPath.substring(0, logPath.lastIndexOf('/'));
473
+ if (!existsSync(dir)) {
474
+ mkdirSync(dir, { recursive: true });
475
+ }
476
+ const logLine = `[${log.timestamp}] [${log.level.toUpperCase()}]${log.testName ? ` [${log.testName}]` : ''} ${log.message}\n`;
477
+ appendFileSync(logPath, logLine, 'utf8');
478
+ }
479
+ catch (error) {
480
+ // Ignorar erro silenciosamente
481
+ }
482
+ }
483
+ /**
484
+ * 🛑 Para captura e restaura console original
485
+ */
486
+ static stop() {
487
+ if (!TerminalLogCapture.isActive) {
488
+ return;
489
+ }
490
+ console.log = TerminalLogCapture.originalConsole.log;
491
+ console.info = TerminalLogCapture.originalConsole.info;
492
+ console.warn = TerminalLogCapture.originalConsole.warn;
493
+ console.error = TerminalLogCapture.originalConsole.error;
494
+ console.debug = TerminalLogCapture.originalConsole.debug;
495
+ TerminalLogCapture.isActive = false;
496
+ // Salvar logs finais
497
+ TerminalLogCapture.saveToFile();
498
+ }
499
+ /**
500
+ * 🧹 Limpa todos os logs
501
+ */
502
+ static clear() {
503
+ TerminalLogCapture.logs = [];
504
+ TerminalLogCapture.logsByTest.clear();
505
+ TerminalLogCapture.currentTestName = null;
506
+ }
507
+ /**
508
+ * 📊 Estatísticas de logs
509
+ */
510
+ static getStats() {
511
+ const stats = {
512
+ totalLogs: TerminalLogCapture.logs.length,
513
+ byLevel: {
514
+ log: 0,
515
+ info: 0,
516
+ warn: 0,
517
+ error: 0,
518
+ debug: 0,
519
+ },
520
+ byTest: {},
521
+ testsWithLogs: TerminalLogCapture.logsByTest.size,
522
+ };
523
+ for (const log of TerminalLogCapture.logs) {
524
+ stats.byLevel[log.level]++;
525
+ if (log.testName) {
526
+ stats.byTest[log.testName] = (stats.byTest[log.testName] || 0) + 1;
527
+ }
528
+ }
529
+ return stats;
530
+ }
531
+ }
@@ -0,0 +1,70 @@
1
+ /**
2
+ * 🔧 TestMethodLogger - Helper para logs visuais organizados
3
+ *
4
+ * Facilita a criação de logs com separação visual clara entre métodos
5
+ * para melhor debugging e acompanhamento de execução de testes.
6
+ */
7
+ export declare class TestMethodLogger {
8
+ /**
9
+ * 🚀 Executa um método com logs automáticos de início/fim
10
+ *
11
+ * @example
12
+ * await TestMethodLogger.run('getTokenSFA', 'StatementsTokenSFA', async () => {
13
+ * return await new StatementsTokenSFA().getTokenSFA("mve.svc", "yUqFQ3Hkwx9Gd8-U");
14
+ * }, ["mve.svc", "yUqFQ3Hkwx9Gd8-U"]);
15
+ */
16
+ static run<T>(methodName: string, className: string, method: () => Promise<T> | T, params?: any[]): Promise<T>;
17
+ /**
18
+ * 📋 Log simples de início de método (sem wrapper)
19
+ *
20
+ * @example
21
+ * TestMethodLogger.start('getTokenSFA', 'StatementsTokenSFA', ["mve.svc", "yUqFQ3Hkwx9Gd8-U"]);
22
+ */
23
+ static start(methodName: string, className: string, params?: any[]): void;
24
+ /**
25
+ * ✅ Log de fim de método (sem wrapper)
26
+ *
27
+ * @example
28
+ * TestMethodLogger.end('getTokenSFA', 'StatementsTokenSFA', true, 1500);
29
+ */
30
+ static end(methodName: string, className: string, success?: boolean, duration?: number): void;
31
+ /**
32
+ * 🎯 Separador de seção para grupos de métodos relacionados
33
+ *
34
+ * @example
35
+ * TestMethodLogger.section('CRIAÇÃO DE MASSA SFA');
36
+ */
37
+ static section(sectionName: string): void;
38
+ /**
39
+ * 📖 Log simples para método sem timing
40
+ *
41
+ * @example
42
+ * TestMethodLogger.log('validarCNPJ', 'StatementsValidarCNPJ');
43
+ */
44
+ static log(methodName: string, className: string): void;
45
+ }
46
+ /**
47
+ * 🎨 Decorator para métodos (TypeScript Experimental)
48
+ *
49
+ * @example
50
+ * class StatementsTokenSFA {
51
+ * @logMethod('StatementsTokenSFA')
52
+ * async getTokenSFA(service: string, token: string) {
53
+ * // sua implementação aqui
54
+ * }
55
+ * }
56
+ */
57
+ export declare function logMethod(className: string): (target: any, propertyName: string, descriptor: PropertyDescriptor) => PropertyDescriptor;
58
+ /**
59
+ * 🚀 Helper para executar uma sequência de métodos com logs organizados
60
+ *
61
+ * @example
62
+ * await TestMethodSequence.execute('GERAÇÃO MASSA SFA', [
63
+ * ['getTokenSFA', 'StatementsTokenSFA', () => new StatementsTokenSFA().getTokenSFA("mve.svc", "yUqFQ3Hkwx9Gd8-U")],
64
+ * ['geroOuReceboCNPJ', 'StatementsValidarCNPJ', () => new StatementsValidarCNPJ().geroOuReceboCNPJ()],
65
+ * ['criacaoCliente', 'StatementsCriarCliente', () => new StatementsCriarCliente().criacaoCliente("Criação de Cliente FTTH", "MPJ00081891", "a0081891")]
66
+ * ]);
67
+ */
68
+ export declare class TestMethodSequence {
69
+ static execute(sectionName: string, methods: Array<[string, string, () => Promise<any> | any, any[]?]>): Promise<void>;
70
+ }
@@ -0,0 +1,95 @@
1
+ /**
2
+ * 🔧 TestMethodLogger - Helper para logs visuais organizados
3
+ *
4
+ * Facilita a criação de logs com separação visual clara entre métodos
5
+ * para melhor debugging e acompanhamento de execução de testes.
6
+ */
7
+ import { ConfigLogger } from './ConfigLogger.js';
8
+ export class TestMethodLogger {
9
+ /**
10
+ * 🚀 Executa um método com logs automáticos de início/fim
11
+ *
12
+ * @example
13
+ * await TestMethodLogger.run('getTokenSFA', 'StatementsTokenSFA', async () => {
14
+ * return await new StatementsTokenSFA().getTokenSFA("mve.svc", "yUqFQ3Hkwx9Gd8-U");
15
+ * }, ["mve.svc", "yUqFQ3Hkwx9Gd8-U"]);
16
+ */
17
+ static async run(methodName, className, method, params) {
18
+ return await ConfigLogger.executeWithLogs(methodName, className, method, params);
19
+ }
20
+ /**
21
+ * 📋 Log simples de início de método (sem wrapper)
22
+ *
23
+ * @example
24
+ * TestMethodLogger.start('getTokenSFA', 'StatementsTokenSFA', ["mve.svc", "yUqFQ3Hkwx9Gd8-U"]);
25
+ */
26
+ static start(methodName, className, params) {
27
+ ConfigLogger.methodStart(methodName, className, params);
28
+ }
29
+ /**
30
+ * ✅ Log de fim de método (sem wrapper)
31
+ *
32
+ * @example
33
+ * TestMethodLogger.end('getTokenSFA', 'StatementsTokenSFA', true, 1500);
34
+ */
35
+ static end(methodName, className, success = true, duration) {
36
+ ConfigLogger.methodEnd(methodName, className, success, duration);
37
+ }
38
+ /**
39
+ * 🎯 Separador de seção para grupos de métodos relacionados
40
+ *
41
+ * @example
42
+ * TestMethodLogger.section('CRIAÇÃO DE MASSA SFA');
43
+ */
44
+ static section(sectionName) {
45
+ ConfigLogger.sectionSeparator(sectionName);
46
+ }
47
+ /**
48
+ * 📖 Log simples para método sem timing
49
+ *
50
+ * @example
51
+ * TestMethodLogger.log('validarCNPJ', 'StatementsValidarCNPJ');
52
+ */
53
+ static log(methodName, className) {
54
+ ConfigLogger.methodLog(methodName, className);
55
+ }
56
+ }
57
+ /**
58
+ * 🎨 Decorator para métodos (TypeScript Experimental)
59
+ *
60
+ * @example
61
+ * class StatementsTokenSFA {
62
+ * @logMethod('StatementsTokenSFA')
63
+ * async getTokenSFA(service: string, token: string) {
64
+ * // sua implementação aqui
65
+ * }
66
+ * }
67
+ */
68
+ export function logMethod(className) {
69
+ return (target, propertyName, descriptor) => {
70
+ const method = descriptor.value;
71
+ descriptor.value = async function (...args) {
72
+ return await TestMethodLogger.run(propertyName, className, () => method.apply(this, args), args);
73
+ };
74
+ return descriptor;
75
+ };
76
+ }
77
+ /**
78
+ * 🚀 Helper para executar uma sequência de métodos com logs organizados
79
+ *
80
+ * @example
81
+ * await TestMethodSequence.execute('GERAÇÃO MASSA SFA', [
82
+ * ['getTokenSFA', 'StatementsTokenSFA', () => new StatementsTokenSFA().getTokenSFA("mve.svc", "yUqFQ3Hkwx9Gd8-U")],
83
+ * ['geroOuReceboCNPJ', 'StatementsValidarCNPJ', () => new StatementsValidarCNPJ().geroOuReceboCNPJ()],
84
+ * ['criacaoCliente', 'StatementsCriarCliente', () => new StatementsCriarCliente().criacaoCliente("Criação de Cliente FTTH", "MPJ00081891", "a0081891")]
85
+ * ]);
86
+ */
87
+ export class TestMethodSequence {
88
+ static async execute(sectionName, methods) {
89
+ TestMethodLogger.section(sectionName);
90
+ for (const [methodName, className, method, params] of methods) {
91
+ await TestMethodLogger.run(methodName, className, method, params);
92
+ }
93
+ ConfigLogger.success(`✅ Seção ${sectionName} concluída com sucesso!`);
94
+ }
95
+ }
@@ -0,0 +1,4 @@
1
+ export declare class UnifiedTeardown {
2
+ static run(): Promise<void>;
3
+ }
4
+ export default function playwrightTeardown(): Promise<void>;