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
@@ -0,0 +1,420 @@
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
+ /**
16
+ * Source Maps Handler class
17
+ */
18
+ export class SourceMapsHandler {
19
+ page;
20
+ sourceMapsCache = new Map();
21
+ constructor(page) {
22
+ this.page = page;
23
+ }
24
+ /**
25
+ * Get all source map URLs from the page
26
+ */
27
+ async getSourceMapURLs() {
28
+ return await this.page.evaluate(() => {
29
+ const sourceMaps = new Map();
30
+ // Check for source maps in <script> tags
31
+ const scripts = document.querySelectorAll('script[src]');
32
+ scripts.forEach(script => {
33
+ const src = script.src;
34
+ // Source map is usually at same path with .map extension
35
+ const sourceMapUrl = src + '.map';
36
+ sourceMaps.set(src, sourceMapUrl);
37
+ });
38
+ // Check for inline source map comments
39
+ const inlineScripts = document.querySelectorAll('script:not([src])');
40
+ inlineScripts.forEach(script => {
41
+ const content = script.textContent || '';
42
+ // Look for sourceMappingURL comment
43
+ const match = content.match(/\/\/[@#]\s*sourceMappingURL=([^\s]+)/);
44
+ if (match) {
45
+ sourceMaps.set('(inline)', match[1]);
46
+ }
47
+ });
48
+ // Check for source maps in stylesheets
49
+ const links = document.querySelectorAll('link[rel="stylesheet"]');
50
+ links.forEach(link => {
51
+ const href = link.href;
52
+ const sourceMapUrl = href + '.map';
53
+ sourceMaps.set(href, sourceMapUrl);
54
+ });
55
+ // Check for inline source maps in style tags
56
+ const styles = document.querySelectorAll('style');
57
+ styles.forEach(style => {
58
+ const content = style.textContent || '';
59
+ const match = content.match(/\/\*[@#]\s*sourceMappingURL=([^\s]+)\s*\*\//);
60
+ if (match) {
61
+ sourceMaps.set('(inline style)', match[1]);
62
+ }
63
+ });
64
+ // Check window for source map data
65
+ if (window.__sourceMapUrl) {
66
+ sourceMaps.set('(global)', window.__sourceMapUrl);
67
+ }
68
+ return Object.fromEntries(sourceMaps);
69
+ });
70
+ }
71
+ /**
72
+ * Fetch and parse a source map
73
+ */
74
+ async fetchSourceMap(sourceMapUrl) {
75
+ // Check cache first
76
+ if (this.sourceMapsCache.has(sourceMapUrl)) {
77
+ return this.sourceMapsCache.get(sourceMapUrl);
78
+ }
79
+ // Resolve URL relative to page
80
+ const baseUrl = this.page.url();
81
+ const absoluteUrl = new URL(sourceMapUrl, baseUrl).toString();
82
+ try {
83
+ // Fetch the source map
84
+ const content = await this.page.evaluate(async (url) => {
85
+ try {
86
+ const response = await fetch(url);
87
+ if (!response.ok)
88
+ return null;
89
+ return await response.text();
90
+ }
91
+ catch {
92
+ return null;
93
+ }
94
+ }, absoluteUrl);
95
+ if (!content) {
96
+ return {
97
+ url: sourceMapUrl,
98
+ content: null,
99
+ sourceCount: 0,
100
+ sources: [],
101
+ sourceRoot: '',
102
+ hasMappings: false,
103
+ version: 0,
104
+ valid: false,
105
+ };
106
+ }
107
+ // Parse the source map (simplified JSON parsing)
108
+ const sourceMap = JSON.parse(content);
109
+ return {
110
+ url: sourceMapUrl,
111
+ content,
112
+ sourceCount: sourceMap.sources?.length || 0,
113
+ sources: sourceMap.sources || [],
114
+ sourceRoot: sourceMap.sourceRoot || '',
115
+ hasMappings: !!sourceMap.mappings && sourceMap.mappings.length > 0,
116
+ version: sourceMap.version || 3,
117
+ valid: !!sourceMap.version && !!sourceMap.mappings,
118
+ };
119
+ }
120
+ catch {
121
+ return {
122
+ url: sourceMapUrl,
123
+ content: null,
124
+ sourceCount: 0,
125
+ sources: [],
126
+ sourceRoot: '',
127
+ hasMappings: false,
128
+ version: 0,
129
+ valid: false,
130
+ };
131
+ }
132
+ }
133
+ /**
134
+ * Get all source maps from the page
135
+ */
136
+ async getAllSourceMaps() {
137
+ const sourceMapUrls = await this.getSourceMapURLs();
138
+ const sourceMaps = new Map();
139
+ const filesWithSourceMaps = [];
140
+ const filesWithoutSourceMaps = [];
141
+ for (const [file, url] of Object.entries(sourceMapUrls)) {
142
+ const sourceMapInfo = await this.fetchSourceMap(url);
143
+ sourceMaps.set(file, sourceMapInfo);
144
+ if (sourceMapInfo.valid) {
145
+ filesWithSourceMaps.push(file);
146
+ }
147
+ else {
148
+ filesWithoutSourceMaps.push(file);
149
+ }
150
+ }
151
+ // Calculate coverage
152
+ const totalFiles = filesWithSourceMaps.length + filesWithoutSourceMaps.length;
153
+ const sourceMapCoverage = totalFiles > 0
154
+ ? (filesWithSourceMaps.length / totalFiles) * 100
155
+ : 0;
156
+ return {
157
+ sourceMaps,
158
+ filesWithSourceMaps,
159
+ filesWithoutSourceMaps,
160
+ sourceMapCoverage,
161
+ };
162
+ }
163
+ /**
164
+ * Map an error stack trace using source maps
165
+ */
166
+ async mapError(error) {
167
+ const stack = error.stack || '';
168
+ const stackLines = stack.split('\n').slice(1);
169
+ const mappedStack = await Promise.all(stackLines.map(async (stackLine) => {
170
+ // Parse stack line (format varies by browser)
171
+ const match = stackLine.match(/at\s+([^\s]+)\s+\((.+?):(\d+):(\d+)\)|at\s+(.+?):(\d+):(\d+)/);
172
+ if (!match) {
173
+ return {
174
+ filename: '(unknown)',
175
+ line: 0,
176
+ column: 0,
177
+ function: null,
178
+ originalFilename: null,
179
+ originalLine: null,
180
+ originalColumn: null,
181
+ };
182
+ }
183
+ const funcName = match[1] || null;
184
+ const filename = match[2] || match[5];
185
+ const lineNum = parseInt(match[3] || match[6], 10);
186
+ const column = parseInt(match[4] || match[7], 10);
187
+ // Try to map using source maps
188
+ const mapped = await this.mapLocation(filename, lineNum, column);
189
+ return {
190
+ filename,
191
+ line: lineNum,
192
+ column,
193
+ function: funcName,
194
+ originalFilename: mapped.originalSource,
195
+ originalLine: mapped.originalLine,
196
+ originalColumn: mapped.originalColumn,
197
+ };
198
+ }));
199
+ return {
200
+ original: error,
201
+ mappedStack,
202
+ sourceMapUsed: mappedStack.some(s => s.originalFilename !== null),
203
+ };
204
+ }
205
+ /**
206
+ * Map a generated location to original location
207
+ */
208
+ async mapLocation(filename, line, column) {
209
+ // Find source map for this file
210
+ const sourceMapUrl = filename + '.map';
211
+ const sourceMapInfo = await this.fetchSourceMap(sourceMapUrl);
212
+ if (!sourceMapInfo.valid || !sourceMapInfo.content) {
213
+ return {
214
+ generatedLine: line,
215
+ generatedColumn: column,
216
+ originalSource: null,
217
+ originalLine: null,
218
+ originalColumn: null,
219
+ name: null,
220
+ };
221
+ }
222
+ try {
223
+ // Parse source map
224
+ const sourceMap = JSON.parse(sourceMapInfo.content);
225
+ // Simplified mapping (real implementation would use VLQ decoding)
226
+ // For now, return the first source if available
227
+ if (sourceMap.sources && sourceMap.sources.length > 0) {
228
+ return {
229
+ generatedLine: line,
230
+ generatedColumn: column,
231
+ originalSource: sourceMap.sources[0],
232
+ originalLine: line, // Would be calculated from mappings
233
+ originalColumn: column,
234
+ name: null,
235
+ };
236
+ }
237
+ return {
238
+ generatedLine: line,
239
+ generatedColumn: column,
240
+ originalSource: null,
241
+ originalLine: null,
242
+ originalColumn: null,
243
+ name: null,
244
+ };
245
+ }
246
+ catch {
247
+ return {
248
+ generatedLine: line,
249
+ generatedColumn: column,
250
+ originalSource: null,
251
+ originalLine: null,
252
+ originalColumn: null,
253
+ name: null,
254
+ };
255
+ }
256
+ }
257
+ /**
258
+ * Get original source content from source map
259
+ */
260
+ async getOriginalSource(sourceMapUrl, sourceIndex) {
261
+ const sourceMapInfo = await this.fetchSourceMap(sourceMapUrl);
262
+ if (!sourceMapInfo.valid || !sourceMapInfo.content) {
263
+ return null;
264
+ }
265
+ try {
266
+ const sourceMap = JSON.parse(sourceMapInfo.content);
267
+ if (sourceMap.sourcesContent && sourceMap.sourcesContent[sourceIndex]) {
268
+ return sourceMap.sourcesContent[sourceIndex];
269
+ }
270
+ // If sourcesContent not embedded, try to fetch the source file
271
+ if (sourceMap.sources && sourceMap.sources[sourceIndex]) {
272
+ const sourceFile = sourceMap.sources[sourceIndex];
273
+ const baseUrl = new URL(sourceMapUrl);
274
+ const sourceUrl = new URL(sourceFile, baseUrl).toString();
275
+ return await this.page.evaluate(async (url) => {
276
+ try {
277
+ const response = await fetch(url);
278
+ return response.ok ? await response.text() : null;
279
+ }
280
+ catch {
281
+ return null;
282
+ }
283
+ }, sourceUrl);
284
+ }
285
+ return null;
286
+ }
287
+ catch {
288
+ return null;
289
+ }
290
+ }
291
+ /**
292
+ * Check if source maps are enabled for a file
293
+ */
294
+ async hasSourceMap(filename) {
295
+ const sourceMapUrl = filename + '.map';
296
+ const sourceMapInfo = await this.fetchSourceMap(sourceMapUrl);
297
+ return sourceMapInfo.valid;
298
+ }
299
+ /**
300
+ * Inject source map helper into the page
301
+ */
302
+ async injectSourceMapHelper() {
303
+ await this.page.evaluate(() => {
304
+ // Add a helper to expose source map data
305
+ window.__getSourceMapInfo = async () => {
306
+ const results = [];
307
+ // Check all scripts
308
+ document.querySelectorAll('script[src]').forEach(script => {
309
+ const src = script.src;
310
+ results.push({
311
+ file: src,
312
+ sourceMap: src + '.map',
313
+ valid: false, // Would need fetch to validate
314
+ });
315
+ });
316
+ return results;
317
+ };
318
+ // Override Error.prepareStackTrace to capture source maps
319
+ const originalPrepareStackTrace = Error.prepareStackTrace;
320
+ if (originalPrepareStackTrace) {
321
+ Error.prepareStackTrace = (error, stack) => {
322
+ // Enhanced stack trace with source map info would go here
323
+ return originalPrepareStackTrace(error, stack);
324
+ };
325
+ }
326
+ });
327
+ }
328
+ /**
329
+ * Validate source map quality
330
+ */
331
+ async validateSourceMaps() {
332
+ const result = await this.getAllSourceMaps();
333
+ let valid = 0;
334
+ let invalid = 0;
335
+ let hasNames = 0;
336
+ let hasSourceContent = 0;
337
+ let totalSourceCount = 0;
338
+ for (const [file, info] of result.sourceMaps) {
339
+ if (info.valid) {
340
+ valid++;
341
+ totalSourceCount += info.sourceCount;
342
+ if (info.content) {
343
+ try {
344
+ const sourceMap = JSON.parse(info.content);
345
+ if (sourceMap.names && sourceMap.names.length > 0) {
346
+ hasNames++;
347
+ }
348
+ if (sourceMap.sourcesContent && sourceMap.sourcesContent.length > 0) {
349
+ hasSourceContent++;
350
+ }
351
+ }
352
+ catch {
353
+ // Ignore parse errors
354
+ }
355
+ }
356
+ }
357
+ else {
358
+ invalid++;
359
+ }
360
+ }
361
+ const total = result.filesWithSourceMaps.length + result.filesWithoutSourceMaps.length;
362
+ const avgSourceCount = valid > 0 ? totalSourceCount / valid : 0;
363
+ return {
364
+ total,
365
+ valid,
366
+ invalid,
367
+ missing: result.filesWithoutSourceMaps.length,
368
+ hasNames,
369
+ hasSourceContent,
370
+ avgSourceCount,
371
+ };
372
+ }
373
+ /**
374
+ * Get source map statistics
375
+ */
376
+ async getStatistics() {
377
+ const result = await this.getAllSourceMaps();
378
+ const stats = await this.validateSourceMaps();
379
+ let totalMappings = 0;
380
+ for (const info of result.sourceMaps.values()) {
381
+ if (info.valid && info.content) {
382
+ // Rough estimate of mappings (would need proper parsing)
383
+ totalMappings += info.content.split(',').length;
384
+ }
385
+ }
386
+ const avgMappingsPerFile = stats.valid > 0 ? totalMappings / stats.valid : 0;
387
+ const avgSourcesPerFile = stats.avgSourceCount;
388
+ let recommendation = 'Source maps are well configured';
389
+ if (result.sourceMapCoverage < 50) {
390
+ recommendation = 'Consider adding source maps for better debugging';
391
+ }
392
+ else if (stats.avgSourceCount < 2) {
393
+ recommendation = 'Source maps may not include all original sources';
394
+ }
395
+ else if (stats.hasNames < stats.valid * 0.5) {
396
+ recommendation = 'Consider adding function names to source maps';
397
+ }
398
+ return {
399
+ sourceMapCoverage: result.sourceMapCoverage,
400
+ totalFiles: stats.total,
401
+ filesWithSourceMaps: stats.valid,
402
+ avgMappingsPerFile,
403
+ avgSourcesPerFile,
404
+ recommendation,
405
+ };
406
+ }
407
+ /**
408
+ * Clear source map cache
409
+ */
410
+ clearCache() {
411
+ this.sourceMapsCache.clear();
412
+ }
413
+ }
414
+ /**
415
+ * Factory function to create Source Maps Handler
416
+ */
417
+ export function createSourceMapsHandler(page) {
418
+ return new SourceMapsHandler(page);
419
+ }
420
+ export default SourceMapsHandler;
@@ -0,0 +1,118 @@
1
+ /**
2
+ * Stacked Modals Handler
3
+ *
4
+ * P1 - Detection and management of stacked/nested modals
5
+ *
6
+ * Supports:
7
+ * - Detection of stacked modals (multiple overlays)
8
+ * - Z-index analysis
9
+ * - Modal type detection (dialog, popover, dropdown)
10
+ * - Modal hierarchy traversal
11
+ * - Modal dismissal strategies
12
+ *
13
+ * @see https://www.w3.org/WAI/ARIA/apg/patterns/dialogmodal/
14
+ */
15
+ export interface ModalInfo {
16
+ /** Modal element selector */
17
+ selector: string;
18
+ /** Modal type */
19
+ type: 'dialog' | 'popover' | 'dropdown' | 'tooltip' | 'alert' | 'custom';
20
+ /** Z-index */
21
+ zIndex: number;
22
+ /** Position in stack (0 = bottom) */
23
+ stackPosition: number;
24
+ /** Whether it's visible */
25
+ visible: boolean;
26
+ /** Whether it blocks interaction with elements below */
27
+ blocksInteraction: boolean;
28
+ /** ARIA attributes */
29
+ aria: {
30
+ modal: boolean;
31
+ labelledby?: string;
32
+ describedby?: string;
33
+ label?: string;
34
+ };
35
+ /** Parent selector (if nested) */
36
+ parent?: string;
37
+ /** Children selectors */
38
+ children: string[];
39
+ /** Close buttons/selectors */
40
+ closeSelectors: string[];
41
+ }
42
+ export interface ModalHierarchy {
43
+ /** Total number of modals detected */
44
+ totalModals: number;
45
+ /** Number of visible modals */
46
+ visibleModals: number;
47
+ /** Modal stack (bottom to top) */
48
+ stack: ModalInfo[];
49
+ /** Top-most modal */
50
+ topModal?: ModalInfo;
51
+ /** Issues detected */
52
+ issues: string[];
53
+ }
54
+ export interface ModalActionOptions {
55
+ /** Wait for modal before action */
56
+ waitFor?: boolean;
57
+ /** Timeout for waiting */
58
+ timeout?: number;
59
+ }
60
+ /**
61
+ * Stacked Modals Handler class
62
+ */
63
+ export declare class StackedModalsHandler {
64
+ /**
65
+ * Detect all modals on the page
66
+ */
67
+ detectModals(page: any): Promise<ModalHierarchy>;
68
+ /**
69
+ * Get the top-most (active) modal
70
+ */
71
+ getTopModal(page: any): Promise<ModalInfo | null>;
72
+ /**
73
+ * Wait for a modal to appear
74
+ */
75
+ waitForModal(page: any, options?: {
76
+ /** Type of modal to wait for */
77
+ type?: ModalInfo['type'];
78
+ /** Selector to match */
79
+ selector?: string;
80
+ /** Minimum z-index */
81
+ minZIndex?: number;
82
+ /** Timeout in ms */
83
+ timeout?: number;
84
+ }): Promise<ModalInfo | null>;
85
+ /**
86
+ * Close a modal
87
+ */
88
+ closeModal(page: any, modal: ModalInfo | string, options?: ModalActionOptions): Promise<boolean>;
89
+ /**
90
+ * Close all modals from top to bottom
91
+ */
92
+ closeAllModals(page: any, options?: ModalActionOptions): Promise<number>;
93
+ /**
94
+ * Get modal hierarchy for debugging
95
+ */
96
+ getModalTree(page: any): Promise<string>;
97
+ /**
98
+ * Verify modal accessibility
99
+ */
100
+ verifyAccessibility(page: any, modal: ModalInfo | string): Promise<{
101
+ valid: boolean;
102
+ issues: string[];
103
+ }>;
104
+ /**
105
+ * Get modal statistics
106
+ */
107
+ getStatistics(page: any): Promise<{
108
+ byType: Record<string, number>;
109
+ averageZIndex: number;
110
+ maxStackDepth: number;
111
+ accessibilityScore: number;
112
+ }>;
113
+ }
114
+ /**
115
+ * Factory function to create Stacked Modals Handler
116
+ */
117
+ export declare function createStackedModalsHandler(): StackedModalsHandler;
118
+ export default StackedModalsHandler;