@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,321 @@
1
+ import { EmailAddressPersistence, type EmailUnavailable } from "@yielded/auth/Email";
2
+ import type { LifecycleHooks, HookConfigurationError } from "@yielded/auth/Hooks";
3
+ /* oxlint-disable no-explicit-any -- proof mapping tables are independently typed by the proof owner; this driver forwards them unchanged to the shared target. */
4
+ import type { AnyRelations } from "drizzle-orm";
5
+ import type { EffectMysql2Database } from "drizzle-orm/effect-mysql2";
6
+ import type { AnyMySqlTable } from "drizzle-orm/mysql-core";
7
+ import { Effect, Context } from "effect";
8
+ import type { SqlError } from "effect/unstable/sql/SqlError";
9
+
10
+ import type {
11
+ EmailAddressMapping,
12
+ EmailRegistrationMapping,
13
+ EmailSignInMapping,
14
+ } from "./email-model";
15
+ import type { EmailRegistrationAuthority } from "./email-registration";
16
+ import type { EmailSqlQuery } from "./email-sql";
17
+ import {
18
+ coordinateTargetEmailAddress,
19
+ coordinateTargetEmailRegistration,
20
+ makeTargetEmailAddressServices,
21
+ makeTargetEmailRegistrationServices,
22
+ makeTargetEmailSignInServices,
23
+ sqlClientEmailStandaloneGuard,
24
+ } from "./email-target";
25
+ import type { ProofPersistenceMapping } from "./proof-model";
26
+ import type { ProofSqlQuery } from "./proof-sql";
27
+ import { sqlClientProofStandaloneGuard } from "./proof-target";
28
+ import type { SuppliedService } from "./SuppliedService";
29
+
30
+ type Database = EffectMysql2Database<AnyRelations>;
31
+ type TransactionOf<D extends Database> = Parameters<Parameters<D["transaction"]>[0]>[0];
32
+ type ProofMapping = ProofPersistenceMapping<
33
+ any,
34
+ any,
35
+ any,
36
+ any,
37
+ any,
38
+ any,
39
+ any,
40
+ any,
41
+ any,
42
+ any,
43
+ any,
44
+ any
45
+ >;
46
+
47
+ const configuration = (database: Database) => ({
48
+ mode: "interactive" as const,
49
+ locking: true,
50
+ standaloneGuard: sqlClientEmailStandaloneGuard(database),
51
+ generatedSubjectRows: (query: EmailSqlQuery) => query.$returningId(),
52
+ proof: {
53
+ mode: "interactive" as const,
54
+ locking: true,
55
+ standaloneGuard: sqlClientProofStandaloneGuard(database),
56
+ insertIfAbsent: (query: ProofSqlQuery, selfKey: string, selfValue: unknown) =>
57
+ query.onDuplicateKeyUpdate({ set: { [selfKey]: selfValue } }),
58
+ },
59
+ });
60
+
61
+ export const makeMysqlEmailSignInServices = <
62
+ S extends AnyMySqlTable,
63
+ I extends AnyMySqlTable,
64
+ C extends AnyMySqlTable,
65
+ NativeId,
66
+ >(
67
+ database: Database,
68
+ mapping: EmailSignInMapping<S, I, C, NativeId>,
69
+ ) => makeTargetEmailSignInServices(database, mapping, configuration(database));
70
+
71
+ export const makeMysqlEmailAddressServices = <
72
+ S extends AnyMySqlTable,
73
+ I extends AnyMySqlTable,
74
+ C extends AnyMySqlTable,
75
+ AC extends AnyMySqlTable,
76
+ M extends AnyMySqlTable,
77
+ NativeId,
78
+ >(
79
+ database: Database,
80
+ mapping: EmailAddressMapping<S, I, C, AC, M, NativeId>,
81
+ proofMapping: ProofMapping,
82
+ ) => makeTargetEmailAddressServices(database, mapping, proofMapping, configuration(database));
83
+
84
+ export function coordinateMysqlEmailAddress<
85
+ D extends Database,
86
+ S extends AnyMySqlTable,
87
+ I extends AnyMySqlTable,
88
+ C extends AnyMySqlTable,
89
+ AC extends AnyMySqlTable,
90
+ M extends AnyMySqlTable,
91
+ NativeId,
92
+ Out,
93
+ E,
94
+ R,
95
+ DatabaseError,
96
+ DatabaseRequirements,
97
+ >(
98
+ acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,
99
+ options: {
100
+ readonly mapping: EmailAddressMapping<S, I, C, AC, M, NativeId>;
101
+ readonly proofMapping: ProofMapping;
102
+ readonly transaction?: never;
103
+ },
104
+ body: Effect.Effect<Out, E, R>,
105
+ ): Effect.Effect<
106
+ Out,
107
+ E | EmailUnavailable | HookConfigurationError | SqlError | DatabaseError,
108
+ Exclude<R, EmailAddressPersistence> | LifecycleHooks | DatabaseRequirements
109
+ >;
110
+
111
+ export function coordinateMysqlEmailAddress<
112
+ D extends Database,
113
+ S extends AnyMySqlTable,
114
+ I extends AnyMySqlTable,
115
+ C extends AnyMySqlTable,
116
+ AC extends AnyMySqlTable,
117
+ M extends AnyMySqlTable,
118
+ NativeId,
119
+ Out,
120
+ E,
121
+ R,
122
+ DatabaseError,
123
+ DatabaseRequirements,
124
+ TxId,
125
+ TxShape,
126
+ >(
127
+ acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,
128
+ options: {
129
+ readonly mapping: EmailAddressMapping<S, I, C, AC, M, NativeId>;
130
+ readonly proofMapping: ProofMapping;
131
+ readonly transaction: SuppliedService<TxId, NoInfer<TransactionOf<D>>, TxShape>;
132
+ },
133
+ body: Effect.Effect<Out, E, R>,
134
+ ): Effect.Effect<
135
+ Out,
136
+ E | EmailUnavailable | HookConfigurationError | SqlError | DatabaseError,
137
+ Exclude<R, EmailAddressPersistence | TxId> | LifecycleHooks | DatabaseRequirements
138
+ >;
139
+
140
+ export function coordinateMysqlEmailAddress<
141
+ D extends Database,
142
+ S extends AnyMySqlTable,
143
+ I extends AnyMySqlTable,
144
+ C extends AnyMySqlTable,
145
+ AC extends AnyMySqlTable,
146
+ M extends AnyMySqlTable,
147
+ NativeId,
148
+ Out,
149
+ E,
150
+ R,
151
+ DatabaseError,
152
+ DatabaseRequirements,
153
+ TxId,
154
+ TxShape,
155
+ >(
156
+ acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,
157
+ options: {
158
+ readonly mapping: EmailAddressMapping<S, I, C, AC, M, NativeId>;
159
+ readonly proofMapping: ProofMapping;
160
+ readonly transaction?: SuppliedService<TxId, NoInfer<TransactionOf<D>>, TxShape>;
161
+ },
162
+ body: Effect.Effect<Out, E, R>,
163
+ ): Effect.Effect<
164
+ Out,
165
+ E | EmailUnavailable | HookConfigurationError | SqlError | DatabaseError,
166
+ Exclude<R, EmailAddressPersistence> | LifecycleHooks | DatabaseRequirements
167
+ > {
168
+ return Effect.flatMap(acquire, (database) =>
169
+ coordinateTargetEmailAddress<TransactionOf<D>, Out, E, Exclude<R, EmailAddressPersistence>>(
170
+ database,
171
+ options.mapping,
172
+ options.proofMapping,
173
+ configuration(database),
174
+ (
175
+ transaction: TransactionOf<D>,
176
+ services: { readonly emailAddressPersistence: EmailAddressPersistence["Service"] },
177
+ ) => {
178
+ const provided = Context.make(EmailAddressPersistence, services.emailAddressPersistence);
179
+ const work = Effect.provideContext(body, provided);
180
+
181
+ return options.transaction === undefined
182
+ ? work
183
+ : Effect.provideService(work, options.transaction, options.transaction.of(transaction));
184
+ },
185
+ ),
186
+ );
187
+ }
188
+
189
+ export const makeMysqlEmailRegistrationServices = <
190
+ Registration,
191
+ S extends AnyMySqlTable,
192
+ I extends AnyMySqlTable,
193
+ C extends AnyMySqlTable,
194
+ AC extends AnyMySqlTable,
195
+ Rq extends AnyMySqlTable,
196
+ NativeId,
197
+ >(
198
+ database: Database,
199
+ mapping: EmailRegistrationMapping<Registration, S, I, C, AC, Rq, NativeId>,
200
+ proofMapping: ProofMapping,
201
+ ) =>
202
+ makeTargetEmailRegistrationServices<Registration>(
203
+ database,
204
+ mapping,
205
+ proofMapping,
206
+ configuration(database),
207
+ );
208
+
209
+ export function coordinateMysqlEmailRegistration<
210
+ TargetId,
211
+ Registration,
212
+ D extends Database,
213
+ S extends AnyMySqlTable,
214
+ I extends AnyMySqlTable,
215
+ C extends AnyMySqlTable,
216
+ AC extends AnyMySqlTable,
217
+ Rq extends AnyMySqlTable,
218
+ NativeId,
219
+ Out,
220
+ E,
221
+ R,
222
+ DatabaseError,
223
+ DatabaseRequirements,
224
+ >(
225
+ acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,
226
+ options: {
227
+ readonly mapping: EmailRegistrationMapping<NoInfer<Registration>, S, I, C, AC, Rq, NativeId>;
228
+ readonly proofMapping: ProofMapping;
229
+ readonly target: SuppliedService<TargetId, EmailRegistrationAuthority<Registration>>;
230
+ readonly transaction?: never;
231
+ },
232
+ body: Effect.Effect<Out, E, R>,
233
+ ): Effect.Effect<
234
+ Out,
235
+ E | EmailUnavailable | HookConfigurationError | SqlError | DatabaseError,
236
+ Exclude<R, TargetId> | LifecycleHooks | DatabaseRequirements
237
+ >;
238
+
239
+ export function coordinateMysqlEmailRegistration<
240
+ TargetId,
241
+ Registration,
242
+ D extends Database,
243
+ S extends AnyMySqlTable,
244
+ I extends AnyMySqlTable,
245
+ C extends AnyMySqlTable,
246
+ AC extends AnyMySqlTable,
247
+ Rq extends AnyMySqlTable,
248
+ NativeId,
249
+ Out,
250
+ E,
251
+ R,
252
+ DatabaseError,
253
+ DatabaseRequirements,
254
+ TxId,
255
+ TxShape,
256
+ >(
257
+ acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,
258
+ options: {
259
+ readonly mapping: EmailRegistrationMapping<NoInfer<Registration>, S, I, C, AC, Rq, NativeId>;
260
+ readonly proofMapping: ProofMapping;
261
+ readonly target: SuppliedService<TargetId, EmailRegistrationAuthority<Registration>>;
262
+ readonly transaction: SuppliedService<TxId, NoInfer<TransactionOf<D>>, TxShape>;
263
+ },
264
+ body: Effect.Effect<Out, E, R>,
265
+ ): Effect.Effect<
266
+ Out,
267
+ E | EmailUnavailable | HookConfigurationError | SqlError | DatabaseError,
268
+ Exclude<R, TargetId | TxId> | LifecycleHooks | DatabaseRequirements
269
+ >;
270
+
271
+ export function coordinateMysqlEmailRegistration<
272
+ TargetId,
273
+ Registration,
274
+ D extends Database,
275
+ S extends AnyMySqlTable,
276
+ I extends AnyMySqlTable,
277
+ C extends AnyMySqlTable,
278
+ AC extends AnyMySqlTable,
279
+ Rq extends AnyMySqlTable,
280
+ NativeId,
281
+ Out,
282
+ E,
283
+ R,
284
+ DatabaseError,
285
+ DatabaseRequirements,
286
+ TxId,
287
+ TxShape,
288
+ >(
289
+ acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,
290
+ options: {
291
+ readonly mapping: EmailRegistrationMapping<NoInfer<Registration>, S, I, C, AC, Rq, NativeId>;
292
+ readonly proofMapping: ProofMapping;
293
+ readonly target: SuppliedService<TargetId, EmailRegistrationAuthority<Registration>>;
294
+ readonly transaction?: SuppliedService<TxId, NoInfer<TransactionOf<D>>, TxShape>;
295
+ },
296
+ body: Effect.Effect<Out, E, R>,
297
+ ): Effect.Effect<
298
+ Out,
299
+ E | EmailUnavailable | HookConfigurationError | SqlError | DatabaseError,
300
+ Exclude<R, TargetId> | LifecycleHooks | DatabaseRequirements
301
+ > {
302
+ return Effect.flatMap(acquire, (database) =>
303
+ coordinateTargetEmailRegistration<Registration, TransactionOf<D>, Out, E, Exclude<R, TargetId>>(
304
+ database,
305
+ options.mapping,
306
+ options.proofMapping,
307
+ configuration(database),
308
+ (
309
+ transaction: TransactionOf<D>,
310
+ services: { readonly registrationAuthority: EmailRegistrationAuthority<Registration> },
311
+ ) => {
312
+ const provided = Context.make(options.target, services.registrationAuthority);
313
+ const work = Effect.provideContext(body, provided);
314
+
315
+ return options.transaction === undefined
316
+ ? work
317
+ : Effect.provideService(work, options.transaction, options.transaction.of(transaction));
318
+ },
319
+ ),
320
+ );
321
+ }
@@ -0,0 +1,324 @@
1
+ import {
2
+ ExternalIdentityMutation,
3
+ type ExternalIdentity,
4
+ IdentityConflict,
5
+ IdentityUnavailable,
6
+ SubjectProvisioned,
7
+ SubjectProvisioner,
8
+ type SubjectProvisioningInput,
9
+ } from "@yielded/auth/Identity";
10
+ import { reportPersistenceFailure } from "@yielded/auth/Persistence";
11
+ import type { SubjectId } from "@yielded/auth/Schema";
12
+ /* oxlint-disable no-explicit-any -- Drizzle generic query types are narrowed at this technology boundary. */
13
+ import { and, eq, type AnyRelations } from "drizzle-orm";
14
+ import type { EffectMysql2Database } from "drizzle-orm/effect-mysql2";
15
+ import type { AnyMySqlTable, MySqlColumn } from "drizzle-orm/mysql-core";
16
+ import { Cause, Effect, Schema } from "effect";
17
+
18
+ import {
19
+ column,
20
+ isMappedConstraintConflict,
21
+ PersistenceMappingError,
22
+ provisioningFingerprint,
23
+ type ExternalIdentityTables,
24
+ type IdentityTables,
25
+ type SubjectProvisioningTables,
26
+ } from "./model";
27
+
28
+ type Database = EffectMysql2Database<AnyRelations>;
29
+ type RuntimeDatabase = EffectMysql2Database<any>;
30
+ const unavailable = () => IdentityUnavailable.make();
31
+ const isIdentityFailure = Schema.is(Schema.Union([IdentityConflict, IdentityUnavailable]));
32
+
33
+ const mapUnavailable = <A, E, R>(effect: Effect.Effect<A, E, R>) =>
34
+ reportPersistenceFailure(effect, isIdentityFailure).pipe(
35
+ Effect.catchCause((cause) =>
36
+ Effect.failCause(
37
+ Cause.map(cause, (error) => (isIdentityFailure(error) ? error : unavailable())),
38
+ ),
39
+ ),
40
+ );
41
+
42
+ export const makeMysqlSubjectProvisioningServices = <
43
+ Subject extends AnyMySqlTable,
44
+ Identifier extends AnyMySqlTable,
45
+ Request extends AnyMySqlTable,
46
+ NativeId,
47
+ >(
48
+ database: Database,
49
+ mapping: SubjectProvisioningTables<Subject, Identifier, Request, NativeId>,
50
+ ) => {
51
+ const db = database as RuntimeDatabase;
52
+ const requestTable = mapping.provisioningRequest.table;
53
+
54
+ const requestIdColumn = column(
55
+ requestTable,
56
+ mapping.provisioningRequest.requestId,
57
+ ) as MySqlColumn;
58
+
59
+ const requestFingerprintColumn = column(
60
+ requestTable,
61
+ mapping.provisioningRequest.fingerprint,
62
+ ) as MySqlColumn;
63
+
64
+ const requestSubjectColumn = column(
65
+ requestTable,
66
+ mapping.provisioningRequest.subjectId,
67
+ ) as MySqlColumn;
68
+
69
+ const identifierTable = mapping.identifier.table;
70
+
71
+ const identifierNamespaceColumn = column(
72
+ identifierTable,
73
+ mapping.identifier.namespace,
74
+ ) as MySqlColumn;
75
+
76
+ const identifierValueColumn = column(identifierTable, mapping.identifier.value) as MySqlColumn;
77
+
78
+ const findReceipt = Effect.fn("DrizzleMysqlIdentity.findReceipt")(function* (requestId: string) {
79
+ const rows = yield* db
80
+ .select({ fingerprint: requestFingerprintColumn, subjectId: requestSubjectColumn })
81
+ .from(requestTable as any)
82
+ .where(eq(requestIdColumn, requestId))
83
+ .limit(1);
84
+
85
+ return rows[0];
86
+ });
87
+
88
+ const provision = Effect.fn("DrizzleMysqlIdentity.provision")(function* (
89
+ input: SubjectProvisioningInput,
90
+ ) {
91
+ const fingerprint = provisioningFingerprint(input);
92
+ const existing = yield* findReceipt(input.requestId);
93
+
94
+ if (existing !== undefined) {
95
+ if (existing.fingerprint !== fingerprint) return yield* IdentityConflict.make();
96
+ const subjectId = yield* mapping.subjectId.toSubject(existing.subjectId as NativeId);
97
+
98
+ return SubjectProvisioned.make({ subjectId });
99
+ }
100
+
101
+ const attempt = db.transaction((tx) =>
102
+ Effect.gen(function* () {
103
+ const allocated =
104
+ mapping.subject.allocateId === undefined
105
+ ? mapping.subject.allocateIdSync?.()
106
+ : yield* mapping.subject.allocateId;
107
+
108
+ const insert = tx
109
+ .insert(mapping.subject.table as any)
110
+ .values(mapping.subject.encodeInsert(input, allocated) as any);
111
+
112
+ let nativeId = allocated;
113
+
114
+ if (nativeId === undefined) {
115
+ if (mapping.subject.decodeGeneratedId === undefined)
116
+ return yield* PersistenceMappingError.make({
117
+ operation: "provisionSubject.generatedId",
118
+ cause: new Error("MySQL generated IDs require decodeGeneratedId"),
119
+ });
120
+ const ids = yield* insert.$returningId();
121
+
122
+ nativeId = yield* mapping.subject.decodeGeneratedId(ids as ReadonlyArray<unknown>);
123
+ } else {
124
+ yield* insert;
125
+ }
126
+ if (input.identifier !== undefined)
127
+ yield* tx
128
+ .insert(identifierTable as any)
129
+ .values(
130
+ mapping.identifier.encodeInsert(input.identifier, nativeId, input.verifiedAt) as any,
131
+ );
132
+ yield* tx
133
+ .insert(requestTable as any)
134
+ .values(
135
+ mapping.provisioningRequest.encodeInsert(input.requestId, fingerprint, nativeId) as any,
136
+ );
137
+
138
+ return nativeId;
139
+ }),
140
+ );
141
+
142
+ const nativeId = yield* attempt.pipe(
143
+ Effect.catchCause(
144
+ (
145
+ cause,
146
+ ): Effect.Effect<
147
+ NativeId,
148
+ | Effect.Error<typeof attempt>
149
+ | Effect.Error<ReturnType<typeof findReceipt>>
150
+ | IdentityConflict
151
+ > => {
152
+ if (
153
+ cause.reasons.length === 0 ||
154
+ !cause.reasons.every(
155
+ (reason) =>
156
+ Cause.isFailReason(reason) &&
157
+ isMappedConstraintConflict(mapping.isConstraintConflict, reason.error),
158
+ )
159
+ )
160
+ return Effect.failCause(cause);
161
+
162
+ return findReceipt(input.requestId).pipe(
163
+ Effect.flatMap((receipt) => {
164
+ if (receipt !== undefined && receipt.fingerprint === fingerprint)
165
+ return Effect.succeed(receipt.subjectId as NativeId);
166
+ if (input.identifier === undefined) return IdentityConflict.make();
167
+
168
+ return db
169
+ .select({
170
+ subjectId: column(identifierTable, mapping.identifier.subjectId) as MySqlColumn,
171
+ })
172
+ .from(identifierTable as any)
173
+ .where(
174
+ and(
175
+ eq(identifierNamespaceColumn, input.identifier.namespace),
176
+ eq(identifierValueColumn, input.identifier.value),
177
+ ),
178
+ )
179
+ .limit(1)
180
+ .pipe(Effect.flatMap(() => IdentityConflict.make()));
181
+ }),
182
+ );
183
+ },
184
+ ),
185
+ );
186
+
187
+ const subjectId = yield* mapping.subjectId.toSubject(nativeId);
188
+
189
+ return SubjectProvisioned.make({ subjectId });
190
+ }, mapUnavailable);
191
+
192
+ return { subjectProvisioner: SubjectProvisioner.of({ provision }) } as const;
193
+ };
194
+
195
+ export const makeMysqlExternalIdentityServices = <
196
+ Subject extends AnyMySqlTable,
197
+ External extends AnyMySqlTable,
198
+ NativeId,
199
+ >(
200
+ database: Database,
201
+ mapping: ExternalIdentityTables<Subject, External, NativeId>,
202
+ ) => {
203
+ const db = database as RuntimeDatabase;
204
+ const externalTable = mapping.externalIdentity.table;
205
+
206
+ const externalProviderColumn = column(
207
+ externalTable,
208
+ mapping.externalIdentity.provider,
209
+ ) as MySqlColumn;
210
+
211
+ const externalIssuerColumn = column(
212
+ externalTable,
213
+ mapping.externalIdentity.issuer,
214
+ ) as MySqlColumn;
215
+
216
+ const externalSubjectColumn = column(
217
+ externalTable,
218
+ mapping.externalIdentity.subject,
219
+ ) as MySqlColumn;
220
+
221
+ const externalSubjectIdColumn = column(
222
+ externalTable,
223
+ mapping.externalIdentity.subjectId,
224
+ ) as MySqlColumn;
225
+
226
+ const subjectIdColumn = column(mapping.subject.table, mapping.subject.id) as MySqlColumn;
227
+ const subjectStatusColumn = column(mapping.subject.table, mapping.subject.status) as MySqlColumn;
228
+
229
+ const bind = Effect.fn("DrizzleMysqlIdentity.bindExternalIdentity")(function* (
230
+ subjectId: SubjectId,
231
+ identity: ExternalIdentity,
232
+ ) {
233
+ const nativeId = yield* mapping.subjectId.toNative(subjectId);
234
+
235
+ const decision = yield* db
236
+ .transaction((tx) =>
237
+ Effect.gen(function* () {
238
+ const subjects = yield* tx
239
+ .select({ status: subjectStatusColumn })
240
+ .from(mapping.subject.table as any)
241
+ .where(eq(subjectIdColumn, nativeId))
242
+ .for("update")
243
+ .limit(1);
244
+
245
+ if (subjects[0] === undefined || !mapping.subject.isActiveStatus(subjects[0].status))
246
+ return { _tag: "conflict" } as const;
247
+
248
+ const links = yield* tx
249
+ .select({ subjectId: externalSubjectIdColumn })
250
+ .from(externalTable as any)
251
+ .where(
252
+ and(
253
+ eq(externalProviderColumn, identity.provider),
254
+ eq(externalIssuerColumn, identity.issuer),
255
+ eq(externalSubjectColumn, identity.subject),
256
+ ),
257
+ )
258
+ .for("update")
259
+ .limit(1);
260
+
261
+ if (links[0] !== undefined)
262
+ return mapping.subjectId.equals(links[0].subjectId as NativeId, nativeId)
263
+ ? ({ _tag: "bound" } as const)
264
+ : ({ _tag: "conflict" } as const);
265
+ yield* tx
266
+ .insert(externalTable as any)
267
+ .values(mapping.externalIdentity.encodeInsert(identity, nativeId) as any);
268
+
269
+ return { _tag: "bound" } as const;
270
+ }),
271
+ )
272
+ .pipe(
273
+ Effect.catchCause((cause) => {
274
+ if (
275
+ cause.reasons.length === 0 ||
276
+ !cause.reasons.every(
277
+ (reason) =>
278
+ Cause.isFailReason(reason) &&
279
+ isMappedConstraintConflict(mapping.isConstraintConflict, reason.error),
280
+ )
281
+ )
282
+ return Effect.failCause(cause);
283
+
284
+ return db
285
+ .select({ subjectId: externalSubjectIdColumn })
286
+ .from(externalTable as any)
287
+ .where(
288
+ and(
289
+ eq(externalProviderColumn, identity.provider),
290
+ eq(externalIssuerColumn, identity.issuer),
291
+ eq(externalSubjectColumn, identity.subject),
292
+ ),
293
+ )
294
+ .limit(1)
295
+ .pipe(
296
+ Effect.map((rows) =>
297
+ rows[0] !== undefined &&
298
+ mapping.subjectId.equals(rows[0].subjectId as NativeId, nativeId)
299
+ ? ({ _tag: "bound" } as const)
300
+ : ({ _tag: "conflict" } as const),
301
+ ),
302
+ );
303
+ }),
304
+ );
305
+
306
+ if (decision._tag === "conflict") return yield* IdentityConflict.make();
307
+ }, mapUnavailable);
308
+
309
+ return { externalIdentityMutation: ExternalIdentityMutation.of({ bind }) } as const;
310
+ };
311
+
312
+ export const makeMysqlIdentityServices = <
313
+ Subject extends AnyMySqlTable,
314
+ Identifier extends AnyMySqlTable,
315
+ External extends AnyMySqlTable,
316
+ Request extends AnyMySqlTable,
317
+ NativeId,
318
+ >(
319
+ database: Database,
320
+ mapping: IdentityTables<Subject, Identifier, External, Request, NativeId>,
321
+ ) => ({
322
+ ...makeMysqlSubjectProvisioningServices(database, mapping),
323
+ ...makeMysqlExternalIdentityServices(database, mapping),
324
+ });