qa360 2.2.20 → 2.3.1

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 (507) hide show
  1. package/README.md +155 -262
  2. package/{cli/dist → dist}/commands/ai.js +1 -1
  3. package/{cli/dist → dist}/commands/coverage.js +1 -1
  4. package/{cli/dist → dist}/commands/crawl.d.ts +12 -1
  5. package/{cli/dist → dist}/commands/crawl.js +70 -9
  6. package/{cli/dist → dist}/commands/doctor.js +2 -2
  7. package/{cli/dist → dist}/commands/explain.js +2 -2
  8. package/{cli/dist → dist}/commands/flakiness.js +1 -1
  9. package/{cli/dist → dist}/commands/generate.js +1 -1
  10. package/{cli/dist → dist}/commands/history.js +1 -1
  11. package/{cli/dist → dist}/commands/monitor.js +3 -3
  12. package/{cli/dist → dist}/commands/ollama.js +1 -1
  13. package/{cli/dist → dist}/commands/pack.js +2 -2
  14. package/{cli/dist → dist}/commands/regression.js +1 -1
  15. package/{cli/dist → dist}/commands/repair.js +1 -1
  16. package/{cli/dist → dist}/commands/retry.js +1 -1
  17. package/{cli/dist → dist}/commands/run.d.ts +1 -1
  18. package/{cli/dist → dist}/commands/run.js +1 -1
  19. package/{cli/dist → dist}/commands/secrets.js +1 -1
  20. package/{cli/dist → dist}/commands/serve.js +1 -1
  21. package/{cli/dist → dist}/commands/slo.js +1 -1
  22. package/{cli/dist → dist}/commands/verify.js +1 -1
  23. package/{cli/dist → dist}/core/adapters/playwright-native-api.d.ts +2 -0
  24. package/{cli/dist → dist}/core/adapters/playwright-native-api.js +20 -1
  25. package/{cli/dist → dist}/core/adapters/playwright-ui.d.ts +21 -0
  26. package/dist/core/adapters/playwright-ui.js +2050 -0
  27. package/{cli/dist → dist}/core/ai/ollama-provider.js +15 -3
  28. package/{cli/dist → dist}/core/artifacts/ui-artifacts.js +24 -4
  29. package/dist/core/auth/backup-codes-provider.d.ts +91 -0
  30. package/dist/core/auth/backup-codes-provider.js +215 -0
  31. package/{cli/dist → dist}/core/auth/basic-auth-provider.d.ts +6 -0
  32. package/{cli/dist → dist}/core/auth/basic-auth-provider.js +24 -6
  33. package/dist/core/auth/digest-auth-provider.d.ts +116 -0
  34. package/dist/core/auth/digest-auth-provider.js +244 -0
  35. package/dist/core/auth/hcaptcha-handler.d.ts +103 -0
  36. package/dist/core/auth/hcaptcha-handler.js +288 -0
  37. package/{cli/dist → dist}/core/auth/index.d.ts +81 -4
  38. package/{cli/dist → dist}/core/auth/index.js +15 -1
  39. package/dist/core/auth/oauth-handler.d.ts +408 -0
  40. package/dist/core/auth/oauth-handler.js +636 -0
  41. package/{cli/dist → dist}/core/auth/oauth2-provider.d.ts +9 -0
  42. package/dist/core/auth/oauth2-provider.js +227 -0
  43. package/dist/core/auth/otp-provider.d.ts +93 -0
  44. package/dist/core/auth/otp-provider.js +288 -0
  45. package/dist/core/auth/recaptcha-handler.d.ts +119 -0
  46. package/dist/core/auth/recaptcha-handler.js +301 -0
  47. package/dist/core/auth/remember-me-handler.d.ts +142 -0
  48. package/dist/core/auth/remember-me-handler.js +255 -0
  49. package/dist/core/auth/saml-handler.d.ts +173 -0
  50. package/dist/core/auth/saml-handler.js +364 -0
  51. package/dist/core/auth/webauthn-handler.d.ts +182 -0
  52. package/dist/core/auth/webauthn-handler.js +310 -0
  53. package/dist/core/crawler/advanced-interactions.d.ts +342 -0
  54. package/dist/core/crawler/advanced-interactions.js +1069 -0
  55. package/dist/core/crawler/blob-url-download-handler.d.ts +145 -0
  56. package/dist/core/crawler/blob-url-download-handler.js +392 -0
  57. package/dist/core/crawler/consent-handler.d.ts +49 -0
  58. package/dist/core/crawler/consent-handler.js +258 -0
  59. package/dist/core/crawler/cookie-manager.d.ts +166 -0
  60. package/dist/core/crawler/cookie-manager.js +353 -0
  61. package/dist/core/crawler/coop-coep-handler.d.ts +136 -0
  62. package/dist/core/crawler/coop-coep-handler.js +338 -0
  63. package/dist/core/crawler/csp-handler.d.ts +151 -0
  64. package/dist/core/crawler/csp-handler.js +415 -0
  65. package/dist/core/crawler/download-handler.d.ts +155 -0
  66. package/dist/core/crawler/download-handler.js +370 -0
  67. package/dist/core/crawler/email-testing-handler.d.ts +214 -0
  68. package/dist/core/crawler/email-testing-handler.js +398 -0
  69. package/dist/core/crawler/error-tracking-handler.d.ts +177 -0
  70. package/dist/core/crawler/error-tracking-handler.js +378 -0
  71. package/dist/core/crawler/form-handler.d.ts +100 -0
  72. package/dist/core/crawler/form-handler.js +465 -0
  73. package/dist/core/crawler/framework-wait-handler.d.ts +96 -0
  74. package/dist/core/crawler/framework-wait-handler.js +464 -0
  75. package/dist/core/crawler/geolocation-handler.d.ts +112 -0
  76. package/dist/core/crawler/geolocation-handler.js +276 -0
  77. package/dist/core/crawler/index.d.ts +78 -0
  78. package/{cli/dist → dist}/core/crawler/index.js +74 -1
  79. package/dist/core/crawler/intelligent-selector-generator.d.ts +164 -0
  80. package/dist/core/crawler/intelligent-selector-generator.js +612 -0
  81. package/{cli/dist → dist}/core/crawler/journey-generator.js +44 -1
  82. package/{cli/dist → dist}/core/crawler/page-analyzer.d.ts +16 -1
  83. package/{cli/dist → dist}/core/crawler/page-analyzer.js +469 -17
  84. package/dist/core/crawler/permissions-handler.d.ts +112 -0
  85. package/dist/core/crawler/permissions-handler.js +236 -0
  86. package/dist/core/crawler/permissions-policy-handler.d.ts +113 -0
  87. package/dist/core/crawler/permissions-policy-handler.js +402 -0
  88. package/dist/core/crawler/presets.d.ts +100 -0
  89. package/dist/core/crawler/presets.js +887 -0
  90. package/dist/core/crawler/repl-debug-handler.d.ts +105 -0
  91. package/dist/core/crawler/repl-debug-handler.js +552 -0
  92. package/dist/core/crawler/reporting-api-handler.d.ts +212 -0
  93. package/dist/core/crawler/reporting-api-handler.js +344 -0
  94. package/{cli/dist → dist}/core/crawler/selector-generator.d.ts +9 -0
  95. package/{cli/dist → dist}/core/crawler/selector-generator.js +99 -23
  96. package/dist/core/crawler/site-profiler.d.ts +89 -0
  97. package/dist/core/crawler/site-profiler.js +290 -0
  98. package/dist/core/crawler/sourcemaps-handler.d.ts +144 -0
  99. package/dist/core/crawler/sourcemaps-handler.js +420 -0
  100. package/dist/core/crawler/stacked-modals-handler.d.ts +118 -0
  101. package/dist/core/crawler/stacked-modals-handler.js +429 -0
  102. package/dist/core/crawler/trusted-types-handler.d.ts +149 -0
  103. package/dist/core/crawler/trusted-types-handler.js +413 -0
  104. package/{cli/dist → dist}/core/crawler/types.d.ts +68 -2
  105. package/dist/core/crawler/wait-strategies.d.ts +108 -0
  106. package/dist/core/crawler/wait-strategies.js +399 -0
  107. package/dist/core/fixtures/factories.d.ts +180 -0
  108. package/dist/core/fixtures/factories.js +279 -0
  109. package/dist/core/fixtures/index.d.ts +6 -0
  110. package/dist/core/fixtures/index.js +6 -0
  111. package/{cli/dist → dist}/core/generation/crawler-pack-generator.d.ts +13 -3
  112. package/dist/core/generation/crawler-pack-generator.js +232 -0
  113. package/{cli/dist → dist}/core/generation/index.d.ts +2 -0
  114. package/{cli/dist → dist}/core/generation/index.js +2 -0
  115. package/{cli/dist → dist}/core/index.d.ts +2 -0
  116. package/{cli/dist → dist}/core/index.js +4 -0
  117. package/dist/core/network/index.d.ts +7 -0
  118. package/dist/core/network/index.js +7 -0
  119. package/dist/core/network/network-manager.d.ts +237 -0
  120. package/dist/core/network/network-manager.js +343 -0
  121. package/dist/core/network/network-simulator.d.ts +158 -0
  122. package/dist/core/network/network-simulator.js +261 -0
  123. package/{cli/dist → dist}/core/pack/validator.js +2 -2
  124. package/{cli/dist → dist}/core/pack-v2/migrator.d.ts +5 -0
  125. package/{cli/dist → dist}/core/pack-v2/migrator.js +81 -6
  126. package/{cli/dist → dist}/core/pack-v2/validator.js +4 -3
  127. package/{cli/dist → dist}/core/pom/base-page.js +1 -1
  128. package/{cli/dist → dist}/core/pom/loader.js +1 -1
  129. package/dist/core/reporting/index.d.ts +9 -0
  130. package/dist/core/reporting/index.js +10 -0
  131. package/dist/core/reporting/junit-reporter.d.ts +114 -0
  132. package/dist/core/reporting/junit-reporter.js +306 -0
  133. package/{cli/dist → dist}/core/runner/e2e-helpers.d.ts +1 -1
  134. package/{cli/dist → dist}/core/runner/e2e-helpers.js +2 -2
  135. package/{cli/dist → dist}/core/runner/phase3-runner.d.ts +3 -0
  136. package/{cli/dist → dist}/core/runner/phase3-runner.js +45 -14
  137. package/dist/core/sharding/test-sharding.d.ts +137 -0
  138. package/dist/core/sharding/test-sharding.js +233 -0
  139. package/dist/core/storage/cookie-manager.d.ts +160 -0
  140. package/dist/core/storage/cookie-manager.js +268 -0
  141. package/dist/core/storage/index.d.ts +7 -0
  142. package/dist/core/storage/index.js +7 -0
  143. package/dist/core/storage/storage-helpers.d.ts +138 -0
  144. package/dist/core/storage/storage-helpers.js +315 -0
  145. package/dist/core/test-helpers/index.d.ts +6 -0
  146. package/dist/core/test-helpers/index.js +6 -0
  147. package/dist/core/test-helpers/state-reset.d.ts +119 -0
  148. package/dist/core/test-helpers/state-reset.js +234 -0
  149. package/{cli/dist → dist}/core/types/pack-v1.d.ts +15 -2
  150. package/{cli/dist → dist}/core/types/pack-v2.d.ts +1 -1
  151. package/dist/core/upload/chunked-uploader.d.ts +150 -0
  152. package/dist/core/upload/chunked-uploader.js +289 -0
  153. package/dist/core/upload/index.d.ts +11 -0
  154. package/dist/core/upload/index.js +8 -0
  155. package/dist/core/upload/mime-validator.d.ts +119 -0
  156. package/dist/core/upload/mime-validator.js +373 -0
  157. package/dist/core/upload/presigned-uploader.d.ts +118 -0
  158. package/dist/core/upload/presigned-uploader.js +274 -0
  159. package/dist/core/utils/device-emulation.d.ts +194 -0
  160. package/dist/core/utils/device-emulation.js +380 -0
  161. package/dist/core/utils/index.d.ts +8 -0
  162. package/dist/core/utils/index.js +8 -0
  163. package/dist/core/utils/retry.d.ts +145 -0
  164. package/dist/core/utils/retry.js +242 -0
  165. package/dist/core/utils/smart-wait.d.ts +133 -0
  166. package/dist/core/utils/smart-wait.js +417 -0
  167. package/dist/core/visual/index.d.ts +7 -0
  168. package/dist/core/visual/index.js +7 -0
  169. package/dist/core/visual/pixel-diff.d.ts +87 -0
  170. package/dist/core/visual/pixel-diff.js +213 -0
  171. package/dist/core/visual/screenshot-helper.d.ts +130 -0
  172. package/dist/core/visual/screenshot-helper.js +223 -0
  173. package/{cli/dist → dist}/utils/config.d.ts +1 -1
  174. package/examples/README.md +160 -0
  175. package/examples/accessibility.yml +48 -0
  176. package/examples/api-basic.yml +27 -0
  177. package/examples/complete.yml +146 -0
  178. package/examples/crawler.yml +38 -0
  179. package/examples/fullstack.yml +78 -0
  180. package/examples/security.yml +58 -0
  181. package/examples/ui-advanced.yml +49 -0
  182. package/examples/ui-basic.yml +24 -0
  183. package/package.json +33 -67
  184. package/CHANGELOG.md +0 -262
  185. package/CONTRIBUTING.md +0 -273
  186. package/QUICK_START.md +0 -191
  187. package/cli/CHANGELOG.md +0 -84
  188. package/cli/LICENSE +0 -24
  189. package/cli/README.md +0 -222
  190. package/cli/dist/core/adapters/playwright-ui.js +0 -864
  191. package/cli/dist/core/auth/oauth2-provider.js +0 -114
  192. package/cli/dist/core/coverage/analyzer.d.ts +0 -101
  193. package/cli/dist/core/coverage/analyzer.js +0 -415
  194. package/cli/dist/core/coverage/collector.d.ts +0 -74
  195. package/cli/dist/core/coverage/collector.js +0 -459
  196. package/cli/dist/core/coverage/config.d.ts +0 -37
  197. package/cli/dist/core/coverage/config.js +0 -156
  198. package/cli/dist/core/coverage/index.d.ts +0 -11
  199. package/cli/dist/core/coverage/index.js +0 -15
  200. package/cli/dist/core/coverage/types.d.ts +0 -267
  201. package/cli/dist/core/coverage/types.js +0 -6
  202. package/cli/dist/core/coverage/vault.d.ts +0 -95
  203. package/cli/dist/core/coverage/vault.js +0 -405
  204. package/cli/dist/core/crawler/index.d.ts +0 -57
  205. package/cli/dist/core/fixtures/index.d.ts +0 -8
  206. package/cli/dist/core/fixtures/index.js +0 -8
  207. package/cli/dist/core/generation/crawler-pack-generator.js +0 -231
  208. package/cli/dist/core/reporting/index.d.ts +0 -6
  209. package/cli/dist/core/reporting/index.js +0 -6
  210. package/cli/dist/core/visual/index.d.ts +0 -6
  211. package/cli/dist/core/visual/index.js +0 -6
  212. package/cli/package.json +0 -76
  213. package/core/LICENSE +0 -24
  214. package/core/README.md +0 -64
  215. package/core/package.json +0 -81
  216. package/core/schemas/pack.schema.json +0 -236
  217. /package/{cli/bin → bin}/qa360.js +0 -0
  218. /package/{cli/dist → dist}/cli-minimal.d.ts +0 -0
  219. /package/{cli/dist → dist}/cli-minimal.js +0 -0
  220. /package/{cli/dist → dist}/commands/ai.d.ts +0 -0
  221. /package/{cli/dist → dist}/commands/ask.d.ts +0 -0
  222. /package/{cli/dist → dist}/commands/ask.js +0 -0
  223. /package/{cli/dist → dist}/commands/coverage.d.ts +0 -0
  224. /package/{cli/dist → dist}/commands/doctor.d.ts +0 -0
  225. /package/{cli/dist → dist}/commands/examples.d.ts +0 -0
  226. /package/{cli/dist → dist}/commands/examples.js +0 -0
  227. /package/{cli/dist → dist}/commands/explain.d.ts +0 -0
  228. /package/{cli/dist → dist}/commands/flakiness.d.ts +0 -0
  229. /package/{cli/dist → dist}/commands/generate.d.ts +0 -0
  230. /package/{cli/dist → dist}/commands/history.d.ts +0 -0
  231. /package/{cli/dist → dist}/commands/init.d.ts +0 -0
  232. /package/{cli/dist → dist}/commands/init.js +0 -0
  233. /package/{cli/dist → dist}/commands/monitor.d.ts +0 -0
  234. /package/{cli/dist → dist}/commands/ollama.d.ts +0 -0
  235. /package/{cli/dist → dist}/commands/pack.d.ts +0 -0
  236. /package/{cli/dist → dist}/commands/regression.d.ts +0 -0
  237. /package/{cli/dist → dist}/commands/repair.d.ts +0 -0
  238. /package/{cli/dist → dist}/commands/report.d.ts +0 -0
  239. /package/{cli/dist → dist}/commands/report.js +0 -0
  240. /package/{cli/dist → dist}/commands/retry.d.ts +0 -0
  241. /package/{cli/dist → dist}/commands/scan.d.ts +0 -0
  242. /package/{cli/dist → dist}/commands/scan.js +0 -0
  243. /package/{cli/dist → dist}/commands/secrets.d.ts +0 -0
  244. /package/{cli/dist → dist}/commands/serve.d.ts +0 -0
  245. /package/{cli/dist → dist}/commands/slo.d.ts +0 -0
  246. /package/{cli/dist → dist}/commands/verify.d.ts +0 -0
  247. /package/{cli/dist → dist}/core/adapters/gitleaks-secrets.d.ts +0 -0
  248. /package/{cli/dist → dist}/core/adapters/gitleaks-secrets.js +0 -0
  249. /package/{cli/dist → dist}/core/adapters/jest-adapter.d.ts +0 -0
  250. /package/{cli/dist → dist}/core/adapters/jest-adapter.js +0 -0
  251. /package/{cli/dist → dist}/core/adapters/k6-perf.d.ts +0 -0
  252. /package/{cli/dist → dist}/core/adapters/k6-perf.js +0 -0
  253. /package/{cli/dist → dist}/core/adapters/osv-deps.d.ts +0 -0
  254. /package/{cli/dist → dist}/core/adapters/osv-deps.js +0 -0
  255. /package/{cli/dist → dist}/core/adapters/playwright-native-adapter.d.ts +0 -0
  256. /package/{cli/dist → dist}/core/adapters/playwright-native-adapter.js +0 -0
  257. /package/{cli/dist → dist}/core/adapters/pytest-adapter.d.ts +0 -0
  258. /package/{cli/dist → dist}/core/adapters/pytest-adapter.js +0 -0
  259. /package/{cli/dist → dist}/core/adapters/semgrep-sast.d.ts +0 -0
  260. /package/{cli/dist → dist}/core/adapters/semgrep-sast.js +0 -0
  261. /package/{cli/dist → dist}/core/adapters/unit-test-types.d.ts +0 -0
  262. /package/{cli/dist → dist}/core/adapters/unit-test-types.js +0 -0
  263. /package/{cli/dist → dist}/core/adapters/vitest-adapter.d.ts +0 -0
  264. /package/{cli/dist → dist}/core/adapters/vitest-adapter.js +0 -0
  265. /package/{cli/dist → dist}/core/adapters/zap-dast.d.ts +0 -0
  266. /package/{cli/dist → dist}/core/adapters/zap-dast.js +0 -0
  267. /package/{cli/dist → dist}/core/ai/anthropic-provider.d.ts +0 -0
  268. /package/{cli/dist → dist}/core/ai/anthropic-provider.js +0 -0
  269. /package/{cli/dist → dist}/core/ai/deepseek-provider.d.ts +0 -0
  270. /package/{cli/dist → dist}/core/ai/deepseek-provider.js +0 -0
  271. /package/{cli/dist → dist}/core/ai/index.d.ts +0 -0
  272. /package/{cli/dist → dist}/core/ai/index.js +0 -0
  273. /package/{cli/dist → dist}/core/ai/llm-client.d.ts +0 -0
  274. /package/{cli/dist → dist}/core/ai/llm-client.js +0 -0
  275. /package/{cli/dist → dist}/core/ai/mock-provider.d.ts +0 -0
  276. /package/{cli/dist → dist}/core/ai/mock-provider.js +0 -0
  277. /package/{cli/dist → dist}/core/ai/ollama-provider.d.ts +0 -0
  278. /package/{cli/dist → dist}/core/ai/openai-provider.d.ts +0 -0
  279. /package/{cli/dist → dist}/core/ai/openai-provider.js +0 -0
  280. /package/{cli/dist → dist}/core/ai/provider-factory.d.ts +0 -0
  281. /package/{cli/dist → dist}/core/ai/provider-factory.js +0 -0
  282. /package/{cli/dist → dist}/core/artifacts/index.d.ts +0 -0
  283. /package/{cli/dist → dist}/core/artifacts/index.js +0 -0
  284. /package/{cli/dist → dist}/core/artifacts/ui-artifacts.d.ts +0 -0
  285. /package/{cli/dist → dist}/core/assertions/engine.d.ts +0 -0
  286. /package/{cli/dist → dist}/core/assertions/engine.js +0 -0
  287. /package/{cli/dist → dist}/core/assertions/index.d.ts +0 -0
  288. /package/{cli/dist → dist}/core/assertions/index.js +0 -0
  289. /package/{cli/dist → dist}/core/assertions/types.d.ts +0 -0
  290. /package/{cli/dist → dist}/core/assertions/types.js +0 -0
  291. /package/{cli/dist → dist}/core/auth/api-key-provider.d.ts +0 -0
  292. /package/{cli/dist → dist}/core/auth/api-key-provider.js +0 -0
  293. /package/{cli/dist → dist}/core/auth/aws-iam-provider.d.ts +0 -0
  294. /package/{cli/dist → dist}/core/auth/aws-iam-provider.js +0 -0
  295. /package/{cli/dist → dist}/core/auth/azure-ad-provider.d.ts +0 -0
  296. /package/{cli/dist → dist}/core/auth/azure-ad-provider.js +0 -0
  297. /package/{cli/dist → dist}/core/auth/gcp-adc-provider.d.ts +0 -0
  298. /package/{cli/dist → dist}/core/auth/gcp-adc-provider.js +0 -0
  299. /package/{cli/dist → dist}/core/auth/jwt-provider.d.ts +0 -0
  300. /package/{cli/dist → dist}/core/auth/jwt-provider.js +0 -0
  301. /package/{cli/dist → dist}/core/auth/manager.d.ts +0 -0
  302. /package/{cli/dist → dist}/core/auth/manager.js +0 -0
  303. /package/{cli/dist → dist}/core/auth/totp-provider.d.ts +0 -0
  304. /package/{cli/dist → dist}/core/auth/totp-provider.js +0 -0
  305. /package/{cli/dist → dist}/core/auth/ui-login-provider.d.ts +0 -0
  306. /package/{cli/dist → dist}/core/auth/ui-login-provider.js +0 -0
  307. /package/{cli/dist → dist}/core/cache/index.d.ts +0 -0
  308. /package/{cli/dist → dist}/core/cache/index.js +0 -0
  309. /package/{cli/dist → dist}/core/cache/lru-cache.d.ts +0 -0
  310. /package/{cli/dist → dist}/core/cache/lru-cache.js +0 -0
  311. /package/{cli/dist/core → dist}/core/coverage/analyzer.d.ts +0 -0
  312. /package/{cli/dist/core → dist}/core/coverage/analyzer.js +0 -0
  313. /package/{cli/dist/core → dist}/core/coverage/collector.d.ts +0 -0
  314. /package/{cli/dist/core → dist}/core/coverage/collector.js +0 -0
  315. /package/{cli/dist/core → dist}/core/coverage/config.d.ts +0 -0
  316. /package/{cli/dist/core → dist}/core/coverage/config.js +0 -0
  317. /package/{cli/dist/core → dist}/core/coverage/index.d.ts +0 -0
  318. /package/{cli/dist/core → dist}/core/coverage/index.js +0 -0
  319. /package/{cli/dist/core → dist}/core/coverage/types.d.ts +0 -0
  320. /package/{cli/dist/core → dist}/core/coverage/types.js +0 -0
  321. /package/{cli/dist/core → dist}/core/coverage/vault.d.ts +0 -0
  322. /package/{cli/dist/core → dist}/core/coverage/vault.js +0 -0
  323. /package/{cli/dist → dist}/core/crawler/journey-generator.d.ts +0 -0
  324. /package/{cli/dist → dist}/core/crawler/types.js +0 -0
  325. /package/{cli/dist → dist}/core/dashboard/assets.d.ts +0 -0
  326. /package/{cli/dist → dist}/core/dashboard/assets.js +0 -0
  327. /package/{cli/dist → dist}/core/dashboard/index.d.ts +0 -0
  328. /package/{cli/dist → dist}/core/dashboard/index.js +0 -0
  329. /package/{cli/dist → dist}/core/dashboard/server.d.ts +0 -0
  330. /package/{cli/dist → dist}/core/dashboard/server.js +0 -0
  331. /package/{cli/dist → dist}/core/dashboard/types.d.ts +0 -0
  332. /package/{cli/dist → dist}/core/dashboard/types.js +0 -0
  333. /package/{cli/dist → dist}/core/discoverer/index.d.ts +0 -0
  334. /package/{cli/dist → dist}/core/discoverer/index.js +0 -0
  335. /package/{cli/dist → dist}/core/fixtures/loader.d.ts +0 -0
  336. /package/{cli/dist → dist}/core/fixtures/loader.js +0 -0
  337. /package/{cli/dist → dist}/core/fixtures/resolver.d.ts +0 -0
  338. /package/{cli/dist → dist}/core/fixtures/resolver.js +0 -0
  339. /package/{cli/dist → dist}/core/fixtures/types.d.ts +0 -0
  340. /package/{cli/dist → dist}/core/fixtures/types.js +0 -0
  341. /package/{cli/dist → dist}/core/flakiness/index.d.ts +0 -0
  342. /package/{cli/dist → dist}/core/flakiness/index.js +0 -0
  343. /package/{cli/dist → dist}/core/generation/code-formatter.d.ts +0 -0
  344. /package/{cli/dist → dist}/core/generation/code-formatter.js +0 -0
  345. /package/{cli/dist → dist}/core/generation/code-generator.d.ts +0 -0
  346. /package/{cli/dist → dist}/core/generation/code-generator.js +0 -0
  347. /package/{cli/dist → dist}/core/generation/generator.d.ts +0 -0
  348. /package/{cli/dist → dist}/core/generation/generator.js +0 -0
  349. /package/{cli/dist → dist}/core/generation/pack-generator.d.ts +0 -0
  350. /package/{cli/dist → dist}/core/generation/pack-generator.js +0 -0
  351. /package/{cli/dist → dist}/core/generation/prompt-builder.d.ts +0 -0
  352. /package/{cli/dist → dist}/core/generation/prompt-builder.js +0 -0
  353. /package/{cli/dist → dist}/core/generation/source-analyzer.d.ts +0 -0
  354. /package/{cli/dist → dist}/core/generation/source-analyzer.js +0 -0
  355. /package/{cli/dist → dist}/core/generation/test-optimizer.d.ts +0 -0
  356. /package/{cli/dist → dist}/core/generation/test-optimizer.js +0 -0
  357. /package/{cli/dist → dist}/core/generation/types.d.ts +0 -0
  358. /package/{cli/dist → dist}/core/generation/types.js +0 -0
  359. /package/{cli/dist → dist}/core/hooks/compose.d.ts +0 -0
  360. /package/{cli/dist → dist}/core/hooks/compose.js +0 -0
  361. /package/{cli/dist → dist}/core/hooks/runner.d.ts +0 -0
  362. /package/{cli/dist → dist}/core/hooks/runner.js +0 -0
  363. /package/{cli/dist → dist}/core/pack/migrator.d.ts +0 -0
  364. /package/{cli/dist → dist}/core/pack/migrator.js +0 -0
  365. /package/{cli/dist → dist}/core/pack/validator.d.ts +0 -0
  366. /package/{cli/dist → dist}/core/pack-v2/index.d.ts +0 -0
  367. /package/{cli/dist → dist}/core/pack-v2/index.js +0 -0
  368. /package/{cli/dist → dist}/core/pack-v2/loader.d.ts +0 -0
  369. /package/{cli/dist → dist}/core/pack-v2/loader.js +0 -0
  370. /package/{cli/dist → dist}/core/pack-v2/validator.d.ts +0 -0
  371. /package/{cli/dist → dist}/core/parallel/index.d.ts +0 -0
  372. /package/{cli/dist → dist}/core/parallel/index.js +0 -0
  373. /package/{cli/dist → dist}/core/parallel/parallel-runner.d.ts +0 -0
  374. /package/{cli/dist → dist}/core/parallel/parallel-runner.js +0 -0
  375. /package/{cli/dist → dist}/core/pom/base-page.d.ts +0 -0
  376. /package/{cli/dist → dist}/core/pom/index.d.ts +0 -0
  377. /package/{cli/dist → dist}/core/pom/index.js +0 -0
  378. /package/{cli/dist → dist}/core/pom/loader.d.ts +0 -0
  379. /package/{cli/dist → dist}/core/pom/types.d.ts +0 -0
  380. /package/{cli/dist → dist}/core/pom/types.js +0 -0
  381. /package/{cli/dist → dist}/core/proof/bundle.d.ts +0 -0
  382. /package/{cli/dist → dist}/core/proof/bundle.js +0 -0
  383. /package/{cli/dist → dist}/core/proof/canonicalize.d.ts +0 -0
  384. /package/{cli/dist → dist}/core/proof/canonicalize.js +0 -0
  385. /package/{cli/dist → dist}/core/proof/index.d.ts +0 -0
  386. /package/{cli/dist → dist}/core/proof/index.js +0 -0
  387. /package/{cli/dist → dist}/core/proof/schema.d.ts +0 -0
  388. /package/{cli/dist → dist}/core/proof/schema.js +0 -0
  389. /package/{cli/dist → dist}/core/proof/signer.d.ts +0 -0
  390. /package/{cli/dist → dist}/core/proof/signer.js +0 -0
  391. /package/{cli/dist → dist}/core/proof/verifier.d.ts +0 -0
  392. /package/{cli/dist → dist}/core/proof/verifier.js +0 -0
  393. /package/{cli/dist → dist}/core/regression/detector.d.ts +0 -0
  394. /package/{cli/dist → dist}/core/regression/detector.js +0 -0
  395. /package/{cli/dist → dist}/core/regression/index.d.ts +0 -0
  396. /package/{cli/dist → dist}/core/regression/index.js +0 -0
  397. /package/{cli/dist → dist}/core/regression/trend-analyzer.d.ts +0 -0
  398. /package/{cli/dist → dist}/core/regression/trend-analyzer.js +0 -0
  399. /package/{cli/dist → dist}/core/regression/types.d.ts +0 -0
  400. /package/{cli/dist → dist}/core/regression/types.js +0 -0
  401. /package/{cli/dist → dist}/core/regression/vault.d.ts +0 -0
  402. /package/{cli/dist → dist}/core/regression/vault.js +0 -0
  403. /package/{cli/dist → dist}/core/repair/engine/fixer.d.ts +0 -0
  404. /package/{cli/dist → dist}/core/repair/engine/fixer.js +0 -0
  405. /package/{cli/dist → dist}/core/repair/engine/suggestion-engine.d.ts +0 -0
  406. /package/{cli/dist → dist}/core/repair/engine/suggestion-engine.js +0 -0
  407. /package/{cli/dist → dist}/core/repair/index.d.ts +0 -0
  408. /package/{cli/dist → dist}/core/repair/index.js +0 -0
  409. /package/{cli/dist → dist}/core/repair/repairer.d.ts +0 -0
  410. /package/{cli/dist → dist}/core/repair/repairer.js +0 -0
  411. /package/{cli/dist → dist}/core/repair/types.d.ts +0 -0
  412. /package/{cli/dist → dist}/core/repair/types.js +0 -0
  413. /package/{cli/dist → dist}/core/repair/utils/error-analyzer.d.ts +0 -0
  414. /package/{cli/dist → dist}/core/repair/utils/error-analyzer.js +0 -0
  415. /package/{cli/dist → dist}/core/reporting/html-reporter.d.ts +0 -0
  416. /package/{cli/dist → dist}/core/reporting/html-reporter.js +0 -0
  417. /package/{cli/dist → dist}/core/retry/flakiness-integration.d.ts +0 -0
  418. /package/{cli/dist → dist}/core/retry/flakiness-integration.js +0 -0
  419. /package/{cli/dist → dist}/core/retry/index.d.ts +0 -0
  420. /package/{cli/dist → dist}/core/retry/index.js +0 -0
  421. /package/{cli/dist → dist}/core/retry/retry-engine.d.ts +0 -0
  422. /package/{cli/dist → dist}/core/retry/retry-engine.js +0 -0
  423. /package/{cli/dist → dist}/core/retry/types.d.ts +0 -0
  424. /package/{cli/dist → dist}/core/retry/types.js +0 -0
  425. /package/{cli/dist → dist}/core/retry/vault.d.ts +0 -0
  426. /package/{cli/dist → dist}/core/retry/vault.js +0 -0
  427. /package/{cli/dist → dist}/core/schemas/pack.schema.json +0 -0
  428. /package/{cli/dist → dist}/core/secrets/crypto.d.ts +0 -0
  429. /package/{cli/dist → dist}/core/secrets/crypto.js +0 -0
  430. /package/{cli/dist → dist}/core/secrets/manager.d.ts +0 -0
  431. /package/{cli/dist → dist}/core/secrets/manager.js +0 -0
  432. /package/{cli/dist → dist}/core/security/redaction-patterns-extended.d.ts +0 -0
  433. /package/{cli/dist → dist}/core/security/redaction-patterns-extended.js +0 -0
  434. /package/{cli/dist → dist}/core/security/redactor.d.ts +0 -0
  435. /package/{cli/dist → dist}/core/security/redactor.js +0 -0
  436. /package/{cli/dist → dist}/core/self-healing/assertion-healer.d.ts +0 -0
  437. /package/{cli/dist → dist}/core/self-healing/assertion-healer.js +0 -0
  438. /package/{cli/dist → dist}/core/self-healing/engine.d.ts +0 -0
  439. /package/{cli/dist → dist}/core/self-healing/engine.js +0 -0
  440. /package/{cli/dist → dist}/core/self-healing/index.d.ts +0 -0
  441. /package/{cli/dist → dist}/core/self-healing/index.js +0 -0
  442. /package/{cli/dist → dist}/core/self-healing/selector-healer.d.ts +0 -0
  443. /package/{cli/dist → dist}/core/self-healing/selector-healer.js +0 -0
  444. /package/{cli/dist → dist}/core/self-healing/types.d.ts +0 -0
  445. /package/{cli/dist → dist}/core/self-healing/types.js +0 -0
  446. /package/{cli/dist → dist}/core/serve/diagnostics-collector.d.ts +0 -0
  447. /package/{cli/dist → dist}/core/serve/diagnostics-collector.js +0 -0
  448. /package/{cli/dist → dist}/core/serve/health-checker.d.ts +0 -0
  449. /package/{cli/dist → dist}/core/serve/health-checker.js +0 -0
  450. /package/{cli/dist → dist}/core/serve/index.d.ts +0 -0
  451. /package/{cli/dist → dist}/core/serve/index.js +0 -0
  452. /package/{cli/dist → dist}/core/serve/metrics-collector.d.ts +0 -0
  453. /package/{cli/dist → dist}/core/serve/metrics-collector.js +0 -0
  454. /package/{cli/dist → dist}/core/serve/process-manager.d.ts +0 -0
  455. /package/{cli/dist → dist}/core/serve/process-manager.js +0 -0
  456. /package/{cli/dist → dist}/core/serve/server.d.ts +0 -0
  457. /package/{cli/dist → dist}/core/serve/server.js +0 -0
  458. /package/{cli/dist → dist}/core/slo/config.d.ts +0 -0
  459. /package/{cli/dist → dist}/core/slo/config.js +0 -0
  460. /package/{cli/dist → dist}/core/slo/index.d.ts +0 -0
  461. /package/{cli/dist → dist}/core/slo/index.js +0 -0
  462. /package/{cli/dist → dist}/core/slo/sli-calculator.d.ts +0 -0
  463. /package/{cli/dist → dist}/core/slo/sli-calculator.js +0 -0
  464. /package/{cli/dist → dist}/core/slo/slo-tracker.d.ts +0 -0
  465. /package/{cli/dist → dist}/core/slo/slo-tracker.js +0 -0
  466. /package/{cli/dist → dist}/core/slo/types.d.ts +0 -0
  467. /package/{cli/dist → dist}/core/slo/types.js +0 -0
  468. /package/{cli/dist → dist}/core/slo/vault.d.ts +0 -0
  469. /package/{cli/dist → dist}/core/slo/vault.js +0 -0
  470. /package/{cli/dist → dist}/core/tui/index.d.ts +0 -0
  471. /package/{cli/dist → dist}/core/tui/index.js +0 -0
  472. /package/{cli/dist → dist}/core/tui/monitor.d.ts +0 -0
  473. /package/{cli/dist → dist}/core/tui/monitor.js +0 -0
  474. /package/{cli/dist → dist}/core/tui/renderer.d.ts +0 -0
  475. /package/{cli/dist → dist}/core/tui/renderer.js +0 -0
  476. /package/{cli/dist → dist}/core/tui/types.d.ts +0 -0
  477. /package/{cli/dist → dist}/core/tui/types.js +0 -0
  478. /package/{cli/dist → dist}/core/types/pack-v1.js +0 -0
  479. /package/{cli/dist → dist}/core/types/pack-v2.js +0 -0
  480. /package/{cli/dist → dist}/core/types/trust-score.d.ts +0 -0
  481. /package/{cli/dist → dist}/core/types/trust-score.js +0 -0
  482. /package/{cli/dist → dist}/core/vault/cas.d.ts +0 -0
  483. /package/{cli/dist → dist}/core/vault/cas.js +0 -0
  484. /package/{cli/dist → dist}/core/vault/index.d.ts +0 -0
  485. /package/{cli/dist → dist}/core/vault/index.js +0 -0
  486. /package/{cli/dist → dist}/core/visual/visual-regression.d.ts +0 -0
  487. /package/{cli/dist → dist}/core/visual/visual-regression.js +0 -0
  488. /package/{cli/dist → dist}/core/watch/index.d.ts +0 -0
  489. /package/{cli/dist → dist}/core/watch/index.js +0 -0
  490. /package/{cli/dist → dist}/core/watch/watch-mode.d.ts +0 -0
  491. /package/{cli/dist → dist}/core/watch/watch-mode.js +0 -0
  492. /package/{cli/dist → dist}/generators/index.d.ts +0 -0
  493. /package/{cli/dist → dist}/generators/index.js +0 -0
  494. /package/{cli/dist → dist}/generators/json-reporter.d.ts +0 -0
  495. /package/{cli/dist → dist}/generators/json-reporter.js +0 -0
  496. /package/{cli/dist → dist}/generators/test-generator.d.ts +0 -0
  497. /package/{cli/dist → dist}/generators/test-generator.js +0 -0
  498. /package/{cli/dist → dist}/index.d.ts +0 -0
  499. /package/{cli/dist → dist}/index.js +0 -0
  500. /package/{cli/dist → dist}/scanners/dom-scanner.d.ts +0 -0
  501. /package/{cli/dist → dist}/scanners/dom-scanner.js +0 -0
  502. /package/{cli/dist → dist}/scanners/index.d.ts +0 -0
  503. /package/{cli/dist → dist}/scanners/index.js +0 -0
  504. /package/{cli/dist → dist}/schemas/pack.schema.json +0 -0
  505. /package/{cli/dist → dist}/types/scan.d.ts +0 -0
  506. /package/{cli/dist → dist}/types/scan.js +0 -0
  507. /package/{cli/dist → dist}/utils/config.js +0 -0
@@ -2,9 +2,25 @@
2
2
  * QA360 Selector Generator
3
3
  *
4
4
  * Generates stable, resilient CSS selectors for web elements
5
+ *
6
+ * NOW WITH INTELLIGENT PROFILE-AWARE GENERATION!
7
+ * The selector generation adapts to the detected site profile:
8
+ * - PROFIL_MODERN: data-testid first (React apps, SaaS)
9
+ * - PROFIL_ACCESSIBLE: ARIA role first (banks, government)
10
+ * - PROFIL_LEGACY: Semantic ID first (ASP.NET, PHP legacy)
11
+ * - PROFIL_MINIMAL: Text content first (landing pages)
5
12
  */
13
+ import { isGeneratedId as checkGeneratedId, isUtilityClass as checkUtilityClass } from './intelligent-selector-generator.js';
14
+ // ═══════════════════════════════════════════════════════════════════════════════
15
+ // RE-EXPORT INTELLIGENT SELECTOR GENERATOR
16
+ // ═══════════════════════════════════════════════════════════════════════════════
17
+ export { SiteProfiler, analyzeSite, determineSiteProfile, } from './site-profiler.js';
18
+ export { IntelligentSelectorGenerator, generateSelector as generateIntelligentSelector, generateSelectorWithMetadata, initializeSelectorGenerator, getSiteProfile, getSelectorStrategy, SELECTOR_STRATEGIES, isGeneratedId, isSemanticId, isUtilityClass, } from './intelligent-selector-generator.js';
19
+ // ═══════════════════════════════════════════════════════════════════════════════
20
+ // LEGACY API (for backward compatibility)
21
+ // ═══════════════════════════════════════════════════════════════════════════════
6
22
  /**
7
- * Selector priority (most stable first)
23
+ * Selector priority (most stable first) - LEGACY
8
24
  */
9
25
  const SELECTOR_PRIORITY = [
10
26
  'data-testid', // Best: explicit test attribute
@@ -50,9 +66,12 @@ export function generateSelector(element) {
50
66
  if (className && !isGenericClass(className)) {
51
67
  const classes = className.split(' ').filter(c => !isGenericClass(c));
52
68
  if (classes.length > 0) {
53
- const classSelector = classes.map(c => `.${escapeCss(c)}`).join('');
54
- // Qualify with tag if available
55
- return tagName ? `${tagName}${classSelector}` : classSelector;
69
+ // Smart class selection: prioritize meaningful classes
70
+ const meaningfulClasses = selectMeaningfulClasses(classes);
71
+ const classSelector = meaningfulClasses.map(c => `.${escapeCss(c)}`).join('');
72
+ // Limit total selector length
73
+ const qualifiedSelector = tagName ? `${tagName}${classSelector}` : classSelector;
74
+ return truncateSelector(qualifiedSelector, 200);
56
75
  }
57
76
  }
58
77
  // 7. Tag + text content (for buttons, links)
@@ -116,32 +135,23 @@ export async function generateSelectorFromElement(element, page) {
116
135
  }
117
136
  /**
118
137
  * Check if ID is auto-generated (not stable)
138
+ * Uses enhanced patterns from intelligent-selector-generator
119
139
  */
120
140
  function isGeneratedId(id) {
121
- // Patterns indicating auto-generated IDs
122
- const generatedPatterns = [
123
- /^\w+_\d+$/, // react_123, vue_456
124
- /^(ember|ember)\d+$/, // ember1234
125
- /^yui_[^_]+_\d+$/, // yui_gen_123
126
- /^\w+-\w+-\w+$/, // random-hash patterns
127
- /^[a-f0-9]{8,}$/, // hex hashes
128
- ];
129
- return generatedPatterns.some(pattern => pattern.test(id));
141
+ return checkGeneratedId(id);
130
142
  }
131
143
  /**
132
- * Check if class is too generic
144
+ * Check if class is too generic or utility class
145
+ * Uses enhanced patterns from intelligent-selector-generator
133
146
  */
134
147
  function isGenericClass(className) {
135
- const genericClasses = [
136
- 'active', 'inactive', 'selected', 'disabled', 'enabled',
137
- 'hidden', 'visible', 'show', 'hide', 'open', 'closed',
138
- 'first', 'last', 'odd', 'even',
139
- 'container', 'wrapper', 'content', 'section',
140
- 'btn', 'button', 'input', 'form', 'field',
141
- 'row', 'col', 'column', 'grid',
142
- ];
148
+ // For single class check
143
149
  const classes = className.split(' ');
144
- return classes.every(c => genericClasses.includes(c));
150
+ if (classes.length === 1) {
151
+ return checkUtilityClass(className);
152
+ }
153
+ // For multiple classes, check if ALL are utility
154
+ return classes.every(c => checkUtilityClass(c));
145
155
  }
146
156
  /**
147
157
  * Check if selector is considered stable
@@ -169,6 +179,72 @@ function isSelectorStable(selector) {
169
179
  function escapeCss(str) {
170
180
  return str.replace(/(["\\])/g, '\\$1').replace(/"/g, '\\"');
171
181
  }
182
+ /**
183
+ * Select the most meaningful classes from a class list
184
+ * Prioritizes: unique identifiers, component names, action-oriented classes
185
+ * Deprioritizes: utility classes (spacing, colors, sizing)
186
+ */
187
+ function selectMeaningfulClasses(classes) {
188
+ // Tailwind and other utility class patterns to deprioritize
189
+ const utilityPatterns = [
190
+ /^(p|m|px|py|pt|pb|pl|pr)-/, // spacing
191
+ /^(mt|mb|ml|mr)-/, // margin spacing
192
+ /^(text|bg|border)-/, // colors
193
+ /^(w|h)-/, // sizing
194
+ /^(flex|grid|block|inline)/, // display
195
+ /^(justify|items|self)/, // flexbox/grid
196
+ /^(rounded|shadow|opacity)/, // styling
197
+ /^gap-/, // flex gap
198
+ /^(line-)?height-/, // height
199
+ /^(font|weight|size)/, // typography
200
+ ];
201
+ // Score each class by "meaningfulness"
202
+ const scored = classes.map(cls => {
203
+ let score = 50; // base score
204
+ // Bonus: component-like names (contain meaningful words)
205
+ if (/[A-Z][a-z]+/.test(cls))
206
+ score += 30; // CamelCase components
207
+ if (/button|btn|input|form|card|modal|nav|header|footer|sidebar|menu|dropdown/i.test(cls))
208
+ score += 25;
209
+ // Bonus: contains numbers (likely unique)
210
+ if (/\d+/.test(cls))
211
+ score += 15;
212
+ // Penalty: utility classes
213
+ for (const pattern of utilityPatterns) {
214
+ if (pattern.test(cls)) {
215
+ score -= 40;
216
+ break;
217
+ }
218
+ }
219
+ return { class: cls, score };
220
+ });
221
+ // Sort by score (descending) and take top 5
222
+ scored.sort((a, b) => b.score - a.score);
223
+ return scored.slice(0, 5).map(s => s.class);
224
+ }
225
+ /**
226
+ * Truncate selector to max length while keeping it valid
227
+ * Preserves the most specific parts
228
+ */
229
+ function truncateSelector(selector, maxLength) {
230
+ if (selector.length <= maxLength)
231
+ return selector;
232
+ // For class-based selectors, remove classes from the middle
233
+ const classMatch = selector.match(/^(\w+)((\.[\w-]+)+)$/);
234
+ if (classMatch) {
235
+ const tag = classMatch[1];
236
+ const classes = classMatch[2].split('.').filter(c => c); // Remove empty strings
237
+ // Keep first 2 and last 2 classes (most specific)
238
+ if (classes.length > 4) {
239
+ const kept = [...classes.slice(0, 2), ...classes.slice(-2)];
240
+ const truncated = `${tag}.${kept.join('.')}`;
241
+ if (truncated.length <= maxLength)
242
+ return truncated;
243
+ }
244
+ }
245
+ // Final fallback: just truncate (may not be valid CSS but prevents overflow)
246
+ return selector.substring(0, maxLength - 3) + '...';
247
+ }
172
248
  /**
173
249
  * Optimize selector for resiliency
174
250
  */
@@ -0,0 +1,89 @@
1
+ /**
2
+ * QA360 Site Profiler
3
+ *
4
+ * Analyzes a website to detect its characteristics and determine
5
+ * the optimal selector strategy. This enables adaptive testing
6
+ * based on the site's framework, accessibility, and testing maturity.
7
+ *
8
+ * Philosophy: "Know the site to test it better"
9
+ */
10
+ import type { Page } from '@playwright/test';
11
+ /**
12
+ * Site analysis results
13
+ */
14
+ export interface SiteAnalysis {
15
+ hasTestIds: number;
16
+ hasAriaLabels: number;
17
+ hasRoles: number;
18
+ hasSemanticIds: number;
19
+ hasLabels: number;
20
+ hasPlaceholders: number;
21
+ hasAltTexts: number;
22
+ totalElements: number;
23
+ framework: Framework | null;
24
+ cssFramework: CssFramework | null;
25
+ testabilityScore: number;
26
+ accessibilityScore: number;
27
+ patterns: {
28
+ hasReact: boolean;
29
+ hasVue: boolean;
30
+ hasAngular: boolean;
31
+ hasSvelte: boolean;
32
+ hasNext: boolean;
33
+ hasNuxt: boolean;
34
+ hasRemix: boolean;
35
+ hasAstro: boolean;
36
+ hasTailwind: boolean;
37
+ hasBootstrap: boolean;
38
+ hasMUI: boolean;
39
+ hasChakra: boolean;
40
+ hasAntDesign: boolean;
41
+ hasBulma: boolean;
42
+ };
43
+ }
44
+ /**
45
+ * Detected JavaScript frameworks
46
+ */
47
+ export type Framework = 'react' | 'vue' | 'angular' | 'svelte' | 'next' | 'nuxt' | 'remix' | 'astro' | 'solid' | 'preact' | 'lit' | 'stencil' | null;
48
+ /**
49
+ * Detected CSS frameworks
50
+ */
51
+ export type CssFramework = 'tailwind' | 'bootstrap' | 'mui' | 'chakra' | 'ant' | 'bulma' | 'foundation' | 'spectacle' | 'tachyons' | null;
52
+ /**
53
+ * Site profile type
54
+ */
55
+ export type SiteProfile = 'PROFIL_MODERN' | 'PROFIL_ACCESSIBLE' | 'PROFIL_LEGACY' | 'PROFIL_MINIMAL';
56
+ /**
57
+ * Site Profiler - Analyzes websites for adaptive testing
58
+ */
59
+ export declare class SiteProfiler {
60
+ /**
61
+ * Analyze the current page to determine site characteristics
62
+ * Called ONCE at the beginning of the crawl
63
+ */
64
+ analyzeSite(page: Page): Promise<SiteAnalysis>;
65
+ /**
66
+ * Determine the site profile based on analysis
67
+ */
68
+ determineProfile(analysis: SiteAnalysis): SiteProfile;
69
+ /**
70
+ * Get a human-readable description of the profile
71
+ */
72
+ getProfileDescription(profile: SiteProfile): string;
73
+ /**
74
+ * Get the recommended strategy for the profile
75
+ */
76
+ getRecommendedStrategy(profile: SiteProfile): string;
77
+ }
78
+ /**
79
+ * Default profiler instance
80
+ */
81
+ export declare const defaultProfiler: SiteProfiler;
82
+ /**
83
+ * Quick analyze function (convenience wrapper)
84
+ */
85
+ export declare function analyzeSite(page: Page): Promise<SiteAnalysis>;
86
+ /**
87
+ * Quick profile determination (convenience wrapper)
88
+ */
89
+ export declare function determineSiteProfile(analysis: SiteAnalysis): SiteProfile;
@@ -0,0 +1,290 @@
1
+ /**
2
+ * QA360 Site Profiler
3
+ *
4
+ * Analyzes a website to detect its characteristics and determine
5
+ * the optimal selector strategy. This enables adaptive testing
6
+ * based on the site's framework, accessibility, and testing maturity.
7
+ *
8
+ * Philosophy: "Know the site to test it better"
9
+ */
10
+ /**
11
+ * Site Profiler - Analyzes websites for adaptive testing
12
+ */
13
+ export class SiteProfiler {
14
+ /**
15
+ * Analyze the current page to determine site characteristics
16
+ * Called ONCE at the beginning of the crawl
17
+ */
18
+ async analyzeSite(page) {
19
+ const analysis = await page.evaluate(() => {
20
+ // Count test ID attributes
21
+ const testIds = document.querySelectorAll('[data-testid], [data-cy], [data-test], [data-test-id], [data-qa], [data-automation], [data-e2e], [data-selenium]').length;
22
+ // Count ARIA attributes
23
+ const ariaLabels = document.querySelectorAll('[aria-label]').length;
24
+ const ariaLabelledby = document.querySelectorAll('[aria-labelledby]').length;
25
+ const ariaDescriptions = document.querySelectorAll('[aria-describedby]').length;
26
+ const roles = document.querySelectorAll('[role]').length;
27
+ // Count form accessibility
28
+ const labels = document.querySelectorAll('label[for]').length;
29
+ const placeholders = document.querySelectorAll('[placeholder]').length;
30
+ // Count images with alt text
31
+ const altTexts = document.querySelectorAll('img[alt]:not([alt=""])').length;
32
+ // Count semantic HTML
33
+ const semanticTags = document.querySelectorAll('main, nav, header, footer, article, section, aside, dialog, modal').length;
34
+ // Count interactive elements
35
+ const buttons = document.querySelectorAll('button, [role="button"]').length;
36
+ const inputs = document.querySelectorAll('input, select, textarea').length;
37
+ const links = document.querySelectorAll('a[href]').length;
38
+ const totalInteractive = buttons + inputs + links;
39
+ // === FRAMEWORK DETECTION ===
40
+ // React
41
+ const hasReact = !!(document.querySelector('[data-reactroot], [data-reactid]') ||
42
+ window.__REACT_DEVTOOLS_GLOBAL_HOOK__ ||
43
+ window.React ||
44
+ document.querySelector('[data-react-checksum]'));
45
+ // Next.js
46
+ const hasNext = !!(document.querySelector('[data-next-page]') ||
47
+ document.querySelector('style[id^="__jsx-"]') ||
48
+ document.querySelector('script[id^="__NEXT_DATA__"]'));
49
+ // Vue
50
+ const hasVue = !!(document.querySelector('[data-v-]') ||
51
+ window.__VUE__ ||
52
+ window.Vue);
53
+ // Nuxt
54
+ const hasNuxt = !!(document.querySelector('[data-n-]') ||
55
+ document.querySelector('[data-nuxt-]') ||
56
+ window.__NUXT__);
57
+ // Angular
58
+ const hasAngular = !!(document.querySelector('[ng-version], [_nghost-], [_ngcontent-]') ||
59
+ window.ng ||
60
+ window.getAllAngularRootElements);
61
+ // Svelte
62
+ const hasSvelte = !!(document.querySelector('[class*="svelte-"]') ||
63
+ window.__SVELTE__);
64
+ // Remix
65
+ const hasRemix = !!(document.querySelector('script[remix]') ||
66
+ document.querySelector('[data-remix-]') ||
67
+ document.querySelector('link[href*="remix"]'));
68
+ // Astro
69
+ const hasAstro = !!(document.querySelector('[data-astro-]') ||
70
+ document.querySelector('astro-island, astro-fragment'));
71
+ // Stencil
72
+ const hasStencil = !!(document.querySelector('[class*="hydrated"]') ||
73
+ window.stencil);
74
+ // SolidJS
75
+ const hasSolid = !!window.SolidJS;
76
+ // Preact
77
+ const hasPreact = !!window.preact;
78
+ // Lit
79
+ const hasLit = !!document.querySelector('shadow-root') || !!window.LitElement;
80
+ // === CSS FRAMEWORK DETECTION ===
81
+ // Tailwind CSS
82
+ const hasTailwind = !!(document.querySelector('[class*="flex"][class*="items-"]') ||
83
+ document.querySelector('[class*="bg-"][class*="-500"]') ||
84
+ document.querySelector('[class*="hover:"][class*="bg-"]') ||
85
+ document.querySelector('script[src*="tailwind"]'));
86
+ // Bootstrap
87
+ const hasBootstrap = !!(document.querySelector('[class*="col-"][class*="row"]') ||
88
+ document.querySelector('[class*="btn-"][class*="primary"]') ||
89
+ document.querySelector('[class*="navbar"]') ||
90
+ document.querySelector('link[href*="bootstrap"]'));
91
+ // Material UI
92
+ const hasMUI = !!(document.querySelector('[class*="Mui"]') ||
93
+ document.querySelector('[class^="css-"][class*="-"]') ||
94
+ document.querySelector('svg[class*="MuiSvg"]'));
95
+ // Chakra UI
96
+ const hasChakra = !!(document.querySelector('[class*="chakra-"]') ||
97
+ document.querySelector('[data-chakra]'));
98
+ // Ant Design
99
+ const hasAnt = !!(document.querySelector('[class*="ant-"]') ||
100
+ document.querySelector('[class^="ant-"]'));
101
+ // Bulma
102
+ const hasBulma = !!(document.querySelector('[class*="is-"][class*="primary"]') ||
103
+ document.querySelector('[class*="navbar"]') ||
104
+ document.querySelector('link[href*="bulma"]'));
105
+ // Foundation
106
+ const hasFoundation = !!(document.querySelector('[class*="grid-"]') ||
107
+ document.querySelector('link[href*="foundation"]'));
108
+ // Tachyons
109
+ const hasTachyons = !!(document.querySelector('[class*="flex"][class*="items-center"]') ||
110
+ document.querySelector('link[href*="tachyons"]'));
111
+ return {
112
+ testIds,
113
+ ariaLabels,
114
+ ariaLabelledby,
115
+ ariaDescriptions,
116
+ roles,
117
+ labels,
118
+ placeholders,
119
+ altTexts,
120
+ semanticTags,
121
+ buttons,
122
+ inputs,
123
+ links,
124
+ totalInteractive,
125
+ hasReact,
126
+ hasNext,
127
+ hasVue,
128
+ hasNuxt,
129
+ hasAngular,
130
+ hasSvelte,
131
+ hasRemix,
132
+ hasAstro,
133
+ hasStencil,
134
+ hasSolid,
135
+ hasPreact,
136
+ hasLit,
137
+ hasTailwind,
138
+ hasBootstrap,
139
+ hasMUI,
140
+ hasChakra,
141
+ hasAnt,
142
+ hasBulma,
143
+ hasFoundation,
144
+ hasTachyons,
145
+ };
146
+ });
147
+ // Calculate totals
148
+ const totalElements = analysis.totalInteractive || 1;
149
+ const totalAria = analysis.ariaLabels + analysis.ariaLabelledby + analysis.ariaDescriptions;
150
+ // Determine framework
151
+ let framework = null;
152
+ if (analysis.hasNext)
153
+ framework = 'next';
154
+ else if (analysis.hasReact)
155
+ framework = 'react';
156
+ else if (analysis.hasNuxt)
157
+ framework = 'nuxt';
158
+ else if (analysis.hasVue)
159
+ framework = 'vue';
160
+ else if (analysis.hasRemix)
161
+ framework = 'remix';
162
+ else if (analysis.hasAngular)
163
+ framework = 'angular';
164
+ else if (analysis.hasAstro)
165
+ framework = 'astro';
166
+ else if (analysis.hasSvelte)
167
+ framework = 'svelte';
168
+ else if (analysis.hasSolid)
169
+ framework = 'solid';
170
+ else if (analysis.hasPreact)
171
+ framework = 'preact';
172
+ else if (analysis.hasLit)
173
+ framework = 'lit';
174
+ else if (analysis.hasStencil)
175
+ framework = 'stencil';
176
+ // Determine CSS framework
177
+ let cssFramework = null;
178
+ if (analysis.hasTailwind)
179
+ cssFramework = 'tailwind';
180
+ else if (analysis.hasMUI)
181
+ cssFramework = 'mui';
182
+ else if (analysis.hasChakra)
183
+ cssFramework = 'chakra';
184
+ else if (analysis.hasAnt)
185
+ cssFramework = 'ant';
186
+ else if (analysis.hasBootstrap)
187
+ cssFramework = 'bootstrap';
188
+ else if (analysis.hasBulma)
189
+ cssFramework = 'bulma';
190
+ else if (analysis.hasFoundation)
191
+ cssFramework = 'foundation';
192
+ else if (analysis.hasTachyons)
193
+ cssFramework = 'tachyons';
194
+ // Calculate scores
195
+ const testabilityScore = Math.round((analysis.testIds / totalElements) * 100);
196
+ const accessibilityScore = Math.round(((totalAria + analysis.roles + analysis.labels + analysis.altTexts) / (totalElements * 2)) * 100);
197
+ return {
198
+ hasTestIds: analysis.testIds,
199
+ hasAriaLabels: totalAria,
200
+ hasRoles: analysis.roles,
201
+ hasSemanticIds: analysis.semanticTags,
202
+ hasLabels: analysis.labels,
203
+ hasPlaceholders: analysis.placeholders,
204
+ hasAltTexts: analysis.altTexts,
205
+ totalElements,
206
+ framework,
207
+ cssFramework,
208
+ testabilityScore,
209
+ accessibilityScore,
210
+ patterns: {
211
+ hasReact: analysis.hasReact,
212
+ hasVue: analysis.hasVue,
213
+ hasAngular: analysis.hasAngular,
214
+ hasSvelte: analysis.hasSvelte,
215
+ hasNext: analysis.hasNext,
216
+ hasNuxt: analysis.hasNuxt,
217
+ hasRemix: analysis.hasRemix,
218
+ hasAstro: analysis.hasAstro,
219
+ hasTailwind: analysis.hasTailwind,
220
+ hasBootstrap: analysis.hasBootstrap,
221
+ hasMUI: analysis.hasMUI,
222
+ hasChakra: analysis.hasChakra,
223
+ hasAntDesign: analysis.hasAnt,
224
+ hasBulma: analysis.hasBulma,
225
+ },
226
+ };
227
+ }
228
+ /**
229
+ * Determine the site profile based on analysis
230
+ */
231
+ determineProfile(analysis) {
232
+ const { hasTestIds, hasAriaLabels, totalElements } = analysis;
233
+ const testIdRatio = totalElements > 0 ? hasTestIds / totalElements : 0;
234
+ const a11yRatio = totalElements > 0 ? hasAriaLabels / totalElements : 0;
235
+ // PROFIL_MODERN: Site moderne avec data-testid (>30% des éléments)
236
+ if (testIdRatio > 0.3) {
237
+ return 'PROFIL_MODERN';
238
+ }
239
+ // PROFIL_ACCESSIBLE: Bonne accessibilité mais peu de testids
240
+ if (a11yRatio > 0.6 && testIdRatio < 0.1) {
241
+ return 'PROFIL_ACCESSIBLE';
242
+ }
243
+ // PROFIL_LEGACY: Site legacy avec peu d'attributs
244
+ if (analysis.accessibilityScore < 30 && testIdRatio < 0.05) {
245
+ return 'PROFIL_LEGACY';
246
+ }
247
+ // PROFIL_MINIMAL: Site minimaliste
248
+ return 'PROFIL_MINIMAL';
249
+ }
250
+ /**
251
+ * Get a human-readable description of the profile
252
+ */
253
+ getProfileDescription(profile) {
254
+ const descriptions = {
255
+ PROFIL_MODERN: 'Site moderne avec data-testid (React Testing Library, Cypress)',
256
+ PROFIL_ACCESSIBLE: 'Site accessible (ARIA, labels) mais sans testids',
257
+ PROFIL_LEGACY: 'Site legacy (ASP.NET, PHP ancien, WordPress)',
258
+ PROFIL_MINIMAL: 'Site minimaliste (landing pages, blogs)',
259
+ };
260
+ return descriptions[profile];
261
+ }
262
+ /**
263
+ * Get the recommended strategy for the profile
264
+ */
265
+ getRecommendedStrategy(profile) {
266
+ const strategies = {
267
+ PROFIL_MODERN: 'TIER 1 = data-testid (contrat explicite dev/QA)',
268
+ PROFIL_ACCESSIBLE: 'TIER 1 = role + aria-label (Testing Library)',
269
+ PROFIL_LEGACY: 'TIER 1 = ID sémantique, TIER 2 = name',
270
+ PROFIL_MINIMAL: 'TIER 1 = texte visible, TIER 2 = role',
271
+ };
272
+ return strategies[profile];
273
+ }
274
+ }
275
+ /**
276
+ * Default profiler instance
277
+ */
278
+ export const defaultProfiler = new SiteProfiler();
279
+ /**
280
+ * Quick analyze function (convenience wrapper)
281
+ */
282
+ export async function analyzeSite(page) {
283
+ return defaultProfiler.analyzeSite(page);
284
+ }
285
+ /**
286
+ * Quick profile determination (convenience wrapper)
287
+ */
288
+ export function determineSiteProfile(analysis) {
289
+ return defaultProfiler.determineProfile(analysis);
290
+ }
@@ -0,0 +1,144 @@
1
+ /**
2
+ * Source Maps Handler
3
+ *
4
+ * P1 - Source map parsing and error mapping
5
+ *
6
+ * Supports:
7
+ * - Source map detection
8
+ * - Source map parsing
9
+ * - Error stack trace mapping
10
+ * - Original source location resolution
11
+ * - Source content retrieval
12
+ *
13
+ * @see https://developer.mozilla.org/en-US/docs/Tools/Debugger/How_to/Use_a_source_map
14
+ */
15
+ export interface SourceMapLocation {
16
+ /** Generated file line number (1-based) */
17
+ generatedLine: number;
18
+ /** Generated file column number (1-based) */
19
+ generatedColumn: number;
20
+ /** Original source file */
21
+ originalSource: string | null;
22
+ /** Original file line number */
23
+ originalLine: number | null;
24
+ /** Original file column number */
25
+ originalColumn: number | null;
26
+ /** Function name */
27
+ name: string | null;
28
+ }
29
+ export interface SourceMapInfo {
30
+ /** Source map URL */
31
+ url: string;
32
+ /** Source map content (base64 or external) */
33
+ content: string | null;
34
+ /** Number of sources in the map */
35
+ sourceCount: number;
36
+ /** Source file names */
37
+ sources: string[];
38
+ /** Source root */
39
+ sourceRoot: string;
40
+ /** Has mappings */
41
+ hasMappings: boolean;
42
+ /** Source map format version */
43
+ version: number;
44
+ /** Whether source map is valid */
45
+ valid: boolean;
46
+ }
47
+ export interface MappedError {
48
+ /** Original error */
49
+ original: Error;
50
+ /** Mapped stack trace */
51
+ mappedStack: Array<{
52
+ filename: string;
53
+ line: number;
54
+ column: number;
55
+ function: string | null;
56
+ originalFilename: string | null;
57
+ originalLine: number | null;
58
+ originalColumn: number | null;
59
+ }>;
60
+ /** Source map was used */
61
+ sourceMapUsed: boolean;
62
+ }
63
+ export interface SourceMapResult {
64
+ /** Source maps found */
65
+ sourceMaps: Map<string, SourceMapInfo>;
66
+ /** Files with source maps */
67
+ filesWithSourceMaps: string[];
68
+ /** Files without source maps */
69
+ filesWithoutSourceMaps: string[];
70
+ /** Coverage percentage */
71
+ sourceMapCoverage: number;
72
+ }
73
+ /**
74
+ * Source Maps Handler class
75
+ */
76
+ export declare class SourceMapsHandler {
77
+ private page;
78
+ private sourceMapsCache;
79
+ constructor(page: any);
80
+ /**
81
+ * Get all source map URLs from the page
82
+ */
83
+ getSourceMapURLs(): Promise<Map<string, string>>;
84
+ /**
85
+ * Fetch and parse a source map
86
+ */
87
+ fetchSourceMap(sourceMapUrl: string): Promise<SourceMapInfo>;
88
+ /**
89
+ * Get all source maps from the page
90
+ */
91
+ getAllSourceMaps(): Promise<SourceMapResult>;
92
+ /**
93
+ * Map an error stack trace using source maps
94
+ */
95
+ mapError(error: Error): Promise<MappedError>;
96
+ /**
97
+ * Map a generated location to original location
98
+ */
99
+ mapLocation(filename: string, line: number, column: number): Promise<SourceMapLocation>;
100
+ /**
101
+ * Get original source content from source map
102
+ */
103
+ getOriginalSource(sourceMapUrl: string, sourceIndex: number): Promise<string | null>;
104
+ /**
105
+ * Check if source maps are enabled for a file
106
+ */
107
+ hasSourceMap(filename: string): Promise<boolean>;
108
+ /**
109
+ * Inject source map helper into the page
110
+ */
111
+ injectSourceMapHelper(): Promise<void>;
112
+ /**
113
+ * Validate source map quality
114
+ */
115
+ validateSourceMaps(): Promise<{
116
+ total: number;
117
+ valid: number;
118
+ invalid: number;
119
+ missing: number;
120
+ hasNames: number;
121
+ hasSourceContent: number;
122
+ avgSourceCount: number;
123
+ }>;
124
+ /**
125
+ * Get source map statistics
126
+ */
127
+ getStatistics(): Promise<{
128
+ sourceMapCoverage: number;
129
+ totalFiles: number;
130
+ filesWithSourceMaps: number;
131
+ avgMappingsPerFile: number;
132
+ avgSourcesPerFile: number;
133
+ recommendation: string;
134
+ }>;
135
+ /**
136
+ * Clear source map cache
137
+ */
138
+ clearCache(): void;
139
+ }
140
+ /**
141
+ * Factory function to create Source Maps Handler
142
+ */
143
+ export declare function createSourceMapsHandler(page: any): SourceMapsHandler;
144
+ export default SourceMapsHandler;