@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,365 @@
1
+ /**
2
+ * SystemsManager: Gerenciador de sistemas com IntelliSense dinâmico
3
+ * Busca sistemas do backend e cria enum dinâmico para autocomplete
4
+ */
5
+ import * as fs from 'fs';
6
+ import * as path from 'path';
7
+ import { Logger } from '../utils/Logger.js';
8
+ import { TestHubClient, } from './TestHubClient.js';
9
+ /**
10
+ * Gerenciador de sistemas com suporte a IntelliSense
11
+ */
12
+ export class SystemsManager {
13
+ static instance;
14
+ client;
15
+ selectedSystem = null;
16
+ systemsLoaded = false;
17
+ systems = [];
18
+ constructor() {
19
+ this.client = TestHubClient.getInstance();
20
+ }
21
+ /**
22
+ * Obtém instância singleton
23
+ */
24
+ static getInstance() {
25
+ if (!SystemsManager.instance) {
26
+ SystemsManager.instance = new SystemsManager();
27
+ }
28
+ return SystemsManager.instance;
29
+ }
30
+ /**
31
+ * 🚀 Inicializa o gerenciador e busca sistemas do backend
32
+ */
33
+ async initialize() {
34
+ if (this.systemsLoaded) {
35
+ return;
36
+ }
37
+ try {
38
+ this.systems = await this.client.getSystems();
39
+ this.systemsLoaded = true;
40
+ if (this.systems.length > 0) {
41
+ await this.generateSystemsEnum();
42
+ }
43
+ else {
44
+ Logger.warning('⚠️ Nenhum sistema encontrado no AutoCore Hub');
45
+ }
46
+ }
47
+ catch (error) {
48
+ Logger.error(`❌ Erro ao inicializar SystemsManager: ${error}`);
49
+ this.systemsLoaded = false;
50
+ }
51
+ }
52
+ /**
53
+ * 📝 Gera arquivo TypeScript com enum Systems para IntelliSense
54
+ *
55
+ * ESTRATÉGIA: Salva enum em .rbqa/SystemsEnum.ts no projeto consumidor
56
+ * para que possa ser importado sem modificar source files do framework
57
+ */
58
+ async generateSystemsEnum() {
59
+ try {
60
+ // Gerar conteúdo do enum
61
+ const enumContent = this.generateEnumContent();
62
+ // 🎯 Salvar em .rbqa/SystemsEnum.ts no projeto consumidor
63
+ const projectRoot = process.cwd();
64
+ const rbqaDir = path.join(projectRoot, '.rbqa');
65
+ const enumFilePath = path.join(rbqaDir, 'SystemsEnum.ts');
66
+ // Criar diretório .rbqa se não existir
67
+ if (!fs.existsSync(rbqaDir)) {
68
+ fs.mkdirSync(rbqaDir, { recursive: true });
69
+ }
70
+ // Salvar arquivo TypeScript
71
+ fs.writeFileSync(enumFilePath, enumContent.typescript);
72
+ }
73
+ catch (error) {
74
+ Logger.warning(`⚠️ Erro ao gerar enum de sistemas: ${error}`);
75
+ }
76
+ } /**
77
+ * Gera conteúdo do enum TypeScript
78
+ */
79
+ generateEnumContent() {
80
+ // Gerar lista de sistemas para documentação
81
+ const sistemasDisponiveis = this.systems.length > 0
82
+ ? this.systems
83
+ .map((s) => ` * - ${this.sanitizeEnumKey(s.name)}: ${s.description || s.name}`)
84
+ .join('\n')
85
+ : ' * (Nenhum sistema cadastrado ainda)';
86
+ const tsContent = `/**
87
+ * 🌐 Enum de Sistemas do AutoCore Hub
88
+ *
89
+ * Este arquivo é gerado automaticamente quando você executa o teste pela primeira vez.
90
+ * NÃO EDITE MANUALMENTE - será sobrescrito na próxima execução.
91
+ *
92
+ * 📅 Última atualização: ${new Date().toLocaleString('pt-BR')}
93
+ * 🔗 AutoCore Hub: http://brtlvlty0559pl:3333
94
+ * 📊 Total de sistemas: ${this.systems.length}
95
+ *
96
+ * 💡 USO:
97
+ * \`\`\`typescript
98
+ * import { Systems } from "../.rbqa/SystemsEnum"
99
+ * import { TestAnnotations } from "@silasfmartins/testhub"
100
+ *
101
+ * test("CT001", async ({}, testInfo) => {
102
+ * TestAnnotations.Api.testInfo = testInfo
103
+ * await TestAnnotations.setSystem(Systems.NOME_SISTEMA)
104
+ * })
105
+ * \`\`\`
106
+ *
107
+ * 🎯 SISTEMAS DISPONÍVEIS:
108
+ ${sistemasDisponiveis}
109
+ */
110
+
111
+ export enum Systems {
112
+ ${this.systems.length > 0
113
+ ? this.systems
114
+ .map((system) => {
115
+ const enumKey = this.sanitizeEnumKey(system.name);
116
+ const description = system.description || system.name;
117
+ return ` /**\n * ${description}\n * Nome original: "${system.name}"\n */\n ${enumKey} = "${system.name}"`;
118
+ })
119
+ .join(',\n\n')
120
+ : ' // Nenhum sistema cadastrado no AutoCore Hub ainda\n // Execute o teste novamente após cadastrar sistemas'}
121
+ }
122
+
123
+ export default Systems
124
+ `;
125
+ return { typescript: tsContent };
126
+ }
127
+ /**
128
+ * Sanitiza nome do sistema para usar como chave de enum
129
+ * IMPORTANTE: Preserva o formato original se já for válido (ex: AUTENTICA_IN_HML)
130
+ */
131
+ sanitizeEnumKey(systemName) {
132
+ // Se o nome já está em UPPERCASE com underscores válidos, mantém como está
133
+ if (/^[A-Z0-9_]+$/.test(systemName)) {
134
+ return systemName;
135
+ }
136
+ // Caso contrário, converte
137
+ return systemName
138
+ .toUpperCase()
139
+ .replace(/[^A-Z0-9_]/g, '_')
140
+ .replace(/_{2,}/g, '_')
141
+ .replace(/^_|_$/g, '');
142
+ }
143
+ /**
144
+ * 🎯 Seleciona um sistema para uso nos testes
145
+ * @param systemName Nome do sistema
146
+ * @param environmentName Nome do ambiente (ex: 'preprod', 'esteira1')
147
+ * @param projectType Tipo de projeto (API, Frontend, etc) para filtrar ambientes
148
+ */
149
+ async selectSystem(systemName, environmentName, projectType) {
150
+ if (!this.systemsLoaded) {
151
+ await this.initialize();
152
+ }
153
+ // Buscar sistema
154
+ const system = await this.client.getSystemByName(systemName);
155
+ if (!system) {
156
+ throw new Error(`❌ Sistema "${systemName}" não encontrado no TestHub. Sistemas disponíveis: ${this.systems.map((s) => s.name).join(', ')}`);
157
+ }
158
+ // Determinar ambiente (usar NODE_ENV ou ENV)
159
+ const envName = environmentName || process.env.NODE_ENV || process.env.ENV || 'preprod';
160
+ Logger.info(`🔍 Buscando ambiente: "${envName}" (NODE_ENV: ${process.env.NODE_ENV}, ENV: ${process.env.ENV})`);
161
+ // ⚠️ NOTA: O backend não retorna o tipo do sistema (API, WEB, SSH, etc.)
162
+ // Portanto, NÃO filtramos por tipo - todos os ambientes estão disponíveis
163
+ // O tipo é usado apenas para informação, não para validação
164
+ let availableEnvironments = system.environments;
165
+ if (projectType) {
166
+ // Log informativo apenas - não filtra mais por tipo
167
+ Logger.info(` 📌 Tipo de projeto: ${projectType}`);
168
+ }
169
+ availableEnvironments.forEach((env) => {
170
+ Logger.info(` - ${env.name}: ${env.url ? '***' : '(sem URL)'}`);
171
+ });
172
+ // Buscar ambiente específico pelo NOME (case-insensitive)
173
+ let environment = availableEnvironments.find((env) => env.name.toLowerCase() === envName.toLowerCase());
174
+ // Se não encontrou, pegar o primeiro ambiente disponível
175
+ if (!environment) {
176
+ environment = availableEnvironments[0];
177
+ Logger.warning(`⚠️ Ambiente "${envName}" não encontrado. Usando: ${environment.name}`);
178
+ }
179
+ this.selectedSystem = {
180
+ name: systemName,
181
+ system,
182
+ environment,
183
+ environmentName: environment.name,
184
+ };
185
+ return this.selectedSystem;
186
+ }
187
+ /**
188
+ * Obtém sistema selecionado atual
189
+ */
190
+ getSelectedSystem() {
191
+ return this.selectedSystem;
192
+ }
193
+ /**
194
+ * Verifica se um sistema foi selecionado
195
+ */
196
+ hasSystemSelected() {
197
+ return this.selectedSystem !== null;
198
+ }
199
+ /**
200
+ * Valida se sistema foi selecionado (lança erro se não)
201
+ */
202
+ validateSystemSelected() {
203
+ if (!this.hasSystemSelected()) {
204
+ throw new Error(`
205
+ ❌ SISTEMA NÃO CONFIGURADO
206
+
207
+ Você precisa selecionar um sistema antes de executar os testes.
208
+
209
+ Adicione no início do seu teste:
210
+
211
+ import { Systems, TestAnnotations } from '@silasfmartins/testhub'
212
+
213
+ test.describe("Meu Cenário", () => {
214
+ test("Meu Teste", async ({}, testInfo) => {
215
+ TestAnnotations.Api.testInfo = testInfo
216
+ TestAnnotations.setSystem(Systems.NOME_DO_SISTEMA) // 👈 OBRIGATÓRIO
217
+
218
+ // ... seu teste aqui
219
+ })
220
+ })
221
+
222
+ Sistemas disponíveis: ${this.systems.map((s) => s.name).join(', ')}
223
+ `);
224
+ }
225
+ }
226
+ /**
227
+ * Lista todos os sistemas disponíveis
228
+ */
229
+ async listSystems() {
230
+ if (!this.systemsLoaded) {
231
+ await this.initialize();
232
+ }
233
+ return this.systems;
234
+ }
235
+ /**
236
+ * Lista sistemas por tipo
237
+ */
238
+ async listSystemsByType(type) {
239
+ if (!this.systemsLoaded) {
240
+ await this.initialize();
241
+ }
242
+ return this.systems.filter((system) => system.environments.some((env) => env.type === type));
243
+ }
244
+ /**
245
+ * Limpa seleção atual
246
+ */
247
+ clearSelection() {
248
+ this.selectedSystem = null;
249
+ }
250
+ /**
251
+ * Recarrega sistemas do backend (força atualização)
252
+ */
253
+ async reload() {
254
+ this.client.clearCache();
255
+ this.systemsLoaded = false;
256
+ await this.initialize();
257
+ }
258
+ /**
259
+ * Obtém configuração do sistema selecionado (para injeção automática)
260
+ */
261
+ getSystemConfig() {
262
+ if (!this.selectedSystem) {
263
+ return null;
264
+ }
265
+ const env = this.selectedSystem.environment;
266
+ return {
267
+ baseUrl: env.url,
268
+ username: env.username,
269
+ password: env.password,
270
+ host: env.url.replace(/^https?:\/\//, ''), // Remove protocolo para SSH/Banco
271
+ port: env.port,
272
+ serviceName: env.serviceName,
273
+ privateKeyPath: env.privateKeyPath,
274
+ };
275
+ }
276
+ }
277
+ /**
278
+ * 🌐 Enum Systems com Lazy Loading
279
+ *
280
+ * Este enum é populado dinamicamente quando você usa TestAnnotations.setSystem()
281
+ * pela primeira vez. Ele carrega os sistemas do AutoCore Hub automaticamente.
282
+ *
283
+ * ✅ USO RECOMENDADO:
284
+ *
285
+ * import { TestAnnotations, Systems } from "@silasfmartins/testhub"
286
+ *
287
+ * test("Meu teste", async ({}, testInfo) => {
288
+ * TestAnnotations.Api.testInfo = testInfo
289
+ *
290
+ * // Opção 1: String direta (sempre funciona)
291
+ * await TestAnnotations.setSystem("AUTENTICA_IN_HML")
292
+ *
293
+ * // Opção 2: Enum (após primeira execução)
294
+ * await TestAnnotations.setSystem(Systems.AUTENTICA_IN_HML)
295
+ * })
296
+ *
297
+ * 💡 O enum Systems é populado automaticamente na primeira chamada de setSystem()
298
+ */
299
+ // Proxy que carrega sistemas dinamicamente
300
+ export const Systems = new Proxy({}, {
301
+ get(target, prop) {
302
+ // Se já existe no cache, retorna
303
+ if (prop in target) {
304
+ return target[prop];
305
+ }
306
+ // Se é uma propriedade especial do JavaScript, retorna undefined
307
+ if (typeof prop === 'symbol' ||
308
+ prop === 'then' ||
309
+ prop === 'constructor' ||
310
+ prop === 'prototype') {
311
+ return undefined;
312
+ }
313
+ // Tentar carregar do enum gerado
314
+ try {
315
+ const projectRoot = process.cwd();
316
+ const enumFilePath = path.join(projectRoot, '.rbqa', 'SystemsEnum.ts');
317
+ if (fs.existsSync(enumFilePath)) {
318
+ const content = fs.readFileSync(enumFilePath, 'utf-8');
319
+ const match = content.match(new RegExp(`${prop}\\s*=\\s*"([^"]+)"`));
320
+ if (match) {
321
+ target[prop] = match[1];
322
+ return match[1];
323
+ }
324
+ }
325
+ }
326
+ catch (error) {
327
+ // Ignorar erro silenciosamente
328
+ }
329
+ // Retornar o próprio nome como valor (ex: Systems.AUTENTICA_IN_HML = "AUTENTICA_IN_HML")
330
+ target[prop] = prop;
331
+ return prop;
332
+ },
333
+ // Permitir iteração sobre as propriedades
334
+ ownKeys(target) {
335
+ try {
336
+ const projectRoot = process.cwd();
337
+ const enumFilePath = path.join(projectRoot, '.rbqa', 'SystemsEnum.ts');
338
+ if (fs.existsSync(enumFilePath)) {
339
+ const content = fs.readFileSync(enumFilePath, 'utf-8');
340
+ const matches = content.matchAll(/(\w+)\s*=\s*"([^"]+)"/g);
341
+ const keys = [];
342
+ for (const match of matches) {
343
+ keys.push(match[1]);
344
+ target[match[1]] = match[2];
345
+ }
346
+ return keys;
347
+ }
348
+ }
349
+ catch (error) {
350
+ // Ignorar erro
351
+ }
352
+ return Object.keys(target);
353
+ },
354
+ getOwnPropertyDescriptor(target, prop) {
355
+ if (typeof prop === 'symbol') {
356
+ return undefined;
357
+ }
358
+ return {
359
+ enumerable: true,
360
+ configurable: true,
361
+ value: target[prop] || prop,
362
+ };
363
+ },
364
+ });
365
+ export default SystemsManager;
@@ -0,0 +1,335 @@
1
+ /**
2
+ * TestHubClient: Cliente HTTP para comunicação com o backend TestHub
3
+ * Responsável por buscar sistemas e enviar resultados de execução
4
+ *
5
+ * NOTA: Usa fetch nativo do Node.js (sem axios) para evitar problemas com proxy corporativo
6
+ */
7
+ /**
8
+ * Variável de ambiente do sistema
9
+ */
10
+ export interface EnvironmentVariable {
11
+ id: string;
12
+ key: string;
13
+ value: string;
14
+ }
15
+ /**
16
+ * Sistema retornado pelo backend
17
+ */
18
+ export interface TestHubSystem {
19
+ id: string;
20
+ name: string;
21
+ description: string;
22
+ url: string;
23
+ type?: string;
24
+ status?: string;
25
+ isActive?: boolean;
26
+ sidService?: string;
27
+ environments: TestHubEnvironment[];
28
+ }
29
+ /**
30
+ * Ambiente de um sistema (DEV, HML, PROD, etc)
31
+ */
32
+ export interface TestHubEnvironment {
33
+ id: string;
34
+ name: string;
35
+ type: string;
36
+ url: string;
37
+ port?: string;
38
+ username?: string;
39
+ password?: string;
40
+ serviceName?: string;
41
+ privateKeyPath?: string;
42
+ variables?: EnvironmentVariable[];
43
+ frameworkVariables?: Record<string, string>;
44
+ requiredFrameworkVariables?: string[];
45
+ credentials?: {
46
+ id: string;
47
+ label: string;
48
+ suffix?: string | null;
49
+ description?: string | null;
50
+ url?: string | null;
51
+ port?: string | null;
52
+ service?: string | null;
53
+ username?: string | null;
54
+ password?: string | null;
55
+ isDefault?: boolean;
56
+ isActive?: boolean;
57
+ displayOrder?: number;
58
+ }[];
59
+ isPrivate?: boolean;
60
+ privateMembers?: {
61
+ userId: string;
62
+ canManage?: boolean;
63
+ }[];
64
+ }
65
+ /**
66
+ * Informações de um CT individual
67
+ */
68
+ export interface CTInfo {
69
+ ctNome: string;
70
+ status: 'sucesso' | 'erro' | 'pulado';
71
+ tempoExecucao: number;
72
+ erro?: string;
73
+ logs?: string;
74
+ linhaErro?: number;
75
+ screenshots?: string[];
76
+ }
77
+ /**
78
+ * Payload de execução de CN com lista de CTs
79
+ * NOTA: matricula e email agora são enviados via headers (x-automation-user-matricula e x-automation-user-email)
80
+ */
81
+ export interface TestExecutionPayload {
82
+ cenarioNome: string;
83
+ sistemaNome: string;
84
+ repositorio?: string;
85
+ ambiente: 'LOCAL' | 'AZURE';
86
+ status: 'sucesso' | 'erro' | 'pulado';
87
+ tempoExecucao: number;
88
+ totalCTs: number;
89
+ ctsPassados: number;
90
+ ctsFalhados: number;
91
+ ctsPulados: number;
92
+ cts: CTInfo[];
93
+ erro?: string;
94
+ logs?: string;
95
+ }
96
+ /**
97
+ * Payload para execução de cenário no AutoCore Hub
98
+ */
99
+ export interface ScenarioExecutionPayload {
100
+ cenarioNome: string;
101
+ cenarioId?: string;
102
+ sistemaNome?: string;
103
+ repositorio?: string;
104
+ ambiente: 'LOCAL' | 'AZURE';
105
+ status?: 'executando' | 'sucesso' | 'erro' | 'cancelado';
106
+ tempoExecucao?: number;
107
+ sistemaId?: string;
108
+ parametros?: string;
109
+ resultado?: string;
110
+ erro?: string;
111
+ logs?: string;
112
+ linhaErro?: number;
113
+ ctErro?: string;
114
+ cnE1Erro?: string;
115
+ nomeCenarioCt?: string;
116
+ testeEspecificoErro?: string;
117
+ screenshots?: string[];
118
+ evidencias?: string;
119
+ }
120
+ /**
121
+ * Usuário retornado pelo AutoCore Hub
122
+ */
123
+ export interface HubUser {
124
+ id: string;
125
+ name: string;
126
+ email: string;
127
+ matricula: string;
128
+ role: string;
129
+ diretoria?: string;
130
+ equipe?: string;
131
+ }
132
+ /**
133
+ * Configuração do cliente TestHub
134
+ */
135
+ export interface TestHubConfig {
136
+ baseUrl: string;
137
+ timeout?: number;
138
+ retries?: number;
139
+ cacheEnabled?: boolean;
140
+ cacheDuration?: number;
141
+ }
142
+ /**
143
+ * Cliente para comunicação com backend TestHub
144
+ * Usa fetch nativo do Node.js para evitar problemas com proxy corporativo
145
+ */
146
+ export declare class TestHubClient {
147
+ private static instance;
148
+ private config;
149
+ private systemsCache;
150
+ private cacheFilePath;
151
+ private cachedUserId;
152
+ private cachedAuthToken;
153
+ private cachedAuthTokenExpiry;
154
+ private hubApiUrl;
155
+ private constructor();
156
+ /**
157
+ * Obtém instância singleton do cliente
158
+ */
159
+ static getInstance(config?: Partial<TestHubConfig>): TestHubClient;
160
+ /**
161
+ * Constrói headers padrão para requisições ao AutoCore Hub
162
+ * - Windows local: x-automation-user-matricula (USERNAME)
163
+ * - Linux/Azure: x-automation-user-email (email do pipeline)
164
+ * REGRA: Cada ambiente manda apenas o que tem disponível
165
+ */
166
+ private buildHeaders;
167
+ /**
168
+ * Faz uma requisição GET com retry e fallback de URL
169
+ */
170
+ private fetchGet;
171
+ /**
172
+ * Faz uma requisição POST com retry
173
+ */
174
+ private fetchPost;
175
+ /**
176
+ * 📡 Busca lista de sistemas do backend
177
+ * @returns Lista de sistemas cadastrados
178
+ */
179
+ getSystems(): Promise<TestHubSystem[]>;
180
+ /**
181
+ * 📤 Envia resultado de execução em batch para o backend
182
+ * @param batchPayload Dados completos da execução (batch)
183
+ * @returns IDs das execuções criadas
184
+ */
185
+ sendBatchExecution(batchPayload: any): Promise<string[]>;
186
+ /**
187
+ * 📦 Envia artifacts (relatórios compactados em Base64) para o backend
188
+ * @param artifactsPayload Dados dos artifacts
189
+ */
190
+ sendArtifacts(artifactsPayload: any): Promise<void>;
191
+ /**
192
+ * 🔍 Busca sistema por nome
193
+ * @param systemName Nome do sistema
194
+ * @returns Sistema encontrado ou null
195
+ */
196
+ getSystemByName(systemName: string): Promise<TestHubSystem | null>;
197
+ /**
198
+ * 🔍 Busca sistemas por tipo de ambiente
199
+ * @param type Tipo de ambiente (API, WEB, SSH, BANCO)
200
+ * @returns Lista de sistemas filtrados
201
+ */
202
+ getSystemsByType(type: TestHubEnvironment['type']): Promise<TestHubSystem[]>;
203
+ /**
204
+ * 🔍 Busca ambiente específico de um sistema
205
+ * @param systemName Nome do sistema
206
+ * @param environmentName Nome do ambiente (ex: 'preprod', 'esteira1')
207
+ * @returns Ambiente encontrado ou null
208
+ */
209
+ getEnvironment(systemName: string, environmentName: string): Promise<TestHubEnvironment | null>;
210
+ /**
211
+ * 🔑 Busca todas as variáveis de ambiente de um sistema/ambiente específico
212
+ * Inclui automaticamente campos do ambiente como variáveis:
213
+ * - URL, USERNAME, PASSWORD, PORT
214
+ * @param systemName Nome do sistema
215
+ * @param environmentName Nome do ambiente (ex: 'Prod', 'Homolog')
216
+ * @returns Array de variáveis ou array vazio
217
+ */
218
+ getEnvironmentVariables(systemName: string, environmentName: string): Promise<EnvironmentVariable[]>;
219
+ /**
220
+ * Obtém token JWT do AutoCore Hub e faz cache com expiry simples.
221
+ */
222
+ private getAuthToken;
223
+ /**
224
+ * Retorna um mapa de variáveis final para execução escolhendo credencial com sufixo quando informado.
225
+ * - Sufixo nulo => usa chaves padrão (URL, USERNAME...)
226
+ * - Sufixo 'PARCEIRO' => prefere URL_PARCEIRO etc, mas faz fallback para padrão quando ausente
227
+ */
228
+ getFrameworkVariablesForExecution(systemName: string, environmentName: string, credentialSuffix?: string | null): Promise<Record<string, string>>;
229
+ /**
230
+ * Retorna os sufixos de credenciais disponíveis para um ambiente (inclui null/default)
231
+ */
232
+ getAvailableCredentialSuffixes(systemName: string, environmentName: string): Promise<(string | null)[]>;
233
+ /**
234
+ * Constrói um conjunto de credenciais (URL/PORT/SERVICE/USERNAME/PASSWORD) a partir do mapa de framework vars
235
+ */
236
+ getCredentialSetFromVars(vars: Record<string, string>, suffix?: string | null): {
237
+ url: string;
238
+ port: string;
239
+ service: string;
240
+ username: string;
241
+ password: string;
242
+ };
243
+ /**
244
+ * Retorna o conjunto de credenciais efetivo para execução, escolhendo por sufixo ou fallback
245
+ */
246
+ getCredentialSetForEnvironment(systemName: string, environmentName: string, requestedSuffix?: string | null): Promise<{
247
+ suffix: string | null;
248
+ credentialSet: {
249
+ url: string;
250
+ port: string;
251
+ service: string;
252
+ username: string;
253
+ password: string;
254
+ };
255
+ }>;
256
+ /**
257
+ * Resolve um valor possivelmente placeholder usando as frameworkVariables ou credentials do ambiente.
258
+ * - Se `input` for uma chave (ex: "USERNAME", "ADB_VENDA") tenta buscar em frameworkVariables
259
+ * - Se for uma das chaves base (USERNAME/PASSWORD/URL/PORT/SERVICE) e não existir como variável, usa o credentialSet
260
+ * - Caso contrário retorna `input` inalterado
261
+ */
262
+ resolveFrameworkValue(systemName: string, environmentName: string, input: string | undefined | null, credentialSuffix?: string | null): Promise<string | null>;
263
+ /**
264
+ * 🔍 Busca uma variável específica por chave
265
+ * @param systemName Nome do sistema
266
+ * @param environmentName Nome do ambiente
267
+ * @param variableKey Chave da variável (ex: 'BASE_URL', 'API_TOKEN')
268
+ * @returns Valor da variável ou null se não encontrada
269
+ */
270
+ getEnvironmentVariable(systemName: string, environmentName: string, variableKey: string): Promise<string | null>;
271
+ /**
272
+ * 🌍 Carrega todas as variáveis de um ambiente como variáveis de ambiente do processo
273
+ * @param systemName Nome do sistema
274
+ * @param environmentName Nome do ambiente
275
+ * @param prefix Prefixo opcional para as variáveis (ex: 'AUTOCORE_')
276
+ * @returns Número de variáveis carregadas
277
+ */
278
+ loadEnvironmentVariables(systemName: string, environmentName: string, prefix?: string): Promise<number>;
279
+ /**
280
+ * 📝 Retorna todas as variáveis como um objeto chave-valor
281
+ * @param systemName Nome do sistema
282
+ * @param environmentName Nome do ambiente
283
+ * @returns Objeto com chave-valor das variáveis
284
+ */
285
+ getVariablesAsObject(systemName: string, environmentName: string): Promise<Record<string, string>>;
286
+ /**
287
+ * Verifica se o cache é válido
288
+ */
289
+ private isCacheValid;
290
+ /**
291
+ * Salva sistemas no cache em memória e arquivo
292
+ */
293
+ private saveSystemsToCache;
294
+ /**
295
+ * Carrega sistemas do cache em arquivo
296
+ */
297
+ private loadSystemsFromFileCache;
298
+ /**
299
+ * Salva execução que falhou para retry posterior
300
+ */
301
+ private saveFailedBatchExecution;
302
+ /**
303
+ * Limpa cache de sistemas
304
+ */
305
+ clearCache(): void;
306
+ /**
307
+ * Testa conectividade com o backend
308
+ */
309
+ testConnection(): Promise<boolean>;
310
+ /**
311
+ * Converte sistemas do AutoCore Hub para formato TestHub
312
+ */
313
+ private convertHubSystemsToTestHub;
314
+ /**
315
+ * Obtém User ID do AutoCore Hub (com autenticação automática)
316
+ */
317
+ getUserId(): Promise<string>;
318
+ /**
319
+ * Detecta ambiente de execução e obtém identificador do usuário
320
+ */
321
+ private getUserIdentifier;
322
+ /**
323
+ * Obtém email do usuário via Azure DevOps REST API
324
+ */
325
+ private getAzureUserEmailFromAPI;
326
+ /**
327
+ * Envia execução de cenário para o AutoCore Hub
328
+ */
329
+ sendScenarioExecution(payload: ScenarioExecutionPayload): Promise<string>;
330
+ /**
331
+ * Salva execução de cenário falhada para retry posterior
332
+ */
333
+ private saveFailedScenarioExecution;
334
+ }
335
+ export default TestHubClient;