@yielded/auth-persistence 0.1.0-beta.7

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 (526) hide show
  1. package/README.md +21 -0
  2. package/dist/Drizzle.d.mts +28 -0
  3. package/dist/Drizzle.mjs +28 -0
  4. package/dist/DrizzleD1.d.mts +963 -0
  5. package/dist/DrizzleD1.mjs +29 -0
  6. package/dist/DrizzleD1.mjs.map +1 -0
  7. package/dist/DrizzleLibsql.d.mts +2284 -0
  8. package/dist/DrizzleLibsql.mjs +92 -0
  9. package/dist/DrizzleLibsql.mjs.map +1 -0
  10. package/dist/DrizzleMysql2.d.mts +1820 -0
  11. package/dist/DrizzleMysql2.mjs +55 -0
  12. package/dist/DrizzleMysql2.mjs.map +1 -0
  13. package/dist/DrizzlePglite.d.mts +1826 -0
  14. package/dist/DrizzlePglite.mjs +53 -0
  15. package/dist/DrizzlePglite.mjs.map +1 -0
  16. package/dist/DrizzlePostgres.d.mts +1826 -0
  17. package/dist/DrizzlePostgres.mjs +53 -0
  18. package/dist/DrizzlePostgres.mjs.map +1 -0
  19. package/dist/DrizzleSqliteBun.d.mts +2279 -0
  20. package/dist/DrizzleSqliteBun.mjs +70 -0
  21. package/dist/DrizzleSqliteBun.mjs.map +1 -0
  22. package/dist/DrizzleSqliteDo.d.mts +2329 -0
  23. package/dist/DrizzleSqliteDo.mjs +105 -0
  24. package/dist/DrizzleSqliteDo.mjs.map +1 -0
  25. package/dist/DrizzleSqliteNode.d.mts +2279 -0
  26. package/dist/DrizzleSqliteNode.mjs +70 -0
  27. package/dist/DrizzleSqliteNode.mjs.map +1 -0
  28. package/dist/DrizzleSqliteWasm.d.mts +2282 -0
  29. package/dist/DrizzleSqliteWasm.mjs +70 -0
  30. package/dist/DrizzleSqliteWasm.mjs.map +1 -0
  31. package/dist/drizzle/D1BatchStatements.d.mts +11 -0
  32. package/dist/drizzle/D1BatchStatements.mjs +8 -0
  33. package/dist/drizzle/D1BatchStatements.mjs.map +1 -0
  34. package/dist/drizzle/PasswordPreparedPostconditions.mjs +12 -0
  35. package/dist/drizzle/PasswordPreparedPostconditions.mjs.map +1 -0
  36. package/dist/drizzle/SuppliedService.d.mts +10 -0
  37. package/dist/drizzle/d1-emails.d.mts +62 -0
  38. package/dist/drizzle/d1-emails.mjs +580 -0
  39. package/dist/drizzle/d1-emails.mjs.map +1 -0
  40. package/dist/drizzle/d1-generated-statement.d.mts +2 -0
  41. package/dist/drizzle/d1-generated-statement.mjs +79 -0
  42. package/dist/drizzle/d1-generated-statement.mjs.map +1 -0
  43. package/dist/drizzle/d1-identity.d.mts +31 -0
  44. package/dist/drizzle/d1-identity.mjs +119 -0
  45. package/dist/drizzle/d1-identity.mjs.map +1 -0
  46. package/dist/drizzle/d1-oauth.d.mts +301 -0
  47. package/dist/drizzle/d1-oauth.mjs +76 -0
  48. package/dist/drizzle/d1-oauth.mjs.map +1 -0
  49. package/dist/drizzle/d1-passkey.d.mts +51 -0
  50. package/dist/drizzle/d1-passkey.mjs +95 -0
  51. package/dist/drizzle/d1-passkey.mjs.map +1 -0
  52. package/dist/drizzle/d1-password-prepared.d.mts +25 -0
  53. package/dist/drizzle/d1-password-prepared.mjs +461 -0
  54. package/dist/drizzle/d1-password-prepared.mjs.map +1 -0
  55. package/dist/drizzle/d1-passwords.d.mts +87 -0
  56. package/dist/drizzle/d1-passwords.mjs +1004 -0
  57. package/dist/drizzle/d1-passwords.mjs.map +1 -0
  58. package/dist/drizzle/d1-phone.d.mts +26 -0
  59. package/dist/drizzle/d1-phone.mjs +30 -0
  60. package/dist/drizzle/d1-phone.mjs.map +1 -0
  61. package/dist/drizzle/d1-planning.d.mts +12 -0
  62. package/dist/drizzle/d1-planning.mjs +43 -0
  63. package/dist/drizzle/d1-planning.mjs.map +1 -0
  64. package/dist/drizzle/d1-proofs.d.mts +80 -0
  65. package/dist/drizzle/d1-proofs.mjs +830 -0
  66. package/dist/drizzle/d1-proofs.mjs.map +1 -0
  67. package/dist/drizzle/d1-sessions.d.mts +67 -0
  68. package/dist/drizzle/d1-sessions.mjs +966 -0
  69. package/dist/drizzle/d1-sessions.mjs.map +1 -0
  70. package/dist/drizzle/d1-totp.d.mts +26 -0
  71. package/dist/drizzle/d1-totp.mjs +27 -0
  72. package/dist/drizzle/d1-totp.mjs.map +1 -0
  73. package/dist/drizzle/email-model.d.mts +354 -0
  74. package/dist/drizzle/email-model.mjs +21 -0
  75. package/dist/drizzle/email-model.mjs.map +1 -0
  76. package/dist/drizzle/email-registration.d.mts +30 -0
  77. package/dist/drizzle/email-registration.mjs +238 -0
  78. package/dist/drizzle/email-registration.mjs.map +1 -0
  79. package/dist/drizzle/email-sql.d.mts +4 -0
  80. package/dist/drizzle/email-sql.mjs +9 -0
  81. package/dist/drizzle/email-sql.mjs.map +1 -0
  82. package/dist/drizzle/email-target.d.mts +20 -0
  83. package/dist/drizzle/email-target.mjs +72 -0
  84. package/dist/drizzle/email-target.mjs.map +1 -0
  85. package/dist/drizzle/model.d.mts +250 -0
  86. package/dist/drizzle/model.mjs +58 -0
  87. package/dist/drizzle/model.mjs.map +1 -0
  88. package/dist/drizzle/mysql-emails.d.mts +71 -0
  89. package/dist/drizzle/mysql-emails.mjs +38 -0
  90. package/dist/drizzle/mysql-emails.mjs.map +1 -0
  91. package/dist/drizzle/mysql-identity.d.mts +22 -0
  92. package/dist/drizzle/mysql-identity.mjs +94 -0
  93. package/dist/drizzle/mysql-identity.mjs.map +1 -0
  94. package/dist/drizzle/mysql-password-prepared.d.mts +30 -0
  95. package/dist/drizzle/mysql-password-prepared.mjs +16 -0
  96. package/dist/drizzle/mysql-password-prepared.mjs.map +1 -0
  97. package/dist/drizzle/mysql-passwords.d.mts +86 -0
  98. package/dist/drizzle/mysql-passwords.mjs +38 -0
  99. package/dist/drizzle/mysql-passwords.mjs.map +1 -0
  100. package/dist/drizzle/mysql-proofs.d.mts +75 -0
  101. package/dist/drizzle/mysql-proofs.mjs +23 -0
  102. package/dist/drizzle/mysql-proofs.mjs.map +1 -0
  103. package/dist/drizzle/mysql-sessions.d.mts +237 -0
  104. package/dist/drizzle/mysql-sessions.mjs +53 -0
  105. package/dist/drizzle/mysql-sessions.mjs.map +1 -0
  106. package/dist/drizzle/mysql.d.mts +70 -0
  107. package/dist/drizzle/mysql.mjs +218 -0
  108. package/dist/drizzle/mysql.mjs.map +1 -0
  109. package/dist/drizzle/oauth-accounts.mjs +358 -0
  110. package/dist/drizzle/oauth-accounts.mjs.map +1 -0
  111. package/dist/drizzle/oauth-connected-access.mjs +210 -0
  112. package/dist/drizzle/oauth-connected-access.mjs.map +1 -0
  113. package/dist/drizzle/oauth-connected-collection.mjs +202 -0
  114. package/dist/drizzle/oauth-connected-collection.mjs.map +1 -0
  115. package/dist/drizzle/oauth-connected-custody.mjs +146 -0
  116. package/dist/drizzle/oauth-connected-custody.mjs.map +1 -0
  117. package/dist/drizzle/oauth-connected-drivers.mjs +76 -0
  118. package/dist/drizzle/oauth-connected-drivers.mjs.map +1 -0
  119. package/dist/drizzle/oauth-connected-flow.mjs +247 -0
  120. package/dist/drizzle/oauth-connected-flow.mjs.map +1 -0
  121. package/dist/drizzle/oauth-connected-input.mjs +103 -0
  122. package/dist/drizzle/oauth-connected-input.mjs.map +1 -0
  123. package/dist/drizzle/oauth-connected-maintenance.mjs +214 -0
  124. package/dist/drizzle/oauth-connected-maintenance.mjs.map +1 -0
  125. package/dist/drizzle/oauth-connected-management.mjs +228 -0
  126. package/dist/drizzle/oauth-connected-management.mjs.map +1 -0
  127. package/dist/drizzle/oauth-connected-model.d.mts +278 -0
  128. package/dist/drizzle/oauth-connected-model.mjs +22 -0
  129. package/dist/drizzle/oauth-connected-model.mjs.map +1 -0
  130. package/dist/drizzle/oauth-connected-reference.d.mts +17 -0
  131. package/dist/drizzle/oauth-connected-reference.mjs +53 -0
  132. package/dist/drizzle/oauth-connected-reference.mjs.map +1 -0
  133. package/dist/drizzle/oauth-connected-settlement.mjs +117 -0
  134. package/dist/drizzle/oauth-connected-settlement.mjs.map +1 -0
  135. package/dist/drizzle/oauth-connected-state.d.mts +14 -0
  136. package/dist/drizzle/oauth-connected-state.mjs +422 -0
  137. package/dist/drizzle/oauth-connected-state.mjs.map +1 -0
  138. package/dist/drizzle/oauth-connected-target.d.mts +753 -0
  139. package/dist/drizzle/oauth-connected-target.mjs +91 -0
  140. package/dist/drizzle/oauth-connected-target.mjs.map +1 -0
  141. package/dist/drizzle/oauth-drivers.mjs +51 -0
  142. package/dist/drizzle/oauth-drivers.mjs.map +1 -0
  143. package/dist/drizzle/oauth-flow.d.mts +5 -0
  144. package/dist/drizzle/oauth-flow.mjs +253 -0
  145. package/dist/drizzle/oauth-flow.mjs.map +1 -0
  146. package/dist/drizzle/oauth-input.mjs +127 -0
  147. package/dist/drizzle/oauth-input.mjs.map +1 -0
  148. package/dist/drizzle/oauth-model.d.mts +463 -0
  149. package/dist/drizzle/oauth-model.mjs +49 -0
  150. package/dist/drizzle/oauth-model.mjs.map +1 -0
  151. package/dist/drizzle/oauth-mysql.mjs +8 -0
  152. package/dist/drizzle/oauth-mysql.mjs.map +1 -0
  153. package/dist/drizzle/oauth-owner.d.mts +4 -0
  154. package/dist/drizzle/oauth-owner.mjs +10 -0
  155. package/dist/drizzle/oauth-owner.mjs.map +1 -0
  156. package/dist/drizzle/oauth-registration.d.mts +6 -0
  157. package/dist/drizzle/oauth-registration.mjs +374 -0
  158. package/dist/drizzle/oauth-registration.mjs.map +1 -0
  159. package/dist/drizzle/oauth-state.mjs +107 -0
  160. package/dist/drizzle/oauth-state.mjs.map +1 -0
  161. package/dist/drizzle/oauth-target.d.mts +111 -0
  162. package/dist/drizzle/oauth-target.mjs +246 -0
  163. package/dist/drizzle/oauth-target.mjs.map +1 -0
  164. package/dist/drizzle/passkey-drivers.mjs +34 -0
  165. package/dist/drizzle/passkey-drivers.mjs.map +1 -0
  166. package/dist/drizzle/passkey-kernel.mjs +8 -0
  167. package/dist/drizzle/passkey-kernel.mjs.map +1 -0
  168. package/dist/drizzle/passkey-model.d.mts +272 -0
  169. package/dist/drizzle/passkey-model.mjs +34 -0
  170. package/dist/drizzle/passkey-model.mjs.map +1 -0
  171. package/dist/drizzle/passkey-registration-ceremony-model.d.mts +50 -0
  172. package/dist/drizzle/passkey-registration-ceremony-model.mjs +18 -0
  173. package/dist/drizzle/passkey-registration-ceremony-model.mjs.map +1 -0
  174. package/dist/drizzle/passkey-state.mjs +7 -0
  175. package/dist/drizzle/passkey-state.mjs.map +1 -0
  176. package/dist/drizzle/passkey-target.d.mts +9 -0
  177. package/dist/drizzle/passkey-target.mjs +7 -0
  178. package/dist/drizzle/passkey-target.mjs.map +1 -0
  179. package/dist/drizzle/passkey-write-drivers.mjs +32 -0
  180. package/dist/drizzle/passkey-write-drivers.mjs.map +1 -0
  181. package/dist/drizzle/passkey-write-model.d.mts +190 -0
  182. package/dist/drizzle/passkey-write-model.mjs +13 -0
  183. package/dist/drizzle/passkey-write-model.mjs.map +1 -0
  184. package/dist/drizzle/passkey-write-target.d.mts +11 -0
  185. package/dist/drizzle/passkey-write-target.mjs +7 -0
  186. package/dist/drizzle/passkey-write-target.mjs.map +1 -0
  187. package/dist/drizzle/password-model.d.mts +329 -0
  188. package/dist/drizzle/password-model.mjs +23 -0
  189. package/dist/drizzle/password-model.mjs.map +1 -0
  190. package/dist/drizzle/password-prepared-model.d.mts +94 -0
  191. package/dist/drizzle/password-prepared-model.mjs +11 -0
  192. package/dist/drizzle/password-prepared-model.mjs.map +1 -0
  193. package/dist/drizzle/password-prepared-sql.mjs +390 -0
  194. package/dist/drizzle/password-prepared-sql.mjs.map +1 -0
  195. package/dist/drizzle/password-prepared-state.mjs +104 -0
  196. package/dist/drizzle/password-prepared-state.mjs.map +1 -0
  197. package/dist/drizzle/password-prepared-target.d.mts +12 -0
  198. package/dist/drizzle/password-prepared-target.mjs +56 -0
  199. package/dist/drizzle/password-prepared-target.mjs.map +1 -0
  200. package/dist/drizzle/password-registration.d.mts +19 -0
  201. package/dist/drizzle/password-registration.mjs +135 -0
  202. package/dist/drizzle/password-registration.mjs.map +1 -0
  203. package/dist/drizzle/password-sql.d.mts +5 -0
  204. package/dist/drizzle/password-sql.mjs +9 -0
  205. package/dist/drizzle/password-sql.mjs.map +1 -0
  206. package/dist/drizzle/password-target.d.mts +17 -0
  207. package/dist/drizzle/password-target.mjs +61 -0
  208. package/dist/drizzle/password-target.mjs.map +1 -0
  209. package/dist/drizzle/pg-emails.d.mts +72 -0
  210. package/dist/drizzle/pg-emails.mjs +38 -0
  211. package/dist/drizzle/pg-emails.mjs.map +1 -0
  212. package/dist/drizzle/pg-password-prepared.d.mts +31 -0
  213. package/dist/drizzle/pg-password-prepared.mjs +16 -0
  214. package/dist/drizzle/pg-password-prepared.mjs.map +1 -0
  215. package/dist/drizzle/pg-passwords.d.mts +87 -0
  216. package/dist/drizzle/pg-passwords.mjs +38 -0
  217. package/dist/drizzle/pg-passwords.mjs.map +1 -0
  218. package/dist/drizzle/pg-proofs.d.mts +76 -0
  219. package/dist/drizzle/pg-proofs.mjs +22 -0
  220. package/dist/drizzle/pg-proofs.mjs.map +1 -0
  221. package/dist/drizzle/pg-sessions.d.mts +238 -0
  222. package/dist/drizzle/pg-sessions.mjs +53 -0
  223. package/dist/drizzle/pg-sessions.mjs.map +1 -0
  224. package/dist/drizzle/pg.d.mts +81 -0
  225. package/dist/drizzle/pg.mjs +290 -0
  226. package/dist/drizzle/pg.mjs.map +1 -0
  227. package/dist/drizzle/phone-model.d.mts +115 -0
  228. package/dist/drizzle/phone-model.mjs +39 -0
  229. package/dist/drizzle/phone-model.mjs.map +1 -0
  230. package/dist/drizzle/phone-state.mjs +16 -0
  231. package/dist/drizzle/phone-state.mjs.map +1 -0
  232. package/dist/drizzle/phone-target.d.mts +17 -0
  233. package/dist/drizzle/phone-target.mjs +170 -0
  234. package/dist/drizzle/phone-target.mjs.map +1 -0
  235. package/dist/drizzle/proof-model.d.mts +286 -0
  236. package/dist/drizzle/proof-model.mjs +17 -0
  237. package/dist/drizzle/proof-model.mjs.map +1 -0
  238. package/dist/drizzle/proof-sql.d.mts +4 -0
  239. package/dist/drizzle/proof-sql.mjs +8 -0
  240. package/dist/drizzle/proof-sql.mjs.map +1 -0
  241. package/dist/drizzle/proof-target.d.mts +12 -0
  242. package/dist/drizzle/proof-target.mjs +36 -0
  243. package/dist/drizzle/proof-target.mjs.map +1 -0
  244. package/dist/drizzle/query-operations.mjs +26 -0
  245. package/dist/drizzle/query-operations.mjs.map +1 -0
  246. package/dist/drizzle/session-model.d.mts +200 -0
  247. package/dist/drizzle/session-model.mjs +20 -0
  248. package/dist/drizzle/session-model.mjs.map +1 -0
  249. package/dist/drizzle/session-sql.mjs +8 -0
  250. package/dist/drizzle/session-sql.mjs.map +1 -0
  251. package/dist/drizzle/session-target.d.mts +28 -0
  252. package/dist/drizzle/session-target.mjs +47 -0
  253. package/dist/drizzle/session-target.mjs.map +1 -0
  254. package/dist/drizzle/sqlite-emails.mjs +45 -0
  255. package/dist/drizzle/sqlite-emails.mjs.map +1 -0
  256. package/dist/drizzle/sqlite-identity.mjs +91 -0
  257. package/dist/drizzle/sqlite-identity.mjs.map +1 -0
  258. package/dist/drizzle/sqlite-password-prepared.mjs +21 -0
  259. package/dist/drizzle/sqlite-password-prepared.mjs.map +1 -0
  260. package/dist/drizzle/sqlite-passwords.mjs +49 -0
  261. package/dist/drizzle/sqlite-passwords.mjs.map +1 -0
  262. package/dist/drizzle/sqlite-proofs.mjs +29 -0
  263. package/dist/drizzle/sqlite-proofs.mjs.map +1 -0
  264. package/dist/drizzle/sqlite-sessions.mjs +74 -0
  265. package/dist/drizzle/sqlite-sessions.mjs.map +1 -0
  266. package/dist/drizzle/sqlite.d.mts +78 -0
  267. package/dist/drizzle/sqlite.mjs +217 -0
  268. package/dist/drizzle/sqlite.mjs.map +1 -0
  269. package/dist/drizzle/standalone-guard.mjs +19 -0
  270. package/dist/drizzle/standalone-guard.mjs.map +1 -0
  271. package/dist/drizzle/step-up-model.d.mts +65 -0
  272. package/dist/drizzle/step-up-model.mjs +9 -0
  273. package/dist/drizzle/step-up-model.mjs.map +1 -0
  274. package/dist/drizzle/step-up-state.mjs +32 -0
  275. package/dist/drizzle/step-up-state.mjs.map +1 -0
  276. package/dist/drizzle/totp-model.d.mts +84 -0
  277. package/dist/drizzle/totp-model.mjs +13 -0
  278. package/dist/drizzle/totp-model.mjs.map +1 -0
  279. package/dist/drizzle/totp-state.d.mts +38 -0
  280. package/dist/drizzle/totp-state.mjs +287 -0
  281. package/dist/drizzle/totp-state.mjs.map +1 -0
  282. package/dist/drizzle/totp-target.d.mts +17 -0
  283. package/dist/drizzle/totp-target.mjs +81 -0
  284. package/dist/drizzle/totp-target.mjs.map +1 -0
  285. package/dist/drizzle/transaction-execution.d.mts +4 -0
  286. package/dist/drizzle/transaction-execution.mjs +11 -0
  287. package/dist/drizzle/transaction-execution.mjs.map +1 -0
  288. package/dist/drizzle/transaction-mysql.mjs +46 -0
  289. package/dist/drizzle/transaction-mysql.mjs.map +1 -0
  290. package/dist/drizzle/transaction-owner.d.mts +2 -0
  291. package/dist/drizzle/transaction-owner.mjs +8 -0
  292. package/dist/drizzle/transaction-owner.mjs.map +1 -0
  293. package/dist/index.d.mts +5 -0
  294. package/dist/index.mjs +5 -0
  295. package/dist/internal/configuration.d.mts +174 -0
  296. package/dist/internal/configuration.mjs +7 -0
  297. package/dist/internal/configuration.mjs.map +1 -0
  298. package/dist/internal/drizzle-migrations.mjs +19 -0
  299. package/dist/internal/drizzle-migrations.mjs.map +1 -0
  300. package/dist/internal/drizzle-postgres.mjs +39 -0
  301. package/dist/internal/drizzle-postgres.mjs.map +1 -0
  302. package/dist/internal/drizzle-sqlite.mjs +37 -0
  303. package/dist/internal/drizzle-sqlite.mjs.map +1 -0
  304. package/dist/internal/email-kernel.d.mts +13 -0
  305. package/dist/internal/email-kernel.mjs +487 -0
  306. package/dist/internal/email-kernel.mjs.map +1 -0
  307. package/dist/internal/mapping-error.d.mts +11 -0
  308. package/dist/internal/mapping-error.mjs +30 -0
  309. package/dist/internal/mapping-error.mjs.map +1 -0
  310. package/dist/internal/passkey/admission.d.mts +7 -0
  311. package/dist/internal/passkey/admission.mjs +216 -0
  312. package/dist/internal/passkey/admission.mjs.map +1 -0
  313. package/dist/internal/passkey/credentials.d.mts +6 -0
  314. package/dist/internal/passkey/credentials.mjs +249 -0
  315. package/dist/internal/passkey/credentials.mjs.map +1 -0
  316. package/dist/internal/passkey/enrollment.mjs +138 -0
  317. package/dist/internal/passkey/enrollment.mjs.map +1 -0
  318. package/dist/internal/passkey/flow.d.mts +10 -0
  319. package/dist/internal/passkey/flow.mjs +452 -0
  320. package/dist/internal/passkey/flow.mjs.map +1 -0
  321. package/dist/internal/passkey/management.mjs +231 -0
  322. package/dist/internal/passkey/management.mjs.map +1 -0
  323. package/dist/internal/passkey/registration-ceremony.d.mts +9 -0
  324. package/dist/internal/passkey/registration-ceremony.mjs +129 -0
  325. package/dist/internal/passkey/registration-ceremony.mjs.map +1 -0
  326. package/dist/internal/passkey/registration-custody.d.mts +2 -0
  327. package/dist/internal/passkey/registration-custody.mjs +52 -0
  328. package/dist/internal/passkey/registration-custody.mjs.map +1 -0
  329. package/dist/internal/passkey/registration-write.mjs +211 -0
  330. package/dist/internal/passkey/registration-write.mjs.map +1 -0
  331. package/dist/internal/passkey/state.d.mts +5 -0
  332. package/dist/internal/passkey/state.mjs +234 -0
  333. package/dist/internal/passkey/state.mjs.map +1 -0
  334. package/dist/internal/passkey/target.d.mts +19 -0
  335. package/dist/internal/passkey/target.mjs +190 -0
  336. package/dist/internal/passkey/target.mjs.map +1 -0
  337. package/dist/internal/passkey/write-state.mjs +345 -0
  338. package/dist/internal/passkey/write-state.mjs.map +1 -0
  339. package/dist/internal/passkey/write-target.mjs +192 -0
  340. package/dist/internal/passkey/write-target.mjs.map +1 -0
  341. package/dist/internal/passkey-kernel.mjs +49 -0
  342. package/dist/internal/passkey-kernel.mjs.map +1 -0
  343. package/dist/internal/passkeys.mjs +367 -0
  344. package/dist/internal/passkeys.mjs.map +1 -0
  345. package/dist/internal/password-kernel.d.mts +13 -0
  346. package/dist/internal/password-kernel.mjs +704 -0
  347. package/dist/internal/password-kernel.mjs.map +1 -0
  348. package/dist/internal/persistence.mjs +289 -0
  349. package/dist/internal/persistence.mjs.map +1 -0
  350. package/dist/internal/phone-kernel.mjs +434 -0
  351. package/dist/internal/phone-kernel.mjs.map +1 -0
  352. package/dist/internal/proof-kernel.d.mts +9 -0
  353. package/dist/internal/proof-kernel.mjs +619 -0
  354. package/dist/internal/proof-kernel.mjs.map +1 -0
  355. package/dist/internal/query-operations.d.mts +3 -0
  356. package/dist/internal/registration.mjs +65 -0
  357. package/dist/internal/registration.mjs.map +1 -0
  358. package/dist/internal/session-kernel.mjs +737 -0
  359. package/dist/internal/session-kernel.mjs.map +1 -0
  360. package/dist/internal/sql-persistence.d.mts +11 -0
  361. package/dist/internal/sql-persistence.mjs +37 -0
  362. package/dist/internal/sql-persistence.mjs.map +1 -0
  363. package/dist/internal/sql-query.mjs +207 -0
  364. package/dist/internal/sql-query.mjs.map +1 -0
  365. package/dist/internal/sql-table.d.mts +37 -0
  366. package/dist/internal/sql-table.mjs +71 -0
  367. package/dist/internal/sql-table.mjs.map +1 -0
  368. package/dist/internal/storage-mapping.mjs +687 -0
  369. package/dist/internal/storage-mapping.mjs.map +1 -0
  370. package/dist/internal/storage-tables.d.mts +914 -0
  371. package/dist/internal/storage-tables.mjs +387 -0
  372. package/dist/internal/storage-tables.mjs.map +1 -0
  373. package/dist/internal/storage-validation.mjs +58 -0
  374. package/dist/internal/storage-validation.mjs.map +1 -0
  375. package/dist/internal/transaction-execution-kernel.d.mts +18 -0
  376. package/dist/internal/transaction-execution-kernel.mjs +118 -0
  377. package/dist/internal/transaction-execution-kernel.mjs.map +1 -0
  378. package/dist/internal/transaction-kernel.d.mts +7 -0
  379. package/dist/internal/transaction-kernel.mjs +260 -0
  380. package/dist/internal/transaction-kernel.mjs.map +1 -0
  381. package/package.json +1 -0
  382. package/src/Drizzle.ts +378 -0
  383. package/src/DrizzleD1.ts +136 -0
  384. package/src/DrizzleLibsql.ts +301 -0
  385. package/src/DrizzleMysql2.ts +184 -0
  386. package/src/DrizzlePglite.ts +174 -0
  387. package/src/DrizzlePostgres.ts +174 -0
  388. package/src/DrizzleSqliteBun.ts +258 -0
  389. package/src/DrizzleSqliteDo.ts +473 -0
  390. package/src/DrizzleSqliteNode.ts +259 -0
  391. package/src/DrizzleSqliteWasm.ts +263 -0
  392. package/src/drizzle/D1BatchStatements.ts +10 -0
  393. package/src/drizzle/PasswordPreparedPostconditions.ts +30 -0
  394. package/src/drizzle/SuppliedService.ts +10 -0
  395. package/src/drizzle/d1-emails.ts +1829 -0
  396. package/src/drizzle/d1-generated-statement.ts +129 -0
  397. package/src/drizzle/d1-identity.ts +375 -0
  398. package/src/drizzle/d1-oauth.ts +340 -0
  399. package/src/drizzle/d1-passkey.ts +373 -0
  400. package/src/drizzle/d1-password-prepared.ts +1270 -0
  401. package/src/drizzle/d1-passwords.ts +2656 -0
  402. package/src/drizzle/d1-phone.ts +96 -0
  403. package/src/drizzle/d1-planning.ts +104 -0
  404. package/src/drizzle/d1-proofs.ts +2305 -0
  405. package/src/drizzle/d1-sessions.ts +2857 -0
  406. package/src/drizzle/d1-totp.ts +78 -0
  407. package/src/drizzle/email-model.ts +516 -0
  408. package/src/drizzle/email-registration.ts +698 -0
  409. package/src/drizzle/email-sql.ts +24 -0
  410. package/src/drizzle/email-target.ts +243 -0
  411. package/src/drizzle/model.ts +463 -0
  412. package/src/drizzle/mysql-emails.ts +321 -0
  413. package/src/drizzle/mysql-identity.ts +324 -0
  414. package/src/drizzle/mysql-password-prepared.ts +204 -0
  415. package/src/drizzle/mysql-passwords.ts +339 -0
  416. package/src/drizzle/mysql-proofs.ts +181 -0
  417. package/src/drizzle/mysql-sessions.ts +741 -0
  418. package/src/drizzle/mysql.ts +687 -0
  419. package/src/drizzle/oauth-accounts.ts +804 -0
  420. package/src/drizzle/oauth-connected-access.ts +354 -0
  421. package/src/drizzle/oauth-connected-collection.ts +324 -0
  422. package/src/drizzle/oauth-connected-custody.ts +277 -0
  423. package/src/drizzle/oauth-connected-drivers.ts +465 -0
  424. package/src/drizzle/oauth-connected-flow.ts +441 -0
  425. package/src/drizzle/oauth-connected-input.ts +127 -0
  426. package/src/drizzle/oauth-connected-maintenance.ts +345 -0
  427. package/src/drizzle/oauth-connected-management.ts +365 -0
  428. package/src/drizzle/oauth-connected-model.ts +347 -0
  429. package/src/drizzle/oauth-connected-reference.ts +112 -0
  430. package/src/drizzle/oauth-connected-settlement.ts +226 -0
  431. package/src/drizzle/oauth-connected-state.ts +845 -0
  432. package/src/drizzle/oauth-connected-target.ts +264 -0
  433. package/src/drizzle/oauth-drivers.ts +569 -0
  434. package/src/drizzle/oauth-flow.ts +462 -0
  435. package/src/drizzle/oauth-input.ts +201 -0
  436. package/src/drizzle/oauth-model.ts +617 -0
  437. package/src/drizzle/oauth-mysql.ts +10 -0
  438. package/src/drizzle/oauth-owner.ts +29 -0
  439. package/src/drizzle/oauth-registration.ts +640 -0
  440. package/src/drizzle/oauth-state.ts +215 -0
  441. package/src/drizzle/oauth-target.ts +750 -0
  442. package/src/drizzle/passkey-drivers.ts +385 -0
  443. package/src/drizzle/passkey-kernel.ts +3 -0
  444. package/src/drizzle/passkey-model.ts +353 -0
  445. package/src/drizzle/passkey-registration-ceremony-model.ts +69 -0
  446. package/src/drizzle/passkey-state.ts +3 -0
  447. package/src/drizzle/passkey-target.ts +23 -0
  448. package/src/drizzle/passkey-write-drivers.ts +395 -0
  449. package/src/drizzle/passkey-write-model.ts +271 -0
  450. package/src/drizzle/passkey-write-target.ts +9 -0
  451. package/src/drizzle/password-model.ts +491 -0
  452. package/src/drizzle/password-prepared-model.ts +259 -0
  453. package/src/drizzle/password-prepared-sql.ts +1191 -0
  454. package/src/drizzle/password-prepared-state.ts +231 -0
  455. package/src/drizzle/password-prepared-target.ts +160 -0
  456. package/src/drizzle/password-registration.ts +374 -0
  457. package/src/drizzle/password-sql.ts +12 -0
  458. package/src/drizzle/password-target.ts +224 -0
  459. package/src/drizzle/pg-emails.ts +321 -0
  460. package/src/drizzle/pg-password-prepared.ts +205 -0
  461. package/src/drizzle/pg-passwords.ts +338 -0
  462. package/src/drizzle/pg-proofs.ts +191 -0
  463. package/src/drizzle/pg-sessions.ts +750 -0
  464. package/src/drizzle/pg.ts +984 -0
  465. package/src/drizzle/phone-model.ts +190 -0
  466. package/src/drizzle/phone-state.ts +21 -0
  467. package/src/drizzle/phone-target.ts +472 -0
  468. package/src/drizzle/proof-model.ts +398 -0
  469. package/src/drizzle/proof-sql.ts +9 -0
  470. package/src/drizzle/proof-target.ts +122 -0
  471. package/src/drizzle/query-operations.ts +37 -0
  472. package/src/drizzle/session-model.ts +370 -0
  473. package/src/drizzle/session-sql.ts +13 -0
  474. package/src/drizzle/session-target.ts +338 -0
  475. package/src/drizzle/sqlite-emails.ts +366 -0
  476. package/src/drizzle/sqlite-identity.ts +344 -0
  477. package/src/drizzle/sqlite-password-prepared.ts +260 -0
  478. package/src/drizzle/sqlite-passwords.ts +497 -0
  479. package/src/drizzle/sqlite-proofs.ts +202 -0
  480. package/src/drizzle/sqlite-sessions.ts +971 -0
  481. package/src/drizzle/sqlite.ts +705 -0
  482. package/src/drizzle/standalone-guard.ts +38 -0
  483. package/src/drizzle/step-up-model.ts +128 -0
  484. package/src/drizzle/step-up-state.ts +139 -0
  485. package/src/drizzle/totp-model.ts +92 -0
  486. package/src/drizzle/totp-state.ts +525 -0
  487. package/src/drizzle/totp-target.ts +308 -0
  488. package/src/drizzle/transaction-execution.ts +12 -0
  489. package/src/drizzle/transaction-mysql.ts +104 -0
  490. package/src/drizzle/transaction-owner.ts +10 -0
  491. package/src/index.ts +4 -0
  492. package/src/internal/configuration.ts +282 -0
  493. package/src/internal/drizzle-migrations.ts +30 -0
  494. package/src/internal/drizzle-postgres.ts +81 -0
  495. package/src/internal/drizzle-sqlite.ts +79 -0
  496. package/src/internal/email-kernel.ts +1532 -0
  497. package/src/internal/mapping-error.ts +36 -0
  498. package/src/internal/passkey/admission.ts +362 -0
  499. package/src/internal/passkey/credentials.ts +511 -0
  500. package/src/internal/passkey/enrollment.ts +326 -0
  501. package/src/internal/passkey/flow.ts +1062 -0
  502. package/src/internal/passkey/management.ts +422 -0
  503. package/src/internal/passkey/registration-ceremony.ts +283 -0
  504. package/src/internal/passkey/registration-custody.ts +91 -0
  505. package/src/internal/passkey/registration-write.ts +426 -0
  506. package/src/internal/passkey/state.ts +354 -0
  507. package/src/internal/passkey/target.ts +586 -0
  508. package/src/internal/passkey/write-state.ts +681 -0
  509. package/src/internal/passkey/write-target.ts +452 -0
  510. package/src/internal/passkey-kernel.ts +102 -0
  511. package/src/internal/passkeys.ts +597 -0
  512. package/src/internal/password-kernel.ts +2122 -0
  513. package/src/internal/persistence.ts +590 -0
  514. package/src/internal/phone-kernel.ts +843 -0
  515. package/src/internal/proof-kernel.ts +1949 -0
  516. package/src/internal/query-operations.ts +26 -0
  517. package/src/internal/registration.ts +160 -0
  518. package/src/internal/session-kernel.ts +2210 -0
  519. package/src/internal/sql-persistence.ts +45 -0
  520. package/src/internal/sql-query.ts +298 -0
  521. package/src/internal/sql-table.ts +89 -0
  522. package/src/internal/storage-mapping.ts +706 -0
  523. package/src/internal/storage-tables.ts +408 -0
  524. package/src/internal/storage-validation.ts +117 -0
  525. package/src/internal/transaction-execution-kernel.ts +317 -0
  526. package/src/internal/transaction-kernel.ts +582 -0
@@ -0,0 +1,282 @@
1
+ import type { EmailAction, EmailAddressPersistence } from "@yielded/auth/Email";
2
+ import type { LoginIdentifier } from "@yielded/auth/Identity";
3
+ import type {
4
+ PasskeyActionChallenge,
5
+ PasskeyConfig,
6
+ PasskeyCredentials,
7
+ PasskeyEnrollmentContext,
8
+ PasskeyManagementPersistence,
9
+ PasskeyManagementPolicy,
10
+ PasskeyMethodPolicy,
11
+ PasskeyPersistence,
12
+ PasskeyConfigurationError,
13
+ } from "@yielded/auth/Passkey";
14
+ import type {
15
+ PasswordAction,
16
+ PasswordPersistence,
17
+ PasswordUnavailable,
18
+ } from "@yielded/auth/Password";
19
+ import type { PhoneAdmission, PhoneSignInTargets } from "@yielded/auth/PhoneOtp";
20
+ import type { ProofPersistence } from "@yielded/auth/Proofs";
21
+ import type { SubjectId } from "@yielded/auth/Schema";
22
+ import type {
23
+ AuthenticationAuthority,
24
+ AuthenticationRequirement,
25
+ make as makeSessions,
26
+ } from "@yielded/auth/Sessions";
27
+ import { type Context, type Effect, type Layer, Schema } from "effect";
28
+ import type { SqlClient } from "effect/unstable/sql";
29
+
30
+ import type { PersistenceMappingError } from "./mapping-error";
31
+ import type { StorageRole } from "./storage-tables";
32
+
33
+ export class PersistenceConfigurationError extends Schema.TaggedError<PersistenceConfigurationError>()(
34
+ "PersistenceConfigurationError",
35
+ { reason: Schema.String },
36
+ ) {}
37
+
38
+ export type ClaimsCodec = Schema.Codec<unknown, unknown, never, never>;
39
+
40
+ export interface PasskeyFeature {
41
+ readonly kind: "passkey";
42
+ readonly moduleId: string;
43
+ readonly policy: Effect.Effect<PasskeyMethodPolicy, PasskeyConfigurationError, PasskeyConfig>;
44
+ readonly management?: boolean;
45
+ readonly managementPolicy?: PasskeyManagementPolicy;
46
+ }
47
+
48
+ export interface Strategy {
49
+ readonly strategy: object;
50
+ readonly persistence?:
51
+ | PasskeyFeature
52
+ | {
53
+ readonly kind: "password" | "phone" | "email";
54
+ readonly moduleId: string;
55
+ readonly lifecycle?: boolean;
56
+ readonly management?: boolean;
57
+ readonly addresses?: boolean;
58
+ };
59
+ readonly RegistrationAuthority?: Context.Key<unknown, unknown>;
60
+ }
61
+
62
+ export interface Definition<C extends ClaimsCodec, Id extends string> {
63
+ readonly namespace: string;
64
+ readonly claims: C;
65
+ readonly sessionMode?: string;
66
+ readonly sessions: ReturnType<typeof makeSessions<C, Id>>;
67
+ readonly strategies: Readonly<Record<string, Strategy>>;
68
+ }
69
+
70
+ type KeyId<T> = T extends Context.Key<infer Id, infer _Service> ? Id : never;
71
+ type Enabled<
72
+ A extends { readonly strategies: Readonly<Record<string, Strategy>> },
73
+ Kind extends "password" | "phone" | "email" | "passkey",
74
+ > = Extract<A["strategies"][keyof A["strategies"]], { persistence: { kind: Kind } }>;
75
+
76
+ type ManagedPassword<A extends { readonly strategies: Readonly<Record<string, Strategy>> }> =
77
+ Extract<Enabled<A, "password">, { persistence: { management: true } }>;
78
+
79
+ type ManagedPasskey<A extends { readonly strategies: Readonly<Record<string, Strategy>> }> =
80
+ Extract<Enabled<A, "passkey">, { persistence: { management: true } }>;
81
+
82
+ export type PasskeyRequirement<
83
+ A extends { readonly strategies: Readonly<Record<string, Strategy>> },
84
+ > = Enabled<A, "passkey"> extends never ? never : PasskeyConfig;
85
+
86
+ type RegistrationKey<S> = S extends { readonly RegistrationAuthority: infer K } ? K : never;
87
+ type Registration<S> =
88
+ RegistrationKey<S> extends Context.Key<infer _Id, infer Service>
89
+ ? Service extends { readonly register: (input: infer Input, ...args: never[]) => unknown }
90
+ ? Input extends { readonly registration: infer Value }
91
+ ? Value
92
+ : never
93
+ : never
94
+ : never;
95
+
96
+ export interface ProvisioningId<Id extends string> {
97
+ readonly authNamespace: Id;
98
+ readonly service: "PersistenceProvisioning";
99
+ }
100
+
101
+ export type Provisioning<A extends { readonly strategies: Readonly<Record<string, Strategy>> }> = {
102
+ readonly [
103
+ K in keyof A["strategies"] as A["strategies"][K] extends {
104
+ persistence: { kind: "password"; management: true };
105
+ }
106
+ ? K
107
+ : never
108
+ ]: (input: {
109
+ readonly identifier: LoginIdentifier;
110
+ readonly registration: Registration<A["strategies"][K]>;
111
+ }) => Effect.Effect<SubjectId, PasswordUnavailable>;
112
+ };
113
+
114
+ export type ProvisioningRequirement<
115
+ A extends { readonly namespace: string; readonly strategies: Readonly<Record<string, Strategy>> },
116
+ > = ManagedPassword<A> extends never ? never : ProvisioningId<A["namespace"]>;
117
+
118
+ type ProofRoles =
119
+ | "proofRequests"
120
+ | "proofSeries"
121
+ | "proofGenerations"
122
+ | "proofContinuations"
123
+ | "proofScopes"
124
+ | "proofAbuse"
125
+ | "proofFailures"
126
+ | "proofCommands";
127
+
128
+ type UsesProofs<A extends { readonly strategies: Readonly<Record<string, Strategy>> }> =
129
+ | Enabled<A, "phone">
130
+ | Enabled<A, "email">
131
+ | ManagedPassword<A>;
132
+
133
+ export type Ports<C extends ClaimsCodec, Id extends string, A extends Definition<C, Id>> =
134
+ | AuthenticationAuthority
135
+ | KeyId<A["sessions"]["StatefulSessionPersistence"]>
136
+ | KeyId<A["sessions"]["SessionRepository"]>
137
+ | (Enabled<A, "password"> extends never ? never : PasswordPersistence)
138
+ | KeyId<RegistrationKey<ManagedPassword<A>>>
139
+ | (Enabled<A, "passkey"> extends never ? never : PasskeyPersistence | PasskeyCredentials)
140
+ | (ManagedPasskey<A> extends never
141
+ ? never
142
+ : PasskeyManagementPersistence | PasskeyEnrollmentContext)
143
+ | (Enabled<A, "email"> extends never ? never : EmailAddressPersistence)
144
+ | (UsesProofs<A> extends never ? never : ProofPersistence)
145
+ | (Enabled<A, "phone"> extends never ? never : PhoneAdmission | PhoneSignInTargets);
146
+
147
+ export type Roles<C extends ClaimsCodec, Id extends string, A extends Definition<C, Id>> =
148
+ | "identifiers"
149
+ | "credentials"
150
+ | "sessions"
151
+ | "sessionFlows"
152
+ | (Enabled<A, "password"> extends never
153
+ ? never
154
+ :
155
+ | "passwords"
156
+ | "passwordAttempts"
157
+ | "passwordScopes"
158
+ | "passwordCharges"
159
+ | "passwordCommands")
160
+ | (ManagedPassword<A> extends never ? never : "passwordRegistrations")
161
+ | (Enabled<A, "phone"> extends never ? never : "phoneState")
162
+ | (Enabled<A, "email"> extends never ? never : "emailCredentials" | "emailCommands")
163
+ | (Enabled<A, "passkey"> extends never
164
+ ? never
165
+ :
166
+ | "passkeyCredentials"
167
+ | "passkeyOwnership"
168
+ | "passkeyHandles"
169
+ | "passkeyModules"
170
+ | "passkeyFlows"
171
+ | "passkeyAdmissions"
172
+ | "passkeyCharges")
173
+ | (ManagedPasskey<A> extends never ? never : "passkeyCommands")
174
+ | (UsesProofs<A> extends never ? never : ProofRoles);
175
+
176
+ export interface SubjectOptions<T extends object, NativeId> {
177
+ readonly table: T;
178
+ readonly id: string;
179
+ readonly status: string;
180
+ readonly activeValue: unknown;
181
+ readonly securityRevision: string;
182
+ readonly idCodec: Schema.Codec<SubjectId, NativeId>;
183
+ readonly requirements: (
184
+ row: Readonly<Record<string, unknown>>,
185
+ ) => Effect.Effect<AuthenticationRequirement, PersistenceMappingError>;
186
+ /** Defaults to sign-in requirements. Recovery can have a distinct application policy. */
187
+ readonly actionRequirements?: (
188
+ row: Readonly<Record<string, unknown>>,
189
+ action: PasswordAction | EmailAction | PasskeyActionChallenge["action"],
190
+ ) => Effect.Effect<AuthenticationRequirement, PersistenceMappingError>;
191
+ }
192
+
193
+ /** Codecs at the application-owned subject and timestamp boundary. */
194
+ export interface SubjectMapping {
195
+ readonly table: object;
196
+ readonly id: string;
197
+ readonly status: string;
198
+ readonly securityRevision: string;
199
+ readonly activeValue: unknown;
200
+ readonly requirements: SubjectOptions<object, unknown>["requirements"];
201
+ readonly actionRequirements: NonNullable<SubjectOptions<object, unknown>["actionRequirements"]>;
202
+ readonly toSubject: (value: unknown) => Effect.Effect<SubjectId, PersistenceMappingError>;
203
+ readonly toNative: (value: SubjectId) => Effect.Effect<unknown, PersistenceMappingError>;
204
+ readonly toSubjectSync: (value: unknown) => SubjectId;
205
+ readonly toNativeSync: (value: SubjectId) => unknown;
206
+ }
207
+
208
+ export interface MappingInput {
209
+ readonly tables: Partial<Record<StorageRole, object>>;
210
+ readonly subjects: SubjectMapping;
211
+ readonly encodeInstant: (millis: number) => unknown;
212
+ readonly decodeInstant: (value: unknown) => Effect.Effect<number, PersistenceMappingError>;
213
+ readonly decodeInstantSync: (value: unknown) => number;
214
+ }
215
+
216
+ export interface StorageLayout<
217
+ T extends object,
218
+ Role extends StorageRole = StorageRole,
219
+ > extends MappingInput {
220
+ readonly namespace: string;
221
+ readonly schema: Readonly<Record<Role, T>>;
222
+ }
223
+
224
+ export interface ConfigId<Id extends string> {
225
+ readonly authNamespace: Id;
226
+ readonly service: "PersistenceConfig";
227
+ }
228
+
229
+ export interface TimestampOptions<Instant> {
230
+ readonly type: "text" | "integer";
231
+ readonly codec: Schema.Codec<number, Instant>;
232
+ }
233
+
234
+ export interface BoundPersistence<
235
+ T extends object,
236
+ R,
237
+ C extends ClaimsCodec,
238
+ Id extends string,
239
+ A extends Definition<C, Id>,
240
+ > {
241
+ readonly Config: Context.Service<ConfigId<A["namespace"]>, StorageLayout<T, Roles<C, Id, A>>> & {
242
+ readonly layer: (
243
+ value: StorageLayout<T, Roles<C, Id, A>>,
244
+ ) => Layer.Layer<ConfigId<A["namespace"]>>;
245
+ };
246
+ /** Create only the application subject. Runs inside the owning auth SQL transaction;
247
+ * use that SqlClient (including Drizzle over it), and return the new subject ID.
248
+ * Do not perform external side effects or open an independent transaction here.
249
+ */
250
+ readonly Provisioning: Context.Service<ProvisioningRequirement<A>, Provisioning<A>>;
251
+ readonly layer: Layer.Layer<
252
+ Ports<C, Id, A>,
253
+ PersistenceConfigurationError,
254
+ | ConfigId<A["namespace"]>
255
+ | ProvisioningRequirement<A>
256
+ | PasskeyRequirement<A>
257
+ | SqlClient.SqlClient
258
+ | R
259
+ >;
260
+ readonly managed: <N, Instant = number>(options: {
261
+ readonly subjects: SubjectOptions<T, N>;
262
+ readonly tables?: Partial<Record<Roles<C, Id, A>, T>>;
263
+ readonly prefix?: string;
264
+ readonly timestamps?: TimestampOptions<Instant>;
265
+ }) => StorageLayout<T, Roles<C, Id, A>>;
266
+ readonly map: <N, Instant = number>(options: {
267
+ readonly subjects: SubjectOptions<T, N>;
268
+ readonly tables: Readonly<Record<Roles<C, Id, A>, T>>;
269
+ readonly timestamps?: TimestampOptions<Instant>;
270
+ }) => StorageLayout<T, Roles<C, Id, A>>;
271
+ }
272
+
273
+ /** Shared configuration shape. The backend chooses table types and service requirements. */
274
+ export interface PersistenceApi<T extends object, R = never> {
275
+ readonly make: <
276
+ C extends ClaimsCodec,
277
+ const Id extends string,
278
+ const A extends Definition<C, Id>,
279
+ >(
280
+ auth: A & Definition<C, Id>,
281
+ ) => BoundPersistence<T, R, C, Id, A>;
282
+ }
@@ -0,0 +1,30 @@
1
+ import { Effect, Layer } from "effect";
2
+
3
+ import { PersistenceConfigurationError } from "./configuration";
4
+
5
+ /** Run Drizzle Kit output through the matching Drizzle driver. Loading files and
6
+ * acquiring the database are deferred until the Layer is built. Drizzle owns the
7
+ * migration journal and transaction; failed migrations prevent auth startup.
8
+ */
9
+ export const drizzleMigrationsLayer =
10
+ <Database, Options, E, R>(
11
+ acquire: Effect.Effect<Database, never, R>,
12
+ migrator: Effect.Effect<(database: Database, options: Options) => Effect.Effect<void, E>>,
13
+ ) =>
14
+ (options: Options) =>
15
+ Layer.effectDiscard(
16
+ Effect.gen(function* () {
17
+ const database = yield* acquire;
18
+ const migrate = yield* migrator;
19
+
20
+ const migration = yield* Effect.try({
21
+ try: () => migrate(database, options),
22
+ catch: () =>
23
+ PersistenceConfigurationError.make({
24
+ reason: "Could not read Drizzle migrations; check the migration source and format",
25
+ }),
26
+ });
27
+
28
+ yield* migration;
29
+ }),
30
+ );
@@ -0,0 +1,81 @@
1
+ import { getTableColumns } from "drizzle-orm";
2
+ import {
3
+ getTableConfig,
4
+ bigint,
5
+ boolean,
6
+ pgTable,
7
+ text,
8
+ uniqueIndex,
9
+ type PgTable,
10
+ } from "drizzle-orm/pg-core";
11
+ import type { Effect } from "effect";
12
+ import type { SqlClient } from "effect/unstable/sql/SqlClient";
13
+
14
+ import { drizzleQueryOperations } from "../drizzle/query-operations";
15
+ import { PersistenceConfigurationError } from "./configuration";
16
+ import { makeComposedPasskeys } from "./passkeys";
17
+ import { createPersistence } from "./persistence";
18
+ import type { StorageTable } from "./storage-tables";
19
+
20
+ const makeTable = (definition: StorageTable) =>
21
+ pgTable(
22
+ definition.name,
23
+ Object.fromEntries(
24
+ Object.entries(definition.columns).map(([key, column]) => {
25
+ const builder =
26
+ column.type === "text"
27
+ ? text(column.name)
28
+ : column.type === "boolean"
29
+ ? boolean(column.name)
30
+ : bigint(column.name, { mode: "number" });
31
+
32
+ return [key, column.nullable ? builder : builder.notNull()];
33
+ }),
34
+ ),
35
+ (columns) =>
36
+ definition.unique.map((keys, i) => {
37
+ const [first, ...rest] = keys;
38
+
39
+ if (first === undefined)
40
+ throw PersistenceConfigurationError.make({ reason: "An empty unique key is invalid" });
41
+
42
+ return uniqueIndex(`${definition.name}_key_${i}`).on(
43
+ columns[first],
44
+ ...rest.map((key) => columns[key]),
45
+ );
46
+ }),
47
+ );
48
+
49
+ const describe = (table: PgTable): StorageTable => {
50
+ const config = getTableConfig(table);
51
+
52
+ return {
53
+ name: config.name,
54
+ ...(config.schema === undefined ? {} : { schema: config.schema }),
55
+ columns: Object.fromEntries(
56
+ Object.entries(getTableColumns(table)).map(([key, column]) => [
57
+ key,
58
+ {
59
+ name: column.name,
60
+ type:
61
+ column.dataType === "boolean"
62
+ ? "boolean"
63
+ : column.dataType === "number"
64
+ ? "integer"
65
+ : "text",
66
+ nullable: !column.notNull,
67
+ },
68
+ ]),
69
+ ),
70
+ unique: [],
71
+ };
72
+ };
73
+
74
+ export const postgresPersistence = <R>(acquire: Effect.Effect<object, never, R | SqlClient>) =>
75
+ createPersistence<PgTable, R>({
76
+ makeTable,
77
+ describe,
78
+ operations: drizzleQueryOperations,
79
+ acquire,
80
+ passkeys: makeComposedPasskeys(drizzleQueryOperations),
81
+ });
@@ -0,0 +1,79 @@
1
+ import { getTableColumns } from "drizzle-orm";
2
+ import {
3
+ getTableConfig,
4
+ integer,
5
+ sqliteTable,
6
+ text,
7
+ uniqueIndex,
8
+ type SQLiteTable,
9
+ } from "drizzle-orm/sqlite-core";
10
+ import type { Effect } from "effect";
11
+ import type { SqlClient } from "effect/unstable/sql/SqlClient";
12
+
13
+ import { drizzleQueryOperations } from "../drizzle/query-operations";
14
+ import { PersistenceConfigurationError } from "./configuration";
15
+ import { makeComposedPasskeys } from "./passkeys";
16
+ import { createPersistence } from "./persistence";
17
+ import type { StorageTable } from "./storage-tables";
18
+
19
+ const makeTable = (definition: StorageTable) =>
20
+ sqliteTable(
21
+ definition.name,
22
+ Object.fromEntries(
23
+ Object.entries(definition.columns).map(([key, column]) => {
24
+ const builder =
25
+ column.type === "text"
26
+ ? text(column.name)
27
+ : column.type === "boolean"
28
+ ? integer(column.name, { mode: "boolean" })
29
+ : integer(column.name);
30
+
31
+ return [key, column.nullable ? builder : builder.notNull()];
32
+ }),
33
+ ),
34
+ (columns) =>
35
+ definition.unique.map((keys, i) => {
36
+ const [first, ...rest] = keys;
37
+
38
+ if (first === undefined)
39
+ throw PersistenceConfigurationError.make({ reason: "An empty unique key is invalid" });
40
+
41
+ return uniqueIndex(`${definition.name}_key_${i}`).on(
42
+ columns[first],
43
+ ...rest.map((key) => columns[key]),
44
+ );
45
+ }),
46
+ );
47
+
48
+ const describe = (table: SQLiteTable): StorageTable => {
49
+ const config = getTableConfig(table);
50
+
51
+ return {
52
+ name: config.name,
53
+ columns: Object.fromEntries(
54
+ Object.entries(getTableColumns(table)).map(([key, column]) => [
55
+ key,
56
+ {
57
+ name: column.name,
58
+ type:
59
+ column.dataType === "boolean"
60
+ ? "boolean"
61
+ : column.dataType === "number"
62
+ ? "integer"
63
+ : "text",
64
+ nullable: !column.notNull,
65
+ },
66
+ ]),
67
+ ),
68
+ unique: [],
69
+ };
70
+ };
71
+
72
+ export const sqlitePersistence = <R>(acquire: Effect.Effect<object, never, R | SqlClient>) =>
73
+ createPersistence<SQLiteTable, R>({
74
+ makeTable,
75
+ describe,
76
+ operations: drizzleQueryOperations,
77
+ acquire,
78
+ passkeys: makeComposedPasskeys(drizzleQueryOperations),
79
+ });