@yielded/auth-persistence-drizzle 0.1.0-beta.0

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 (401) hide show
  1. package/README.md +17 -0
  2. package/dist/D1.d.mts +963 -0
  3. package/dist/D1.mjs +29 -0
  4. package/dist/D1.mjs.map +1 -0
  5. package/dist/Libsql.d.mts +2134 -0
  6. package/dist/Libsql.mjs +77 -0
  7. package/dist/Libsql.mjs.map +1 -0
  8. package/dist/Mysql2.d.mts +1817 -0
  9. package/dist/Mysql2.mjs +55 -0
  10. package/dist/Mysql2.mjs.map +1 -0
  11. package/dist/Pglite.d.mts +1821 -0
  12. package/dist/Pglite.mjs +53 -0
  13. package/dist/Pglite.mjs.map +1 -0
  14. package/dist/Postgres.d.mts +1821 -0
  15. package/dist/Postgres.mjs +53 -0
  16. package/dist/Postgres.mjs.map +1 -0
  17. package/dist/SqliteBun.d.mts +2129 -0
  18. package/dist/SqliteBun.mjs +70 -0
  19. package/dist/SqliteBun.mjs.map +1 -0
  20. package/dist/SqliteDo.d.mts +2181 -0
  21. package/dist/SqliteDo.mjs +105 -0
  22. package/dist/SqliteDo.mjs.map +1 -0
  23. package/dist/SqliteNode.d.mts +2129 -0
  24. package/dist/SqliteNode.mjs +70 -0
  25. package/dist/SqliteNode.mjs.map +1 -0
  26. package/dist/SqliteWasm.d.mts +2132 -0
  27. package/dist/SqliteWasm.mjs +70 -0
  28. package/dist/SqliteWasm.mjs.map +1 -0
  29. package/dist/_virtual/_rolldown/runtime.mjs +13 -0
  30. package/dist/drizzle/D1BatchStatements.d.mts +10 -0
  31. package/dist/drizzle/D1BatchStatements.mjs +8 -0
  32. package/dist/drizzle/D1BatchStatements.mjs.map +1 -0
  33. package/dist/drizzle/SuppliedService.d.mts +9 -0
  34. package/dist/drizzle/d1-emails.d.mts +61 -0
  35. package/dist/drizzle/d1-emails.mjs +578 -0
  36. package/dist/drizzle/d1-emails.mjs.map +1 -0
  37. package/dist/drizzle/d1-generated-statement.mjs +79 -0
  38. package/dist/drizzle/d1-generated-statement.mjs.map +1 -0
  39. package/dist/drizzle/d1-identity.d.mts +30 -0
  40. package/dist/drizzle/d1-identity.mjs +118 -0
  41. package/dist/drizzle/d1-identity.mjs.map +1 -0
  42. package/dist/drizzle/d1-oauth.d.mts +300 -0
  43. package/dist/drizzle/d1-oauth.mjs +76 -0
  44. package/dist/drizzle/d1-oauth.mjs.map +1 -0
  45. package/dist/drizzle/d1-passkey.d.mts +47 -0
  46. package/dist/drizzle/d1-passkey.mjs +95 -0
  47. package/dist/drizzle/d1-passkey.mjs.map +1 -0
  48. package/dist/drizzle/d1-password-prepared.d.mts +24 -0
  49. package/dist/drizzle/d1-password-prepared.mjs +460 -0
  50. package/dist/drizzle/d1-password-prepared.mjs.map +1 -0
  51. package/dist/drizzle/d1-passwords.d.mts +86 -0
  52. package/dist/drizzle/d1-passwords.mjs +1003 -0
  53. package/dist/drizzle/d1-passwords.mjs.map +1 -0
  54. package/dist/drizzle/d1-phone.d.mts +23 -0
  55. package/dist/drizzle/d1-phone.mjs +30 -0
  56. package/dist/drizzle/d1-phone.mjs.map +1 -0
  57. package/dist/drizzle/d1-planning.d.mts +11 -0
  58. package/dist/drizzle/d1-planning.mjs +43 -0
  59. package/dist/drizzle/d1-planning.mjs.map +1 -0
  60. package/dist/drizzle/d1-proofs.d.mts +79 -0
  61. package/dist/drizzle/d1-proofs.mjs +829 -0
  62. package/dist/drizzle/d1-proofs.mjs.map +1 -0
  63. package/dist/drizzle/d1-sessions.d.mts +66 -0
  64. package/dist/drizzle/d1-sessions.mjs +965 -0
  65. package/dist/drizzle/d1-sessions.mjs.map +1 -0
  66. package/dist/drizzle/d1-totp.d.mts +23 -0
  67. package/dist/drizzle/d1-totp.mjs +27 -0
  68. package/dist/drizzle/d1-totp.mjs.map +1 -0
  69. package/dist/drizzle/email-model.d.mts +30 -0
  70. package/dist/drizzle/email-model.mjs +2 -0
  71. package/dist/drizzle/email-registration.d.mts +29 -0
  72. package/dist/drizzle/email-registration.mjs +236 -0
  73. package/dist/drizzle/email-registration.mjs.map +1 -0
  74. package/dist/drizzle/email-sql.d.mts +1 -0
  75. package/dist/drizzle/email-sql.mjs +9 -0
  76. package/dist/drizzle/email-sql.mjs.map +1 -0
  77. package/dist/drizzle/email-target.d.mts +19 -0
  78. package/dist/drizzle/email-target.mjs +72 -0
  79. package/dist/drizzle/email-target.mjs.map +1 -0
  80. package/dist/drizzle/model.d.mts +245 -0
  81. package/dist/drizzle/model.mjs +55 -0
  82. package/dist/drizzle/model.mjs.map +1 -0
  83. package/dist/drizzle/mysql-emails.d.mts +70 -0
  84. package/dist/drizzle/mysql-emails.mjs +38 -0
  85. package/dist/drizzle/mysql-emails.mjs.map +1 -0
  86. package/dist/drizzle/mysql-identity.d.mts +21 -0
  87. package/dist/drizzle/mysql-identity.mjs +93 -0
  88. package/dist/drizzle/mysql-identity.mjs.map +1 -0
  89. package/dist/drizzle/mysql-password-prepared.d.mts +29 -0
  90. package/dist/drizzle/mysql-password-prepared.mjs +16 -0
  91. package/dist/drizzle/mysql-password-prepared.mjs.map +1 -0
  92. package/dist/drizzle/mysql-passwords.d.mts +85 -0
  93. package/dist/drizzle/mysql-passwords.mjs +38 -0
  94. package/dist/drizzle/mysql-passwords.mjs.map +1 -0
  95. package/dist/drizzle/mysql-proofs.d.mts +74 -0
  96. package/dist/drizzle/mysql-proofs.mjs +23 -0
  97. package/dist/drizzle/mysql-proofs.mjs.map +1 -0
  98. package/dist/drizzle/mysql-sessions.d.mts +91 -0
  99. package/dist/drizzle/mysql-sessions.mjs +53 -0
  100. package/dist/drizzle/mysql-sessions.mjs.map +1 -0
  101. package/dist/drizzle/mysql.d.mts +69 -0
  102. package/dist/drizzle/mysql.mjs +218 -0
  103. package/dist/drizzle/mysql.mjs.map +1 -0
  104. package/dist/drizzle/oauth-accounts.mjs +358 -0
  105. package/dist/drizzle/oauth-accounts.mjs.map +1 -0
  106. package/dist/drizzle/oauth-connected-access.mjs +210 -0
  107. package/dist/drizzle/oauth-connected-access.mjs.map +1 -0
  108. package/dist/drizzle/oauth-connected-collection.mjs +202 -0
  109. package/dist/drizzle/oauth-connected-collection.mjs.map +1 -0
  110. package/dist/drizzle/oauth-connected-custody.mjs +146 -0
  111. package/dist/drizzle/oauth-connected-custody.mjs.map +1 -0
  112. package/dist/drizzle/oauth-connected-drivers.mjs +76 -0
  113. package/dist/drizzle/oauth-connected-drivers.mjs.map +1 -0
  114. package/dist/drizzle/oauth-connected-flow.mjs +247 -0
  115. package/dist/drizzle/oauth-connected-flow.mjs.map +1 -0
  116. package/dist/drizzle/oauth-connected-input.mjs +103 -0
  117. package/dist/drizzle/oauth-connected-input.mjs.map +1 -0
  118. package/dist/drizzle/oauth-connected-maintenance.mjs +214 -0
  119. package/dist/drizzle/oauth-connected-maintenance.mjs.map +1 -0
  120. package/dist/drizzle/oauth-connected-management.mjs +228 -0
  121. package/dist/drizzle/oauth-connected-management.mjs.map +1 -0
  122. package/dist/drizzle/oauth-connected-model.d.mts +277 -0
  123. package/dist/drizzle/oauth-connected-model.mjs +22 -0
  124. package/dist/drizzle/oauth-connected-model.mjs.map +1 -0
  125. package/dist/drizzle/oauth-connected-reference.d.mts +16 -0
  126. package/dist/drizzle/oauth-connected-reference.mjs +53 -0
  127. package/dist/drizzle/oauth-connected-reference.mjs.map +1 -0
  128. package/dist/drizzle/oauth-connected-settlement.mjs +117 -0
  129. package/dist/drizzle/oauth-connected-settlement.mjs.map +1 -0
  130. package/dist/drizzle/oauth-connected-state.d.mts +1954 -0
  131. package/dist/drizzle/oauth-connected-state.mjs +422 -0
  132. package/dist/drizzle/oauth-connected-state.mjs.map +1 -0
  133. package/dist/drizzle/oauth-connected-target.d.mts +752 -0
  134. package/dist/drizzle/oauth-connected-target.mjs +91 -0
  135. package/dist/drizzle/oauth-connected-target.mjs.map +1 -0
  136. package/dist/drizzle/oauth-drivers.mjs +51 -0
  137. package/dist/drizzle/oauth-drivers.mjs.map +1 -0
  138. package/dist/drizzle/oauth-flow.d.mts +22 -0
  139. package/dist/drizzle/oauth-flow.mjs +253 -0
  140. package/dist/drizzle/oauth-flow.mjs.map +1 -0
  141. package/dist/drizzle/oauth-input.mjs +127 -0
  142. package/dist/drizzle/oauth-input.mjs.map +1 -0
  143. package/dist/drizzle/oauth-model.d.mts +461 -0
  144. package/dist/drizzle/oauth-model.mjs +49 -0
  145. package/dist/drizzle/oauth-model.mjs.map +1 -0
  146. package/dist/drizzle/oauth-mysql.mjs +8 -0
  147. package/dist/drizzle/oauth-mysql.mjs.map +1 -0
  148. package/dist/drizzle/oauth-owner.d.mts +10 -0
  149. package/dist/drizzle/oauth-owner.mjs +10 -0
  150. package/dist/drizzle/oauth-owner.mjs.map +1 -0
  151. package/dist/drizzle/oauth-registration.d.mts +5 -0
  152. package/dist/drizzle/oauth-registration.mjs +374 -0
  153. package/dist/drizzle/oauth-registration.mjs.map +1 -0
  154. package/dist/drizzle/oauth-state.mjs +107 -0
  155. package/dist/drizzle/oauth-state.mjs.map +1 -0
  156. package/dist/drizzle/oauth-target.d.mts +109 -0
  157. package/dist/drizzle/oauth-target.mjs +246 -0
  158. package/dist/drizzle/oauth-target.mjs.map +1 -0
  159. package/dist/drizzle/passkey-drivers.mjs +34 -0
  160. package/dist/drizzle/passkey-drivers.mjs.map +1 -0
  161. package/dist/drizzle/passkey-kernel.mjs +8 -0
  162. package/dist/drizzle/passkey-kernel.mjs.map +1 -0
  163. package/dist/drizzle/passkey-model.d.mts +43 -0
  164. package/dist/drizzle/passkey-model.mjs +8 -0
  165. package/dist/drizzle/passkey-model.mjs.map +1 -0
  166. package/dist/drizzle/passkey-registration-ceremony-model.d.mts +12 -0
  167. package/dist/drizzle/passkey-registration-ceremony-model.mjs +2 -0
  168. package/dist/drizzle/passkey-state.mjs +7 -0
  169. package/dist/drizzle/passkey-state.mjs.map +1 -0
  170. package/dist/drizzle/passkey-target.d.mts +2 -0
  171. package/dist/drizzle/passkey-target.mjs +7 -0
  172. package/dist/drizzle/passkey-target.mjs.map +1 -0
  173. package/dist/drizzle/passkey-write-drivers.mjs +32 -0
  174. package/dist/drizzle/passkey-write-drivers.mjs.map +1 -0
  175. package/dist/drizzle/passkey-write-model.d.mts +20 -0
  176. package/dist/drizzle/passkey-write-model.mjs +9 -0
  177. package/dist/drizzle/passkey-write-model.mjs.map +1 -0
  178. package/dist/drizzle/passkey-write-target.d.mts +5 -0
  179. package/dist/drizzle/passkey-write-target.mjs +7 -0
  180. package/dist/drizzle/passkey-write-target.mjs.map +1 -0
  181. package/dist/drizzle/password-model.d.mts +24 -0
  182. package/dist/drizzle/password-model.mjs +2 -0
  183. package/dist/drizzle/password-prepared-model.d.mts +92 -0
  184. package/dist/drizzle/password-prepared-model.mjs +11 -0
  185. package/dist/drizzle/password-prepared-model.mjs.map +1 -0
  186. package/dist/drizzle/password-prepared-sql.mjs +389 -0
  187. package/dist/drizzle/password-prepared-sql.mjs.map +1 -0
  188. package/dist/drizzle/password-prepared-state.mjs +104 -0
  189. package/dist/drizzle/password-prepared-state.mjs.map +1 -0
  190. package/dist/drizzle/password-prepared-target.d.mts +11 -0
  191. package/dist/drizzle/password-prepared-target.mjs +56 -0
  192. package/dist/drizzle/password-prepared-target.mjs.map +1 -0
  193. package/dist/drizzle/password-registration.d.mts +7 -0
  194. package/dist/drizzle/password-registration.mjs +134 -0
  195. package/dist/drizzle/password-registration.mjs.map +1 -0
  196. package/dist/drizzle/password-sql.d.mts +1 -0
  197. package/dist/drizzle/password-sql.mjs +9 -0
  198. package/dist/drizzle/password-sql.mjs.map +1 -0
  199. package/dist/drizzle/password-target.d.mts +16 -0
  200. package/dist/drizzle/password-target.mjs +61 -0
  201. package/dist/drizzle/password-target.mjs.map +1 -0
  202. package/dist/drizzle/pg-emails.d.mts +71 -0
  203. package/dist/drizzle/pg-emails.mjs +38 -0
  204. package/dist/drizzle/pg-emails.mjs.map +1 -0
  205. package/dist/drizzle/pg-password-prepared.d.mts +30 -0
  206. package/dist/drizzle/pg-password-prepared.mjs +16 -0
  207. package/dist/drizzle/pg-password-prepared.mjs.map +1 -0
  208. package/dist/drizzle/pg-passwords.d.mts +86 -0
  209. package/dist/drizzle/pg-passwords.mjs +38 -0
  210. package/dist/drizzle/pg-passwords.mjs.map +1 -0
  211. package/dist/drizzle/pg-proofs.d.mts +75 -0
  212. package/dist/drizzle/pg-proofs.mjs +22 -0
  213. package/dist/drizzle/pg-proofs.mjs.map +1 -0
  214. package/dist/drizzle/pg-sessions.d.mts +92 -0
  215. package/dist/drizzle/pg-sessions.mjs +53 -0
  216. package/dist/drizzle/pg-sessions.mjs.map +1 -0
  217. package/dist/drizzle/pg.d.mts +80 -0
  218. package/dist/drizzle/pg.mjs +289 -0
  219. package/dist/drizzle/pg.mjs.map +1 -0
  220. package/dist/drizzle/phone-model.d.mts +113 -0
  221. package/dist/drizzle/phone-model.mjs +39 -0
  222. package/dist/drizzle/phone-model.mjs.map +1 -0
  223. package/dist/drizzle/phone-state.mjs +14 -0
  224. package/dist/drizzle/phone-state.mjs.map +1 -0
  225. package/dist/drizzle/phone-target.d.mts +14 -0
  226. package/dist/drizzle/phone-target.mjs +168 -0
  227. package/dist/drizzle/phone-target.mjs.map +1 -0
  228. package/dist/drizzle/proof-model.d.mts +21 -0
  229. package/dist/drizzle/proof-model.mjs +2 -0
  230. package/dist/drizzle/proof-sql.d.mts +1 -0
  231. package/dist/drizzle/proof-sql.mjs +8 -0
  232. package/dist/drizzle/proof-sql.mjs.map +1 -0
  233. package/dist/drizzle/proof-target.d.mts +11 -0
  234. package/dist/drizzle/proof-target.mjs +36 -0
  235. package/dist/drizzle/proof-target.mjs.map +1 -0
  236. package/dist/drizzle/query-operations.mjs +27 -0
  237. package/dist/drizzle/query-operations.mjs.map +1 -0
  238. package/dist/drizzle/session-model.d.mts +31 -0
  239. package/dist/drizzle/session-model.mjs +2 -0
  240. package/dist/drizzle/session-sql.mjs +8 -0
  241. package/dist/drizzle/session-sql.mjs.map +1 -0
  242. package/dist/drizzle/session-target.d.mts +27 -0
  243. package/dist/drizzle/session-target.mjs +46 -0
  244. package/dist/drizzle/session-target.mjs.map +1 -0
  245. package/dist/drizzle/sqlite-emails.mjs +45 -0
  246. package/dist/drizzle/sqlite-emails.mjs.map +1 -0
  247. package/dist/drizzle/sqlite-identity.mjs +90 -0
  248. package/dist/drizzle/sqlite-identity.mjs.map +1 -0
  249. package/dist/drizzle/sqlite-password-prepared.mjs +21 -0
  250. package/dist/drizzle/sqlite-password-prepared.mjs.map +1 -0
  251. package/dist/drizzle/sqlite-passwords.mjs +49 -0
  252. package/dist/drizzle/sqlite-passwords.mjs.map +1 -0
  253. package/dist/drizzle/sqlite-proofs.mjs +29 -0
  254. package/dist/drizzle/sqlite-proofs.mjs.map +1 -0
  255. package/dist/drizzle/sqlite-sessions.mjs +74 -0
  256. package/dist/drizzle/sqlite-sessions.mjs.map +1 -0
  257. package/dist/drizzle/sqlite.d.mts +77 -0
  258. package/dist/drizzle/sqlite.mjs +217 -0
  259. package/dist/drizzle/sqlite.mjs.map +1 -0
  260. package/dist/drizzle/standalone-guard.mjs +17 -0
  261. package/dist/drizzle/standalone-guard.mjs.map +1 -0
  262. package/dist/drizzle/step-up-model.d.mts +16 -0
  263. package/dist/drizzle/step-up-model.mjs +2 -0
  264. package/dist/drizzle/table-model.d.mts +11 -0
  265. package/dist/drizzle/totp-model.d.mts +82 -0
  266. package/dist/drizzle/totp-model.mjs +13 -0
  267. package/dist/drizzle/totp-model.mjs.map +1 -0
  268. package/dist/drizzle/totp-state.d.mts +37 -0
  269. package/dist/drizzle/totp-state.mjs +287 -0
  270. package/dist/drizzle/totp-state.mjs.map +1 -0
  271. package/dist/drizzle/totp-target.d.mts +14 -0
  272. package/dist/drizzle/totp-target.mjs +81 -0
  273. package/dist/drizzle/totp-target.mjs.map +1 -0
  274. package/dist/drizzle/transaction-execution.d.mts +2 -0
  275. package/dist/drizzle/transaction-execution.mjs +11 -0
  276. package/dist/drizzle/transaction-execution.mjs.map +1 -0
  277. package/dist/drizzle/transaction-mysql.mjs +47 -0
  278. package/dist/drizzle/transaction-mysql.mjs.map +1 -0
  279. package/dist/drizzle/transaction-owner.d.mts +2 -0
  280. package/dist/drizzle/transaction-owner.mjs +8 -0
  281. package/dist/drizzle/transaction-owner.mjs.map +1 -0
  282. package/dist/index.d.mts +27 -0
  283. package/dist/index.mjs +27 -0
  284. package/dist/internal/drizzle-migrations.mjs +19 -0
  285. package/dist/internal/drizzle-migrations.mjs.map +1 -0
  286. package/dist/internal/drizzle-postgres.mjs +37 -0
  287. package/dist/internal/drizzle-postgres.mjs.map +1 -0
  288. package/dist/internal/drizzle-sqlite.mjs +35 -0
  289. package/dist/internal/drizzle-sqlite.mjs.map +1 -0
  290. package/package.json +1 -0
  291. package/src/D1.ts +136 -0
  292. package/src/Libsql.ts +257 -0
  293. package/src/Mysql2.ts +184 -0
  294. package/src/Pglite.ts +174 -0
  295. package/src/Postgres.ts +174 -0
  296. package/src/SqliteBun.ts +258 -0
  297. package/src/SqliteDo.ts +473 -0
  298. package/src/SqliteNode.ts +259 -0
  299. package/src/SqliteWasm.ts +263 -0
  300. package/src/drizzle/D1BatchStatements.ts +10 -0
  301. package/src/drizzle/SuppliedService.ts +10 -0
  302. package/src/drizzle/d1-emails.ts +1829 -0
  303. package/src/drizzle/d1-generated-statement.ts +129 -0
  304. package/src/drizzle/d1-identity.ts +375 -0
  305. package/src/drizzle/d1-oauth.ts +340 -0
  306. package/src/drizzle/d1-passkey.ts +373 -0
  307. package/src/drizzle/d1-password-prepared.ts +1270 -0
  308. package/src/drizzle/d1-passwords.ts +2656 -0
  309. package/src/drizzle/d1-phone.ts +96 -0
  310. package/src/drizzle/d1-planning.ts +104 -0
  311. package/src/drizzle/d1-proofs.ts +2305 -0
  312. package/src/drizzle/d1-sessions.ts +2857 -0
  313. package/src/drizzle/d1-totp.ts +78 -0
  314. package/src/drizzle/email-model.ts +202 -0
  315. package/src/drizzle/email-registration.ts +698 -0
  316. package/src/drizzle/email-sql.ts +25 -0
  317. package/src/drizzle/email-target.ts +243 -0
  318. package/src/drizzle/model.ts +459 -0
  319. package/src/drizzle/mysql-emails.ts +321 -0
  320. package/src/drizzle/mysql-identity.ts +324 -0
  321. package/src/drizzle/mysql-password-prepared.ts +204 -0
  322. package/src/drizzle/mysql-passwords.ts +339 -0
  323. package/src/drizzle/mysql-proofs.ts +181 -0
  324. package/src/drizzle/mysql-sessions.ts +741 -0
  325. package/src/drizzle/mysql.ts +687 -0
  326. package/src/drizzle/oauth-accounts.ts +804 -0
  327. package/src/drizzle/oauth-connected-access.ts +354 -0
  328. package/src/drizzle/oauth-connected-collection.ts +324 -0
  329. package/src/drizzle/oauth-connected-custody.ts +277 -0
  330. package/src/drizzle/oauth-connected-drivers.ts +465 -0
  331. package/src/drizzle/oauth-connected-flow.ts +441 -0
  332. package/src/drizzle/oauth-connected-input.ts +127 -0
  333. package/src/drizzle/oauth-connected-maintenance.ts +345 -0
  334. package/src/drizzle/oauth-connected-management.ts +365 -0
  335. package/src/drizzle/oauth-connected-model.ts +347 -0
  336. package/src/drizzle/oauth-connected-reference.ts +112 -0
  337. package/src/drizzle/oauth-connected-settlement.ts +226 -0
  338. package/src/drizzle/oauth-connected-state.ts +845 -0
  339. package/src/drizzle/oauth-connected-target.ts +264 -0
  340. package/src/drizzle/oauth-drivers.ts +569 -0
  341. package/src/drizzle/oauth-flow.ts +462 -0
  342. package/src/drizzle/oauth-input.ts +201 -0
  343. package/src/drizzle/oauth-model.ts +617 -0
  344. package/src/drizzle/oauth-mysql.ts +10 -0
  345. package/src/drizzle/oauth-owner.ts +29 -0
  346. package/src/drizzle/oauth-registration.ts +640 -0
  347. package/src/drizzle/oauth-state.ts +215 -0
  348. package/src/drizzle/oauth-target.ts +750 -0
  349. package/src/drizzle/passkey-drivers.ts +385 -0
  350. package/src/drizzle/passkey-kernel.ts +4 -0
  351. package/src/drizzle/passkey-model.ts +153 -0
  352. package/src/drizzle/passkey-registration-ceremony-model.ts +32 -0
  353. package/src/drizzle/passkey-state.ts +3 -0
  354. package/src/drizzle/passkey-target.ts +23 -0
  355. package/src/drizzle/passkey-write-drivers.ts +395 -0
  356. package/src/drizzle/passkey-write-model.ts +103 -0
  357. package/src/drizzle/passkey-write-target.ts +9 -0
  358. package/src/drizzle/password-model.ts +169 -0
  359. package/src/drizzle/password-prepared-model.ts +259 -0
  360. package/src/drizzle/password-prepared-sql.ts +1191 -0
  361. package/src/drizzle/password-prepared-state.ts +231 -0
  362. package/src/drizzle/password-prepared-target.ts +160 -0
  363. package/src/drizzle/password-registration.ts +363 -0
  364. package/src/drizzle/password-sql.ts +13 -0
  365. package/src/drizzle/password-target.ts +224 -0
  366. package/src/drizzle/pg-emails.ts +321 -0
  367. package/src/drizzle/pg-password-prepared.ts +205 -0
  368. package/src/drizzle/pg-passwords.ts +338 -0
  369. package/src/drizzle/pg-proofs.ts +191 -0
  370. package/src/drizzle/pg-sessions.ts +750 -0
  371. package/src/drizzle/pg.ts +984 -0
  372. package/src/drizzle/phone-model.ts +190 -0
  373. package/src/drizzle/phone-state.ts +21 -0
  374. package/src/drizzle/phone-target.ts +472 -0
  375. package/src/drizzle/proof-model.ts +139 -0
  376. package/src/drizzle/proof-sql.ts +10 -0
  377. package/src/drizzle/proof-target.ts +122 -0
  378. package/src/drizzle/query-operations.ts +43 -0
  379. package/src/drizzle/session-model.ts +215 -0
  380. package/src/drizzle/session-sql.ts +14 -0
  381. package/src/drizzle/session-target.ts +338 -0
  382. package/src/drizzle/sqlite-emails.ts +366 -0
  383. package/src/drizzle/sqlite-identity.ts +344 -0
  384. package/src/drizzle/sqlite-password-prepared.ts +260 -0
  385. package/src/drizzle/sqlite-passwords.ts +497 -0
  386. package/src/drizzle/sqlite-proofs.ts +202 -0
  387. package/src/drizzle/sqlite-sessions.ts +971 -0
  388. package/src/drizzle/sqlite.ts +705 -0
  389. package/src/drizzle/standalone-guard.ts +32 -0
  390. package/src/drizzle/step-up-model.ts +73 -0
  391. package/src/drizzle/table-model.ts +9 -0
  392. package/src/drizzle/totp-model.ts +92 -0
  393. package/src/drizzle/totp-state.ts +525 -0
  394. package/src/drizzle/totp-target.ts +308 -0
  395. package/src/drizzle/transaction-execution.ts +13 -0
  396. package/src/drizzle/transaction-mysql.ts +106 -0
  397. package/src/drizzle/transaction-owner.ts +11 -0
  398. package/src/index.ts +378 -0
  399. package/src/internal/drizzle-migrations.ts +29 -0
  400. package/src/internal/drizzle-postgres.ts +83 -0
  401. package/src/internal/drizzle-sqlite.ts +81 -0
@@ -0,0 +1,104 @@
1
+ import { passwordSqlKernel } from "./password-sql.mjs";
2
+ import { SubjectId, TokenDigest } from "@yielded/auth/Schema";
3
+ import { DateTime, Effect, Redacted, Schema } from "effect";
4
+ import { AuthenticationProof, AuthenticationRequirement, SessionInvalidationWindow } from "@yielded/auth/Sessions";
5
+ import { ProofBinding, ProofContinuationId, ProofPurpose } from "@yielded/auth/Proofs";
6
+ import { PasswordAction, PasswordCommandId, PasswordCredentialSnapshot, PasswordPreparedConfiguration, PasswordPreparedIntentId, PasswordPreparedRequirement, PasswordPreparedReservation, PasswordPreparedReset, PasswordUnavailable, encodePasswordPreparedReady, snapshotPasswordPreparedReady, snapshotPasswordPreparedReservation } from "@yielded/auth/Password";
7
+ //#region src/drizzle/password-prepared-state.ts
8
+ const unavailable = () => PasswordUnavailable.make({});
9
+ const Instant = Schema.Int.check(Schema.isBetween({
10
+ minimum: 0,
11
+ maximum: 864e13
12
+ }));
13
+ const Label = Schema.NonEmptyString.check(Schema.isMaxLength(256));
14
+ const CompletionInput = Schema.Struct({
15
+ moduleId: Label,
16
+ purpose: ProofPurpose,
17
+ continuationId: ProofContinuationId,
18
+ continuationDigest: TokenDigest.check(Schema.isMaxLength(256)),
19
+ binding: ProofBinding,
20
+ nowMillis: Instant
21
+ });
22
+ const ContextInput = Schema.Struct({
23
+ moduleId: Label,
24
+ generation: PasswordPreparedConfiguration.fields.generation,
25
+ digest: TokenDigest.check(Schema.isMaxLength(256)),
26
+ nowMillis: Instant
27
+ });
28
+ const ReserveInput = Schema.Struct({
29
+ moduleId: Label,
30
+ generation: PasswordPreparedConfiguration.fields.generation,
31
+ intentId: PasswordPreparedIntentId,
32
+ commandId: PasswordCommandId,
33
+ action: PasswordAction,
34
+ subjectId: SubjectId.check(Schema.isMaxLength(256)),
35
+ nowMillis: Instant,
36
+ policy: PasswordPreparedConfiguration,
37
+ invalidation: SessionInvalidationWindow,
38
+ reset: Schema.optionalKey(PasswordPreparedReset),
39
+ completion: Schema.optionalKey(CompletionInput)
40
+ });
41
+ const reserveCodec = Schema.fromJsonString(ReserveInput);
42
+ const snapshotReserve = (input) => Schema.encodeEffect(reserveCodec)(input).pipe(Effect.flatMap(Schema.decodeEffect(Schema.String.check(Schema.isMaxLength(131072)))), Effect.flatMap(Schema.decodeEffect(reserveCodec)), Effect.mapError(unavailable));
43
+ const reservationCodec = Schema.fromJsonString(PasswordPreparedReservation);
44
+ const encodeReservation = (input) => snapshotPasswordPreparedReservation(input).pipe(Effect.flatMap(Schema.encodeEffect(reservationCodec)), Effect.mapError(unavailable));
45
+ const reservationOf = (ready) => {
46
+ const { replacement: _replacement, challenge: _challenge, baseEvidence: _evidence, digest: _digest, issuedAtMillis: _issued, expiresAtMillis: _expires, ...reservation } = ready;
47
+ return {
48
+ ...reservation,
49
+ _tag: "Preparing"
50
+ };
51
+ };
52
+ const sameRevision = (a, b) => a.subjectId === b.subjectId && a.securityRevision === b.securityRevision && a.credentials.length === b.credentials.length && a.credentials.every((c) => b.credentials.some((d) => c.credentialId === d.credentialId && c.revision === d.revision));
53
+ const scopeJson = Schema.encodeSync(Schema.fromJsonString(Schema.Array(Schema.String)));
54
+ const invalidationJson = Schema.encodeSync(Schema.fromJsonString(SessionInvalidationWindow));
55
+ const proofJson = Schema.encodeSync(Schema.fromJsonString(AuthenticationProof));
56
+ const identifierScope = (record) => record.credential === void 0 ? scopeJson(["prepared-subject", record.revision.subjectId]) : scopeJson([
57
+ "prepared-identifier",
58
+ record.credential.identifier.namespace,
59
+ record.credential.identifier.value
60
+ ]);
61
+ const credentialCodec = Schema.fromJsonString(PasswordCredentialSnapshot);
62
+ const sameCredential = Effect.fn("DrizzlePasswordPrepared.sameCredential")(function* (a, b) {
63
+ if (a === void 0 || b === void 0) return a === b;
64
+ return (yield* Schema.encodeEffect(credentialCodec)(a).pipe(Effect.mapError(unavailable))) === (yield* Schema.encodeEffect(credentialCodec)(b).pipe(Effect.mapError(unavailable)));
65
+ });
66
+ const requirementJson = Schema.encodeSync(Schema.fromJsonString(AuthenticationRequirement.fields.alternatives));
67
+ const requirementShape = (value) => requirementJson(value.alternatives);
68
+ const snapshotMutation = Effect.fn("DrizzlePasswordPrepared.snapshotMutation")(function* (input) {
69
+ const intent = yield* snapshotPasswordPreparedReady(input.intent);
70
+ const mutation = yield* passwordSqlKernel.snapshotMutationInput(input.mutation);
71
+ const capturedRequirement = yield* Schema.decodeEffect(PasswordPreparedRequirement)(input.capturedRequirement).pipe(Effect.mapError(unavailable));
72
+ const currentRequirement = yield* Schema.decodeEffect(PasswordPreparedRequirement)(input.currentRequirement).pipe(Effect.mapError(unavailable));
73
+ const original = intent.challenge, actual = mutation.authorization.challenge;
74
+ if (mutation.moduleId !== intent.moduleId || mutation.commandId !== intent.commandId || !sameRevision(mutation.expectedRevision, intent.revision) || !(yield* sameCredential(mutation.credential, intent.credential)) || Redacted.value(mutation.replacement.verifier) !== Redacted.value(intent.replacement.verifier) || mutation.replacement.normalization !== intent.replacement.normalization || actual.moduleId !== original.moduleId || actual.action !== original.action || actual.commandId !== original.commandId || actual.bindingDigest !== original.bindingDigest || actual.targetCredentialId !== original.targetCredentialId || !sameRevision(actual.revision, original.revision) || invalidationJson(mutation.invalidation) !== invalidationJson(intent.invalidation) || requirementShape(capturedRequirement) !== requirementShape(intent.capturedRequirement) || capturedRequirement.maximumAgeMillis > intent.capturedRequirement.maximumAgeMillis) return yield* unavailable();
75
+ return {
76
+ intent,
77
+ mutation,
78
+ capturedRequirement,
79
+ currentRequirement,
80
+ nowMillis: input.nowMillis
81
+ };
82
+ });
83
+ const evidenceCurrent = (input, current, now) => {
84
+ const requirements = [
85
+ input.mutation.authorization.requirement,
86
+ input.intent.capturedRequirement,
87
+ input.capturedRequirement,
88
+ current,
89
+ input.currentRequirement
90
+ ];
91
+ if (requirementShape(input.currentRequirement) !== requirementShape(current) || input.currentRequirement.maximumAgeMillis > current.maximumAgeMillis || now < input.intent.issuedAtMillis || now >= input.intent.expiresAtMillis || !requirements.every((requirement) => passwordSqlKernel.evidenceSatisfiedAt(input.mutation.authorization.evidence, requirement, now))) return false;
92
+ const age = Math.min(...requirements.map((requirement) => requirement.maximumAgeMillis));
93
+ return (input.intent.baseEvidence?.proofs ?? []).every((proof) => {
94
+ const verified = DateTime.toEpochMillis(proof.verifiedAt);
95
+ return verified <= now && now - verified < age && input.mutation.authorization.evidence.proofs.some((actual) => proofJson(actual) === proofJson(proof));
96
+ });
97
+ };
98
+ Effect.fn("DrizzlePasswordPrepared.sameReady")(function* (a, b) {
99
+ return (yield* encodePasswordPreparedReady(a)) === (yield* encodePasswordPreparedReady(b));
100
+ });
101
+ //#endregion
102
+ export { CompletionInput, ContextInput, encodeReservation, evidenceCurrent, identifierScope, reservationOf, sameRevision, snapshotMutation, snapshotReserve, unavailable };
103
+
104
+ //# sourceMappingURL=password-prepared-state.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"password-prepared-state.mjs","names":[],"sources":["../../src/drizzle/password-prepared-state.ts"],"sourcesContent":["import {\n PasswordUnavailable,\n PasswordAction,\n PasswordCommandId,\n PasswordCredentialSnapshot,\n PasswordPreparedConfiguration,\n PasswordPreparedIntentId,\n PasswordPreparedReservation,\n PasswordPreparedReset,\n PasswordPreparedRequirement,\n snapshotPasswordPreparedReservation,\n snapshotPasswordPreparedReady,\n encodePasswordPreparedReady,\n type PasswordPreparedReady,\n type PasswordPreparedMutation,\n type PasswordPreparedPersistence,\n} from \"@yielded/auth/Password\";\nimport { ProofBinding, ProofContinuationId, ProofPurpose } from \"@yielded/auth/Proofs\";\nimport { SubjectId, TokenDigest } from \"@yielded/auth/Schema\";\nimport {\n SessionInvalidationWindow,\n AuthenticationProof,\n AuthenticationRequirement,\n type AuthenticationRevision,\n} from \"@yielded/auth/Sessions\";\nimport { DateTime, Effect, Redacted, Schema } from \"effect\";\n\nimport { passwordSqlKernel } from \"./password-sql\";\n\nexport const unavailable = () => PasswordUnavailable.make({});\nconst Instant = Schema.Int.check(Schema.isBetween({ minimum: 0, maximum: 8640000000000000 }));\nconst Label = Schema.NonEmptyString.check(Schema.isMaxLength(256));\n\nexport const CompletionInput = Schema.Struct({\n moduleId: Label,\n purpose: ProofPurpose,\n continuationId: ProofContinuationId,\n continuationDigest: TokenDigest.check(Schema.isMaxLength(256)),\n binding: ProofBinding,\n nowMillis: Instant,\n});\n\nexport const ContextInput = Schema.Struct({\n moduleId: Label,\n generation: PasswordPreparedConfiguration.fields.generation,\n digest: TokenDigest.check(Schema.isMaxLength(256)),\n nowMillis: Instant,\n});\n\nconst ReserveInput = Schema.Struct({\n moduleId: Label,\n generation: PasswordPreparedConfiguration.fields.generation,\n intentId: PasswordPreparedIntentId,\n commandId: PasswordCommandId,\n action: PasswordAction,\n subjectId: SubjectId.check(Schema.isMaxLength(256)),\n nowMillis: Instant,\n policy: PasswordPreparedConfiguration,\n invalidation: SessionInvalidationWindow,\n reset: Schema.optionalKey(PasswordPreparedReset),\n completion: Schema.optionalKey(CompletionInput),\n});\n\nconst reserveCodec = Schema.fromJsonString(ReserveInput);\n\nexport const snapshotReserve = (input: Parameters<PasswordPreparedPersistence[\"reserve\"]>[0]) =>\n Schema.encodeEffect(reserveCodec)(input).pipe(\n Effect.flatMap(Schema.decodeEffect(Schema.String.check(Schema.isMaxLength(131072)))),\n Effect.flatMap(Schema.decodeEffect(reserveCodec)),\n Effect.mapError(unavailable),\n );\n\nconst reservationCodec = Schema.fromJsonString(PasswordPreparedReservation);\n\nexport const encodeReservation = (input: PasswordPreparedReservation) =>\n snapshotPasswordPreparedReservation(input).pipe(\n Effect.flatMap(Schema.encodeEffect(reservationCodec)),\n Effect.mapError(unavailable),\n );\n\nexport const decodeReservation = (input: string) =>\n Schema.decodeEffect(Schema.String.check(Schema.isMaxLength(131072)))(input).pipe(\n Effect.flatMap(Schema.decodeEffect(reservationCodec)),\n Effect.flatMap(snapshotPasswordPreparedReservation),\n Effect.mapError(unavailable),\n );\n\nexport const reservationOf = (ready: PasswordPreparedReady): PasswordPreparedReservation => {\n const {\n replacement: _replacement,\n challenge: _challenge,\n baseEvidence: _evidence,\n digest: _digest,\n issuedAtMillis: _issued,\n expiresAtMillis: _expires,\n ...reservation\n } = ready;\n\n return { ...reservation, _tag: \"Preparing\" };\n};\n\nexport const sameRevision = (a: AuthenticationRevision, b: AuthenticationRevision) =>\n a.subjectId === b.subjectId &&\n a.securityRevision === b.securityRevision &&\n a.credentials.length === b.credentials.length &&\n a.credentials.every((c) =>\n b.credentials.some((d) => c.credentialId === d.credentialId && c.revision === d.revision),\n );\n\nconst scopeJson = Schema.encodeSync(Schema.fromJsonString(Schema.Array(Schema.String)));\nconst invalidationJson = Schema.encodeSync(Schema.fromJsonString(SessionInvalidationWindow));\nconst proofJson = Schema.encodeSync(Schema.fromJsonString(AuthenticationProof));\n\nexport const identifierScope = (\n record: Pick<PasswordPreparedReservation, \"credential\" | \"revision\">,\n) =>\n record.credential === undefined\n ? scopeJson([\"prepared-subject\", record.revision.subjectId])\n : scopeJson([\n \"prepared-identifier\",\n record.credential.identifier.namespace,\n record.credential.identifier.value,\n ]);\n\nconst credentialCodec = Schema.fromJsonString(PasswordCredentialSnapshot);\n\nconst sameCredential = Effect.fn(\"DrizzlePasswordPrepared.sameCredential\")(function* (\n a: PasswordPreparedReservation[\"credential\"],\n b: PasswordPreparedReservation[\"credential\"],\n) {\n if (a === undefined || b === undefined) return a === b;\n\n return (\n (yield* Schema.encodeEffect(credentialCodec)(a).pipe(Effect.mapError(unavailable))) ===\n (yield* Schema.encodeEffect(credentialCodec)(b).pipe(Effect.mapError(unavailable)))\n );\n});\n\nconst requirementJson = Schema.encodeSync(\n Schema.fromJsonString(AuthenticationRequirement.fields.alternatives),\n);\n\nconst requirementShape = (value: AuthenticationRequirement) => requirementJson(value.alternatives);\n\nexport const snapshotMutation = Effect.fn(\"DrizzlePasswordPrepared.snapshotMutation\")(function* (\n input: PasswordPreparedMutation,\n) {\n const intent = yield* snapshotPasswordPreparedReady(input.intent);\n const mutation = yield* passwordSqlKernel.snapshotMutationInput(input.mutation);\n\n const capturedRequirement = yield* Schema.decodeEffect(PasswordPreparedRequirement)(\n input.capturedRequirement,\n ).pipe(Effect.mapError(unavailable));\n\n const currentRequirement = yield* Schema.decodeEffect(PasswordPreparedRequirement)(\n input.currentRequirement,\n ).pipe(Effect.mapError(unavailable));\n\n const original = intent.challenge,\n actual = mutation.authorization.challenge;\n\n if (\n mutation.moduleId !== intent.moduleId ||\n mutation.commandId !== intent.commandId ||\n !sameRevision(mutation.expectedRevision, intent.revision) ||\n !(yield* sameCredential(mutation.credential, intent.credential)) ||\n Redacted.value(mutation.replacement.verifier) !== Redacted.value(intent.replacement.verifier) ||\n mutation.replacement.normalization !== intent.replacement.normalization ||\n actual.moduleId !== original.moduleId ||\n actual.action !== original.action ||\n actual.commandId !== original.commandId ||\n actual.bindingDigest !== original.bindingDigest ||\n actual.targetCredentialId !== original.targetCredentialId ||\n !sameRevision(actual.revision, original.revision) ||\n invalidationJson(mutation.invalidation) !== invalidationJson(intent.invalidation) ||\n requirementShape(capturedRequirement) !== requirementShape(intent.capturedRequirement) ||\n capturedRequirement.maximumAgeMillis > intent.capturedRequirement.maximumAgeMillis\n )\n return yield* unavailable();\n\n return { intent, mutation, capturedRequirement, currentRequirement, nowMillis: input.nowMillis };\n});\n\nexport const evidenceCurrent = (\n input: PasswordPreparedMutation,\n current: AuthenticationRequirement,\n now: number,\n) => {\n const requirements = [\n input.mutation.authorization.requirement,\n input.intent.capturedRequirement,\n input.capturedRequirement,\n current,\n input.currentRequirement,\n ];\n\n if (\n requirementShape(input.currentRequirement) !== requirementShape(current) ||\n input.currentRequirement.maximumAgeMillis > current.maximumAgeMillis ||\n now < input.intent.issuedAtMillis ||\n now >= input.intent.expiresAtMillis ||\n !requirements.every((requirement) =>\n passwordSqlKernel.evidenceSatisfiedAt(\n input.mutation.authorization.evidence,\n requirement,\n now,\n ),\n )\n )\n return false;\n const age = Math.min(...requirements.map((requirement) => requirement.maximumAgeMillis));\n\n return (input.intent.baseEvidence?.proofs ?? []).every((proof) => {\n const verified = DateTime.toEpochMillis(proof.verifiedAt);\n\n return (\n verified <= now &&\n now - verified < age &&\n input.mutation.authorization.evidence.proofs.some(\n (actual) => proofJson(actual) === proofJson(proof),\n )\n );\n });\n};\n\nexport const sameReady = Effect.fn(\"DrizzlePasswordPrepared.sameReady\")(function* (\n a: PasswordPreparedReady,\n b: PasswordPreparedReady,\n) {\n return (yield* encodePasswordPreparedReady(a)) === (yield* encodePasswordPreparedReady(b));\n});\n"],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import "./password-target.mjs";
2
+ import { Context, Effect, Layer } from "effect";
3
+ import { LifecycleHooks } from "@yielded/auth/Hooks";
4
+ import { PasswordPreparedPersistence } from "@yielded/auth/Password";
5
+ import "effect/unstable/sql/SqlError";
6
+ //#region src/drizzle/password-prepared-target.d.ts
7
+ export declare const passwordPreparedPersistenceLayer: <Id>(tag: Context.Key<Id, PasswordPreparedPersistence>, services: Effect.Effect<{
8
+ readonly passwordPreparedPersistence: PasswordPreparedPersistence;
9
+ }, never, LifecycleHooks>) => Layer.Layer<Id, never, LifecycleHooks>;
10
+ //#endregion
11
+ //# sourceMappingURL=password-prepared-target.d.mts.map
@@ -0,0 +1,56 @@
1
+ import { passwordOptions } from "./password-target.mjs";
2
+ import { makeSqlPasswordPreparedPersistence } from "./password-prepared-sql.mjs";
3
+ import { CurrentPasswordPreparedTransaction, PasswordPreparedJournalGuards, PasswordPreparedPostconditions } from "@yielded/auth-persistence/Adapter";
4
+ import { Cause, Effect, Layer } from "effect";
5
+ import { LifecycleHooks, coordinateCommit, hasCommitScope } from "@yielded/auth/Hooks";
6
+ import { PasswordUnavailable } from "@yielded/auth/Password";
7
+ //#region src/drizzle/password-prepared-target.ts
8
+ const makeTargetPasswordPreparedPersistenceServices = (database, mapping, configuration, proofMapping) => Effect.gen(function* () {
9
+ return { passwordPreparedPersistence: yield* makeSqlPasswordPreparedPersistence(database, mapping, passwordOptions(configuration, proofMapping)) };
10
+ });
11
+ const coordinateTargetPasswordPreparedPersistence = (database, mapping, configuration, proofMapping, owner) => Effect.gen(function* () {
12
+ const hooks = yield* LifecycleHooks;
13
+ if (yield* hasCommitScope) return yield* PasswordUnavailable.make({});
14
+ yield* configuration.coordinatorGuard ?? configuration.standaloneGuard;
15
+ return (yield* coordinateCommit(() => database.transaction((transaction) => Effect.gen(function* () {
16
+ const guards = [];
17
+ const postconditions = [];
18
+ let poisoned = false;
19
+ let acceptingPostconditions = true;
20
+ const services = yield* makeSqlPasswordPreparedPersistence(transaction, mapping, passwordOptions(configuration, proofMapping, true));
21
+ const protect = (effect) => effect.pipe(Effect.onError(() => Effect.sync(() => {
22
+ poisoned = true;
23
+ })));
24
+ const value = yield* owner(transaction, { passwordPreparedPersistence: {
25
+ reserve: (input, prepare) => protect(services.reserve(input, prepare)),
26
+ publishReady: (input, prepare) => protect(services.publishReady(input, prepare)),
27
+ context: (input) => protect(services.context(input)),
28
+ complete: (input, prepare) => protect(services.complete(input, prepare)),
29
+ resetWithProof: (input, prepare) => protect(services.resetWithProof(input, prepare)),
30
+ cancel: (input, prepare) => protect(services.cancel(input, prepare)),
31
+ cleanup: (input, prepare) => protect(services.cleanup(input, prepare))
32
+ } }).pipe(Effect.provideService(PasswordPreparedJournalGuards, { register: (guard) => {
33
+ if (!acceptingPostconditions) return false;
34
+ guards.push(guard);
35
+ return true;
36
+ } }), Effect.provideService(PasswordPreparedPostconditions, { register: (check) => {
37
+ if (!acceptingPostconditions) return false;
38
+ postconditions.push(check);
39
+ return true;
40
+ } }), Effect.ensuring(Effect.sync(() => {
41
+ acceptingPostconditions = false;
42
+ })));
43
+ if (poisoned) return yield* PasswordUnavailable.make({});
44
+ for (const guard of guards) {
45
+ const status = yield* Effect.result(guard.read);
46
+ if (status._tag === "Success" || status.failure._tag !== "CommitPending") return yield* PasswordUnavailable.make({});
47
+ }
48
+ for (const check of postconditions) yield* check.pipe(Effect.provideService(CurrentPasswordPreparedTransaction, transaction), Effect.catchCause((cause) => Effect.failCause(Cause.map(cause, () => PasswordUnavailable.make({})))));
49
+ return value;
50
+ })), { mode: configuration.mode }).pipe(Effect.provideService(LifecycleHooks, hooks))).value;
51
+ });
52
+ const passwordPreparedPersistenceLayer = (tag, services) => Layer.effect(tag, Effect.map(services, (value) => value.passwordPreparedPersistence));
53
+ //#endregion
54
+ export { coordinateTargetPasswordPreparedPersistence, makeTargetPasswordPreparedPersistenceServices, passwordPreparedPersistenceLayer };
55
+
56
+ //# sourceMappingURL=password-prepared-target.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"password-prepared-target.mjs","names":[],"sources":["../../src/drizzle/password-prepared-target.ts"],"sourcesContent":["import {\n CurrentPasswordPreparedTransaction,\n PasswordPreparedPostconditions,\n PasswordPreparedJournalGuards,\n type PasswordPreparedPostcondition,\n} from \"@yielded/auth-persistence/Adapter\";\nimport {\n coordinateCommit,\n hasCommitScope,\n type PreparedCommit,\n LifecycleHooks,\n} from \"@yielded/auth/Hooks\";\nimport { PasswordUnavailable, type PasswordPreparedPersistence } from \"@yielded/auth/Password\";\n/* oxlint-disable no-explicit-any -- concrete driver modules restore native table/database types. */\nimport { type Context, Cause, Effect, Layer } from \"effect\";\nimport type * as SqlError from \"effect/unstable/sql/SqlError\";\n\nimport { makeSqlPasswordPreparedPersistence } from \"./password-prepared-sql\";\nimport type { PasswordSqlDatabase } from \"./password-sql\";\nimport {\n passwordOptions,\n type PasswordTargetConfiguration,\n type PasswordCoordinatorError,\n} from \"./password-target\";\n\nexport const makeTargetPasswordPreparedPersistenceServices = (\n database: any,\n mapping: any,\n configuration: PasswordTargetConfiguration,\n proofMapping?: any,\n) =>\n Effect.gen(function* () {\n return {\n passwordPreparedPersistence: yield* makeSqlPasswordPreparedPersistence(\n database,\n mapping,\n passwordOptions(configuration, proofMapping),\n ),\n };\n });\n\nexport const coordinateTargetPasswordPreparedPersistence = <Transaction, A, E, R>(\n database: {\n readonly transaction: <Out, Err, Env>(\n body: (transaction: Transaction) => Effect.Effect<Out, Err, Env>,\n ) => Effect.Effect<Out, Err | SqlError.SqlError, Env>;\n },\n mapping: any,\n configuration: PasswordTargetConfiguration,\n proofMapping: any | undefined,\n owner: (\n transaction: Transaction,\n services: { readonly passwordPreparedPersistence: PasswordPreparedPersistence },\n ) => Effect.Effect<A, E, R>,\n): Effect.Effect<A, PasswordCoordinatorError<E>, R | LifecycleHooks> =>\n Effect.gen(function* () {\n const hooks = yield* LifecycleHooks;\n\n if (yield* hasCommitScope) return yield* PasswordUnavailable.make({});\n yield* configuration.coordinatorGuard ?? configuration.standaloneGuard;\n\n const result = yield* coordinateCommit(\n () =>\n database.transaction((transaction) =>\n Effect.gen(function* () {\n const guards: Array<PreparedCommit<void>> = [];\n const postconditions: Array<PasswordPreparedPostcondition> = [];\n let poisoned = false;\n let acceptingPostconditions = true;\n\n const services = yield* makeSqlPasswordPreparedPersistence(\n transaction as unknown as PasswordSqlDatabase,\n mapping,\n passwordOptions(configuration, proofMapping, true),\n );\n\n const protect = <Out, Err, Env>(effect: Effect.Effect<Out, Err, Env>) =>\n effect.pipe(\n Effect.onError(() =>\n Effect.sync(() => {\n poisoned = true;\n }),\n ),\n );\n\n const value = yield* owner(transaction, {\n passwordPreparedPersistence: {\n reserve: (input, prepare) => protect(services.reserve(input, prepare)),\n publishReady: (input, prepare) => protect(services.publishReady(input, prepare)),\n context: (input) => protect(services.context(input)),\n complete: (input, prepare) => protect(services.complete(input, prepare)),\n resetWithProof: (input, prepare) =>\n protect(services.resetWithProof(input, prepare)),\n cancel: (input, prepare) => protect(services.cancel(input, prepare)),\n cleanup: (input, prepare) => protect(services.cleanup(input, prepare)),\n },\n }).pipe(\n Effect.provideService(PasswordPreparedJournalGuards, {\n register: (guard) => {\n if (!acceptingPostconditions) return false;\n guards.push(guard);\n\n return true;\n },\n }),\n Effect.provideService(PasswordPreparedPostconditions, {\n register: (check) => {\n if (!acceptingPostconditions) return false;\n postconditions.push(check);\n\n return true;\n },\n }),\n Effect.ensuring(\n Effect.sync(() => {\n acceptingPostconditions = false;\n }),\n ),\n );\n\n if (poisoned) return yield* PasswordUnavailable.make({});\n for (const guard of guards) {\n const status = yield* Effect.result(guard.read);\n\n if (status._tag === \"Success\" || status.failure._tag !== \"CommitPending\")\n return yield* PasswordUnavailable.make({});\n }\n\n for (const check of postconditions)\n yield* check.pipe(\n Effect.provideService(\n CurrentPasswordPreparedTransaction,\n transaction as unknown as PasswordSqlDatabase,\n ),\n Effect.catchCause((cause) =>\n Effect.failCause(Cause.map(cause, () => PasswordUnavailable.make({}))),\n ),\n );\n\n return value;\n }),\n ),\n { mode: configuration.mode },\n ).pipe(Effect.provideService(LifecycleHooks, hooks));\n\n return result.value;\n });\n\nexport const passwordPreparedPersistenceLayer = <Id>(\n tag: Context.Key<Id, PasswordPreparedPersistence>,\n services: Effect.Effect<\n { readonly passwordPreparedPersistence: PasswordPreparedPersistence },\n never,\n LifecycleHooks\n >,\n) =>\n Layer.effect(\n tag,\n Effect.map(services, (value) => value.passwordPreparedPersistence),\n );\n"],"mappings":";;;;;;;AAyBA,MAAa,iDACX,UACA,SACA,eACA,iBAEA,OAAO,IAAI,aAAa;CACtB,OAAO,EACL,6BAA6B,OAAO,mCAClC,UACA,SACA,gBAAgB,eAAe,YAAY,CAC7C,EACF;AACF,CAAC;AAEH,MAAa,+CACX,UAKA,SACA,eACA,cACA,UAKA,OAAO,IAAI,aAAa;CACtB,MAAM,QAAQ,OAAO;CAErB,IAAI,OAAO,gBAAgB,OAAO,OAAO,oBAAoB,KAAK,CAAC,CAAC;CACpE,OAAO,cAAc,oBAAoB,cAAc;CAsFvD,QAAO,OApFe,uBAElB,SAAS,aAAa,gBACpB,OAAO,IAAI,aAAa;EACtB,MAAM,SAAsC,CAAC;EAC7C,MAAM,iBAAuD,CAAC;EAC9D,IAAI,WAAW;EACf,IAAI,0BAA0B;EAE9B,MAAM,WAAW,OAAO,mCACtB,aACA,SACA,gBAAgB,eAAe,cAAc,IAAI,CACnD;EAEA,MAAM,WAA0B,WAC9B,OAAO,KACL,OAAO,cACL,OAAO,WAAW;GAChB,WAAW;EACb,CAAC,CACH,CACF;EAEF,MAAM,QAAQ,OAAO,MAAM,aAAa,EACtC,6BAA6B;GAC3B,UAAU,OAAO,YAAY,QAAQ,SAAS,QAAQ,OAAO,OAAO,CAAC;GACrE,eAAe,OAAO,YAAY,QAAQ,SAAS,aAAa,OAAO,OAAO,CAAC;GAC/E,UAAU,UAAU,QAAQ,SAAS,QAAQ,KAAK,CAAC;GACnD,WAAW,OAAO,YAAY,QAAQ,SAAS,SAAS,OAAO,OAAO,CAAC;GACvE,iBAAiB,OAAO,YACtB,QAAQ,SAAS,eAAe,OAAO,OAAO,CAAC;GACjD,SAAS,OAAO,YAAY,QAAQ,SAAS,OAAO,OAAO,OAAO,CAAC;GACnE,UAAU,OAAO,YAAY,QAAQ,SAAS,QAAQ,OAAO,OAAO,CAAC;EACvE,EACF,CAAC,CAAC,CAAC,KACD,OAAO,eAAe,+BAA+B,EACnD,WAAW,UAAU;GACnB,IAAI,CAAC,yBAAyB,OAAO;GACrC,OAAO,KAAK,KAAK;GAEjB,OAAO;EACT,EACF,CAAC,GACD,OAAO,eAAe,gCAAgC,EACpD,WAAW,UAAU;GACnB,IAAI,CAAC,yBAAyB,OAAO;GACrC,eAAe,KAAK,KAAK;GAEzB,OAAO;EACT,EACF,CAAC,GACD,OAAO,SACL,OAAO,WAAW;GAChB,0BAA0B;EAC5B,CAAC,CACH,CACF;EAEA,IAAI,UAAU,OAAO,OAAO,oBAAoB,KAAK,CAAC,CAAC;EACvD,KAAK,MAAM,SAAS,QAAQ;GAC1B,MAAM,SAAS,OAAO,OAAO,OAAO,MAAM,IAAI;GAE9C,IAAI,OAAO,SAAS,aAAa,OAAO,QAAQ,SAAS,iBACvD,OAAO,OAAO,oBAAoB,KAAK,CAAC,CAAC;EAC7C;EAEA,KAAK,MAAM,SAAS,gBAClB,OAAO,MAAM,KACX,OAAO,eACL,oCACA,WACF,GACA,OAAO,YAAY,UACjB,OAAO,UAAU,MAAM,IAAI,aAAa,oBAAoB,KAAK,CAAC,CAAC,CAAC,CAAC,CACvE,CACF;EAEF,OAAO;CACT,CAAC,CACH,GACF,EAAE,MAAM,cAAc,KAAK,CAC7B,CAAC,CAAC,KAAK,OAAO,eAAe,gBAAgB,KAAK,CAAC,EAAA,CAErC;AAChB,CAAC;AAEH,MAAa,oCACX,KACA,aAMA,MAAM,OACJ,KACA,OAAO,IAAI,WAAW,UAAU,MAAM,2BAA2B,CACnE"}
@@ -0,0 +1,7 @@
1
+ import "./password-model.mjs";
2
+ import "./password-sql.mjs";
3
+ import { PasswordRegistrationAuthority } from "@yielded/auth-persistence/Adapter";
4
+ import { Effect } from "effect";
5
+ import { LifecycleHooks } from "@yielded/auth/Hooks";
6
+ import { PasswordUnavailable } from "@yielded/auth/Password";
7
+ export type { PasswordRegistrationAuthority };
@@ -0,0 +1,134 @@
1
+ import { requiredPasswordRegistrationConstraints } from "./password-model.mjs";
2
+ import { PersistenceMappingError, column, isMappedConstraintConflict } from "./model.mjs";
3
+ import { CurrentProofSql } from "./proof-sql.mjs";
4
+ import { CurrentPasswordSql } from "./password-sql.mjs";
5
+ import { and, eq } from "drizzle-orm";
6
+ import { Cause, Effect, Schema } from "effect";
7
+ import { CurrentCommitJournal, HookConfigurationError, LifecycleHooks, coordinateCommit, hasCommitScope } from "@yielded/auth/Hooks";
8
+ import { reportPersistenceFailure } from "@yielded/auth/Persistence";
9
+ import { ProofUnavailable } from "@yielded/auth/Proofs";
10
+ import { PasswordUnavailable } from "@yielded/auth/Password";
11
+ //#region src/drizzle/password-registration.ts
12
+ const unavailable = () => PasswordUnavailable.make({});
13
+ const translateFailure = (effect) => reportPersistenceFailure(effect, (error) => Schema.is(PasswordUnavailable)(error) || Schema.is(ProofUnavailable)(error) || Schema.is(HookConfigurationError)(error)).pipe(Effect.catchCause((cause) => Effect.failCause(Cause.map(cause, () => unavailable()))));
14
+ const validConstraints = (mapping) => Object.entries(requiredPasswordRegistrationConstraints).every(([key, value]) => mapping.constraints[key] === value);
15
+ const selectRows = (query, locking) => locking && typeof query.for === "function" ? query.for("update") : query;
16
+ const allocate = (mode, asyncValue, syncValue) => {
17
+ if (mode === "synchronous") return syncValue === void 0 ? Effect.fail(unavailable()) : Effect.try({
18
+ try: syncValue,
19
+ catch: (cause) => new PersistenceMappingError({
20
+ operation: "mapping",
21
+ cause
22
+ })
23
+ });
24
+ if (asyncValue !== void 0) return asyncValue;
25
+ return syncValue === void 0 ? Effect.fail(unavailable()) : Effect.try({
26
+ try: syncValue,
27
+ catch: (cause) => new PersistenceMappingError({
28
+ operation: "mapping",
29
+ cause
30
+ })
31
+ });
32
+ };
33
+ const registrationRows = Effect.fn("Drizzle.registrationRows")(function* (mapping, moduleId, requestId, locking) {
34
+ const database = yield* CurrentPasswordSql;
35
+ const module = column(mapping.registration.table, mapping.registration.moduleId);
36
+ const request = column(mapping.registration.table, mapping.registration.requestId);
37
+ const query = database.select().from(mapping.registration.table).where(and(eq(module, moduleId), eq(request, requestId))).limit(1);
38
+ return yield* selectRows(query, locking);
39
+ });
40
+ const registerIn = Effect.fn("DrizzlePasswordRegistration.registerIn")(function* (mapping, configuration, input, allocated, prepare) {
41
+ const database = yield* CurrentPasswordSql;
42
+ const journal = yield* CurrentCommitJournal;
43
+ const existing = (yield* registrationRows(mapping, input.moduleId, input.requestId, configuration.locking))[0];
44
+ if (existing !== void 0) return prepare(yield* mapping.registration.decodeReplay(existing), journal);
45
+ const intent = {
46
+ moduleId: input.moduleId,
47
+ requestId: input.requestId,
48
+ identifier: input.identifier,
49
+ registration: input.registration,
50
+ replacement: input.replacement
51
+ };
52
+ if (mapping.mode === "pending") {
53
+ if (allocated.recoveryReference === void 0) return yield* unavailable();
54
+ const receipt = prepare({
55
+ _tag: "Pending",
56
+ reference: allocated.recoveryReference
57
+ }, journal);
58
+ yield* database.insert(mapping.registration.table).values(mapping.registration.encodeInsert(intent, {
59
+ state: "pending",
60
+ recoveryReference: allocated.recoveryReference
61
+ }));
62
+ return receipt;
63
+ }
64
+ let nativeSubjectId = allocated.nativeSubjectId;
65
+ const subjectInsert = database.insert(mapping.subject.table).values(mapping.provisioning.encodeSubjectInsert(intent, {
66
+ nativeSubjectId,
67
+ securityRevision: allocated.securityRevision
68
+ }));
69
+ if (mapping.provisioning.idMode === "generated") {
70
+ const rows = yield* configuration.generatedSubjectRows(subjectInsert);
71
+ nativeSubjectId = yield* mapping.provisioning.decodeGeneratedId(rows);
72
+ } else yield* subjectInsert;
73
+ if (nativeSubjectId === void 0) return yield* unavailable();
74
+ const receipt = prepare({
75
+ _tag: "Created",
76
+ subjectId: yield* mapping.subjectId.toSubject(nativeSubjectId)
77
+ }, journal);
78
+ yield* database.insert(mapping.identifier.table).values(mapping.identifier.encodeInitialInsert(input.identifier, nativeSubjectId, allocated.identifierRevision));
79
+ yield* database.insert(mapping.credential.table).values(mapping.credential.encodeInsert({
80
+ moduleId: input.moduleId,
81
+ subjectId: nativeSubjectId,
82
+ credentialId: allocated.credentialId,
83
+ credentialRevision: allocated.credentialRevision,
84
+ verifierVersion: allocated.verifierVersion,
85
+ replacement: input.replacement
86
+ }));
87
+ yield* database.insert(mapping.authorityCredential.table).values(mapping.authorityCredential.encodeInsert({
88
+ subjectId: nativeSubjectId,
89
+ credentialId: allocated.credentialId,
90
+ revision: allocated.credentialRevision
91
+ }));
92
+ yield* database.insert(mapping.registration.table).values(mapping.registration.encodeInsert(intent, {
93
+ state: "created",
94
+ nativeSubjectId
95
+ }));
96
+ return receipt;
97
+ });
98
+ const makeSqlPasswordRegistrationAuthority = Effect.fn("makeSqlPasswordRegistrationAuthority")(function* (database, mapping, configuration) {
99
+ const hooks = yield* LifecycleHooks;
100
+ return { register: (input, prepare) => Effect.gen(function* () {
101
+ if (!validConstraints(mapping)) return yield* unavailable();
102
+ const credentialId = yield* allocate(configuration.mode, mapping.allocateCredentialId, mapping.allocateCredentialIdSync);
103
+ const securityRevision = yield* allocate(configuration.mode, mapping.allocateRevision, mapping.allocateRevisionSync);
104
+ const credentialRevision = yield* allocate(configuration.mode, mapping.allocateRevision, mapping.allocateRevisionSync);
105
+ const identifierRevision = yield* allocate(configuration.mode, mapping.allocateRevision, mapping.allocateRevisionSync);
106
+ const verifierVersion = yield* allocate(configuration.mode, mapping.allocateRevision, mapping.allocateRevisionSync);
107
+ const nativeSubjectId = mapping.mode !== "atomic" || mapping.provisioning.idMode === "generated" ? void 0 : yield* allocate(configuration.mode, mapping.provisioning.allocateSubjectId, mapping.provisioning.allocateSubjectIdSync);
108
+ const recoveryReference = mapping.mode === "pending" ? yield* allocate(configuration.mode, mapping.allocateRecoveryReference, mapping.allocateRecoveryReferenceSync) : void 0;
109
+ const run = coordinateCommit(() => database.transaction((transaction) => registerIn(mapping, configuration, input, {
110
+ credentialId,
111
+ securityRevision,
112
+ identifierRevision,
113
+ credentialRevision,
114
+ verifierVersion,
115
+ ...nativeSubjectId === void 0 ? {} : { nativeSubjectId },
116
+ ...recoveryReference === void 0 ? {} : { recoveryReference }
117
+ }, prepare).pipe(Effect.provideService(CurrentPasswordSql, transaction), Effect.provideService(CurrentProofSql, transaction))), { mode: configuration.mode }).pipe(Effect.map((result) => result.value));
118
+ return yield* (configuration.coordinated !== true ? Effect.gen(function* () {
119
+ if (yield* hasCommitScope) return yield* unavailable();
120
+ yield* configuration.standaloneGuard;
121
+ return yield* run;
122
+ }) : run).pipe(Effect.catchCause((cause) => {
123
+ if (cause.reasons.every(Cause.isFailReason) && isMappedConstraintConflict(mapping.isRequestConflict, cause) || cause.reasons.every(Cause.isFailReason) && isMappedConstraintConflict(mapping.isIdentifierConflict, cause) || cause.reasons.every(Cause.isFailReason) && isMappedConstraintConflict(mapping.isCredentialConflict, cause)) return coordinateCommit((journal) => database.transaction((transaction) => Effect.gen(function* () {
124
+ const row = (yield* registrationRows(mapping, input.moduleId, input.requestId, configuration.locking))[0];
125
+ return prepare(row === void 0 ? { _tag: "Suppressed" } : yield* mapping.registration.decodeReplay(row), journal);
126
+ }).pipe(Effect.provideService(CurrentPasswordSql, transaction), Effect.provideService(CurrentProofSql, transaction))), { mode: configuration.mode }).pipe(Effect.map((result) => result.value));
127
+ return Effect.failCause(cause);
128
+ }));
129
+ }).pipe(Effect.provideService(CurrentPasswordSql, database), Effect.provideService(LifecycleHooks, hooks), translateFailure) };
130
+ });
131
+ //#endregion
132
+ export { makeSqlPasswordRegistrationAuthority };
133
+
134
+ //# sourceMappingURL=password-registration.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"password-registration.mjs","names":[],"sources":["../../src/drizzle/password-registration.ts"],"sourcesContent":["import {\n coordinateCommit,\n CurrentCommitJournal,\n hasCommitScope,\n LifecycleHooks,\n HookConfigurationError,\n} from \"@yielded/auth/Hooks\";\nimport type { LoginIdentifier } from \"@yielded/auth/Identity\";\nimport {\n PasswordUnavailable,\n type PasswordReplacement,\n type PasswordRegistrationDecision,\n type PreparePasswordCommit,\n} from \"@yielded/auth/Password\";\nimport { reportPersistenceFailure } from \"@yielded/auth/Persistence\";\nimport { ProofUnavailable } from \"@yielded/auth/Proofs\";\n/* oxlint-disable no-explicit-any -- registration plans bridge consumer-owned Drizzle rows. */\nimport { and, eq } from \"drizzle-orm\";\nimport { Cause, Effect, Schema } from \"effect\";\n\nimport { column, isMappedConstraintConflict, PersistenceMappingError } from \"./model\";\nimport {\n type AnyPasswordRegistrationMapping,\n requiredPasswordRegistrationConstraints,\n} from \"./password-model\";\nimport {\n CurrentPasswordSql,\n type PasswordSqlDatabase,\n type PasswordSqlQuery,\n} from \"./password-sql\";\nimport { CurrentProofSql, type ProofSqlDatabase } from \"./proof-sql\";\n\ntype Database = PasswordSqlDatabase;\ntype Mapping<Registration> = AnyPasswordRegistrationMapping<Registration>;\nconst unavailable = () => PasswordUnavailable.make({});\n\nconst translateFailure = <A, E, R>(\n effect: Effect.Effect<A, E, R>,\n): Effect.Effect<A, PasswordUnavailable, R> =>\n reportPersistenceFailure(\n effect,\n (error) =>\n Schema.is(PasswordUnavailable)(error) ||\n Schema.is(ProofUnavailable)(error) ||\n Schema.is(HookConfigurationError)(error),\n ).pipe(Effect.catchCause((cause) => Effect.failCause(Cause.map(cause, () => unavailable()))));\n\nimport type { PasswordRegistrationAuthority } from \"@yielded/auth-persistence/Adapter\";\nexport type { PasswordRegistrationAuthority } from \"@yielded/auth-persistence/Adapter\";\n\nexport interface PasswordRegistrationConfiguration {\n readonly mode: \"interactive\" | \"synchronous\";\n readonly locking: boolean;\n readonly standaloneGuard: Effect.Effect<void, PasswordUnavailable>;\n readonly coordinated?: boolean;\n readonly generatedSubjectRows: (query: PasswordSqlQuery) => PasswordSqlQuery;\n}\n\nconst validConstraints = <Registration>(mapping: Mapping<Registration>) =>\n Object.entries(requiredPasswordRegistrationConstraints).every(\n ([key, value]) =>\n mapping.constraints[key as keyof typeof requiredPasswordRegistrationConstraints] === value,\n );\n\nconst selectRows = (query: PasswordSqlQuery, locking: boolean) =>\n locking && typeof query.for === \"function\" ? query.for(\"update\") : query;\n\nconst allocate = <A>(\n mode: PasswordRegistrationConfiguration[\"mode\"],\n asyncValue: Effect.Effect<A, PersistenceMappingError> | undefined,\n syncValue: (() => A) | undefined,\n) => {\n if (mode === \"synchronous\")\n return syncValue === undefined\n ? Effect.fail(unavailable())\n : Effect.try({\n try: syncValue,\n catch: (cause) => new PersistenceMappingError({ operation: \"mapping\", cause }),\n });\n if (asyncValue !== undefined) return asyncValue;\n\n return syncValue === undefined\n ? Effect.fail(unavailable())\n : Effect.try({\n try: syncValue,\n catch: (cause) => new PersistenceMappingError({ operation: \"mapping\", cause }),\n });\n};\n\nconst registrationRows = Effect.fn(\"Drizzle.registrationRows\")(function* <Registration>(\n mapping: Mapping<Registration>,\n moduleId: string,\n requestId: string,\n locking: boolean,\n) {\n const database = yield* CurrentPasswordSql;\n\n const module = column(mapping.registration.table, mapping.registration.moduleId);\n const request = column(mapping.registration.table, mapping.registration.requestId);\n\n const query = database\n .select()\n .from(mapping.registration.table)\n .where(and(eq(module, moduleId), eq(request, requestId)))\n .limit(1);\n\n return yield* selectRows(query, locking);\n});\n\nconst registerIn = Effect.fn(\"DrizzlePasswordRegistration.registerIn\")(function* <Registration, A>(\n mapping: Mapping<Registration>,\n configuration: PasswordRegistrationConfiguration,\n input: {\n readonly moduleId: string;\n readonly requestId: string;\n readonly identifier: LoginIdentifier;\n readonly registration: Registration;\n readonly replacement: PasswordReplacement;\n },\n allocated: {\n readonly credentialId: string;\n readonly securityRevision: any;\n readonly identifierRevision: any;\n readonly credentialRevision: any;\n readonly verifierVersion: any;\n readonly nativeSubjectId?: unknown;\n readonly recoveryReference?: any;\n },\n prepare: PreparePasswordCommit<PasswordRegistrationDecision, A>,\n) {\n const database = yield* CurrentPasswordSql;\n const journal = yield* CurrentCommitJournal;\n\n const existing = (yield* registrationRows(\n mapping,\n input.moduleId,\n input.requestId,\n configuration.locking,\n ))[0];\n\n if (existing !== undefined)\n return prepare(yield* mapping.registration.decodeReplay(existing), journal);\n\n const intent = {\n moduleId: input.moduleId,\n requestId: input.requestId,\n identifier: input.identifier,\n registration: input.registration,\n replacement: input.replacement,\n };\n\n if (mapping.mode === \"pending\") {\n if (allocated.recoveryReference === undefined) return yield* unavailable();\n const receipt = prepare({ _tag: \"Pending\", reference: allocated.recoveryReference }, journal);\n\n yield* database.insert(mapping.registration.table).values(\n mapping.registration.encodeInsert(intent, {\n state: \"pending\",\n recoveryReference: allocated.recoveryReference,\n }),\n );\n\n return receipt;\n }\n let nativeSubjectId = allocated.nativeSubjectId;\n\n const subjectInsert = database.insert(mapping.subject.table).values(\n mapping.provisioning.encodeSubjectInsert(intent, {\n nativeSubjectId,\n securityRevision: allocated.securityRevision,\n }),\n );\n\n if (mapping.provisioning.idMode === \"generated\") {\n const rows = yield* configuration.generatedSubjectRows(subjectInsert);\n\n nativeSubjectId = yield* mapping.provisioning.decodeGeneratedId(rows);\n } else yield* subjectInsert;\n if (nativeSubjectId === undefined) return yield* unavailable();\n const subjectId = yield* mapping.subjectId.toSubject(nativeSubjectId);\n const receipt = prepare({ _tag: \"Created\", subjectId }, journal);\n\n yield* database\n .insert(mapping.identifier.table)\n .values(\n mapping.identifier.encodeInitialInsert(\n input.identifier,\n nativeSubjectId,\n allocated.identifierRevision,\n ),\n );\n yield* database.insert(mapping.credential.table).values(\n mapping.credential.encodeInsert({\n moduleId: input.moduleId,\n subjectId: nativeSubjectId,\n credentialId: allocated.credentialId,\n credentialRevision: allocated.credentialRevision,\n verifierVersion: allocated.verifierVersion,\n replacement: input.replacement,\n }),\n );\n yield* database.insert(mapping.authorityCredential.table).values(\n mapping.authorityCredential.encodeInsert({\n subjectId: nativeSubjectId,\n credentialId: allocated.credentialId,\n revision: allocated.credentialRevision,\n }),\n );\n yield* database.insert(mapping.registration.table).values(\n mapping.registration.encodeInsert(intent, {\n state: \"created\",\n nativeSubjectId,\n }),\n );\n\n return receipt;\n});\n\nexport const makeSqlPasswordRegistrationAuthority = Effect.fn(\n \"makeSqlPasswordRegistrationAuthority\",\n)(function* <Registration>(\n database: Database,\n mapping: Mapping<Registration>,\n configuration: PasswordRegistrationConfiguration,\n): Effect.fn.Return<PasswordRegistrationAuthority<Registration>, never, LifecycleHooks> {\n const hooks = yield* LifecycleHooks;\n\n return {\n register: (input, prepare) =>\n Effect.gen(function* () {\n if (!validConstraints(mapping)) return yield* unavailable();\n\n const credentialId = yield* allocate(\n configuration.mode,\n mapping.allocateCredentialId,\n mapping.allocateCredentialIdSync,\n );\n\n const securityRevision = yield* allocate(\n configuration.mode,\n mapping.allocateRevision,\n mapping.allocateRevisionSync,\n );\n\n const credentialRevision = yield* allocate(\n configuration.mode,\n mapping.allocateRevision,\n mapping.allocateRevisionSync,\n );\n\n const identifierRevision = yield* allocate(\n configuration.mode,\n mapping.allocateRevision,\n mapping.allocateRevisionSync,\n );\n\n const verifierVersion = yield* allocate(\n configuration.mode,\n mapping.allocateRevision,\n mapping.allocateRevisionSync,\n );\n\n const nativeSubjectId =\n mapping.mode !== \"atomic\" || mapping.provisioning.idMode === \"generated\"\n ? undefined\n : yield* allocate(\n configuration.mode,\n mapping.provisioning.allocateSubjectId,\n mapping.provisioning.allocateSubjectIdSync,\n );\n\n const recoveryReference =\n mapping.mode === \"pending\"\n ? yield* allocate(\n configuration.mode,\n mapping.allocateRecoveryReference,\n mapping.allocateRecoveryReferenceSync,\n )\n : undefined;\n\n const run = coordinateCommit(\n () =>\n database.transaction((transaction) =>\n registerIn(\n mapping,\n configuration,\n input,\n {\n credentialId,\n securityRevision,\n identifierRevision,\n credentialRevision,\n verifierVersion,\n ...(nativeSubjectId === undefined ? {} : { nativeSubjectId }),\n ...(recoveryReference === undefined ? {} : { recoveryReference }),\n },\n prepare,\n ).pipe(\n Effect.provideService(CurrentPasswordSql, transaction),\n Effect.provideService(CurrentProofSql, transaction as unknown as ProofSqlDatabase),\n ),\n ),\n { mode: configuration.mode },\n ).pipe(Effect.map((result) => result.value));\n\n const guarded =\n configuration.coordinated !== true\n ? Effect.gen(function* () {\n if (yield* hasCommitScope) return yield* unavailable();\n yield* configuration.standaloneGuard;\n\n return yield* run;\n })\n : run;\n\n return yield* guarded.pipe(\n Effect.catchCause((cause) => {\n if (\n (cause.reasons.every(Cause.isFailReason) &&\n isMappedConstraintConflict(mapping.isRequestConflict, cause)) ||\n (cause.reasons.every(Cause.isFailReason) &&\n isMappedConstraintConflict(mapping.isIdentifierConflict, cause)) ||\n (cause.reasons.every(Cause.isFailReason) &&\n isMappedConstraintConflict(mapping.isCredentialConflict, cause))\n )\n return coordinateCommit(\n (journal) =>\n database.transaction((transaction) =>\n Effect.gen(function* () {\n const row = (yield* registrationRows(\n mapping,\n input.moduleId,\n input.requestId,\n configuration.locking,\n ))[0];\n\n const decision =\n row === undefined\n ? ({ _tag: \"Suppressed\" } as const)\n : yield* mapping.registration.decodeReplay(row);\n\n return prepare(decision, journal);\n }).pipe(\n Effect.provideService(CurrentPasswordSql, transaction),\n Effect.provideService(\n CurrentProofSql,\n transaction as unknown as ProofSqlDatabase,\n ),\n ),\n ),\n { mode: configuration.mode },\n ).pipe(Effect.map((result) => result.value));\n\n return Effect.failCause(cause);\n }),\n );\n }).pipe(\n Effect.provideService(CurrentPasswordSql, database),\n Effect.provideService(LifecycleHooks, hooks),\n translateFailure,\n ),\n };\n});\n"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ import "@yielded/auth-persistence/Adapter";
@@ -0,0 +1,9 @@
1
+ import { drizzleQueryOperations } from "./query-operations.mjs";
2
+ import { completeProofPlanIn } from "./proof-sql.mjs";
3
+ import { CurrentPasswordSql, makePasswordKernel } from "@yielded/auth-persistence/Adapter";
4
+ //#region src/drizzle/password-sql.ts
5
+ const { makeSqlPasswordPersistence, passwordSqlKernel } = makePasswordKernel(drizzleQueryOperations, { completeProofPlanIn });
6
+ //#endregion
7
+ export { CurrentPasswordSql, makeSqlPasswordPersistence, passwordSqlKernel };
8
+
9
+ //# sourceMappingURL=password-sql.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"password-sql.mjs","names":[],"sources":["../../src/drizzle/password-sql.ts"],"sourcesContent":["import { makePasswordKernel } from \"@yielded/auth-persistence/Adapter\";\n\nimport { completeProofPlanIn } from \"./proof-sql\";\nimport { drizzleQueryOperations } from \"./query-operations\";\nexport type { PasswordSqlQuery } from \"@yielded/auth-persistence/Adapter\";\nexport type { PasswordSqlDatabase } from \"@yielded/auth-persistence/Adapter\";\nexport { CurrentPasswordSql } from \"@yielded/auth-persistence/Adapter\";\nexport type { PasswordSqlConfiguration } from \"@yielded/auth-persistence/Adapter\";\n\nexport const { makeSqlPasswordPersistence, passwordSqlKernel } = makePasswordKernel(\n drizzleQueryOperations,\n { completeProofPlanIn },\n);\n"],"mappings":";;;;AASA,MAAa,EAAE,4BAA4B,sBAAsB,mBAC/D,wBACA,EAAE,oBAAoB,CACxB"}
@@ -0,0 +1,16 @@
1
+ import "./proof-target.mjs";
2
+ import "./password-sql.mjs";
3
+ import { PasswordRegistrationAuthority } from "./password-registration.mjs";
4
+ import { Context, Effect, Layer } from "effect";
5
+ import { HookConfigurationError, LifecycleHooks } from "@yielded/auth/Hooks";
6
+ import { PasswordPersistence, PasswordUnavailable } from "@yielded/auth/Password";
7
+ import "effect/unstable/sql/SqlError";
8
+ //#region src/drizzle/password-target.d.ts
9
+ export declare const passwordPersistenceLayer: (services: Effect.Effect<{
10
+ readonly passwordPersistence: PasswordPersistence["Service"];
11
+ }, never, LifecycleHooks>) => Layer.Layer<PasswordPersistence, never, LifecycleHooks>;
12
+ export declare const passwordRegistrationLayer: <Id, Registration>(tag: Context.Key<Id, PasswordRegistrationAuthority<Registration>>, services: Effect.Effect<{
13
+ readonly registrationAuthority: PasswordRegistrationAuthority<Registration>;
14
+ }, never, LifecycleHooks>) => Layer.Layer<Id, never, LifecycleHooks>;
15
+ //#endregion
16
+ //# sourceMappingURL=password-target.d.mts.map
@@ -0,0 +1,61 @@
1
+ import { sqlClientStandaloneGuard } from "./standalone-guard.mjs";
2
+ import { makeSqlPasswordPersistence } from "./password-sql.mjs";
3
+ import { makeSqlPasswordRegistrationAuthority } from "./password-registration.mjs";
4
+ import { Effect, Layer } from "effect";
5
+ import { LifecycleHooks, coordinateCommit, hasCommitScope } from "@yielded/auth/Hooks";
6
+ import { PasswordPersistence, PasswordUnavailable } from "@yielded/auth/Password";
7
+ //#region src/drizzle/password-target.ts
8
+ const sqlClientPasswordStandaloneGuard = (database) => sqlClientStandaloneGuard(database, () => PasswordUnavailable.make({}));
9
+ const passwordOptions = (configuration, proofMapping, coordinated = false) => ({
10
+ mode: configuration.mode,
11
+ locking: configuration.locking,
12
+ standaloneGuard: !coordinated ? configuration.standaloneGuard : Effect.void,
13
+ insertIfAbsent: configuration.insertIfAbsent,
14
+ coordinated,
15
+ ...proofMapping === void 0 ? {} : { proof: {
16
+ mapping: proofMapping,
17
+ configuration: {
18
+ mode: configuration.proof.mode,
19
+ locking: configuration.proof.locking,
20
+ standaloneGuard: Effect.void,
21
+ coordinated,
22
+ insertIfAbsent: configuration.proof.insertIfAbsent
23
+ }
24
+ } }
25
+ });
26
+ const registrationOptions = (configuration, coordinated = false) => ({
27
+ mode: configuration.mode,
28
+ locking: configuration.locking,
29
+ standaloneGuard: !coordinated ? configuration.standaloneGuard : Effect.void,
30
+ generatedSubjectRows: configuration.generatedSubjectRows,
31
+ coordinated
32
+ });
33
+ const makeTargetPasswordPersistenceServices = (database, mapping, configuration, proofMapping) => Effect.gen(function* () {
34
+ return { passwordPersistence: yield* makeSqlPasswordPersistence(database, mapping, passwordOptions(configuration, proofMapping)) };
35
+ });
36
+ const makeTargetPasswordRegistrationServices = (database, mapping, configuration) => Effect.gen(function* () {
37
+ return { registrationAuthority: yield* makeSqlPasswordRegistrationAuthority(database, mapping, registrationOptions(configuration)) };
38
+ });
39
+ /** Native transaction acquisition exposes SqlError; caller errors propagate unchanged. */
40
+ const coordinateTargetPasswordPersistence = (database, mapping, configuration, proofMapping, owner) => Effect.gen(function* () {
41
+ const hooks = yield* LifecycleHooks;
42
+ if (yield* hasCommitScope) return yield* PasswordUnavailable.make({});
43
+ yield* configuration.coordinatorGuard ?? configuration.standaloneGuard;
44
+ return (yield* coordinateCommit(() => database.transaction((transaction) => Effect.gen(function* () {
45
+ return yield* owner(transaction, { passwordPersistence: yield* makeSqlPasswordPersistence(transaction, mapping, passwordOptions(configuration, proofMapping, true)) });
46
+ })), { mode: configuration.mode }).pipe(Effect.provideService(LifecycleHooks, hooks))).value;
47
+ });
48
+ const coordinateTargetPasswordRegistration = (database, mapping, configuration, owner) => Effect.gen(function* () {
49
+ const hooks = yield* LifecycleHooks;
50
+ if (yield* hasCommitScope) return yield* PasswordUnavailable.make({});
51
+ yield* configuration.coordinatorGuard ?? configuration.standaloneGuard;
52
+ return (yield* coordinateCommit(() => database.transaction((transaction) => Effect.gen(function* () {
53
+ return yield* owner(transaction, { registrationAuthority: yield* makeSqlPasswordRegistrationAuthority(transaction, mapping, registrationOptions(configuration, true)) });
54
+ })), { mode: configuration.mode }).pipe(Effect.provideService(LifecycleHooks, hooks))).value;
55
+ });
56
+ const passwordPersistenceLayer = (services) => Layer.effect(PasswordPersistence, Effect.map(services, (value) => value.passwordPersistence));
57
+ const passwordRegistrationLayer = (tag, services) => Layer.effect(tag, Effect.map(services, (value) => value.registrationAuthority));
58
+ //#endregion
59
+ export { coordinateTargetPasswordPersistence, coordinateTargetPasswordRegistration, makeTargetPasswordPersistenceServices, makeTargetPasswordRegistrationServices, passwordOptions, passwordPersistenceLayer, passwordRegistrationLayer, sqlClientPasswordStandaloneGuard };
60
+
61
+ //# sourceMappingURL=password-target.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"password-target.mjs","names":[],"sources":["../../src/drizzle/password-target.ts"],"sourcesContent":["import {\n coordinateCommit,\n hasCommitScope,\n LifecycleHooks,\n type HookConfigurationError,\n} from \"@yielded/auth/Hooks\";\nimport { PasswordUnavailable, PasswordPersistence } from \"@yielded/auth/Password\";\n/* oxlint-disable no-explicit-any -- public driver wrappers restore concrete Drizzle generics. */\nimport { type Context, Effect, Layer } from \"effect\";\nimport type * as SqlError from \"effect/unstable/sql/SqlError\";\n\nimport {\n makeSqlPasswordRegistrationAuthority,\n type PasswordRegistrationAuthority,\n type PasswordRegistrationConfiguration,\n} from \"./password-registration\";\nimport {\n makeSqlPasswordPersistence,\n type PasswordSqlConfiguration,\n type PasswordSqlDatabase,\n type PasswordSqlQuery,\n} from \"./password-sql\";\nimport type { ProofTargetConfiguration } from \"./proof-target\";\nimport { sqlClientStandaloneGuard } from \"./standalone-guard\";\n\nexport interface PasswordTargetConfiguration {\n readonly mode: \"interactive\" | \"synchronous\";\n readonly locking: boolean;\n readonly standaloneGuard: Effect.Effect<void, PasswordUnavailable>;\n readonly coordinatorGuard?: Effect.Effect<void, PasswordUnavailable>;\n readonly insertIfAbsent: (\n query: PasswordSqlQuery,\n selfKey: string,\n selfValue: unknown,\n ) => PasswordSqlQuery;\n readonly generatedSubjectRows: (query: PasswordSqlQuery) => PasswordSqlQuery;\n readonly proof: ProofTargetConfiguration;\n}\n\ninterface TransactionOwner<Transaction> {\n readonly transaction: <A, E, R>(\n body: (transaction: Transaction) => Effect.Effect<A, E, R>,\n ) => Effect.Effect<A, E | SqlError.SqlError, R>;\n}\n\nexport type PasswordCoordinatorError<E> =\n | E\n | PasswordUnavailable\n | HookConfigurationError\n | SqlError.SqlError;\n\nexport const sqlClientPasswordStandaloneGuard = (\n database: unknown,\n): Effect.Effect<void, PasswordUnavailable> =>\n sqlClientStandaloneGuard(database, () => PasswordUnavailable.make({}));\n\nexport const passwordOptions = (\n configuration: PasswordTargetConfiguration,\n proofMapping?: any,\n coordinated = false,\n): PasswordSqlConfiguration => ({\n mode: configuration.mode,\n locking: configuration.locking,\n\n standaloneGuard: !coordinated ? configuration.standaloneGuard : Effect.void,\n insertIfAbsent: configuration.insertIfAbsent,\n coordinated,\n ...(proofMapping === undefined\n ? {}\n : {\n proof: {\n mapping: proofMapping,\n configuration: {\n mode: configuration.proof.mode,\n locking: configuration.proof.locking,\n\n standaloneGuard: Effect.void,\n\n coordinated,\n insertIfAbsent: configuration.proof.insertIfAbsent,\n },\n },\n }),\n});\n\nconst registrationOptions = (\n configuration: PasswordTargetConfiguration,\n coordinated = false,\n): PasswordRegistrationConfiguration => ({\n mode: configuration.mode,\n locking: configuration.locking,\n\n standaloneGuard: !coordinated ? configuration.standaloneGuard : Effect.void,\n generatedSubjectRows: configuration.generatedSubjectRows,\n coordinated,\n});\n\nexport const makeTargetPasswordPersistenceServices = (\n database: any,\n mapping: any,\n configuration: PasswordTargetConfiguration,\n proofMapping?: any,\n) =>\n Effect.gen(function* () {\n return {\n passwordPersistence: yield* makeSqlPasswordPersistence(\n database,\n mapping,\n passwordOptions(configuration, proofMapping),\n ),\n };\n });\n\nexport const makeTargetPasswordRegistrationServices = <Registration>(\n database: any,\n mapping: any,\n configuration: PasswordTargetConfiguration,\n) =>\n Effect.gen(function* () {\n return {\n registrationAuthority: yield* makeSqlPasswordRegistrationAuthority<Registration>(\n database,\n mapping,\n registrationOptions(configuration),\n ),\n };\n });\n\n/** Native transaction acquisition exposes SqlError; caller errors propagate unchanged. */\nexport const coordinateTargetPasswordPersistence = <Transaction, A, E, R>(\n database: TransactionOwner<Transaction>,\n mapping: any,\n configuration: PasswordTargetConfiguration,\n proofMapping: any | undefined,\n owner: (\n transaction: Transaction,\n services: { readonly passwordPersistence: PasswordPersistence[\"Service\"] },\n ) => Effect.Effect<A, E, R>,\n): Effect.Effect<A, PasswordCoordinatorError<E>, R | LifecycleHooks> =>\n Effect.gen(function* (): Effect.fn.Return<A, PasswordCoordinatorError<E>, R | LifecycleHooks> {\n const hooks = yield* LifecycleHooks;\n\n if (yield* hasCommitScope) return yield* PasswordUnavailable.make({});\n yield* configuration.coordinatorGuard ?? configuration.standaloneGuard;\n\n const result = yield* coordinateCommit(\n () =>\n database.transaction((transaction) =>\n Effect.gen(function* () {\n return yield* owner(transaction, {\n passwordPersistence: yield* makeSqlPasswordPersistence(\n transaction as unknown as PasswordSqlDatabase,\n mapping,\n passwordOptions(configuration, proofMapping, true),\n ),\n });\n }),\n ),\n { mode: configuration.mode },\n ).pipe(Effect.provideService(LifecycleHooks, hooks));\n\n return result.value;\n });\n\nexport const coordinateTargetPasswordRegistration = <Registration, Transaction, A, E, R>(\n database: TransactionOwner<Transaction>,\n mapping: any,\n configuration: PasswordTargetConfiguration,\n owner: (\n transaction: Transaction,\n services: {\n readonly registrationAuthority: PasswordRegistrationAuthority<Registration>;\n },\n ) => Effect.Effect<A, E, R>,\n): Effect.Effect<A, PasswordCoordinatorError<E>, R | LifecycleHooks> =>\n Effect.gen(function* (): Effect.fn.Return<A, PasswordCoordinatorError<E>, R | LifecycleHooks> {\n const hooks = yield* LifecycleHooks;\n\n if (yield* hasCommitScope) return yield* PasswordUnavailable.make({});\n yield* configuration.coordinatorGuard ?? configuration.standaloneGuard;\n\n const result = yield* coordinateCommit(\n () =>\n database.transaction((transaction) =>\n Effect.gen(function* () {\n return yield* owner(transaction, {\n registrationAuthority: yield* makeSqlPasswordRegistrationAuthority<Registration>(\n transaction as unknown as PasswordSqlDatabase,\n mapping,\n registrationOptions(configuration, true),\n ),\n });\n }),\n ),\n { mode: configuration.mode },\n ).pipe(Effect.provideService(LifecycleHooks, hooks));\n\n return result.value;\n });\n\nexport const passwordPersistenceLayer = (\n services: Effect.Effect<\n { readonly passwordPersistence: PasswordPersistence[\"Service\"] },\n never,\n LifecycleHooks\n >,\n) =>\n Layer.effect(\n PasswordPersistence,\n Effect.map(services, (value) => value.passwordPersistence),\n );\n\nexport const passwordRegistrationLayer = <Id, Registration>(\n tag: Context.Key<Id, PasswordRegistrationAuthority<Registration>>,\n services: Effect.Effect<\n { readonly registrationAuthority: PasswordRegistrationAuthority<Registration> },\n never,\n LifecycleHooks\n >,\n) =>\n Layer.effect(\n tag,\n Effect.map(services, (value) => value.registrationAuthority),\n );\n"],"mappings":";;;;;;;AAmDA,MAAa,oCACX,aAEA,yBAAyB,gBAAgB,oBAAoB,KAAK,CAAC,CAAC,CAAC;AAEvE,MAAa,mBACX,eACA,cACA,cAAc,WACgB;CAC9B,MAAM,cAAc;CACpB,SAAS,cAAc;CAEvB,iBAAiB,CAAC,cAAc,cAAc,kBAAkB,OAAO;CACvE,gBAAgB,cAAc;CAC9B;CACA,GAAI,iBAAiB,KAAA,IACjB,CAAC,IACD,EACE,OAAO;EACL,SAAS;EACT,eAAe;GACb,MAAM,cAAc,MAAM;GAC1B,SAAS,cAAc,MAAM;GAE7B,iBAAiB,OAAO;GAExB;GACA,gBAAgB,cAAc,MAAM;EACtC;CACF,EACF;AACN;AAEA,MAAM,uBACJ,eACA,cAAc,WACyB;CACvC,MAAM,cAAc;CACpB,SAAS,cAAc;CAEvB,iBAAiB,CAAC,cAAc,cAAc,kBAAkB,OAAO;CACvE,sBAAsB,cAAc;CACpC;AACF;AAEA,MAAa,yCACX,UACA,SACA,eACA,iBAEA,OAAO,IAAI,aAAa;CACtB,OAAO,EACL,qBAAqB,OAAO,2BAC1B,UACA,SACA,gBAAgB,eAAe,YAAY,CAC7C,EACF;AACF,CAAC;AAEH,MAAa,0CACX,UACA,SACA,kBAEA,OAAO,IAAI,aAAa;CACtB,OAAO,EACL,uBAAuB,OAAO,qCAC5B,UACA,SACA,oBAAoB,aAAa,CACnC,EACF;AACF,CAAC;;AAGH,MAAa,uCACX,UACA,SACA,eACA,cACA,UAKA,OAAO,IAAI,aAAmF;CAC5F,MAAM,QAAQ,OAAO;CAErB,IAAI,OAAO,gBAAgB,OAAO,OAAO,oBAAoB,KAAK,CAAC,CAAC;CACpE,OAAO,cAAc,oBAAoB,cAAc;CAkBvD,QAAO,OAhBe,uBAElB,SAAS,aAAa,gBACpB,OAAO,IAAI,aAAa;EACtB,OAAO,OAAO,MAAM,aAAa,EAC/B,qBAAqB,OAAO,2BAC1B,aACA,SACA,gBAAgB,eAAe,cAAc,IAAI,CACnD,EACF,CAAC;CACH,CAAC,CACH,GACF,EAAE,MAAM,cAAc,KAAK,CAC7B,CAAC,CAAC,KAAK,OAAO,eAAe,gBAAgB,KAAK,CAAC,EAAA,CAErC;AAChB,CAAC;AAEH,MAAa,wCACX,UACA,SACA,eACA,UAOA,OAAO,IAAI,aAAmF;CAC5F,MAAM,QAAQ,OAAO;CAErB,IAAI,OAAO,gBAAgB,OAAO,OAAO,oBAAoB,KAAK,CAAC,CAAC;CACpE,OAAO,cAAc,oBAAoB,cAAc;CAkBvD,QAAO,OAhBe,uBAElB,SAAS,aAAa,gBACpB,OAAO,IAAI,aAAa;EACtB,OAAO,OAAO,MAAM,aAAa,EAC/B,uBAAuB,OAAO,qCAC5B,aACA,SACA,oBAAoB,eAAe,IAAI,CACzC,EACF,CAAC;CACH,CAAC,CACH,GACF,EAAE,MAAM,cAAc,KAAK,CAC7B,CAAC,CAAC,KAAK,OAAO,eAAe,gBAAgB,KAAK,CAAC,EAAA,CAErC;AAChB,CAAC;AAEH,MAAa,4BACX,aAMA,MAAM,OACJ,qBACA,OAAO,IAAI,WAAW,UAAU,MAAM,mBAAmB,CAC3D;AAEF,MAAa,6BACX,KACA,aAMA,MAAM,OACJ,KACA,OAAO,IAAI,WAAW,UAAU,MAAM,qBAAqB,CAC7D"}
@@ -0,0 +1,71 @@
1
+ import { EmailAddressMapping, EmailRegistrationMapping, EmailSignInMapping } from "./email-model.mjs";
2
+ import { ProofPersistenceMapping } from "./proof-model.mjs";
3
+ import { EmailRegistrationAuthority } from "./email-registration.mjs";
4
+ import { SuppliedService } from "./SuppliedService.mjs";
5
+ import { AnyRelations } from "drizzle-orm";
6
+ import { Effect } from "effect";
7
+ import { HookConfigurationError, LifecycleHooks } from "@yielded/auth/Hooks";
8
+ import { EmailAddressPersistence, EmailUnavailable } from "@yielded/auth/Email";
9
+ import { EffectPgDatabase } from "drizzle-orm/effect-pglite";
10
+ import { AnyPgTable } from "drizzle-orm/pg-core";
11
+ import { EffectPgDatabase as EffectPgDatabase$1 } from "drizzle-orm/effect-postgres";
12
+ import { SqlError } from "effect/unstable/sql/SqlError";
13
+ //#region src/drizzle/pg-emails.d.ts
14
+ type Database = EffectPgDatabase$1<AnyRelations> | EffectPgDatabase<AnyRelations>;
15
+ type TransactionOf<D extends Database> = Parameters<Parameters<D["transaction"]>[0]>[0];
16
+ type ProofMapping = ProofPersistenceMapping<any, any, any, any, any, any, any, any, any, any, any, any>;
17
+ export declare const makePgEmailSignInServices: <S extends AnyPgTable, I extends AnyPgTable, C extends AnyPgTable, NativeId>(database: Database, mapping: EmailSignInMapping<S, I, C, NativeId>) => Effect.Effect<{
18
+ emailSignInTargets: {
19
+ readonly lookup: (input: {
20
+ readonly moduleId: string;
21
+ readonly identifier: import("@yielded/auth/Identity").LoginIdentifier;
22
+ }) => Effect.Effect<import("effect/Option").Option<import("@yielded/auth/Email").EmailCredentialSnapshot>, EmailUnavailable>;
23
+ };
24
+ }, never, never>;
25
+ export declare const makePgEmailAddressServices: <S extends AnyPgTable, I extends AnyPgTable, C extends AnyPgTable, AC extends AnyPgTable, M extends AnyPgTable, NativeId>(database: Database, mapping: EmailAddressMapping<S, I, C, AC, M, NativeId>, proofMapping: ProofMapping) => Effect.Effect<{
26
+ emailAddressPersistence: {
27
+ readonly target: (input: {
28
+ readonly moduleId: string;
29
+ readonly subjectId: import("@yielded/auth/Schema").SubjectId;
30
+ readonly target: import("@yielded/auth/Identity").LoginIdentifier;
31
+ readonly sourceCredentialId?: string;
32
+ }) => Effect.Effect<import("@yielded/auth/Email").EmailAddressTarget, EmailUnavailable>;
33
+ readonly checkCompletion: (input: import("@yielded/auth/Proofs").ProofCompletionInput) => Effect.Effect<boolean, EmailUnavailable>;
34
+ readonly verifyWithProof: <A>(input: import("@yielded/auth/Email").EmailAddressMutation, prepare: import("@yielded/auth/Email").PrepareEmailCommit<import("@yielded/auth/Email").EmailAddressDecision, A>) => Effect.Effect<import("@yielded/auth/Hooks").PreparedCommit<A>, EmailUnavailable>;
35
+ readonly changeWithProof: <A>(input: import("@yielded/auth/Email").EmailAddressMutation, prepare: import("@yielded/auth/Email").PrepareEmailCommit<import("@yielded/auth/Email").EmailAddressDecision, A>) => Effect.Effect<import("@yielded/auth/Hooks").PreparedCommit<A>, EmailUnavailable>;
36
+ readonly cleanup: <A>(input: {
37
+ readonly moduleId: string;
38
+ readonly limit: number;
39
+ }, prepare: import("@yielded/auth/Email").PrepareEmailCommit<{
40
+ readonly removed: number;
41
+ readonly hasMore: boolean;
42
+ }, A>) => Effect.Effect<import("@yielded/auth/Hooks").PreparedCommit<A>, EmailUnavailable>;
43
+ };
44
+ }, never, LifecycleHooks>;
45
+ export declare function coordinatePgEmailAddress<D extends Database, S extends AnyPgTable, I extends AnyPgTable, C extends AnyPgTable, AC extends AnyPgTable, M extends AnyPgTable, NativeId, Out, E, R, DatabaseError, DatabaseRequirements>(acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>, options: {
46
+ readonly mapping: EmailAddressMapping<S, I, C, AC, M, NativeId>;
47
+ readonly proofMapping: ProofMapping;
48
+ readonly transaction?: never;
49
+ }, body: Effect.Effect<Out, E, R>): Effect.Effect<Out, E | EmailUnavailable | HookConfigurationError | SqlError | DatabaseError, Exclude<R, EmailAddressPersistence> | LifecycleHooks | DatabaseRequirements>;
50
+ export declare function coordinatePgEmailAddress<D extends Database, S extends AnyPgTable, I extends AnyPgTable, C extends AnyPgTable, AC extends AnyPgTable, M extends AnyPgTable, NativeId, Out, E, R, DatabaseError, DatabaseRequirements, TxId, TxShape>(acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>, options: {
51
+ readonly mapping: EmailAddressMapping<S, I, C, AC, M, NativeId>;
52
+ readonly proofMapping: ProofMapping;
53
+ readonly transaction: SuppliedService<TxId, NoInfer<TransactionOf<D>>, TxShape>;
54
+ }, body: Effect.Effect<Out, E, R>): Effect.Effect<Out, E | EmailUnavailable | HookConfigurationError | SqlError | DatabaseError, Exclude<R, EmailAddressPersistence | TxId> | LifecycleHooks | DatabaseRequirements>;
55
+ export declare const makePgEmailRegistrationServices: <Registration, S extends AnyPgTable, I extends AnyPgTable, C extends AnyPgTable, AC extends AnyPgTable, Rq extends AnyPgTable, NativeId>(database: Database, mapping: EmailRegistrationMapping<Registration, S, I, C, AC, Rq, NativeId>, proofMapping: ProofMapping) => Effect.Effect<{
56
+ registrationAuthority: EmailRegistrationAuthority<Registration>;
57
+ }, never, LifecycleHooks>;
58
+ export declare function coordinatePgEmailRegistration<TargetId, Registration, D extends Database, S extends AnyPgTable, I extends AnyPgTable, C extends AnyPgTable, AC extends AnyPgTable, Rq extends AnyPgTable, NativeId, Out, E, R, DatabaseError, DatabaseRequirements>(acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>, options: {
59
+ readonly mapping: EmailRegistrationMapping<NoInfer<Registration>, S, I, C, AC, Rq, NativeId>;
60
+ readonly proofMapping: ProofMapping;
61
+ readonly target: SuppliedService<TargetId, EmailRegistrationAuthority<Registration>>;
62
+ readonly transaction?: never;
63
+ }, body: Effect.Effect<Out, E, R>): Effect.Effect<Out, E | EmailUnavailable | HookConfigurationError | SqlError | DatabaseError, Exclude<R, TargetId> | LifecycleHooks | DatabaseRequirements>;
64
+ export declare function coordinatePgEmailRegistration<TargetId, Registration, D extends Database, S extends AnyPgTable, I extends AnyPgTable, C extends AnyPgTable, AC extends AnyPgTable, Rq extends AnyPgTable, NativeId, Out, E, R, DatabaseError, DatabaseRequirements, TxId, TxShape>(acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>, options: {
65
+ readonly mapping: EmailRegistrationMapping<NoInfer<Registration>, S, I, C, AC, Rq, NativeId>;
66
+ readonly proofMapping: ProofMapping;
67
+ readonly target: SuppliedService<TargetId, EmailRegistrationAuthority<Registration>>;
68
+ readonly transaction: SuppliedService<TxId, NoInfer<TransactionOf<D>>, TxShape>;
69
+ }, body: Effect.Effect<Out, E, R>): Effect.Effect<Out, E | EmailUnavailable | HookConfigurationError | SqlError | DatabaseError, Exclude<R, TargetId | TxId> | LifecycleHooks | DatabaseRequirements>;
70
+ //#endregion
71
+ //# sourceMappingURL=pg-emails.d.mts.map