@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,1037 @@
1
+ import * as dotenv from 'dotenv';
2
+ import * as fs from 'fs';
3
+ import * as os from 'os';
4
+ import * as path from 'path';
5
+ import { fileURLToPath } from 'url';
6
+ import { loadEnv } from './config/envLoader.js';
7
+ import { resolveJestVitestConflict } from './config/jest-safe-setup.js';
8
+ import { AutoDocs } from './hubdocs/HubDocs.js';
9
+ import { CoverageManager } from './testContext/CoverageManager.js';
10
+ import { UnifiedReportManager } from './testContext/UnifiedReportManager.js';
11
+ import { ConfigLogger } from './utils/ConfigLogger.js';
12
+ import { DataStore } from './utils/DataStore.js';
13
+ import { TerminalLogCapture } from './utils/TerminalLogCapture.js';
14
+ import SystemsManager from './testhub/SystemsManager.js';
15
+ import { ExecutionTracker } from './hubdocs/ExecutionTracker.js';
16
+ import { MobileActions } from './appium/MobileActions.js';
17
+ // Compatibilidade com ES Modules
18
+ const __filename = fileURLToPath(import.meta.url);
19
+ const __dirname = path.dirname(__filename);
20
+ // Regex patterns definidos no top level para performance
21
+ const CN_SPEC_PATTERN = /^CN\d+.*\.spec\.ts$/;
22
+ const SPEC_PATTERN = /\.spec\.ts$/;
23
+ export default async function globalSetup() {
24
+ // 🔧 SOLUÇÃO DEFINITIVA: Resolver conflito Jest/Vitest ANTES de qualquer import
25
+ resolveJestVitestConflict();
26
+ // 📋 CRÍTICO: Iniciar captura de logs do terminal ANTES DE TUDO
27
+ TerminalLogCapture.start();
28
+ // 🆕 Limpar logs compartilhados do início da execução (cross-worker)
29
+ TerminalLogCapture.clearSharedLogs();
30
+ globalThis.TerminalLogCapture = TerminalLogCapture;
31
+ // ✅ PRIORIDADE MÁXIMA: Limpar arquivos temporários ANTES de qualquer coisa
32
+ await cleanupTempFiles();
33
+ dotenv.config();
34
+ const currentEnv = process.env.ENV || 'development';
35
+ dotenv.config({ path: `.env.${currentEnv}` });
36
+ console.log('🏗️ Iniciando setup global...');
37
+ try {
38
+ // Determinar o tipo de projeto baseado no environment
39
+ const projectType = await determineProjectType();
40
+ console.log(`ℹ️ Tipo de projeto detectado: ${projectType}`);
41
+ // Configurar PROJECT_TYPE no environment se não estiver definido
42
+ if (!process.env.PROJECT_TYPE) {
43
+ process.env.PROJECT_TYPE = projectType;
44
+ }
45
+ // ✅ NOVO: Inicializar DataStore para compartilhamento entre projetos
46
+ DataStore.set('PROJECT_TYPE', projectType);
47
+ DataStore.set('START_TIME', new Date().toISOString());
48
+ DataStore.set('NODE_ENV', currentEnv);
49
+ // 📚 NOVO: Inicializar sistema de documentação automática
50
+ try {
51
+ const projectName = process.env.npm_package_name || `AutoCore ${projectType} Tests`;
52
+ await AutoDocs.initialize({
53
+ projectName,
54
+ outputDir: './docs',
55
+ config: {
56
+ enabled: process.env.AUTODOCS_ENABLED !== 'false',
57
+ generateSwagger: true,
58
+ includeScreenshots: process.env.NODE_ENV !== 'ci',
59
+ },
60
+ });
61
+ // ✅ CRÍTICO: Inicializar ExecutionTracker com detecção automática
62
+ ExecutionTracker.initialize(projectName, projectType);
63
+ globalThis.AutoDocs = AutoDocs;
64
+ globalThis.ExecutionTracker = ExecutionTracker;
65
+ }
66
+ catch (error) {
67
+ console.warn('⚠️ Falha ao inicializar AutoDocs, continuando sem documentação:', error);
68
+ }
69
+ // 🌐 NOVO: Inicializar TestHub Systems Manager
70
+ try {
71
+ const systemsManager = SystemsManager.getInstance();
72
+ // Inicializar (carrega sistemas do backend e gera enum)
73
+ await systemsManager.initialize();
74
+ globalThis.SystemsManager = systemsManager;
75
+ console.log('✅ TestHub Systems carregados e disponíveis');
76
+ }
77
+ catch (error) {
78
+ console.warn('⚠️ Falha ao inicializar TestHub Systems, continuando sem integração:', error);
79
+ console.warn(' Os testes continuarão normalmente usando configuração manual (.env)');
80
+ }
81
+ // Configurar logs específicos por tipo de projeto
82
+ ConfigLogger.init({
83
+ projectName: `AutoCore ${projectType} Tests`,
84
+ logToFile: process.env.LOG_TO_FILE === 'true',
85
+ });
86
+ // Carregar variáveis de ambiente
87
+ loadEnv({
88
+ logConfig: true,
89
+ silent: false,
90
+ loadModeSpecificFiles: true,
91
+ });
92
+ // Mostrar informações do sistema
93
+ displaySystemInfo();
94
+ // ✅ NOVO: Verificar e configurar estruturas obrigatórias (gated)
95
+ // Só cria estrutura quando explicitamente solicitado
96
+ if (process.env.AUTOCORE_CREATE_STRUCTURE === 'true') {
97
+ await ensureRequiredStructure(projectType);
98
+ }
99
+ else {
100
+ console.log('📁 Criação de estrutura pulada (AUTOCORE_CREATE_STRUCTURE != true)');
101
+ }
102
+ // Verificar configuração do Playwright
103
+ checkPlaywrightConfig();
104
+ // Inicializar contextos específicos
105
+ await initializeContexts(projectType);
106
+ // Verificar recursos necessários
107
+ await checkProjectResources(projectType);
108
+ // ✅ MELHORADO: Verificação mais detalhada de ambiente
109
+ checkEnvironmentVariables(projectType);
110
+ // ✅ NOVO: Configurar métricas de sistema
111
+ setupSystemMetrics();
112
+ // Inicializar sistema de relatórios unificado
113
+ UnifiedReportManager.registrarInicioExecucao();
114
+ // 🤖 NOVO: Inicializar sistema de coverage automático
115
+ await CoverageManager.autoInitialize();
116
+ // ✅ NOVO: Registrar informações iniciais do setup
117
+ await recordSetupMetrics(projectType, currentEnv);
118
+ console.log('✅ Setup global concluído com sucesso!');
119
+ // ✅ NOVO: Log de resumo do setup
120
+ logSetupSummary(projectType, currentEnv);
121
+ }
122
+ catch (error) {
123
+ console.error('❌ Erro durante setup global');
124
+ console.error(error);
125
+ // ✅ NOVO: Registrar erro no sistema de relatórios
126
+ try {
127
+ console.error(`❌ Erro durante setup: ${String(error)}`);
128
+ }
129
+ catch {
130
+ // Ignorar se não conseguir registrar
131
+ }
132
+ throw error;
133
+ }
134
+ }
135
+ /**
136
+ * ✅ FUNÇÃO MELHORADA: Limpeza robusta de arquivos temporários
137
+ * Executa ANTES de qualquer configuração para evitar falhas
138
+ */
139
+ async function cleanupTempFiles() {
140
+ const cwd = process.cwd();
141
+ // ✅ EXPANDIDO: Lista mais completa de arquivos temporários
142
+ const tempFiles = [
143
+ '.env.lock',
144
+ '.configlogger.lock',
145
+ '.test-data-store.json',
146
+ '.autocore.lock',
147
+ '.setup.lock',
148
+ ];
149
+ const tempDirs = [
150
+ 'playwright/.auth',
151
+ 'test-results/.tmp',
152
+ '.rbqa', // ✅ AUTODOCS: Limpar dados antigos do ExecutionTracker
153
+ ];
154
+ await cleanupFiles(tempFiles, cwd);
155
+ await cleanupDirectories(tempDirs, cwd);
156
+ // Pequena pausa para garantir que o sistema de arquivos processou as remoções
157
+ await new Promise((resolve) => setTimeout(resolve, 100));
158
+ }
159
+ /**
160
+ * Limpeza de arquivos individuais
161
+ */
162
+ async function cleanupFiles(files, basePath) {
163
+ let filesRemoved = 0;
164
+ let errors = 0;
165
+ for (const fileName of files) {
166
+ const filePath = path.join(basePath, fileName);
167
+ try {
168
+ if (fs.existsSync(filePath)) {
169
+ await removeFileWithFallback(filePath);
170
+ filesRemoved++;
171
+ }
172
+ }
173
+ catch (error) {
174
+ console.error(`❌ Erro ao remover ${fileName}: ${String(error)}`);
175
+ errors++;
176
+ }
177
+ }
178
+ if (errors > 0) {
179
+ console.warn(`⚠️ ${errors} erro(s) durante limpeza de arquivos - os testes continuarão`);
180
+ }
181
+ }
182
+ /**
183
+ * Limpeza de diretórios
184
+ */
185
+ async function cleanupDirectories(dirs, basePath) {
186
+ let dirsRemoved = 0;
187
+ let errors = 0;
188
+ for (const dirName of dirs) {
189
+ const dirPath = path.join(basePath, dirName);
190
+ try {
191
+ if (fs.existsSync(dirPath) && fs.statSync(dirPath).isDirectory()) {
192
+ fs.rmSync(dirPath, { recursive: true, force: true });
193
+ dirsRemoved++;
194
+ }
195
+ }
196
+ catch (error) {
197
+ console.error(`❌ Erro ao remover diretório ${dirName}: ${String(error)}`);
198
+ errors++;
199
+ }
200
+ }
201
+ if (errors > 0) {
202
+ console.warn(`⚠️ ${errors} erro(s) durante limpeza de diretórios - os testes continuarão`);
203
+ }
204
+ }
205
+ /**
206
+ * Remove arquivo com fallback para Windows
207
+ */
208
+ async function removeFileWithFallback(filePath) {
209
+ try {
210
+ fs.unlinkSync(filePath);
211
+ }
212
+ catch (unlinkError) {
213
+ // Fallback para Windows com alteração de permissões
214
+ if (process.platform === 'win32') {
215
+ try {
216
+ fs.chmodSync(filePath, 0o666);
217
+ fs.unlinkSync(filePath);
218
+ }
219
+ catch (forceError) {
220
+ throw forceError;
221
+ }
222
+ }
223
+ else {
224
+ throw unlinkError;
225
+ }
226
+ }
227
+ }
228
+ /**
229
+ * ✅ NOVA FUNÇÃO: Garantir estruturas obrigatórias
230
+ */
231
+ async function ensureRequiredStructure(projectType) {
232
+ console.log('📁 Verificando estruturas obrigatórias...');
233
+ const cwd = process.cwd();
234
+ const requiredDirs = [
235
+ 'tests',
236
+ 'screenshots',
237
+ 'test-results',
238
+ 'playwright-report',
239
+ ];
240
+ // Diretórios específicos por tipo de projeto
241
+ const typeSpecificDirs = {
242
+ API: ['src/statements', 'src/request'],
243
+ Frontend: ['src/pages', 'src/attributes'],
244
+ Mobile: ['src/pages'],
245
+ SSH: ['src/statements'],
246
+ Banco: ['src/models', 'src/services'],
247
+ Scenarios: ['tests'],
248
+ };
249
+ const allRequiredDirs = [
250
+ ...requiredDirs,
251
+ ...(typeSpecificDirs[projectType] || []),
252
+ ];
253
+ await createDirectories(allRequiredDirs, cwd);
254
+ await createEssentialFiles(projectType, cwd);
255
+ }
256
+ /**
257
+ * Criar diretórios necessários
258
+ */
259
+ async function createDirectories(dirs, basePath) {
260
+ for (const dir of dirs) {
261
+ const dirPath = path.join(basePath, dir);
262
+ if (!fs.existsSync(dirPath)) {
263
+ try {
264
+ fs.mkdirSync(dirPath, { recursive: true });
265
+ console.log(`📁 Criado diretório: ${dir}`);
266
+ }
267
+ catch (error) {
268
+ console.warn(`⚠️ Erro ao criar diretório ${dir}: ${String(error)}`);
269
+ }
270
+ }
271
+ }
272
+ }
273
+ /**
274
+ * ✅ NOVA FUNÇÃO: Criar arquivos essenciais
275
+ */
276
+ async function createEssentialFiles(projectType, cwd) {
277
+ await createDefaultEnvFile(cwd);
278
+ await updateGitignoreFile(cwd);
279
+ }
280
+ /**
281
+ * Criar arquivo .env padrão se não existir
282
+ */
283
+ async function createDefaultEnvFile(cwd) {
284
+ const envPath = path.join(cwd, '.env');
285
+ if (!fs.existsSync(envPath)) {
286
+ const defaultEnv = `# Arquivo que seleciona o ambiente a ser utilizado
287
+ ENV=preprod
288
+
289
+ # Configurações básicas
290
+ SCREENSHOTS_ENABLED=false
291
+ LOG_LEVEL=info
292
+ LOG_TO_FILE=false
293
+ `;
294
+ fs.writeFileSync(envPath, defaultEnv);
295
+ console.log('📄 Criado arquivo .env padrão');
296
+ }
297
+ }
298
+ /**
299
+ * Atualizar .gitignore com entradas do AutoCore
300
+ */
301
+ async function updateGitignoreFile(cwd) {
302
+ const gitignorePath = path.join(cwd, '.gitignore');
303
+ const tempIgnoreEntries = [
304
+ '# Arquivos temporários do AutoCore',
305
+ '.env.lock',
306
+ '.configlogger.lock',
307
+ '.test-data-store.json',
308
+ '.autocore.lock',
309
+ '.setup.lock',
310
+ 'test-results/',
311
+ 'playwright-report/',
312
+ 'screenshots/',
313
+ 'evidencias/',
314
+ 'downloads/',
315
+ ];
316
+ if (fs.existsSync(gitignorePath)) {
317
+ const gitignoreContent = fs.readFileSync(gitignorePath, 'utf-8');
318
+ const missingEntries = tempIgnoreEntries.filter((entry) => !gitignoreContent.includes(entry));
319
+ if (missingEntries.length > 0) {
320
+ const newContent = `\n\n${missingEntries.join('\n')}\n`;
321
+ fs.appendFileSync(gitignorePath, newContent);
322
+ console.log(`📄 Adicionadas ${missingEntries.length} entradas ao .gitignore`);
323
+ }
324
+ }
325
+ }
326
+ /**
327
+ * ✅ NOVA FUNÇÃO: Configurar métricas de sistema
328
+ */
329
+ function setupSystemMetrics() {
330
+ console.log('📊 Configurando métricas de sistema...');
331
+ try {
332
+ // Registrar informações iniciais no DataStore
333
+ const memInfo = process.memoryUsage();
334
+ const systemInfo = {
335
+ startTime: Date.now(),
336
+ initialMemory: {
337
+ heapUsed: Math.round(memInfo.heapUsed / 1024 / 1024), // MB
338
+ heapTotal: Math.round(memInfo.heapTotal / 1024 / 1024), // MB
339
+ external: Math.round(memInfo.external / 1024 / 1024), // MB
340
+ },
341
+ cpuInfo: {
342
+ count: os.cpus().length,
343
+ architecture: process.arch,
344
+ platform: process.platform,
345
+ },
346
+ nodeVersion: process.version,
347
+ environment: process.env.ENV || 'development',
348
+ };
349
+ DataStore.set('SYSTEM_METRICS', systemInfo);
350
+ console.log('📊 Métricas de sistema registradas');
351
+ }
352
+ catch (error) {
353
+ console.warn('⚠️ Erro ao configurar métricas:', error);
354
+ }
355
+ }
356
+ /**
357
+ * ✅ NOVA FUNÇÃO: Registrar métricas do setup
358
+ */
359
+ async function recordSetupMetrics(projectType, environment) {
360
+ try {
361
+ const setupInfo = {
362
+ projectType,
363
+ environment,
364
+ nodeVersion: process.version,
365
+ platform: process.platform,
366
+ setupCompletedAt: new Date().toISOString(),
367
+ totalMemoryGB: Math.round(os.totalmem() / 1024 / 1024 / 1024),
368
+ cpuCount: os.cpus().length,
369
+ };
370
+ DataStore.set('SETUP_INFO', setupInfo);
371
+ console.log('📋 Informações do setup registradas');
372
+ }
373
+ catch (error) {
374
+ console.warn('⚠️ Erro ao registrar métricas do setup:', error);
375
+ }
376
+ }
377
+ /**
378
+ * ✅ NOVA FUNÇÃO: Log de resumo do setup
379
+ */
380
+ function logSetupSummary(projectType, environment) {
381
+ console.log('\n📋 === Resumo do Setup ===');
382
+ console.log(`🎯 Tipo de projeto: ${projectType}`);
383
+ console.log(`🌍 Ambiente: ${environment}`);
384
+ console.log(`⚡ Node.js: ${process.version}`);
385
+ console.log(`💻 Plataforma: ${process.platform} (${process.arch})`);
386
+ console.log(`🧠 CPUs disponíveis: ${os.cpus().length}`);
387
+ console.log(`💾 Memória total: ${Math.round(os.totalmem() / 1024 / 1024 / 1024)}GB`);
388
+ // ✅ NOVO: Mostrar variáveis críticas configuradas
389
+ const criticalVars = ['BASE_URL', 'BASE_URL_API', 'DB_HOST', 'SSH_HOST'];
390
+ const configuredVars = criticalVars.filter((varName) => process.env[varName]);
391
+ if (configuredVars.length > 0) {
392
+ console.log(`⚙️ Variáveis críticas: ${configuredVars.join(', ')}`);
393
+ }
394
+ console.log(`📁 Diretório: ${process.cwd()}`);
395
+ console.log('✨ Setup concluído com sucesso!\n');
396
+ }
397
+ /**
398
+ * ✅ MELHORADA: Verificação genérica de variáveis de ambiente com detalhes por tipo
399
+ * Não para os testes, apenas informa sobre configuração
400
+ */
401
+ function checkEnvironmentVariables(projectType) {
402
+ console.log('ℹ️ === Verificação de Configuração ===');
403
+ // Contar variáveis não vazias (excluindo ENV)
404
+ const allEnvVars = Object.keys(process.env).filter((key) => key !== 'ENV' &&
405
+ process.env[key] &&
406
+ (process.env[key] ?? '').trim() !== '');
407
+ // ✅ NOVO: Verificações específicas por tipo (apenas informativas)
408
+ const typeSpecificVars = {
409
+ API: ['BASE_URL', 'BASE_URL_API', 'BASE_URL_TOKEN'],
410
+ Frontend: ['BASE_URL'],
411
+ Mobile: ['APPIUM_SERVER_URL', 'DEVICE_NAME'],
412
+ SSH: ['SSH_HOST', 'SSH_USER'],
413
+ Banco: ['DB_HOST', 'DB_USER', 'DB_SERVICE_NAME'],
414
+ Scenarios: ['BASE_URL', 'OCTANE_URL'],
415
+ };
416
+ const suggestedVars = typeSpecificVars[projectType] || [];
417
+ const configuredSuggested = suggestedVars.filter((varName) => process.env[varName]);
418
+ console.log(`ℹ️ Total de variáveis configuradas: ${allEnvVars.length}`);
419
+ if (configuredSuggested.length > 0) {
420
+ console.log(`✅ Variáveis específicas para ${projectType}: ${configuredSuggested.join(', ')}`);
421
+ }
422
+ if (allEnvVars.length <= 3) {
423
+ console.warn('⚠️ Poucas variáveis de ambiente configuradas.');
424
+ console.warn(`💡 Recomendação para ${projectType}: Configure variáveis como ${suggestedVars.join(', ')}`);
425
+ console.warn('📁 Use os arquivos .env.* para diferentes ambientes');
426
+ console.warn('ℹ️ Os testes continuarão normalmente.');
427
+ }
428
+ else {
429
+ console.log('✅ Configuração de ambiente adequada');
430
+ }
431
+ // ✅ NOVO: Mostrar arquivos .env encontrados
432
+ const envFiles = [
433
+ '.env',
434
+ '.env.preprod',
435
+ '.env.esteira1',
436
+ '.env.esteira2',
437
+ '.env.prodlike',
438
+ ];
439
+ const existingEnvFiles = envFiles.filter((file) => fs.existsSync(path.join(process.cwd(), file)));
440
+ if (existingEnvFiles.length > 0) {
441
+ console.log(`📋 Arquivos de ambiente: ${existingEnvFiles.join(', ')}`);
442
+ }
443
+ }
444
+ /**
445
+ * Determinar tipo de projeto (otimizada para complexidade)
446
+ */
447
+ async function determineProjectType() {
448
+ const cwd = process.cwd();
449
+ try {
450
+ // ✅ PRIORIDADE: Honor CI / pipeline overrides (force test type)
451
+ const overrideType = (process.env.FORCE_TEST_TYPE ||
452
+ process.env.TEST_TYPE ||
453
+ process.env.RUN_TEST_TYPE ||
454
+ '').toLowerCase();
455
+ if (overrideType) {
456
+ if (overrideType.includes('ssh'))
457
+ return 'SSH';
458
+ if (overrideType.includes('scenario') || overrideType.includes('scenarios'))
459
+ return 'Scenarios';
460
+ if (overrideType.includes('frontend') || overrideType.includes('playwright') || overrideType.includes('web'))
461
+ return 'Frontend';
462
+ if (overrideType.includes('api'))
463
+ return 'API';
464
+ if (overrideType.includes('mobile'))
465
+ return 'Mobile';
466
+ if (overrideType.includes('banco') || overrideType.includes('db'))
467
+ return 'Banco';
468
+ }
469
+ // 1. Detectar por nome do projeto no package.json
470
+ const projectNameType = await detectByProjectName(cwd);
471
+ if (projectNameType) {
472
+ return projectNameType;
473
+ }
474
+ // 2. Detectar por estrutura de arquivos
475
+ const structureType = await detectByFileStructure(cwd);
476
+ if (structureType) {
477
+ return structureType;
478
+ }
479
+ // 3. Detectar por variáveis de ambiente
480
+ const envType = detectByEnvironmentVars();
481
+ if (envType) {
482
+ return envType;
483
+ }
484
+ // 4. Detectar por arquivos de teste
485
+ const testType = await detectByTestFiles(cwd);
486
+ if (testType) {
487
+ return testType;
488
+ }
489
+ return 'Frontend'; // fallback
490
+ }
491
+ catch (error) {
492
+ console.warn('⚠️ Erro ao detectar tipo de projeto:', error);
493
+ return 'API';
494
+ }
495
+ }
496
+ /**
497
+ * Detectar tipo por nome do projeto
498
+ */
499
+ async function detectByProjectName(cwd) {
500
+ const packageJsonPath = path.join(cwd, 'package.json');
501
+ const folderName = path.basename(cwd).toLowerCase();
502
+ // Treat projects with `-pw` suffix as Scenarios by default (CI convention)
503
+ if (folderName.endsWith('-pw')) {
504
+ console.log(`📁 Nome da pasta termina com -pw: ${folderName} → tratando como Scenarios por padrão`);
505
+ // If folder name explicitly contains 'playwright' prefer Frontend
506
+ if (folderName.includes('playwright')) {
507
+ console.log(' (contém "playwright" no nome, tratando como Frontend)');
508
+ return 'Frontend';
509
+ }
510
+ return 'Scenarios';
511
+ }
512
+ // ✅ NOVA: Verificar nome da pasta antes do package.json
513
+ const folderPatterns = [
514
+ // ✅ PRIORIDADE MÁXIMA: Detectar cenários/scenarios primeiro (mais específico)
515
+ { pattern: /cenario|scenario/i, type: 'Scenarios' }, // Case insensitive, pega qualquer variação
516
+ { pattern: /mobile|appium|android|ios/, type: 'Mobile' },
517
+ { pattern: /oss-api|test-oss-api|service|rest/, type: 'API' }, // Mais específico para API
518
+ { pattern: /\bapi\b/, type: 'API' }, // API como palavra completa
519
+ { pattern: /frontend|web|ui|playwright/, type: 'Frontend' },
520
+ { pattern: /ssh|terminal|shell/, type: 'SSH' },
521
+ { pattern: /banco|database|db|sql/, type: 'Banco' },
522
+ ];
523
+ for (const { pattern, type } of folderPatterns) {
524
+ if (pattern.test(folderName)) {
525
+ console.log(`📁 Tipo detectado por nome da pasta: ${folderName} → ${type}`);
526
+ return type;
527
+ }
528
+ }
529
+ if (!fs.existsSync(packageJsonPath)) {
530
+ return null;
531
+ }
532
+ try {
533
+ const packageContent = fs.readFileSync(packageJsonPath, 'utf-8');
534
+ const packageJson = JSON.parse(packageContent);
535
+ const projectName = (packageJson.name || '').toLowerCase();
536
+ // If package name ends with -pw treat as Scenarios unless it explicitly references playwright
537
+ if (projectName.endsWith('-pw')) {
538
+ console.log(`📦 package.json name ends with -pw: ${projectName} → treating as Scenarios by default`);
539
+ if (projectName.includes('playwright')) {
540
+ console.log(' (package name contains "playwright", treating as Frontend)');
541
+ return 'Frontend';
542
+ }
543
+ return 'Scenarios';
544
+ }
545
+ const namePatterns = [
546
+ // ✅ PRIORIDADE MÁXIMA: Detectar cenários/scenarios primeiro (mais específico)
547
+ { pattern: /cenario|scenario/i, type: 'Scenarios' }, // Case insensitive
548
+ { pattern: /mobile|appium|android|ios/, type: 'Mobile' },
549
+ { pattern: /oss-api|test-oss-api|service|rest/, type: 'API' }, // Mais específico para API
550
+ { pattern: /\bapi\b/, type: 'API' }, // API como palavra completa
551
+ { pattern: /frontend|web|ui|playwright/, type: 'Frontend' },
552
+ { pattern: /ssh|terminal|shell/, type: 'SSH' },
553
+ { pattern: /banco|database|db|sql/, type: 'Banco' },
554
+ ];
555
+ for (const { pattern, type } of namePatterns) {
556
+ if (pattern.test(projectName)) {
557
+ console.log(`📦 Tipo detectado por package.json: ${projectName} → ${type}`);
558
+ return type;
559
+ }
560
+ }
561
+ }
562
+ catch {
563
+ // Ignorar erro de parse
564
+ }
565
+ return null;
566
+ }
567
+ /**
568
+ * Detectar tipo por estrutura de arquivos
569
+ */
570
+ async function detectByFileStructure(cwd) {
571
+ const srcDir = path.join(cwd, 'src');
572
+ const testsDir = path.join(cwd, 'tests');
573
+ // Scenarios: ausência da pasta src + presença de CN*.spec.ts
574
+ if (!fs.existsSync(srcDir) && fs.existsSync(testsDir)) {
575
+ try {
576
+ const hasScenarios = fs
577
+ .readdirSync(testsDir)
578
+ .some((f) => CN_SPEC_PATTERN.test(f));
579
+ if (hasScenarios) {
580
+ return 'Scenarios';
581
+ }
582
+ }
583
+ catch {
584
+ // Ignorar erro de leitura
585
+ }
586
+ }
587
+ // Banco: arquivos específicos
588
+ const bancoFiles = [
589
+ 'src/models/ModelDBA.ts',
590
+ 'src/models/ModelDBA.js',
591
+ 'src/services/ServiceSiebel.ts',
592
+ 'src/services/ServiceSiebel.js',
593
+ ];
594
+ for (const file of bancoFiles) {
595
+ if (fs.existsSync(path.join(cwd, file))) {
596
+ return 'Banco';
597
+ }
598
+ }
599
+ // Banco: pastas típicas
600
+ if (fs.existsSync(path.join(cwd, 'src', 'models')) ||
601
+ fs.existsSync(path.join(cwd, 'src', 'services'))) {
602
+ return 'Banco';
603
+ }
604
+ // Mobile: wdio.conf
605
+ if (fs.existsSync(path.join(cwd, 'wdio.conf.ts')) ||
606
+ fs.existsSync(path.join(cwd, 'wdio.conf.js'))) {
607
+ return 'Mobile';
608
+ }
609
+ return null;
610
+ }
611
+ /**
612
+ * Detectar tipo por variáveis de ambiente
613
+ */
614
+ function detectByEnvironmentVars() {
615
+ if (process.env.USE_MOBILE === 'true') {
616
+ return 'Mobile';
617
+ }
618
+ if (process.env.USE_SSH === 'true') {
619
+ return 'SSH';
620
+ }
621
+ if (process.env.USE_BANCO === 'true') {
622
+ return 'Banco';
623
+ }
624
+ return null;
625
+ }
626
+ /**
627
+ * Detectar tipo por arquivos de teste
628
+ */
629
+ async function detectByTestFiles(cwd) {
630
+ const testsDir = path.join(cwd, 'tests');
631
+ if (!fs.existsSync(testsDir)) {
632
+ return null;
633
+ }
634
+ try {
635
+ const hasSpecFiles = fs
636
+ .readdirSync(testsDir)
637
+ .some((f) => SPEC_PATTERN.test(f));
638
+ return hasSpecFiles ? 'API' : null;
639
+ }
640
+ catch {
641
+ return null;
642
+ }
643
+ }
644
+ /**
645
+ * Verificar recursos sem require()
646
+ */
647
+ async function checkProjectResources(projectType) {
648
+ console.log('ℹ️ === Verificação de Recursos ===');
649
+ const cwd = process.cwd();
650
+ try {
651
+ // Verificar estrutura de pastas
652
+ const testDir = path.join(cwd, 'tests');
653
+ if (!fs.existsSync(testDir)) {
654
+ console.warn('⚠️ Pasta "tests" não encontrada, criando...');
655
+ fs.mkdirSync(testDir, { recursive: true });
656
+ }
657
+ // Verificar configurações específicas por tipo
658
+ const resourceCheckers = {
659
+ Mobile: checkMobileResources,
660
+ API: checkApiResources,
661
+ Frontend: checkFrontendResources,
662
+ SSH: checkSSHResources,
663
+ Banco: checkBancoResources,
664
+ Scenarios: checkScenariosResources,
665
+ };
666
+ const checker = resourceCheckers[projectType];
667
+ if (checker) {
668
+ await checker(cwd);
669
+ }
670
+ console.log('✅ Verificação de recursos concluída');
671
+ }
672
+ catch (error) {
673
+ console.warn('⚠️ Erro na verificação de recursos:', error);
674
+ // Não falhar o setup por problemas de verificação
675
+ }
676
+ }
677
+ /**
678
+ * Verificações específicas para projetos API
679
+ */
680
+ function checkApiResources(cwd) {
681
+ return new Promise((resolve) => {
682
+ console.log('ℹ️ Verificando recursos para projeto API...');
683
+ // Verificar se há arquivos .env
684
+ const envFiles = ['.env', '.env.preprod', '.env.esteira1'];
685
+ const existingEnvFiles = envFiles.filter((file) => fs.existsSync(path.join(cwd, file)));
686
+ if (existingEnvFiles.length > 0) {
687
+ console.log(`✅ Arquivos .env encontrados: ${existingEnvFiles.join(', ')}`);
688
+ }
689
+ else {
690
+ console.warn('⚠️ Nenhum arquivo .env encontrado - Configure conforme necessário');
691
+ }
692
+ // Verificar estrutura de pastas típica de API
693
+ const apiDirs = ['src/statements', 'src/request', 'src/services'];
694
+ const existingDirs = apiDirs.filter((dir) => fs.existsSync(path.join(cwd, dir)));
695
+ if (existingDirs.length > 0) {
696
+ console.log(`✅ Estrutura API encontrada: ${existingDirs.join(', ')}`);
697
+ }
698
+ else {
699
+ console.log('ℹ️ Estrutura será criada conforme necessário');
700
+ }
701
+ resolve();
702
+ });
703
+ }
704
+ /**
705
+ * Verificações para outros tipos de projeto
706
+ */
707
+ function checkMobileResources(cwd) {
708
+ return new Promise((resolve) => {
709
+ console.log('ℹ️ Verificando recursos para projeto Mobile...');
710
+ const isMobileProject = detectMobileProject(cwd);
711
+ if (isMobileProject) {
712
+ checkDedicatedMobileProject(cwd);
713
+ }
714
+ else {
715
+ console.log('✅ Capacidades Mobile disponíveis via AutoCore');
716
+ }
717
+ checkMobileEnvironmentFiles(cwd);
718
+ resolve();
719
+ });
720
+ }
721
+ /**
722
+ * Detectar se é projeto mobile dedicado
723
+ */
724
+ function detectMobileProject(cwd) {
725
+ const packageJsonPath = path.join(cwd, 'package.json');
726
+ if (!fs.existsSync(packageJsonPath)) {
727
+ return false;
728
+ }
729
+ try {
730
+ const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'));
731
+ const mobileDeps = ['webdriverio', '@wdio/cli'];
732
+ const mobileScripts = ['appium:start', 'test:android', 'test:ios'];
733
+ const hasMobileDeps = mobileDeps.some((dep) => packageJson.dependencies?.[dep] || packageJson.devDependencies?.[dep]);
734
+ const hasMobileScripts = mobileScripts.some((script) => packageJson.scripts?.[script]);
735
+ return hasMobileDeps || hasMobileScripts;
736
+ }
737
+ catch {
738
+ return false;
739
+ }
740
+ }
741
+ /**
742
+ * Verificar projeto mobile dedicado
743
+ */
744
+ function checkDedicatedMobileProject(cwd) {
745
+ const wdioConfig = fs.existsSync(path.join(cwd, 'wdio.conf.ts')) ||
746
+ fs.existsSync(path.join(cwd, 'wdio.conf.js'));
747
+ if (wdioConfig) {
748
+ console.log('✅ Configuração WebdriverIO encontrada');
749
+ }
750
+ else {
751
+ console.log('ℹ️ Configuração WebdriverIO será criada quando necessário');
752
+ }
753
+ const appsDir = fs.existsSync(path.join(cwd, 'apps'));
754
+ if (appsDir) {
755
+ console.log('✅ Diretório apps/ encontrado');
756
+ }
757
+ else {
758
+ console.log('ℹ️ Diretório apps/ será criado conforme necessário');
759
+ }
760
+ }
761
+ /**
762
+ * Verificar arquivos de ambiente mobile
763
+ */
764
+ function checkMobileEnvironmentFiles(cwd) {
765
+ const mobileEnvFiles = [
766
+ '.env.preprod',
767
+ '.env.esteira1',
768
+ '.env.esteira2',
769
+ '.env.prodlike',
770
+ ].filter((file) => fs.existsSync(path.join(cwd, file))).length;
771
+ if (mobileEnvFiles > 0) {
772
+ console.log(`✅ ${mobileEnvFiles} arquivo(s) de ambiente encontrado(s)`);
773
+ }
774
+ else {
775
+ console.log('ℹ️ Arquivos de ambiente serão criados conforme necessário');
776
+ }
777
+ }
778
+ function checkFrontendResources(cwd) {
779
+ return new Promise((resolve) => {
780
+ console.log('ℹ️ Verificando recursos para projeto Frontend...');
781
+ const playwrightConfig = fs.existsSync(path.join(cwd, 'playwright.config.ts')) ||
782
+ fs.existsSync(path.join(cwd, 'playwright.config.js'));
783
+ if (playwrightConfig) {
784
+ console.log('✅ Configuração Playwright encontrada');
785
+ }
786
+ else {
787
+ console.warn('⚠️ Configuração Playwright não encontrada');
788
+ }
789
+ // Verificar estrutura típica de Frontend
790
+ const frontendDirs = ['src/pages', 'src/page-objects', 'src/attributes'];
791
+ const existingDirs = frontendDirs.filter((dir) => fs.existsSync(path.join(cwd, dir)));
792
+ if (existingDirs.length > 0) {
793
+ console.log(`✅ Estrutura Frontend encontrada: ${existingDirs.join(', ')}`);
794
+ }
795
+ else {
796
+ console.log('ℹ️ Estrutura será criada conforme necessário');
797
+ }
798
+ resolve();
799
+ });
800
+ }
801
+ function checkSSHResources(cwd) {
802
+ return new Promise((resolve) => {
803
+ console.log('ℹ️ Verificando recursos para projeto SSH...');
804
+ // Verificar estrutura típica de SSH
805
+ const sshDirs = ['src/statements', 'secrets'];
806
+ const existingDirs = sshDirs.filter((dir) => fs.existsSync(path.join(cwd, dir)));
807
+ if (existingDirs.length > 0) {
808
+ console.log(`✅ Estrutura SSH encontrada: ${existingDirs.join(', ')}`);
809
+ }
810
+ else {
811
+ console.log('ℹ️ Estrutura será criada conforme necessário');
812
+ }
813
+ // Verificar arquivos de configuração SSH
814
+ const envFiles = ['.env.preprod', '.env.esteira1', '.env.esteira2'];
815
+ const existingEnvFiles = envFiles.filter((file) => fs.existsSync(path.join(cwd, file)));
816
+ if (existingEnvFiles.length > 0) {
817
+ console.log(`✅ Configurações de ambiente: ${existingEnvFiles.join(', ')}`);
818
+ }
819
+ else {
820
+ console.log('ℹ️ Configure variáveis SSH nos arquivos .env.*');
821
+ }
822
+ resolve();
823
+ });
824
+ }
825
+ function checkBancoResources(cwd) {
826
+ return new Promise((resolve) => {
827
+ console.log('ℹ️ Verificando recursos para projeto Banco...');
828
+ // Verificar estrutura típica de Banco
829
+ const bancoDirs = ['src/models', 'src/services'];
830
+ const existingDirs = bancoDirs.filter((dir) => fs.existsSync(path.join(cwd, dir)));
831
+ if (existingDirs.length > 0) {
832
+ console.log(`✅ Estrutura Banco encontrada: ${existingDirs.join(', ')}`);
833
+ }
834
+ else {
835
+ console.log('ℹ️ Estrutura será criada conforme necessário');
836
+ }
837
+ // Verificar arquivos específicos de banco
838
+ const bancoFiles = [
839
+ 'src/models/ModelDBA.ts',
840
+ 'src/services/ServiceSiebel.ts',
841
+ ];
842
+ const existingFiles = bancoFiles.filter((file) => fs.existsSync(path.join(cwd, file)));
843
+ if (existingFiles.length > 0) {
844
+ console.log(`✅ Arquivos de banco encontrados: ${existingFiles.length}`);
845
+ }
846
+ else {
847
+ console.log('ℹ️ Arquivos de modelo e serviço serão criados conforme necessário');
848
+ }
849
+ resolve();
850
+ });
851
+ }
852
+ function checkScenariosResources(cwd) {
853
+ return new Promise((resolve) => {
854
+ console.log('ℹ️ Verificando recursos para projeto Scenarios...');
855
+ // Verificar se existem arquivos CN*.spec.ts
856
+ const testsDir = path.join(cwd, 'tests');
857
+ if (fs.existsSync(testsDir)) {
858
+ const scenarioFiles = fs
859
+ .readdirSync(testsDir)
860
+ .filter((f) => CN_SPEC_PATTERN.test(f));
861
+ if (scenarioFiles.length > 0) {
862
+ console.log(`✅ ${scenarioFiles.length} arquivo(s) de cenário encontrado(s)`);
863
+ }
864
+ else {
865
+ console.log('ℹ️ Nenhum arquivo de cenário (CN*.spec.ts) encontrado');
866
+ }
867
+ }
868
+ // Verificar configurações de ambiente
869
+ const envFiles = [
870
+ '.env.preprod',
871
+ '.env.esteira1',
872
+ '.env.esteira2',
873
+ '.env.prodlike',
874
+ ];
875
+ const existingEnvFiles = envFiles.filter((file) => fs.existsSync(path.join(cwd, file)));
876
+ if (existingEnvFiles.length > 0) {
877
+ console.log(`✅ Configurações de ambiente: ${existingEnvFiles.join(', ')}`);
878
+ }
879
+ else {
880
+ console.log('ℹ️ Configure variáveis nos arquivos .env.* conforme necessário');
881
+ }
882
+ resolve();
883
+ });
884
+ }
885
+ /**
886
+ * 🧹 Limpa screenshots web da execução anterior
887
+ */
888
+ async function cleanWebScreenshots() {
889
+ try {
890
+ const screenshotDir = path.join(process.cwd(), 'test-results', 'web-screenshots');
891
+ if (fs.existsSync(screenshotDir)) {
892
+ const files = fs.readdirSync(screenshotDir);
893
+ const imageFiles = files.filter((file) => file.endsWith('.png') ||
894
+ file.endsWith('.jpg') ||
895
+ file.endsWith('.jpeg'));
896
+ for (const file of imageFiles) {
897
+ const filePath = path.join(screenshotDir, file);
898
+ fs.unlinkSync(filePath);
899
+ }
900
+ console.log(`🧹 Limpos ${imageFiles.length} screenshot(s) web da execução anterior`);
901
+ }
902
+ else {
903
+ fs.mkdirSync(screenshotDir, { recursive: true });
904
+ console.log(`📁 Diretório de screenshots web criado: ${screenshotDir}`);
905
+ }
906
+ }
907
+ catch (error) {
908
+ console.log(`⚠️ Erro ao limpar screenshots web: ${String(error)}`);
909
+ }
910
+ }
911
+ /**
912
+ * Inicializar contextos específicos por tipo de projeto
913
+ */
914
+ async function initializeContexts(projectType) {
915
+ console.log('ℹ️ === Inicialização de Contextos ===');
916
+ try {
917
+ const contextInfo = {
918
+ API: [
919
+ '✅ Inicializando contextos para projeto API',
920
+ 'ℹ️ - ApiActions disponível para requisições HTTP',
921
+ 'ℹ️ - Validações de response automáticas',
922
+ 'ℹ️ - Cache de requisições habilitado',
923
+ ],
924
+ Frontend: [
925
+ '✅ Inicializando contextos para projeto Frontend',
926
+ 'ℹ️ - Actions disponível para automação web',
927
+ 'ℹ️ - Screenshots automáticos em falhas',
928
+ 'ℹ️ - Navegação e interação com elementos',
929
+ ],
930
+ Mobile: [
931
+ '✅ Inicializando contextos para projeto Mobile',
932
+ 'ℹ️ - MobileActions disponível para automação mobile',
933
+ 'ℹ️ - WebdriverIO configurado',
934
+ 'ℹ️ - Gestos e interações touch',
935
+ ],
936
+ SSH: [
937
+ '✅ Inicializando contextos para projeto SSH',
938
+ 'ℹ️ - SSHActions disponível para comandos remotos',
939
+ 'ℹ️ - Conexões seguras',
940
+ 'ℹ️ - Execução de scripts remotos',
941
+ ],
942
+ Banco: [
943
+ '✅ Inicializando contextos para projeto Banco',
944
+ 'ℹ️ - BancoHelper disponível para queries',
945
+ 'ℹ️ - Conexões Oracle/SQL',
946
+ 'ℹ️ - Cache de resultados',
947
+ ],
948
+ Scenarios: [
949
+ '✅ Inicializando contextos para projeto Scenarios',
950
+ 'ℹ️ - Statements disponíveis para cenários',
951
+ 'ℹ️ - Relatórios e evidências automáticas',
952
+ 'ℹ️ - Suporte a múltiplos tipos de teste',
953
+ ],
954
+ };
955
+ const messages = contextInfo[projectType] || [];
956
+ messages.forEach((message) => console.log(message));
957
+ // 🧹 Limpeza específica por tipo de projeto
958
+ if (projectType === 'Mobile') {
959
+ try {
960
+ await MobileActions.cleanMobileScreenshots();
961
+ }
962
+ catch (error) {
963
+ console.log('⚠️ Erro ao limpar screenshots mobile:', error);
964
+ }
965
+ }
966
+ // 🧹 Limpeza de screenshots Web/Frontend
967
+ if (projectType === 'Frontend' || projectType === 'Mixed') {
968
+ try {
969
+ await cleanWebScreenshots();
970
+ }
971
+ catch (error) {
972
+ console.log('⚠️ Erro ao limpar screenshots web:', error);
973
+ }
974
+ }
975
+ console.log(`📊 Sistema de relatórios unificado ativo para ${projectType}`);
976
+ console.log('ℹ️ - Logs automáticos em tempo real');
977
+ console.log('ℹ️ - Relatórios HTML visuais');
978
+ console.log('ℹ️ - Métricas e analytics integrados');
979
+ }
980
+ catch (error) {
981
+ console.warn('⚠️ Erro ao inicializar contextos:', error);
982
+ }
983
+ }
984
+ /**
985
+ * Exibir informações do sistema sem require()
986
+ */
987
+ function displaySystemInfo() {
988
+ console.log('ℹ️ === Configuração do Ambiente ===');
989
+ console.log(`ℹ️ Node.js: ${process.version}`);
990
+ console.log(`ℹ️ Sistema operacional: ${process.platform} ${process.arch}`);
991
+ const totalMemGB = Math.round(os.totalmem() / 1024 / 1024 / 1024);
992
+ const freeMemGB = Math.round(os.freemem() / 1024 / 1024 / 1024);
993
+ const heapUsed = Math.round(process.memoryUsage().heapUsed / 1024 / 1024);
994
+ const heapTotal = Math.round(process.memoryUsage().heapTotal / 1024 / 1024);
995
+ console.log(`ℹ️ Memória total: ${totalMemGB}GB`);
996
+ console.log(`ℹ️ Memória disponível: ${freeMemGB}GB`);
997
+ console.log(`ℹ️ Heap usado: ${heapUsed}MB / ${heapTotal}MB`);
998
+ console.log(`ℹ️ CPUs: ${os.cpus().length} núcleos`);
999
+ console.log(`ℹ️ Usuário: ${process.env.USERNAME || process.env.USER || 'N/A'}`);
1000
+ console.log(`ℹ️ Nome da máquina: ${os.hostname()}`);
1001
+ console.log(`ℹ️ Diretório de trabalho: ${process.cwd()}`);
1002
+ // Mostrar ambiente selecionado
1003
+ const currentEnv = process.env.ENV || process.env.NODE_ENV || 'N/A';
1004
+ console.log(`ℹ️ Ambiente selecionado: ${currentEnv}`);
1005
+ }
1006
+ /**
1007
+ * Verificar configuração do Playwright
1008
+ */
1009
+ function checkPlaywrightConfig() {
1010
+ console.log('ℹ️ === Configuração do Playwright ===');
1011
+ const cwd = process.cwd();
1012
+ const configFiles = ['playwright.config.ts', 'playwright.config.js'];
1013
+ const configFile = configFiles.find((file) => fs.existsSync(path.join(cwd, file)));
1014
+ if (configFile) {
1015
+ console.log(`✅ Configuração encontrada: ${configFile}`);
1016
+ try {
1017
+ // Tentar ler algumas configurações básicas
1018
+ const configPath = path.join(cwd, configFile);
1019
+ const configContent = fs.readFileSync(configPath, 'utf-8');
1020
+ // Extrair informações básicas via regex (simples)
1021
+ const testDirMatch = configContent.match(/testDir:\s*['"`]([^'"`]+)['"`]/);
1022
+ if (testDirMatch) {
1023
+ console.log(`ℹ️ Diretório de testes: ${testDirMatch[1]}`);
1024
+ }
1025
+ const timeoutMatch = configContent.match(/timeout:\s*(\d+)/);
1026
+ if (timeoutMatch) {
1027
+ console.log(`ℹ️ Timeout global: ${timeoutMatch[1]}ms`);
1028
+ }
1029
+ }
1030
+ catch (error) {
1031
+ console.log('ℹ️ (Não foi possível ler detalhes da configuração)');
1032
+ }
1033
+ }
1034
+ else {
1035
+ console.warn('⚠️ Nenhuma configuração do Playwright encontrada');
1036
+ }
1037
+ }