qa360 2.3.0 → 2.3.2

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/ask.js +49 -22
  4. package/{cli/dist → dist}/commands/coverage.js +17 -4
  5. package/{cli/dist → dist}/commands/crawl.js +2 -2
  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 +12 -5
  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 +14 -6
  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 +5 -1
  18. package/{cli/dist → dist}/commands/run.js +87 -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.d.ts +4 -0
  28. package/{cli/dist → dist}/core/ai/ollama-provider.js +41 -8
  29. package/{cli/dist → dist}/core/artifacts/ui-artifacts.js +24 -4
  30. package/dist/core/auth/backup-codes-provider.d.ts +91 -0
  31. package/dist/core/auth/backup-codes-provider.js +215 -0
  32. package/{cli/dist → dist}/core/auth/basic-auth-provider.d.ts +6 -0
  33. package/{cli/dist → dist}/core/auth/basic-auth-provider.js +24 -6
  34. package/dist/core/auth/digest-auth-provider.d.ts +116 -0
  35. package/dist/core/auth/digest-auth-provider.js +244 -0
  36. package/dist/core/auth/hcaptcha-handler.d.ts +103 -0
  37. package/dist/core/auth/hcaptcha-handler.js +288 -0
  38. package/{cli/dist → dist}/core/auth/index.d.ts +81 -4
  39. package/{cli/dist → dist}/core/auth/index.js +15 -1
  40. package/dist/core/auth/oauth-handler.d.ts +408 -0
  41. package/dist/core/auth/oauth-handler.js +636 -0
  42. package/{cli/dist → dist}/core/auth/oauth2-provider.d.ts +9 -0
  43. package/dist/core/auth/oauth2-provider.js +227 -0
  44. package/dist/core/auth/otp-provider.d.ts +93 -0
  45. package/dist/core/auth/otp-provider.js +288 -0
  46. package/dist/core/auth/recaptcha-handler.d.ts +119 -0
  47. package/dist/core/auth/recaptcha-handler.js +301 -0
  48. package/dist/core/auth/remember-me-handler.d.ts +142 -0
  49. package/dist/core/auth/remember-me-handler.js +255 -0
  50. package/dist/core/auth/saml-handler.d.ts +173 -0
  51. package/dist/core/auth/saml-handler.js +364 -0
  52. package/dist/core/auth/webauthn-handler.d.ts +182 -0
  53. package/dist/core/auth/webauthn-handler.js +310 -0
  54. package/dist/core/crawler/advanced-interactions.d.ts +342 -0
  55. package/dist/core/crawler/advanced-interactions.js +1069 -0
  56. package/dist/core/crawler/blob-url-download-handler.d.ts +145 -0
  57. package/dist/core/crawler/blob-url-download-handler.js +392 -0
  58. package/dist/core/crawler/consent-handler.d.ts +49 -0
  59. package/dist/core/crawler/consent-handler.js +258 -0
  60. package/dist/core/crawler/cookie-manager.d.ts +166 -0
  61. package/dist/core/crawler/cookie-manager.js +353 -0
  62. package/dist/core/crawler/coop-coep-handler.d.ts +136 -0
  63. package/dist/core/crawler/coop-coep-handler.js +338 -0
  64. package/dist/core/crawler/csp-handler.d.ts +151 -0
  65. package/dist/core/crawler/csp-handler.js +415 -0
  66. package/dist/core/crawler/download-handler.d.ts +155 -0
  67. package/dist/core/crawler/download-handler.js +370 -0
  68. package/dist/core/crawler/email-testing-handler.d.ts +214 -0
  69. package/dist/core/crawler/email-testing-handler.js +398 -0
  70. package/dist/core/crawler/error-tracking-handler.d.ts +177 -0
  71. package/dist/core/crawler/error-tracking-handler.js +378 -0
  72. package/dist/core/crawler/form-handler.d.ts +100 -0
  73. package/dist/core/crawler/form-handler.js +465 -0
  74. package/dist/core/crawler/framework-wait-handler.d.ts +96 -0
  75. package/dist/core/crawler/framework-wait-handler.js +464 -0
  76. package/dist/core/crawler/geolocation-handler.d.ts +112 -0
  77. package/dist/core/crawler/geolocation-handler.js +276 -0
  78. package/dist/core/crawler/index.d.ts +78 -0
  79. package/{cli/dist → dist}/core/crawler/index.js +74 -1
  80. package/dist/core/crawler/intelligent-selector-generator.d.ts +164 -0
  81. package/dist/core/crawler/intelligent-selector-generator.js +612 -0
  82. package/{cli/dist → dist}/core/crawler/journey-generator.js +44 -1
  83. package/{cli/dist → dist}/core/crawler/page-analyzer.d.ts +16 -1
  84. package/{cli/dist → dist}/core/crawler/page-analyzer.js +469 -17
  85. package/dist/core/crawler/permissions-handler.d.ts +112 -0
  86. package/dist/core/crawler/permissions-handler.js +236 -0
  87. package/dist/core/crawler/permissions-policy-handler.d.ts +113 -0
  88. package/dist/core/crawler/permissions-policy-handler.js +402 -0
  89. package/dist/core/crawler/presets.d.ts +100 -0
  90. package/dist/core/crawler/presets.js +887 -0
  91. package/dist/core/crawler/repl-debug-handler.d.ts +105 -0
  92. package/dist/core/crawler/repl-debug-handler.js +552 -0
  93. package/dist/core/crawler/reporting-api-handler.d.ts +212 -0
  94. package/dist/core/crawler/reporting-api-handler.js +344 -0
  95. package/{cli/dist → dist}/core/crawler/selector-generator.d.ts +9 -0
  96. package/{cli/dist → dist}/core/crawler/selector-generator.js +99 -23
  97. package/dist/core/crawler/site-profiler.d.ts +89 -0
  98. package/dist/core/crawler/site-profiler.js +290 -0
  99. package/dist/core/crawler/sourcemaps-handler.d.ts +144 -0
  100. package/dist/core/crawler/sourcemaps-handler.js +420 -0
  101. package/dist/core/crawler/stacked-modals-handler.d.ts +118 -0
  102. package/dist/core/crawler/stacked-modals-handler.js +429 -0
  103. package/dist/core/crawler/trusted-types-handler.d.ts +149 -0
  104. package/dist/core/crawler/trusted-types-handler.js +413 -0
  105. package/{cli/dist → dist}/core/crawler/types.d.ts +68 -2
  106. package/dist/core/crawler/wait-strategies.d.ts +108 -0
  107. package/dist/core/crawler/wait-strategies.js +399 -0
  108. package/dist/core/fixtures/factories.d.ts +180 -0
  109. package/dist/core/fixtures/factories.js +279 -0
  110. package/dist/core/fixtures/index.d.ts +6 -0
  111. package/dist/core/fixtures/index.js +6 -0
  112. package/{cli/dist → dist}/core/generation/crawler-pack-generator.d.ts +13 -3
  113. package/dist/core/generation/crawler-pack-generator.js +232 -0
  114. package/{cli/dist → dist}/core/generation/index.d.ts +2 -0
  115. package/{cli/dist → dist}/core/generation/index.js +2 -0
  116. package/{cli/dist → dist}/core/index.d.ts +2 -0
  117. package/{cli/dist → dist}/core/index.js +4 -0
  118. package/dist/core/network/index.d.ts +7 -0
  119. package/dist/core/network/index.js +7 -0
  120. package/dist/core/network/network-manager.d.ts +237 -0
  121. package/dist/core/network/network-manager.js +343 -0
  122. package/dist/core/network/network-simulator.d.ts +158 -0
  123. package/dist/core/network/network-simulator.js +261 -0
  124. package/{cli/dist → dist}/core/pack/validator.js +2 -2
  125. package/{cli/dist → dist}/core/pack-v2/migrator.d.ts +5 -0
  126. package/{cli/dist → dist}/core/pack-v2/migrator.js +81 -6
  127. package/{cli/dist → dist}/core/pack-v2/validator.js +4 -3
  128. package/{cli/dist → dist}/core/pom/base-page.js +1 -1
  129. package/{cli/dist → dist}/core/pom/loader.js +1 -1
  130. package/dist/core/reporting/index.d.ts +9 -0
  131. package/dist/core/reporting/index.js +10 -0
  132. package/dist/core/reporting/junit-reporter.d.ts +114 -0
  133. package/dist/core/reporting/junit-reporter.js +306 -0
  134. package/{cli/dist → dist}/core/runner/e2e-helpers.d.ts +1 -1
  135. package/{cli/dist → dist}/core/runner/e2e-helpers.js +2 -2
  136. package/{cli/dist → dist}/core/runner/phase3-runner.d.ts +3 -0
  137. package/{cli/dist → dist}/core/runner/phase3-runner.js +45 -14
  138. package/dist/core/sharding/test-sharding.d.ts +137 -0
  139. package/dist/core/sharding/test-sharding.js +233 -0
  140. package/dist/core/storage/cookie-manager.d.ts +160 -0
  141. package/dist/core/storage/cookie-manager.js +268 -0
  142. package/dist/core/storage/index.d.ts +7 -0
  143. package/dist/core/storage/index.js +7 -0
  144. package/dist/core/storage/storage-helpers.d.ts +138 -0
  145. package/dist/core/storage/storage-helpers.js +315 -0
  146. package/dist/core/test-helpers/index.d.ts +6 -0
  147. package/dist/core/test-helpers/index.js +6 -0
  148. package/dist/core/test-helpers/state-reset.d.ts +119 -0
  149. package/dist/core/test-helpers/state-reset.js +234 -0
  150. package/{cli/dist → dist}/core/types/pack-v1.d.ts +15 -2
  151. package/{cli/dist → dist}/core/types/pack-v2.d.ts +1 -1
  152. package/dist/core/upload/chunked-uploader.d.ts +150 -0
  153. package/dist/core/upload/chunked-uploader.js +289 -0
  154. package/dist/core/upload/index.d.ts +11 -0
  155. package/dist/core/upload/index.js +8 -0
  156. package/dist/core/upload/mime-validator.d.ts +119 -0
  157. package/dist/core/upload/mime-validator.js +373 -0
  158. package/dist/core/upload/presigned-uploader.d.ts +118 -0
  159. package/dist/core/upload/presigned-uploader.js +274 -0
  160. package/dist/core/utils/device-emulation.d.ts +194 -0
  161. package/dist/core/utils/device-emulation.js +380 -0
  162. package/dist/core/utils/index.d.ts +8 -0
  163. package/dist/core/utils/index.js +8 -0
  164. package/dist/core/utils/retry.d.ts +145 -0
  165. package/dist/core/utils/retry.js +242 -0
  166. package/dist/core/utils/smart-wait.d.ts +133 -0
  167. package/dist/core/utils/smart-wait.js +417 -0
  168. package/dist/core/visual/index.d.ts +7 -0
  169. package/dist/core/visual/index.js +7 -0
  170. package/dist/core/visual/pixel-diff.d.ts +87 -0
  171. package/dist/core/visual/pixel-diff.js +213 -0
  172. package/dist/core/visual/screenshot-helper.d.ts +130 -0
  173. package/dist/core/visual/screenshot-helper.js +223 -0
  174. package/{cli/dist → dist}/index.js +2 -3
  175. package/{cli/dist → dist}/utils/config.d.ts +1 -1
  176. package/{cli/dist → dist}/utils/config.js +36 -3
  177. package/examples/README.md +160 -0
  178. package/examples/accessibility.yml +48 -0
  179. package/examples/api-basic.yml +27 -0
  180. package/examples/complete.yml +146 -0
  181. package/examples/crawler.yml +38 -0
  182. package/examples/fullstack.yml +78 -0
  183. package/examples/security.yml +58 -0
  184. package/examples/ui-advanced.yml +49 -0
  185. package/examples/ui-basic.yml +24 -0
  186. package/package.json +33 -67
  187. package/CHANGELOG.md +0 -330
  188. package/CONTRIBUTING.md +0 -273
  189. package/QUICK_START.md +0 -191
  190. package/cli/CHANGELOG.md +0 -84
  191. package/cli/LICENSE +0 -24
  192. package/cli/README.md +0 -222
  193. package/cli/dist/core/adapters/playwright-ui.js +0 -864
  194. package/cli/dist/core/auth/oauth2-provider.js +0 -114
  195. package/cli/dist/core/coverage/analyzer.d.ts +0 -101
  196. package/cli/dist/core/coverage/analyzer.js +0 -415
  197. package/cli/dist/core/coverage/collector.d.ts +0 -74
  198. package/cli/dist/core/coverage/collector.js +0 -459
  199. package/cli/dist/core/coverage/config.d.ts +0 -37
  200. package/cli/dist/core/coverage/config.js +0 -156
  201. package/cli/dist/core/coverage/index.d.ts +0 -11
  202. package/cli/dist/core/coverage/index.js +0 -15
  203. package/cli/dist/core/coverage/types.d.ts +0 -267
  204. package/cli/dist/core/coverage/types.js +0 -6
  205. package/cli/dist/core/coverage/vault.d.ts +0 -95
  206. package/cli/dist/core/coverage/vault.js +0 -405
  207. package/cli/dist/core/crawler/index.d.ts +0 -57
  208. package/cli/dist/core/fixtures/index.d.ts +0 -8
  209. package/cli/dist/core/fixtures/index.js +0 -8
  210. package/cli/dist/core/generation/crawler-pack-generator.js +0 -231
  211. package/cli/dist/core/reporting/index.d.ts +0 -6
  212. package/cli/dist/core/reporting/index.js +0 -6
  213. package/cli/dist/core/visual/index.d.ts +0 -6
  214. package/cli/dist/core/visual/index.js +0 -6
  215. package/cli/package.json +0 -76
  216. package/core/LICENSE +0 -24
  217. package/core/README.md +0 -105
  218. package/core/package.json +0 -90
  219. package/core/schemas/pack.schema.json +0 -236
  220. /package/{cli/bin → bin}/qa360.js +0 -0
  221. /package/{cli/dist → dist}/cli-minimal.d.ts +0 -0
  222. /package/{cli/dist → dist}/cli-minimal.js +0 -0
  223. /package/{cli/dist → dist}/commands/ai.d.ts +0 -0
  224. /package/{cli/dist → dist}/commands/ask.d.ts +0 -0
  225. /package/{cli/dist → dist}/commands/coverage.d.ts +0 -0
  226. /package/{cli/dist → dist}/commands/crawl.d.ts +0 -0
  227. /package/{cli/dist → dist}/commands/doctor.d.ts +0 -0
  228. /package/{cli/dist → dist}/commands/examples.d.ts +0 -0
  229. /package/{cli/dist → dist}/commands/examples.js +0 -0
  230. /package/{cli/dist → dist}/commands/explain.d.ts +0 -0
  231. /package/{cli/dist → dist}/commands/flakiness.d.ts +0 -0
  232. /package/{cli/dist → dist}/commands/generate.d.ts +0 -0
  233. /package/{cli/dist → dist}/commands/history.d.ts +0 -0
  234. /package/{cli/dist → dist}/commands/init.d.ts +0 -0
  235. /package/{cli/dist → dist}/commands/init.js +0 -0
  236. /package/{cli/dist → dist}/commands/monitor.d.ts +0 -0
  237. /package/{cli/dist → dist}/commands/ollama.d.ts +0 -0
  238. /package/{cli/dist → dist}/commands/pack.d.ts +0 -0
  239. /package/{cli/dist → dist}/commands/regression.d.ts +0 -0
  240. /package/{cli/dist → dist}/commands/repair.d.ts +0 -0
  241. /package/{cli/dist → dist}/commands/report.d.ts +0 -0
  242. /package/{cli/dist → dist}/commands/report.js +0 -0
  243. /package/{cli/dist → dist}/commands/retry.d.ts +0 -0
  244. /package/{cli/dist → dist}/commands/scan.d.ts +0 -0
  245. /package/{cli/dist → dist}/commands/scan.js +0 -0
  246. /package/{cli/dist → dist}/commands/secrets.d.ts +0 -0
  247. /package/{cli/dist → dist}/commands/serve.d.ts +0 -0
  248. /package/{cli/dist → dist}/commands/slo.d.ts +0 -0
  249. /package/{cli/dist → dist}/commands/verify.d.ts +0 -0
  250. /package/{cli/dist → dist}/core/adapters/gitleaks-secrets.d.ts +0 -0
  251. /package/{cli/dist → dist}/core/adapters/gitleaks-secrets.js +0 -0
  252. /package/{cli/dist → dist}/core/adapters/jest-adapter.d.ts +0 -0
  253. /package/{cli/dist → dist}/core/adapters/jest-adapter.js +0 -0
  254. /package/{cli/dist → dist}/core/adapters/k6-perf.d.ts +0 -0
  255. /package/{cli/dist → dist}/core/adapters/k6-perf.js +0 -0
  256. /package/{cli/dist → dist}/core/adapters/osv-deps.d.ts +0 -0
  257. /package/{cli/dist → dist}/core/adapters/osv-deps.js +0 -0
  258. /package/{cli/dist → dist}/core/adapters/playwright-native-adapter.d.ts +0 -0
  259. /package/{cli/dist → dist}/core/adapters/playwright-native-adapter.js +0 -0
  260. /package/{cli/dist → dist}/core/adapters/pytest-adapter.d.ts +0 -0
  261. /package/{cli/dist → dist}/core/adapters/pytest-adapter.js +0 -0
  262. /package/{cli/dist → dist}/core/adapters/semgrep-sast.d.ts +0 -0
  263. /package/{cli/dist → dist}/core/adapters/semgrep-sast.js +0 -0
  264. /package/{cli/dist → dist}/core/adapters/unit-test-types.d.ts +0 -0
  265. /package/{cli/dist → dist}/core/adapters/unit-test-types.js +0 -0
  266. /package/{cli/dist → dist}/core/adapters/vitest-adapter.d.ts +0 -0
  267. /package/{cli/dist → dist}/core/adapters/vitest-adapter.js +0 -0
  268. /package/{cli/dist → dist}/core/adapters/zap-dast.d.ts +0 -0
  269. /package/{cli/dist → dist}/core/adapters/zap-dast.js +0 -0
  270. /package/{cli/dist → dist}/core/ai/anthropic-provider.d.ts +0 -0
  271. /package/{cli/dist → dist}/core/ai/anthropic-provider.js +0 -0
  272. /package/{cli/dist → dist}/core/ai/deepseek-provider.d.ts +0 -0
  273. /package/{cli/dist → dist}/core/ai/deepseek-provider.js +0 -0
  274. /package/{cli/dist → dist}/core/ai/index.d.ts +0 -0
  275. /package/{cli/dist → dist}/core/ai/index.js +0 -0
  276. /package/{cli/dist → dist}/core/ai/llm-client.d.ts +0 -0
  277. /package/{cli/dist → dist}/core/ai/llm-client.js +0 -0
  278. /package/{cli/dist → dist}/core/ai/mock-provider.d.ts +0 -0
  279. /package/{cli/dist → dist}/core/ai/mock-provider.js +0 -0
  280. /package/{cli/dist → dist}/core/ai/openai-provider.d.ts +0 -0
  281. /package/{cli/dist → dist}/core/ai/openai-provider.js +0 -0
  282. /package/{cli/dist → dist}/core/ai/provider-factory.d.ts +0 -0
  283. /package/{cli/dist → dist}/core/ai/provider-factory.js +0 -0
  284. /package/{cli/dist → dist}/core/artifacts/index.d.ts +0 -0
  285. /package/{cli/dist → dist}/core/artifacts/index.js +0 -0
  286. /package/{cli/dist → dist}/core/artifacts/ui-artifacts.d.ts +0 -0
  287. /package/{cli/dist → dist}/core/assertions/engine.d.ts +0 -0
  288. /package/{cli/dist → dist}/core/assertions/engine.js +0 -0
  289. /package/{cli/dist → dist}/core/assertions/index.d.ts +0 -0
  290. /package/{cli/dist → dist}/core/assertions/index.js +0 -0
  291. /package/{cli/dist → dist}/core/assertions/types.d.ts +0 -0
  292. /package/{cli/dist → dist}/core/assertions/types.js +0 -0
  293. /package/{cli/dist → dist}/core/auth/api-key-provider.d.ts +0 -0
  294. /package/{cli/dist → dist}/core/auth/api-key-provider.js +0 -0
  295. /package/{cli/dist → dist}/core/auth/aws-iam-provider.d.ts +0 -0
  296. /package/{cli/dist → dist}/core/auth/aws-iam-provider.js +0 -0
  297. /package/{cli/dist → dist}/core/auth/azure-ad-provider.d.ts +0 -0
  298. /package/{cli/dist → dist}/core/auth/azure-ad-provider.js +0 -0
  299. /package/{cli/dist → dist}/core/auth/gcp-adc-provider.d.ts +0 -0
  300. /package/{cli/dist → dist}/core/auth/gcp-adc-provider.js +0 -0
  301. /package/{cli/dist → dist}/core/auth/jwt-provider.d.ts +0 -0
  302. /package/{cli/dist → dist}/core/auth/jwt-provider.js +0 -0
  303. /package/{cli/dist → dist}/core/auth/manager.d.ts +0 -0
  304. /package/{cli/dist → dist}/core/auth/manager.js +0 -0
  305. /package/{cli/dist → dist}/core/auth/totp-provider.d.ts +0 -0
  306. /package/{cli/dist → dist}/core/auth/totp-provider.js +0 -0
  307. /package/{cli/dist → dist}/core/auth/ui-login-provider.d.ts +0 -0
  308. /package/{cli/dist → dist}/core/auth/ui-login-provider.js +0 -0
  309. /package/{cli/dist → dist}/core/cache/index.d.ts +0 -0
  310. /package/{cli/dist → dist}/core/cache/index.js +0 -0
  311. /package/{cli/dist → dist}/core/cache/lru-cache.d.ts +0 -0
  312. /package/{cli/dist → dist}/core/cache/lru-cache.js +0 -0
  313. /package/{cli/dist/core → dist}/core/coverage/analyzer.d.ts +0 -0
  314. /package/{cli/dist/core → dist}/core/coverage/analyzer.js +0 -0
  315. /package/{cli/dist/core → dist}/core/coverage/collector.d.ts +0 -0
  316. /package/{cli/dist/core → dist}/core/coverage/collector.js +0 -0
  317. /package/{cli/dist/core → dist}/core/coverage/config.d.ts +0 -0
  318. /package/{cli/dist/core → dist}/core/coverage/config.js +0 -0
  319. /package/{cli/dist/core → dist}/core/coverage/index.d.ts +0 -0
  320. /package/{cli/dist/core → dist}/core/coverage/index.js +0 -0
  321. /package/{cli/dist/core → dist}/core/coverage/types.d.ts +0 -0
  322. /package/{cli/dist/core → dist}/core/coverage/types.js +0 -0
  323. /package/{cli/dist/core → dist}/core/coverage/vault.d.ts +0 -0
  324. /package/{cli/dist/core → dist}/core/coverage/vault.js +0 -0
  325. /package/{cli/dist → dist}/core/crawler/journey-generator.d.ts +0 -0
  326. /package/{cli/dist → dist}/core/crawler/types.js +0 -0
  327. /package/{cli/dist → dist}/core/dashboard/assets.d.ts +0 -0
  328. /package/{cli/dist → dist}/core/dashboard/assets.js +0 -0
  329. /package/{cli/dist → dist}/core/dashboard/index.d.ts +0 -0
  330. /package/{cli/dist → dist}/core/dashboard/index.js +0 -0
  331. /package/{cli/dist → dist}/core/dashboard/server.d.ts +0 -0
  332. /package/{cli/dist → dist}/core/dashboard/server.js +0 -0
  333. /package/{cli/dist → dist}/core/dashboard/types.d.ts +0 -0
  334. /package/{cli/dist → dist}/core/dashboard/types.js +0 -0
  335. /package/{cli/dist → dist}/core/discoverer/index.d.ts +0 -0
  336. /package/{cli/dist → dist}/core/discoverer/index.js +0 -0
  337. /package/{cli/dist → dist}/core/fixtures/loader.d.ts +0 -0
  338. /package/{cli/dist → dist}/core/fixtures/loader.js +0 -0
  339. /package/{cli/dist → dist}/core/fixtures/resolver.d.ts +0 -0
  340. /package/{cli/dist → dist}/core/fixtures/resolver.js +0 -0
  341. /package/{cli/dist → dist}/core/fixtures/types.d.ts +0 -0
  342. /package/{cli/dist → dist}/core/fixtures/types.js +0 -0
  343. /package/{cli/dist → dist}/core/flakiness/index.d.ts +0 -0
  344. /package/{cli/dist → dist}/core/flakiness/index.js +0 -0
  345. /package/{cli/dist → dist}/core/generation/code-formatter.d.ts +0 -0
  346. /package/{cli/dist → dist}/core/generation/code-formatter.js +0 -0
  347. /package/{cli/dist → dist}/core/generation/code-generator.d.ts +0 -0
  348. /package/{cli/dist → dist}/core/generation/code-generator.js +0 -0
  349. /package/{cli/dist → dist}/core/generation/generator.d.ts +0 -0
  350. /package/{cli/dist → dist}/core/generation/generator.js +0 -0
  351. /package/{cli/dist → dist}/core/generation/pack-generator.d.ts +0 -0
  352. /package/{cli/dist → dist}/core/generation/pack-generator.js +0 -0
  353. /package/{cli/dist → dist}/core/generation/prompt-builder.d.ts +0 -0
  354. /package/{cli/dist → dist}/core/generation/prompt-builder.js +0 -0
  355. /package/{cli/dist → dist}/core/generation/source-analyzer.d.ts +0 -0
  356. /package/{cli/dist → dist}/core/generation/source-analyzer.js +0 -0
  357. /package/{cli/dist → dist}/core/generation/test-optimizer.d.ts +0 -0
  358. /package/{cli/dist → dist}/core/generation/test-optimizer.js +0 -0
  359. /package/{cli/dist → dist}/core/generation/types.d.ts +0 -0
  360. /package/{cli/dist → dist}/core/generation/types.js +0 -0
  361. /package/{cli/dist → dist}/core/hooks/compose.d.ts +0 -0
  362. /package/{cli/dist → dist}/core/hooks/compose.js +0 -0
  363. /package/{cli/dist → dist}/core/hooks/runner.d.ts +0 -0
  364. /package/{cli/dist → dist}/core/hooks/runner.js +0 -0
  365. /package/{cli/dist → dist}/core/pack/migrator.d.ts +0 -0
  366. /package/{cli/dist → dist}/core/pack/migrator.js +0 -0
  367. /package/{cli/dist → dist}/core/pack/validator.d.ts +0 -0
  368. /package/{cli/dist → dist}/core/pack-v2/index.d.ts +0 -0
  369. /package/{cli/dist → dist}/core/pack-v2/index.js +0 -0
  370. /package/{cli/dist → dist}/core/pack-v2/loader.d.ts +0 -0
  371. /package/{cli/dist → dist}/core/pack-v2/loader.js +0 -0
  372. /package/{cli/dist → dist}/core/pack-v2/validator.d.ts +0 -0
  373. /package/{cli/dist → dist}/core/parallel/index.d.ts +0 -0
  374. /package/{cli/dist → dist}/core/parallel/index.js +0 -0
  375. /package/{cli/dist → dist}/core/parallel/parallel-runner.d.ts +0 -0
  376. /package/{cli/dist → dist}/core/parallel/parallel-runner.js +0 -0
  377. /package/{cli/dist → dist}/core/pom/base-page.d.ts +0 -0
  378. /package/{cli/dist → dist}/core/pom/index.d.ts +0 -0
  379. /package/{cli/dist → dist}/core/pom/index.js +0 -0
  380. /package/{cli/dist → dist}/core/pom/loader.d.ts +0 -0
  381. /package/{cli/dist → dist}/core/pom/types.d.ts +0 -0
  382. /package/{cli/dist → dist}/core/pom/types.js +0 -0
  383. /package/{cli/dist → dist}/core/proof/bundle.d.ts +0 -0
  384. /package/{cli/dist → dist}/core/proof/bundle.js +0 -0
  385. /package/{cli/dist → dist}/core/proof/canonicalize.d.ts +0 -0
  386. /package/{cli/dist → dist}/core/proof/canonicalize.js +0 -0
  387. /package/{cli/dist → dist}/core/proof/index.d.ts +0 -0
  388. /package/{cli/dist → dist}/core/proof/index.js +0 -0
  389. /package/{cli/dist → dist}/core/proof/schema.d.ts +0 -0
  390. /package/{cli/dist → dist}/core/proof/schema.js +0 -0
  391. /package/{cli/dist → dist}/core/proof/signer.d.ts +0 -0
  392. /package/{cli/dist → dist}/core/proof/signer.js +0 -0
  393. /package/{cli/dist → dist}/core/proof/verifier.d.ts +0 -0
  394. /package/{cli/dist → dist}/core/proof/verifier.js +0 -0
  395. /package/{cli/dist → dist}/core/regression/detector.d.ts +0 -0
  396. /package/{cli/dist → dist}/core/regression/detector.js +0 -0
  397. /package/{cli/dist → dist}/core/regression/index.d.ts +0 -0
  398. /package/{cli/dist → dist}/core/regression/index.js +0 -0
  399. /package/{cli/dist → dist}/core/regression/trend-analyzer.d.ts +0 -0
  400. /package/{cli/dist → dist}/core/regression/trend-analyzer.js +0 -0
  401. /package/{cli/dist → dist}/core/regression/types.d.ts +0 -0
  402. /package/{cli/dist → dist}/core/regression/types.js +0 -0
  403. /package/{cli/dist → dist}/core/regression/vault.d.ts +0 -0
  404. /package/{cli/dist → dist}/core/regression/vault.js +0 -0
  405. /package/{cli/dist → dist}/core/repair/engine/fixer.d.ts +0 -0
  406. /package/{cli/dist → dist}/core/repair/engine/fixer.js +0 -0
  407. /package/{cli/dist → dist}/core/repair/engine/suggestion-engine.d.ts +0 -0
  408. /package/{cli/dist → dist}/core/repair/engine/suggestion-engine.js +0 -0
  409. /package/{cli/dist → dist}/core/repair/index.d.ts +0 -0
  410. /package/{cli/dist → dist}/core/repair/index.js +0 -0
  411. /package/{cli/dist → dist}/core/repair/repairer.d.ts +0 -0
  412. /package/{cli/dist → dist}/core/repair/repairer.js +0 -0
  413. /package/{cli/dist → dist}/core/repair/types.d.ts +0 -0
  414. /package/{cli/dist → dist}/core/repair/types.js +0 -0
  415. /package/{cli/dist → dist}/core/repair/utils/error-analyzer.d.ts +0 -0
  416. /package/{cli/dist → dist}/core/repair/utils/error-analyzer.js +0 -0
  417. /package/{cli/dist → dist}/core/reporting/html-reporter.d.ts +0 -0
  418. /package/{cli/dist → dist}/core/reporting/html-reporter.js +0 -0
  419. /package/{cli/dist → dist}/core/retry/flakiness-integration.d.ts +0 -0
  420. /package/{cli/dist → dist}/core/retry/flakiness-integration.js +0 -0
  421. /package/{cli/dist → dist}/core/retry/index.d.ts +0 -0
  422. /package/{cli/dist → dist}/core/retry/index.js +0 -0
  423. /package/{cli/dist → dist}/core/retry/retry-engine.d.ts +0 -0
  424. /package/{cli/dist → dist}/core/retry/retry-engine.js +0 -0
  425. /package/{cli/dist → dist}/core/retry/types.d.ts +0 -0
  426. /package/{cli/dist → dist}/core/retry/types.js +0 -0
  427. /package/{cli/dist → dist}/core/retry/vault.d.ts +0 -0
  428. /package/{cli/dist → dist}/core/retry/vault.js +0 -0
  429. /package/{cli/dist → dist}/core/schemas/pack.schema.json +0 -0
  430. /package/{cli/dist → dist}/core/secrets/crypto.d.ts +0 -0
  431. /package/{cli/dist → dist}/core/secrets/crypto.js +0 -0
  432. /package/{cli/dist → dist}/core/secrets/manager.d.ts +0 -0
  433. /package/{cli/dist → dist}/core/secrets/manager.js +0 -0
  434. /package/{cli/dist → dist}/core/security/redaction-patterns-extended.d.ts +0 -0
  435. /package/{cli/dist → dist}/core/security/redaction-patterns-extended.js +0 -0
  436. /package/{cli/dist → dist}/core/security/redactor.d.ts +0 -0
  437. /package/{cli/dist → dist}/core/security/redactor.js +0 -0
  438. /package/{cli/dist → dist}/core/self-healing/assertion-healer.d.ts +0 -0
  439. /package/{cli/dist → dist}/core/self-healing/assertion-healer.js +0 -0
  440. /package/{cli/dist → dist}/core/self-healing/engine.d.ts +0 -0
  441. /package/{cli/dist → dist}/core/self-healing/engine.js +0 -0
  442. /package/{cli/dist → dist}/core/self-healing/index.d.ts +0 -0
  443. /package/{cli/dist → dist}/core/self-healing/index.js +0 -0
  444. /package/{cli/dist → dist}/core/self-healing/selector-healer.d.ts +0 -0
  445. /package/{cli/dist → dist}/core/self-healing/selector-healer.js +0 -0
  446. /package/{cli/dist → dist}/core/self-healing/types.d.ts +0 -0
  447. /package/{cli/dist → dist}/core/self-healing/types.js +0 -0
  448. /package/{cli/dist → dist}/core/serve/diagnostics-collector.d.ts +0 -0
  449. /package/{cli/dist → dist}/core/serve/diagnostics-collector.js +0 -0
  450. /package/{cli/dist → dist}/core/serve/health-checker.d.ts +0 -0
  451. /package/{cli/dist → dist}/core/serve/health-checker.js +0 -0
  452. /package/{cli/dist → dist}/core/serve/index.d.ts +0 -0
  453. /package/{cli/dist → dist}/core/serve/index.js +0 -0
  454. /package/{cli/dist → dist}/core/serve/metrics-collector.d.ts +0 -0
  455. /package/{cli/dist → dist}/core/serve/metrics-collector.js +0 -0
  456. /package/{cli/dist → dist}/core/serve/process-manager.d.ts +0 -0
  457. /package/{cli/dist → dist}/core/serve/process-manager.js +0 -0
  458. /package/{cli/dist → dist}/core/serve/server.d.ts +0 -0
  459. /package/{cli/dist → dist}/core/serve/server.js +0 -0
  460. /package/{cli/dist → dist}/core/slo/config.d.ts +0 -0
  461. /package/{cli/dist → dist}/core/slo/config.js +0 -0
  462. /package/{cli/dist → dist}/core/slo/index.d.ts +0 -0
  463. /package/{cli/dist → dist}/core/slo/index.js +0 -0
  464. /package/{cli/dist → dist}/core/slo/sli-calculator.d.ts +0 -0
  465. /package/{cli/dist → dist}/core/slo/sli-calculator.js +0 -0
  466. /package/{cli/dist → dist}/core/slo/slo-tracker.d.ts +0 -0
  467. /package/{cli/dist → dist}/core/slo/slo-tracker.js +0 -0
  468. /package/{cli/dist → dist}/core/slo/types.d.ts +0 -0
  469. /package/{cli/dist → dist}/core/slo/types.js +0 -0
  470. /package/{cli/dist → dist}/core/slo/vault.d.ts +0 -0
  471. /package/{cli/dist → dist}/core/slo/vault.js +0 -0
  472. /package/{cli/dist → dist}/core/tui/index.d.ts +0 -0
  473. /package/{cli/dist → dist}/core/tui/index.js +0 -0
  474. /package/{cli/dist → dist}/core/tui/monitor.d.ts +0 -0
  475. /package/{cli/dist → dist}/core/tui/monitor.js +0 -0
  476. /package/{cli/dist → dist}/core/tui/renderer.d.ts +0 -0
  477. /package/{cli/dist → dist}/core/tui/renderer.js +0 -0
  478. /package/{cli/dist → dist}/core/tui/types.d.ts +0 -0
  479. /package/{cli/dist → dist}/core/tui/types.js +0 -0
  480. /package/{cli/dist → dist}/core/types/pack-v1.js +0 -0
  481. /package/{cli/dist → dist}/core/types/pack-v2.js +0 -0
  482. /package/{cli/dist → dist}/core/types/trust-score.d.ts +0 -0
  483. /package/{cli/dist → dist}/core/types/trust-score.js +0 -0
  484. /package/{cli/dist → dist}/core/vault/cas.d.ts +0 -0
  485. /package/{cli/dist → dist}/core/vault/cas.js +0 -0
  486. /package/{cli/dist → dist}/core/vault/index.d.ts +0 -0
  487. /package/{cli/dist → dist}/core/vault/index.js +0 -0
  488. /package/{cli/dist → dist}/core/visual/visual-regression.d.ts +0 -0
  489. /package/{cli/dist → dist}/core/visual/visual-regression.js +0 -0
  490. /package/{cli/dist → dist}/core/watch/index.d.ts +0 -0
  491. /package/{cli/dist → dist}/core/watch/index.js +0 -0
  492. /package/{cli/dist → dist}/core/watch/watch-mode.d.ts +0 -0
  493. /package/{cli/dist → dist}/core/watch/watch-mode.js +0 -0
  494. /package/{cli/dist → dist}/generators/index.d.ts +0 -0
  495. /package/{cli/dist → dist}/generators/index.js +0 -0
  496. /package/{cli/dist → dist}/generators/json-reporter.d.ts +0 -0
  497. /package/{cli/dist → dist}/generators/json-reporter.js +0 -0
  498. /package/{cli/dist → dist}/generators/test-generator.d.ts +0 -0
  499. /package/{cli/dist → dist}/generators/test-generator.js +0 -0
  500. /package/{cli/dist → dist}/index.d.ts +0 -0
  501. /package/{cli/dist → dist}/scanners/dom-scanner.d.ts +0 -0
  502. /package/{cli/dist → dist}/scanners/dom-scanner.js +0 -0
  503. /package/{cli/dist → dist}/scanners/index.d.ts +0 -0
  504. /package/{cli/dist → dist}/scanners/index.js +0 -0
  505. /package/{cli/dist → dist}/schemas/pack.schema.json +0 -0
  506. /package/{cli/dist → dist}/types/scan.d.ts +0 -0
  507. /package/{cli/dist → dist}/types/scan.js +0 -0
@@ -0,0 +1,413 @@
1
+ /**
2
+ * Trusted Types Handler
3
+ *
4
+ * P1 - Trusted Types API for XSS prevention
5
+ *
6
+ * Supports:
7
+ * - Trusted Types detection
8
+ * - CSP trusted-types directive parsing
9
+ * - Trusted type policy creation
10
+ * - XSS sink monitoring
11
+ * - Trusted types violation tracking
12
+ *
13
+ * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/trusted-types
14
+ */
15
+ /**
16
+ * Trusted Types Handler class
17
+ */
18
+ export class TrustedTypesHandler {
19
+ page;
20
+ violations = [];
21
+ constructor(page) {
22
+ this.page = page;
23
+ }
24
+ /**
25
+ * Check if Trusted Types is supported
26
+ */
27
+ async isSupported() {
28
+ return await this.page.evaluate(() => {
29
+ return typeof window.TrustedTypes !== 'undefined' &&
30
+ typeof window.TrustedTypePolicyFactory !== 'undefined';
31
+ });
32
+ }
33
+ /**
34
+ * Get Trusted Types CSP directive
35
+ */
36
+ async getTrustedTypesDirective() {
37
+ return await this.page.evaluate(async () => {
38
+ try {
39
+ const response = await fetch(window.location.href, { method: 'HEAD' });
40
+ const csp = response.headers.get('Content-Security-Policy');
41
+ if (!csp)
42
+ return null;
43
+ // Parse CSP for trusted-types directive
44
+ const parts = csp.split(';');
45
+ for (const part of parts) {
46
+ const trimmed = part.trim();
47
+ if (trimmed.startsWith('trusted-types')) {
48
+ return trimmed.slice('trusted-types'.length).trim();
49
+ }
50
+ }
51
+ return null;
52
+ }
53
+ catch {
54
+ return null;
55
+ }
56
+ });
57
+ }
58
+ /**
59
+ * Parse Trusted Types CSP directive
60
+ */
61
+ parseTrustedTypesDirective(directive) {
62
+ if (!directive) {
63
+ return {
64
+ directiveValues: [],
65
+ policyNames: [],
66
+ allowsNone: false,
67
+ allowsAll: false,
68
+ };
69
+ }
70
+ const values = directive.split(/\s+/).filter(Boolean);
71
+ const policyNames = [];
72
+ let allowsNone = false;
73
+ let allowsAll = false;
74
+ for (const value of values) {
75
+ if (value === "'none'") {
76
+ allowsNone = true;
77
+ }
78
+ else if (value === '*' || value === "'*'") {
79
+ allowsAll = true;
80
+ }
81
+ else if (value.startsWith("'")) {
82
+ // Other quoted value
83
+ }
84
+ else {
85
+ policyNames.push(value);
86
+ }
87
+ }
88
+ return {
89
+ directiveValues: values,
90
+ policyNames,
91
+ allowsNone,
92
+ allowsAll,
93
+ };
94
+ }
95
+ /**
96
+ * Get existing Trusted Type policies
97
+ */
98
+ async getExistingPolicies() {
99
+ return await this.page.evaluate(() => {
100
+ if (typeof window.trustedTypes === 'undefined') {
101
+ return [];
102
+ }
103
+ // Try to get exposed policy names
104
+ // Note: Policy names are not directly enumerable, but we can check
105
+ // if certain operations create trusted types
106
+ const policies = [];
107
+ // Check if we can detect any policy by attempting to create a trusted type
108
+ try {
109
+ const tt = window.trustedTypes;
110
+ if (tt.createPolicy) {
111
+ // The existence of createPolicy means trusted types is active
112
+ policies.push('default');
113
+ }
114
+ }
115
+ catch {
116
+ // Ignore
117
+ }
118
+ return policies;
119
+ });
120
+ }
121
+ /**
122
+ * Detect XSS sinks in the page
123
+ */
124
+ async detectXSSSinks() {
125
+ return await this.page.evaluate(() => {
126
+ const sinks = [];
127
+ // Common XSS sinks to check
128
+ const sinkSelectors = [
129
+ { selector: '*', property: 'innerHTML', type: 'innerHTML' },
130
+ { selector: '*', property: 'outerHTML', type: 'outerHTML' },
131
+ { selector: 'a[href]', property: 'href', type: 'location' },
132
+ { selector: 'area[href]', property: 'href', type: 'location' },
133
+ { selector: 'form[action]', property: 'action', type: 'location' },
134
+ { selector: 'input[formaction]', property: 'formAction', type: 'location' },
135
+ { selector: 'button[formaction]', property: 'formAction', type: 'location' },
136
+ { selector: 'iframe[src]', property: 'src', type: 'location' },
137
+ { selector: 'object[data]', property: 'data', type: 'location' },
138
+ { selector: 'embed[src]', property: 'src', type: 'location' },
139
+ { selector: 'link[href]', property: 'href', type: 'location' },
140
+ ];
141
+ for (const sink of sinkSelectors) {
142
+ const elements = document.querySelectorAll(sink.selector);
143
+ for (const el of Array.from(elements)) {
144
+ try {
145
+ const value = el[sink.property];
146
+ if (value !== undefined && value !== null) {
147
+ sinks.push({
148
+ type: sink.type,
149
+ element: el.tagName.toLowerCase() + (el.id ? '#' + el.id : ''),
150
+ value: String(value).substring(0, 100),
151
+ isXSSSink: true,
152
+ });
153
+ }
154
+ }
155
+ catch {
156
+ // Property might not be readable
157
+ }
158
+ }
159
+ }
160
+ return sinks;
161
+ });
162
+ }
163
+ /**
164
+ * Create a test Trusted Type policy
165
+ */
166
+ async createTestPolicy(policyName) {
167
+ return await this.page.evaluate((name) => {
168
+ try {
169
+ if (typeof window.trustedTypes === 'undefined') {
170
+ return false;
171
+ }
172
+ const policy = window.trustedTypes.createPolicy(name, {
173
+ createHTML: (input) => input,
174
+ createScriptURL: (input) => input,
175
+ createScript: (input) => input,
176
+ });
177
+ return policy !== undefined;
178
+ }
179
+ catch {
180
+ return false;
181
+ }
182
+ }, policyName);
183
+ }
184
+ /**
185
+ * Test if a sink requires Trusted Type
186
+ */
187
+ async testSinkRequiresTrustedType(sinkType) {
188
+ return await this.page.evaluate((type) => {
189
+ try {
190
+ const testDiv = document.createElement('div');
191
+ switch (type) {
192
+ case 'innerHTML':
193
+ testDiv.innerHTML = '<span>test</span>';
194
+ break;
195
+ case 'outerHTML':
196
+ // Can't easily test outerHTML without replacing
197
+ break;
198
+ case 'src':
199
+ const img = document.createElement('img');
200
+ img.src = 'about:blank';
201
+ break;
202
+ }
203
+ // If we got here without error, check if trusted types is enforced
204
+ return typeof window.trustedTypes !== 'undefined';
205
+ }
206
+ catch {
207
+ // Error might indicate trusted types enforcement
208
+ return true;
209
+ }
210
+ }, sinkType);
211
+ }
212
+ /**
213
+ * Setup violation monitoring
214
+ */
215
+ async setupViolationMonitoring() {
216
+ await this.page.evaluate(() => {
217
+ // Listen for Trusted Types violations
218
+ const originalHandler = window.trustedTypes?.createPolicy;
219
+ if (!originalHandler)
220
+ return;
221
+ // Store violations
222
+ if (!window.__ttViolations) {
223
+ window.__ttViolations = [];
224
+ }
225
+ // Override console.error to catch Trusted Types violations
226
+ const originalError = console.error;
227
+ console.error = function (...args) {
228
+ const message = args.join(' ');
229
+ if (message.includes('Failed to set') ||
230
+ message.includes('Trusted Types') ||
231
+ message.includes('This document requires')) {
232
+ window.__ttViolations.push({
233
+ message,
234
+ timestamp: Date.now(),
235
+ });
236
+ }
237
+ originalError.apply(console, args);
238
+ };
239
+ });
240
+ // Listen for console messages
241
+ this.page.on('console', (msg) => {
242
+ if (msg.type() === 'error') {
243
+ const text = msg.text();
244
+ if (text.includes('Trusted Types') || text.includes('Failed to set')) {
245
+ this.violations.push({
246
+ message: text,
247
+ sink: 'unknown',
248
+ value: 'unknown',
249
+ });
250
+ }
251
+ }
252
+ });
253
+ }
254
+ /**
255
+ * Get collected violations
256
+ */
257
+ getViolations() {
258
+ return [...this.violations];
259
+ }
260
+ /**
261
+ * Clear violations
262
+ */
263
+ clearViolations() {
264
+ this.violations = [];
265
+ }
266
+ /**
267
+ * Generate full Trusted Types report
268
+ */
269
+ async generateReport() {
270
+ const supported = await this.isSupported();
271
+ const directive = await this.getTrustedTypesDirective();
272
+ const config = this.parseTrustedTypesDirective(directive);
273
+ const policies = await this.getExistingPolicies();
274
+ const xssSinks = await this.detectXSSSinks();
275
+ // Get violations from page context
276
+ const pageViolations = await this.page.evaluate(() => {
277
+ return window.__ttViolations || [];
278
+ });
279
+ const allViolations = [
280
+ ...this.violations,
281
+ ...pageViolations.map((v) => ({
282
+ message: v.message,
283
+ sink: 'detected',
284
+ value: 'unknown',
285
+ })),
286
+ ];
287
+ // Calculate security score
288
+ let score = 0;
289
+ if (supported) {
290
+ score += 20;
291
+ }
292
+ if (directive) {
293
+ score += 30;
294
+ }
295
+ if (config.allowsNone && xssSinks.length === 0) {
296
+ score += 50; // Strictest configuration
297
+ }
298
+ else if (config.policyNames.length > 0) {
299
+ score += 30; // Named policies
300
+ }
301
+ else if (config.allowsAll) {
302
+ score += 10; // Any policy allowed
303
+ }
304
+ // Deduct for XSS sinks without protection
305
+ if (xssSinks.length > 0 && !supported) {
306
+ score -= 20;
307
+ }
308
+ // Generate recommendations
309
+ const recommendations = [];
310
+ if (!supported) {
311
+ recommendations.push('Trusted Types not supported in this browser');
312
+ }
313
+ else if (!directive) {
314
+ recommendations.push('Add "trusted-types" CSP directive to enable XSS protection');
315
+ recommendations.push('Consider "trusted-types \'none\'" for strictest security');
316
+ }
317
+ else if (config.allowsAll) {
318
+ recommendations.push('Replace "*" with specific policy names for better security');
319
+ }
320
+ if (xssSinks.length > 0 && supported) {
321
+ recommendations.push('Ensure all XSS sinks use Trusted Types');
322
+ }
323
+ if (!config.allowsNone && supported) {
324
+ recommendations.push('Consider using "trusted-types \'none\'" to disable default policy');
325
+ }
326
+ return {
327
+ supported,
328
+ config,
329
+ policies,
330
+ xssSinks,
331
+ violations: allViolations,
332
+ securityScore: Math.max(0, Math.min(100, score)),
333
+ recommendations,
334
+ };
335
+ }
336
+ /**
337
+ * Validate Trusted Types configuration
338
+ */
339
+ async validate() {
340
+ const report = await this.generateReport();
341
+ const errors = [];
342
+ const warnings = [];
343
+ if (!report.supported) {
344
+ warnings.push('Trusted Types not supported');
345
+ return { valid: true, errors, warnings };
346
+ }
347
+ if (!report.config.directiveValues.length) {
348
+ errors.push('No trusted-types CSP directive found');
349
+ }
350
+ if (report.xssSinks.length > 0 && !report.config.allowsNone) {
351
+ warnings.push('XSS sinks detected without strict Trusted Types policy');
352
+ }
353
+ if (report.violations.length > 0) {
354
+ errors.push(`Trusted Types violations detected: ${report.violations.length}`);
355
+ }
356
+ return {
357
+ valid: errors.length === 0,
358
+ errors,
359
+ warnings,
360
+ };
361
+ }
362
+ /**
363
+ * Generate recommended CSP snippet for Trusted Types
364
+ */
365
+ generateRecommendedCSP(policyNames = ['default'], requireTrustedTypesFor = ['script']) {
366
+ const ttDirective = policyNames.length > 0
367
+ ? `trusted-types ${policyNames.join(' ')};`
368
+ : "trusted-types 'none';";
369
+ const requireDirectives = requireTrustedTypesFor.map(feature => `require-trusted-types-for '${feature}'`).join('; ');
370
+ return `${ttDirective} ${requireDirectives}`;
371
+ }
372
+ /**
373
+ * Test if a string passes Trusted Types validation
374
+ */
375
+ async testTrustedString(policyName, input, type = 'createHTML') {
376
+ return await this.page.evaluate((data) => {
377
+ try {
378
+ if (typeof window.trustedTypes === 'undefined') {
379
+ return { success: false, error: 'Trusted Types not supported' };
380
+ }
381
+ const policy = window.trustedTypes.createPolicy(data.policy, {
382
+ createHTML: (s) => s,
383
+ createScriptURL: (s) => s,
384
+ createScript: (s) => s,
385
+ });
386
+ const result = policy[data.type](data.input);
387
+ return {
388
+ success: true,
389
+ result: String(result),
390
+ };
391
+ }
392
+ catch (e) {
393
+ return {
394
+ success: false,
395
+ error: e instanceof Error ? e.message : String(e),
396
+ };
397
+ }
398
+ }, { policyName, input, type });
399
+ }
400
+ /**
401
+ * Get documentation URL
402
+ */
403
+ getDocumentation() {
404
+ return 'https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/trusted-types';
405
+ }
406
+ }
407
+ /**
408
+ * Factory function to create Trusted Types Handler
409
+ */
410
+ export function createTrustedTypesHandler(page) {
411
+ return new TrustedTypesHandler(page);
412
+ }
413
+ export default TrustedTypesHandler;
@@ -31,6 +31,53 @@ export interface CrawlOptions {
31
31
  headless?: boolean;
32
32
  /** Wait for network idle before analysis (default: true) */
33
33
  waitForNetworkIdle?: boolean;
34
+ /** Preset for platform-specific crawling (Phase 1) */
35
+ preset?: CrawlPresetConfig;
36
+ /** Focused scenario for crawling (Phase 1) */
37
+ scenario?: 'login' | 'browse' | 'search' | 'checkout' | 'dashboard' | 'profile';
38
+ /** Only crawl URLs matching these patterns */
39
+ onlyPatterns?: string[];
40
+ }
41
+ /**
42
+ * Crawler preset with platform-specific selectors and strategies (Phase 1)
43
+ */
44
+ export interface CrawlPresetConfig {
45
+ /** Preset identifier */
46
+ id: string;
47
+ /** Preset name */
48
+ name: string;
49
+ /** Platform-specific selectors */
50
+ selectors?: {
51
+ /** Login form selectors */
52
+ login?: {
53
+ email?: string[];
54
+ password?: string[];
55
+ submit?: string[];
56
+ /** Success indicators (visible after successful login) */
57
+ successSelectors?: string[];
58
+ };
59
+ /** Action selectors (add, remove, edit, delete) */
60
+ actions?: {
61
+ add?: string[];
62
+ remove?: string[];
63
+ edit?: string[];
64
+ delete?: string[];
65
+ buy?: string[];
66
+ cart?: string[];
67
+ };
68
+ /** Content selectors */
69
+ content?: {
70
+ title?: string[];
71
+ body?: string[];
72
+ price?: string[];
73
+ };
74
+ /** Navigation selectors */
75
+ navigation?: {
76
+ next?: string[];
77
+ prev?: string[];
78
+ menu?: string[];
79
+ };
80
+ };
34
81
  }
35
82
  /**
36
83
  * Authentication for crawling
@@ -40,8 +87,10 @@ export interface CrawlAuth {
40
87
  type: 'basic' | 'form' | 'bearer' | 'cookie';
41
88
  /** URL for login form (for type: 'form') */
42
89
  loginUrl?: string;
43
- /** Username */
90
+ /** Username or email */
44
91
  username?: string;
92
+ /** Email (alias for username, commonly used) */
93
+ email?: string;
45
94
  /** Password */
46
95
  password?: string;
47
96
  /** Username selector (for type: 'form') */
@@ -131,6 +180,21 @@ export interface LinkInfo extends ElementInfo {
131
180
  /** Whether link was visited */
132
181
  visited: boolean;
133
182
  }
183
+ /**
184
+ * Iframe information (Part 5)
185
+ */
186
+ export interface IframeInfo extends ElementInfo {
187
+ /** Frame URL (src attribute) */
188
+ src?: string;
189
+ /** Frame title for accessibility */
190
+ title?: string;
191
+ /** Frame name attribute */
192
+ name?: string;
193
+ /** Whether frame has same origin (accessible) */
194
+ sameOrigin: boolean;
195
+ /** Frame selector for Playwright (iframe selector) */
196
+ frameSelector: string;
197
+ }
134
198
  /**
135
199
  * Page definition after crawling
136
200
  */
@@ -167,6 +231,8 @@ export interface PageDefinition {
167
231
  checkboxes: ElementInfo[];
168
232
  /** Radio buttons */
169
233
  radios: ElementInfo[];
234
+ /** Iframes on the page (Part 5) */
235
+ iframes: IframeInfo[];
170
236
  };
171
237
  /** Navigation elements detected */
172
238
  navigation: {
@@ -271,7 +337,7 @@ export interface JourneyStep {
271
337
  /**
272
338
  * Journey action types
273
339
  */
274
- export type JourneyAction = 'navigate' | 'click' | 'fill' | 'select' | 'check' | 'uncheck' | 'upload' | 'hover' | 'press' | 'waitFor' | 'waitForNavigation' | 'scroll';
340
+ export type JourneyAction = 'navigate' | 'click' | 'fill' | 'select' | 'check' | 'uncheck' | 'upload' | 'hover' | 'press' | 'waitFor' | 'waitForSelector' | 'waitForLoadState' | 'waitForNavigation' | 'scroll';
275
341
  /**
276
342
  * Site map structure
277
343
  */
@@ -0,0 +1,108 @@
1
+ /**
2
+ * Wait Strategies
3
+ *
4
+ * P1 - Advanced wait conditions for E2E tests
5
+ *
6
+ * Supports:
7
+ * - Network idle (no active network requests)
8
+ * - Element stable (position/size not changing)
9
+ * - DOM content loaded
10
+ * - Custom condition polling
11
+ * - Multiple wait strategies with timeout
12
+ *
13
+ * @see https://playwright.dev/docs/actionability
14
+ */
15
+ export interface WaitConfig {
16
+ /** Timeout in milliseconds */
17
+ timeout?: number;
18
+ /** Poll interval in milliseconds */
19
+ interval?: number;
20
+ }
21
+ export interface NetworkIdleConfig extends WaitConfig {
22
+ /** Minimum idle time (ms) before considering network idle */
23
+ idleTime?: number;
24
+ /** Ignore certain URLs */
25
+ ignoreUrls?: (string | RegExp)[];
26
+ }
27
+ export interface StabilityConfig extends WaitConfig {
28
+ /** Minimum stable time (ms) */
29
+ stableTime?: number;
30
+ /** Check tolerance for position/size changes (pixels) */
31
+ tolerance?: number;
32
+ }
33
+ export interface WaitResult {
34
+ success: boolean;
35
+ duration?: number;
36
+ error?: string;
37
+ }
38
+ /**
39
+ * Wait Strategies class
40
+ */
41
+ export declare class WaitStrategies {
42
+ private defaultTimeout;
43
+ private defaultInterval;
44
+ constructor(config?: WaitConfig);
45
+ /**
46
+ * Wait for network to be idle
47
+ */
48
+ waitForNetworkIdle(page: any, config?: NetworkIdleConfig): Promise<WaitResult>;
49
+ /**
50
+ * Wait for element to be stable (position/size not changing)
51
+ */
52
+ waitForStable(page: any, selector: string, config?: StabilityConfig): Promise<WaitResult>;
53
+ /**
54
+ * Wait for DOM content to be loaded
55
+ */
56
+ waitForDOMContent(page: any, config?: WaitConfig): Promise<WaitResult>;
57
+ /**
58
+ * Wait for network to be mostly idle (allows some background requests)
59
+ */
60
+ waitForNetworkMostlyIdle(page: any, config?: NetworkIdleConfig): Promise<WaitResult>;
61
+ /**
62
+ * Wait for element to be visible and stable
63
+ */
64
+ waitForVisibleAndStable(page: any, selector: string, config?: StabilityConfig): Promise<WaitResult>;
65
+ /**
66
+ * Wait for custom condition
67
+ */
68
+ waitForCondition(page: any, condition: () => boolean | Promise<boolean>, config?: WaitConfig): Promise<WaitResult>;
69
+ /**
70
+ * Wait for any element in a list to be visible
71
+ */
72
+ waitForAnyElement(page: any, selectors: string[], config?: WaitConfig): Promise<WaitResult>;
73
+ /**
74
+ * Wait for text to appear in element
75
+ */
76
+ waitForText(page: any, selector: string, text: string | RegExp, config?: WaitConfig): Promise<WaitResult>;
77
+ /**
78
+ * Wait for element count to match expected
79
+ */
80
+ waitForElementCount(page: any, selector: string, count: number, config?: WaitConfig): Promise<WaitResult>;
81
+ /**
82
+ * Wait for URL to match pattern
83
+ */
84
+ waitForURL(page: any, pattern: string | RegExp, config?: WaitConfig): Promise<WaitResult>;
85
+ /**
86
+ * Wait for console message matching pattern
87
+ */
88
+ waitForConsoleMessage(page: any, pattern: string | RegExp, config?: WaitConfig & {
89
+ type?: 'log' | 'error' | 'warning' | 'info';
90
+ }): Promise<WaitResult>;
91
+ /**
92
+ * Wait for page title
93
+ */
94
+ waitForTitle(page: any, title: string | RegExp, config?: WaitConfig): Promise<WaitResult>;
95
+ /**
96
+ * Wait for multiple conditions (all must be true)
97
+ */
98
+ waitForAll(page: any, conditions: Array<() => boolean | Promise<boolean>>, config?: WaitConfig): Promise<WaitResult>;
99
+ /**
100
+ * Wait for multiple conditions (any can be true)
101
+ */
102
+ waitForAny(page: any, conditions: Array<() => boolean | Promise<boolean>>, config?: WaitConfig): Promise<WaitResult>;
103
+ }
104
+ /**
105
+ * Factory function to create Wait Strategies
106
+ */
107
+ export declare function createWaitStrategies(config?: WaitConfig): WaitStrategies;
108
+ export default WaitStrategies;