@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,768 @@
1
+ // @ts-nocheck
2
+ import fs from 'node:fs';
3
+ import { execSync } from 'child_process';
4
+ import path from 'path';
5
+ import { fileURLToPath } from 'url';
6
+ // ✅ ESM Compatibility: Define __dirname for ES modules
7
+ const __filename = fileURLToPath(import.meta.url);
8
+ const __dirname = path.dirname(__filename);
9
+ /**
10
+ * Busca as versões mais atuais das dependências
11
+ */
12
+ export async function getLatestVersions() {
13
+ try {
14
+ console.log('🔍 Verificando versões mais recentes...');
15
+ // Lista de pacotes base que sempre usamos
16
+ const baseDependencies = [
17
+ '@silasfmartins/testhub',
18
+ 'cross-env',
19
+ 'dotenv',
20
+ 'tsx',
21
+ ];
22
+ const baseDevDependencies = [
23
+ '@biomejs/biome',
24
+ '@playwright/test',
25
+ '@vitest/coverage-v8',
26
+ 'typescript',
27
+ 'ultracite',
28
+ 'vitest',
29
+ ];
30
+ // Buscar versões mais recentes via npm view
31
+ const getLatestVersion = (packageName) => {
32
+ try {
33
+ const result = execSync(`npm view ${packageName} version`, {
34
+ encoding: 'utf8',
35
+ });
36
+ return `^${result.trim()}`;
37
+ }
38
+ catch (error) {
39
+ console.warn(`⚠️ Erro ao buscar versão de ${packageName}, usando fallback`);
40
+ return getVersionFallback(packageName);
41
+ }
42
+ };
43
+ // Versões de fallback caso npm view falhe
44
+ const getVersionFallback = (packageName) => {
45
+ const fallbacks = {
46
+ '@silasfmartins/testhub': '^1.0.90',
47
+ 'cross-env': '^7.0.3',
48
+ '@biomejs/biome': '2.0.6',
49
+ tsx: '^4.20.3',
50
+ '@playwright/test': '^1.53.2',
51
+ '@vitest/coverage-v8': '^3.2.4',
52
+ '@vitest/ui': '^3.2.4',
53
+ 'happy-dom': '^18.0.1',
54
+ typescript: '^5.8.3',
55
+ ultracite: '5.0.32',
56
+ vitest: '^3.2.4',
57
+ };
58
+ return fallbacks[packageName] || '^1.0.0';
59
+ };
60
+ const dependencies = {};
61
+ const devDependencies = {};
62
+ // Buscar versões das dependências
63
+ for (const pkg of baseDependencies) {
64
+ dependencies[pkg] = getLatestVersion(pkg);
65
+ console.log(` ✓ ${pkg}: ${dependencies[pkg]}`);
66
+ }
67
+ // Buscar versões das devDependencies
68
+ for (const pkg of baseDevDependencies) {
69
+ devDependencies[pkg] = getLatestVersion(pkg);
70
+ console.log(` ✓ ${pkg}: ${devDependencies[pkg]}`);
71
+ }
72
+ console.log('✅ Versões atualizadas obtidas com sucesso');
73
+ return {
74
+ dependencies,
75
+ devDependencies,
76
+ };
77
+ }
78
+ catch (error) {
79
+ console.warn('⚠️ Erro ao buscar versões, usando fallbacks');
80
+ // Retornar versões de fallback
81
+ return {
82
+ dependencies: {
83
+ '@silasfmartins/testhub': '^2.0.0',
84
+ 'cross-env': '^10.1.0'
85
+ },
86
+ devDependencies: {
87
+ '@biomejs/biome': '2.2.5',
88
+ tsx: '^4.20.5',
89
+ '@playwright/test': '^1.56.0',
90
+ typescript: '^5.9.3',
91
+ ultracite: '5.6.1',
92
+ },
93
+ };
94
+ }
95
+ }
96
+ /**
97
+ * ✅ NOVO - Lê o vitest.config.ts do projeto AutoCore para manter consistência
98
+ */
99
+ export function getAutocoreVitestConfig() {
100
+ try {
101
+ // Obter caminho do arquivo atual
102
+ const currentDir = path.dirname(fileURLToPath(import.meta.url));
103
+ // Navegar para o diretório raiz do projeto
104
+ // Se estivermos em dist/scripts/, subir 2 níveis; se em scripts/, subir 1 nível
105
+ const autocoreRoot = currentDir.includes('dist')
106
+ ? path.resolve(currentDir, '..', '..') // dist/scripts/ -> raiz
107
+ : path.resolve(currentDir, '..'); // scripts/ -> raiz
108
+ const vitestConfigPath = path.join(autocoreRoot, 'vitest.config.ts');
109
+ console.log(`🔍 Procurando vitest.config.ts em: ${vitestConfigPath}`);
110
+ if (fs.existsSync(vitestConfigPath)) {
111
+ const vitestConfigContent = fs.readFileSync(vitestConfigPath, 'utf8');
112
+ // Parse simples extraindo a configuração do defineConfig
113
+ // Removemos imports e export e mantemos só a configuração
114
+ const configMatch = vitestConfigContent.match(/defineConfig\(([\s\S]*)\)/m);
115
+ if (configMatch) {
116
+ // Parseando manualmente para manter comentários e estrutura
117
+ const configStr = configMatch[1];
118
+ // Estrutura base similar ao que temos no AutoCore
119
+ const baseConfig = {
120
+ test: {
121
+ globals: false, // Sempre false para evitar conflitos Jest/Vitest
122
+ environment: 'node',
123
+ setupFiles: ['./tests/unit/setup.ts'],
124
+ include: ['tests/**/*.test.ts', 'src/**/*.test.ts'],
125
+ coverage: {
126
+ provider: 'v8',
127
+ reporter: ['text', 'html', 'lcov'],
128
+ include: ['src/**/*.ts'],
129
+ exclude: [
130
+ 'tests/**',
131
+ 'node_modules/',
132
+ 'dist/',
133
+ '**/*.d.ts',
134
+ '**/*.config.ts',
135
+ ],
136
+ },
137
+ },
138
+ };
139
+ console.log('✅ vitest.config.ts do AutoCore carregado com sucesso');
140
+ return baseConfig;
141
+ }
142
+ }
143
+ console.warn('⚠️ vitest.config.ts do AutoCore não encontrado, usando configuração padrão');
144
+ return getDefaultVitestConfig();
145
+ }
146
+ catch (error) {
147
+ console.warn(`⚠️ Erro ao ler vitest.config.ts do AutoCore: ${error}, usando configuração padrão`);
148
+ return getDefaultVitestConfig();
149
+ }
150
+ }
151
+ /**
152
+ * ✅ NOVO - Configuração padrão de fallback para vitest.config.ts
153
+ */
154
+ function getDefaultVitestConfig() {
155
+ return {
156
+ test: {
157
+ // Default safe config
158
+ globals: false,
159
+ environment: 'node',
160
+ setupFiles: ['./tests/unit/setup.ts'],
161
+ include: ['tests/**/*.test.ts', 'src/**/*.test.ts'],
162
+ coverage: {
163
+ provider: 'v8',
164
+ reporter: ['text', 'html', 'lcov'],
165
+ include: ['src/**/*.ts'],
166
+ exclude: [
167
+ 'tests/**',
168
+ 'node_modules/',
169
+ 'dist/',
170
+ '**/*.d.ts',
171
+ '**/*.config.ts',
172
+ '**/coverage/**',
173
+ ],
174
+ },
175
+ },
176
+ };
177
+ }
178
+ /**
179
+ * ✅ NOVO - Gera vitest.config.ts para projeto consumidor
180
+ */
181
+ export function generateVitestConfigForProject(projectType) {
182
+ const baseVitestConfig = getAutocoreVitestConfig();
183
+ // Personaliza configuração baseada no tipo de projeto
184
+ const projectVitestConfig = {
185
+ ...baseVitestConfig,
186
+ test: {
187
+ ...baseVitestConfig.test,
188
+ // Ajustes específicos por tipo de projeto
189
+ ...(projectType === 'scenarios' && {
190
+ // Para cenários, incluir coverage mais abrangente
191
+ coverage: {
192
+ ...baseVitestConfig.test.coverage,
193
+ include: ['src/**/*.ts', 'tests/helpers/**/*.ts'],
194
+ reporter: ['text', 'html', 'lcov', 'json'],
195
+ },
196
+ }),
197
+ ...(projectType === 'api' && {
198
+ // Para API, incluir testes de integração
199
+ include: [
200
+ 'tests/**/*.test.ts',
201
+ 'src/**/*.test.ts',
202
+ 'tests/**/*.integration.test.ts',
203
+ ],
204
+ }),
205
+ },
206
+ };
207
+ console.log(`✅ vitest.config.ts gerado para projeto ${projectType} (sincronizado com AutoCore)`);
208
+ return projectVitestConfig;
209
+ }
210
+ /**
211
+ * ✅ NOVO - Gera vitest.config.ts como string TypeScript (IGUAL AO AUTOCORE)
212
+ */
213
+ export function generateVitestConfigString(projectType) {
214
+ // 🔧 Configuração otimizada para evitar conflitos Jest/Vitest/Playwright
215
+ return `import { defineConfig } from 'vitest/config'
216
+
217
+ export default defineConfig({
218
+ test: {
219
+ // ✅ CRÍTICO: globals: false evita conflitos com Jest/Playwright
220
+ globals: false,
221
+ environment: 'node',
222
+
223
+ // ✅ Jest-safe setup para resolver conflitos de símbolos
224
+ setupFiles: [
225
+ '@silasfmartins/testhub/jest-safe', // ← Deve ser PRIMEIRO
226
+ './tests/unit/setup.ts'
227
+ ],
228
+
229
+ // 🎯 CRÍTICO: Apenas .test.ts para evitar conflito com Playwright .spec.ts
230
+ include: ['tests/**/*.test.ts'],
231
+
232
+ // 🔧 Excluir arquivos que podem causar conflito
233
+ exclude: [
234
+ 'node_modules/**',
235
+ 'dist/**',
236
+ '.git/**',
237
+ 'coverage/**',
238
+ 'playwright-report/**',
239
+ 'test-results/**',
240
+ '**/*.spec.ts', // ← EXCLUIR .spec.ts (são do Playwright)
241
+ 'tests/e2e/**' // ← EXCLUIR testes E2E (são do Playwright)
242
+ ],
243
+
244
+ // ✅ Configurações de isolamento para evitar conflitos de símbolos
245
+ isolate: true,
246
+ pool: 'forks', // Forks em vez de threads
247
+
248
+ // ✅ Execução sequencial para evitar race conditions
249
+ sequence: {
250
+ concurrent: false,
251
+ shuffle: false
252
+ },
253
+
254
+ // ✅ Worker único para evitar conflitos de Symbol registry
255
+ maxWorkers: 1,
256
+ retry: 0,
257
+ testTimeout: 30_000,
258
+ hookTimeout: 10_000,
259
+
260
+ coverage: {
261
+ provider: 'v8',
262
+ reporter: ['text', 'html', 'lcov'],
263
+ include: ['src/**/*.ts'],
264
+ exclude: [
265
+ 'tests/**',
266
+ 'src/**/*.d.ts',
267
+ 'src/**/*.test.ts',
268
+ 'src/**/*.spec.ts'
269
+ ],
270
+ },
271
+ },
272
+ esbuild: {
273
+ target: 'node24'
274
+ }
275
+ })
276
+ `;
277
+ }
278
+ /**
279
+ * Lê o tsconfig.json do projeto AutoCore para manter consistência
280
+ */
281
+ export function getAutocoreTsConfig() {
282
+ try {
283
+ // Obter caminho do arquivo atual
284
+ const currentDir = path.dirname(fileURLToPath(import.meta.url));
285
+ // Navegar para o diretório raiz do projeto
286
+ // Se estivermos em dist/scripts/, subir 2 níveis; se em scripts/, subir 1 nível
287
+ const autocoreRoot = currentDir.includes('dist')
288
+ ? path.resolve(currentDir, '..', '..') // dist/scripts/ -> raiz
289
+ : path.resolve(currentDir, '..'); // scripts/ -> raiz
290
+ const tsconfigPath = path.join(autocoreRoot, 'tsconfig.json');
291
+ console.log(`🔍 Procurando tsconfig.json em: ${tsconfigPath}`);
292
+ if (fs.existsSync(tsconfigPath)) {
293
+ const tsconfigContent = fs.readFileSync(tsconfigPath, 'utf8');
294
+ const tsconfig = JSON.parse(tsconfigContent);
295
+ console.log('✅ tsconfig.json do AutoCore carregado com sucesso');
296
+ return tsconfig;
297
+ }
298
+ console.warn('⚠️ tsconfig.json do AutoCore não encontrado, usando configuração padrão');
299
+ return getDefaultTsConfig();
300
+ }
301
+ catch (error) {
302
+ console.warn(`⚠️ Erro ao ler tsconfig.json do AutoCore: ${error}, usando configuração padrão`);
303
+ return getDefaultTsConfig();
304
+ }
305
+ }
306
+ /**
307
+ * Configuração padrão de fallback para tsconfig.json
308
+ */
309
+ function getDefaultTsConfig() {
310
+ return {
311
+ $schema: 'https://json.schemastore.org/tsconfig',
312
+ compilerOptions: {
313
+ // ✅ IMPORTANTE: manter checks básicos como strictNullChecks
314
+ strictNullChecks: true,
315
+ },
316
+ };
317
+ }
318
+ /**
319
+ * ✅ CORRIGIDO: Função única para gerar tsconfig.json
320
+ */
321
+ export function generateTsConfigForProject(projectType) {
322
+ const baseTsConfig = getAutocoreTsConfig();
323
+ // Retorna cópia idêntica do AutoCore sem modificações
324
+ const projectTsConfig = {
325
+ ...baseTsConfig,
326
+ };
327
+ console.log(`✅ tsconfig.json gerado para projeto ${projectType} (sincronizado com AutoCore)`);
328
+ return projectTsConfig;
329
+ }
330
+ /**
331
+ * Gera package.json com versões específicas por tipo de projeto
332
+ */
333
+ export function generatePackageJson(projectName, projectType, versions) {
334
+ // ✅ NOVO: Package.json base para scenarios (sem main)
335
+ const basePackageJsonScenarios = {
336
+ name: `@rbqa/${projectName}`,
337
+ version: '1.0.0',
338
+ type: 'module',
339
+ keywords: [],
340
+ author: '',
341
+ license: 'ISC',
342
+ };
343
+ // ✅ Package.json base para outros tipos (com main)
344
+ const basePackageJson = {
345
+ name: `@rbqa/${projectName}`,
346
+ version: '1.0.0',
347
+ type: 'module',
348
+ main: 'dist/index.js',
349
+ keywords: [],
350
+ author: '',
351
+ license: 'ISC',
352
+ };
353
+ // ✅ Escolher configuração base baseada no tipo de projeto
354
+ const selectedBase = projectType === 'scenarios' ? basePackageJsonScenarios : basePackageJson;
355
+ // Scripts específicos por tipo de projeto
356
+ const scriptsConfig = getScriptsForProjectType(projectType);
357
+ // Dependências específicas por tipo
358
+ const specificDependencies = getSpecificDependencies(projectType, versions);
359
+ // Build base package object
360
+ const pkg = {
361
+ ...selectedBase,
362
+ description: `Projeto ${getProjectTypeDescription(projectType)} baseado no AutoCore para Automação`,
363
+ scripts: scriptsConfig,
364
+ devDependencies: {
365
+ ...versions.devDependencies,
366
+ ...specificDependencies.devDependencies,
367
+ },
368
+ };
369
+ if (projectType === 'scenarios') {
370
+ // For scenarios: keep runtime deps minimal (only specificDependencies)
371
+ pkg.dependencies = {
372
+ ...specificDependencies.dependencies,
373
+ };
374
+ // Move common system packages (that represent other "system" projects) to peerDependencies
375
+ // so they are declared but NOT installed automatically on `npm install`.
376
+ const systemPatterns = [/^@sfa\//i, /test-sanity/i];
377
+ const peerDeps = {};
378
+ for (const [name, ver] of Object.entries(versions.dependencies || {})) {
379
+ const isSystem = systemPatterns.some((rx) => rx.test(name));
380
+ if (isSystem) {
381
+ peerDeps[name] = ver;
382
+ }
383
+ }
384
+ if (Object.keys(peerDeps).length > 0) {
385
+ pkg.peerDependencies = peerDeps;
386
+ }
387
+ }
388
+ else {
389
+ pkg.dependencies = {
390
+ // Remover automaticamente `zod` dos packages gerados para consumidores
391
+ ...Object.fromEntries(Object.entries(versions.dependencies || {}).filter(([k]) => k !== 'zod')),
392
+ ...specificDependencies.dependencies,
393
+ };
394
+ }
395
+ return pkg;
396
+ }
397
+ /**
398
+ * Dependências específicas por tipo de projeto
399
+ */
400
+ function getSpecificDependencies(projectType, versions) {
401
+ const specific = {
402
+ dependencies: {},
403
+ devDependencies: {},
404
+ };
405
+ switch (projectType) {
406
+ case 'scenarios':
407
+ // ✅ Scenarios: keep dependencies minimal to avoid heavy installs on `npm i`
408
+ // Only install @silasfmartins/testhub by default; move other tools to devDependencies
409
+ specific.dependencies['@silasfmartins/testhub'] =
410
+ versions.dependencies?.['@silasfmartins/testhub'] || '^1.0.0';
411
+ // Minimal devDependencies helpful for development (tsx/biome if present)
412
+ specific.devDependencies['tsx'] =
413
+ versions.devDependencies?.['tsx'] || versions.dependencies?.['tsx'] || '^4.20.0';
414
+ specific.devDependencies['@biomejs/biome'] =
415
+ versions.devDependencies?.['@biomejs/biome'] || '^2.0.0';
416
+ break;
417
+ default:
418
+ // Para outros tipos, manter tsx nas dependencies normais
419
+ break;
420
+ }
421
+ return specific;
422
+ }
423
+ /**
424
+ * Scripts específicos por tipo de projeto
425
+ */
426
+ function getScriptsForProjectType(projectType) {
427
+ const baseScripts = {
428
+ generate: 'npx autocore-generate',
429
+ update: 'npx autocore-sync-configs && npm run generate && rimraf dist && tsc && rimraf index.ts',
430
+ build: 'npm run update',
431
+ sync: 'npx autocore-sync-configs',
432
+ format: 'npx @biomejs/biome format --write',
433
+ "check-updates": "npx npm-check-updates -u",
434
+ register: "npx tsx node_modules/@silasfmartins/testhub/scripts/smart-override.ts register",
435
+ };
436
+ // ✅ Scripts do Vitest para testes unitários de utilitários
437
+ const vitestScripts = {
438
+ 'test:unit': 'vitest run',
439
+ 'test:unit:watch': 'vitest',
440
+ 'test:unit:ui': 'vitest --ui',
441
+ 'test:unit:coverage': 'vitest run',
442
+ };
443
+ const testScripts = {
444
+ test: 'cross-env NODE_OPTIONS="--loader ./node_modules/@silasfmartins/testhub/protect-loader.mjs" playwright test',
445
+ 'test:esteira1': 'cross-env NODE_ENV=esteira1 NODE_OPTIONS="--loader ./node_modules/@silasfmartins/testhub/protect-loader.mjs" playwright test',
446
+ 'test:esteira2': 'cross-env NODE_ENV=esteira2 NODE_OPTIONS="--loader ./node_modules/@silasfmartins/testhub/protect-loader.mjs" playwright test',
447
+ 'test:preprod': 'cross-env NODE_ENV=preprod NODE_OPTIONS="--loader ./node_modules/@silasfmartins/testhub/protect-loader.mjs" playwright test',
448
+ 'test:prodlike': 'cross-env NODE_ENV=prodlike NODE_OPTIONS="--loader ./node_modules/@silasfmartins/testhub/protect-loader.mjs" playwright test',
449
+ };
450
+ // ✅ Scripts de CodeGen com contexto do AutoCore
451
+ const codegenScripts = {
452
+ codegen: 'cross-env NODE_ENV=preprod NODE_OPTIONS="--loader ./node_modules/@silasfmartins/testhub/protect-loader.mjs" playwright codegen',
453
+ 'codegen:esteira1': 'cross-env NODE_ENV=esteira1 NODE_OPTIONS="--loader ./node_modules/@silasfmartins/testhub/protect-loader.mjs" playwright codegen',
454
+ 'codegen:esteira2': 'cross-env NODE_ENV=esteira2 NODE_OPTIONS="--loader ./node_modules/@silasfmartins/testhub/protect-loader.mjs" playwright codegen',
455
+ 'codegen:preprod': 'cross-env NODE_ENV=preprod NODE_OPTIONS="--loader ./node_modules/@silasfmartins/testhub/protect-loader.mjs" playwright codegen',
456
+ 'codegen:prodlike': 'cross-env NODE_ENV=prodlike NODE_OPTIONS="--loader ./node_modules/@silasfmartins/testhub/protect-loader.mjs" playwright codegen',
457
+ };
458
+ // ✅ Scripts de Debug com contexto do AutoCore
459
+ const debugScripts = {
460
+ debug: 'cross-env NODE_ENV=preprod NODE_OPTIONS="--loader ./node_modules/@silasfmartins/testhub/protect-loader.mjs" playwright test --debug',
461
+ 'debug:esteira1': 'cross-env NODE_ENV=esteira1 NODE_OPTIONS="--loader ./node_modules/@silasfmartins/testhub/protect-loader.mjs" playwright test --debug',
462
+ 'debug:esteira2': 'cross-env NODE_ENV=esteira2 NODE_OPTIONS="--loader ./node_modules/@silasfmartins/testhub/protect-loader.mjs" playwright test --debug',
463
+ 'debug:preprod': 'cross-env NODE_ENV=preprod NODE_OPTIONS="--loader ./node_modules/@silasfmartins/testhub/protect-loader.mjs" playwright test --debug',
464
+ 'debug:prodlike': 'cross-env NODE_ENV=prodlike NODE_OPTIONS="--loader ./node_modules/@silasfmartins/testhub/protect-loader.mjs" playwright test --debug',
465
+ };
466
+ // ✅ Scripts de UI com contexto do AutoCore (Web/Frontend)
467
+ const uiScripts = {
468
+ ui: 'cross-env NODE_ENV=preprod NODE_OPTIONS="--loader ./node_modules/@silasfmartins/testhub/protect-loader.mjs" playwright test --ui',
469
+ 'ui:esteira1': 'cross-env NODE_ENV=esteira1 NODE_OPTIONS="--loader ./node_modules/@silasfmartins/testhub/protect-loader.mjs" playwright test --ui',
470
+ 'ui:esteira2': 'cross-env NODE_ENV=esteira2 NODE_OPTIONS="--loader ./node_modules/@silasfmartins/testhub/protect-loader.mjs" playwright test --ui',
471
+ 'ui:preprod': 'cross-env NODE_ENV=preprod NODE_OPTIONS="--loader ./node_modules/@silasfmartins/testhub/protect-loader.mjs" playwright test --ui',
472
+ 'ui:prodlike': 'cross-env NODE_ENV=prodlike NODE_OPTIONS="--loader ./node_modules/@silasfmartins/testhub/protect-loader.mjs" playwright test --ui',
473
+ };
474
+ const uiScriptsChromium = {
475
+ 'ui:chromium': 'cross-env NODE_ENV=preprod NODE_OPTIONS="--loader ./node_modules/@silasfmartins/testhub/protect-loader.mjs" playwright test --ui --project=chromium',
476
+ 'ui:esteira1:chromium': 'cross-env NODE_ENV=esteira1 NODE_OPTIONS="--loader ./node_modules/@silasfmartins/testhub/protect-loader.mjs" playwright test --ui --project=chromium',
477
+ 'ui:esteira2:chromium': 'cross-env NODE_ENV=esteira2 NODE_OPTIONS="--loader ./node_modules/@silasfmartins/testhub/protect-loader.mjs" playwright test --ui --project=chromium',
478
+ 'ui:preprod:chromium': 'cross-env NODE_ENV=preprod NODE_OPTIONS="--loader ./node_modules/@silasfmartins/testhub/protect-loader.mjs" playwright test --ui --project=chromium',
479
+ 'ui:prodlike:chromium': 'cross-env NODE_ENV=prodlike NODE_OPTIONS="--loader ./node_modules/@silasfmartins/testhub/protect-loader.mjs" playwright test --ui --project=chromium',
480
+ };
481
+ const testScriptsChromium = {
482
+ ui: 'cross-env NODE_ENV=preprod NODE_OPTIONS="--loader ./node_modules/@silasfmartins/testhub/protect-loader.mjs" playwright test --ui --project=chromium',
483
+ 'ui:esteira1': 'cross-env NODE_ENV=esteira1 NODE_OPTIONS="--loader ./node_modules/@silasfmartins/testhub/protect-loader.mjs" playwright test --ui --project=chromium',
484
+ 'ui:esteira2': 'cross-env NODE_ENV=esteira2 NODE_OPTIONS="--loader ./node_modules/@silasfmartins/testhub/protect-loader.mjs" playwright test --ui --project=chromium',
485
+ 'ui:preprod': 'cross-env NODE_ENV=preprod NODE_OPTIONS="--loader ./node_modules/@silasfmartins/testhub/protect-loader.mjs" playwright test --ui --project=chromium',
486
+ 'ui:prodlike': 'cross-env NODE_ENV=prodlike NODE_OPTIONS="--loader ./node_modules/@silasfmartins/testhub/protect-loader.mjs" playwright test --ui --project=chromium',
487
+ };
488
+ // ✅ Scripts MOBILE em modo HEADLESS (sem Appium Inspector - para CI/CD)
489
+ const mobileTestScripts = {
490
+ 'test:esteira1': 'cross-env MOBILE_UI_MODE=false NODE_ENV=esteira1 NODE_OPTIONS="--loader ./node_modules/@silasfmartins/testhub/protect-loader.mjs" playwright test',
491
+ 'test:esteira2': 'cross-env MOBILE_UI_MODE=false NODE_ENV=esteira2 NODE_OPTIONS="--loader ./node_modules/@silasfmartins/testhub/protect-loader.mjs" playwright test',
492
+ 'test:preprod': 'cross-env MOBILE_UI_MODE=false NODE_ENV=preprod NODE_OPTIONS="--loader ./node_modules/@silasfmartins/testhub/protect-loader.mjs" playwright test',
493
+ 'test:prodlike': 'cross-env MOBILE_UI_MODE=false NODE_ENV=prodlike NODE_OPTIONS="--loader ./node_modules/@silasfmartins/testhub/protect-loader.mjs" playwright test',
494
+ };
495
+ // ✅ Scripts MOBILE DEBUG em modo HEADLESS
496
+ const mobileDebugScripts = {
497
+ debug: 'cross-env MOBILE_UI_MODE=false NODE_ENV=preprod NODE_OPTIONS="--loader ./node_modules/@silasfmartins/testhub/protect-loader.mjs" playwright test --debug',
498
+ 'debug:esteira1': 'cross-env MOBILE_UI_MODE=false NODE_ENV=esteira1 NODE_OPTIONS="--loader ./node_modules/@silasfmartins/testhub/protect-loader.mjs" playwright test --debug',
499
+ 'debug:esteira2': 'cross-env MOBILE_UI_MODE=false NODE_ENV=esteira2 NODE_OPTIONS="--loader ./node_modules/@silasfmartins/testhub/protect-loader.mjs" playwright test --debug',
500
+ 'debug:preprod': 'cross-env MOBILE_UI_MODE=false NODE_ENV=preprod NODE_OPTIONS="--loader ./node_modules/@silasfmartins/testhub/protect-loader.mjs" playwright test --debug',
501
+ 'debug:prodlike': 'cross-env MOBILE_UI_MODE=false NODE_ENV=prodlike NODE_OPTIONS="--loader ./node_modules/@silasfmartins/testhub/protect-loader.mjs" playwright test --debug',
502
+ };
503
+ // ✅ Scripts MOBILE com UI (Appium Inspector VISÍVEL - para desenvolvimento)
504
+ const mobileUiScripts = {
505
+ 'ui:esteira1': 'cross-env MOBILE_UI_MODE=true NODE_ENV=esteira1 NODE_OPTIONS="--loader ./node_modules/@silasfmartins/testhub/protect-loader.mjs" playwright test',
506
+ 'ui:esteira2': 'cross-env MOBILE_UI_MODE=true NODE_ENV=esteira2 NODE_OPTIONS="--loader ./node_modules/@silasfmartins/testhub/protect-loader.mjs" playwright test',
507
+ 'ui:preprod': 'cross-env MOBILE_UI_MODE=true NODE_ENV=preprod NODE_OPTIONS="--loader ./node_modules/@silasfmartins/testhub/protect-loader.mjs" playwright test',
508
+ 'ui:prodlike': 'cross-env MOBILE_UI_MODE=true NODE_ENV=prodlike NODE_OPTIONS="--loader ./node_modules/@silasfmartins/testhub/protect-loader.mjs" playwright test',
509
+ 'ui:esteira1:debug': 'cross-env MOBILE_UI_MODE=true AUTOCORE_DEBUG_LOGS=true NODE_ENV=esteira1 NODE_OPTIONS="--loader ./node_modules/@silasfmartins/testhub/protect-loader.mjs" playwright test --debug',
510
+ 'ui:esteira2:debug': 'cross-env MOBILE_UI_MODE=true AUTOCORE_DEBUG_LOGS=true NODE_ENV=esteira2 NODE_OPTIONS="--loader ./node_modules/@silasfmartins/testhub/protect-loader.mjs" playwright test --debug',
511
+ 'ui:preprod:debug': 'cross-env MOBILE_UI_MODE=true AUTOCORE_DEBUG_LOGS=true NODE_ENV=preprod NODE_OPTIONS="--loader ./node_modules/@silasfmartins/testhub/protect-loader.mjs" playwright test --debug',
512
+ 'ui:prodlike:debug': 'cross-env MOBILE_UI_MODE=true AUTOCORE_DEBUG_LOGS=true NODE_ENV=prodlike NODE_OPTIONS="--loader ./node_modules/@silasfmartins/testhub/protect-loader.mjs" playwright test --debug',
513
+ };
514
+ // ✅ Script de postinstall AUTOMÁTICO (roda após npm install)
515
+ // Sincroniza tsconfig.json, biome.json e instala extensões VS Code
516
+ // Usa binários do AutoCore (evita erros de .ts não encontrado)
517
+ const postinstallScript = {
518
+ postinstall: 'npx autocore-postinstall',
519
+ };
520
+ switch (projectType) {
521
+ case 'api':
522
+ return {
523
+ ...testScripts,
524
+ ...debugScripts,
525
+ ...baseScripts,
526
+ ...postinstallScript,
527
+ };
528
+ case 'scenarios':
529
+ // ✅ CORRIGIDO: Scenarios usa preinstall (antes) + postinstall (depois)
530
+ return {
531
+ sync: 'npx autocore-sync-configs',
532
+ 'test:esteira1': 'cross-env NODE_ENV=esteira1 NODE_ORACLEDB_DRIVER_MODE=thick NODE_OPTIONS="--loader ./node_modules/@silasfmartins/testhub/protect-loader.mjs" playwright test',
533
+ 'test:esteira2': 'cross-env NODE_ENV=esteira2 NODE_ORACLEDB_DRIVER_MODE=thick NODE_OPTIONS="--loader ./node_modules/@silasfmartins/testhub/protect-loader.mjs" playwright test',
534
+ 'test:preprod': 'cross-env NODE_ENV=preprod NODE_ORACLEDB_DRIVER_MODE=thick NODE_OPTIONS="--loader ./node_modules/@silasfmartins/testhub/protect-loader.mjs" playwright test',
535
+ 'test:prodlike': 'cross-env NODE_ENV=prodlike NODE_ORACLEDB_DRIVER_MODE=thick NODE_OPTIONS="--loader ./node_modules/@silasfmartins/testhub/protect-loader.mjs" playwright test',
536
+ // ✅ Debug para cenários
537
+ debug: 'cross-env NODE_ENV=preprod NODE_ORACLEDB_DRIVER_MODE=thick NODE_OPTIONS="--loader ./node_modules/@silasfmartins/testhub/protect-loader.mjs" playwright test --debug',
538
+ 'debug:esteira1': 'cross-env NODE_ENV=esteira1 NODE_ORACLEDB_DRIVER_MODE=thick NODE_OPTIONS="--loader ./node_modules/@silasfmartins/testhub/protect-loader.mjs" playwright test --debug',
539
+ 'debug:esteira2': 'cross-env NODE_ENV=esteira2 NODE_ORACLEDB_DRIVER_MODE=thick NODE_OPTIONS="--loader ./node_modules/@silasfmartins/testhub/protect-loader.mjs" playwright test --debug',
540
+ 'debug:preprod': 'cross-env NODE_ENV=preprod NODE_ORACLEDB_DRIVER_MODE=thick NODE_OPTIONS="--loader ./node_modules/@silasfmartins/testhub/protect-loader.mjs" playwright test --debug',
541
+ 'debug:prodlike': 'cross-env NODE_ENV=prodlike NODE_ORACLEDB_DRIVER_MODE=thick NODE_OPTIONS="--loader ./node_modules/@silasfmartins/testhub/protect-loader.mjs" playwright test --debug',
542
+ ui: 'cross-env NODE_ENV=preprod NODE_ORACLEDB_DRIVER_MODE=thick NODE_OPTIONS="--loader ./node_modules/@silasfmartins/testhub/protect-loader.mjs" playwright test --ui',
543
+ 'ui:esteira1': 'cross-env NODE_ENV=esteira1 NODE_ORACLEDB_DRIVER_MODE=thick NODE_OPTIONS="--loader ./node_modules/@silasfmartins/testhub/protect-loader.mjs" playwright test --ui',
544
+ 'ui:esteira2': 'cross-env NODE_ENV=esteira2 NODE_ORACLEDB_DRIVER_MODE=thick NODE_OPTIONS="--loader ./node_modules/@silasfmartins/testhub/protect-loader.mjs" playwright test --ui',
545
+ 'ui:preprod': 'cross-env NODE_ENV=preprod NODE_ORACLEDB_DRIVER_MODE=thick NODE_OPTIONS="--loader ./node_modules/@silasfmartins/testhub/protect-loader.mjs" playwright test --ui',
546
+ 'ui:prodlike': 'cross-env NODE_ENV=prodlike NODE_ORACLEDB_DRIVER_MODE=thick NODE_OPTIONS="--loader ./node_modules/@silasfmartins/testhub/protect-loader.mjs" playwright test --ui',
547
+ ...uiScriptsChromium,
548
+ ...testScriptsChromium,
549
+ postinstall: "node -e \"const fs=require('fs'), cp=require('child_process'); if(!fs.existsSync('node_modules/@silasfmartins/testhub')){console.log('@silasfmartins/testhub missing - installing'); cp.execSync('npm install @silasfmartins/testhub --no-audit --no-fund --silent',{stdio:'inherit'});} try{ cp.execSync('npx tsx ./node_modules/@silasfmartins/testhub/scripts/consumer-postinstall.ts',{stdio:'inherit'});}catch(e){ console.warn('consumer-postinstall failed', e); }\""
550
+ };
551
+ case 'banco':
552
+ return {
553
+ 'test:esteira1': 'cross-env NODE_ENV=esteira1 NODE_ORACLEDB_DRIVER_MODE=thick NODE_OPTIONS="--loader ./node_modules/@silasfmartins/testhub/protect-loader.mjs" playwright test',
554
+ 'test:esteira2': 'cross-env NODE_ENV=esteira2 NODE_ORACLEDB_DRIVER_MODE=thick NODE_OPTIONS="--loader ./node_modules/@silasfmartins/testhub/protect-loader.mjs" playwright test',
555
+ 'test:preprod': 'cross-env NODE_ENV=preprod NODE_ORACLEDB_DRIVER_MODE=thick NODE_OPTIONS="--loader ./node_modules/@silasfmartins/testhub/protect-loader.mjs" playwright test',
556
+ 'test:prodlike': 'cross-env NODE_ENV=prodlike NODE_ORACLEDB_DRIVER_MODE=thick NODE_OPTIONS="--loader ./node_modules/@silasfmartins/testhub/protect-loader.mjs" playwright test',
557
+ debug: 'cross-env NODE_ENV=preprod NODE_ORACLEDB_DRIVER_MODE=thick NODE_OPTIONS="--loader ./node_modules/@silasfmartins/testhub/protect-loader.mjs" playwright test --debug',
558
+ 'debug:esteira1': 'cross-env NODE_ENV=esteira1 NODE_ORACLEDB_DRIVER_MODE=thick NODE_OPTIONS="--loader ./node_modules/@silasfmartins/testhub/protect-loader.mjs" playwright test --debug',
559
+ 'debug:esteira2': 'cross-env NODE_ENV=esteira2 NODE_ORACLEDB_DRIVER_MODE=thick NODE_OPTIONS="--loader ./node_modules/@silasfmartins/testhub/protect-loader.mjs" playwright test --debug',
560
+ 'debug:preprod': 'cross-env NODE_ENV=preprod NODE_ORACLEDB_DRIVER_MODE=thick NODE_OPTIONS="--loader ./node_modules/@silasfmartins/testhub/protect-loader.mjs" playwright test --debug',
561
+ 'debug:prodlike': 'cross-env NODE_ENV=prodlike NODE_ORACLEDB_DRIVER_MODE=thick NODE_OPTIONS="--loader ./node_modules/@silasfmartins/testhub/protect-loader.mjs" playwright test --debug',
562
+ ...baseScripts,
563
+ ...postinstallScript
564
+ };
565
+ case 'frontend':
566
+ return {
567
+ ...testScripts,
568
+ ...debugScripts,
569
+ ...baseScripts,
570
+ ...uiScripts,
571
+ ...uiScriptsChromium,
572
+ ...testScriptsChromium,
573
+ ...postinstallScript
574
+ };
575
+ case 'mobile':
576
+ return {
577
+ ...mobileTestScripts,
578
+ ...mobileDebugScripts,
579
+ ...mobileUiScripts,
580
+ ...baseScripts,
581
+ ...postinstallScript
582
+ };
583
+ case 'ssh':
584
+ return {
585
+ ...testScripts,
586
+ ...debugScripts,
587
+ ...baseScripts,
588
+ ...postinstallScript
589
+ };
590
+ default:
591
+ return {
592
+ ...testScripts,
593
+ ...debugScripts,
594
+ ...baseScripts,
595
+ ...postinstallScript
596
+ };
597
+ }
598
+ }
599
+ /**
600
+ * Descrição por tipo de projeto
601
+ */
602
+ function getProjectTypeDescription(projectType) {
603
+ const descriptions = {
604
+ api: 'de API',
605
+ frontend: 'Frontend',
606
+ mobile: 'Mobile',
607
+ ssh: 'de SSH',
608
+ banco: 'de Banco de Dados',
609
+ scenarios: 'de Cenários',
610
+ };
611
+ return descriptions[projectType] || 'AutoCore';
612
+ }
613
+ /**
614
+ * ✅ NOVO - Gera biome.json sincronizado com o AutoCore
615
+ */
616
+ export function generateBiomeConfigForProject() {
617
+ // Lê o biome.json do AutoCore como template
618
+ const autocoreBiomeConfig = getAutocoreBiomeConfig();
619
+ console.log('✅ biome.json sincronizado com AutoCore');
620
+ return autocoreBiomeConfig;
621
+ }
622
+ /**
623
+ * ✅ Parse robusto de JSONC - Remove comentários e caracteres de controle
624
+ */
625
+ function parseJsonc(content) {
626
+ // 1. Remover comentários de bloco /* */
627
+ let cleaned = content.replace(/\/\*[\s\S]*?\*\//g, '');
628
+ // 2. Remover comentários de linha // (processar linha por linha para não afetar URLs)
629
+ const lines = cleaned.split('\n');
630
+ const processedLines = lines.map((line) => {
631
+ // Se a linha tem aspas, verificar se // está dentro de string
632
+ if (line.includes('"')) {
633
+ const commentPos = line.indexOf('//');
634
+ if (commentPos === -1) {
635
+ return line;
636
+ }
637
+ // Verificar se // está dentro de string (contar aspas antes)
638
+ const beforeComment = line.substring(0, commentPos);
639
+ const quoteCount = (beforeComment.match(/"/g) || []).length;
640
+ // Se número ímpar de aspas, // está dentro de string
641
+ if (quoteCount % 2 === 1) {
642
+ return line; // Manter linha inteira (// está dentro de string)
643
+ }
644
+ // // está fora de string, remover comentário
645
+ return line.substring(0, commentPos);
646
+ }
647
+ // Linha sem aspas, pode remover // normalmente
648
+ const commentPos = line.indexOf('//');
649
+ return commentPos === -1 ? line : line.substring(0, commentPos);
650
+ });
651
+ cleaned = processedLines.join('\n');
652
+ // 3. Normalizar quebras de linha
653
+ cleaned = cleaned.replace(/\r\n/g, '\n').replace(/\r/g, '\n');
654
+ // 4. ✅ CORRIGIDO: Remover caracteres de controle inválidos (ASCII 0-8, 11-12, 14-31)
655
+ // Remove caracteres de controle que causam "Bad control character in string literal"
656
+ // Mantém apenas tab(9), newline(10), carriage return(13) e caracteres imprimíveis (32+)
657
+ cleaned = cleaned.replace(/[\u0000-\u0008\u000B\u000C\u000E-\u001F]/g, '');
658
+ // 5. Remover trailing commas antes de } ou ]
659
+ cleaned = cleaned.replace(/,(\s*[}\]])/g, '$1');
660
+ // 6. Trim e fazer parse com try/catch para debugging
661
+ try {
662
+ return JSON.parse(cleaned.trim());
663
+ }
664
+ catch (error) {
665
+ console.warn('❌ Erro ao fazer parse do biome.json:', error);
666
+ console.warn('📝 Conteúdo problemático (primeiros 200 chars):', cleaned.trim().substring(0, 200));
667
+ throw error;
668
+ }
669
+ }
670
+ /**
671
+ * ✅ NOVO - Obtém configuração do Biome do AutoCore
672
+ */
673
+ function getAutocoreBiomeConfig() {
674
+ try {
675
+ // Tentar ler o biome.json do AutoCore
676
+ const currentDir = path.dirname(fileURLToPath(import.meta.url));
677
+ // Navegar para o diretório raiz do projeto
678
+ // Se estivermos em dist/scripts/, subir 2 níveis; se em scripts/, subir 1 nível
679
+ const autocoreRoot = currentDir.includes('dist')
680
+ ? path.resolve(currentDir, '..', '..') // dist/scripts/ -> raiz
681
+ : path.resolve(currentDir, '..'); // scripts/ -> raiz
682
+ const autoCorePath = path.join(autocoreRoot, 'biome.json');
683
+ if (fs.existsSync(autoCorePath)) {
684
+ const biomeContent = fs.readFileSync(autoCorePath, 'utf-8');
685
+ const biomeConfig = parseJsonc(biomeContent);
686
+ console.log('📋 Configuração do Biome carregada do AutoCore');
687
+ return biomeConfig;
688
+ }
689
+ }
690
+ catch (error) {
691
+ console.warn('⚠️ Erro ao ler biome.json do AutoCore:', error);
692
+ }
693
+ // Fallback para configuração padrão
694
+ console.log('📋 Usando configuração padrão do Biome');
695
+ return getDefaultBiomeConfig();
696
+ }
697
+ /**
698
+ * ✅ NOVO - Configuração padrão do Biome (fallback)
699
+ */
700
+ function getDefaultBiomeConfig() {
701
+ return {
702
+ $schema: 'https://biomejs.dev/schemas/2.0.6/schema.json',
703
+ extends: ['ultracite'],
704
+ javascript: {
705
+ formatter: {
706
+ semicolons: 'asNeeded',
707
+ },
708
+ },
709
+ };
710
+ }
711
+ /**
712
+ * ✅ ATUALIZADO - Função helper para gerar biome.json como string
713
+ */
714
+ export function generateBiomeConfigString() {
715
+ const biomeConfig = generateBiomeConfigForProject();
716
+ return JSON.stringify(biomeConfig, null, 2);
717
+ }
718
+ /**
719
+ * 📊 NOVO - Gera README de cobertura personalizado para o projeto
720
+ */
721
+ export function generateCoverageReadme(projectName) {
722
+ // ✅ ESM-compatible __dirname definition
723
+ const __filename = fileURLToPath(import.meta.url);
724
+ const __dirname = path.dirname(__filename);
725
+ const templatePaths = [
726
+ path.join(__dirname, 'templates', 'coverage-readme.template.md'),
727
+ path.join(process.cwd(), 'node_modules/@silasfmartins/testhub/dist/scripts/templates/coverage-readme.template.md'),
728
+ path.join(process.cwd(), 'scripts/templates/coverage-readme.template.md'),
729
+ ];
730
+ let template = '';
731
+ for (const templatePath of templatePaths) {
732
+ try {
733
+ template = fs.readFileSync(templatePath, 'utf-8');
734
+ break;
735
+ }
736
+ catch (error) { }
737
+ }
738
+ if (!template) {
739
+ // Fallback: template inline se nenhum arquivo for encontrado
740
+ template = `# 📊 Cobertura de Testes - \${projectName}
741
+
742
+ Este documento contém informações sobre a cobertura de testes do projeto **\${projectName}**.
743
+
744
+ ## 🎯 Objetivos de Cobertura
745
+
746
+ - **Statements**: >= 80%
747
+ - **Branches**: >= 75%
748
+ - **Functions**: >= 85%
749
+ - **Lines**: >= 80%
750
+
751
+ ## 📈 Como Visualizar a Cobertura
752
+
753
+ ### 1. Executar testes com cobertura:
754
+ \`\`\`bash
755
+ npm test
756
+ \`\`\`
757
+
758
+ ### 2. Visualizar relatório HTML:
759
+ \`\`\`bash
760
+ npm run coverage:open
761
+ \`\`\`
762
+
763
+ ---
764
+
765
+ 📊 **Gerado automaticamente pelo @silasfmartins/testhub**`;
766
+ }
767
+ return template.replace(/\$\{projectName\}/g, projectName);
768
+ }