@yielded/auth-persistence 0.1.0-beta.25 → 0.1.0-beta.27

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 (481) hide show
  1. package/README.md +6 -8
  2. package/dist/Adapter.d.mts +47 -33
  3. package/dist/Adapter.mjs +36 -23
  4. package/dist/OAuthPersistence.d.mts +35 -51
  5. package/dist/OAuthPersistence.mjs +60 -68
  6. package/dist/OAuthPersistence.mjs.map +1 -1
  7. package/dist/index.d.mts +2 -2
  8. package/dist/index.mjs +2 -2
  9. package/dist/internal/browser-login.d.mts +1 -1
  10. package/dist/internal/browser-login.mjs +29 -9
  11. package/dist/internal/browser-login.mjs.map +1 -1
  12. package/dist/internal/configuration.d.mts +13 -8
  13. package/dist/internal/configuration.mjs.map +1 -1
  14. package/dist/internal/crypto.d.mts +1 -0
  15. package/dist/internal/crypto.mjs +1 -1
  16. package/dist/internal/d1-planning.mjs +8 -0
  17. package/dist/internal/d1-planning.mjs.map +1 -0
  18. package/dist/internal/email-native-state.mjs +135 -0
  19. package/dist/internal/email-native-state.mjs.map +1 -0
  20. package/dist/internal/email-native.d.mts +17 -0
  21. package/dist/internal/email-native.mjs +245 -0
  22. package/dist/internal/email-native.mjs.map +1 -0
  23. package/dist/internal/email-policy.mjs +92 -0
  24. package/dist/internal/email-policy.mjs.map +1 -0
  25. package/dist/internal/email-registration-native.d.mts +38 -0
  26. package/dist/internal/email-registration-native.mjs +171 -0
  27. package/dist/internal/email-registration-native.mjs.map +1 -0
  28. package/dist/internal/models/email-model.d.mts +40 -104
  29. package/dist/internal/models/email-model.mjs +3 -5
  30. package/dist/internal/models/email-model.mjs.map +1 -1
  31. package/dist/internal/models/oauth-connected-model.d.mts +44 -213
  32. package/dist/internal/models/oauth-connected-model.mjs +6 -14
  33. package/dist/internal/models/oauth-connected-model.mjs.map +1 -1
  34. package/dist/internal/models/oauth-model.d.mts +95 -244
  35. package/dist/internal/models/oauth-model.mjs +28 -22
  36. package/dist/internal/models/oauth-model.mjs.map +1 -1
  37. package/dist/internal/models/passkey-model.d.mts +11 -147
  38. package/dist/internal/models/passkey-model.mjs +5 -24
  39. package/dist/internal/models/passkey-model.mjs.map +1 -1
  40. package/dist/internal/models/passkey-registration-ceremony-model.d.mts +5 -39
  41. package/dist/internal/models/passkey-write-model.d.mts +17 -75
  42. package/dist/internal/models/passkey-write-model.mjs +1 -7
  43. package/dist/internal/models/passkey-write-model.mjs.map +1 -1
  44. package/dist/internal/models/password-model.d.mts +14 -81
  45. package/dist/internal/models/password-model.mjs +1 -4
  46. package/dist/internal/models/password-model.mjs.map +1 -1
  47. package/dist/internal/models/phone-model.d.mts +86 -0
  48. package/dist/internal/models/phone-model.mjs +10 -0
  49. package/dist/internal/models/phone-model.mjs.map +1 -0
  50. package/dist/internal/models/proof-model.d.mts +43 -272
  51. package/dist/internal/models/proof-model.mjs +2 -10
  52. package/dist/internal/models/proof-model.mjs.map +1 -1
  53. package/dist/internal/models/session-model.d.mts +74 -93
  54. package/dist/internal/models/session-model.mjs +3 -11
  55. package/dist/internal/models/session-model.mjs.map +1 -1
  56. package/dist/internal/models/step-up-model.d.mts +12 -50
  57. package/dist/internal/models/step-up-model.mjs +2 -4
  58. package/dist/internal/models/step-up-model.mjs.map +1 -1
  59. package/dist/internal/models/totp-model.d.mts +76 -0
  60. package/dist/internal/models/totp-model.mjs +10 -0
  61. package/dist/internal/models/totp-model.mjs.map +1 -0
  62. package/dist/internal/native-sql-table.d.mts +21 -4
  63. package/dist/internal/native-sql-table.mjs +9 -5
  64. package/dist/internal/native-sql-table.mjs.map +1 -1
  65. package/dist/internal/oauth/native-accounts.d.mts +17 -0
  66. package/dist/internal/oauth/native-accounts.mjs +290 -0
  67. package/dist/internal/oauth/native-accounts.mjs.map +1 -0
  68. package/dist/internal/oauth/native-connected-state.d.mts +11 -0
  69. package/dist/internal/oauth/native-connected-state.mjs +146 -0
  70. package/dist/internal/oauth/native-connected-state.mjs.map +1 -0
  71. package/dist/internal/oauth/native-connected.d.mts +15 -0
  72. package/dist/internal/oauth/native-connected.mjs +462 -0
  73. package/dist/internal/oauth/native-connected.mjs.map +1 -0
  74. package/dist/internal/oauth/native-flow.mjs +138 -0
  75. package/dist/internal/oauth/native-flow.mjs.map +1 -0
  76. package/dist/internal/oauth/native-layers.d.mts +24 -0
  77. package/dist/internal/oauth/native-layers.mjs +13 -0
  78. package/dist/internal/oauth/native-layers.mjs.map +1 -0
  79. package/dist/internal/oauth/native-mutation.mjs +122 -0
  80. package/dist/internal/oauth/native-mutation.mjs.map +1 -0
  81. package/dist/internal/oauth/native-registration.d.mts +24 -0
  82. package/dist/internal/oauth/native-registration.mjs +328 -0
  83. package/dist/internal/oauth/native-registration.mjs.map +1 -0
  84. package/dist/internal/oauth/native-revocations.d.mts +17 -0
  85. package/dist/internal/oauth/native-revocations.mjs +106 -0
  86. package/dist/internal/oauth/native-revocations.mjs.map +1 -0
  87. package/dist/internal/oauth/native-sign-in.d.mts +17 -0
  88. package/dist/internal/oauth/native-sign-in.mjs +50 -0
  89. package/dist/internal/oauth/native-sign-in.mjs.map +1 -0
  90. package/dist/internal/oauth/native-state.d.mts +10 -0
  91. package/dist/internal/oauth/native-state.mjs +214 -0
  92. package/dist/internal/oauth/native-state.mjs.map +1 -0
  93. package/dist/internal/oauth/state.d.mts +10 -0
  94. package/dist/internal/oauth/state.mjs +3 -27
  95. package/dist/internal/oauth/state.mjs.map +1 -1
  96. package/dist/internal/passkey-actions.mjs +55 -0
  97. package/dist/internal/passkey-actions.mjs.map +1 -0
  98. package/dist/internal/passkey-inputs.mjs +73 -0
  99. package/dist/internal/passkey-inputs.mjs.map +1 -0
  100. package/dist/internal/passkey-managed.mjs +224 -0
  101. package/dist/internal/passkey-managed.mjs.map +1 -0
  102. package/dist/internal/passkey-native-ceremony.d.mts +35 -0
  103. package/dist/internal/passkey-native-ceremony.mjs +38 -0
  104. package/dist/internal/passkey-native-ceremony.mjs.map +1 -0
  105. package/dist/internal/passkey-native-flow.mjs +91 -0
  106. package/dist/internal/passkey-native-flow.mjs.map +1 -0
  107. package/dist/internal/passkey-native-registration.d.mts +10 -0
  108. package/dist/internal/passkey-native-registration.mjs +114 -0
  109. package/dist/internal/passkey-native-registration.mjs.map +1 -0
  110. package/dist/internal/passkey-native-state.d.mts +15 -0
  111. package/dist/internal/passkey-native-state.mjs +186 -0
  112. package/dist/internal/passkey-native-state.mjs.map +1 -0
  113. package/dist/internal/passkey-native-write.d.mts +82 -0
  114. package/dist/internal/passkey-native-write.mjs +330 -0
  115. package/dist/internal/passkey-native-write.mjs.map +1 -0
  116. package/dist/internal/passkey-native.d.mts +835 -0
  117. package/dist/internal/passkey-native.mjs +175 -0
  118. package/dist/internal/passkey-native.mjs.map +1 -0
  119. package/dist/internal/passkey-policy.mjs +115 -0
  120. package/dist/internal/passkey-policy.mjs.map +1 -0
  121. package/dist/internal/password-credentials.mjs +38 -9
  122. package/dist/internal/password-credentials.mjs.map +1 -1
  123. package/dist/internal/password-native.d.mts +14 -0
  124. package/dist/internal/password-native.mjs +292 -0
  125. package/dist/internal/password-native.mjs.map +1 -0
  126. package/dist/internal/password-policy.mjs +93 -0
  127. package/dist/internal/password-policy.mjs.map +1 -0
  128. package/dist/internal/password-registration-native.d.mts +22 -0
  129. package/dist/internal/password-registration-native.mjs +142 -0
  130. package/dist/internal/password-registration-native.mjs.map +1 -0
  131. package/dist/internal/persistence.d.mts +6 -19
  132. package/dist/internal/persistence.mjs +199 -166
  133. package/dist/internal/persistence.mjs.map +1 -1
  134. package/dist/internal/phone-composed.mjs +79 -0
  135. package/dist/internal/phone-composed.mjs.map +1 -0
  136. package/dist/internal/phone-native.d.mts +15 -0
  137. package/dist/internal/phone-native.mjs +354 -0
  138. package/dist/internal/phone-native.mjs.map +1 -0
  139. package/dist/internal/proof-native.d.mts +15 -0
  140. package/dist/internal/proof-native.mjs +289 -0
  141. package/dist/internal/proof-native.mjs.map +1 -0
  142. package/dist/internal/registration.mjs +50 -60
  143. package/dist/internal/registration.mjs.map +1 -1
  144. package/dist/internal/session-native-authority.d.mts +15 -0
  145. package/dist/internal/session-native-authority.mjs +91 -0
  146. package/dist/internal/session-native-authority.mjs.map +1 -0
  147. package/dist/internal/session-native-cleanup.d.mts +14 -0
  148. package/dist/internal/session-native-cleanup.mjs +48 -0
  149. package/dist/internal/session-native-cleanup.mjs.map +1 -0
  150. package/dist/internal/session-native-login.d.mts +15 -0
  151. package/dist/internal/session-native-login.mjs +87 -0
  152. package/dist/internal/session-native-login.mjs.map +1 -0
  153. package/dist/internal/session-native-pending-read.mjs +42 -0
  154. package/dist/internal/session-native-pending-read.mjs.map +1 -0
  155. package/dist/internal/session-native-pending.mjs +134 -0
  156. package/dist/internal/session-native-pending.mjs.map +1 -0
  157. package/dist/internal/session-native-record.mjs +79 -0
  158. package/dist/internal/session-native-record.mjs.map +1 -0
  159. package/dist/internal/session-native-state.mjs +130 -0
  160. package/dist/internal/session-native-state.mjs.map +1 -0
  161. package/dist/internal/session-native-stateful.d.mts +16 -0
  162. package/dist/internal/session-native-stateful.mjs +225 -0
  163. package/dist/internal/session-native-stateful.mjs.map +1 -0
  164. package/dist/internal/session-native-step-up.d.mts +15 -0
  165. package/dist/internal/session-native-step-up.mjs +212 -0
  166. package/dist/internal/session-native-step-up.mjs.map +1 -0
  167. package/dist/internal/session-native-validity.d.mts +15 -0
  168. package/dist/internal/session-native-validity.mjs +97 -0
  169. package/dist/internal/session-native-validity.mjs.map +1 -0
  170. package/dist/internal/session-policy.mjs +29 -0
  171. package/dist/internal/session-policy.mjs.map +1 -0
  172. package/dist/internal/sql-authority.d.mts +16 -0
  173. package/dist/internal/sql-authority.mjs +32 -0
  174. package/dist/internal/sql-authority.mjs.map +1 -0
  175. package/dist/internal/sql-change.mjs +21 -0
  176. package/dist/internal/sql-change.mjs.map +1 -0
  177. package/dist/internal/sql-cleanup.mjs +35 -0
  178. package/dist/internal/sql-cleanup.mjs.map +1 -0
  179. package/dist/internal/sql-commit.d.mts +72 -0
  180. package/dist/internal/sql-commit.mjs +176 -0
  181. package/dist/internal/sql-commit.mjs.map +1 -0
  182. package/dist/internal/sql-expression.d.mts +17 -0
  183. package/dist/internal/sql-expression.mjs +49 -0
  184. package/dist/internal/sql-expression.mjs.map +1 -0
  185. package/dist/internal/sql-oauth-connected-model.d.mts +7 -23
  186. package/dist/internal/sql-oauth-model.d.mts +27 -52
  187. package/dist/internal/sql-oauth-model.mjs +3 -4
  188. package/dist/internal/sql-oauth-model.mjs.map +1 -1
  189. package/dist/internal/sql-persistence.mjs +5 -9
  190. package/dist/internal/sql-persistence.mjs.map +1 -1
  191. package/dist/internal/sql-storage-validation.mjs +1 -2
  192. package/dist/internal/sql-storage-validation.mjs.map +1 -1
  193. package/dist/internal/sql-table.d.mts +3 -16
  194. package/dist/internal/sql-table.mjs +21 -42
  195. package/dist/internal/sql-table.mjs.map +1 -1
  196. package/dist/internal/standalone.mjs +2 -3
  197. package/dist/internal/standalone.mjs.map +1 -1
  198. package/dist/internal/step-up-state.mjs +5 -8
  199. package/dist/internal/step-up-state.mjs.map +1 -1
  200. package/dist/internal/storage-clock.mjs +44 -0
  201. package/dist/internal/storage-clock.mjs.map +1 -0
  202. package/dist/internal/storage-mapping.d.mts +11 -8
  203. package/dist/internal/storage-mapping.mjs +88 -302
  204. package/dist/internal/storage-mapping.mjs.map +1 -1
  205. package/dist/internal/storage-plans.mjs +15 -73
  206. package/dist/internal/storage-plans.mjs.map +1 -1
  207. package/dist/internal/storage-tables.d.mts +37 -520
  208. package/dist/internal/storage-tables.mjs +31 -211
  209. package/dist/internal/storage-tables.mjs.map +1 -1
  210. package/dist/internal/storage-validation.d.mts +1 -6
  211. package/dist/internal/storage-validation.mjs +1 -42
  212. package/dist/internal/storage-validation.mjs.map +1 -1
  213. package/dist/internal/table-model.d.mts +21 -0
  214. package/dist/internal/totp-native.d.mts +15 -0
  215. package/dist/internal/totp-native.mjs +401 -0
  216. package/dist/internal/totp-native.mjs.map +1 -0
  217. package/package.json +1 -1
  218. package/src/Adapter.ts +143 -199
  219. package/src/OAuthPersistence.ts +128 -271
  220. package/src/index.ts +1 -1
  221. package/src/internal/browser-login.ts +54 -24
  222. package/src/internal/configuration.ts +16 -31
  223. package/src/internal/d1-planning.ts +7 -0
  224. package/src/internal/email-native-state.ts +247 -0
  225. package/src/internal/email-native.ts +514 -0
  226. package/src/internal/email-policy.ts +235 -0
  227. package/src/internal/email-registration-native.ts +386 -0
  228. package/src/internal/models/email-model.ts +76 -214
  229. package/src/internal/models/oauth-connected-model.ts +50 -288
  230. package/src/internal/models/oauth-model.ts +147 -368
  231. package/src/internal/models/passkey-model.ts +11 -208
  232. package/src/internal/models/passkey-registration-ceremony-model.ts +6 -60
  233. package/src/internal/models/passkey-write-model.ts +14 -95
  234. package/src/internal/models/password-model.ts +26 -147
  235. package/src/internal/models/phone-model.ts +110 -0
  236. package/src/internal/models/proof-model.ts +48 -404
  237. package/src/internal/models/session-model.ts +102 -200
  238. package/src/internal/models/step-up-model.ts +17 -96
  239. package/src/internal/models/totp-model.ts +82 -0
  240. package/src/internal/native-sql-table.ts +32 -11
  241. package/src/internal/oauth/native-accounts.ts +576 -0
  242. package/src/internal/oauth/native-connected-state.ts +288 -0
  243. package/src/internal/oauth/native-connected.ts +888 -0
  244. package/src/internal/oauth/native-flow.ts +253 -0
  245. package/src/internal/oauth/native-layers.ts +83 -0
  246. package/src/internal/oauth/native-mutation.ts +222 -0
  247. package/src/internal/oauth/native-registration.ts +545 -0
  248. package/src/internal/oauth/native-revocations.ts +190 -0
  249. package/src/internal/oauth/native-sign-in.ts +111 -0
  250. package/src/internal/oauth/native-state.ts +346 -0
  251. package/src/internal/oauth/state.ts +2 -70
  252. package/src/internal/passkey-actions.ts +70 -0
  253. package/src/internal/passkey-inputs.ts +56 -0
  254. package/src/internal/passkey-managed.ts +360 -0
  255. package/src/internal/passkey-native-ceremony.ts +66 -0
  256. package/src/internal/passkey-native-flow.ts +140 -0
  257. package/src/internal/passkey-native-registration.ts +221 -0
  258. package/src/internal/passkey-native-state.ts +335 -0
  259. package/src/internal/passkey-native-write.ts +611 -0
  260. package/src/internal/passkey-native.ts +372 -0
  261. package/src/internal/passkey-policy.ts +246 -0
  262. package/src/internal/password-credentials.ts +52 -10
  263. package/src/internal/password-native.ts +571 -0
  264. package/src/internal/password-policy.ts +307 -0
  265. package/src/internal/password-registration-native.ts +322 -0
  266. package/src/internal/persistence.ts +336 -290
  267. package/src/internal/phone-composed.ts +86 -0
  268. package/src/internal/phone-native.ts +659 -0
  269. package/src/internal/proof-native.ts +448 -0
  270. package/src/internal/registration.ts +96 -143
  271. package/src/internal/session-native-authority.ts +247 -0
  272. package/src/internal/session-native-cleanup.ts +65 -0
  273. package/src/internal/session-native-login.ts +205 -0
  274. package/src/internal/session-native-pending-read.ts +68 -0
  275. package/src/internal/session-native-pending.ts +223 -0
  276. package/src/internal/session-native-record.ts +141 -0
  277. package/src/internal/session-native-state.ts +259 -0
  278. package/src/internal/session-native-stateful.ts +512 -0
  279. package/src/internal/session-native-step-up.ts +450 -0
  280. package/src/internal/session-native-validity.ts +208 -0
  281. package/src/internal/session-policy.ts +59 -0
  282. package/src/internal/sql-authority.ts +56 -0
  283. package/src/internal/sql-change.ts +38 -0
  284. package/src/internal/sql-cleanup.ts +56 -0
  285. package/src/internal/sql-commit.ts +435 -0
  286. package/src/internal/sql-expression.ts +94 -0
  287. package/src/internal/sql-metadata.ts +100 -0
  288. package/src/internal/sql-oauth-connected-model.ts +6 -95
  289. package/src/internal/sql-oauth-model.ts +31 -134
  290. package/src/internal/sql-persistence.ts +2 -6
  291. package/src/internal/sql-storage-validation.ts +1 -2
  292. package/src/internal/sql-table.ts +19 -52
  293. package/src/internal/standalone.ts +2 -11
  294. package/src/internal/step-up-state.ts +4 -17
  295. package/src/internal/storage-clock.ts +58 -0
  296. package/src/internal/storage-mapping.ts +125 -340
  297. package/src/internal/storage-plans.ts +14 -80
  298. package/src/internal/storage-tables.ts +28 -212
  299. package/src/internal/storage-validation.ts +0 -58
  300. package/src/internal/table-model.ts +24 -0
  301. package/src/internal/totp-native.ts +701 -0
  302. package/dist/internal/PasswordPreparedPostconditions.d.mts +0 -22
  303. package/dist/internal/PasswordPreparedPostconditions.mjs +0 -12
  304. package/dist/internal/PasswordPreparedPostconditions.mjs.map +0 -1
  305. package/dist/internal/authority-snapshot.mjs +0 -53
  306. package/dist/internal/authority-snapshot.mjs.map +0 -1
  307. package/dist/internal/email-kernel.d.mts +0 -276
  308. package/dist/internal/email-kernel.mjs +0 -497
  309. package/dist/internal/email-kernel.mjs.map +0 -1
  310. package/dist/internal/models/passkey-registration-ceremony-model.mjs +0 -18
  311. package/dist/internal/models/passkey-registration-ceremony-model.mjs.map +0 -1
  312. package/dist/internal/oauth/accounts.d.mts +0 -8
  313. package/dist/internal/oauth/accounts.mjs +0 -379
  314. package/dist/internal/oauth/accounts.mjs.map +0 -1
  315. package/dist/internal/oauth/connected-access.d.mts +0 -9
  316. package/dist/internal/oauth/connected-access.mjs +0 -229
  317. package/dist/internal/oauth/connected-access.mjs.map +0 -1
  318. package/dist/internal/oauth/connected-collection.d.mts +0 -7
  319. package/dist/internal/oauth/connected-collection.mjs +0 -214
  320. package/dist/internal/oauth/connected-collection.mjs.map +0 -1
  321. package/dist/internal/oauth/connected-custody.d.mts +0 -6
  322. package/dist/internal/oauth/connected-custody.mjs +0 -165
  323. package/dist/internal/oauth/connected-custody.mjs.map +0 -1
  324. package/dist/internal/oauth/connected-flow.d.mts +0 -7
  325. package/dist/internal/oauth/connected-flow.mjs +0 -324
  326. package/dist/internal/oauth/connected-flow.mjs.map +0 -1
  327. package/dist/internal/oauth/connected-input.mjs +0 -122
  328. package/dist/internal/oauth/connected-input.mjs.map +0 -1
  329. package/dist/internal/oauth/connected-keys.d.mts +0 -2
  330. package/dist/internal/oauth/connected-keys.mjs +0 -22
  331. package/dist/internal/oauth/connected-keys.mjs.map +0 -1
  332. package/dist/internal/oauth/connected-maintenance.d.mts +0 -9
  333. package/dist/internal/oauth/connected-maintenance.mjs +0 -226
  334. package/dist/internal/oauth/connected-maintenance.mjs.map +0 -1
  335. package/dist/internal/oauth/connected-management.d.mts +0 -9
  336. package/dist/internal/oauth/connected-management.mjs +0 -243
  337. package/dist/internal/oauth/connected-management.mjs.map +0 -1
  338. package/dist/internal/oauth/connected-reference.mjs +0 -63
  339. package/dist/internal/oauth/connected-reference.mjs.map +0 -1
  340. package/dist/internal/oauth/connected-settlement.d.mts +0 -8
  341. package/dist/internal/oauth/connected-settlement.mjs +0 -141
  342. package/dist/internal/oauth/connected-settlement.mjs.map +0 -1
  343. package/dist/internal/oauth/connected-sign-in.d.mts +0 -10
  344. package/dist/internal/oauth/connected-sign-in.mjs +0 -281
  345. package/dist/internal/oauth/connected-sign-in.mjs.map +0 -1
  346. package/dist/internal/oauth/connected-state.d.mts +0 -14
  347. package/dist/internal/oauth/connected-state.mjs +0 -469
  348. package/dist/internal/oauth/connected-state.mjs.map +0 -1
  349. package/dist/internal/oauth/connected-target.d.mts +0 -21
  350. package/dist/internal/oauth/connected-target.mjs +0 -117
  351. package/dist/internal/oauth/connected-target.mjs.map +0 -1
  352. package/dist/internal/oauth/flow.d.mts +0 -5
  353. package/dist/internal/oauth/flow.mjs +0 -279
  354. package/dist/internal/oauth/flow.mjs.map +0 -1
  355. package/dist/internal/oauth/input.mjs +0 -127
  356. package/dist/internal/oauth/input.mjs.map +0 -1
  357. package/dist/internal/oauth/owner.d.mts +0 -10
  358. package/dist/internal/oauth/owner.mjs +0 -10
  359. package/dist/internal/oauth/owner.mjs.map +0 -1
  360. package/dist/internal/oauth/query-compiler.d.mts +0 -7
  361. package/dist/internal/oauth/query-compiler.mjs +0 -9
  362. package/dist/internal/oauth/query-compiler.mjs.map +0 -1
  363. package/dist/internal/oauth/registration.d.mts +0 -7
  364. package/dist/internal/oauth/registration.mjs +0 -393
  365. package/dist/internal/oauth/registration.mjs.map +0 -1
  366. package/dist/internal/oauth/target.d.mts +0 -31
  367. package/dist/internal/oauth/target.mjs +0 -273
  368. package/dist/internal/oauth/target.mjs.map +0 -1
  369. package/dist/internal/oauth-kernel.d.mts +0 -1423
  370. package/dist/internal/oauth-kernel.mjs +0 -187
  371. package/dist/internal/oauth-kernel.mjs.map +0 -1
  372. package/dist/internal/passkey/admission.d.mts +0 -6
  373. package/dist/internal/passkey/admission.mjs +0 -220
  374. package/dist/internal/passkey/admission.mjs.map +0 -1
  375. package/dist/internal/passkey/credentials.d.mts +0 -14
  376. package/dist/internal/passkey/credentials.mjs +0 -249
  377. package/dist/internal/passkey/credentials.mjs.map +0 -1
  378. package/dist/internal/passkey/enrollment.mjs +0 -138
  379. package/dist/internal/passkey/enrollment.mjs.map +0 -1
  380. package/dist/internal/passkey/flow.d.mts +0 -21
  381. package/dist/internal/passkey/flow.mjs +0 -452
  382. package/dist/internal/passkey/flow.mjs.map +0 -1
  383. package/dist/internal/passkey/management.mjs +0 -231
  384. package/dist/internal/passkey/management.mjs.map +0 -1
  385. package/dist/internal/passkey/registration-ceremony.d.mts +0 -9
  386. package/dist/internal/passkey/registration-ceremony.mjs +0 -129
  387. package/dist/internal/passkey/registration-ceremony.mjs.map +0 -1
  388. package/dist/internal/passkey/registration-custody.d.mts +0 -2
  389. package/dist/internal/passkey/registration-custody.mjs +0 -52
  390. package/dist/internal/passkey/registration-custody.mjs.map +0 -1
  391. package/dist/internal/passkey/registration-write.mjs +0 -211
  392. package/dist/internal/passkey/registration-write.mjs.map +0 -1
  393. package/dist/internal/passkey/state.d.mts +0 -10
  394. package/dist/internal/passkey/state.mjs +0 -234
  395. package/dist/internal/passkey/state.mjs.map +0 -1
  396. package/dist/internal/passkey/target.d.mts +0 -20
  397. package/dist/internal/passkey/target.mjs +0 -200
  398. package/dist/internal/passkey/target.mjs.map +0 -1
  399. package/dist/internal/passkey/write-state.d.mts +0 -17
  400. package/dist/internal/passkey/write-state.mjs +0 -354
  401. package/dist/internal/passkey/write-state.mjs.map +0 -1
  402. package/dist/internal/passkey/write-target.mjs +0 -192
  403. package/dist/internal/passkey/write-target.mjs.map +0 -1
  404. package/dist/internal/passkey-kernel.d.mts +0 -6045
  405. package/dist/internal/passkey-kernel.mjs +0 -49
  406. package/dist/internal/passkey-kernel.mjs.map +0 -1
  407. package/dist/internal/passkeys.d.mts +0 -7
  408. package/dist/internal/passkeys.mjs +0 -387
  409. package/dist/internal/passkeys.mjs.map +0 -1
  410. package/dist/internal/password-credentials.d.mts +0 -11
  411. package/dist/internal/password-kernel.d.mts +0 -278
  412. package/dist/internal/password-kernel.mjs +0 -508
  413. package/dist/internal/password-kernel.mjs.map +0 -1
  414. package/dist/internal/phone-kernel.d.mts +0 -162
  415. package/dist/internal/phone-kernel.mjs +0 -437
  416. package/dist/internal/phone-kernel.mjs.map +0 -1
  417. package/dist/internal/proof-kernel.d.mts +0 -94
  418. package/dist/internal/proof-kernel.mjs +0 -624
  419. package/dist/internal/proof-kernel.mjs.map +0 -1
  420. package/dist/internal/query-operations.d.mts +0 -68
  421. package/dist/internal/session-kernel.d.mts +0 -62
  422. package/dist/internal/session-kernel.mjs +0 -820
  423. package/dist/internal/session-kernel.mjs.map +0 -1
  424. package/dist/internal/sql-oauth-connected-model.mjs +0 -7
  425. package/dist/internal/sql-oauth-connected-model.mjs.map +0 -1
  426. package/dist/internal/sql-query.d.mts +0 -12
  427. package/dist/internal/sql-query.mjs +0 -206
  428. package/dist/internal/sql-query.mjs.map +0 -1
  429. package/dist/internal/step-up-state.d.mts +0 -49
  430. package/dist/internal/transaction-execution-kernel.d.mts +0 -37
  431. package/dist/internal/transaction-execution-kernel.mjs +0 -120
  432. package/dist/internal/transaction-execution-kernel.mjs.map +0 -1
  433. package/dist/internal/transaction-kernel.d.mts +0 -81
  434. package/dist/internal/transaction-kernel.mjs +0 -264
  435. package/dist/internal/transaction-kernel.mjs.map +0 -1
  436. package/src/internal/PasswordPreparedPostconditions.ts +0 -30
  437. package/src/internal/authority-snapshot.ts +0 -91
  438. package/src/internal/email-kernel.ts +0 -1556
  439. package/src/internal/oauth/accounts.ts +0 -839
  440. package/src/internal/oauth/connected-access.ts +0 -388
  441. package/src/internal/oauth/connected-collection.ts +0 -345
  442. package/src/internal/oauth/connected-custody.ts +0 -308
  443. package/src/internal/oauth/connected-flow.ts +0 -562
  444. package/src/internal/oauth/connected-input.ts +0 -147
  445. package/src/internal/oauth/connected-keys.ts +0 -31
  446. package/src/internal/oauth/connected-maintenance.ts +0 -379
  447. package/src/internal/oauth/connected-management.ts +0 -391
  448. package/src/internal/oauth/connected-reference.ts +0 -135
  449. package/src/internal/oauth/connected-settlement.ts +0 -278
  450. package/src/internal/oauth/connected-sign-in.ts +0 -472
  451. package/src/internal/oauth/connected-state.ts +0 -924
  452. package/src/internal/oauth/connected-target.ts +0 -307
  453. package/src/internal/oauth/flow.ts +0 -505
  454. package/src/internal/oauth/input.ts +0 -201
  455. package/src/internal/oauth/owner.ts +0 -22
  456. package/src/internal/oauth/query-compiler.ts +0 -15
  457. package/src/internal/oauth/registration.ts +0 -676
  458. package/src/internal/oauth/target.ts +0 -803
  459. package/src/internal/oauth-kernel.ts +0 -294
  460. package/src/internal/passkey/admission.ts +0 -368
  461. package/src/internal/passkey/credentials.ts +0 -511
  462. package/src/internal/passkey/enrollment.ts +0 -326
  463. package/src/internal/passkey/flow.ts +0 -1062
  464. package/src/internal/passkey/management.ts +0 -426
  465. package/src/internal/passkey/registration-ceremony.ts +0 -283
  466. package/src/internal/passkey/registration-custody.ts +0 -91
  467. package/src/internal/passkey/registration-write.ts +0 -426
  468. package/src/internal/passkey/state.ts +0 -351
  469. package/src/internal/passkey/target.ts +0 -598
  470. package/src/internal/passkey/write-state.ts +0 -692
  471. package/src/internal/passkey/write-target.ts +0 -450
  472. package/src/internal/passkey-kernel.ts +0 -112
  473. package/src/internal/passkeys.ts +0 -652
  474. package/src/internal/password-kernel.ts +0 -1523
  475. package/src/internal/phone-kernel.ts +0 -872
  476. package/src/internal/proof-kernel.ts +0 -1992
  477. package/src/internal/query-operations.ts +0 -91
  478. package/src/internal/session-kernel.ts +0 -2406
  479. package/src/internal/sql-query.ts +0 -304
  480. package/src/internal/transaction-execution-kernel.ts +0 -335
  481. package/src/internal/transaction-kernel.ts +0 -603
@@ -1,5 +1,6 @@
1
1
  import { PersistenceMappingError } from "./mapping-error.mjs";
2
2
  import { Table, identifier } from "./sql-table.mjs";
3
+ import { compileSqlExpression } from "./sql-expression.mjs";
3
4
  import { Effect } from "effect";
4
5
  import * as Statement$1 from "effect/sql/Statement";
5
6
  //#region src/internal/native-sql-table.ts
@@ -43,9 +44,9 @@ const directTable = (client, physical) => {
43
44
  return column;
44
45
  };
45
46
  const value = (key, input) => {
46
- const mapped = getColumn(key);
47
+ getColumn(key);
47
48
  if (Statement$1.isFragment(input)) return input;
48
- const encoded = input === null ? null : mapped.mapToDriverValue(input);
49
+ const encoded = input;
49
50
  return Statement$1.fragment([Statement$1.parameter(typeof encoded === "boolean" ? client.onDialectOrElse({
50
51
  sqlite: () => Number(encoded),
51
52
  orElse: () => encoded
@@ -56,9 +57,12 @@ const directTable = (client, physical) => {
56
57
  const reference = alias === void 0 ? name : quote(alias);
57
58
  const column = (key) => client`${reference}.${quote(getColumn(key).options.name)}`;
58
59
  return {
60
+ keys: columns.map(([key]) => key),
59
61
  name: alias === void 0 ? name : client`${name} AS ${reference}`,
60
62
  as: bind,
61
63
  column,
64
+ columnName: (key) => quote(getColumn(key).options.name),
65
+ selectedColumn: column,
62
66
  unencodedTextColumn: (key) => getColumn(key).options.type === "text" ? {
63
67
  table: {
64
68
  name: physical.name,
@@ -95,15 +99,15 @@ const directTable = (client, physical) => {
95
99
  };
96
100
  /** Cache physical metadata only; insert/update materialize values and hooks at
97
101
  * each call. Construction acquires no client and owns no transaction. */
98
- const makeNativeSqlTables = (client, convert = directTable) => {
102
+ const makeNativeSqlTables = (client, convert = directTable, expression = (value) => compileSqlExpression(client, value)) => {
99
103
  const tables = /* @__PURE__ */ new WeakMap();
100
- return (table) => {
104
+ return Object.assign((table) => {
101
105
  const existing = tables.get(table);
102
106
  if (existing !== void 0) return existing;
103
107
  const mapped = convert(client, table);
104
108
  tables.set(table, mapped);
105
109
  return mapped;
106
- };
110
+ }, { expression });
107
111
  };
108
112
  //#endregion
109
113
  export { makeNativeSqlTables, nativeSqlAlias, sqlMapping };
@@ -1 +1 @@
1
- {"version":3,"file":"native-sql-table.mjs","names":["Statement"],"sources":["../../src/internal/native-sql-table.ts"],"sourcesContent":["import { Effect } from \"effect\";\nimport type { SqlClient } from \"effect/sql/SqlClient\";\nimport * as Statement from \"effect/sql/Statement\";\n\nimport { PersistenceMappingError } from \"./mapping-error\";\nimport { Table, identifier } from \"./sql-table\";\nimport type { PhysicalTextColumn } from \"./storage-validation\";\n\n/** Capture synchronous mapping callbacks without changing SQL execution errors. */\nexport const sqlMapping = <A>(thunk: () => A): Effect.Effect<A, PersistenceMappingError> =>\n Effect.try({\n try: thunk,\n catch: (cause) => PersistenceMappingError.make({ operation: \"mapping\", cause }),\n });\n\n/** Physical SQL representation only. Semantic row codecs and policy remain in\n * the owning mapping. Execute assembled statements without name/result transforms. */\nexport interface SqlTable {\n readonly name: Statement.Fragment;\n /** Alias reads only; writes continue to target the original physical table. */\n readonly as: (alias: string) => SqlTable;\n readonly column: (key: string) => Statement.Fragment;\n /** Optional codec-free text candidate. Physical type/collation compatibility\n * must still be checked against the database before comparing columns. */\n readonly unencodedTextColumn?: (key: string) => PhysicalTextColumn | undefined;\n /** Project every column under an ordinal alias, using a distinct prefix per table. */\n readonly fields: (prefix: string) => Statement.Fragment;\n readonly decode: (\n row: Readonly<Record<string, unknown>>,\n prefix: string,\n ) => Record<string, unknown>;\n readonly value: (key: string, value: unknown) => Statement.Fragment;\n /** Complete INSERT prefix; append conflict/returning clauses in the owning operation. */\n readonly insert: (values: Readonly<Record<string, unknown>>) => Statement.Fragment;\n /** Complete UPDATE ... SET prefix; the owning operation supplies its predicate. */\n readonly update: (values: Readonly<Record<string, unknown>>) => Statement.Fragment;\n}\n\nexport type NativeSqlTables = (table: object) => SqlTable;\n\n/** Prefixes are short ASCII identifiers so ordinal aliases cannot be truncated\n * by PostgreSQL. Callers distinguish tables by prefix, never by physical names. */\nexport const nativeSqlAlias = (prefix: string, index: number): string => {\n if (!/^[A-Za-z_][A-Za-z0-9_]{0,39}$/.test(prefix))\n throw PersistenceMappingError.make({ operation: \"mapping\", cause: \"Invalid SQL alias prefix\" });\n\n return `${prefix}${index}`;\n};\n\nconst directTable = (client: SqlClient, physical: object): SqlTable => {\n if (!(physical instanceof Table))\n throw PersistenceMappingError.make({ operation: \"mapping\", cause: \"Expected a SQL table\" });\n\n const quote = (name: string) => {\n if (name.includes(\"\\0\"))\n throw PersistenceMappingError.make({ operation: \"mapping\", cause: \"NUL in SQL identifier\" });\n\n return client.literal(identifier(name));\n };\n\n const name =\n physical.schema === undefined\n ? quote(physical.name)\n : client`${quote(physical.schema)}.${quote(physical.name)}`;\n\n const columns = Object.entries(physical.columns);\n\n const getColumn = (key: string) => {\n const column = Object.hasOwn(physical.columns, key) ? physical.columns[key] : undefined;\n\n if (column === undefined)\n throw PersistenceMappingError.make({ operation: \"column\", cause: \"Missing SQL column\" });\n\n return column;\n };\n\n const value = (key: string, input: unknown): Statement.Fragment => {\n const mapped = getColumn(key);\n\n if (Statement.isFragment(input)) return input;\n const encoded = input === null ? null : mapped.mapToDriverValue(input);\n\n return Statement.fragment([\n Statement.parameter(\n typeof encoded === \"boolean\"\n ? client.onDialectOrElse({ sqlite: () => Number(encoded), orElse: () => encoded })\n : encoded,\n ),\n ]);\n };\n\n const entries = (values: Readonly<Record<string, unknown>>) =>\n Object.entries(values).filter(\n ([key, input]) => Object.hasOwn(physical.columns, key) && input !== undefined,\n );\n\n const bind = (alias?: string): SqlTable => {\n const reference = alias === undefined ? name : quote(alias);\n const column = (key: string) => client`${reference}.${quote(getColumn(key).options.name)}`;\n\n return {\n name: alias === undefined ? name : client`${name} AS ${reference}`,\n as: bind,\n column,\n unencodedTextColumn: (key) =>\n getColumn(key).options.type === \"text\"\n ? {\n table: {\n name: physical.name,\n ...(physical.schema === undefined ? {} : { schema: physical.schema }),\n },\n name: getColumn(key).options.name,\n }\n : undefined,\n value,\n fields: (prefix) =>\n client.join(\n \", \",\n false,\n )(\n columns.map(\n ([key], index) => client`${column(key)} AS ${quote(nativeSqlAlias(prefix, index))}`,\n ),\n ),\n decode: (row, prefix) =>\n Object.fromEntries(\n columns.map(([key, field], index) => {\n const alias = nativeSqlAlias(prefix, index);\n\n if (!Object.hasOwn(row, alias))\n throw PersistenceMappingError.make({\n operation: \"decode\",\n cause: \"Missing SQL projection field\",\n });\n\n return [key, field.decode(row[alias])];\n }),\n ),\n insert: (values) => {\n const fields = entries(values);\n\n if (fields.length === 0) return client`INSERT INTO ${name} DEFAULT VALUES`;\n\n return client`INSERT INTO ${name} (${client.join(\", \", false)(fields.map(([key]) => quote(getColumn(key).options.name)))}) VALUES (${client.join(\", \", false)(fields.map(([key, input]) => value(key, input)))})`;\n },\n update: (values) => {\n const fields = entries(values);\n\n if (fields.length === 0)\n throw PersistenceMappingError.make({ operation: \"mapping\", cause: \"Empty SQL update\" });\n\n return client`UPDATE ${name} SET ${client.join(\", \", false)(fields.map(([key, input]) => client`${quote(getColumn(key).options.name)} = ${value(key, input)}`))}`;\n },\n };\n };\n\n return bind();\n};\n\n/** Cache physical metadata only; insert/update materialize values and hooks at\n * each call. Construction acquires no client and owns no transaction. */\nexport const makeNativeSqlTables = (\n client: SqlClient,\n convert: (client: SqlClient, table: object) => SqlTable = directTable,\n): NativeSqlTables => {\n const tables = new WeakMap<object, SqlTable>();\n\n return (table) => {\n const existing = tables.get(table);\n\n if (existing !== undefined) return existing;\n const mapped = convert(client, table);\n\n tables.set(table, mapped);\n\n return mapped;\n };\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"native-sql-table.mjs","names":["Statement"],"sources":["../../src/internal/native-sql-table.ts"],"sourcesContent":["import { Effect } from \"effect\";\nimport type { SqlClient } from \"effect/sql/SqlClient\";\nimport * as Statement from \"effect/sql/Statement\";\n\nimport { PersistenceMappingError } from \"./mapping-error\";\nimport { compileSqlExpression } from \"./sql-expression\";\nimport { Table, identifier } from \"./sql-table\";\n\nexport interface PhysicalTextColumn {\n readonly table: { readonly name: string; readonly schema?: string };\n readonly name: string;\n}\n\n/** Capture synchronous mapping callbacks without changing SQL execution errors. */\nexport const sqlMapping = <A>(thunk: () => A): Effect.Effect<A, PersistenceMappingError> =>\n Effect.try({\n try: thunk,\n catch: (cause) => PersistenceMappingError.make({ operation: \"mapping\", cause }),\n });\n\n/** Physical SQL representation only. Semantic row codecs and policy remain in\n * the owning mapping. Execute assembled statements without name/result transforms. */\nexport interface SqlTable {\n readonly keys: ReadonlyArray<string>;\n readonly name: Statement.Fragment;\n /** Alias reads only; writes continue to target the original physical table. */\n readonly as: (alias: string) => SqlTable;\n readonly column: (key: string) => Statement.Fragment;\n /** Unqualified physical name for conflict targets and assignment lists. */\n readonly columnName: (key: string) => Statement.Fragment;\n /** Result projection, including the physical driver's result codec cast. */\n readonly selectedColumn: (key: string) => Statement.Fragment;\n /** Optional codec-free text candidate. Physical type/collation compatibility\n * must still be checked against the database before comparing columns. */\n readonly unencodedTextColumn?: (key: string) => PhysicalTextColumn | undefined;\n /** Project every column under an ordinal alias, using a distinct prefix per table. */\n readonly fields: (prefix: string) => Statement.Fragment;\n readonly decode: (\n row: Readonly<Record<string, unknown>>,\n prefix: string,\n ) => Record<string, unknown>;\n readonly value: (key: string, value: unknown) => Statement.Fragment;\n /** Complete INSERT prefix; append conflict/returning clauses in the owning operation. */\n readonly insert: (values: Readonly<Record<string, unknown>>) => Statement.Fragment;\n /** Complete UPDATE ... SET prefix; the owning operation supplies its predicate. */\n readonly update: (values: Readonly<Record<string, unknown>>) => Statement.Fragment;\n}\n\nexport interface NativeSqlTables {\n (table: object): SqlTable;\n /** Compile a mapped predicate without executing it or acquiring resources. */\n readonly expression: (value: unknown) => Statement.Fragment;\n}\n\n/** Prefixes are short ASCII identifiers so ordinal aliases cannot be truncated\n * by PostgreSQL. Callers distinguish tables by prefix, never by physical names. */\nexport const nativeSqlAlias = (prefix: string, index: number): string => {\n if (!/^[A-Za-z_][A-Za-z0-9_]{0,39}$/.test(prefix))\n throw PersistenceMappingError.make({ operation: \"mapping\", cause: \"Invalid SQL alias prefix\" });\n\n return `${prefix}${index}`;\n};\n\nconst directTable = (client: SqlClient, physical: object): SqlTable => {\n if (!(physical instanceof Table))\n throw PersistenceMappingError.make({ operation: \"mapping\", cause: \"Expected a SQL table\" });\n\n const quote = (name: string) => {\n if (name.includes(\"\\0\"))\n throw PersistenceMappingError.make({ operation: \"mapping\", cause: \"NUL in SQL identifier\" });\n\n return client.literal(identifier(name));\n };\n\n const name =\n physical.schema === undefined\n ? quote(physical.name)\n : client`${quote(physical.schema)}.${quote(physical.name)}`;\n\n const columns = Object.entries(physical.columns);\n\n const getColumn = (key: string) => {\n const column = Object.hasOwn(physical.columns, key) ? physical.columns[key] : undefined;\n\n if (column === undefined)\n throw PersistenceMappingError.make({ operation: \"column\", cause: \"Missing SQL column\" });\n\n return column;\n };\n\n const value = (key: string, input: unknown): Statement.Fragment => {\n getColumn(key);\n\n if (Statement.isFragment(input)) return input;\n const encoded = input;\n\n return Statement.fragment([\n Statement.parameter(\n typeof encoded === \"boolean\"\n ? client.onDialectOrElse({ sqlite: () => Number(encoded), orElse: () => encoded })\n : encoded,\n ),\n ]);\n };\n\n const entries = (values: Readonly<Record<string, unknown>>) =>\n Object.entries(values).filter(\n ([key, input]) => Object.hasOwn(physical.columns, key) && input !== undefined,\n );\n\n const bind = (alias?: string): SqlTable => {\n const reference = alias === undefined ? name : quote(alias);\n const column = (key: string) => client`${reference}.${quote(getColumn(key).options.name)}`;\n\n return {\n keys: columns.map(([key]) => key),\n name: alias === undefined ? name : client`${name} AS ${reference}`,\n as: bind,\n column,\n columnName: (key) => quote(getColumn(key).options.name),\n selectedColumn: column,\n unencodedTextColumn: (key) =>\n getColumn(key).options.type === \"text\"\n ? {\n table: {\n name: physical.name,\n ...(physical.schema === undefined ? {} : { schema: physical.schema }),\n },\n name: getColumn(key).options.name,\n }\n : undefined,\n value,\n fields: (prefix) =>\n client.join(\n \", \",\n false,\n )(\n columns.map(\n ([key], index) => client`${column(key)} AS ${quote(nativeSqlAlias(prefix, index))}`,\n ),\n ),\n decode: (row, prefix) =>\n Object.fromEntries(\n columns.map(([key, field], index) => {\n const alias = nativeSqlAlias(prefix, index);\n\n if (!Object.hasOwn(row, alias))\n throw PersistenceMappingError.make({\n operation: \"decode\",\n cause: \"Missing SQL projection field\",\n });\n\n return [key, field.decode(row[alias])];\n }),\n ),\n insert: (values) => {\n const fields = entries(values);\n\n if (fields.length === 0) return client`INSERT INTO ${name} DEFAULT VALUES`;\n\n return client`INSERT INTO ${name} (${client.join(\", \", false)(fields.map(([key]) => quote(getColumn(key).options.name)))}) VALUES (${client.join(\", \", false)(fields.map(([key, input]) => value(key, input)))})`;\n },\n update: (values) => {\n const fields = entries(values);\n\n if (fields.length === 0)\n throw PersistenceMappingError.make({ operation: \"mapping\", cause: \"Empty SQL update\" });\n\n return client`UPDATE ${name} SET ${client.join(\", \", false)(fields.map(([key, input]) => client`${quote(getColumn(key).options.name)} = ${value(key, input)}`))}`;\n },\n };\n };\n\n return bind();\n};\n\n/** Cache physical metadata only; insert/update materialize values and hooks at\n * each call. Construction acquires no client and owns no transaction. */\nexport const makeNativeSqlTables = (\n client: SqlClient,\n convert: (client: SqlClient, table: object) => SqlTable = directTable,\n expression: NativeSqlTables[\"expression\"] = (value) => compileSqlExpression(client, value),\n): NativeSqlTables => {\n const tables = new WeakMap<object, SqlTable>();\n\n return Object.assign(\n (table: object) => {\n const existing = tables.get(table);\n\n if (existing !== undefined) return existing;\n const mapped = convert(client, table);\n\n tables.set(table, mapped);\n\n return mapped;\n },\n { expression },\n );\n};\n"],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { SqlExpression, TableModel } from "../table-model.mjs";
2
+ import { NativeSqlTables } from "../native-sql-table.mjs";
3
+ import { OAuthAccountsMapping } from "../models/oauth-model.mjs";
4
+ import { Crypto, Effect } from "effect";
5
+ import { LifecycleHooks } from "@yielded/auth/Hooks";
6
+ import { SqlClient } from "effect/sql/SqlClient";
7
+ import * as M from "@yielded/auth/OAuth";
8
+ //#region src/internal/oauth/native-accounts.d.ts
9
+ export type OAuthNativeAccountsMapping = OAuthAccountsMapping<TableModel, TableModel, TableModel, TableModel, TableModel, unknown, SqlExpression>;
10
+ export declare const makeNativeOAuthAccountsServices: (tables: NativeSqlTables, mapping: OAuthNativeAccountsMapping, batch?: {
11
+ readonly client: SqlClient;
12
+ readonly execute: (statements: ReadonlyArray<import("effect/sql/Statement").Statement<unknown>>) => Effect.Effect<void, import("effect/sql/SqlError").SqlError>;
13
+ } | undefined) => Effect.Effect<{
14
+ readonly oauthAccountsPersistence: M.OAuthAccountsPersistence["Service"];
15
+ }, M.OAuthUnavailable, Crypto.Crypto | LifecycleHooks | SqlClient>;
16
+ //#endregion
17
+ //# sourceMappingURL=native-accounts.d.mts.map
@@ -0,0 +1,290 @@
1
+ import { anySqlCondition, exactSqlText } from "../sql-change.mjs";
2
+ import { CurrentSqlCommit, SqlBatchCommit, makeSqlCommitExecutor } from "../sql-commit.mjs";
3
+ import { makeConditionalSqlInsert } from "../session-native-record.mjs";
4
+ import { OAuthEligibilityFact } from "../models/oauth-model.mjs";
5
+ import { invariant, oauthIdentityKey, sameRevision, satisfies, unavailable } from "./state.mjs";
6
+ import { makeOAuthNativeFlow } from "./native-flow.mjs";
7
+ import { makeOAuthNativeState } from "./native-state.mjs";
8
+ import { makeOAuthNativeMutation } from "./native-mutation.mjs";
9
+ import { prepareOAuthNative } from "./native-sign-in.mjs";
10
+ import { Crypto, Effect, Option, Schema } from "effect";
11
+ import { SessionInvalidationWindow } from "@yielded/auth/Sessions";
12
+ import * as M from "@yielded/auth/OAuth";
13
+ //#region src/internal/oauth/native-accounts.ts
14
+ const makeNativeOAuthAccountsServices = Effect.fnUntraced(function* (tables, mapping, batch) {
15
+ const conditionalInsert = yield* makeConditionalSqlInsert();
16
+ const executor = yield* makeSqlCommitExecutor(unavailable);
17
+ const crypto = yield* Crypto.Crypto;
18
+ const external = yield* Effect.serviceOption(CurrentSqlCommit);
19
+ const state = yield* makeOAuthNativeState(tables, mapping);
20
+ const mutation = yield* makeOAuthNativeMutation(tables, mapping, batch !== void 0);
21
+ const flow = yield* makeOAuthNativeFlow(tables, mapping, M.OAuthLinkFlow, "link", (value) => value.context.revision.subjectId, batch !== void 0);
22
+ const { sql, now, credential, authority } = state;
23
+ const c = mapping.credential;
24
+ const a = mapping.authority;
25
+ const run = (effect, mode = "transaction") => {
26
+ const work = Effect.provideService(effect, Crypto.Crypto, crypto);
27
+ return batch === void 0 ? executor.run(work, mode) : executor.batch(work).pipe(Effect.provideService(SqlBatchCommit, batch));
28
+ };
29
+ const read = (effect) => executor.read(Effect.provideService(effect, Crypto.Crypto, crypto));
30
+ const credentialCondition = (nativeId, key, id, revision) => sql.and([
31
+ sql`${credential.column(c.subjectId)} = ${credential.value(c.subjectId, nativeId)}`,
32
+ exactSqlText(sql, credential.column(c.identityKey), credential.value(c.identityKey, key)),
33
+ exactSqlText(sql, credential.column(c.credentialId), credential.value(c.credentialId, id)),
34
+ exactSqlText(sql, credential.column(c.credentialRevision), credential.value(c.credentialRevision, revision)),
35
+ tables.expression(c.activeCondition)
36
+ ]);
37
+ return { oauthAccountsPersistence: {
38
+ capture: (input) => read(Effect.map(state.capture(input.subjectId, false), (current) => current?.revision)),
39
+ issue: (original, prepare) => run(Effect.gen(function* () {
40
+ const input = M.snapshotOAuthSync(M.OAuthLinkFlow, original);
41
+ const issued = yield* flow.issue(input);
42
+ return yield* prepareOAuthNative(issued ? {
43
+ _tag: "Issued",
44
+ flow: input
45
+ } : { _tag: "Rejected" }, prepare);
46
+ }), flow.mysql ? "transaction" : "statement"),
47
+ consume: (original, prepare) => run(Effect.gen(function* () {
48
+ const input = M.snapshotOAuthSync(M.OAuthLinkAccess, original);
49
+ const consumed = yield* flow.consume(input);
50
+ return yield* prepareOAuthNative(consumed === void 0 ? { _tag: "Rejected" } : {
51
+ _tag: "Consumed",
52
+ flow: consumed
53
+ }, prepare);
54
+ }), flow.mysql ? "transaction" : "statement"),
55
+ link: (original, prepare) => run(Effect.gen(function* () {
56
+ const flow = M.snapshotOAuthSync(M.OAuthLinkFlow, original.flow);
57
+ const verified = M.snapshotOAuthSync(M.OAuthVerifiedExternalIdentity, original.identity);
58
+ const context = flow.context;
59
+ const current = yield* mutation.capture(context.revision.subjectId, batch === void 0);
60
+ const rejected = () => prepareOAuthNative({ _tag: "Rejected" }, prepare);
61
+ if (current === void 0 || !sameRevision(context.revision, current.revision) || context.provider !== verified.identity.provider || context.issuer !== verified.identity.issuer || current.now >= context.expiresAtMillis) return yield* rejected();
62
+ const deadline = Math.min(context.expiresAtMillis, context.authorization.validUntilMillis);
63
+ const before = sql.and([mutation.authorityCondition(current.nativeId, current.revision), sql`${now} < ${deadline}`]);
64
+ if (batch !== void 0) yield* mutation.assert(before);
65
+ const identityKey = yield* mutation.ensureOwnership(verified.identity, current.nativeId);
66
+ if (identityKey === void 0) return yield* prepareOAuthNative({ _tag: "Conflict" }, prepare);
67
+ const identityCondition = exactSqlText(sql, credential.column(c.identityKey), credential.value(c.identityKey, identityKey));
68
+ const existing = batch === void 0 ? [] : yield* sql`select ${credential.fields("login_")} from ${credential.name} where ${identityCondition} and ${before}`;
69
+ invariant(existing.length <= 1);
70
+ let credentialId = yield* mapping.allocateCredentialId;
71
+ let credentialRevision = yield* mapping.allocateRevision;
72
+ let changed = false;
73
+ let revision = current.revision;
74
+ if (existing.length === 0) {
75
+ const values = {
76
+ ...c.encodeInsert({
77
+ moduleId: context.moduleId,
78
+ subjectId: current.nativeId,
79
+ identityKey,
80
+ credentialId,
81
+ credentialRevision
82
+ }),
83
+ [c.moduleId]: context.moduleId,
84
+ [c.subjectId]: current.nativeId,
85
+ [c.identityKey]: identityKey,
86
+ [c.credentialId]: credentialId,
87
+ [c.credentialRevision]: credentialRevision
88
+ };
89
+ invariant(c.isActiveStatus(values[c.status]));
90
+ changed = (yield* mutation.insertUnique(sql`${conditionalInsert(credential, values, before)} ${sql.onDialectOrElse({
91
+ mysql: () => sql``,
92
+ orElse: () => sql`on conflict do nothing`
93
+ })}`)) === 1;
94
+ }
95
+ if (changed) {
96
+ const factor = {
97
+ ...a.encodeInsert({
98
+ subjectId: current.nativeId,
99
+ credentialId,
100
+ revision: credentialRevision
101
+ }),
102
+ [a.subjectId]: current.nativeId,
103
+ [a.credentialId]: credentialId,
104
+ [a.revision]: credentialRevision
105
+ };
106
+ invariant(a.isActiveStatus(factor[a.status]));
107
+ invariant((yield* mutation.change(conditionalInsert(authority, factor, sql.and([before, sql`exists(select 1 from ${credential.name} where ${credentialCondition(current.nativeId, identityKey, credentialId, credentialRevision)})`])))) === 1);
108
+ revision = {
109
+ ...current.revision,
110
+ credentials: [...current.revision.credentials, {
111
+ credentialId,
112
+ revision: credentialRevision
113
+ }].sort((left, right) => left.credentialId.localeCompare(right.credentialId))
114
+ };
115
+ } else {
116
+ const rows = existing.length === 1 ? existing : yield* sql`select ${credential.fields("login_")} from ${credential.name} where ${identityCondition} and ${before}`;
117
+ invariant(rows.length === 1);
118
+ const row = credential.decode(rows[0], "login_");
119
+ invariant(mapping.subjectId.equals(row[c.subjectId], current.nativeId) && row[c.moduleId] === context.moduleId && c.isActiveStatus(row[c.status]));
120
+ credentialId = yield* Schema.decodeUnknownEffect(M.OAuthCredentialSnapshot.fields.credentialId)(row[c.credentialId]);
121
+ credentialRevision = yield* Schema.decodeUnknownEffect(M.OAuthCredentialSnapshot.fields.credentialRevision)(row[c.credentialRevision]);
122
+ invariant(revision.credentials.some((entry) => entry.credentialId === credentialId && entry.revision === credentialRevision));
123
+ }
124
+ if (Option.isSome(external)) yield* mutation.finish("oauth-link-authority", sql.and([
125
+ mutation.authorityCondition(current.nativeId, revision),
126
+ sql`${now} < ${deadline}`,
127
+ sql`exists(select 1 from ${credential.name} where ${credentialCondition(current.nativeId, identityKey, credentialId, credentialRevision)})`,
128
+ sql`exists(select 1 from ${mutation.ownership.name} where ${mutation.ownerCondition(identityKey, current.nativeId)})`
129
+ ]));
130
+ const result = yield* Schema.decodeEffect(Schema.toType(M.OAuthCredentialSnapshot))({
131
+ moduleId: context.moduleId,
132
+ identity: verified.identity,
133
+ credentialId,
134
+ credentialRevision,
135
+ revision,
136
+ requirement: mapping.subject.decodeAuthenticationRequirement(current.subject)
137
+ });
138
+ return yield* prepareOAuthNative({
139
+ _tag: "Linked",
140
+ credential: result,
141
+ changed
142
+ }, prepare);
143
+ })),
144
+ readCredential: (original) => read(Effect.suspend(() => state.readCredential(M.snapshotOAuthSync(M.OAuthCredentialKey, original)))),
145
+ unlink: (original, prepare) => run(Effect.gen(function* () {
146
+ const captured = M.snapshotOAuthSync(M.OAuthCredentialSnapshot, original.credential);
147
+ const authorization = M.snapshotOAuthSync(M.OAuthActionAuthorization, original.authorization);
148
+ const invalidation = M.snapshotOAuthSync(SessionInvalidationWindow, original.invalidation);
149
+ invariant(invalidation.trigger === "credential-change" && invalidation.oldAuthenticationEvidence === "rejected" && (mapping.sessionInvalidation === "same-authority-immediate" ? invalidation.existingSessions === "immediate" && invalidation.maximumExposureMillis === 0 || invalidation.existingSessions === "cache-expiry" && invalidation.maximumExposureMillis > 0 : invalidation.existingSessions === "original-absolute-expiry"));
150
+ const current = yield* mutation.capture(captured.revision.subjectId, batch === void 0);
151
+ const rejected = () => prepareOAuthNative({ _tag: "Rejected" }, prepare);
152
+ if (current === void 0 || !sameRevision(current.revision, captured.revision)) return yield* rejected();
153
+ const key = yield* oauthIdentityKey(captured.identity);
154
+ const target = credentialCondition(current.nativeId, key, captured.credentialId, captured.credentialRevision);
155
+ const eligible = /* @__PURE__ */ new Map();
156
+ invariant(mapping.eligibility.length <= 32);
157
+ const sources = mapping.eligibility.map((source) => ({
158
+ source,
159
+ table: tables(source.table)
160
+ }));
161
+ invariant(sources.reduce((count, entry) => count + entry.table.keys.length, 0) <= 1024);
162
+ const branches = sources.map(({ source, table }, branch) => {
163
+ const fields = sources.flatMap((entry, index) => entry.table.keys.map((key, ordinal) => sql`${index === branch ? table.selectedColumn(key) : sql`(select ${entry.table.selectedColumn(key)} from ${entry.table.name} where 1 = 0)`} as ${sql(`method_${index}_${ordinal}`)}`));
164
+ return sql`select * from (select ${sql.literal(String(branch))} as method_branch, 1 as target_present, ${sql.join(", ", false)(fields)} from ${table.name}
165
+ where ${table.column(source.subjectId)} = ${table.value(source.subjectId, current.nativeId)} and ${tables.expression(source.condition(current.nativeId))}
166
+ order by ${table.column(source.credentialId)} limit 65) as ${sql(`eligible_${branch}`)}`;
167
+ });
168
+ const allowed = sql.and([mutation.authorityCondition(current.nativeId, current.revision), sql`exists(select 1 from ${credential.name} where ${target} and ${exactSqlText(sql, credential.column(c.moduleId), credential.value(c.moduleId, captured.moduleId))})`]);
169
+ const empty = sources.flatMap((entry, index) => entry.table.keys.map((key, ordinal) => sql`(select ${entry.table.selectedColumn(key)} from ${entry.table.name} where 1 = 0) as ${sql(`method_${index}_${ordinal}`)}`));
170
+ const sentinel = sql`select -1 as method_branch, case when ${allowed} then 1 else 0 end as target_present ${empty.length === 0 ? sql`` : sql`, ${sql.join(", ", false)(empty)}`}`;
171
+ const candidates = yield* sql`${sql.join(" union all ", false)([sentinel, ...branches])}`;
172
+ const presence = candidates.find((row) => Number(row.method_branch) === -1);
173
+ invariant(presence !== void 0);
174
+ if (Number(presence.target_present) !== 1) return yield* rejected();
175
+ const counts = /* @__PURE__ */ new Map();
176
+ for (const row of candidates) {
177
+ const branch = yield* Schema.decodeEffect(Schema.Int)(Number(row.method_branch));
178
+ if (branch === -1) continue;
179
+ const entry = sources[branch];
180
+ invariant(entry !== void 0);
181
+ const count = (counts.get(branch) ?? 0) + 1;
182
+ invariant(count <= 64);
183
+ counts.set(branch, count);
184
+ const { source, table } = entry;
185
+ const decoded = source.decode(table.decode(row, `method_${branch}_`));
186
+ if (decoded === void 0) continue;
187
+ const parsed = yield* Schema.decodeEffect(OAuthEligibilityFact)(decoded);
188
+ const fact = {
189
+ ...parsed,
190
+ factors: [...new Set(parsed.factors)].sort()
191
+ };
192
+ if (fact.credentialId !== captured.credentialId && current.revision.credentials.some((item) => item.credentialId === fact.credentialId && item.revision === fact.revision)) {
193
+ const condition = sql`exists(select 1 from ${table.name} where
194
+ ${table.column(source.subjectId)} = ${table.value(source.subjectId, current.nativeId)}
195
+ and ${exactSqlText(sql, table.column(source.credentialId), table.value(source.credentialId, fact.credentialId))}
196
+ and ${exactSqlText(sql, table.column(source.revision), table.value(source.revision, fact.revision))}
197
+ and ${tables.expression(source.condition(current.nativeId))})`;
198
+ const previous = eligible.get(fact.credentialId);
199
+ if (previous === void 0) eligible.set(fact.credentialId, {
200
+ fact,
201
+ conditions: [condition]
202
+ });
203
+ else {
204
+ const encode = Schema.encodeEffect(Schema.fromJsonString(Schema.toCodecJson(OAuthEligibilityFact)));
205
+ invariant((yield* encode(previous.fact)) === (yield* encode(fact)));
206
+ previous.conditions.push(condition);
207
+ }
208
+ }
209
+ }
210
+ const methods = [...eligible.values()];
211
+ const facts = methods.map((entry) => entry.fact);
212
+ const requirement = mapping.subject.decodeAuthenticationRequirement(current.subject);
213
+ if (!facts.some((fact) => fact.usablePrimary) || !satisfies(facts, requirement)) return yield* prepareOAuthNative({ _tag: "LastSignInMethod" }, prepare);
214
+ const present = (entry) => anySqlCondition(entry.conditions);
215
+ const remaining = sql.and([anySqlCondition(methods.filter((entry) => entry.fact.usablePrimary).map(present)), anySqlCondition(requirement.alternatives.map((alternative) => sql.and([
216
+ ...alternative.factors.map((factor) => anySqlCondition(methods.filter((entry) => entry.fact.factors.includes(factor)).map(present))),
217
+ sql`(${sql.join(" + ", false)(methods.map((entry) => sql`case when ${present(entry)} then 1 else 0 end`))}) >= ${alternative.minimumCredentials}`,
218
+ anySqlCondition(methods.filter((entry) => (!alternative.userVerified || entry.fact.userVerified) && (!alternative.phishingResistant || entry.fact.phishingResistant)).map(present))
219
+ ])))]);
220
+ const required = sql.and([
221
+ mutation.subjectCondition(current.nativeId, current.revision),
222
+ mutation.factorCondition(current.nativeId, current.revision),
223
+ sql`${now} < ${authorization.validUntilMillis}`,
224
+ remaining
225
+ ]);
226
+ if (batch !== void 0) yield* mutation.assert(sql.and([
227
+ mutation.authorityCondition(current.nativeId, current.revision),
228
+ sql`${now} < ${authorization.validUntilMillis}`,
229
+ remaining
230
+ ]));
231
+ const nextSecurityRevision = mapping.subject.nextSecurityRevision(current.revision.securityRevision);
232
+ invariant(nextSecurityRevision !== current.revision.securityRevision);
233
+ const subject = mutation.subject;
234
+ invariant((yield* mutation.change(sql`${subject.update({ [mapping.subject.securityRevision]: nextSecurityRevision })}
235
+ where ${subject.column(mapping.subject.id)} = ${subject.value(mapping.subject.id, current.nativeId)} and ${required}`)) === 1);
236
+ invariant((yield* mutation.change(sql`delete from ${credential.name} where ${target}`)) === 1);
237
+ invariant((yield* mutation.change(sql`delete from ${authority.name}
238
+ where ${authority.column(a.subjectId)} = ${authority.value(a.subjectId, current.nativeId)}
239
+ and ${exactSqlText(sql, authority.column(a.credentialId), authority.value(a.credentialId, captured.credentialId))}
240
+ and ${exactSqlText(sql, authority.column(a.revision), authority.value(a.revision, captured.credentialRevision))}`)) === 1);
241
+ const cleanup = {
242
+ subjectId: current.nativeId,
243
+ revision: current.revision,
244
+ removedCredentialId: captured.credentialId
245
+ };
246
+ invariant(mapping.cleanup.length <= 32);
247
+ const absent = [];
248
+ for (const source of mapping.cleanup) {
249
+ const table = tables(source.table);
250
+ const condition = sql.and([sql`${table.column(source.subjectId)} = ${table.value(source.subjectId, current.nativeId)}`, tables.expression(source.condition(cleanup))]);
251
+ const deletion = sql`delete from ${table.name} where ${condition}`;
252
+ absent.push(sql`not exists(select 1 from ${table.name} where ${condition})`);
253
+ yield* mutation.execute(deletion);
254
+ }
255
+ const referenced = sql.or([sql`exists(select 1 from ${credential.name} where ${exactSqlText(sql, credential.column(c.identityKey), credential.value(c.identityKey, key))})`, tables.expression(mapping.otherReferences({
256
+ identityKey: key,
257
+ subjectId: current.nativeId
258
+ }))]);
259
+ yield* mutation.releaseOwnership(key, current.nativeId, referenced);
260
+ const revision = {
261
+ ...current.revision,
262
+ securityRevision: nextSecurityRevision,
263
+ credentials: current.revision.credentials.filter((item) => item.credentialId !== captured.credentialId)
264
+ };
265
+ yield* mutation.finish("oauth-unlink-authority", sql.and([
266
+ mutation.authorityCondition(current.nativeId, revision),
267
+ sql`${now} < ${authorization.validUntilMillis}`,
268
+ remaining,
269
+ sql`not exists(select 1 from ${credential.name} where ${target})`,
270
+ ...absent
271
+ ]));
272
+ return yield* prepareOAuthNative({
273
+ _tag: "Unlinked",
274
+ result: {
275
+ _tag: "Unlinked",
276
+ credentialId: captured.credentialId,
277
+ invalidation
278
+ }
279
+ }, prepare);
280
+ })),
281
+ cleanup: (original, prepare) => run(Effect.gen(function* () {
282
+ const input = M.snapshotOAuthSync(M.OAuthCleanupInput, original);
283
+ return yield* prepareOAuthNative(yield* flow.cleanup(input.moduleId, input.limit), prepare);
284
+ }), "statement")
285
+ } };
286
+ });
287
+ //#endregion
288
+ export { makeNativeOAuthAccountsServices };
289
+
290
+ //# sourceMappingURL=native-accounts.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native-accounts.mjs","names":[],"sources":["../../../src/internal/oauth/native-accounts.ts"],"sourcesContent":["import type { LifecycleHooks } from \"@yielded/auth/Hooks\";\nimport * as M from \"@yielded/auth/OAuth\";\nimport { SessionInvalidationWindow } from \"@yielded/auth/Sessions\";\nimport { Crypto, Effect, Option, Schema } from \"effect\";\nimport type { SqlClient } from \"effect/sql/SqlClient\";\nimport type { Fragment } from \"effect/sql/Statement\";\n\nimport { type OAuthAccountsMapping, OAuthEligibilityFact } from \"../models/oauth-model\";\nimport type { NativeSqlTables } from \"../native-sql-table\";\nimport { makeConditionalSqlInsert } from \"../session-native-record\";\nimport { anySqlCondition, exactSqlText } from \"../sql-change\";\nimport { makeSqlCommitExecutor, SqlBatchCommit, CurrentSqlCommit } from \"../sql-commit\";\nimport type { SqlExpression, TableModel } from \"../table-model\";\nimport { makeOAuthNativeFlow } from \"./native-flow\";\nimport { makeOAuthNativeMutation } from \"./native-mutation\";\nimport { prepareOAuthNative } from \"./native-sign-in\";\nimport { makeOAuthNativeState } from \"./native-state\";\nimport { invariant, oauthIdentityKey, sameRevision, satisfies, unavailable } from \"./state\";\n\n// Physical metadata is validated by the adapter; schema values remain typed.\nexport type OAuthNativeAccountsMapping = OAuthAccountsMapping<\n TableModel,\n TableModel,\n TableModel,\n TableModel,\n TableModel,\n unknown,\n SqlExpression\n>;\n\nexport const makeNativeOAuthAccountsServices = Effect.fnUntraced(function* (\n tables: NativeSqlTables,\n mapping: OAuthNativeAccountsMapping,\n batch?: SqlBatchCommit[\"Service\"],\n): Effect.fn.Return<\n { readonly oauthAccountsPersistence: M.OAuthAccountsPersistence[\"Service\"] },\n M.OAuthUnavailable,\n SqlClient | LifecycleHooks | Crypto.Crypto\n> {\n const conditionalInsert = yield* makeConditionalSqlInsert();\n const executor = yield* makeSqlCommitExecutor(unavailable);\n const crypto = yield* Crypto.Crypto;\n const external = yield* Effect.serviceOption(CurrentSqlCommit);\n const state = yield* makeOAuthNativeState(tables, mapping);\n const mutation = yield* makeOAuthNativeMutation(tables, mapping, batch !== undefined);\n\n const flow = yield* makeOAuthNativeFlow(\n tables,\n mapping,\n M.OAuthLinkFlow,\n \"link\",\n (value) => value.context.revision.subjectId,\n batch !== undefined,\n );\n\n const { sql, now, credential, authority } = state;\n\n const c = mapping.credential;\n const a = mapping.authority;\n\n const run = <A, E, R>(\n effect: Effect.Effect<A, E, R>,\n mode: \"transaction\" | \"statement\" = \"transaction\",\n ) => {\n const work = Effect.provideService(effect, Crypto.Crypto, crypto);\n\n return batch === undefined\n ? executor.run(work, mode)\n : executor.batch(work).pipe(Effect.provideService(SqlBatchCommit, batch));\n };\n\n const read = <A, E, R>(effect: Effect.Effect<A, E, R>) =>\n executor.read(Effect.provideService(effect, Crypto.Crypto, crypto));\n\n const credentialCondition = (nativeId: unknown, key: string, id: string, revision: unknown) =>\n sql.and([\n sql`${credential.column(c.subjectId)} = ${credential.value(c.subjectId, nativeId)}`,\n exactSqlText(sql, credential.column(c.identityKey), credential.value(c.identityKey, key)),\n exactSqlText(sql, credential.column(c.credentialId), credential.value(c.credentialId, id)),\n exactSqlText(\n sql,\n credential.column(c.credentialRevision),\n credential.value(c.credentialRevision, revision),\n ),\n tables.expression(c.activeCondition),\n ]);\n\n const service: M.OAuthAccountsPersistence[\"Service\"] = {\n capture: (input) =>\n read(Effect.map(state.capture(input.subjectId, false), (current) => current?.revision)),\n issue: (original, prepare) =>\n run(\n Effect.gen(function* () {\n const input = M.snapshotOAuthSync(M.OAuthLinkFlow, original);\n // Flow issue has no protected authority mutation; completion owns the one\n // subject-first recheck of this authenticated begin authorization.\n const issued = yield* flow.issue(input);\n\n return yield* prepareOAuthNative(\n issued ? { _tag: \"Issued\", flow: input } : { _tag: \"Rejected\" },\n prepare,\n );\n }),\n flow.mysql ? \"transaction\" : \"statement\",\n ),\n consume: (original, prepare) =>\n run(\n Effect.gen(function* () {\n const input = M.snapshotOAuthSync(M.OAuthLinkAccess, original);\n const consumed = yield* flow.consume(input);\n\n return yield* prepareOAuthNative(\n consumed === undefined ? { _tag: \"Rejected\" } : { _tag: \"Consumed\", flow: consumed },\n prepare,\n );\n }),\n flow.mysql ? \"transaction\" : \"statement\",\n ),\n link: (original, prepare) =>\n run(\n Effect.gen(function* () {\n const flow = M.snapshotOAuthSync(M.OAuthLinkFlow, original.flow);\n const verified = M.snapshotOAuthSync(M.OAuthVerifiedExternalIdentity, original.identity);\n const context = flow.context;\n\n const current = yield* mutation.capture(context.revision.subjectId, batch === undefined);\n const rejected = () => prepareOAuthNative({ _tag: \"Rejected\" } as const, prepare);\n\n if (\n current === undefined ||\n !sameRevision(context.revision, current.revision) ||\n context.provider !== verified.identity.provider ||\n context.issuer !== verified.identity.issuer ||\n current.now >= context.expiresAtMillis\n )\n return yield* rejected();\n\n const deadline = Math.min(\n context.expiresAtMillis,\n context.authorization.validUntilMillis,\n );\n\n const before = sql.and([\n mutation.authorityCondition(current.nativeId, current.revision),\n sql`${now} < ${deadline}`,\n ]);\n\n if (batch !== undefined) yield* mutation.assert(before);\n const identityKey = yield* mutation.ensureOwnership(verified.identity, current.nativeId);\n\n if (identityKey === undefined)\n return yield* prepareOAuthNative({ _tag: \"Conflict\" }, prepare);\n\n const identityCondition = exactSqlText(\n sql,\n credential.column(c.identityKey),\n credential.value(c.identityKey, identityKey),\n );\n\n // Fixed D1 plans classify an existing login before staging writes. Native\n // owners attempt the unique insert and read only its conflict outcome.\n const existing =\n batch === undefined\n ? []\n : yield* sql`select ${credential.fields(\"login_\")} from ${credential.name} where ${identityCondition} and ${before}`;\n\n invariant(existing.length <= 1);\n let credentialId = yield* mapping.allocateCredentialId;\n let credentialRevision = yield* mapping.allocateRevision;\n let changed = false;\n let revision = current.revision;\n\n if (existing.length === 0) {\n const values = {\n ...c.encodeInsert({\n moduleId: context.moduleId,\n subjectId: current.nativeId,\n identityKey,\n credentialId,\n credentialRevision,\n }),\n [c.moduleId]: context.moduleId,\n [c.subjectId]: current.nativeId,\n [c.identityKey]: identityKey,\n [c.credentialId]: credentialId,\n [c.credentialRevision]: credentialRevision,\n };\n\n invariant(c.isActiveStatus(values[c.status]));\n\n const inserted = yield* mutation.insertUnique(\n sql`${conditionalInsert(credential, values, before)} ${sql.onDialectOrElse({ mysql: () => sql``, orElse: () => sql`on conflict do nothing` })}`,\n );\n\n changed = inserted === 1;\n }\n if (changed) {\n const factor = {\n ...a.encodeInsert({\n subjectId: current.nativeId,\n credentialId,\n revision: credentialRevision,\n }),\n [a.subjectId]: current.nativeId,\n [a.credentialId]: credentialId,\n [a.revision]: credentialRevision,\n };\n\n invariant(a.isActiveStatus(factor[a.status]));\n invariant(\n (yield* mutation.change(\n conditionalInsert(\n authority,\n factor,\n sql.and([\n before,\n sql`exists(select 1 from ${credential.name} where ${credentialCondition(current.nativeId, identityKey, credentialId, credentialRevision)})`,\n ]),\n ),\n )) === 1,\n );\n revision = {\n ...current.revision,\n credentials: [\n ...current.revision.credentials,\n { credentialId, revision: credentialRevision },\n ].sort((left, right) => left.credentialId.localeCompare(right.credentialId)),\n };\n } else {\n const rows =\n existing.length === 1\n ? existing\n : yield* sql`select ${credential.fields(\"login_\")} from ${credential.name} where ${identityCondition} and ${before}`;\n\n invariant(rows.length === 1);\n const row = credential.decode(rows[0]!, \"login_\");\n\n invariant(\n mapping.subjectId.equals(row[c.subjectId], current.nativeId) &&\n row[c.moduleId] === context.moduleId &&\n c.isActiveStatus(row[c.status]),\n );\n credentialId = yield* Schema.decodeUnknownEffect(\n M.OAuthCredentialSnapshot.fields.credentialId,\n )(row[c.credentialId]);\n credentialRevision = yield* Schema.decodeUnknownEffect(\n M.OAuthCredentialSnapshot.fields.credentialRevision,\n )(row[c.credentialRevision]);\n invariant(\n revision.credentials.some(\n (entry) =>\n entry.credentialId === credentialId && entry.revision === credentialRevision,\n ),\n );\n }\n if (Option.isSome(external))\n yield* mutation.finish(\n \"oauth-link-authority\",\n sql.and([\n mutation.authorityCondition(current.nativeId, revision),\n sql`${now} < ${deadline}`,\n sql`exists(select 1 from ${credential.name} where ${credentialCondition(current.nativeId, identityKey, credentialId, credentialRevision)})`,\n sql`exists(select 1 from ${mutation.ownership.name} where ${mutation.ownerCondition(identityKey, current.nativeId)})`,\n ]),\n );\n\n const result = yield* Schema.decodeEffect(Schema.toType(M.OAuthCredentialSnapshot))({\n moduleId: context.moduleId,\n identity: verified.identity,\n credentialId,\n credentialRevision,\n revision,\n requirement: mapping.subject.decodeAuthenticationRequirement(current.subject),\n });\n\n return yield* prepareOAuthNative(\n { _tag: \"Linked\", credential: result, changed },\n prepare,\n );\n }),\n ),\n readCredential: (original) =>\n read(\n Effect.suspend(() =>\n state.readCredential(M.snapshotOAuthSync(M.OAuthCredentialKey, original)),\n ),\n ),\n unlink: (original, prepare) =>\n run(\n Effect.gen(function* () {\n const captured = M.snapshotOAuthSync(M.OAuthCredentialSnapshot, original.credential);\n\n const authorization = M.snapshotOAuthSync(\n M.OAuthActionAuthorization,\n original.authorization,\n );\n\n const invalidation = M.snapshotOAuthSync(\n SessionInvalidationWindow,\n original.invalidation,\n );\n\n invariant(\n invalidation.trigger === \"credential-change\" &&\n invalidation.oldAuthenticationEvidence === \"rejected\" &&\n (mapping.sessionInvalidation === \"same-authority-immediate\"\n ? (invalidation.existingSessions === \"immediate\" &&\n invalidation.maximumExposureMillis === 0) ||\n (invalidation.existingSessions === \"cache-expiry\" &&\n invalidation.maximumExposureMillis > 0)\n : invalidation.existingSessions === \"original-absolute-expiry\"),\n );\n\n const current = yield* mutation.capture(captured.revision.subjectId, batch === undefined);\n const rejected = () => prepareOAuthNative({ _tag: \"Rejected\" } as const, prepare);\n\n if (current === undefined || !sameRevision(current.revision, captured.revision))\n return yield* rejected();\n\n const key = yield* oauthIdentityKey(captured.identity);\n\n const target = credentialCondition(\n current.nativeId,\n key,\n captured.credentialId,\n captured.credentialRevision,\n );\n\n const eligible = new Map<\n string,\n { readonly fact: OAuthEligibilityFact; readonly conditions: Array<Fragment> }\n >();\n\n invariant(mapping.eligibility.length <= 32);\n\n const sources = mapping.eligibility.map((source) => ({\n source,\n table: tables(source.table),\n }));\n\n // Each branch owns distinct projection columns. Empty scalar subqueries\n // retain each physical SQL type across derived SELECT and UNION coercion.\n invariant(sources.reduce((count, entry) => count + entry.table.keys.length, 0) <= 1024);\n\n const branches = sources.map(({ source, table }, branch) => {\n const fields = sources.flatMap((entry, index) =>\n entry.table.keys.map(\n (key, ordinal) =>\n sql`${index === branch ? table.selectedColumn(key) : sql`(select ${entry.table.selectedColumn(key)} from ${entry.table.name} where 1 = 0)`} as ${sql(`method_${index}_${ordinal}`)}`,\n ),\n );\n\n // The bounded array ordinal is an integer SQL literal, matching the sentinel.\n return sql`select * from (select ${sql.literal(String(branch))} as method_branch, 1 as target_present, ${sql.join(\", \", false)(fields)} from ${table.name}\n where ${table.column(source.subjectId)} = ${table.value(source.subjectId, current.nativeId)} and ${tables.expression(source.condition(current.nativeId))}\n order by ${table.column(source.credentialId)} limit 65) as ${sql(`eligible_${branch}`)}`;\n });\n\n const allowed = sql.and([\n mutation.authorityCondition(current.nativeId, current.revision),\n sql`exists(select 1 from ${credential.name} where ${target} and ${exactSqlText(sql, credential.column(c.moduleId), credential.value(c.moduleId, captured.moduleId))})`,\n ]);\n\n const empty = sources.flatMap((entry, index) =>\n entry.table.keys.map(\n (key, ordinal) =>\n sql`(select ${entry.table.selectedColumn(key)} from ${entry.table.name} where 1 = 0) as ${sql(`method_${index}_${ordinal}`)}`,\n ),\n );\n\n const sentinel = sql`select -1 as method_branch, case when ${allowed} then 1 else 0 end as target_present ${empty.length === 0 ? sql`` : sql`, ${sql.join(\", \", false)(empty)}`}`;\n const candidates = yield* sql`${sql.join(\" union all \", false)([sentinel, ...branches])}`;\n const presence = candidates.find((row) => Number(row.method_branch) === -1);\n\n invariant(presence !== undefined);\n if (Number(presence.target_present) !== 1) return yield* rejected();\n\n const counts = new Map<number, number>();\n\n for (const row of candidates) {\n const branch = yield* Schema.decodeEffect(Schema.Int)(Number(row.method_branch));\n\n if (branch === -1) continue;\n const entry = sources[branch];\n\n invariant(entry !== undefined);\n const count = (counts.get(branch) ?? 0) + 1;\n\n invariant(count <= 64);\n counts.set(branch, count);\n const { source, table } = entry;\n const decoded = source.decode(table.decode(row, `method_${branch}_`));\n\n if (decoded === undefined) continue;\n const parsed = yield* Schema.decodeEffect(OAuthEligibilityFact)(decoded);\n const fact = { ...parsed, factors: [...new Set(parsed.factors)].sort() };\n\n if (\n fact.credentialId !== captured.credentialId &&\n current.revision.credentials.some(\n (item) =>\n item.credentialId === fact.credentialId && item.revision === fact.revision,\n )\n ) {\n const condition = sql`exists(select 1 from ${table.name} where\n ${table.column(source.subjectId)} = ${table.value(source.subjectId, current.nativeId)}\n and ${exactSqlText(sql, table.column(source.credentialId), table.value(source.credentialId, fact.credentialId))}\n and ${exactSqlText(sql, table.column(source.revision), table.value(source.revision, fact.revision))}\n and ${tables.expression(source.condition(current.nativeId))})`;\n\n const previous = eligible.get(fact.credentialId);\n\n if (previous === undefined)\n eligible.set(fact.credentialId, { fact, conditions: [condition] });\n else {\n const encode = Schema.encodeEffect(\n Schema.fromJsonString(Schema.toCodecJson(OAuthEligibilityFact)),\n );\n\n invariant((yield* encode(previous.fact)) === (yield* encode(fact)));\n previous.conditions.push(condition);\n }\n }\n }\n const methods = [...eligible.values()];\n const facts = methods.map((entry) => entry.fact);\n const requirement = mapping.subject.decodeAuthenticationRequirement(current.subject);\n\n if (!facts.some((fact) => fact.usablePrimary) || !satisfies(facts, requirement))\n return yield* prepareOAuthNative({ _tag: \"LastSignInMethod\" }, prepare);\n\n const present = (entry: (typeof methods)[number]) => anySqlCondition(entry.conditions);\n\n // Preserve a usable remaining method through application work. These\n // predicates describe eligible credential identities, not observed rows.\n const remaining = sql.and([\n anySqlCondition(methods.filter((entry) => entry.fact.usablePrimary).map(present)),\n anySqlCondition(\n requirement.alternatives.map((alternative) =>\n sql.and([\n ...alternative.factors.map((factor) =>\n anySqlCondition(\n methods.filter((entry) => entry.fact.factors.includes(factor)).map(present),\n ),\n ),\n sql`(${sql.join(\" + \", false)(methods.map((entry) => sql`case when ${present(entry)} then 1 else 0 end`))}) >= ${alternative.minimumCredentials}`,\n anySqlCondition(\n methods\n .filter(\n (entry) =>\n (!alternative.userVerified || entry.fact.userVerified) &&\n (!alternative.phishingResistant || entry.fact.phishingResistant),\n )\n .map(present),\n ),\n ]),\n ),\n ),\n ]);\n\n const required = sql.and([\n mutation.subjectCondition(current.nativeId, current.revision),\n mutation.factorCondition(current.nativeId, current.revision),\n sql`${now} < ${authorization.validUntilMillis}`,\n remaining,\n ]);\n\n if (batch !== undefined)\n yield* mutation.assert(\n sql.and([\n mutation.authorityCondition(current.nativeId, current.revision),\n sql`${now} < ${authorization.validUntilMillis}`,\n remaining,\n ]),\n );\n\n const nextSecurityRevision = mapping.subject.nextSecurityRevision(\n current.revision.securityRevision,\n );\n\n invariant(nextSecurityRevision !== current.revision.securityRevision);\n const subject = mutation.subject;\n\n invariant(\n (yield* mutation.change(sql`${subject.update({ [mapping.subject.securityRevision]: nextSecurityRevision })}\n where ${subject.column(mapping.subject.id)} = ${subject.value(mapping.subject.id, current.nativeId)} and ${required}`)) ===\n 1,\n );\n invariant(\n (yield* mutation.change(sql`delete from ${credential.name} where ${target}`)) === 1,\n );\n invariant(\n (yield* mutation.change(sql`delete from ${authority.name}\n where ${authority.column(a.subjectId)} = ${authority.value(a.subjectId, current.nativeId)}\n and ${exactSqlText(sql, authority.column(a.credentialId), authority.value(a.credentialId, captured.credentialId))}\n and ${exactSqlText(sql, authority.column(a.revision), authority.value(a.revision, captured.credentialRevision))}`)) ===\n 1,\n );\n\n const cleanup = {\n subjectId: current.nativeId,\n revision: current.revision,\n removedCredentialId: captured.credentialId,\n };\n\n invariant(mapping.cleanup.length <= 32);\n const absent = [];\n\n for (const source of mapping.cleanup) {\n const table = tables(source.table);\n\n const condition = sql.and([\n sql`${table.column(source.subjectId)} = ${table.value(source.subjectId, current.nativeId)}`,\n tables.expression(source.condition(cleanup)),\n ]);\n\n const deletion = sql`delete from ${table.name} where ${condition}`;\n\n // Deleting zero or many subject-scoped session/pending rows is valid.\n absent.push(sql`not exists(select 1 from ${table.name} where ${condition})`);\n yield* mutation.execute(deletion);\n }\n\n const referenced = sql.or([\n sql`exists(select 1 from ${credential.name} where ${exactSqlText(sql, credential.column(c.identityKey), credential.value(c.identityKey, key))})`,\n tables.expression(\n mapping.otherReferences({ identityKey: key, subjectId: current.nativeId }),\n ),\n ]);\n\n yield* mutation.releaseOwnership(key, current.nativeId, referenced);\n\n const revision = {\n ...current.revision,\n securityRevision: nextSecurityRevision,\n credentials: current.revision.credentials.filter(\n (item) => item.credentialId !== captured.credentialId,\n ),\n };\n\n yield* mutation.finish(\n \"oauth-unlink-authority\",\n sql.and([\n mutation.authorityCondition(current.nativeId, revision),\n sql`${now} < ${authorization.validUntilMillis}`,\n remaining,\n sql`not exists(select 1 from ${credential.name} where ${target})`,\n ...absent,\n ]),\n );\n\n return yield* prepareOAuthNative(\n {\n _tag: \"Unlinked\",\n result: { _tag: \"Unlinked\", credentialId: captured.credentialId, invalidation },\n },\n prepare,\n );\n }),\n ),\n cleanup: (original, prepare) =>\n run(\n Effect.gen(function* () {\n const input = M.snapshotOAuthSync(M.OAuthCleanupInput, original);\n\n return yield* prepareOAuthNative(\n yield* flow.cleanup(input.moduleId, input.limit),\n prepare,\n );\n }),\n \"statement\",\n ),\n };\n\n return { oauthAccountsPersistence: service };\n});\n"],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { SqlExpression, TableModel } from "../table-model.mjs";
2
+ import "../mapping-error.mjs";
3
+ import "../native-sql-table.mjs";
4
+ import "../sql-commit.mjs";
5
+ import { OAuthConnectedMapping } from "../models/oauth-connected-model.mjs";
6
+ import { Effect, Schema } from "effect";
7
+ import "@yielded/auth/OAuth";
8
+ //#region src/internal/oauth/native-connected-state.d.ts
9
+ export type OAuthNativeConnectedMapping = OAuthConnectedMapping<TableModel, TableModel, TableModel, TableModel, TableModel, unknown, TableModel, SqlExpression>;
10
+ //#endregion
11
+ //# sourceMappingURL=native-connected-state.d.mts.map