qa360 2.3.0 → 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.js +2 -2
  5. package/{cli/dist → dist}/commands/doctor.js +2 -2
  6. package/{cli/dist → dist}/commands/explain.js +2 -2
  7. package/{cli/dist → dist}/commands/flakiness.js +1 -1
  8. package/{cli/dist → dist}/commands/generate.js +1 -1
  9. package/{cli/dist → dist}/commands/history.js +1 -1
  10. package/{cli/dist → dist}/commands/monitor.js +3 -3
  11. package/{cli/dist → dist}/commands/ollama.js +1 -1
  12. package/{cli/dist → dist}/commands/pack.js +2 -2
  13. package/{cli/dist → dist}/commands/regression.js +1 -1
  14. package/{cli/dist → dist}/commands/repair.js +1 -1
  15. package/{cli/dist → dist}/commands/retry.js +1 -1
  16. package/{cli/dist → dist}/commands/run.d.ts +1 -1
  17. package/{cli/dist → dist}/commands/run.js +1 -1
  18. package/{cli/dist → dist}/commands/secrets.js +1 -1
  19. package/{cli/dist → dist}/commands/serve.js +1 -1
  20. package/{cli/dist → dist}/commands/slo.js +1 -1
  21. package/{cli/dist → dist}/commands/verify.js +1 -1
  22. package/{cli/dist → dist}/core/adapters/playwright-native-api.d.ts +2 -0
  23. package/{cli/dist → dist}/core/adapters/playwright-native-api.js +20 -1
  24. package/{cli/dist → dist}/core/adapters/playwright-ui.d.ts +21 -0
  25. package/dist/core/adapters/playwright-ui.js +2050 -0
  26. package/{cli/dist → dist}/core/ai/ollama-provider.js +15 -3
  27. package/{cli/dist → dist}/core/artifacts/ui-artifacts.js +24 -4
  28. package/dist/core/auth/backup-codes-provider.d.ts +91 -0
  29. package/dist/core/auth/backup-codes-provider.js +215 -0
  30. package/{cli/dist → dist}/core/auth/basic-auth-provider.d.ts +6 -0
  31. package/{cli/dist → dist}/core/auth/basic-auth-provider.js +24 -6
  32. package/dist/core/auth/digest-auth-provider.d.ts +116 -0
  33. package/dist/core/auth/digest-auth-provider.js +244 -0
  34. package/dist/core/auth/hcaptcha-handler.d.ts +103 -0
  35. package/dist/core/auth/hcaptcha-handler.js +288 -0
  36. package/{cli/dist → dist}/core/auth/index.d.ts +81 -4
  37. package/{cli/dist → dist}/core/auth/index.js +15 -1
  38. package/dist/core/auth/oauth-handler.d.ts +408 -0
  39. package/dist/core/auth/oauth-handler.js +636 -0
  40. package/{cli/dist → dist}/core/auth/oauth2-provider.d.ts +9 -0
  41. package/dist/core/auth/oauth2-provider.js +227 -0
  42. package/dist/core/auth/otp-provider.d.ts +93 -0
  43. package/dist/core/auth/otp-provider.js +288 -0
  44. package/dist/core/auth/recaptcha-handler.d.ts +119 -0
  45. package/dist/core/auth/recaptcha-handler.js +301 -0
  46. package/dist/core/auth/remember-me-handler.d.ts +142 -0
  47. package/dist/core/auth/remember-me-handler.js +255 -0
  48. package/dist/core/auth/saml-handler.d.ts +173 -0
  49. package/dist/core/auth/saml-handler.js +364 -0
  50. package/dist/core/auth/webauthn-handler.d.ts +182 -0
  51. package/dist/core/auth/webauthn-handler.js +310 -0
  52. package/dist/core/crawler/advanced-interactions.d.ts +342 -0
  53. package/dist/core/crawler/advanced-interactions.js +1069 -0
  54. package/dist/core/crawler/blob-url-download-handler.d.ts +145 -0
  55. package/dist/core/crawler/blob-url-download-handler.js +392 -0
  56. package/dist/core/crawler/consent-handler.d.ts +49 -0
  57. package/dist/core/crawler/consent-handler.js +258 -0
  58. package/dist/core/crawler/cookie-manager.d.ts +166 -0
  59. package/dist/core/crawler/cookie-manager.js +353 -0
  60. package/dist/core/crawler/coop-coep-handler.d.ts +136 -0
  61. package/dist/core/crawler/coop-coep-handler.js +338 -0
  62. package/dist/core/crawler/csp-handler.d.ts +151 -0
  63. package/dist/core/crawler/csp-handler.js +415 -0
  64. package/dist/core/crawler/download-handler.d.ts +155 -0
  65. package/dist/core/crawler/download-handler.js +370 -0
  66. package/dist/core/crawler/email-testing-handler.d.ts +214 -0
  67. package/dist/core/crawler/email-testing-handler.js +398 -0
  68. package/dist/core/crawler/error-tracking-handler.d.ts +177 -0
  69. package/dist/core/crawler/error-tracking-handler.js +378 -0
  70. package/dist/core/crawler/form-handler.d.ts +100 -0
  71. package/dist/core/crawler/form-handler.js +465 -0
  72. package/dist/core/crawler/framework-wait-handler.d.ts +96 -0
  73. package/dist/core/crawler/framework-wait-handler.js +464 -0
  74. package/dist/core/crawler/geolocation-handler.d.ts +112 -0
  75. package/dist/core/crawler/geolocation-handler.js +276 -0
  76. package/dist/core/crawler/index.d.ts +78 -0
  77. package/{cli/dist → dist}/core/crawler/index.js +74 -1
  78. package/dist/core/crawler/intelligent-selector-generator.d.ts +164 -0
  79. package/dist/core/crawler/intelligent-selector-generator.js +612 -0
  80. package/{cli/dist → dist}/core/crawler/journey-generator.js +44 -1
  81. package/{cli/dist → dist}/core/crawler/page-analyzer.d.ts +16 -1
  82. package/{cli/dist → dist}/core/crawler/page-analyzer.js +469 -17
  83. package/dist/core/crawler/permissions-handler.d.ts +112 -0
  84. package/dist/core/crawler/permissions-handler.js +236 -0
  85. package/dist/core/crawler/permissions-policy-handler.d.ts +113 -0
  86. package/dist/core/crawler/permissions-policy-handler.js +402 -0
  87. package/dist/core/crawler/presets.d.ts +100 -0
  88. package/dist/core/crawler/presets.js +887 -0
  89. package/dist/core/crawler/repl-debug-handler.d.ts +105 -0
  90. package/dist/core/crawler/repl-debug-handler.js +552 -0
  91. package/dist/core/crawler/reporting-api-handler.d.ts +212 -0
  92. package/dist/core/crawler/reporting-api-handler.js +344 -0
  93. package/{cli/dist → dist}/core/crawler/selector-generator.d.ts +9 -0
  94. package/{cli/dist → dist}/core/crawler/selector-generator.js +99 -23
  95. package/dist/core/crawler/site-profiler.d.ts +89 -0
  96. package/dist/core/crawler/site-profiler.js +290 -0
  97. package/dist/core/crawler/sourcemaps-handler.d.ts +144 -0
  98. package/dist/core/crawler/sourcemaps-handler.js +420 -0
  99. package/dist/core/crawler/stacked-modals-handler.d.ts +118 -0
  100. package/dist/core/crawler/stacked-modals-handler.js +429 -0
  101. package/dist/core/crawler/trusted-types-handler.d.ts +149 -0
  102. package/dist/core/crawler/trusted-types-handler.js +413 -0
  103. package/{cli/dist → dist}/core/crawler/types.d.ts +68 -2
  104. package/dist/core/crawler/wait-strategies.d.ts +108 -0
  105. package/dist/core/crawler/wait-strategies.js +399 -0
  106. package/dist/core/fixtures/factories.d.ts +180 -0
  107. package/dist/core/fixtures/factories.js +279 -0
  108. package/dist/core/fixtures/index.d.ts +6 -0
  109. package/dist/core/fixtures/index.js +6 -0
  110. package/{cli/dist → dist}/core/generation/crawler-pack-generator.d.ts +13 -3
  111. package/dist/core/generation/crawler-pack-generator.js +232 -0
  112. package/{cli/dist → dist}/core/generation/index.d.ts +2 -0
  113. package/{cli/dist → dist}/core/generation/index.js +2 -0
  114. package/{cli/dist → dist}/core/index.d.ts +2 -0
  115. package/{cli/dist → dist}/core/index.js +4 -0
  116. package/dist/core/network/index.d.ts +7 -0
  117. package/dist/core/network/index.js +7 -0
  118. package/dist/core/network/network-manager.d.ts +237 -0
  119. package/dist/core/network/network-manager.js +343 -0
  120. package/dist/core/network/network-simulator.d.ts +158 -0
  121. package/dist/core/network/network-simulator.js +261 -0
  122. package/{cli/dist → dist}/core/pack/validator.js +2 -2
  123. package/{cli/dist → dist}/core/pack-v2/migrator.d.ts +5 -0
  124. package/{cli/dist → dist}/core/pack-v2/migrator.js +81 -6
  125. package/{cli/dist → dist}/core/pack-v2/validator.js +4 -3
  126. package/{cli/dist → dist}/core/pom/base-page.js +1 -1
  127. package/{cli/dist → dist}/core/pom/loader.js +1 -1
  128. package/dist/core/reporting/index.d.ts +9 -0
  129. package/dist/core/reporting/index.js +10 -0
  130. package/dist/core/reporting/junit-reporter.d.ts +114 -0
  131. package/dist/core/reporting/junit-reporter.js +306 -0
  132. package/{cli/dist → dist}/core/runner/e2e-helpers.d.ts +1 -1
  133. package/{cli/dist → dist}/core/runner/e2e-helpers.js +2 -2
  134. package/{cli/dist → dist}/core/runner/phase3-runner.d.ts +3 -0
  135. package/{cli/dist → dist}/core/runner/phase3-runner.js +45 -14
  136. package/dist/core/sharding/test-sharding.d.ts +137 -0
  137. package/dist/core/sharding/test-sharding.js +233 -0
  138. package/dist/core/storage/cookie-manager.d.ts +160 -0
  139. package/dist/core/storage/cookie-manager.js +268 -0
  140. package/dist/core/storage/index.d.ts +7 -0
  141. package/dist/core/storage/index.js +7 -0
  142. package/dist/core/storage/storage-helpers.d.ts +138 -0
  143. package/dist/core/storage/storage-helpers.js +315 -0
  144. package/dist/core/test-helpers/index.d.ts +6 -0
  145. package/dist/core/test-helpers/index.js +6 -0
  146. package/dist/core/test-helpers/state-reset.d.ts +119 -0
  147. package/dist/core/test-helpers/state-reset.js +234 -0
  148. package/{cli/dist → dist}/core/types/pack-v1.d.ts +15 -2
  149. package/{cli/dist → dist}/core/types/pack-v2.d.ts +1 -1
  150. package/dist/core/upload/chunked-uploader.d.ts +150 -0
  151. package/dist/core/upload/chunked-uploader.js +289 -0
  152. package/dist/core/upload/index.d.ts +11 -0
  153. package/dist/core/upload/index.js +8 -0
  154. package/dist/core/upload/mime-validator.d.ts +119 -0
  155. package/dist/core/upload/mime-validator.js +373 -0
  156. package/dist/core/upload/presigned-uploader.d.ts +118 -0
  157. package/dist/core/upload/presigned-uploader.js +274 -0
  158. package/dist/core/utils/device-emulation.d.ts +194 -0
  159. package/dist/core/utils/device-emulation.js +380 -0
  160. package/dist/core/utils/index.d.ts +8 -0
  161. package/dist/core/utils/index.js +8 -0
  162. package/dist/core/utils/retry.d.ts +145 -0
  163. package/dist/core/utils/retry.js +242 -0
  164. package/dist/core/utils/smart-wait.d.ts +133 -0
  165. package/dist/core/utils/smart-wait.js +417 -0
  166. package/dist/core/visual/index.d.ts +7 -0
  167. package/dist/core/visual/index.js +7 -0
  168. package/dist/core/visual/pixel-diff.d.ts +87 -0
  169. package/dist/core/visual/pixel-diff.js +213 -0
  170. package/dist/core/visual/screenshot-helper.d.ts +130 -0
  171. package/dist/core/visual/screenshot-helper.js +223 -0
  172. package/{cli/dist → dist}/utils/config.d.ts +1 -1
  173. package/examples/README.md +160 -0
  174. package/examples/accessibility.yml +48 -0
  175. package/examples/api-basic.yml +27 -0
  176. package/examples/complete.yml +146 -0
  177. package/examples/crawler.yml +38 -0
  178. package/examples/fullstack.yml +78 -0
  179. package/examples/security.yml +58 -0
  180. package/examples/ui-advanced.yml +49 -0
  181. package/examples/ui-basic.yml +24 -0
  182. package/package.json +33 -67
  183. package/CHANGELOG.md +0 -330
  184. package/CONTRIBUTING.md +0 -273
  185. package/QUICK_START.md +0 -191
  186. package/cli/CHANGELOG.md +0 -84
  187. package/cli/LICENSE +0 -24
  188. package/cli/README.md +0 -222
  189. package/cli/dist/core/adapters/playwright-ui.js +0 -864
  190. package/cli/dist/core/auth/oauth2-provider.js +0 -114
  191. package/cli/dist/core/coverage/analyzer.d.ts +0 -101
  192. package/cli/dist/core/coverage/analyzer.js +0 -415
  193. package/cli/dist/core/coverage/collector.d.ts +0 -74
  194. package/cli/dist/core/coverage/collector.js +0 -459
  195. package/cli/dist/core/coverage/config.d.ts +0 -37
  196. package/cli/dist/core/coverage/config.js +0 -156
  197. package/cli/dist/core/coverage/index.d.ts +0 -11
  198. package/cli/dist/core/coverage/index.js +0 -15
  199. package/cli/dist/core/coverage/types.d.ts +0 -267
  200. package/cli/dist/core/coverage/types.js +0 -6
  201. package/cli/dist/core/coverage/vault.d.ts +0 -95
  202. package/cli/dist/core/coverage/vault.js +0 -405
  203. package/cli/dist/core/crawler/index.d.ts +0 -57
  204. package/cli/dist/core/fixtures/index.d.ts +0 -8
  205. package/cli/dist/core/fixtures/index.js +0 -8
  206. package/cli/dist/core/generation/crawler-pack-generator.js +0 -231
  207. package/cli/dist/core/reporting/index.d.ts +0 -6
  208. package/cli/dist/core/reporting/index.js +0 -6
  209. package/cli/dist/core/visual/index.d.ts +0 -6
  210. package/cli/dist/core/visual/index.js +0 -6
  211. package/cli/package.json +0 -76
  212. package/core/LICENSE +0 -24
  213. package/core/README.md +0 -105
  214. package/core/package.json +0 -90
  215. package/core/schemas/pack.schema.json +0 -236
  216. /package/{cli/bin → bin}/qa360.js +0 -0
  217. /package/{cli/dist → dist}/cli-minimal.d.ts +0 -0
  218. /package/{cli/dist → dist}/cli-minimal.js +0 -0
  219. /package/{cli/dist → dist}/commands/ai.d.ts +0 -0
  220. /package/{cli/dist → dist}/commands/ask.d.ts +0 -0
  221. /package/{cli/dist → dist}/commands/ask.js +0 -0
  222. /package/{cli/dist → dist}/commands/coverage.d.ts +0 -0
  223. /package/{cli/dist → dist}/commands/crawl.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,227 @@
1
+ /**
2
+ * OAuth2 Authentication Provider
3
+ *
4
+ * Handles OAuth2 authentication with support for:
5
+ * - Client credentials grant
6
+ * - Password grant (resource owner)
7
+ * - Authorization code grant (requires pre-issued code)
8
+ *
9
+ * P0: Refresh token support for automatic token renewal
10
+ */
11
+ import { authCache, createCacheKey } from './index.js';
12
+ export class OAuth2Provider {
13
+ type = 'oauth2';
14
+ async authenticate(config) {
15
+ const cacheKey = this.getCacheKey(config);
16
+ // Check cache first
17
+ if (config.cache?.enabled !== false) {
18
+ const cached = authCache.get(cacheKey);
19
+ if (cached) {
20
+ // P0: Check if token is expired and auto_refresh is enabled
21
+ if (config.auto_refresh && cached.expiresAt && cached.expiresAt < Date.now()) {
22
+ // Token expired, try to refresh
23
+ if (cached.refreshToken || config.refresh_token) {
24
+ const refreshResult = await this.refresh(config);
25
+ if (refreshResult.success) {
26
+ return refreshResult;
27
+ }
28
+ }
29
+ }
30
+ return { success: true, credentials: cached };
31
+ }
32
+ }
33
+ // If we have a refresh_token in config, use refresh flow
34
+ if (config.refresh_token && config.grant_type !== 'refresh_token') {
35
+ return this.performRefresh(config);
36
+ }
37
+ // Prepare token request based on grant type
38
+ const grantType = config.grant_type || 'client_credentials';
39
+ const body = {
40
+ grant_type: grantType,
41
+ client_id: config.client_id,
42
+ };
43
+ // Add client secret for most grants (except some implicit flows)
44
+ if (config.client_secret) {
45
+ body.client_secret = config.client_secret;
46
+ }
47
+ // Grant-specific parameters
48
+ if (grantType === 'password') {
49
+ if (!config.username || !config.password) {
50
+ return {
51
+ success: false,
52
+ error: 'Username and password required for password grant'
53
+ };
54
+ }
55
+ body.username = config.username;
56
+ body.password = config.password;
57
+ }
58
+ if (config.scopes && config.scopes.length > 0) {
59
+ body.scope = config.scopes.join(' ');
60
+ }
61
+ try {
62
+ const response = await fetch(config.token_url, {
63
+ method: 'POST',
64
+ headers: {
65
+ 'Content-Type': 'application/x-www-form-urlencoded',
66
+ },
67
+ body: new URLSearchParams(body).toString(),
68
+ });
69
+ if (!response.ok) {
70
+ const error = await response.text().catch(() => 'Unknown error');
71
+ return {
72
+ success: false,
73
+ error: `OAuth2 token request failed: ${response.status} ${error}`
74
+ };
75
+ }
76
+ const data = await response.json();
77
+ const token = data.access_token;
78
+ if (!token) {
79
+ return {
80
+ success: false,
81
+ error: 'No access_token in OAuth2 response'
82
+ };
83
+ }
84
+ // Calculate expiration
85
+ let expiresAt;
86
+ if (data.expires_in) {
87
+ expiresAt = Date.now() + data.expires_in * 1000;
88
+ }
89
+ const credentials = {
90
+ type: 'oauth2',
91
+ headers: {
92
+ 'Authorization': `Bearer ${token}`
93
+ },
94
+ // P0: Store refresh token for later use
95
+ refreshToken: data.refresh_token,
96
+ expiresAt,
97
+ };
98
+ // Cache if enabled
99
+ if (config.cache?.enabled !== false) {
100
+ const ttl = config.cache?.ttl || data.expires_in || 3600;
101
+ authCache.set(cacheKey, credentials, ttl);
102
+ }
103
+ return {
104
+ success: true,
105
+ credentials,
106
+ expiresAt
107
+ };
108
+ }
109
+ catch (error) {
110
+ return {
111
+ success: false,
112
+ error: `OAuth2 request failed: ${error.message}`
113
+ };
114
+ }
115
+ }
116
+ /**
117
+ * P0: Refresh OAuth2 access token using refresh token
118
+ */
119
+ async refresh(config) {
120
+ return this.performRefresh(config);
121
+ }
122
+ /**
123
+ * P0: Perform refresh token flow
124
+ */
125
+ async performRefresh(config) {
126
+ const cacheKey = this.getCacheKey(config);
127
+ // Get refresh token from config or cached credentials
128
+ let refreshToken = config.refresh_token;
129
+ if (!refreshToken && config.cache?.enabled !== false) {
130
+ const cached = authCache.get(cacheKey);
131
+ if (cached?.refreshToken) {
132
+ refreshToken = cached.refreshToken;
133
+ }
134
+ }
135
+ if (!refreshToken) {
136
+ // No refresh token available, fall back to full authentication
137
+ return this.authenticate({ ...config, refresh_token: undefined });
138
+ }
139
+ // Prepare refresh token request
140
+ const body = {
141
+ grant_type: 'refresh_token',
142
+ refresh_token: refreshToken,
143
+ client_id: config.client_id,
144
+ };
145
+ if (config.client_secret) {
146
+ body.client_secret = config.client_secret;
147
+ }
148
+ if (config.scopes && config.scopes.length > 0) {
149
+ body.scope = config.scopes.join(' ');
150
+ }
151
+ const tokenUrl = config.refresh_url || config.token_url;
152
+ try {
153
+ const response = await fetch(tokenUrl, {
154
+ method: 'POST',
155
+ headers: {
156
+ 'Content-Type': 'application/x-www-form-urlencoded',
157
+ },
158
+ body: new URLSearchParams(body).toString(),
159
+ });
160
+ if (!response.ok) {
161
+ const error = await response.text().catch(() => 'Unknown error');
162
+ // Refresh token failed - might be expired, try full auth
163
+ const fullAuthResult = await this.authenticate({ ...config, refresh_token: undefined });
164
+ return fullAuthResult;
165
+ }
166
+ const data = await response.json();
167
+ const token = data.access_token;
168
+ if (!token) {
169
+ return {
170
+ success: false,
171
+ error: 'No access_token in OAuth2 refresh response'
172
+ };
173
+ }
174
+ // Calculate expiration
175
+ let expiresAt;
176
+ if (data.expires_in) {
177
+ expiresAt = Date.now() + data.expires_in * 1000;
178
+ }
179
+ // Use new refresh token if provided (rotation), otherwise keep existing
180
+ const newRefreshToken = data.refresh_token || refreshToken;
181
+ const credentials = {
182
+ type: 'oauth2',
183
+ headers: {
184
+ 'Authorization': `Bearer ${token}`
185
+ },
186
+ refreshToken: newRefreshToken,
187
+ expiresAt,
188
+ };
189
+ // Update cache
190
+ if (config.cache?.enabled !== false) {
191
+ const ttl = config.cache?.ttl || data.expires_in || 3600;
192
+ authCache.set(cacheKey, credentials, ttl);
193
+ }
194
+ return {
195
+ success: true,
196
+ credentials,
197
+ expiresAt
198
+ };
199
+ }
200
+ catch (error) {
201
+ return {
202
+ success: false,
203
+ error: `OAuth2 refresh failed: ${error.message}`
204
+ };
205
+ }
206
+ }
207
+ clear(config) {
208
+ const key = this.getCacheKey(config);
209
+ authCache.clear(key);
210
+ return Promise.resolve();
211
+ }
212
+ async validate(config) {
213
+ const key = this.getCacheKey(config);
214
+ const cached = authCache.get(key);
215
+ if (!cached) {
216
+ return false;
217
+ }
218
+ // Check if token is expired
219
+ if (cached.expiresAt && cached.expiresAt < Date.now()) {
220
+ return false;
221
+ }
222
+ return true;
223
+ }
224
+ getCacheKey(config) {
225
+ return createCacheKey('oauth2', config.client_id);
226
+ }
227
+ }
@@ -0,0 +1,93 @@
1
+ /**
2
+ * OTP (One-Time Password) Authentication Provider
3
+ *
4
+ * Handles OTP-based authentication including:
5
+ * - SMS OTP: One-time passwords sent via SMS
6
+ * - Email OTP: One-time passwords sent via email
7
+ * - Magic Links: Login links sent via email
8
+ *
9
+ * P1 Feature: OTP-based authentication is widely used for 2FA and passwordless flows
10
+ */
11
+ import type { AuthProvider, AuthResult } from './index.js';
12
+ import { type OTPAuthConfig } from './index.js';
13
+ /**
14
+ * OTP delivery method
15
+ */
16
+ export type OTPDeliveryMethod = 'sms' | 'email' | 'magic_link';
17
+ /**
18
+ * Generates a random OTP code
19
+ * @param digits Number of digits (default 6)
20
+ */
21
+ export declare function generateOTP(digits?: number): string;
22
+ /**
23
+ * Validates OTP format
24
+ * @param code OTP code to validate
25
+ * @param digits Expected number of digits
26
+ */
27
+ export declare function validateOTPFormat(code: string, digits?: number): boolean;
28
+ /**
29
+ * Generates a magic link URL
30
+ * @param baseUrl Base URL of the application
31
+ * @param token Authentication token
32
+ * @param email User email
33
+ */
34
+ export declare function generateMagicLink(baseUrl: string, token: string, email: string): string;
35
+ /**
36
+ * Extracts token from magic link URL
37
+ * @param url Magic link URL
38
+ */
39
+ export declare function extractTokenFromMagicLink(url: string): string | null;
40
+ /**
41
+ * OTP Authentication Provider
42
+ */
43
+ export declare class OTPProvider implements AuthProvider<OTPAuthConfig> {
44
+ readonly type: "otp";
45
+ private otpStates;
46
+ private maxAttempts;
47
+ authenticate(config: OTPAuthConfig): Promise<AuthResult>;
48
+ /**
49
+ * Requests a new OTP to be sent
50
+ */
51
+ requestOTP(config: OTPAuthConfig): Promise<AuthResult>;
52
+ /**
53
+ * Verifies an OTP code
54
+ */
55
+ verifyOTP(config: OTPAuthConfig): Promise<AuthResult>;
56
+ /**
57
+ * Verifies a magic link
58
+ */
59
+ verifyMagicLink(config: OTPAuthConfig): Promise<AuthResult>;
60
+ /**
61
+ * Generates a session token
62
+ */
63
+ private generateSessionToken;
64
+ /**
65
+ * Validates OTP configuration
66
+ */
67
+ validate(config: OTPAuthConfig): Promise<boolean>;
68
+ /**
69
+ * Clears cached OTP state
70
+ */
71
+ clear(config: OTPAuthConfig): Promise<void>;
72
+ /**
73
+ * Gets remaining time for OTP expiration
74
+ */
75
+ getOTPTimeRemaining(destination: string): number | null;
76
+ /**
77
+ * Gets remaining attempts for OTP verification
78
+ */
79
+ getRemainingAttempts(destination: string): number;
80
+ /**
81
+ * Sets maximum verification attempts
82
+ */
83
+ setMaxAttempts(max: number): void;
84
+ /**
85
+ * Clears all OTP states
86
+ */
87
+ clearAllStates(): void;
88
+ private getCacheKey;
89
+ }
90
+ /**
91
+ * Creates an OTP auth provider instance
92
+ */
93
+ export declare function createOTPProvider(): OTPProvider;
@@ -0,0 +1,288 @@
1
+ /**
2
+ * OTP (One-Time Password) Authentication Provider
3
+ *
4
+ * Handles OTP-based authentication including:
5
+ * - SMS OTP: One-time passwords sent via SMS
6
+ * - Email OTP: One-time passwords sent via email
7
+ * - Magic Links: Login links sent via email
8
+ *
9
+ * P1 Feature: OTP-based authentication is widely used for 2FA and passwordless flows
10
+ */
11
+ import { createCacheKey, authCache } from './index.js';
12
+ /**
13
+ * Generates a random OTP code
14
+ * @param digits Number of digits (default 6)
15
+ */
16
+ export function generateOTP(digits = 6) {
17
+ const min = Math.pow(10, digits - 1);
18
+ const max = Math.pow(10, digits) - 1;
19
+ return Math.floor(min + Math.random() * (max - min + 1)).toString().padStart(digits, '0');
20
+ }
21
+ /**
22
+ * Validates OTP format
23
+ * @param code OTP code to validate
24
+ * @param digits Expected number of digits
25
+ */
26
+ export function validateOTPFormat(code, digits = 6) {
27
+ const regex = new RegExp(`^\\d{${digits}}$`);
28
+ return regex.test(code);
29
+ }
30
+ /**
31
+ * Generates a magic link URL
32
+ * @param baseUrl Base URL of the application
33
+ * @param token Authentication token
34
+ * @param email User email
35
+ */
36
+ export function generateMagicLink(baseUrl, token, email) {
37
+ const url = new URL(baseUrl);
38
+ url.searchParams.set('token', token);
39
+ url.searchParams.set('email', email);
40
+ return url.toString();
41
+ }
42
+ /**
43
+ * Extracts token from magic link URL
44
+ * @param url Magic link URL
45
+ */
46
+ export function extractTokenFromMagicLink(url) {
47
+ try {
48
+ const parsed = new URL(url);
49
+ return parsed.searchParams.get('token');
50
+ }
51
+ catch {
52
+ return null;
53
+ }
54
+ }
55
+ /**
56
+ * OTP Authentication Provider
57
+ */
58
+ export class OTPProvider {
59
+ type = 'otp';
60
+ otpStates = new Map();
61
+ maxAttempts = 3;
62
+ async authenticate(config) {
63
+ const { method, destination, code, magicLinkUrl, verifyEndpoint, headers } = config;
64
+ if (!destination) {
65
+ return {
66
+ success: false,
67
+ error: `${method} destination is required`
68
+ };
69
+ }
70
+ const cacheKey = this.getCacheKey(config);
71
+ // If code is provided, verify it
72
+ if (code) {
73
+ return this.verifyOTP(config);
74
+ }
75
+ // If magic link URL is provided, extract token
76
+ if (magicLinkUrl && method === 'magic_link') {
77
+ return this.verifyMagicLink(config);
78
+ }
79
+ // Otherwise, request a new OTP
80
+ return this.requestOTP(config);
81
+ }
82
+ /**
83
+ * Requests a new OTP to be sent
84
+ */
85
+ async requestOTP(config) {
86
+ const { method, destination, requestEndpoint, headers: customHeaders } = config;
87
+ // In a real implementation, this would call an API to send the OTP
88
+ // For now, we simulate the OTP generation
89
+ const otp = generateOTP(6);
90
+ const expiresAt = Date.now() + 5 * 60 * 1000; // 5 minutes
91
+ // Store OTP state (in production, this would be on the server)
92
+ this.otpStates.set(destination, {
93
+ code: otp,
94
+ expiresAt,
95
+ attempts: 0,
96
+ });
97
+ // Simulate API call if endpoint provided
98
+ if (requestEndpoint) {
99
+ // In real implementation, would make HTTP request
100
+ console.log(`[OTP Mock] Sending ${method} to ${destination}: ${otp}`);
101
+ }
102
+ return {
103
+ success: true,
104
+ credentials: {
105
+ type: 'otp',
106
+ headers: {
107
+ 'X-OTP-Destination': destination,
108
+ 'X-OTP-Method': method,
109
+ },
110
+ },
111
+ };
112
+ }
113
+ /**
114
+ * Verifies an OTP code
115
+ */
116
+ async verifyOTP(config) {
117
+ const { destination, code, verifyEndpoint } = config;
118
+ if (!code) {
119
+ return {
120
+ success: false,
121
+ error: 'OTP code is required for verification'
122
+ };
123
+ }
124
+ // Check local state
125
+ const state = this.otpStates.get(destination);
126
+ if (!state) {
127
+ return {
128
+ success: false,
129
+ error: 'No OTP requested for this destination'
130
+ };
131
+ }
132
+ // Check expiration
133
+ if (Date.now() > state.expiresAt) {
134
+ this.otpStates.delete(destination);
135
+ return {
136
+ success: false,
137
+ error: 'OTP has expired'
138
+ };
139
+ }
140
+ // Check attempts
141
+ if (state.attempts >= this.maxAttempts) {
142
+ this.otpStates.delete(destination);
143
+ return {
144
+ success: false,
145
+ error: 'Maximum verification attempts exceeded'
146
+ };
147
+ }
148
+ // Increment attempts
149
+ state.attempts++;
150
+ // Verify code
151
+ if (code !== state.code) {
152
+ return {
153
+ success: false,
154
+ error: 'Invalid OTP code',
155
+ };
156
+ }
157
+ // Success - clean up state
158
+ this.otpStates.delete(destination);
159
+ // Generate a session token
160
+ const token = this.generateSessionToken();
161
+ return {
162
+ success: true,
163
+ credentials: {
164
+ type: 'otp',
165
+ headers: {
166
+ 'Authorization': `Bearer ${token}`,
167
+ },
168
+ },
169
+ expiresAt: Date.now() + 24 * 60 * 60 * 1000, // 24 hours
170
+ };
171
+ }
172
+ /**
173
+ * Verifies a magic link
174
+ */
175
+ async verifyMagicLink(config) {
176
+ const { magicLinkUrl, destination } = config;
177
+ if (!magicLinkUrl) {
178
+ return {
179
+ success: false,
180
+ error: 'Magic link URL is required'
181
+ };
182
+ }
183
+ const token = extractTokenFromMagicLink(magicLinkUrl);
184
+ if (!token) {
185
+ return {
186
+ success: false,
187
+ error: 'Invalid magic link URL'
188
+ };
189
+ }
190
+ // In a real implementation, verify token with server
191
+ // For now, accept any valid-looking token
192
+ if (token.length < 10) {
193
+ return {
194
+ success: false,
195
+ error: 'Invalid magic link token'
196
+ };
197
+ }
198
+ return {
199
+ success: true,
200
+ credentials: {
201
+ type: 'otp',
202
+ headers: {
203
+ 'Authorization': `Bearer ${token}`,
204
+ },
205
+ },
206
+ expiresAt: Date.now() + 7 * 24 * 60 * 60 * 1000, // 7 days
207
+ };
208
+ }
209
+ /**
210
+ * Generates a session token
211
+ */
212
+ generateSessionToken() {
213
+ const crypto = require('node:crypto');
214
+ return crypto.randomBytes(32).toString('hex');
215
+ }
216
+ /**
217
+ * Validates OTP configuration
218
+ */
219
+ async validate(config) {
220
+ if (!config.destination) {
221
+ return false;
222
+ }
223
+ if (config.method === 'sms') {
224
+ // Validate phone number format (basic)
225
+ return /^[\d\s+()-]{10,}$/.test(config.destination);
226
+ }
227
+ if (config.method === 'email' || config.method === 'magic_link') {
228
+ // Validate email format
229
+ return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(config.destination);
230
+ }
231
+ return false;
232
+ }
233
+ /**
234
+ * Clears cached OTP state
235
+ */
236
+ async clear(config) {
237
+ const key = this.getCacheKey(config);
238
+ authCache.clear(key);
239
+ this.otpStates.delete(config.destination);
240
+ }
241
+ /**
242
+ * Gets remaining time for OTP expiration
243
+ */
244
+ getOTPTimeRemaining(destination) {
245
+ const state = this.otpStates.get(destination);
246
+ if (!state)
247
+ return null;
248
+ const remaining = state.expiresAt - Date.now();
249
+ return remaining > 0 ? remaining : 0;
250
+ }
251
+ /**
252
+ * Gets remaining attempts for OTP verification
253
+ */
254
+ getRemainingAttempts(destination) {
255
+ const state = this.otpStates.get(destination);
256
+ if (!state)
257
+ return this.maxAttempts;
258
+ return this.maxAttempts - state.attempts;
259
+ }
260
+ /**
261
+ * Sets maximum verification attempts
262
+ */
263
+ setMaxAttempts(max) {
264
+ this.maxAttempts = max;
265
+ }
266
+ /**
267
+ * Clears all OTP states
268
+ */
269
+ clearAllStates() {
270
+ this.otpStates.clear();
271
+ }
272
+ getCacheKey(config) {
273
+ const crypto = require('node:crypto');
274
+ const hash = crypto
275
+ .createHash('sha256')
276
+ .update(`${config.method}:${config.destination}`)
277
+ .digest('hex')
278
+ .substring(0, 16);
279
+ return createCacheKey('otp', hash);
280
+ }
281
+ }
282
+ /**
283
+ * Creates an OTP auth provider instance
284
+ */
285
+ export function createOTPProvider() {
286
+ return new OTPProvider();
287
+ }
288
+ // Types are exported from index.ts