@effect-auth/core 0.1.0-alpha.16 → 0.1.0-alpha.19

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 (637) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +307 -133
  3. package/dist/AbuseProtection.d.ts +100 -0
  4. package/dist/AbuseProtection.d.ts.map +1 -0
  5. package/dist/AbuseProtection.js +71 -0
  6. package/dist/AbuseProtection.js.map +1 -0
  7. package/dist/AccessGrant.d.ts +344 -0
  8. package/dist/AccessGrant.d.ts.map +1 -0
  9. package/dist/AccessGrant.js +687 -0
  10. package/dist/AccessGrant.js.map +1 -0
  11. package/dist/ApiKey.d.ts +0 -12
  12. package/dist/ApiKey.d.ts.map +1 -1
  13. package/dist/ApiKey.js +36 -27
  14. package/dist/ApiKey.js.map +1 -1
  15. package/dist/Assurance.d.ts +415 -0
  16. package/dist/Assurance.d.ts.map +1 -0
  17. package/dist/Assurance.js +764 -0
  18. package/dist/Assurance.js.map +1 -0
  19. package/dist/AtomicPlanExecutor.d.ts +28 -0
  20. package/dist/AtomicPlanExecutor.d.ts.map +1 -0
  21. package/dist/AtomicPlanExecutor.js +5 -0
  22. package/dist/AtomicPlanExecutor.js.map +1 -0
  23. package/dist/AuditLog.d.ts +2314 -52
  24. package/dist/AuditLog.d.ts.map +1 -1
  25. package/dist/AuditLog.js +511 -33
  26. package/dist/AuditLog.js.map +1 -1
  27. package/dist/AuthFlow.d.ts +128 -38
  28. package/dist/AuthFlow.d.ts.map +1 -1
  29. package/dist/AuthFlow.js +611 -263
  30. package/dist/AuthFlow.js.map +1 -1
  31. package/dist/AuthRateLimit.d.ts +96 -0
  32. package/dist/AuthRateLimit.d.ts.map +1 -0
  33. package/dist/AuthRateLimit.js +212 -0
  34. package/dist/AuthRateLimit.js.map +1 -0
  35. package/dist/Challenge.d.ts +0 -3
  36. package/dist/Challenge.d.ts.map +1 -1
  37. package/dist/Challenge.js +1 -4
  38. package/dist/Challenge.js.map +1 -1
  39. package/dist/Client.d.ts +205 -10
  40. package/dist/Client.d.ts.map +1 -1
  41. package/dist/Client.js +397 -16
  42. package/dist/Client.js.map +1 -1
  43. package/dist/CloudflareTurnstile.d.ts +28 -0
  44. package/dist/CloudflareTurnstile.d.ts.map +1 -0
  45. package/dist/CloudflareTurnstile.js +205 -0
  46. package/dist/CloudflareTurnstile.js.map +1 -0
  47. package/dist/Crypto.d.ts +0 -3
  48. package/dist/Crypto.d.ts.map +1 -1
  49. package/dist/Crypto.js +1 -4
  50. package/dist/Crypto.js.map +1 -1
  51. package/dist/DelegatedAccessStorageMigrations.d.ts +7 -0
  52. package/dist/DelegatedAccessStorageMigrations.d.ts.map +1 -0
  53. package/dist/DelegatedAccessStorageMigrations.js +159 -0
  54. package/dist/DelegatedAccessStorageMigrations.js.map +1 -0
  55. package/dist/DevEmail.d.ts +44 -0
  56. package/dist/DevEmail.d.ts.map +1 -0
  57. package/dist/DevEmail.js +115 -0
  58. package/dist/DevEmail.js.map +1 -0
  59. package/dist/DevelopmentSeed.d.ts +47 -0
  60. package/dist/DevelopmentSeed.d.ts.map +1 -0
  61. package/dist/DevelopmentSeed.js +337 -0
  62. package/dist/DevelopmentSeed.js.map +1 -0
  63. package/dist/DisposableEmailDomains.d.ts +19 -0
  64. package/dist/DisposableEmailDomains.d.ts.map +1 -0
  65. package/dist/DisposableEmailDomains.js +85 -0
  66. package/dist/DisposableEmailDomains.js.map +1 -0
  67. package/dist/DomainVerification.d.ts +0 -9
  68. package/dist/DomainVerification.d.ts.map +1 -1
  69. package/dist/DomainVerification.js +36 -22
  70. package/dist/DomainVerification.js.map +1 -1
  71. package/dist/DrizzleBunSqliteStorage.d.ts +18 -0
  72. package/dist/DrizzleBunSqliteStorage.d.ts.map +1 -0
  73. package/dist/DrizzleBunSqliteStorage.js +11 -0
  74. package/dist/DrizzleBunSqliteStorage.js.map +1 -0
  75. package/dist/DrizzleD1SqliteStorage.d.ts +4 -4
  76. package/dist/DrizzleD1SqliteStorage.d.ts.map +1 -1
  77. package/dist/DrizzleD1SqliteStorage.js +5 -5
  78. package/dist/DrizzleD1SqliteStorage.js.map +1 -1
  79. package/dist/DrizzleEffectSqliteStorage.d.ts +13 -4
  80. package/dist/DrizzleEffectSqliteStorage.d.ts.map +1 -1
  81. package/dist/DrizzleEffectSqliteStorage.js +71 -4
  82. package/dist/DrizzleEffectSqliteStorage.js.map +1 -1
  83. package/dist/DrizzleNodeSqliteStorage.d.ts +18 -0
  84. package/dist/DrizzleNodeSqliteStorage.d.ts.map +1 -0
  85. package/dist/DrizzleNodeSqliteStorage.js +11 -0
  86. package/dist/DrizzleNodeSqliteStorage.js.map +1 -0
  87. package/dist/DrizzlePostgresStorage.d.ts +26 -0
  88. package/dist/DrizzlePostgresStorage.d.ts.map +1 -0
  89. package/dist/DrizzlePostgresStorage.js +14 -0
  90. package/dist/DrizzlePostgresStorage.js.map +1 -0
  91. package/dist/EffectQbPostgresDelegatedAccessStorage.d.ts +34 -0
  92. package/dist/EffectQbPostgresDelegatedAccessStorage.d.ts.map +1 -0
  93. package/dist/EffectQbPostgresDelegatedAccessStorage.js +499 -0
  94. package/dist/EffectQbPostgresDelegatedAccessStorage.js.map +1 -0
  95. package/dist/EffectQbPostgresStorage.d.ts +178 -0
  96. package/dist/EffectQbPostgresStorage.d.ts.map +1 -0
  97. package/dist/EffectQbPostgresStorage.js +4637 -0
  98. package/dist/EffectQbPostgresStorage.js.map +1 -0
  99. package/dist/EffectQbSqliteDelegatedAccessStorage.d.ts +112 -0
  100. package/dist/EffectQbSqliteDelegatedAccessStorage.d.ts.map +1 -0
  101. package/dist/EffectQbSqliteDelegatedAccessStorage.js +602 -0
  102. package/dist/EffectQbSqliteDelegatedAccessStorage.js.map +1 -0
  103. package/dist/EffectQbSqliteStorage.d.ts +221 -23
  104. package/dist/EffectQbSqliteStorage.d.ts.map +1 -1
  105. package/dist/EffectQbSqliteStorage.js +2064 -135
  106. package/dist/EffectQbSqliteStorage.js.map +1 -1
  107. package/dist/EmailAuth.d.ts +65 -0
  108. package/dist/EmailAuth.d.ts.map +1 -0
  109. package/dist/EmailAuth.js +171 -0
  110. package/dist/EmailAuth.js.map +1 -0
  111. package/dist/EmailIdentityAuth.d.ts +30 -0
  112. package/dist/EmailIdentityAuth.d.ts.map +1 -0
  113. package/dist/EmailIdentityAuth.js +142 -0
  114. package/dist/EmailIdentityAuth.js.map +1 -0
  115. package/dist/EmailOtp.d.ts +10 -11
  116. package/dist/EmailOtp.d.ts.map +1 -1
  117. package/dist/EmailOtp.js +44 -81
  118. package/dist/EmailOtp.js.map +1 -1
  119. package/dist/EmailRisk.d.ts +48 -0
  120. package/dist/EmailRisk.d.ts.map +1 -0
  121. package/dist/EmailRisk.js +33 -0
  122. package/dist/EmailRisk.js.map +1 -0
  123. package/dist/EmailVerification.d.ts +10 -16
  124. package/dist/EmailVerification.d.ts.map +1 -1
  125. package/dist/EmailVerification.js +85 -42
  126. package/dist/EmailVerification.js.map +1 -1
  127. package/dist/Guard.d.ts +11 -0
  128. package/dist/Guard.d.ts.map +1 -0
  129. package/dist/Guard.js +11 -0
  130. package/dist/Guard.js.map +1 -0
  131. package/dist/HibpPwnedPasswords.d.ts +56 -0
  132. package/dist/HibpPwnedPasswords.d.ts.map +1 -0
  133. package/dist/HibpPwnedPasswords.js +232 -0
  134. package/dist/HibpPwnedPasswords.js.map +1 -0
  135. package/dist/HttpApi/AdminPermissionDefinition.d.ts +4 -0
  136. package/dist/HttpApi/AdminPermissionDefinition.d.ts.map +1 -0
  137. package/dist/HttpApi/AdminPermissionDefinition.js +4 -0
  138. package/dist/HttpApi/AdminPermissionDefinition.js.map +1 -0
  139. package/dist/HttpApi/AdminSecurityTimeline.d.ts +4 -0
  140. package/dist/HttpApi/AdminSecurityTimeline.d.ts.map +1 -0
  141. package/dist/HttpApi/AdminSecurityTimeline.js +4 -0
  142. package/dist/HttpApi/AdminSecurityTimeline.js.map +1 -0
  143. package/dist/HttpApi/AdminSession.d.ts +4 -0
  144. package/dist/HttpApi/AdminSession.d.ts.map +1 -0
  145. package/dist/HttpApi/AdminSession.js +4 -0
  146. package/dist/HttpApi/AdminSession.js.map +1 -0
  147. package/dist/HttpApi/AdminTrustedDevice.d.ts +4 -0
  148. package/dist/HttpApi/AdminTrustedDevice.d.ts.map +1 -0
  149. package/dist/HttpApi/AdminTrustedDevice.js +4 -0
  150. package/dist/HttpApi/AdminTrustedDevice.js.map +1 -0
  151. package/dist/HttpApi/Api.d.ts +939 -884
  152. package/dist/HttpApi/Api.d.ts.map +1 -1
  153. package/dist/HttpApi/Api.js +2254 -940
  154. package/dist/HttpApi/Api.js.map +1 -1
  155. package/dist/HttpApi/ApiKey.d.ts +4 -0
  156. package/dist/HttpApi/ApiKey.d.ts.map +1 -0
  157. package/dist/HttpApi/ApiKey.js +4 -0
  158. package/dist/HttpApi/ApiKey.js.map +1 -0
  159. package/dist/HttpApi/Audit.d.ts +6 -0
  160. package/dist/HttpApi/Audit.d.ts.map +1 -0
  161. package/dist/HttpApi/Audit.js +10 -0
  162. package/dist/HttpApi/Audit.js.map +1 -0
  163. package/dist/HttpApi/ClientApi.d.ts +917 -0
  164. package/dist/HttpApi/ClientApi.d.ts.map +1 -0
  165. package/dist/HttpApi/ClientApi.js +101 -0
  166. package/dist/HttpApi/ClientApi.js.map +1 -0
  167. package/dist/HttpApi/EmailAuth.d.ts +6 -0
  168. package/dist/HttpApi/EmailAuth.d.ts.map +1 -0
  169. package/dist/HttpApi/EmailAuth.js +6 -0
  170. package/dist/HttpApi/EmailAuth.js.map +1 -0
  171. package/dist/HttpApi/EmailGuards.d.ts +115 -0
  172. package/dist/HttpApi/EmailGuards.d.ts.map +1 -0
  173. package/dist/HttpApi/EmailGuards.js +191 -0
  174. package/dist/HttpApi/EmailGuards.js.map +1 -0
  175. package/dist/HttpApi/EmailOtp.d.ts +6 -0
  176. package/dist/HttpApi/EmailOtp.d.ts.map +1 -0
  177. package/dist/HttpApi/EmailOtp.js +6 -0
  178. package/dist/HttpApi/EmailOtp.js.map +1 -0
  179. package/dist/HttpApi/EmailVerification.d.ts +6 -0
  180. package/dist/HttpApi/EmailVerification.d.ts.map +1 -0
  181. package/dist/HttpApi/EmailVerification.js +6 -0
  182. package/dist/HttpApi/EmailVerification.js.map +1 -0
  183. package/dist/HttpApi/Endpoints.d.ts +661 -301
  184. package/dist/HttpApi/Endpoints.d.ts.map +1 -1
  185. package/dist/HttpApi/Endpoints.js +207 -120
  186. package/dist/HttpApi/Endpoints.js.map +1 -1
  187. package/dist/HttpApi/Errors.d.ts +37 -10
  188. package/dist/HttpApi/Errors.d.ts.map +1 -1
  189. package/dist/HttpApi/Errors.js +42 -4
  190. package/dist/HttpApi/Errors.js.map +1 -1
  191. package/dist/HttpApi/Identity.d.ts +6 -0
  192. package/dist/HttpApi/Identity.d.ts.map +1 -0
  193. package/dist/HttpApi/Identity.js +6 -0
  194. package/dist/HttpApi/Identity.js.map +1 -0
  195. package/dist/HttpApi/IdentityGuards.d.ts +31 -0
  196. package/dist/HttpApi/IdentityGuards.d.ts.map +1 -0
  197. package/dist/HttpApi/IdentityGuards.js +33 -0
  198. package/dist/HttpApi/IdentityGuards.js.map +1 -0
  199. package/dist/HttpApi/Jwt.d.ts +4 -0
  200. package/dist/HttpApi/Jwt.d.ts.map +1 -0
  201. package/dist/HttpApi/Jwt.js +4 -0
  202. package/dist/HttpApi/Jwt.js.map +1 -0
  203. package/dist/HttpApi/JwtDiscovery.d.ts +4 -0
  204. package/dist/HttpApi/JwtDiscovery.d.ts.map +1 -0
  205. package/dist/HttpApi/JwtDiscovery.js +4 -0
  206. package/dist/HttpApi/JwtDiscovery.js.map +1 -0
  207. package/dist/HttpApi/LoginApproval.d.ts +5 -0
  208. package/dist/HttpApi/LoginApproval.d.ts.map +1 -0
  209. package/dist/HttpApi/LoginApproval.js +5 -0
  210. package/dist/HttpApi/LoginApproval.js.map +1 -0
  211. package/dist/HttpApi/LoginNotification.d.ts +5 -0
  212. package/dist/HttpApi/LoginNotification.d.ts.map +1 -0
  213. package/dist/HttpApi/LoginNotification.js +5 -0
  214. package/dist/HttpApi/LoginNotification.js.map +1 -0
  215. package/dist/HttpApi/MagicLink.d.ts +6 -0
  216. package/dist/HttpApi/MagicLink.d.ts.map +1 -0
  217. package/dist/HttpApi/MagicLink.js +6 -0
  218. package/dist/HttpApi/MagicLink.js.map +1 -0
  219. package/dist/HttpApi/Mfa.d.ts +5 -0
  220. package/dist/HttpApi/Mfa.d.ts.map +1 -0
  221. package/dist/HttpApi/Mfa.js +5 -0
  222. package/dist/HttpApi/Mfa.js.map +1 -0
  223. package/dist/HttpApi/Middleware.d.ts +26 -0
  224. package/dist/HttpApi/Middleware.d.ts.map +1 -0
  225. package/dist/HttpApi/Middleware.js +13 -0
  226. package/dist/HttpApi/Middleware.js.map +1 -0
  227. package/dist/HttpApi/OAuth.d.ts +4 -0
  228. package/dist/HttpApi/OAuth.d.ts.map +1 -0
  229. package/dist/HttpApi/OAuth.js +4 -0
  230. package/dist/HttpApi/OAuth.js.map +1 -0
  231. package/dist/HttpApi/OAuthDeviceAuthorization.d.ts +106 -0
  232. package/dist/HttpApi/OAuthDeviceAuthorization.d.ts.map +1 -0
  233. package/dist/HttpApi/OAuthDeviceAuthorization.js +415 -0
  234. package/dist/HttpApi/OAuthDeviceAuthorization.js.map +1 -0
  235. package/dist/HttpApi/OAuthProviderAuthorization.d.ts +4 -0
  236. package/dist/HttpApi/OAuthProviderAuthorization.d.ts.map +1 -0
  237. package/dist/HttpApi/OAuthProviderAuthorization.js +4 -0
  238. package/dist/HttpApi/OAuthProviderAuthorization.js.map +1 -0
  239. package/dist/HttpApi/OAuthToken.d.ts +4 -0
  240. package/dist/HttpApi/OAuthToken.d.ts.map +1 -0
  241. package/dist/HttpApi/OAuthToken.js +4 -0
  242. package/dist/HttpApi/OAuthToken.js.map +1 -0
  243. package/dist/HttpApi/OidcDiscovery.d.ts +4 -0
  244. package/dist/HttpApi/OidcDiscovery.d.ts.map +1 -0
  245. package/dist/HttpApi/OidcDiscovery.js +4 -0
  246. package/dist/HttpApi/OidcDiscovery.js.map +1 -0
  247. package/dist/HttpApi/Operations/AdminPermissionDefinition.d.ts +28 -0
  248. package/dist/HttpApi/Operations/AdminPermissionDefinition.d.ts.map +1 -0
  249. package/dist/HttpApi/Operations/AdminPermissionDefinition.js +5 -0
  250. package/dist/HttpApi/Operations/AdminPermissionDefinition.js.map +1 -0
  251. package/dist/HttpApi/Operations/AdminSession.d.ts +16 -0
  252. package/dist/HttpApi/Operations/AdminSession.d.ts.map +1 -0
  253. package/dist/HttpApi/Operations/AdminSession.js +5 -0
  254. package/dist/HttpApi/Operations/AdminSession.js.map +1 -0
  255. package/dist/HttpApi/Operations/ApiKey.d.ts +16 -0
  256. package/dist/HttpApi/Operations/ApiKey.d.ts.map +1 -0
  257. package/dist/HttpApi/Operations/ApiKey.js +5 -0
  258. package/dist/HttpApi/Operations/ApiKey.js.map +1 -0
  259. package/dist/HttpApi/Operations/Discovery.d.ts +19 -0
  260. package/dist/HttpApi/Operations/Discovery.d.ts.map +1 -0
  261. package/dist/HttpApi/Operations/Discovery.js +7 -0
  262. package/dist/HttpApi/Operations/Discovery.js.map +1 -0
  263. package/dist/HttpApi/Operations/EmailAuth.d.ts +12 -0
  264. package/dist/HttpApi/Operations/EmailAuth.d.ts.map +1 -0
  265. package/dist/HttpApi/Operations/EmailAuth.js +5 -0
  266. package/dist/HttpApi/Operations/EmailAuth.js.map +1 -0
  267. package/dist/HttpApi/Operations/EmailOtp.d.ts +14 -0
  268. package/dist/HttpApi/Operations/EmailOtp.d.ts.map +1 -0
  269. package/dist/HttpApi/Operations/EmailOtp.js +5 -0
  270. package/dist/HttpApi/Operations/EmailOtp.js.map +1 -0
  271. package/dist/HttpApi/Operations/EmailVerification.d.ts +14 -0
  272. package/dist/HttpApi/Operations/EmailVerification.d.ts.map +1 -0
  273. package/dist/HttpApi/Operations/EmailVerification.js +5 -0
  274. package/dist/HttpApi/Operations/EmailVerification.js.map +1 -0
  275. package/dist/HttpApi/Operations/HttpOperation.d.ts +4 -0
  276. package/dist/HttpApi/Operations/HttpOperation.d.ts.map +1 -0
  277. package/dist/HttpApi/Operations/HttpOperation.js +2 -0
  278. package/dist/HttpApi/Operations/HttpOperation.js.map +1 -0
  279. package/dist/HttpApi/Operations/Identity.d.ts +22 -0
  280. package/dist/HttpApi/Operations/Identity.d.ts.map +1 -0
  281. package/dist/HttpApi/Operations/Identity.js +5 -0
  282. package/dist/HttpApi/Operations/Identity.js.map +1 -0
  283. package/dist/HttpApi/Operations/Jwt.d.ts +14 -0
  284. package/dist/HttpApi/Operations/Jwt.d.ts.map +1 -0
  285. package/dist/HttpApi/Operations/Jwt.js +5 -0
  286. package/dist/HttpApi/Operations/Jwt.js.map +1 -0
  287. package/dist/HttpApi/Operations/LoginApproval.d.ts +16 -0
  288. package/dist/HttpApi/Operations/LoginApproval.d.ts.map +1 -0
  289. package/dist/HttpApi/Operations/LoginApproval.js +5 -0
  290. package/dist/HttpApi/Operations/LoginApproval.js.map +1 -0
  291. package/dist/HttpApi/Operations/MagicLink.d.ts +14 -0
  292. package/dist/HttpApi/Operations/MagicLink.d.ts.map +1 -0
  293. package/dist/HttpApi/Operations/MagicLink.js +5 -0
  294. package/dist/HttpApi/Operations/MagicLink.js.map +1 -0
  295. package/dist/HttpApi/Operations/Mfa.d.ts +24 -0
  296. package/dist/HttpApi/Operations/Mfa.d.ts.map +1 -0
  297. package/dist/HttpApi/Operations/Mfa.js +5 -0
  298. package/dist/HttpApi/Operations/Mfa.js.map +1 -0
  299. package/dist/HttpApi/Operations/OAuth.d.ts +20 -0
  300. package/dist/HttpApi/Operations/OAuth.d.ts.map +1 -0
  301. package/dist/HttpApi/Operations/OAuth.js +5 -0
  302. package/dist/HttpApi/Operations/OAuth.js.map +1 -0
  303. package/dist/HttpApi/Operations/OAuthDeviceAuthorization.d.ts +23 -0
  304. package/dist/HttpApi/Operations/OAuthDeviceAuthorization.d.ts.map +1 -0
  305. package/dist/HttpApi/Operations/OAuthDeviceAuthorization.js +7 -0
  306. package/dist/HttpApi/Operations/OAuthDeviceAuthorization.js.map +1 -0
  307. package/dist/HttpApi/Operations/OAuthProviderAuthorization.d.ts +12 -0
  308. package/dist/HttpApi/Operations/OAuthProviderAuthorization.d.ts.map +1 -0
  309. package/dist/HttpApi/Operations/OAuthProviderAuthorization.js +5 -0
  310. package/dist/HttpApi/Operations/OAuthProviderAuthorization.js.map +1 -0
  311. package/dist/HttpApi/Operations/OAuthToken.d.ts +26 -0
  312. package/dist/HttpApi/Operations/OAuthToken.d.ts.map +1 -0
  313. package/dist/HttpApi/Operations/OAuthToken.js +9 -0
  314. package/dist/HttpApi/Operations/OAuthToken.js.map +1 -0
  315. package/dist/HttpApi/Operations/Passkey.d.ts +22 -0
  316. package/dist/HttpApi/Operations/Passkey.d.ts.map +1 -0
  317. package/dist/HttpApi/Operations/Passkey.js +5 -0
  318. package/dist/HttpApi/Operations/Passkey.js.map +1 -0
  319. package/dist/HttpApi/Operations/Password.d.ts +22 -0
  320. package/dist/HttpApi/Operations/Password.d.ts.map +1 -0
  321. package/dist/HttpApi/Operations/Password.js +5 -0
  322. package/dist/HttpApi/Operations/Password.js.map +1 -0
  323. package/dist/HttpApi/Operations/RecoveryCodes.d.ts +20 -0
  324. package/dist/HttpApi/Operations/RecoveryCodes.d.ts.map +1 -0
  325. package/dist/HttpApi/Operations/RecoveryCodes.js +5 -0
  326. package/dist/HttpApi/Operations/RecoveryCodes.js.map +1 -0
  327. package/dist/HttpApi/Operations/RefreshToken.d.ts +12 -0
  328. package/dist/HttpApi/Operations/RefreshToken.d.ts.map +1 -0
  329. package/dist/HttpApi/Operations/RefreshToken.js +5 -0
  330. package/dist/HttpApi/Operations/RefreshToken.js.map +1 -0
  331. package/dist/HttpApi/Operations/Security.d.ts +12 -0
  332. package/dist/HttpApi/Operations/Security.d.ts.map +1 -0
  333. package/dist/HttpApi/Operations/Security.js +5 -0
  334. package/dist/HttpApi/Operations/Security.js.map +1 -0
  335. package/dist/HttpApi/Operations/SecurityTimeline.d.ts +19 -0
  336. package/dist/HttpApi/Operations/SecurityTimeline.d.ts.map +1 -0
  337. package/dist/HttpApi/Operations/SecurityTimeline.js +7 -0
  338. package/dist/HttpApi/Operations/SecurityTimeline.js.map +1 -0
  339. package/dist/HttpApi/Operations/Session.d.ts +22 -0
  340. package/dist/HttpApi/Operations/Session.d.ts.map +1 -0
  341. package/dist/HttpApi/Operations/Session.js +5 -0
  342. package/dist/HttpApi/Operations/Session.js.map +1 -0
  343. package/dist/HttpApi/Operations/StepUp.d.ts +22 -0
  344. package/dist/HttpApi/Operations/StepUp.d.ts.map +1 -0
  345. package/dist/HttpApi/Operations/StepUp.js +5 -0
  346. package/dist/HttpApi/Operations/StepUp.js.map +1 -0
  347. package/dist/HttpApi/Operations/Totp.d.ts +20 -0
  348. package/dist/HttpApi/Operations/Totp.d.ts.map +1 -0
  349. package/dist/HttpApi/Operations/Totp.js +5 -0
  350. package/dist/HttpApi/Operations/Totp.js.map +1 -0
  351. package/dist/HttpApi/Operations/TrustedDevice.d.ts +23 -0
  352. package/dist/HttpApi/Operations/TrustedDevice.d.ts.map +1 -0
  353. package/dist/HttpApi/Operations/TrustedDevice.js +7 -0
  354. package/dist/HttpApi/Operations/TrustedDevice.js.map +1 -0
  355. package/dist/HttpApi/Operations/index.d.ts +28 -0
  356. package/dist/HttpApi/Operations/index.d.ts.map +1 -0
  357. package/dist/HttpApi/Operations/index.js +28 -0
  358. package/dist/HttpApi/Operations/index.js.map +1 -0
  359. package/dist/HttpApi/Passkey.d.ts +5 -0
  360. package/dist/HttpApi/Passkey.d.ts.map +1 -0
  361. package/dist/HttpApi/Passkey.js +5 -0
  362. package/dist/HttpApi/Passkey.js.map +1 -0
  363. package/dist/HttpApi/Password.d.ts +220 -0
  364. package/dist/HttpApi/Password.d.ts.map +1 -0
  365. package/dist/HttpApi/Password.js +237 -0
  366. package/dist/HttpApi/Password.js.map +1 -0
  367. package/dist/HttpApi/PasswordContract.d.ts +307 -0
  368. package/dist/HttpApi/PasswordContract.d.ts.map +1 -0
  369. package/dist/HttpApi/PasswordContract.js +63 -0
  370. package/dist/HttpApi/PasswordContract.js.map +1 -0
  371. package/dist/HttpApi/PasswordGuards.d.ts +82 -0
  372. package/dist/HttpApi/PasswordGuards.d.ts.map +1 -0
  373. package/dist/HttpApi/PasswordGuards.js +179 -0
  374. package/dist/HttpApi/PasswordGuards.js.map +1 -0
  375. package/dist/HttpApi/RecoveryCodes.d.ts +5 -0
  376. package/dist/HttpApi/RecoveryCodes.d.ts.map +1 -0
  377. package/dist/HttpApi/RecoveryCodes.js +5 -0
  378. package/dist/HttpApi/RecoveryCodes.js.map +1 -0
  379. package/dist/HttpApi/RefreshToken.d.ts +4 -0
  380. package/dist/HttpApi/RefreshToken.d.ts.map +1 -0
  381. package/dist/HttpApi/RefreshToken.js +4 -0
  382. package/dist/HttpApi/RefreshToken.js.map +1 -0
  383. package/dist/HttpApi/RequestGuards.d.ts +42 -0
  384. package/dist/HttpApi/RequestGuards.d.ts.map +1 -0
  385. package/dist/HttpApi/RequestGuards.js +194 -0
  386. package/dist/HttpApi/RequestGuards.js.map +1 -0
  387. package/dist/HttpApi/Schemas.d.ts +399 -84
  388. package/dist/HttpApi/Schemas.d.ts.map +1 -1
  389. package/dist/HttpApi/Schemas.js +225 -27
  390. package/dist/HttpApi/Schemas.js.map +1 -1
  391. package/dist/HttpApi/Security.d.ts +12 -93
  392. package/dist/HttpApi/Security.d.ts.map +1 -1
  393. package/dist/HttpApi/Security.js +65 -356
  394. package/dist/HttpApi/Security.js.map +1 -1
  395. package/dist/HttpApi/SecurityTimeline.d.ts +4 -0
  396. package/dist/HttpApi/SecurityTimeline.d.ts.map +1 -0
  397. package/dist/HttpApi/SecurityTimeline.js +4 -0
  398. package/dist/HttpApi/SecurityTimeline.js.map +1 -0
  399. package/dist/HttpApi/Session.d.ts +5 -0
  400. package/dist/HttpApi/Session.d.ts.map +1 -0
  401. package/dist/HttpApi/Session.js +5 -0
  402. package/dist/HttpApi/Session.js.map +1 -0
  403. package/dist/HttpApi/SessionGuards.d.ts +15 -0
  404. package/dist/HttpApi/SessionGuards.d.ts.map +1 -0
  405. package/dist/HttpApi/SessionGuards.js +37 -0
  406. package/dist/HttpApi/SessionGuards.js.map +1 -0
  407. package/dist/HttpApi/StepUp.d.ts +5 -0
  408. package/dist/HttpApi/StepUp.d.ts.map +1 -0
  409. package/dist/HttpApi/StepUp.js +5 -0
  410. package/dist/HttpApi/StepUp.js.map +1 -0
  411. package/dist/HttpApi/Totp.d.ts +5 -0
  412. package/dist/HttpApi/Totp.d.ts.map +1 -0
  413. package/dist/HttpApi/Totp.js +5 -0
  414. package/dist/HttpApi/Totp.js.map +1 -0
  415. package/dist/HttpApi/Transport.d.ts +4 -6
  416. package/dist/HttpApi/Transport.d.ts.map +1 -1
  417. package/dist/HttpApi/Transport.js +62 -36
  418. package/dist/HttpApi/Transport.js.map +1 -1
  419. package/dist/HttpApi/TrustedDevice.d.ts +4 -0
  420. package/dist/HttpApi/TrustedDevice.d.ts.map +1 -0
  421. package/dist/HttpApi/TrustedDevice.js +4 -0
  422. package/dist/HttpApi/TrustedDevice.js.map +1 -0
  423. package/dist/HttpApi/index.d.ts +11 -3
  424. package/dist/HttpApi/index.d.ts.map +1 -1
  425. package/dist/HttpApi/index.js +10 -2
  426. package/dist/HttpApi/index.js.map +1 -1
  427. package/dist/Identity.d.ts +138 -0
  428. package/dist/Identity.d.ts.map +1 -0
  429. package/dist/Identity.js +105 -0
  430. package/dist/Identity.js.map +1 -0
  431. package/dist/IdentityManagement.d.ts +189 -0
  432. package/dist/IdentityManagement.d.ts.map +1 -0
  433. package/dist/IdentityManagement.js +317 -0
  434. package/dist/IdentityManagement.js.map +1 -0
  435. package/dist/IncidentAction.d.ts +1 -4
  436. package/dist/IncidentAction.d.ts.map +1 -1
  437. package/dist/IncidentAction.js +15 -9
  438. package/dist/IncidentAction.js.map +1 -1
  439. package/dist/Internal.d.ts +2 -0
  440. package/dist/Internal.d.ts.map +1 -1
  441. package/dist/Internal.js +30 -0
  442. package/dist/Internal.js.map +1 -1
  443. package/dist/Invitation.d.ts +362 -0
  444. package/dist/Invitation.d.ts.map +1 -0
  445. package/dist/Invitation.js +633 -0
  446. package/dist/Invitation.js.map +1 -0
  447. package/dist/IpQualityScore.d.ts +38 -0
  448. package/dist/IpQualityScore.d.ts.map +1 -0
  449. package/dist/IpQualityScore.js +215 -0
  450. package/dist/IpQualityScore.js.map +1 -0
  451. package/dist/Jwt.d.ts +8 -29
  452. package/dist/Jwt.d.ts.map +1 -1
  453. package/dist/Jwt.js +67 -56
  454. package/dist/Jwt.js.map +1 -1
  455. package/dist/LoginApproval.d.ts +15 -30
  456. package/dist/LoginApproval.d.ts.map +1 -1
  457. package/dist/LoginApproval.js +47 -41
  458. package/dist/LoginApproval.js.map +1 -1
  459. package/dist/LoginNotification.d.ts +7 -11
  460. package/dist/LoginNotification.d.ts.map +1 -1
  461. package/dist/LoginNotification.js +30 -17
  462. package/dist/LoginNotification.js.map +1 -1
  463. package/dist/LoginRisk.d.ts +11 -13
  464. package/dist/LoginRisk.d.ts.map +1 -1
  465. package/dist/LoginRisk.js +66 -26
  466. package/dist/LoginRisk.js.map +1 -1
  467. package/dist/LoginRiskEnrichment.d.ts +145 -0
  468. package/dist/LoginRiskEnrichment.d.ts.map +1 -0
  469. package/dist/LoginRiskEnrichment.js +220 -0
  470. package/dist/LoginRiskEnrichment.js.map +1 -0
  471. package/dist/MagicLink.d.ts +9 -8
  472. package/dist/MagicLink.d.ts.map +1 -1
  473. package/dist/MagicLink.js +40 -73
  474. package/dist/MagicLink.js.map +1 -1
  475. package/dist/Mailer.d.ts +19 -12
  476. package/dist/Mailer.d.ts.map +1 -1
  477. package/dist/Mailer.js +10 -12
  478. package/dist/Mailer.js.map +1 -1
  479. package/dist/OAuth.d.ts +138 -96
  480. package/dist/OAuth.d.ts.map +1 -1
  481. package/dist/OAuth.js +522 -221
  482. package/dist/OAuth.js.map +1 -1
  483. package/dist/OAuthDeviceAuthorization.d.ts +378 -0
  484. package/dist/OAuthDeviceAuthorization.d.ts.map +1 -0
  485. package/dist/OAuthDeviceAuthorization.js +860 -0
  486. package/dist/OAuthDeviceAuthorization.js.map +1 -0
  487. package/dist/OAuthDeviceClient.d.ts +76 -0
  488. package/dist/OAuthDeviceClient.d.ts.map +1 -0
  489. package/dist/OAuthDeviceClient.js +362 -0
  490. package/dist/OAuthDeviceClient.js.map +1 -0
  491. package/dist/Passkey.d.ts +15 -17
  492. package/dist/Passkey.d.ts.map +1 -1
  493. package/dist/Passkey.js +86 -39
  494. package/dist/Passkey.js.map +1 -1
  495. package/dist/PasskeyBrowser.d.ts +39 -0
  496. package/dist/PasskeyBrowser.d.ts.map +1 -0
  497. package/dist/PasskeyBrowser.js +206 -0
  498. package/dist/PasskeyBrowser.js.map +1 -0
  499. package/dist/PasskeySimpleWebAuthn.d.ts.map +1 -1
  500. package/dist/PasskeySimpleWebAuthn.js +19 -7
  501. package/dist/PasskeySimpleWebAuthn.js.map +1 -1
  502. package/dist/Password.d.ts +71 -37
  503. package/dist/Password.d.ts.map +1 -1
  504. package/dist/Password.js +295 -81
  505. package/dist/Password.js.map +1 -1
  506. package/dist/PasswordRisk.d.ts +63 -0
  507. package/dist/PasswordRisk.d.ts.map +1 -0
  508. package/dist/PasswordRisk.js +37 -0
  509. package/dist/PasswordRisk.js.map +1 -0
  510. package/dist/Permission.d.ts +308 -0
  511. package/dist/Permission.d.ts.map +1 -0
  512. package/dist/Permission.js +827 -0
  513. package/dist/Permission.js.map +1 -0
  514. package/dist/Policy.d.ts +31 -18
  515. package/dist/Policy.d.ts.map +1 -1
  516. package/dist/Policy.js +58 -14
  517. package/dist/Policy.js.map +1 -1
  518. package/dist/PostgresDelegatedAccessStorageMigrations.d.ts +7 -0
  519. package/dist/PostgresDelegatedAccessStorageMigrations.d.ts.map +1 -0
  520. package/dist/PostgresDelegatedAccessStorageMigrations.js +119 -0
  521. package/dist/PostgresDelegatedAccessStorageMigrations.js.map +1 -0
  522. package/dist/PostgresStorageMigrations.d.ts +16 -0
  523. package/dist/PostgresStorageMigrations.d.ts.map +1 -0
  524. package/dist/PostgresStorageMigrations.js +674 -0
  525. package/dist/PostgresStorageMigrations.js.map +1 -0
  526. package/dist/Privacy.d.ts +0 -3
  527. package/dist/Privacy.d.ts.map +1 -1
  528. package/dist/Privacy.js +2 -5
  529. package/dist/Privacy.js.map +1 -1
  530. package/dist/RateLimiter.d.ts +0 -3
  531. package/dist/RateLimiter.d.ts.map +1 -1
  532. package/dist/RateLimiter.js +1 -4
  533. package/dist/RateLimiter.js.map +1 -1
  534. package/dist/RecoveryCode.d.ts +83 -11
  535. package/dist/RecoveryCode.d.ts.map +1 -1
  536. package/dist/RecoveryCode.js +273 -75
  537. package/dist/RecoveryCode.js.map +1 -1
  538. package/dist/RecoveryPolicy.d.ts +81 -0
  539. package/dist/RecoveryPolicy.d.ts.map +1 -0
  540. package/dist/RecoveryPolicy.js +119 -0
  541. package/dist/RecoveryPolicy.js.map +1 -0
  542. package/dist/RefreshToken.d.ts +0 -9
  543. package/dist/RefreshToken.d.ts.map +1 -1
  544. package/dist/RefreshToken.js +31 -22
  545. package/dist/RefreshToken.js.map +1 -1
  546. package/dist/Retention.d.ts +6 -1
  547. package/dist/Retention.d.ts.map +1 -1
  548. package/dist/Retention.js +49 -12
  549. package/dist/Retention.js.map +1 -1
  550. package/dist/SecurityTimeline.d.ts +1 -4
  551. package/dist/SecurityTimeline.d.ts.map +1 -1
  552. package/dist/SecurityTimeline.js +110 -17
  553. package/dist/SecurityTimeline.js.map +1 -1
  554. package/dist/Sessions.d.ts +124 -29
  555. package/dist/Sessions.d.ts.map +1 -1
  556. package/dist/Sessions.js +626 -94
  557. package/dist/Sessions.js.map +1 -1
  558. package/dist/SqliteStorageSchemaData.d.ts +2 -0
  559. package/dist/SqliteStorageSchemaData.d.ts.map +1 -0
  560. package/dist/SqliteStorageSchemaData.js +508 -0
  561. package/dist/SqliteStorageSchemaData.js.map +1 -0
  562. package/dist/StepUp.d.ts +132 -11
  563. package/dist/StepUp.d.ts.map +1 -1
  564. package/dist/StepUp.js +387 -19
  565. package/dist/StepUp.js.map +1 -1
  566. package/dist/Storage.d.ts +89 -23
  567. package/dist/Storage.d.ts.map +1 -1
  568. package/dist/Storage.js +10 -12
  569. package/dist/Storage.js.map +1 -1
  570. package/dist/StorageMigrations.d.ts +7 -1
  571. package/dist/StorageMigrations.d.ts.map +1 -1
  572. package/dist/StorageMigrations.js +256 -0
  573. package/dist/StorageMigrations.js.map +1 -1
  574. package/dist/StorageSchemaGenerator.d.ts +544 -0
  575. package/dist/StorageSchemaGenerator.d.ts.map +1 -0
  576. package/dist/StorageSchemaGenerator.js +1418 -0
  577. package/dist/StorageSchemaGenerator.js.map +1 -0
  578. package/dist/StrongFactor.d.ts +64 -0
  579. package/dist/StrongFactor.d.ts.map +1 -0
  580. package/dist/StrongFactor.js +100 -0
  581. package/dist/StrongFactor.js.map +1 -0
  582. package/dist/Testing.js +2 -2
  583. package/dist/Testing.js.map +1 -1
  584. package/dist/Totp.d.ts +88 -13
  585. package/dist/Totp.d.ts.map +1 -1
  586. package/dist/Totp.js +192 -34
  587. package/dist/Totp.js.map +1 -1
  588. package/dist/TrustedDevice.d.ts +0 -9
  589. package/dist/TrustedDevice.d.ts.map +1 -1
  590. package/dist/TrustedDevice.js +15 -17
  591. package/dist/TrustedDevice.js.map +1 -1
  592. package/dist/WaitUntil.d.ts +0 -3
  593. package/dist/WaitUntil.d.ts.map +1 -1
  594. package/dist/WaitUntil.js +1 -4
  595. package/dist/WaitUntil.js.map +1 -1
  596. package/dist/Webhook.d.ts +42 -12
  597. package/dist/Webhook.d.ts.map +1 -1
  598. package/dist/Webhook.js +165 -26
  599. package/dist/Webhook.js.map +1 -1
  600. package/dist/alchemy/cloudflare/Email.d.ts.map +1 -1
  601. package/dist/alchemy/cloudflare/Email.js +9 -4
  602. package/dist/alchemy/cloudflare/Email.js.map +1 -1
  603. package/dist/cloudflare/Email.js +1 -1
  604. package/dist/cloudflare/Email.js.map +1 -1
  605. package/dist/cloudflare/RequestMetadata.d.ts +49 -0
  606. package/dist/cloudflare/RequestMetadata.d.ts.map +1 -0
  607. package/dist/cloudflare/RequestMetadata.js +71 -0
  608. package/dist/cloudflare/RequestMetadata.js.map +1 -0
  609. package/dist/index.d.ts +0 -35
  610. package/dist/index.d.ts.map +1 -1
  611. package/dist/index.js +0 -35
  612. package/dist/index.js.map +1 -1
  613. package/dist/internal/AuthFlowFinalizer.d.ts +31 -0
  614. package/dist/internal/AuthFlowFinalizer.d.ts.map +1 -0
  615. package/dist/internal/AuthFlowFinalizer.js +182 -0
  616. package/dist/internal/AuthFlowFinalizer.js.map +1 -0
  617. package/migrations/0001_auth_storage.sql +1 -0
  618. package/migrations/0006_auth_totp_factor.sql +1 -0
  619. package/migrations/0024_auth_permission.sql +39 -0
  620. package/migrations/0025_auth_permission_definition.sql +19 -0
  621. package/migrations/0026_auth_user_identity.sql +59 -0
  622. package/migrations/0027_auth_audit_log_storage_order.sql +46 -0
  623. package/migrations/0028_auth_oauth_client_secret_key.sql +39 -0
  624. package/migrations/0029_auth_oauth_device_authorization.sql +28 -0
  625. package/migrations/delegated-access/0001_auth_delegated_access.sql +152 -0
  626. package/migrations/postgres/0001_auth_core.sql +77 -0
  627. package/migrations/postgres/0002_auth_security_oauth.sql +65 -0
  628. package/migrations/postgres/0003_auth_credentials_tokens.sql +43 -0
  629. package/migrations/postgres/0004_auth_security_history.sql +103 -0
  630. package/migrations/postgres/0005_auth_webhooks.sql +29 -0
  631. package/migrations/postgres/0006_auth_domain_timeline.sql +50 -0
  632. package/migrations/postgres/0007_auth_oauth_clients.sql +85 -0
  633. package/migrations/postgres/0008_auth_oauth_tokens.sql +63 -0
  634. package/migrations/postgres/0009_auth_permissions.sql +66 -0
  635. package/migrations/postgres/0010_auth_oauth_device_authorization.sql +50 -0
  636. package/migrations/postgres/delegated-access/0001_auth_delegated_access.sql +112 -0
  637. package/package.json +309 -2
package/dist/Password.js CHANGED
@@ -1,19 +1,28 @@
1
1
  import { Context, Data, Duration, Effect, Encoding, Layer, Option, Redacted, Result, } from "effect";
2
+ import { passwordEvidence } from "./Assurance.js";
2
3
  import { AuthFlow, AuthResult } from "./AuthFlow.js";
3
4
  import { Challenge } from "./Challenge.js";
4
5
  import { Crypto } from "./Crypto.js";
5
- import { CredentialId, Email, UserId } from "./Identifiers.js";
6
+ import { EmailAcceptancePolicy, EmailAcceptancePolicyNoopLive, EmailNotAcceptedError, } from "./EmailRisk.js";
7
+ import { CredentialId, Email, IdentityId, UserId } from "./Identifiers.js";
8
+ import { IdentityKindRegistry } from "./Identity.js";
6
9
  import { addMillis, currentUnixMillis, timingSafeEqualString, } from "./Internal.js";
7
10
  import { AuthMailer } from "./Mailer.js";
8
- import { CredentialStore, SessionStore, UserStore } from "./Storage.js";
11
+ import { enforcePasswordRisk, PasswordRiskPolicy, PasswordRiskPolicyNoopLive, } from "./PasswordRisk.js";
12
+ import { CredentialStore, IdentityStore, RegistrationStore, SessionStore, UserStore, } from "./Storage.js";
9
13
  export class PasswordHashError extends Data.TaggedError("PasswordHashError") {
10
14
  }
11
15
  export class PasswordHasher extends Context.Service()("auth/PasswordHasher") {
12
16
  }
13
- (function (PasswordHasher) {
14
- PasswordHasher.make = (service) => PasswordHasher.of(service);
15
- })(PasswordHasher || (PasswordHasher = {}));
16
17
  const textEncoder = new TextEncoder();
18
+ export const defaultPasswordMaxBytes = 1024;
19
+ export class PasswordTooLongError extends Data.TaggedError("PasswordTooLongError") {
20
+ }
21
+ const validatePasswordSize = (password, maximum = defaultPasswordMaxBytes) => textEncoder.encode(Redacted.value(password)).byteLength <= maximum
22
+ ? Effect.void
23
+ : Effect.fail(new PasswordTooLongError({
24
+ message: "Password does not meet policy requirements",
25
+ }));
17
26
  const passwordHashPrefix = "pbkdf2-sha256";
18
27
  const getWebCrypto = (options, operation) => Effect.gen(function* () {
19
28
  const crypto = options.webCrypto ?? globalThis.crypto;
@@ -72,7 +81,7 @@ export const makePbkdf2PasswordHasher = (dependencies) => {
72
81
  const iterations = dependencies.iterations ?? 210_000;
73
82
  const saltBytes = dependencies.saltBytes ?? 16;
74
83
  const hashBytes = dependencies.hashBytes ?? 32;
75
- return PasswordHasher.make({
84
+ return PasswordHasher.of({
76
85
  hash: Effect.fn("auth.password_hash.pbkdf2.hash")(function* (input) {
77
86
  const webCrypto = yield* getWebCrypto(dependencies, "hash");
78
87
  const salt = yield* dependencies.crypto.randomBytes(saltBytes).pipe(Effect.mapError((cause) => new PasswordHashError({
@@ -130,15 +139,25 @@ export const Pbkdf2PasswordHasherLive = (options) => Layer.effect(PasswordHasher
130
139
  crypto,
131
140
  });
132
141
  }));
133
- export class PasswordLogin extends Context.Service()("auth/login/Password") {
142
+ export class PasswordPrimaryFactor extends Context.Service()("auth/primary-factor/Password") {
134
143
  }
135
- (function (PasswordLogin) {
136
- PasswordLogin.make = (service) => PasswordLogin.of(service);
137
- })(PasswordLogin || (PasswordLogin = {}));
138
- export const makePasswordLogin = (dependencies) => PasswordLogin.make({
139
- signIn: Effect.fn("auth.password.sign_in")(function* (input) {
144
+ export const makePasswordPrimaryFactor = (dependencies) => PasswordPrimaryFactor.of({
145
+ verify: Effect.fn("auth.password.primary_factor.verify")(function* (input) {
140
146
  yield* Effect.annotateCurrentSpan("auth.method", "password");
141
- const user = yield* dependencies.users.findByEmail(input.email);
147
+ const normalizedOption = yield* dependencies.identityKinds
148
+ .normalize(input.identity)
149
+ .pipe(Effect.option);
150
+ if (Option.isNone(normalizedOption)) {
151
+ yield* Effect.annotateCurrentSpan("auth.result", "InvalidCredentials");
152
+ return AuthResult.InvalidCredentials();
153
+ }
154
+ const normalized = normalizedOption.value;
155
+ const identity = yield* dependencies.identities.findByKindAndNormalizedValue(normalized);
156
+ if (Option.isNone(identity)) {
157
+ yield* Effect.annotateCurrentSpan("auth.result", "InvalidCredentials");
158
+ return AuthResult.InvalidCredentials();
159
+ }
160
+ const user = yield* dependencies.users.findById(identity.value.userId);
142
161
  if (Option.isNone(user)) {
143
162
  yield* Effect.annotateCurrentSpan("auth.result", "InvalidCredentials");
144
163
  return AuthResult.InvalidCredentials();
@@ -147,7 +166,7 @@ export const makePasswordLogin = (dependencies) => PasswordLogin.make({
147
166
  yield* Effect.annotateCurrentSpan("auth.result", "AccountDisabled");
148
167
  return AuthResult.AccountDisabled();
149
168
  }
150
- const credential = yield* dependencies.credentials.findPasswordByUserId(user.value.id);
169
+ const credential = yield* dependencies.credentials.findPasswordByUserId(identity.value.userId);
151
170
  if (Option.isNone(credential) ||
152
171
  credential.value.revokedAt !== undefined) {
153
172
  yield* Effect.annotateCurrentSpan("auth.result", "InvalidCredentials");
@@ -161,83 +180,180 @@ export const makePasswordLogin = (dependencies) => PasswordLogin.make({
161
180
  yield* Effect.annotateCurrentSpan("auth.result", "InvalidCredentials");
162
181
  return AuthResult.InvalidCredentials();
163
182
  }
164
- return yield* dependencies.authFlow.completePrimaryFactor({
183
+ yield* Effect.annotateCurrentSpan("auth.result", "Verified");
184
+ const verifiedAt = yield* currentUnixMillis;
185
+ return {
186
+ _tag: "Verified",
165
187
  userId: user.value.id,
166
- email: user.value.email,
188
+ identity: {
189
+ identityId: identity.value.id,
190
+ kind: identity.value.kind,
191
+ verified: identity.value.verifiedAt !== undefined,
192
+ },
193
+ ...(identity.value.kind === "email"
194
+ ? {
195
+ emailDestination: {
196
+ identityId: identity.value.id,
197
+ email: Email(identity.value.value),
198
+ },
199
+ }
200
+ : {}),
167
201
  intent: "sign-in",
168
202
  method: "password",
169
- amr: ["pwd"],
170
- aal: "aal1",
171
- claims: { emailVerified: user.value.emailVerified },
203
+ evidence: [
204
+ passwordEvidence({ credentialId: credential.value.id, verifiedAt }),
205
+ ],
206
+ claims: identity.value.verifiedAt === undefined
207
+ ? undefined
208
+ : { verifiedIdentityKinds: [identity.value.kind] },
172
209
  ...(input.trustedDeviceToken === undefined
173
210
  ? {}
174
211
  : { trustedDeviceToken: input.trustedDeviceToken }),
212
+ ...(input.deviceKey === undefined
213
+ ? {}
214
+ : { deviceKey: input.deviceKey }),
215
+ ...(input.locationKey === undefined
216
+ ? {}
217
+ : { locationKey: input.locationKey }),
175
218
  ...(input.request === undefined ? {} : { request: input.request }),
176
219
  ...(input.metadata === undefined ? {} : { metadata: input.metadata }),
177
- });
220
+ };
178
221
  }),
179
222
  });
223
+ export const PasswordPrimaryFactorLive = Layer.effect(PasswordPrimaryFactor)(Effect.gen(function* () {
224
+ const users = yield* UserStore;
225
+ const identities = yield* IdentityStore;
226
+ const identityKinds = yield* IdentityKindRegistry;
227
+ const credentials = yield* CredentialStore;
228
+ const hasher = yield* PasswordHasher;
229
+ return makePasswordPrimaryFactor({
230
+ users,
231
+ identities,
232
+ identityKinds,
233
+ credentials,
234
+ hasher,
235
+ });
236
+ }));
237
+ export class PasswordLogin extends Context.Service()("auth/login/Password") {
238
+ }
239
+ export const makePasswordLogin = (dependencies) => {
240
+ const primaryFactor = makePasswordPrimaryFactor(dependencies);
241
+ return PasswordLogin.of({
242
+ signIn: Effect.fn("auth.password.sign_in")(function* (input) {
243
+ const verified = yield* primaryFactor.verify(input);
244
+ return verified._tag === "Verified"
245
+ ? yield* dependencies.authFlow.completePrimaryFactor(verified)
246
+ : verified;
247
+ }),
248
+ });
249
+ };
180
250
  export const PasswordLoginLive = Layer.effect(PasswordLogin)(Effect.gen(function* () {
181
251
  const users = yield* UserStore;
252
+ const identities = yield* IdentityStore;
253
+ const identityKinds = yield* IdentityKindRegistry;
182
254
  const credentials = yield* CredentialStore;
183
255
  const hasher = yield* PasswordHasher;
184
256
  const authFlow = yield* AuthFlow;
185
257
  return makePasswordLogin({
186
258
  users,
259
+ identities,
260
+ identityKinds,
187
261
  credentials,
188
262
  hasher,
189
263
  authFlow,
190
264
  });
191
265
  }));
192
- export class EmailAlreadyRegisteredError extends Data.TaggedError("EmailAlreadyRegisteredError") {
266
+ export class IdentityAlreadyRegisteredError extends Data.TaggedError("IdentityAlreadyRegisteredError") {
193
267
  }
194
268
  export class PasswordRegistration extends Context.Service()("auth/registration/Password") {
195
269
  }
196
- (function (PasswordRegistration) {
197
- PasswordRegistration.make = (service) => PasswordRegistration.of(service);
198
- })(PasswordRegistration || (PasswordRegistration = {}));
199
270
  export const makePasswordRegistration = (dependencies) => {
200
271
  const userIdBytes = dependencies.userIdBytes ?? 16;
201
272
  const credentialIdBytes = dependencies.credentialIdBytes ?? 16;
202
- return PasswordRegistration.make({
273
+ const identityIdBytes = dependencies.identityIdBytes ?? 16;
274
+ return PasswordRegistration.of({
203
275
  signUp: Effect.fn("auth.password.sign_up")(function* (input) {
204
276
  yield* Effect.annotateCurrentSpan("auth.method", "password");
205
- const existing = yield* dependencies.users.findByEmail(input.email);
206
- if (Option.isSome(existing)) {
207
- yield* Effect.annotateCurrentSpan("auth.result", "EmailAlreadyRegistered");
208
- return yield* new EmailAlreadyRegisteredError({ email: input.email });
277
+ yield* validatePasswordSize(input.password, dependencies.passwordMaxBytes);
278
+ const normalized = yield* dependencies.identityKinds.normalize(input.identity);
279
+ if (normalized.kind === "email" && dependencies.emailAcceptancePolicy) {
280
+ const decision = yield* dependencies.emailAcceptancePolicy.decide({
281
+ email: Email(normalized.value),
282
+ operation: "password-sign-up",
283
+ metadata: input.metadata,
284
+ });
285
+ if (decision.type === "Deny") {
286
+ return yield* new EmailNotAcceptedError({
287
+ reason: "email-not-accepted",
288
+ });
289
+ }
209
290
  }
291
+ yield* enforcePasswordRisk(dependencies.passwordRiskPolicy, {
292
+ password: input.password,
293
+ operation: "sign-up",
294
+ });
210
295
  const now = yield* currentUnixMillis;
211
- const emailVerified = input.emailVerified ?? false;
212
296
  const userId = UserId(yield* dependencies.crypto.randomToken(userIdBytes));
297
+ const identityId = IdentityId(yield* dependencies.crypto.randomToken(identityIdBytes));
213
298
  const credentialId = CredentialId(yield* dependencies.crypto.randomToken(credentialIdBytes));
214
299
  const passwordHash = yield* dependencies.hasher.hash({
215
300
  password: input.password,
216
301
  });
217
- yield* dependencies.users.insert({
218
- id: userId,
219
- email: input.email,
220
- emailVerified,
221
- createdAt: now,
222
- updatedAt: now,
223
- metadata: input.metadata,
224
- });
225
- yield* dependencies.credentials.insertPassword({
226
- id: credentialId,
227
- userId,
228
- passwordHash,
229
- createdAt: now,
230
- updatedAt: now,
231
- });
302
+ const registered = yield* dependencies.registration
303
+ .create({
304
+ user: {
305
+ id: userId,
306
+ createdAt: now,
307
+ updatedAt: now,
308
+ metadata: input.metadata,
309
+ },
310
+ identity: {
311
+ id: identityId,
312
+ userId,
313
+ scope: normalized.scope,
314
+ kind: normalized.kind,
315
+ value: normalized.value,
316
+ normalizedValue: normalized.normalizedValue,
317
+ isPrimaryLogin: true,
318
+ createdAt: now,
319
+ },
320
+ passwordCredential: {
321
+ id: credentialId,
322
+ userId,
323
+ passwordHash,
324
+ createdAt: now,
325
+ updatedAt: now,
326
+ },
327
+ })
328
+ .pipe(Effect.mapError((error) => error._tag === "RegistrationConflictError" &&
329
+ error.reason === "identity-value"
330
+ ? new IdentityAlreadyRegisteredError({ identity: normalized })
331
+ : error));
232
332
  yield* Effect.annotateCurrentSpan("auth.result", "registered");
233
333
  return yield* dependencies.authFlow.completePrimaryFactor({
234
334
  userId,
235
- email: input.email,
335
+ identity: {
336
+ identityId: registered.identity.id,
337
+ kind: registered.identity.kind,
338
+ verified: false,
339
+ },
340
+ ...(registered.identity.kind === "email"
341
+ ? {
342
+ emailDestination: {
343
+ identityId: registered.identity.id,
344
+ email: Email(registered.identity.value),
345
+ },
346
+ }
347
+ : {}),
236
348
  intent: "sign-up",
237
349
  method: "password",
238
- amr: ["pwd"],
239
- aal: "aal1",
240
- claims: { emailVerified },
350
+ evidence: [passwordEvidence({ credentialId, verifiedAt: now })],
351
+ ...(input.deviceKey === undefined
352
+ ? {}
353
+ : { deviceKey: input.deviceKey }),
354
+ ...(input.locationKey === undefined
355
+ ? {}
356
+ : { locationKey: input.locationKey }),
241
357
  ...(input.request === undefined ? {} : { request: input.request }),
242
358
  ...(input.metadata === undefined ? {} : { metadata: input.metadata }),
243
359
  });
@@ -245,17 +361,21 @@ export const makePasswordRegistration = (dependencies) => {
245
361
  });
246
362
  };
247
363
  export const PasswordRegistrationLive = Layer.effect(PasswordRegistration)(Effect.gen(function* () {
248
- const users = yield* UserStore;
249
- const credentials = yield* CredentialStore;
364
+ const registration = yield* RegistrationStore;
365
+ const identityKinds = yield* IdentityKindRegistry;
250
366
  const hasher = yield* PasswordHasher;
251
367
  const authFlow = yield* AuthFlow;
252
368
  const crypto = yield* Crypto;
369
+ const passwordRiskPolicy = yield* PasswordRiskPolicy;
370
+ const emailAcceptancePolicy = yield* EmailAcceptancePolicy;
253
371
  return makePasswordRegistration({
254
- users,
255
- credentials,
372
+ registration,
373
+ identityKinds,
256
374
  hasher,
257
375
  authFlow,
258
376
  crypto,
377
+ passwordRiskPolicy,
378
+ emailAcceptancePolicy,
259
379
  });
260
380
  }));
261
381
  export class PasswordResetStartError extends Data.TaggedError("PasswordResetStartError") {
@@ -264,15 +384,23 @@ export class PasswordResetVerifyError extends Data.TaggedError("PasswordResetVer
264
384
  }
265
385
  export class PasswordReset extends Context.Service()("auth/password/Reset") {
266
386
  }
267
- (function (PasswordReset) {
268
- PasswordReset.make = (service) => PasswordReset.of(service);
269
- })(PasswordReset || (PasswordReset = {}));
270
387
  export const defaultPasswordResetTtl = Duration.minutes(15);
271
388
  export const defaultPasswordResetSecretBytes = 32;
272
- const passwordResetUserIdFromMetadata = (metadata) => {
389
+ const passwordResetBindingFromMetadata = (metadata) => {
273
390
  const userId = metadata?.userId;
274
- return typeof userId === "string" && userId.length > 0
275
- ? UserId(userId)
391
+ const identityId = metadata?.identityId;
392
+ const normalizedValue = metadata?.normalizedValue;
393
+ return typeof userId === "string" &&
394
+ userId.length > 0 &&
395
+ typeof identityId === "string" &&
396
+ identityId.length > 0 &&
397
+ typeof normalizedValue === "string" &&
398
+ normalizedValue.length > 0
399
+ ? {
400
+ userId: UserId(userId),
401
+ identityId: IdentityId(identityId),
402
+ normalizedValue,
403
+ }
276
404
  : undefined;
277
405
  };
278
406
  const passwordResetTtlMillis = (ttl) => {
@@ -307,22 +435,45 @@ export const makePasswordReset = (dependencies) => {
307
435
  const ttl = dependencies.ttl ?? defaultPasswordResetTtl;
308
436
  const secretBytes = dependencies.secretBytes ?? defaultPasswordResetSecretBytes;
309
437
  const credentialIdBytes = dependencies.credentialIdBytes ?? 16;
310
- return PasswordReset.make({
438
+ return PasswordReset.of({
311
439
  start: Effect.fn("auth.password_reset.start")(function* (input) {
312
440
  yield* Effect.annotateCurrentSpan("auth.method", "password-reset");
313
441
  const resolvedTtl = input.ttl ?? ttl;
314
442
  const expiresIn = yield* passwordResetTtlMillis(resolvedTtl);
315
443
  const now = yield* currentUnixMillis;
444
+ const normalized = yield* dependencies.identityKinds
445
+ .normalize(input.identity)
446
+ .pipe(Effect.mapError((cause) => new PasswordResetStartError({
447
+ message: "Invalid password reset identity",
448
+ cause,
449
+ })));
450
+ if (normalized.kind !== "email" || normalized.scope.type !== "global") {
451
+ return yield* new PasswordResetStartError({
452
+ message: "Password reset requires a global email identity",
453
+ });
454
+ }
316
455
  const genericStarted = {
317
- email: input.email,
456
+ email: Email(normalized.value),
318
457
  expiresAt: addMillis(now, expiresIn),
319
458
  };
320
- const userOption = yield* dependencies.users.findByEmail(input.email).pipe(Effect.mapError((cause) => new PasswordResetStartError({
459
+ const identityOption = yield* dependencies.identities
460
+ .findByKindAndNormalizedValue(normalized)
461
+ .pipe(Effect.mapError((cause) => new PasswordResetStartError({
462
+ message: "Failed to load identity for password reset",
463
+ cause,
464
+ })));
465
+ if (Option.isNone(identityOption)) {
466
+ yield* Effect.annotateCurrentSpan("auth.result", "PasswordResetIgnored");
467
+ return genericStarted;
468
+ }
469
+ const identity = identityOption.value;
470
+ const userOption = yield* dependencies.users
471
+ .findById(identity.userId)
472
+ .pipe(Effect.mapError((cause) => new PasswordResetStartError({
321
473
  message: "Failed to load user for password reset",
322
474
  cause,
323
475
  })));
324
476
  if (Option.isNone(userOption)) {
325
- yield* Effect.annotateCurrentSpan("auth.result", "PasswordResetIgnored");
326
477
  return genericStarted;
327
478
  }
328
479
  const user = userOption.value;
@@ -345,12 +496,14 @@ export const makePasswordReset = (dependencies) => {
345
496
  const issued = yield* dependencies.challenge
346
497
  .issue({
347
498
  type: "reset-password",
348
- subject: user.email,
499
+ subject: identity.value,
349
500
  ttl: resolvedTtl,
350
501
  secret,
351
502
  metadata: {
352
503
  ...input.metadata,
353
504
  userId: user.id,
505
+ identityId: identity.id,
506
+ normalizedValue: identity.normalizedValue,
354
507
  },
355
508
  })
356
509
  .pipe(Effect.mapError((cause) => new PasswordResetStartError({
@@ -358,7 +511,7 @@ export const makePasswordReset = (dependencies) => {
358
511
  cause,
359
512
  })));
360
513
  const started = {
361
- email: user.email,
514
+ email: Email(identity.value),
362
515
  expiresAt: issued.expiresAt,
363
516
  };
364
517
  const url = yield* makePasswordResetUrl(dependencies, {
@@ -374,7 +527,7 @@ export const makePasswordReset = (dependencies) => {
374
527
  yield* dependencies.authMailer
375
528
  .send({
376
529
  _tag: "PasswordReset",
377
- to: user.email,
530
+ to: Email(identity.value),
378
531
  challengeId: issued.id,
379
532
  url,
380
533
  expiresAt: issued.expiresAt,
@@ -393,6 +546,10 @@ export const makePasswordReset = (dependencies) => {
393
546
  }),
394
547
  verify: Effect.fn("auth.password_reset.verify")(function* (input) {
395
548
  yield* Effect.annotateCurrentSpan("auth.method", "password-reset");
549
+ yield* validatePasswordSize(input.password, dependencies.passwordMaxBytes).pipe(Effect.mapError((cause) => new PasswordResetVerifyError({
550
+ message: "Password does not meet policy requirements",
551
+ cause,
552
+ })));
396
553
  const verified = yield* dependencies.challenge
397
554
  .verify({
398
555
  challengeId: input.challengeId,
@@ -403,25 +560,39 @@ export const makePasswordReset = (dependencies) => {
403
560
  message: "Invalid password reset challenge",
404
561
  cause,
405
562
  })));
406
- const userId = passwordResetUserIdFromMetadata(verified.metadata);
407
- if (userId === undefined) {
563
+ const binding = passwordResetBindingFromMetadata(verified.metadata);
564
+ if (binding === undefined) {
408
565
  return yield* new PasswordResetVerifyError({
409
566
  message: "Password reset challenge is missing user metadata",
410
567
  });
411
568
  }
412
- const userOption = yield* dependencies.users.findById(userId).pipe(Effect.mapError((cause) => new PasswordResetVerifyError({
569
+ const identityOption = yield* dependencies.identities
570
+ .findById(binding.identityId)
571
+ .pipe(Effect.mapError((cause) => new PasswordResetVerifyError({
572
+ message: "Failed to load identity for password reset",
573
+ cause,
574
+ })));
575
+ const userOption = yield* dependencies.users
576
+ .findById(binding.userId)
577
+ .pipe(Effect.mapError((cause) => new PasswordResetVerifyError({
413
578
  message: "Failed to load user for password reset",
414
579
  cause,
415
580
  })));
416
- if (Option.isNone(userOption) ||
417
- userOption.value.disabledAt !== undefined ||
418
- userOption.value.email !== Email(verified.subject)) {
581
+ if (Option.isNone(identityOption) ||
582
+ identityOption.value.revokedAt !== undefined ||
583
+ identityOption.value.userId !== binding.userId ||
584
+ identityOption.value.kind !== "email" ||
585
+ identityOption.value.scope.type !== "global" ||
586
+ identityOption.value.normalizedValue !== binding.normalizedValue ||
587
+ identityOption.value.value !== verified.subject ||
588
+ Option.isNone(userOption) ||
589
+ userOption.value.disabledAt !== undefined) {
419
590
  return yield* new PasswordResetVerifyError({
420
591
  message: "Invalid password reset challenge",
421
592
  });
422
593
  }
423
594
  const credentialOption = yield* dependencies.credentials
424
- .findPasswordByUserId(userId)
595
+ .findPasswordByUserId(binding.userId)
425
596
  .pipe(Effect.mapError((cause) => new PasswordResetVerifyError({
426
597
  message: "Failed to load password credential for reset",
427
598
  cause,
@@ -432,6 +603,14 @@ export const makePasswordReset = (dependencies) => {
432
603
  message: "Password credential not found",
433
604
  });
434
605
  }
606
+ yield* enforcePasswordRisk(dependencies.passwordRiskPolicy, {
607
+ password: input.password,
608
+ operation: "reset",
609
+ }).pipe(Effect.mapError((cause) => new PasswordResetVerifyError({
610
+ message: "Password does not meet policy requirements",
611
+ cause,
612
+ })));
613
+ const { userId } = binding;
435
614
  const now = yield* currentUnixMillis;
436
615
  const passwordHash = yield* dependencies.hasher
437
616
  .hash({ password: input.password })
@@ -491,25 +670,31 @@ export const makePasswordReset = (dependencies) => {
491
670
  export const PasswordResetLive = (options) => Layer.effect(PasswordReset)(Effect.gen(function* () {
492
671
  const challenge = yield* Challenge;
493
672
  const users = yield* UserStore;
673
+ const identities = yield* IdentityStore;
674
+ const identityKinds = yield* IdentityKindRegistry;
494
675
  const credentials = yield* CredentialStore;
495
676
  const hasher = yield* PasswordHasher;
496
677
  const crypto = yield* Crypto;
497
678
  const authMailer = yield* AuthMailer;
498
679
  const sessionStore = yield* SessionStore;
680
+ const passwordRiskPolicy = yield* PasswordRiskPolicy;
499
681
  return makePasswordReset({
500
682
  ...options,
501
683
  challenge,
502
684
  users,
685
+ identities,
686
+ identityKinds,
503
687
  credentials,
504
688
  hasher,
505
689
  crypto,
506
690
  authMailer,
507
691
  sessionStore,
692
+ passwordRiskPolicy,
508
693
  });
509
694
  }));
510
- export const PasswordResetFeatureLive = (options) => {
695
+ export const PasswordResetDefaultLive = (options, passwordRiskPolicy = PasswordRiskPolicyNoopLive) => {
511
696
  const { passwordHasher, ...resetOptions } = options;
512
- return PasswordResetLive(resetOptions).pipe(Layer.provideMerge(Pbkdf2PasswordHasherLive(passwordHasher)));
697
+ return PasswordResetLive(resetOptions).pipe(Layer.provideMerge(Pbkdf2PasswordHasherLive(passwordHasher)), Layer.provideMerge(passwordRiskPolicy));
513
698
  };
514
699
  export class PasswordSetError extends Data.TaggedError("PasswordSetError") {
515
700
  }
@@ -517,13 +702,15 @@ export class PasswordChangeError extends Data.TaggedError("PasswordChangeError")
517
702
  }
518
703
  export class PasswordManagement extends Context.Service()("auth/password/Management") {
519
704
  }
520
- (function (PasswordManagement) {
521
- PasswordManagement.make = (service) => PasswordManagement.of(service);
522
- })(PasswordManagement || (PasswordManagement = {}));
523
705
  export const makePasswordManagement = (dependencies) => {
524
706
  const credentialIdBytes = dependencies.credentialIdBytes ?? 16;
525
- return PasswordManagement.make({
707
+ return PasswordManagement.of({
526
708
  set: Effect.fn("auth.password.set")(function* (input) {
709
+ yield* validatePasswordSize(input.password, dependencies.passwordMaxBytes).pipe(Effect.mapError((cause) => new PasswordSetError({
710
+ reason: "password_policy_rejected",
711
+ message: "Password does not meet policy requirements",
712
+ cause,
713
+ })));
527
714
  const credential = yield* dependencies.credentials
528
715
  .findPasswordByUserId(input.userId)
529
716
  .pipe(Effect.mapError((cause) => new PasswordSetError({
@@ -539,6 +726,14 @@ export const makePasswordManagement = (dependencies) => {
539
726
  message: "Password credential already exists",
540
727
  });
541
728
  }
729
+ yield* enforcePasswordRisk(dependencies.passwordRiskPolicy, {
730
+ password: input.password,
731
+ operation: "set",
732
+ }).pipe(Effect.mapError((cause) => new PasswordSetError({
733
+ reason: "password_policy_rejected",
734
+ message: "Password does not meet policy requirements",
735
+ cause,
736
+ })));
542
737
  const now = yield* currentUnixMillis;
543
738
  const credentialId = CredentialId(yield* dependencies.crypto.randomToken(credentialIdBytes).pipe(Effect.mapError((cause) => new PasswordSetError({
544
739
  reason: "internal",
@@ -568,6 +763,11 @@ export const makePasswordManagement = (dependencies) => {
568
763
  })));
569
764
  }),
570
765
  change: Effect.fn("auth.password.change")(function* (input) {
766
+ yield* validatePasswordSize(input.newPassword, dependencies.passwordMaxBytes).pipe(Effect.mapError((cause) => new PasswordChangeError({
767
+ reason: "password_policy_rejected",
768
+ message: "Password does not meet policy requirements",
769
+ cause,
770
+ })));
571
771
  const credential = yield* dependencies.credentials
572
772
  .findPasswordByUserId(input.userId)
573
773
  .pipe(Effect.mapError((cause) => new PasswordChangeError({
@@ -603,6 +803,14 @@ export const makePasswordManagement = (dependencies) => {
603
803
  message: "Current password is invalid",
604
804
  });
605
805
  }
806
+ yield* enforcePasswordRisk(dependencies.passwordRiskPolicy, {
807
+ password: input.newPassword,
808
+ operation: "change",
809
+ }).pipe(Effect.mapError((cause) => new PasswordChangeError({
810
+ reason: "password_policy_rejected",
811
+ message: "Password does not meet policy requirements",
812
+ cause,
813
+ })));
606
814
  const now = yield* currentUnixMillis;
607
815
  const passwordHash = yield* dependencies.hasher
608
816
  .hash({ password: input.newPassword })
@@ -635,7 +843,13 @@ export const PasswordManagementLive = Layer.effect(PasswordManagement)(Effect.ge
635
843
  const credentials = yield* CredentialStore;
636
844
  const hasher = yield* PasswordHasher;
637
845
  const crypto = yield* Crypto;
638
- return makePasswordManagement({ credentials, hasher, crypto });
846
+ const passwordRiskPolicy = yield* PasswordRiskPolicy;
847
+ return makePasswordManagement({
848
+ credentials,
849
+ hasher,
850
+ crypto,
851
+ passwordRiskPolicy,
852
+ });
639
853
  }));
640
- export const PasswordFeatureLive = (options) => Layer.mergeAll(PasswordLoginLive, PasswordRegistrationLive, PasswordManagementLive).pipe(Layer.provideMerge(Pbkdf2PasswordHasherLive(options)));
854
+ export const PasswordDefaultLive = (options, passwordRiskPolicy = PasswordRiskPolicyNoopLive, emailAcceptancePolicy = EmailAcceptancePolicyNoopLive) => Layer.mergeAll(PasswordPrimaryFactorLive, PasswordLoginLive, PasswordRegistrationLive, PasswordManagementLive).pipe(Layer.provideMerge(Pbkdf2PasswordHasherLive(options)), Layer.provideMerge(passwordRiskPolicy), Layer.provideMerge(emailAcceptancePolicy));
641
855
  //# sourceMappingURL=Password.js.map