@estifanos-sh/convex-auth 0.0.2 → 0.0.4

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 (438) hide show
  1. package/README.md +29 -6
  2. package/dist/bin.js +2 -34
  3. package/dist/browser/index.d.ts +2 -2
  4. package/dist/browser/index.d.ts.map +1 -1
  5. package/dist/browser/index.js +15 -9
  6. package/dist/browser/index.js.map +1 -1
  7. package/dist/client/core/types.d.ts +68 -97
  8. package/dist/client/core/types.d.ts.map +1 -1
  9. package/dist/client/core/types.js.map +1 -1
  10. package/dist/client/errors.d.ts +15 -0
  11. package/dist/client/errors.d.ts.map +1 -0
  12. package/dist/client/errors.js +8 -1
  13. package/dist/client/errors.js.map +1 -1
  14. package/dist/client/factors/device.js +4 -4
  15. package/dist/client/factors/device.js.map +1 -1
  16. package/dist/client/factors/totp.js +20 -12
  17. package/dist/client/factors/totp.js.map +1 -1
  18. package/dist/client/factors/webauthn.js +6 -2
  19. package/dist/client/factors/webauthn.js.map +1 -1
  20. package/dist/client/index.d.ts +6 -3
  21. package/dist/client/index.d.ts.map +1 -1
  22. package/dist/client/index.js +13 -10
  23. package/dist/client/index.js.map +1 -1
  24. package/dist/component/_generated/api.d.ts +13 -3
  25. package/dist/component/_generated/api.d.ts.map +1 -1
  26. package/dist/component/_generated/api.js.map +1 -1
  27. package/dist/component/_generated/component.d.ts +365 -74
  28. package/dist/component/_generated/component.d.ts.map +1 -1
  29. package/dist/component/_generated/dataModel.d.ts +2 -2
  30. package/dist/component/_generated/dataModel.d.ts.map +1 -1
  31. package/dist/component/_generated/server.d.ts +13 -2
  32. package/dist/component/_generated/server.d.ts.map +1 -1
  33. package/dist/component/_generated/server.js +2 -1
  34. package/dist/component/_generated/server.js.map +1 -1
  35. package/dist/component/account.d.ts +52 -38
  36. package/dist/component/account.d.ts.map +1 -1
  37. package/dist/component/account.js +42 -23
  38. package/dist/component/account.js.map +1 -1
  39. package/dist/component/batch.d.ts +3 -0
  40. package/dist/component/batch.d.ts.map +1 -0
  41. package/dist/component/batch.js +17 -0
  42. package/dist/component/batch.js.map +1 -0
  43. package/dist/component/connection/audit.d.ts +30 -27
  44. package/dist/component/connection/audit.d.ts.map +1 -1
  45. package/dist/component/connection/audit.js +16 -23
  46. package/dist/component/connection/audit.js.map +1 -1
  47. package/dist/component/connection/cache.d.ts +6 -6
  48. package/dist/component/connection/cache.js +0 -1
  49. package/dist/component/connection/cache.js.map +1 -1
  50. package/dist/component/connection/domain/verification.d.ts +19 -19
  51. package/dist/component/connection/domain/verification.js +1 -2
  52. package/dist/component/connection/domain/verification.js.map +1 -1
  53. package/dist/component/connection/domain.d.ts +20 -20
  54. package/dist/component/connection/domain.js +1 -2
  55. package/dist/component/connection/domain.js.map +1 -1
  56. package/dist/component/connection/saml/assertion.d.ts +4 -4
  57. package/dist/component/connection/saml/assertion.js +0 -1
  58. package/dist/component/connection/saml/assertion.js.map +1 -1
  59. package/dist/component/connection/saml/request.d.ts +8 -9
  60. package/dist/component/connection/saml/request.d.ts.map +1 -1
  61. package/dist/component/connection/saml/request.js +0 -2
  62. package/dist/component/connection/saml/request.js.map +1 -1
  63. package/dist/component/connection/scim/config.d.ts +13 -13
  64. package/dist/component/connection/scim/config.d.ts.map +1 -1
  65. package/dist/component/connection/scim/config.js +2 -2
  66. package/dist/component/connection/scim/config.js.map +1 -1
  67. package/dist/component/connection/scim/identity.d.ts +122 -61
  68. package/dist/component/connection/scim/identity.d.ts.map +1 -1
  69. package/dist/component/connection/scim/identity.js +408 -60
  70. package/dist/component/connection/scim/identity.js.map +1 -1
  71. package/dist/component/connection/secret.d.ts +15 -15
  72. package/dist/component/connection/secret.d.ts.map +1 -1
  73. package/dist/component/connection/secret.js +2 -2
  74. package/dist/component/connection/secret.js.map +1 -1
  75. package/dist/component/connection/webhook/delivery.d.ts +69 -53
  76. package/dist/component/connection/webhook/delivery.d.ts.map +1 -1
  77. package/dist/component/connection/webhook/delivery.js +129 -172
  78. package/dist/component/connection/webhook/delivery.js.map +1 -1
  79. package/dist/component/connection/webhook/endpoint.d.ts +21 -21
  80. package/dist/component/connection/webhook/endpoint.d.ts.map +1 -1
  81. package/dist/component/connection/webhook/endpoint.js +2 -2
  82. package/dist/component/connection/webhook/endpoint.js.map +1 -1
  83. package/dist/component/connection/webhook/events.d.ts +26 -0
  84. package/dist/component/connection/webhook/events.d.ts.map +1 -0
  85. package/dist/component/connection/webhook/events.js +39 -0
  86. package/dist/component/connection/webhook/events.js.map +1 -0
  87. package/dist/component/connection.d.ts +39 -39
  88. package/dist/component/connection.d.ts.map +1 -1
  89. package/dist/component/connection.js +9 -9
  90. package/dist/component/connection.js.map +1 -1
  91. package/dist/component/context.d.ts +115 -0
  92. package/dist/component/context.d.ts.map +1 -0
  93. package/dist/component/context.js +49 -0
  94. package/dist/component/context.js.map +1 -0
  95. package/dist/component/convex.config.d.ts +2 -2
  96. package/dist/component/crons.d.ts +2 -2
  97. package/dist/component/documents.d.ts +1244 -0
  98. package/dist/component/documents.d.ts.map +1 -0
  99. package/dist/component/documents.js +44 -0
  100. package/dist/component/documents.js.map +1 -0
  101. package/dist/component/event.d.ts +142 -141
  102. package/dist/component/event.d.ts.map +1 -1
  103. package/dist/component/event.js +90 -119
  104. package/dist/component/event.js.map +1 -1
  105. package/dist/component/eventstream.d.ts +30 -0
  106. package/dist/component/eventstream.d.ts.map +1 -0
  107. package/dist/component/eventstream.js +60 -0
  108. package/dist/component/eventstream.js.map +1 -0
  109. package/dist/component/factor/device.d.ts +25 -24
  110. package/dist/component/factor/device.d.ts.map +1 -1
  111. package/dist/component/factor/device.js +7 -4
  112. package/dist/component/factor/device.js.map +1 -1
  113. package/dist/component/factor/passkey.d.ts +173 -85
  114. package/dist/component/factor/passkey.d.ts.map +1 -1
  115. package/dist/component/factor/passkey.js +138 -27
  116. package/dist/component/factor/passkey.js.map +1 -1
  117. package/dist/component/factor/totp.d.ts +56 -50
  118. package/dist/component/factor/totp.d.ts.map +1 -1
  119. package/dist/component/factor/totp.js +6 -5
  120. package/dist/component/factor/totp.js.map +1 -1
  121. package/dist/component/group/active.d.ts +326 -22
  122. package/dist/component/group/active.d.ts.map +1 -1
  123. package/dist/component/group/active.js +22 -13
  124. package/dist/component/group/active.js.map +1 -1
  125. package/dist/component/group/invite.d.ts +30 -30
  126. package/dist/component/group/invite.d.ts.map +1 -1
  127. package/dist/component/group/invite.js +2 -2
  128. package/dist/component/group/invite.js.map +1 -1
  129. package/dist/component/group/member.d.ts +36 -36
  130. package/dist/component/group/member.d.ts.map +1 -1
  131. package/dist/component/group/member.js +5 -3
  132. package/dist/component/group/member.js.map +1 -1
  133. package/dist/component/group.d.ts +49 -64
  134. package/dist/component/group.d.ts.map +1 -1
  135. package/dist/component/group.js +5 -3
  136. package/dist/component/group.js.map +1 -1
  137. package/dist/component/http.d.ts +2 -2
  138. package/dist/component/index.d.ts +0 -10
  139. package/dist/component/index.js +1 -3
  140. package/dist/component/limits.d.ts +5 -4
  141. package/dist/component/limits.d.ts.map +1 -1
  142. package/dist/component/limits.js +7 -4
  143. package/dist/component/limits.js.map +1 -1
  144. package/dist/component/maintenance.d.ts +6 -3
  145. package/dist/component/maintenance.d.ts.map +1 -1
  146. package/dist/component/maintenance.js +45 -6
  147. package/dist/component/maintenance.js.map +1 -1
  148. package/dist/component/model.d.ts +847 -1723
  149. package/dist/component/model.d.ts.map +1 -1
  150. package/dist/component/model.js +28 -317
  151. package/dist/component/model.js.map +1 -1
  152. package/dist/component/modules.d.ts +11 -5
  153. package/dist/component/modules.d.ts.map +1 -1
  154. package/dist/component/modules.js +4 -1
  155. package/dist/component/modules.js.map +1 -1
  156. package/dist/component/oauth/client.d.ts +20 -20
  157. package/dist/component/oauth/client.d.ts.map +1 -1
  158. package/dist/component/oauth/client.js +2 -2
  159. package/dist/component/oauth/client.js.map +1 -1
  160. package/dist/component/oauth/code.d.ts +14 -14
  161. package/dist/component/oauth/code.js +1 -2
  162. package/dist/component/oauth/code.js.map +1 -1
  163. package/dist/component/oauth/refresh.d.ts +20 -20
  164. package/dist/component/oauth/refresh.js +1 -2
  165. package/dist/component/oauth/refresh.js.map +1 -1
  166. package/dist/component/schema.d.ts +1148 -607
  167. package/dist/component/schema.d.ts.map +1 -1
  168. package/dist/component/schema.js +43 -15
  169. package/dist/component/schema.js.map +1 -1
  170. package/dist/component/session.d.ts +68 -32
  171. package/dist/component/session.d.ts.map +1 -1
  172. package/dist/component/session.js +118 -34
  173. package/dist/component/session.js.map +1 -1
  174. package/dist/component/token/continuation.d.ts +47 -18
  175. package/dist/component/token/continuation.d.ts.map +1 -1
  176. package/dist/component/token/continuation.js +76 -18
  177. package/dist/component/token/continuation.js.map +1 -1
  178. package/dist/component/token/enrollment.d.ts +42 -0
  179. package/dist/component/token/enrollment.d.ts.map +1 -0
  180. package/dist/component/token/enrollment.js +57 -0
  181. package/dist/component/token/enrollment.js.map +1 -0
  182. package/dist/component/token/pkce.d.ts +31 -24
  183. package/dist/component/token/pkce.d.ts.map +1 -1
  184. package/dist/component/token/pkce.js +15 -20
  185. package/dist/component/token/pkce.js.map +1 -1
  186. package/dist/component/token/refresh.d.ts +42 -35
  187. package/dist/component/token/refresh.d.ts.map +1 -1
  188. package/dist/component/token/refresh.js +16 -8
  189. package/dist/component/token/refresh.js.map +1 -1
  190. package/dist/component/token/verification.d.ts +34 -30
  191. package/dist/component/token/verification.d.ts.map +1 -1
  192. package/dist/component/token/verification.js +7 -6
  193. package/dist/component/token/verification.js.map +1 -1
  194. package/dist/component/user/email.d.ts +21 -21
  195. package/dist/component/user/email.d.ts.map +1 -1
  196. package/dist/component/user/email.js +2 -2
  197. package/dist/component/user/email.js.map +1 -1
  198. package/dist/component/user/key.d.ts +36 -36
  199. package/dist/component/user/key.d.ts.map +1 -1
  200. package/dist/component/user/key.js +2 -2
  201. package/dist/component/user/key.js.map +1 -1
  202. package/dist/component/user.d.ts +52 -48
  203. package/dist/component/user.d.ts.map +1 -1
  204. package/dist/component/user.js +157 -36
  205. package/dist/component/user.js.map +1 -1
  206. package/dist/expo/index.d.ts +4 -4
  207. package/dist/expo/index.d.ts.map +1 -1
  208. package/dist/expo/index.js +20 -13
  209. package/dist/expo/index.js.map +1 -1
  210. package/dist/node_modules/.pnpm/@opentelemetry_sdk-logs@0.214.0_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-logs/build/src/export/ReadableLogRecord.d.ts +2 -2
  211. package/dist/node_modules/.pnpm/@opentelemetry_sdk-logs@0.214.0_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-logs/build/src/export/SdkLogRecord.d.ts +1 -1
  212. package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/MeterProvider.d.ts +2 -2
  213. package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/export/MetricData.d.ts +1 -1
  214. package/dist/node_modules/.pnpm/@opentelemetry_sdk-trace-base@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-trace-base/build/src/Span.d.ts +1 -1
  215. package/dist/node_modules/.pnpm/@opentelemetry_sdk-trace-base@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-trace-base/build/src/export/ReadableSpan.d.ts +1 -1
  216. package/dist/node_modules/.pnpm/@opentelemetry_sdk-trace-base@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-trace-base/build/src/types.d.ts +1 -1
  217. package/dist/otel.d.ts +1 -1
  218. package/dist/providers/anonymous.d.ts +11 -5
  219. package/dist/providers/anonymous.d.ts.map +1 -1
  220. package/dist/providers/anonymous.js +4 -1
  221. package/dist/providers/anonymous.js.map +1 -1
  222. package/dist/providers/apple.d.ts +1 -1
  223. package/dist/providers/apple.js +19 -4
  224. package/dist/providers/apple.js.map +1 -1
  225. package/dist/providers/credentials.d.ts +22 -14
  226. package/dist/providers/credentials.d.ts.map +1 -1
  227. package/dist/providers/credentials.js +2 -0
  228. package/dist/providers/credentials.js.map +1 -1
  229. package/dist/providers/custom.d.ts +3 -3
  230. package/dist/providers/custom.d.ts.map +1 -1
  231. package/dist/providers/custom.js.map +1 -1
  232. package/dist/providers/email.d.ts +3 -3
  233. package/dist/providers/email.d.ts.map +1 -1
  234. package/dist/providers/email.js.map +1 -1
  235. package/dist/providers/github.d.ts +1 -1
  236. package/dist/providers/github.d.ts.map +1 -1
  237. package/dist/providers/github.js +9 -4
  238. package/dist/providers/github.js.map +1 -1
  239. package/dist/providers/google.d.ts +1 -1
  240. package/dist/providers/google.d.ts.map +1 -1
  241. package/dist/providers/google.js +9 -4
  242. package/dist/providers/google.js.map +1 -1
  243. package/dist/providers/microsoft.d.ts +1 -1
  244. package/dist/providers/microsoft.d.ts.map +1 -1
  245. package/dist/providers/microsoft.js +12 -4
  246. package/dist/providers/microsoft.js.map +1 -1
  247. package/dist/providers/password.d.ts +117 -15
  248. package/dist/providers/password.d.ts.map +1 -1
  249. package/dist/providers/password.js +71 -26
  250. package/dist/providers/password.js.map +1 -1
  251. package/dist/providers/phone.d.ts +4 -3
  252. package/dist/providers/phone.d.ts.map +1 -1
  253. package/dist/providers/phone.js.map +1 -1
  254. package/dist/providers/webauthn.d.ts.map +1 -1
  255. package/dist/providers/webauthn.js +6 -0
  256. package/dist/providers/webauthn.js.map +1 -1
  257. package/dist/react/index.d.ts +40 -41
  258. package/dist/react/index.d.ts.map +1 -1
  259. package/dist/react/index.js +27 -52
  260. package/dist/react/index.js.map +1 -1
  261. package/dist/server/auth.d.ts +224 -126
  262. package/dist/server/auth.d.ts.map +1 -1
  263. package/dist/server/auth.js +44 -25
  264. package/dist/server/auth.js.map +1 -1
  265. package/dist/server/component/factor/db.js +13 -6
  266. package/dist/server/component/factor/db.js.map +1 -1
  267. package/dist/server/config.d.ts +2 -1
  268. package/dist/server/connection/domain.d.ts +4 -65
  269. package/dist/server/connection/domain.d.ts.map +1 -1
  270. package/dist/server/connection/domain.js +29 -5
  271. package/dist/server/connection/domain.js.map +1 -1
  272. package/dist/server/connection/group/service.js +7 -5
  273. package/dist/server/connection/group/service.js.map +1 -1
  274. package/dist/server/connection/http.js +136 -291
  275. package/dist/server/connection/http.js.map +1 -1
  276. package/dist/server/connection/oidc.js +8 -17
  277. package/dist/server/connection/oidc.js.map +1 -1
  278. package/dist/server/connection/policy/domain.js +4 -1
  279. package/dist/server/connection/policy/domain.js.map +1 -1
  280. package/dist/server/connection/policy.js +14 -13
  281. package/dist/server/connection/policy.js.map +1 -1
  282. package/dist/server/connection/provision.js +5 -19
  283. package/dist/server/connection/provision.js.map +1 -1
  284. package/dist/server/connection/saml/encoding.js +2 -6
  285. package/dist/server/connection/saml/encoding.js.map +1 -1
  286. package/dist/server/connection/saml/signature.js +2 -2
  287. package/dist/server/connection/saml/signature.js.map +1 -1
  288. package/dist/server/connection/saml/xmldsig.js +1 -1
  289. package/dist/server/connection/saml/xmldsig.js.map +1 -1
  290. package/dist/server/connection/webhook.js +4 -36
  291. package/dist/server/connection/webhook.js.map +1 -1
  292. package/dist/server/context.d.ts +2 -2
  293. package/dist/server/context.d.ts.map +1 -1
  294. package/dist/server/context.js +35 -24
  295. package/dist/server/context.js.map +1 -1
  296. package/dist/server/contract.d.ts.map +1 -1
  297. package/dist/server/contract.js +6 -14
  298. package/dist/server/contract.js.map +1 -1
  299. package/dist/server/core.js +46 -1
  300. package/dist/server/core.js.map +1 -1
  301. package/dist/server/cors.d.ts +2 -2
  302. package/dist/server/cors.d.ts.map +1 -1
  303. package/dist/server/crypto.js.map +1 -1
  304. package/dist/server/db.js +6 -2
  305. package/dist/server/db.js.map +1 -1
  306. package/dist/server/device.js +1 -1
  307. package/dist/server/domains/account.d.ts +9 -1
  308. package/dist/server/domains/account.d.ts.map +1 -1
  309. package/dist/server/domains/account.js +21 -9
  310. package/dist/server/domains/account.js.map +1 -1
  311. package/dist/server/domains/context.js +34 -0
  312. package/dist/server/domains/context.js.map +1 -0
  313. package/dist/server/domains/factor.d.ts +3 -2
  314. package/dist/server/domains/factor.d.ts.map +1 -1
  315. package/dist/server/domains/factor.js.map +1 -1
  316. package/dist/server/domains/group.js.map +1 -1
  317. package/dist/server/domains/invite.js.map +1 -1
  318. package/dist/server/domains/key.js.map +1 -1
  319. package/dist/server/domains/member.js.map +1 -1
  320. package/dist/server/domains/session.js.map +1 -1
  321. package/dist/server/domains/user.js.map +1 -1
  322. package/dist/server/env.js +2 -22
  323. package/dist/server/env.js.map +1 -1
  324. package/dist/server/events.d.ts +3 -1
  325. package/dist/server/events.d.ts.map +1 -1
  326. package/dist/server/events.js +6 -6
  327. package/dist/server/events.js.map +1 -1
  328. package/dist/server/facade.d.ts +1 -33
  329. package/dist/server/facade.d.ts.map +1 -1
  330. package/dist/server/facade.js +1 -2
  331. package/dist/server/facade.js.map +1 -1
  332. package/dist/server/http.d.ts +1 -0
  333. package/dist/server/http.d.ts.map +1 -1
  334. package/dist/server/http.js +4 -4
  335. package/dist/server/http.js.map +1 -1
  336. package/dist/server/identity/claims.js +1 -1
  337. package/dist/server/identity/convex.d.ts +2 -0
  338. package/dist/server/identity/convex.d.ts.map +1 -1
  339. package/dist/server/index.d.ts +6 -9
  340. package/dist/server/index.js +2 -4
  341. package/dist/server/limits.js +23 -2
  342. package/dist/server/limits.js.map +1 -1
  343. package/dist/server/mutations/calls.js +3 -2
  344. package/dist/server/mutations/credentials/signin.js +7 -3
  345. package/dist/server/mutations/credentials/signin.js.map +1 -1
  346. package/dist/server/mutations/enrollment.js +87 -0
  347. package/dist/server/mutations/enrollment.js.map +1 -0
  348. package/dist/server/mutations/invalidate.js +5 -10
  349. package/dist/server/mutations/invalidate.js.map +1 -1
  350. package/dist/server/mutations/oauth.js +3 -3
  351. package/dist/server/mutations/oauth.js.map +1 -1
  352. package/dist/server/mutations/refresh.js +1 -0
  353. package/dist/server/mutations/refresh.js.map +1 -1
  354. package/dist/server/mutations/register.js +52 -21
  355. package/dist/server/mutations/register.js.map +1 -1
  356. package/dist/server/mutations/retrieve.js +4 -1
  357. package/dist/server/mutations/retrieve.js.map +1 -1
  358. package/dist/server/mutations/signin.js +2 -2
  359. package/dist/server/mutations/signin.js.map +1 -1
  360. package/dist/server/mutations/store.js +6 -1
  361. package/dist/server/mutations/store.js.map +1 -1
  362. package/dist/server/mutations/verify.js +6 -4
  363. package/dist/server/mutations/verify.js.map +1 -1
  364. package/dist/server/oauth/client.d.ts +1 -1
  365. package/dist/server/oauth/client.js.map +1 -1
  366. package/dist/server/oauth/code.d.ts +1 -1
  367. package/dist/server/oauth/code.js.map +1 -1
  368. package/dist/server/oauth/factory.js +89 -13
  369. package/dist/server/oauth/factory.js.map +1 -1
  370. package/dist/server/oauth/handlers.js +2 -2
  371. package/dist/server/oauth/runtime.js +24 -9
  372. package/dist/server/oauth/runtime.js.map +1 -1
  373. package/dist/server/preload.d.ts.map +1 -1
  374. package/dist/server/preload.js +14 -11
  375. package/dist/server/preload.js.map +1 -1
  376. package/dist/server/runtime.d.ts +236 -148
  377. package/dist/server/runtime.d.ts.map +1 -1
  378. package/dist/server/runtime.js +92 -44
  379. package/dist/server/runtime.js.map +1 -1
  380. package/dist/server/session/lifecycle.d.ts +2 -1
  381. package/dist/server/session/lifecycle.d.ts.map +1 -1
  382. package/dist/server/session/lifecycle.js +29 -10
  383. package/dist/server/session/lifecycle.js.map +1 -1
  384. package/dist/server/signin/flow.js +2 -2
  385. package/dist/server/signin/flow.js.map +1 -1
  386. package/dist/server/telemetry.js +1 -1
  387. package/dist/server/tokens.js +6 -3
  388. package/dist/server/tokens.js.map +1 -1
  389. package/dist/server/totp.js +4 -3
  390. package/dist/server/totp.js.map +1 -1
  391. package/dist/server/types.d.ts +131 -45
  392. package/dist/server/types.d.ts.map +1 -1
  393. package/dist/server/user/account.js +0 -1
  394. package/dist/server/user/account.js.map +1 -1
  395. package/dist/server/validators.d.ts +930 -944
  396. package/dist/server/validators.d.ts.map +1 -1
  397. package/dist/server/validators.js +66 -39
  398. package/dist/server/validators.js.map +1 -1
  399. package/dist/server/webauthn.js +60 -29
  400. package/dist/server/webauthn.js.map +1 -1
  401. package/dist/shared/brand.d.ts +3 -7
  402. package/dist/shared/brand.d.ts.map +1 -1
  403. package/dist/shared/params.d.ts +78 -0
  404. package/dist/shared/params.d.ts.map +1 -0
  405. package/dist/shared/results.d.ts +13 -1
  406. package/dist/shared/results.d.ts.map +1 -1
  407. package/dist/svelte/context.svelte.d.ts +23 -12
  408. package/dist/svelte/context.svelte.d.ts.map +1 -1
  409. package/dist/svelte/context.svelte.js +20 -13
  410. package/dist/svelte/index.d.ts +1 -4
  411. package/dist/svelte/index.d.ts.map +1 -1
  412. package/dist/svelte/index.js +1 -4
  413. package/dist/test.d.ts +1204 -611
  414. package/dist/test.d.ts.map +1 -1
  415. package/dist/test.js +50 -1
  416. package/dist/test.js.map +1 -1
  417. package/package.json +5 -14
  418. package/dist/_generated/component.d.ts +0 -3074
  419. package/dist/_generated/component.d.ts.map +0 -1
  420. package/dist/component/functions.d.ts +0 -9
  421. package/dist/component/functions.d.ts.map +0 -1
  422. package/dist/component/functions.js +0 -3
  423. package/dist/core/index.d.ts +0 -533
  424. package/dist/core/index.d.ts.map +0 -1
  425. package/dist/core/index.js +0 -86
  426. package/dist/core/index.js.map +0 -1
  427. package/dist/model.js.map +0 -1
  428. package/dist/server/env.d.ts +0 -28
  429. package/dist/server/env.d.ts.map +0 -1
  430. package/dist/svelte/AuthLoading.svelte +0 -13
  431. package/dist/svelte/AuthLoading.svelte.d.ts +0 -8
  432. package/dist/svelte/AuthLoading.svelte.d.ts.map +0 -1
  433. package/dist/svelte/SignedIn.svelte +0 -14
  434. package/dist/svelte/SignedIn.svelte.d.ts +0 -8
  435. package/dist/svelte/SignedIn.svelte.d.ts.map +0 -1
  436. package/dist/svelte/SignedOut.svelte +0 -13
  437. package/dist/svelte/SignedOut.svelte.d.ts +0 -8
  438. package/dist/svelte/SignedOut.svelte.d.ts.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"account.js","names":[],"sources":["../../src/component/account.ts"],"sourcesContent":["/**\n * `component.account.*` — provider-linked auth accounts.\n *\n * Reads collapse into one overloaded `get`; `list`\n * takes the owning `userId`.\n *\n * @module\n */\n\nimport { ConvexError, v } from \"convex/values\";\nimport { ErrorCode } from \"../shared/codes\";\n\nimport { recordSignInLimit, resetSignInLimit } from \"./limits\";\nimport { mutation, query } from \"./functions\";\nimport { vAccountDoc, vUserDoc } from \"./model\";\nimport { createSessionRows, type SessionRows } from \"./session\";\n\nconst ACCOUNT_LIST_BATCH = 128;\n\ntype AcceptedCredentialsSignIn = SessionRows & { status: \"accepted\" };\n\n/** Reserve a password attempt and load all sign-in state in one transaction. */\nexport const beginCredentialsSignIn = mutation({\n args: {\n provider: v.string(),\n providerAccountId: v.string(),\n maxAttemptsPerHour: v.number(),\n reserveAttempt: v.boolean(),\n includeTotp: v.boolean(),\n },\n returns: v.union(\n v.object({ status: v.literal(\"invalid\") }),\n v.object({ status: v.literal(\"limited\") }),\n v.object({\n status: v.literal(\"ready\"),\n account: vAccountDoc,\n user: vUserDoc,\n hasTotp: v.boolean(),\n }),\n ),\n handler: async (ctx, args) => {\n const account = await ctx.db\n .query(\"Account\")\n .withIndex(\"provider_account_id\", (q) =>\n q.eq(\"provider\", args.provider).eq(\"providerAccountId\", args.providerAccountId),\n )\n .unique();\n if (account === null) return { status: \"invalid\" as const };\n\n const [user, totp, limit] = await Promise.all([\n ctx.db.get(\"User\", account.userId),\n args.includeTotp\n ? ctx.db\n .query(\"TotpFactor\")\n .withIndex(\"user_id_verified\", (q) =>\n q.eq(\"userId\", account.userId).eq(\"verified\", true),\n )\n .first()\n : Promise.resolve(null),\n args.reserveAttempt\n ? recordSignInLimit(ctx, {\n identifier: account._id,\n maxAttemptsPerHour: args.maxAttemptsPerHour,\n })\n : Promise.resolve({ ok: true as const, retryAfter: undefined }),\n ]);\n if (!limit.ok) return { status: \"limited\" as const };\n if (user === null) return { status: \"invalid\" as const };\n return {\n status: \"ready\" as const,\n account,\n user,\n hasTotp: totp !== null,\n };\n },\n});\n\n/** Refund a verified password attempt and optionally issue its session atomically. */\nexport const completeCredentialsSignIn = mutation({\n args: {\n accountId: v.id(\"Account\"),\n issueSession: v.boolean(),\n generateTokens: v.boolean(),\n replaceSessionId: v.optional(v.id(\"Session\")),\n sessionExpirationTime: v.number(),\n refreshTokenExpirationTime: v.number(),\n },\n returns: v.union(\n v.object({ status: v.literal(\"rejected\") }),\n v.object({ status: v.literal(\"reset\") }),\n v.object({\n status: v.literal(\"accepted\"),\n user: vUserDoc,\n sessionId: v.id(\"Session\"),\n refreshTokenId: v.optional(v.id(\"RefreshToken\")),\n replacedSessionId: v.optional(v.id(\"Session\")),\n }),\n ),\n handler: async (ctx, args) => {\n const account = await ctx.db.get(\"Account\", args.accountId);\n if (account === null) return { status: \"rejected\" as const };\n await resetSignInLimit(ctx, account._id);\n if (!args.issueSession) return { status: \"reset\" as const };\n\n const created = await createSessionRows(ctx, {\n userId: account.userId,\n replaceSessionId: args.replaceSessionId,\n sessionExpirationTime: args.sessionExpirationTime,\n refreshTokenExpirationTime: args.generateTokens ? args.refreshTokenExpirationTime : undefined,\n });\n if (created === null) return { status: \"rejected\" as const };\n const result: AcceptedCredentialsSignIn = {\n status: \"accepted\" as const,\n user: created.user,\n sessionId: created.sessionId,\n };\n if (created.refreshTokenId !== undefined) result.refreshTokenId = created.refreshTokenId;\n if (created.replacedSessionId !== undefined) {\n result.replacedSessionId = created.replacedSessionId;\n }\n return result;\n },\n});\n\n/**\n * Read an account by id, or by `{ provider, providerAccountId }` when both\n * are given. Returns `null` when no selector matches.\n */\nexport const get = query({\n args: {\n id: v.optional(v.id(\"Account\")),\n provider: v.optional(v.string()),\n providerAccountId: v.optional(v.string()),\n },\n returns: v.union(vAccountDoc, v.null()),\n handler: async (ctx, args) => {\n if (args.provider !== undefined && args.providerAccountId !== undefined) {\n return await ctx.db\n .query(\"Account\")\n .withIndex(\"provider_account_id\", (q) =>\n q.eq(\"provider\", args.provider!).eq(\"providerAccountId\", args.providerAccountId!),\n )\n .unique();\n }\n if (args.id === undefined) return null;\n return await ctx.db.get(\"Account\", args.id);\n },\n});\n\n/** List the accounts owned by a user. */\nexport const list = query({\n args: { userId: v.id(\"User\") },\n returns: v.array(vAccountDoc),\n handler: async (ctx, { userId }) => {\n return await ctx.db\n .query(\"Account\")\n .withIndex(\"user_id_provider\", (q) => q.eq(\"userId\", userId))\n .take(ACCOUNT_LIST_BATCH);\n },\n});\n\n/** Insert a new account. */\nexport const create = mutation({\n args: {\n userId: v.id(\"User\"),\n provider: v.string(),\n providerAccountId: v.string(),\n secret: v.optional(v.string()),\n extend: v.optional(v.any()),\n },\n returns: v.id(\"Account\"),\n handler: async (ctx, args) => {\n // Dedup on the (provider, providerAccountId) identity. A bare insert let two\n // concurrent or retried provisioning ceremonies — SCIM POST retries, a\n // passkey double-submit — create duplicate Account rows, which then made\n // `account.get(...).unique()` throw on every future lookup (a permanent\n // sign-in lockout / rogue credential attribution). The index-range read plus\n // insert in this single mutation is OCC-atomic: a racing insert into the same\n // range conflicts and retries, then observes the winner's row below.\n const existing = await ctx.db\n .query(\"Account\")\n .withIndex(\"provider_account_id\", (q) =>\n q.eq(\"provider\", args.provider).eq(\"providerAccountId\", args.providerAccountId),\n )\n .first();\n if (existing !== null) {\n if (existing.userId !== args.userId) {\n // Already linked to a different user — reject rather than silently\n // attribute the identity (e.g. an attacker registering a passkey\n // credentialId that already belongs to a victim).\n throw new ConvexError({\n code: ErrorCode.ACCOUNT_ALREADY_LINKED,\n message: \"This account is already linked to another user.\",\n });\n }\n return existing._id;\n }\n return await ctx.db.insert(\"Account\", args);\n },\n});\n\n/** Patch fields on an account. */\nexport const update = mutation({\n args: {\n id: v.id(\"Account\"),\n patch: v.object({\n userId: v.optional(v.id(\"User\")),\n provider: v.optional(v.string()),\n providerAccountId: v.optional(v.string()),\n secret: v.optional(v.string()),\n emailVerified: v.optional(v.string()),\n phoneVerified: v.optional(v.string()),\n extend: v.optional(v.any()),\n }),\n },\n returns: v.null(),\n handler: async (ctx, { id: accountId, patch }) => {\n await ctx.db.patch(\"Account\", accountId, patch);\n return null;\n },\n});\n\n/**\n * Delete an account. When `requireOtherAccount` is set, refuses to delete the\n * user's last remaining account so they are never left with none.\n */\nconst remove = mutation({\n args: {\n id: v.id(\"Account\"),\n userId: v.optional(v.id(\"User\")),\n requireOtherAccount: v.optional(v.boolean()),\n },\n returns: v.null(),\n handler: async (ctx, { id: accountId, userId, requireOtherAccount }) => {\n const doc = await ctx.db.get(\"Account\", accountId);\n if (doc === null || (userId !== undefined && doc.userId !== userId)) {\n throw new ConvexError({\n code: ErrorCode.ACCOUNT_NOT_FOUND,\n message: \"Account not found.\",\n });\n }\n if (requireOtherAccount === true) {\n let otherFound = false;\n for await (const sibling of ctx.db\n .query(\"Account\")\n .withIndex(\"user_id_provider\", (q) => q.eq(\"userId\", doc.userId))) {\n if (sibling._id !== accountId) {\n otherFound = true;\n break;\n }\n }\n if (!otherFound) {\n throw new ConvexError({\n code: ErrorCode.INVALID_PARAMETERS,\n message: \"The provided parameters are invalid.\",\n });\n }\n }\n await ctx.db.delete(\"Account\", accountId);\n return null;\n },\n});\n\nexport { remove };\n"],"mappings":"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"}
1
+ {"version":3,"file":"account.js","names":[],"sources":["../../src/component/account.ts"],"sourcesContent":["/**\n * `component.account.*` — provider-linked auth accounts.\n *\n * Reads collapse into one overloaded `get`; `list`\n * takes the owning `userId`.\n *\n * @module\n */\n\nimport { ConvexError, v } from \"convex/values\";\nimport { ErrorCode } from \"../shared/codes\";\n\nimport { recordSignInLimit, resetSignInLimit } from \"./limits\";\nimport { mutation, query } from \"./_generated/server\";\nimport { vAccountDoc, vUserDoc } from \"./documents\";\nimport { createSessionRows, type SessionRows, vSessionReplacement } from \"./session\";\n\n/** Maximum linked accounts returned for one user by the bounded read surface. */\nconst ACCOUNT_LIST_BATCH = 128;\n\n/** Maximum users accepted by one batched account read. */\nconst ACCOUNT_LIST_USER_BATCH = 100;\n\ntype AcceptedCredentialsSignIn = Omit<SessionRows, \"epoch\"> & { status: \"accepted\" };\n\n/** Reserve a password attempt and load all sign-in state in one transaction. */\nexport const beginCredentialsSignIn = mutation({\n args: {\n provider: v.string(),\n providerAccountId: v.string(),\n limitIdentifier: v.string(),\n maxAttemptsPerHour: v.number(),\n reserveAttempt: v.boolean(),\n includeTotp: v.boolean(),\n },\n returns: v.union(\n v.object({ status: v.literal(\"invalid\") }),\n v.object({ status: v.literal(\"limited\") }),\n v.object({\n status: v.literal(\"ready\"),\n account: vAccountDoc,\n user: vUserDoc,\n hasTotp: v.boolean(),\n }),\n ),\n handler: async (ctx, args) => {\n const limit = args.reserveAttempt\n ? await recordSignInLimit(ctx, {\n identifier: args.limitIdentifier,\n maxAttemptsPerHour: args.maxAttemptsPerHour,\n })\n : { ok: true as const, retryAfter: undefined };\n if (!limit.ok) return { status: \"limited\" as const };\n\n const account = await ctx.db\n .query(\"Account\")\n .withIndex(\"provider_account_id\", (q) =>\n q.eq(\"provider\", args.provider).eq(\"providerAccountId\", args.providerAccountId),\n )\n .unique();\n if (account === null) return { status: \"invalid\" as const };\n\n const [user, totp] = await Promise.all([\n ctx.db.get(\"User\", account.userId),\n args.includeTotp\n ? ctx.db\n .query(\"TotpFactor\")\n .withIndex(\"user_id_verified\", (q) =>\n q.eq(\"userId\", account.userId).eq(\"verified\", true),\n )\n .first()\n : Promise.resolve(null),\n ]);\n if (user === null) return { status: \"invalid\" as const };\n return {\n status: \"ready\" as const,\n account,\n user,\n hasTotp: totp !== null,\n };\n },\n});\n\n/** Refund a verified password attempt and optionally issue its session atomically. */\nexport const completeCredentialsSignIn = mutation({\n args: {\n accountId: v.id(\"Account\"),\n limitIdentifier: v.string(),\n issueSession: v.boolean(),\n generateTokens: v.boolean(),\n replaceSession: v.optional(vSessionReplacement),\n sessionExpirationTime: v.number(),\n refreshTokenExpirationTime: v.number(),\n },\n returns: v.union(\n v.object({ status: v.literal(\"rejected\") }),\n v.object({ status: v.literal(\"reset\") }),\n v.object({\n status: v.literal(\"accepted\"),\n user: vUserDoc,\n sessionId: v.id(\"Session\"),\n sessionExpirationTime: v.number(),\n refreshTokenId: v.optional(v.id(\"RefreshToken\")),\n replacedSessionId: v.optional(v.id(\"Session\")),\n }),\n ),\n handler: async (ctx, args) => {\n const account = await ctx.db.get(\"Account\", args.accountId);\n if (account === null) return { status: \"rejected\" as const };\n await resetSignInLimit(ctx, args.limitIdentifier);\n if (!args.issueSession) return { status: \"reset\" as const };\n\n const created = await createSessionRows(ctx, {\n userId: account.userId,\n replaceSession: args.replaceSession,\n sessionExpirationTime: args.sessionExpirationTime,\n refreshTokenExpirationTime: args.generateTokens ? args.refreshTokenExpirationTime : undefined,\n });\n if (created === null) return { status: \"rejected\" as const };\n const result: AcceptedCredentialsSignIn = {\n status: \"accepted\" as const,\n user: created.user,\n sessionId: created.sessionId,\n sessionExpirationTime: created.sessionExpirationTime,\n };\n if (created.refreshTokenId !== undefined) result.refreshTokenId = created.refreshTokenId;\n if (created.replacedSessionId !== undefined) {\n result.replacedSessionId = created.replacedSessionId;\n }\n return result;\n },\n});\n\n/**\n * Read an account by id, or by `{ provider, providerAccountId }` when both\n * are given. Returns `null` when no selector matches.\n */\nexport const get = query({\n args: {\n id: v.optional(v.id(\"Account\")),\n provider: v.optional(v.string()),\n providerAccountId: v.optional(v.string()),\n },\n returns: v.union(vAccountDoc, v.null()),\n handler: async (ctx, args) => {\n if (args.provider !== undefined && args.providerAccountId !== undefined) {\n return await ctx.db\n .query(\"Account\")\n .withIndex(\"provider_account_id\", (q) =>\n q.eq(\"provider\", args.provider!).eq(\"providerAccountId\", args.providerAccountId!),\n )\n .unique();\n }\n if (args.id === undefined) return null;\n return await ctx.db.get(\"Account\", args.id);\n },\n});\n\n/**\n * List the accounts owned by one user, or by a bounded batch of users.\n *\n * The batch form serves one component crossing for app-owned user lists. The\n * public server facade projects these raw records into safe capability\n * summaries before exposing them to application code.\n */\nexport const list = query({\n args: {\n userId: v.optional(v.id(\"User\")),\n userIds: v.optional(v.array(v.id(\"User\"))),\n provider: v.optional(v.string()),\n },\n returns: v.array(vAccountDoc),\n handler: async (ctx, args) => {\n const userIds = args.userId === undefined ? (args.userIds ?? []) : [args.userId];\n const uniqueUserIds = Array.from(new Set(userIds));\n const provider = args.provider;\n if (uniqueUserIds.length > ACCOUNT_LIST_USER_BATCH) {\n throw new ConvexError({\n code: ErrorCode.INVALID_PARAMETERS,\n message: `At most ${ACCOUNT_LIST_USER_BATCH} users can be read at once.`,\n });\n }\n const accounts = await Promise.all(\n uniqueUserIds.map(async (userId) =>\n provider === undefined\n ? await ctx.db\n .query(\"Account\")\n .withIndex(\"user_id_provider\", (q) => q.eq(\"userId\", userId))\n .take(ACCOUNT_LIST_BATCH)\n : await ctx.db\n .query(\"Account\")\n .withIndex(\"user_id_provider\", (q) => q.eq(\"userId\", userId).eq(\"provider\", provider))\n .take(ACCOUNT_LIST_BATCH),\n ),\n );\n return accounts.flat();\n },\n});\n\n/** Insert a new account. */\nexport const create = mutation({\n args: {\n userId: v.id(\"User\"),\n provider: v.string(),\n providerAccountId: v.string(),\n secret: v.optional(v.string()),\n extend: v.optional(v.any()),\n },\n returns: v.id(\"Account\"),\n handler: async (ctx, args) => {\n // Dedup on the (provider, providerAccountId) identity. A bare insert let two\n // concurrent or retried provisioning ceremonies — SCIM POST retries, a\n // passkey double-submit — create duplicate Account rows, which then made\n // `account.get(...).unique()` throw on every future lookup (a permanent\n // sign-in lockout / rogue credential attribution). The index-range read plus\n // insert in this single mutation is OCC-atomic: a racing insert into the same\n // range conflicts and retries, then observes the winner's row below.\n const existing = await ctx.db\n .query(\"Account\")\n .withIndex(\"provider_account_id\", (q) =>\n q.eq(\"provider\", args.provider).eq(\"providerAccountId\", args.providerAccountId),\n )\n .first();\n if (existing !== null) {\n if (existing.userId !== args.userId) {\n // Already linked to a different user — reject rather than silently\n // attribute the identity (e.g. an attacker registering a passkey\n // credentialId that already belongs to a victim).\n throw new ConvexError({\n code: ErrorCode.ACCOUNT_ALREADY_LINKED,\n message: \"This account is already linked to another user.\",\n });\n }\n return existing._id;\n }\n return await ctx.db.insert(\"Account\", args);\n },\n});\n\n/** Patch fields on an account. */\nexport const update = mutation({\n args: {\n id: v.id(\"Account\"),\n patch: v.object({\n userId: v.optional(v.id(\"User\")),\n provider: v.optional(v.string()),\n providerAccountId: v.optional(v.string()),\n secret: v.optional(v.string()),\n emailVerified: v.optional(v.string()),\n phoneVerified: v.optional(v.string()),\n extend: v.optional(v.any()),\n }),\n },\n returns: v.null(),\n handler: async (ctx, { id: accountId, patch }) => {\n await ctx.db.patch(\"Account\", accountId, patch);\n return null;\n },\n});\n\n/**\n * Delete an account. When `requireOtherAccount` is set, refuses to delete the\n * user's last remaining account so they are never left with none.\n */\nconst remove = mutation({\n args: {\n id: v.id(\"Account\"),\n userId: v.optional(v.id(\"User\")),\n requireOtherAccount: v.optional(v.boolean()),\n },\n returns: v.null(),\n handler: async (ctx, { id: accountId, userId, requireOtherAccount }) => {\n const doc = await ctx.db.get(\"Account\", accountId);\n if (doc === null || (userId !== undefined && doc.userId !== userId)) {\n throw new ConvexError({\n code: ErrorCode.ACCOUNT_NOT_FOUND,\n message: \"Account not found.\",\n });\n }\n if (requireOtherAccount === true) {\n let otherFound = false;\n for await (const sibling of ctx.db\n .query(\"Account\")\n .withIndex(\"user_id_provider\", (q) => q.eq(\"userId\", doc.userId))) {\n if (sibling._id !== accountId) {\n otherFound = true;\n break;\n }\n }\n if (!otherFound) {\n throw new ConvexError({\n code: ErrorCode.INVALID_PARAMETERS,\n message: \"The provided parameters are invalid.\",\n });\n }\n }\n await ctx.db.delete(\"Account\", accountId);\n return null;\n },\n});\n\nexport { remove };\n"],"mappings":";;;;;;;;;;;;;;;;;AAkBA,MAAM,qBAAqB;;AAG3B,MAAM,0BAA0B;;AAKhC,MAAa,yBAAyB,SAAS;CAC7C,MAAM;EACJ,UAAU,EAAE,QAAQ;EACpB,mBAAmB,EAAE,QAAQ;EAC7B,iBAAiB,EAAE,QAAQ;EAC3B,oBAAoB,EAAE,QAAQ;EAC9B,gBAAgB,EAAE,SAAS;EAC3B,aAAa,EAAE,SAAS;EACzB;CACD,SAAS,EAAE,MACT,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,UAAU,EAAE,CAAC,EAC1C,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,UAAU,EAAE,CAAC,EAC1C,EAAE,OAAO;EACP,QAAQ,EAAE,QAAQ,QAAQ;EAC1B,SAAS;EACT,MAAM;EACN,SAAS,EAAE,SAAS;EACrB,CAAC,CACH;CACD,SAAS,OAAO,KAAK,SAAS;AAO5B,MAAI,EANU,KAAK,iBACf,MAAM,kBAAkB,KAAK;GAC3B,YAAY,KAAK;GACjB,oBAAoB,KAAK;GAC1B,CAAC,GACF;GAAE,IAAI;GAAe,YAAY;GAAW,EACrC,GAAI,QAAO,EAAE,QAAQ,WAAoB;EAEpD,MAAM,UAAU,MAAM,IAAI,GACvB,MAAM,UAAU,CAChB,UAAU,wBAAwB,MACjC,EAAE,GAAG,YAAY,KAAK,SAAS,CAAC,GAAG,qBAAqB,KAAK,kBAAkB,CAChF,CACA,QAAQ;AACX,MAAI,YAAY,KAAM,QAAO,EAAE,QAAQ,WAAoB;EAE3D,MAAM,CAAC,MAAM,QAAQ,MAAM,QAAQ,IAAI,CACrC,IAAI,GAAG,IAAI,QAAQ,QAAQ,OAAO,EAClC,KAAK,cACD,IAAI,GACD,MAAM,aAAa,CACnB,UAAU,qBAAqB,MAC9B,EAAE,GAAG,UAAU,QAAQ,OAAO,CAAC,GAAG,YAAY,KAAK,CACpD,CACA,OAAO,GACV,QAAQ,QAAQ,KAAK,CAC1B,CAAC;AACF,MAAI,SAAS,KAAM,QAAO,EAAE,QAAQ,WAAoB;AACxD,SAAO;GACL,QAAQ;GACR;GACA;GACA,SAAS,SAAS;GACnB;;CAEJ,CAAC;;AAGF,MAAa,4BAA4B,SAAS;CAChD,MAAM;EACJ,WAAW,EAAE,GAAG,UAAU;EAC1B,iBAAiB,EAAE,QAAQ;EAC3B,cAAc,EAAE,SAAS;EACzB,gBAAgB,EAAE,SAAS;EAC3B,gBAAgB,EAAE,SAAS,oBAAoB;EAC/C,uBAAuB,EAAE,QAAQ;EACjC,4BAA4B,EAAE,QAAQ;EACvC;CACD,SAAS,EAAE,MACT,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,WAAW,EAAE,CAAC,EAC3C,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,QAAQ,EAAE,CAAC,EACxC,EAAE,OAAO;EACP,QAAQ,EAAE,QAAQ,WAAW;EAC7B,MAAM;EACN,WAAW,EAAE,GAAG,UAAU;EAC1B,uBAAuB,EAAE,QAAQ;EACjC,gBAAgB,EAAE,SAAS,EAAE,GAAG,eAAe,CAAC;EAChD,mBAAmB,EAAE,SAAS,EAAE,GAAG,UAAU,CAAC;EAC/C,CAAC,CACH;CACD,SAAS,OAAO,KAAK,SAAS;EAC5B,MAAM,UAAU,MAAM,IAAI,GAAG,IAAI,WAAW,KAAK,UAAU;AAC3D,MAAI,YAAY,KAAM,QAAO,EAAE,QAAQ,YAAqB;AAC5D,QAAM,iBAAiB,KAAK,KAAK,gBAAgB;AACjD,MAAI,CAAC,KAAK,aAAc,QAAO,EAAE,QAAQ,SAAkB;EAE3D,MAAM,UAAU,MAAM,kBAAkB,KAAK;GAC3C,QAAQ,QAAQ;GAChB,gBAAgB,KAAK;GACrB,uBAAuB,KAAK;GAC5B,4BAA4B,KAAK,iBAAiB,KAAK,6BAA6B;GACrF,CAAC;AACF,MAAI,YAAY,KAAM,QAAO,EAAE,QAAQ,YAAqB;EAC5D,MAAM,SAAoC;GACxC,QAAQ;GACR,MAAM,QAAQ;GACd,WAAW,QAAQ;GACnB,uBAAuB,QAAQ;GAChC;AACD,MAAI,QAAQ,mBAAmB,OAAW,QAAO,iBAAiB,QAAQ;AAC1E,MAAI,QAAQ,sBAAsB,OAChC,QAAO,oBAAoB,QAAQ;AAErC,SAAO;;CAEV,CAAC;;;;;AAMF,MAAa,MAAM,MAAM;CACvB,MAAM;EACJ,IAAI,EAAE,SAAS,EAAE,GAAG,UAAU,CAAC;EAC/B,UAAU,EAAE,SAAS,EAAE,QAAQ,CAAC;EAChC,mBAAmB,EAAE,SAAS,EAAE,QAAQ,CAAC;EAC1C;CACD,SAAS,EAAE,MAAM,aAAa,EAAE,MAAM,CAAC;CACvC,SAAS,OAAO,KAAK,SAAS;AAC5B,MAAI,KAAK,aAAa,UAAa,KAAK,sBAAsB,OAC5D,QAAO,MAAM,IAAI,GACd,MAAM,UAAU,CAChB,UAAU,wBAAwB,MACjC,EAAE,GAAG,YAAY,KAAK,SAAU,CAAC,GAAG,qBAAqB,KAAK,kBAAmB,CAClF,CACA,QAAQ;AAEb,MAAI,KAAK,OAAO,OAAW,QAAO;AAClC,SAAO,MAAM,IAAI,GAAG,IAAI,WAAW,KAAK,GAAG;;CAE9C,CAAC;;;;;;;;AASF,MAAa,OAAO,MAAM;CACxB,MAAM;EACJ,QAAQ,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC;EAChC,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC;EAC1C,UAAU,EAAE,SAAS,EAAE,QAAQ,CAAC;EACjC;CACD,SAAS,EAAE,MAAM,YAAY;CAC7B,SAAS,OAAO,KAAK,SAAS;EAC5B,MAAM,UAAU,KAAK,WAAW,SAAa,KAAK,WAAW,EAAE,GAAI,CAAC,KAAK,OAAO;EAChF,MAAM,gBAAgB,MAAM,KAAK,IAAI,IAAI,QAAQ,CAAC;EAClD,MAAM,WAAW,KAAK;AACtB,MAAI,cAAc,SAAS,wBACzB,OAAM,IAAI,YAAY;GACpB,MAAM,UAAU;GAChB,SAAS,WAAW,wBAAwB;GAC7C,CAAC;AAeJ,UAbiB,MAAM,QAAQ,IAC7B,cAAc,IAAI,OAAO,WACvB,aAAa,SACT,MAAM,IAAI,GACP,MAAM,UAAU,CAChB,UAAU,qBAAqB,MAAM,EAAE,GAAG,UAAU,OAAO,CAAC,CAC5D,KAAK,mBAAmB,GAC3B,MAAM,IAAI,GACP,MAAM,UAAU,CAChB,UAAU,qBAAqB,MAAM,EAAE,GAAG,UAAU,OAAO,CAAC,GAAG,YAAY,SAAS,CAAC,CACrF,KAAK,mBAAmB,CAChC,CACF,EACe,MAAM;;CAEzB,CAAC;;AAGF,MAAa,SAAS,SAAS;CAC7B,MAAM;EACJ,QAAQ,EAAE,GAAG,OAAO;EACpB,UAAU,EAAE,QAAQ;EACpB,mBAAmB,EAAE,QAAQ;EAC7B,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC;EAC9B,QAAQ,EAAE,SAAS,EAAE,KAAK,CAAC;EAC5B;CACD,SAAS,EAAE,GAAG,UAAU;CACxB,SAAS,OAAO,KAAK,SAAS;EAQ5B,MAAM,WAAW,MAAM,IAAI,GACxB,MAAM,UAAU,CAChB,UAAU,wBAAwB,MACjC,EAAE,GAAG,YAAY,KAAK,SAAS,CAAC,GAAG,qBAAqB,KAAK,kBAAkB,CAChF,CACA,OAAO;AACV,MAAI,aAAa,MAAM;AACrB,OAAI,SAAS,WAAW,KAAK,OAI3B,OAAM,IAAI,YAAY;IACpB,MAAM,UAAU;IAChB,SAAS;IACV,CAAC;AAEJ,UAAO,SAAS;;AAElB,SAAO,MAAM,IAAI,GAAG,OAAO,WAAW,KAAK;;CAE9C,CAAC;;AAGF,MAAa,SAAS,SAAS;CAC7B,MAAM;EACJ,IAAI,EAAE,GAAG,UAAU;EACnB,OAAO,EAAE,OAAO;GACd,QAAQ,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC;GAChC,UAAU,EAAE,SAAS,EAAE,QAAQ,CAAC;GAChC,mBAAmB,EAAE,SAAS,EAAE,QAAQ,CAAC;GACzC,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC;GAC9B,eAAe,EAAE,SAAS,EAAE,QAAQ,CAAC;GACrC,eAAe,EAAE,SAAS,EAAE,QAAQ,CAAC;GACrC,QAAQ,EAAE,SAAS,EAAE,KAAK,CAAC;GAC5B,CAAC;EACH;CACD,SAAS,EAAE,MAAM;CACjB,SAAS,OAAO,KAAK,EAAE,IAAI,WAAW,YAAY;AAChD,QAAM,IAAI,GAAG,MAAM,WAAW,WAAW,MAAM;AAC/C,SAAO;;CAEV,CAAC;;;;;AAMF,MAAM,SAAS,SAAS;CACtB,MAAM;EACJ,IAAI,EAAE,GAAG,UAAU;EACnB,QAAQ,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC;EAChC,qBAAqB,EAAE,SAAS,EAAE,SAAS,CAAC;EAC7C;CACD,SAAS,EAAE,MAAM;CACjB,SAAS,OAAO,KAAK,EAAE,IAAI,WAAW,QAAQ,0BAA0B;EACtE,MAAM,MAAM,MAAM,IAAI,GAAG,IAAI,WAAW,UAAU;AAClD,MAAI,QAAQ,QAAS,WAAW,UAAa,IAAI,WAAW,OAC1D,OAAM,IAAI,YAAY;GACpB,MAAM,UAAU;GAChB,SAAS;GACV,CAAC;AAEJ,MAAI,wBAAwB,MAAM;GAChC,IAAI,aAAa;AACjB,cAAW,MAAM,WAAW,IAAI,GAC7B,MAAM,UAAU,CAChB,UAAU,qBAAqB,MAAM,EAAE,GAAG,UAAU,IAAI,OAAO,CAAC,CACjE,KAAI,QAAQ,QAAQ,WAAW;AAC7B,iBAAa;AACb;;AAGJ,OAAI,CAAC,WACH,OAAM,IAAI,YAAY;IACpB,MAAM,UAAU;IAChB,SAAS;IACV,CAAC;;AAGN,QAAM,IAAI,GAAG,OAAO,WAAW,UAAU;AACzC,SAAO;;CAEV,CAAC"}
@@ -0,0 +1,3 @@
1
+ //#endregion
2
+ export { batch_d_exports };
3
+ //# sourceMappingURL=batch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"batch.d.ts","names":[],"sources":["../../src/component/batch.ts"],"mappings":""}
@@ -0,0 +1,17 @@
1
+ import { ErrorCode } from "../shared/codes.js";
2
+ import { ConvexError } from "convex/values";
3
+
4
+ //#region src/component/batch.ts
5
+ /** Maximum IDs accepted by a single batched component read. @internal */
6
+ const MAX_BATCH_SELECTOR_SIZE = 100;
7
+ /** @internal Reject an oversized batch before it can start database work. */
8
+ function assertBatchSelectorSize(ids, selector) {
9
+ if (ids.length > MAX_BATCH_SELECTOR_SIZE) throw new ConvexError({
10
+ code: ErrorCode.INVALID_PARAMETERS,
11
+ message: `Batch selector "${selector}" accepts at most ${MAX_BATCH_SELECTOR_SIZE} IDs.`
12
+ });
13
+ }
14
+
15
+ //#endregion
16
+ export { assertBatchSelectorSize };
17
+ //# sourceMappingURL=batch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"batch.js","names":[],"sources":["../../src/component/batch.ts"],"sourcesContent":["import { ConvexError } from \"convex/values\";\n\nimport { ErrorCode } from \"../shared/codes\";\n\n/** Maximum IDs accepted by a single batched component read. @internal */\nexport const MAX_BATCH_SELECTOR_SIZE = 100;\n\n/** @internal Reject an oversized batch before it can start database work. */\nexport function assertBatchSelectorSize(ids: readonly unknown[], selector: string) {\n if (ids.length > MAX_BATCH_SELECTOR_SIZE) {\n throw new ConvexError({\n code: ErrorCode.INVALID_PARAMETERS,\n message: `Batch selector \"${selector}\" accepts at most ${MAX_BATCH_SELECTOR_SIZE} IDs.`,\n });\n }\n}\n"],"mappings":";;;;;AAKA,MAAa,0BAA0B;;AAGvC,SAAgB,wBAAwB,KAAyB,UAAkB;AACjF,KAAI,IAAI,SAAS,wBACf,OAAM,IAAI,YAAY;EACpB,MAAM,UAAU;EAChB,SAAS,mBAAmB,SAAS,oBAAoB,wBAAwB;EAClF,CAAC"}
@@ -1,5 +1,5 @@
1
- import * as convex_values2852 from "convex/values";
2
- import * as convex_server207 from "convex/server";
1
+ import * as convex_values1894 from "convex/values";
2
+ import * as convex_server186 from "convex/server";
3
3
 
4
4
  //#region src/component/connection/audit.d.ts
5
5
  declare namespace audit_d_exports {
@@ -16,9 +16,7 @@ declare namespace audit_d_exports {
16
16
  * an allowlist). Requires exactly one of `connectionId` or `groupId` — passing
17
17
  * neither throws rather than scanning the entire audit log.
18
18
  */
19
- declare const list: convex_server207.RegisteredQuery<"public", {
20
- connectionId?: convex_values2852.GenericId<"GroupConnection"> | undefined;
21
- groupId?: convex_values2852.GenericId<"Group"> | undefined;
19
+ declare const list: convex_server186.RegisteredQuery<"public", {
22
20
  paginationOpts: {
23
21
  id?: number;
24
22
  endCursor?: string | null;
@@ -27,19 +25,24 @@ declare const list: convex_server207.RegisteredQuery<"public", {
27
25
  numItems: number;
28
26
  cursor: string | null;
29
27
  };
28
+ scope: {
29
+ connectionId: convex_values1894.GenericId<"GroupConnection">;
30
+ } | {
31
+ groupId: convex_values1894.GenericId<"Group">;
32
+ };
30
33
  }, Promise<{
31
34
  page: {
32
- _id: convex_values2852.GenericId<"AuthEventProjection">;
35
+ _id: convex_values1894.GenericId<"AuthEventProjection">;
33
36
  _creationTime: number;
34
37
  eventId: string;
35
- targetKind: "user" | "connection" | "group" | "session" | "api_key" | "oauth_client" | "global";
38
+ targetKind: "user" | "group" | "session" | "api_key" | "connection" | "oauth_client" | "global";
36
39
  targetId: string;
37
40
  kind: "user.created" | "user.updated" | "session.signed_in" | "session.signed_out" | "session.invalidated" | "session.refresh_exchanged" | "session.refresh_reuse_detected" | "account.linked" | "account.unlinked" | "password.changed" | "passkey.added" | "passkey.removed" | "totp.enrolled" | "totp.removed" | "email.verified" | "phone.verified" | "api_key.created" | "api_key.revoked" | "oauth.client.created" | "oauth.client.revoked" | "oauth.code.created" | "oauth.token.created" | "oauth.token.exchanged" | "oauth.refresh.reuse_detected" | "oauth.refresh.revoked" | "connection.created" | "connection.updated" | "connection.removed" | "connection.login.succeeded" | "connection.login.failed" | "connection.domain.verification_requested" | "connection.domain.verified" | "connection.policy.updated" | "connection.saml.set" | "connection.saml.refreshed" | "connection.oidc.set" | "connection.scim.set" | "connection.scim.read" | "connection.scim.user.provisioned" | "connection.scim.user.updated" | "connection.scim.user.deactivated" | "connection.scim.user.reactivated" | "connection.scim.group.provisioned" | "connection.scim.group.updated" | "connection.scim.group.deactivated" | "connection.scim.group.reactivated" | "webhook.endpoint.created" | "webhook.endpoint.disabled" | "webhook.delivery.created" | "webhook.delivery.attempted" | "webhook.delivery.succeeded" | "webhook.delivery.failed";
38
- category: "email" | "phone" | "password" | "oauth" | "scim" | "user" | "connection" | "session" | "account" | "passkey" | "totp" | "api_key" | "webhook" | "security";
41
+ category: "user" | "session" | "account" | "password" | "passkey" | "totp" | "email" | "phone" | "api_key" | "oauth" | "connection" | "scim" | "webhook" | "security";
39
42
  occurredAt: number;
40
- actorType: "scim" | "user" | "api_key" | "webhook" | "oauth_client" | "system" | "anonymous";
43
+ actorType: "user" | "api_key" | "scim" | "webhook" | "system" | "oauth_client" | "anonymous";
41
44
  actorId: string | undefined;
42
- subjectType: "email" | "phone" | "user" | "connection" | "group" | "session" | "account" | "passkey" | "totp" | "api_key" | "oauth_client" | "system" | "oauth_code" | "scim_identity" | "webhook_endpoint" | "webhook_delivery";
45
+ subjectType: "user" | "group" | "session" | "account" | "passkey" | "totp" | "email" | "phone" | "api_key" | "connection" | "system" | "oauth_client" | "oauth_code" | "scim_identity" | "webhook_endpoint" | "webhook_delivery";
43
46
  subjectId: string | undefined;
44
47
  outcome: "success" | "failure";
45
48
  errorCode: string | undefined;
@@ -60,24 +63,24 @@ declare const list: convex_server207.RegisteredQuery<"public", {
60
63
  refreshTokenId?: string | undefined;
61
64
  flow?: "reset" | "change" | undefined;
62
65
  } | {
63
- accountId?: string | undefined;
64
66
  provider?: string | undefined;
65
67
  providerAccountId?: string | undefined;
68
+ accountId?: string | undefined;
66
69
  } | {
67
- name?: string | undefined;
68
- credentialId?: string | undefined;
69
70
  reason?: string | undefined;
70
71
  passkeyId?: string | undefined;
72
+ credentialId?: string | undefined;
71
73
  totpId?: string | undefined;
72
74
  keyId?: string | undefined;
75
+ name?: string | undefined;
73
76
  prefix?: string | undefined;
74
77
  } | {
78
+ userId?: string | undefined;
75
79
  email?: string | undefined;
76
80
  phone?: string | undefined;
77
- userId?: string | undefined;
78
81
  } | {
79
- name?: string | undefined;
80
82
  userId?: string | undefined;
83
+ name?: string | undefined;
81
84
  clientId?: string | undefined;
82
85
  codeId?: string | undefined;
83
86
  scopes?: string[] | undefined;
@@ -86,15 +89,14 @@ declare const list: convex_server207.RegisteredQuery<"public", {
86
89
  resource?: string | undefined;
87
90
  } | {
88
91
  userId?: string | undefined;
92
+ errorCode?: string | undefined;
89
93
  connectionId?: string | undefined;
90
- verifiedAt?: number | undefined;
91
- expiresAt?: number | undefined;
92
- version?: number | undefined;
94
+ changed?: string[] | undefined;
93
95
  protocol?: "oidc" | "saml" | undefined;
94
96
  domain?: string | undefined;
95
97
  recordName?: string | undefined;
96
- errorCode?: string | undefined;
97
- changed?: string[] | undefined;
98
+ expiresAt?: number | undefined;
99
+ verifiedAt?: number | undefined;
98
100
  metadataUrl?: string | undefined;
99
101
  domains?: string[] | undefined;
100
102
  issuer?: string | undefined;
@@ -102,28 +104,29 @@ declare const list: convex_server207.RegisteredQuery<"public", {
102
104
  jwksUri?: string | undefined;
103
105
  audience?: string | string[] | undefined;
104
106
  tokenEndpointAuthMethod?: string | undefined;
107
+ version?: number | undefined;
105
108
  } | {
106
109
  userId?: string | undefined;
110
+ scimConfigId?: string | undefined;
111
+ resourceType?: "user" | "group" | undefined;
112
+ resourceId?: string | undefined;
107
113
  operation?: string | undefined;
108
114
  externalId?: string | undefined;
109
- groupId?: string | undefined;
110
115
  active?: boolean | undefined;
111
- resourceType?: "user" | "group" | undefined;
112
- scimConfigId?: string | undefined;
113
- resourceId?: string | undefined;
116
+ groupId?: string | undefined;
114
117
  } | {
115
- status?: number | undefined;
116
118
  endpointId?: string | undefined;
117
119
  deliveryId?: string | undefined;
118
120
  sourceEventId?: string | undefined;
119
121
  sourceEventType?: "user.created" | "user.updated" | "session.signed_in" | "session.signed_out" | "session.invalidated" | "session.refresh_exchanged" | "session.refresh_reuse_detected" | "account.linked" | "account.unlinked" | "password.changed" | "passkey.added" | "passkey.removed" | "totp.enrolled" | "totp.removed" | "email.verified" | "phone.verified" | "api_key.created" | "api_key.revoked" | "oauth.client.created" | "oauth.client.revoked" | "oauth.code.created" | "oauth.token.created" | "oauth.token.exchanged" | "oauth.refresh.reuse_detected" | "oauth.refresh.revoked" | "connection.created" | "connection.updated" | "connection.removed" | "connection.login.succeeded" | "connection.login.failed" | "connection.domain.verification_requested" | "connection.domain.verified" | "connection.policy.updated" | "connection.saml.set" | "connection.saml.refreshed" | "connection.oidc.set" | "connection.scim.set" | "connection.scim.read" | "connection.scim.user.provisioned" | "connection.scim.user.updated" | "connection.scim.user.deactivated" | "connection.scim.user.reactivated" | "connection.scim.group.provisioned" | "connection.scim.group.updated" | "connection.scim.group.deactivated" | "connection.scim.group.reactivated" | "webhook.endpoint.created" | "webhook.endpoint.disabled" | "webhook.delivery.created" | "webhook.delivery.attempted" | "webhook.delivery.succeeded" | "webhook.delivery.failed" | undefined;
120
122
  attemptCount?: number | undefined;
123
+ status?: number | undefined;
121
124
  error?: string | undefined;
122
125
  } | undefined;
123
126
  }[];
124
127
  isDone: boolean;
125
- continueCursor: convex_server207.Cursor;
126
- splitCursor?: convex_server207.Cursor | null;
128
+ continueCursor: convex_server186.Cursor;
129
+ splitCursor?: convex_server186.Cursor | null;
127
130
  pageStatus?: "SplitRecommended" | "SplitRequired" | null;
128
131
  }>>;
129
132
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"audit.d.ts","names":[],"sources":["../../../src/component/connection/audit.ts"],"mappings":";;;;;;;;;;;;;AA+GA;;;;;cAAa,IAAA,mBAAI,eAAA;iBAkCf,iBAAA,CAAA,SAAA"}
1
+ {"version":3,"file":"audit.d.ts","names":[],"sources":["../../../src/component/connection/audit.ts"],"mappings":";;;;;;;;;;;;;AA8GA;;;;;cAAa,IAAA,mBAAI,eAAA;;;;;;;;;;kBA6Bf,iBAAA,CAAA,SAAA;EAAA"}
@@ -1,9 +1,9 @@
1
- import { ErrorCode } from "../../shared/codes.js";
2
- import { vAuthEventProjectionDoc, vPaginated } from "../model.js";
1
+ import { EVENT_KIND_CATEGORY } from "../../shared/event/kinds.js";
2
+ import { vPaginated } from "../model.js";
3
3
  import schema_default from "../schema.js";
4
4
  import { query } from "../_generated/server.js";
5
- import "../functions.js";
6
- import { ConvexError, v } from "convex/values";
5
+ import { vAuthEventProjectionDoc } from "../documents.js";
6
+ import { v } from "convex/values";
7
7
  import { paginationOptsValidator } from "convex/server";
8
8
  import { paginator } from "convex-helpers/server/pagination";
9
9
 
@@ -83,7 +83,7 @@ const PUBLIC_DATA_KEYS = {
83
83
  };
84
84
  function publicData(kind, value) {
85
85
  if (typeof value !== "object" || value === null || Array.isArray(value)) return void 0;
86
- const keys = PUBLIC_DATA_KEYS[kind.startsWith("api_key.") ? "api_key" : kind.slice(0, kind.indexOf("."))] ?? [];
86
+ const keys = PUBLIC_DATA_KEYS[EVENT_KIND_CATEGORY[kind]] ?? [];
87
87
  const source = value;
88
88
  const redacted = {};
89
89
  for (const key of keys) {
@@ -121,30 +121,23 @@ function publicProjection(doc) {
121
121
  */
122
122
  const list = query({
123
123
  args: {
124
- connectionId: v.optional(v.id("GroupConnection")),
125
- groupId: v.optional(v.id("Group")),
124
+ scope: v.union(v.object({ connectionId: schema_default.id("GroupConnection") }), v.object({ groupId: schema_default.id("Group") })),
126
125
  paginationOpts: paginationOptsValidator
127
126
  },
128
127
  returns: vPaginated(vAuthEventProjectionDoc),
129
- handler: async (ctx, args) => {
130
- if (args.connectionId !== void 0) {
131
- const result = await paginator(ctx.db, schema_default).query("AuthEventProjection").withIndex("target_time", (idx) => idx.eq("targetKind", "connection").eq("targetId", args.connectionId)).order("desc").paginate(args.paginationOpts);
128
+ handler: async (ctx, { scope, paginationOpts }) => {
129
+ if ("connectionId" in scope) {
130
+ const result$1 = await paginator(ctx.db, schema_default).query("AuthEventProjection").withIndex("target_time", (idx) => idx.eq("targetKind", "connection").eq("targetId", scope.connectionId)).order("desc").paginate(paginationOpts);
132
131
  return {
133
- ...result,
134
- page: result.page.map(publicProjection)
132
+ ...result$1,
133
+ page: result$1.page.map(publicProjection)
135
134
  };
136
135
  }
137
- if (args.groupId !== void 0) {
138
- const result = await paginator(ctx.db, schema_default).query("AuthEventProjection").withIndex("target_time", (idx) => idx.eq("targetKind", "group").eq("targetId", args.groupId)).order("desc").paginate(args.paginationOpts);
139
- return {
140
- ...result,
141
- page: result.page.map(publicProjection)
142
- };
143
- }
144
- throw new ConvexError({
145
- code: ErrorCode.INVALID_PARAMETERS,
146
- message: "connection.audit.list requires either `connectionId` or `groupId` to target the query. Passing neither would walk the entire audit log."
147
- });
136
+ const result = await paginator(ctx.db, schema_default).query("AuthEventProjection").withIndex("target_time", (idx) => idx.eq("targetKind", "group").eq("targetId", scope.groupId)).order("desc").paginate(paginationOpts);
137
+ return {
138
+ ...result,
139
+ page: result.page.map(publicProjection)
140
+ };
148
141
  }
149
142
  });
150
143
 
@@ -1 +1 @@
1
- {"version":3,"file":"audit.js","names":["schema"],"sources":["../../../src/component/connection/audit.ts"],"sourcesContent":["/**\n * `component.connection.audit.*` - Connection audit projections backed by auth events.\n *\n * @module\n */\n\nimport { paginationOptsValidator } from \"convex/server\";\nimport { paginator } from \"convex-helpers/server/pagination\";\nimport { ConvexError, v, type Infer } from \"convex/values\";\n\nimport { ErrorCode } from \"../../shared/codes\";\nimport type { Doc } from \"../_generated/dataModel\";\nimport { query } from \"../functions\";\nimport { vAuthEventData, vAuthEventProjectionDoc, vPaginated } from \"../model\";\nimport schema from \"../schema\";\n\nconst PUBLIC_DATA_KEYS = {\n user: [\"type\", \"provider\", \"existingUserId\"],\n session: [\"provider\", \"method\", \"reason\"],\n account: [\"provider\", \"accountId\"],\n password: [\"userId\"],\n passkey: [\"passkeyId\"],\n totp: [\"totpId\"],\n email: [\"userId\"],\n phone: [\"userId\"],\n api_key: [\"keyId\", \"name\", \"prefix\", \"reason\"],\n oauth: [\"clientId\", \"codeId\", \"scopes\", \"grantType\", \"resource\"],\n connection: [\n \"connectionId\",\n \"protocol\",\n \"domain\",\n \"recordName\",\n \"expiresAt\",\n \"verifiedAt\",\n \"metadataUrl\",\n \"domains\",\n \"version\",\n \"errorCode\",\n \"issuer\",\n \"discoveryUrl\",\n \"jwksUri\",\n \"audience\",\n \"tokenEndpointAuthMethod\",\n ],\n scim: [\n \"scimConfigId\",\n \"resourceType\",\n \"resourceId\",\n \"operation\",\n \"externalId\",\n \"active\",\n \"groupId\",\n \"userId\",\n ],\n webhook: [\n \"endpointId\",\n \"deliveryId\",\n \"sourceEventId\",\n \"sourceEventType\",\n \"attemptCount\",\n \"status\",\n \"error\",\n ],\n security: [\"reason\", \"errorCode\"],\n} as const;\n\nfunction publicData(kind: string, value: unknown): Infer<typeof vAuthEventData> | undefined {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) return undefined;\n const category = kind.startsWith(\"api_key.\")\n ? \"api_key\"\n : (kind.slice(0, kind.indexOf(\".\")) as keyof typeof PUBLIC_DATA_KEYS);\n const keys = PUBLIC_DATA_KEYS[category] ?? [];\n const source = value as Record<string, unknown>;\n const redacted: Record<string, unknown> = {};\n for (const key of keys) {\n const nested = source[key];\n if (nested !== undefined) redacted[key] = nested;\n }\n return Object.keys(redacted).length === 0\n ? undefined\n : (redacted as Infer<typeof vAuthEventData>);\n}\n\nfunction publicProjection(doc: Doc<\"AuthEventProjection\">) {\n return {\n _id: doc._id,\n _creationTime: doc._creationTime,\n eventId: doc.eventId,\n targetKind: doc.targetKind,\n targetId: doc.targetId,\n kind: doc.kind,\n category: doc.category,\n occurredAt: doc.occurredAt,\n actorType: doc.actorType,\n actorId: doc.actorId,\n subjectType: doc.subjectType,\n subjectId: doc.subjectId,\n outcome: doc.outcome,\n errorCode: doc.errorCode,\n requestId: doc.requestId,\n ip: undefined,\n data: publicData(doc.kind, doc.data),\n };\n}\n\n/**\n * List audit-event projections for a connection or a group, newest first and\n * paginated. Rows are redacted to public fields (IP dropped, `data` narrowed to\n * an allowlist). Requires exactly one of `connectionId` or `groupId` — passing\n * neither throws rather than scanning the entire audit log.\n */\nexport const list = query({\n args: {\n connectionId: v.optional(v.id(\"GroupConnection\")),\n groupId: v.optional(v.id(\"Group\")),\n paginationOpts: paginationOptsValidator,\n },\n returns: vPaginated(vAuthEventProjectionDoc),\n handler: async (ctx, args) => {\n if (args.connectionId !== undefined) {\n const result = await paginator(ctx.db, schema)\n .query(\"AuthEventProjection\")\n .withIndex(\"target_time\", (idx) =>\n idx.eq(\"targetKind\", \"connection\").eq(\"targetId\", args.connectionId!),\n )\n .order(\"desc\")\n .paginate(args.paginationOpts);\n return { ...result, page: result.page.map(publicProjection) };\n }\n if (args.groupId !== undefined) {\n const result = await paginator(ctx.db, schema)\n .query(\"AuthEventProjection\")\n .withIndex(\"target_time\", (idx) =>\n idx.eq(\"targetKind\", \"group\").eq(\"targetId\", args.groupId!),\n )\n .order(\"desc\")\n .paginate(args.paginationOpts);\n return { ...result, page: result.page.map(publicProjection) };\n }\n throw new ConvexError({\n code: ErrorCode.INVALID_PARAMETERS,\n message:\n \"connection.audit.list requires either `connectionId` or `groupId` to target the query. Passing neither would walk the entire audit log.\",\n });\n },\n});\n"],"mappings":";;;;;;;;;;;;;;;AAgBA,MAAM,mBAAmB;CACvB,MAAM;EAAC;EAAQ;EAAY;EAAiB;CAC5C,SAAS;EAAC;EAAY;EAAU;EAAS;CACzC,SAAS,CAAC,YAAY,YAAY;CAClC,UAAU,CAAC,SAAS;CACpB,SAAS,CAAC,YAAY;CACtB,MAAM,CAAC,SAAS;CAChB,OAAO,CAAC,SAAS;CACjB,OAAO,CAAC,SAAS;CACjB,SAAS;EAAC;EAAS;EAAQ;EAAU;EAAS;CAC9C,OAAO;EAAC;EAAY;EAAU;EAAU;EAAa;EAAW;CAChE,YAAY;EACV;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;CACD,MAAM;EACJ;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;CACD,SAAS;EACP;EACA;EACA;EACA;EACA;EACA;EACA;EACD;CACD,UAAU,CAAC,UAAU,YAAY;CAClC;AAED,SAAS,WAAW,MAAc,OAA0D;AAC1F,KAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,MAAM,QAAQ,MAAM,CAAE,QAAO;CAIhF,MAAM,OAAO,iBAHI,KAAK,WAAW,WAAW,GACxC,YACC,KAAK,MAAM,GAAG,KAAK,QAAQ,IAAI,CAAC,KACM,EAAE;CAC7C,MAAM,SAAS;CACf,MAAM,WAAoC,EAAE;AAC5C,MAAK,MAAM,OAAO,MAAM;EACtB,MAAM,SAAS,OAAO;AACtB,MAAI,WAAW,OAAW,UAAS,OAAO;;AAE5C,QAAO,OAAO,KAAK,SAAS,CAAC,WAAW,IACpC,SACC;;AAGP,SAAS,iBAAiB,KAAiC;AACzD,QAAO;EACL,KAAK,IAAI;EACT,eAAe,IAAI;EACnB,SAAS,IAAI;EACb,YAAY,IAAI;EAChB,UAAU,IAAI;EACd,MAAM,IAAI;EACV,UAAU,IAAI;EACd,YAAY,IAAI;EAChB,WAAW,IAAI;EACf,SAAS,IAAI;EACb,aAAa,IAAI;EACjB,WAAW,IAAI;EACf,SAAS,IAAI;EACb,WAAW,IAAI;EACf,WAAW,IAAI;EACf,IAAI;EACJ,MAAM,WAAW,IAAI,MAAM,IAAI,KAAK;EACrC;;;;;;;;AASH,MAAa,OAAO,MAAM;CACxB,MAAM;EACJ,cAAc,EAAE,SAAS,EAAE,GAAG,kBAAkB,CAAC;EACjD,SAAS,EAAE,SAAS,EAAE,GAAG,QAAQ,CAAC;EAClC,gBAAgB;EACjB;CACD,SAAS,WAAW,wBAAwB;CAC5C,SAAS,OAAO,KAAK,SAAS;AAC5B,MAAI,KAAK,iBAAiB,QAAW;GACnC,MAAM,SAAS,MAAM,UAAU,IAAI,IAAIA,eAAO,CAC3C,MAAM,sBAAsB,CAC5B,UAAU,gBAAgB,QACzB,IAAI,GAAG,cAAc,aAAa,CAAC,GAAG,YAAY,KAAK,aAAc,CACtE,CACA,MAAM,OAAO,CACb,SAAS,KAAK,eAAe;AAChC,UAAO;IAAE,GAAG;IAAQ,MAAM,OAAO,KAAK,IAAI,iBAAiB;IAAE;;AAE/D,MAAI,KAAK,YAAY,QAAW;GAC9B,MAAM,SAAS,MAAM,UAAU,IAAI,IAAIA,eAAO,CAC3C,MAAM,sBAAsB,CAC5B,UAAU,gBAAgB,QACzB,IAAI,GAAG,cAAc,QAAQ,CAAC,GAAG,YAAY,KAAK,QAAS,CAC5D,CACA,MAAM,OAAO,CACb,SAAS,KAAK,eAAe;AAChC,UAAO;IAAE,GAAG;IAAQ,MAAM,OAAO,KAAK,IAAI,iBAAiB;IAAE;;AAE/D,QAAM,IAAI,YAAY;GACpB,MAAM,UAAU;GAChB,SACE;GACH,CAAC;;CAEL,CAAC"}
1
+ {"version":3,"file":"audit.js","names":["schema","result"],"sources":["../../../src/component/connection/audit.ts"],"sourcesContent":["/**\n * `component.connection.audit.*` - Connection audit projections backed by auth events.\n *\n * @module\n */\n\nimport { paginationOptsValidator } from \"convex/server\";\nimport { paginator } from \"convex-helpers/server/pagination\";\nimport { v, type Infer } from \"convex/values\";\n\nimport { EVENT_KIND_CATEGORY, type AuthEventKind } from \"../../shared/event/kinds\";\nimport type { Doc } from \"../_generated/dataModel\";\nimport { vAuthEventProjectionDoc } from \"../documents\";\nimport { query } from \"../_generated/server\";\nimport { vAuthEventData, vPaginated } from \"../model\";\nimport schema from \"../schema\";\n\nconst PUBLIC_DATA_KEYS = {\n user: [\"type\", \"provider\", \"existingUserId\"],\n session: [\"provider\", \"method\", \"reason\"],\n account: [\"provider\", \"accountId\"],\n password: [\"userId\"],\n passkey: [\"passkeyId\"],\n totp: [\"totpId\"],\n email: [\"userId\"],\n phone: [\"userId\"],\n api_key: [\"keyId\", \"name\", \"prefix\", \"reason\"],\n oauth: [\"clientId\", \"codeId\", \"scopes\", \"grantType\", \"resource\"],\n connection: [\n \"connectionId\",\n \"protocol\",\n \"domain\",\n \"recordName\",\n \"expiresAt\",\n \"verifiedAt\",\n \"metadataUrl\",\n \"domains\",\n \"version\",\n \"errorCode\",\n \"issuer\",\n \"discoveryUrl\",\n \"jwksUri\",\n \"audience\",\n \"tokenEndpointAuthMethod\",\n ],\n scim: [\n \"scimConfigId\",\n \"resourceType\",\n \"resourceId\",\n \"operation\",\n \"externalId\",\n \"active\",\n \"groupId\",\n \"userId\",\n ],\n webhook: [\n \"endpointId\",\n \"deliveryId\",\n \"sourceEventId\",\n \"sourceEventType\",\n \"attemptCount\",\n \"status\",\n \"error\",\n ],\n security: [\"reason\", \"errorCode\"],\n} as const;\n\nfunction publicData(kind: AuthEventKind, value: unknown): Infer<typeof vAuthEventData> | undefined {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) return undefined;\n const category = EVENT_KIND_CATEGORY[kind];\n const keys = PUBLIC_DATA_KEYS[category] ?? [];\n const source = value as Record<string, unknown>;\n const redacted: Record<string, unknown> = {};\n for (const key of keys) {\n const nested = source[key];\n if (nested !== undefined) redacted[key] = nested;\n }\n return Object.keys(redacted).length === 0\n ? undefined\n : (redacted as Infer<typeof vAuthEventData>);\n}\n\nfunction publicProjection(doc: Doc<\"AuthEventProjection\">) {\n return {\n _id: doc._id,\n _creationTime: doc._creationTime,\n eventId: doc.eventId,\n targetKind: doc.targetKind,\n targetId: doc.targetId,\n kind: doc.kind,\n category: doc.category,\n occurredAt: doc.occurredAt,\n actorType: doc.actorType,\n actorId: doc.actorId,\n subjectType: doc.subjectType,\n subjectId: doc.subjectId,\n outcome: doc.outcome,\n errorCode: doc.errorCode,\n requestId: doc.requestId,\n ip: undefined,\n data: publicData(doc.kind, doc.data),\n };\n}\n\n/**\n * List audit-event projections for a connection or a group, newest first and\n * paginated. Rows are redacted to public fields (IP dropped, `data` narrowed to\n * an allowlist). Requires exactly one of `connectionId` or `groupId` — passing\n * neither throws rather than scanning the entire audit log.\n */\nexport const list = query({\n args: {\n scope: v.union(\n v.object({ connectionId: schema.id(\"GroupConnection\") }),\n v.object({ groupId: schema.id(\"Group\") }),\n ),\n paginationOpts: paginationOptsValidator,\n },\n returns: vPaginated(vAuthEventProjectionDoc),\n handler: async (ctx, { scope, paginationOpts }) => {\n if (\"connectionId\" in scope) {\n const result = await paginator(ctx.db, schema)\n .query(\"AuthEventProjection\")\n .withIndex(\"target_time\", (idx) =>\n idx.eq(\"targetKind\", \"connection\").eq(\"targetId\", scope.connectionId),\n )\n .order(\"desc\")\n .paginate(paginationOpts);\n return { ...result, page: result.page.map(publicProjection) };\n }\n const result = await paginator(ctx.db, schema)\n .query(\"AuthEventProjection\")\n .withIndex(\"target_time\", (idx) =>\n idx.eq(\"targetKind\", \"group\").eq(\"targetId\", scope.groupId),\n )\n .order(\"desc\")\n .paginate(paginationOpts);\n return { ...result, page: result.page.map(publicProjection) };\n },\n});\n"],"mappings":";;;;;;;;;;;;;;;AAiBA,MAAM,mBAAmB;CACvB,MAAM;EAAC;EAAQ;EAAY;EAAiB;CAC5C,SAAS;EAAC;EAAY;EAAU;EAAS;CACzC,SAAS,CAAC,YAAY,YAAY;CAClC,UAAU,CAAC,SAAS;CACpB,SAAS,CAAC,YAAY;CACtB,MAAM,CAAC,SAAS;CAChB,OAAO,CAAC,SAAS;CACjB,OAAO,CAAC,SAAS;CACjB,SAAS;EAAC;EAAS;EAAQ;EAAU;EAAS;CAC9C,OAAO;EAAC;EAAY;EAAU;EAAU;EAAa;EAAW;CAChE,YAAY;EACV;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;CACD,MAAM;EACJ;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;CACD,SAAS;EACP;EACA;EACA;EACA;EACA;EACA;EACA;EACD;CACD,UAAU,CAAC,UAAU,YAAY;CAClC;AAED,SAAS,WAAW,MAAqB,OAA0D;AACjG,KAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,MAAM,QAAQ,MAAM,CAAE,QAAO;CAEhF,MAAM,OAAO,iBADI,oBAAoB,UACM,EAAE;CAC7C,MAAM,SAAS;CACf,MAAM,WAAoC,EAAE;AAC5C,MAAK,MAAM,OAAO,MAAM;EACtB,MAAM,SAAS,OAAO;AACtB,MAAI,WAAW,OAAW,UAAS,OAAO;;AAE5C,QAAO,OAAO,KAAK,SAAS,CAAC,WAAW,IACpC,SACC;;AAGP,SAAS,iBAAiB,KAAiC;AACzD,QAAO;EACL,KAAK,IAAI;EACT,eAAe,IAAI;EACnB,SAAS,IAAI;EACb,YAAY,IAAI;EAChB,UAAU,IAAI;EACd,MAAM,IAAI;EACV,UAAU,IAAI;EACd,YAAY,IAAI;EAChB,WAAW,IAAI;EACf,SAAS,IAAI;EACb,aAAa,IAAI;EACjB,WAAW,IAAI;EACf,SAAS,IAAI;EACb,WAAW,IAAI;EACf,WAAW,IAAI;EACf,IAAI;EACJ,MAAM,WAAW,IAAI,MAAM,IAAI,KAAK;EACrC;;;;;;;;AASH,MAAa,OAAO,MAAM;CACxB,MAAM;EACJ,OAAO,EAAE,MACP,EAAE,OAAO,EAAE,cAAcA,eAAO,GAAG,kBAAkB,EAAE,CAAC,EACxD,EAAE,OAAO,EAAE,SAASA,eAAO,GAAG,QAAQ,EAAE,CAAC,CAC1C;EACD,gBAAgB;EACjB;CACD,SAAS,WAAW,wBAAwB;CAC5C,SAAS,OAAO,KAAK,EAAE,OAAO,qBAAqB;AACjD,MAAI,kBAAkB,OAAO;GAC3B,MAAMC,WAAS,MAAM,UAAU,IAAI,IAAID,eAAO,CAC3C,MAAM,sBAAsB,CAC5B,UAAU,gBAAgB,QACzB,IAAI,GAAG,cAAc,aAAa,CAAC,GAAG,YAAY,MAAM,aAAa,CACtE,CACA,MAAM,OAAO,CACb,SAAS,eAAe;AAC3B,UAAO;IAAE,GAAGC;IAAQ,MAAMA,SAAO,KAAK,IAAI,iBAAiB;IAAE;;EAE/D,MAAM,SAAS,MAAM,UAAU,IAAI,IAAID,eAAO,CAC3C,MAAM,sBAAsB,CAC5B,UAAU,gBAAgB,QACzB,IAAI,GAAG,cAAc,QAAQ,CAAC,GAAG,YAAY,MAAM,QAAQ,CAC5D,CACA,MAAM,OAAO,CACb,SAAS,eAAe;AAC3B,SAAO;GAAE,GAAG;GAAQ,MAAM,OAAO,KAAK,IAAI,iBAAiB;GAAE;;CAEhE,CAAC"}
@@ -1,4 +1,4 @@
1
- import * as convex_server210 from "convex/server";
1
+ import * as convex_server189 from "convex/server";
2
2
 
3
3
  //#region src/component/connection/cache.d.ts
4
4
  declare namespace cache_d_exports {
@@ -27,7 +27,7 @@ declare namespace cache_d_exports {
27
27
  /**
28
28
  * Read-through fetch for OIDC discovery JSON. Cached 1h per URL.
29
29
  */
30
- declare const oidcDiscovery: convex_server210.RegisteredAction<"public", {
30
+ declare const oidcDiscovery: convex_server189.RegisteredAction<"public", {
31
31
  runtimeOrigin?: string | undefined;
32
32
  externalHost?: string | undefined;
33
33
  url: string;
@@ -45,7 +45,7 @@ declare const oidcDiscovery: convex_server210.RegisteredAction<"public", {
45
45
  * Cached 2h per URL (separate from the runtime sign-in path so admin
46
46
  * dashboards don't share keys with hot-path traffic).
47
47
  */
48
- declare const oidcStatusDiscovery: convex_server210.RegisteredAction<"public", {
48
+ declare const oidcStatusDiscovery: convex_server189.RegisteredAction<"public", {
49
49
  runtimeOrigin?: string | undefined;
50
50
  externalHost?: string | undefined;
51
51
  url: string;
@@ -61,19 +61,19 @@ declare const oidcStatusDiscovery: convex_server210.RegisteredAction<"public", {
61
61
  /**
62
62
  * Read-through fetch for SAML IdP metadata XML. Cached 24h per URL.
63
63
  */
64
- declare const samlMetadata: convex_server210.RegisteredAction<"public", {
64
+ declare const samlMetadata: convex_server189.RegisteredAction<"public", {
65
65
  runtimeOrigin?: string | undefined;
66
66
  externalHost?: string | undefined;
67
67
  url: string;
68
68
  }, Promise<string>>;
69
69
  /** Invalidate a cached OIDC discovery entry (e.g. on `discoveryUrl` update). */
70
- declare const invalidateOidcDiscovery: convex_server210.RegisteredMutation<"public", {
70
+ declare const invalidateOidcDiscovery: convex_server189.RegisteredMutation<"public", {
71
71
  runtimeOrigin?: string | undefined;
72
72
  externalHost?: string | undefined;
73
73
  url: string;
74
74
  }, Promise<null>>;
75
75
  /** Invalidate a cached SAML metadata entry (e.g. on `metadataUrl` update). */
76
- declare const invalidateSamlMetadata: convex_server210.RegisteredMutation<"public", {
76
+ declare const invalidateSamlMetadata: convex_server189.RegisteredMutation<"public", {
77
77
  runtimeOrigin?: string | undefined;
78
78
  externalHost?: string | undefined;
79
79
  url: string;
@@ -1,7 +1,6 @@
1
1
  import { assertSafeIdpFetchUrl, assertSafeIdpHost } from "../../shared/fetch/guard.js";
2
2
  import { components, internal } from "../_generated/api.js";
3
3
  import { action, internalAction, mutation } from "../_generated/server.js";
4
- import "../functions.js";
5
4
  import { v } from "convex/values";
6
5
  import { ActionCache } from "@convex-dev/action-cache";
7
6
 
@@ -1 +1 @@
1
- {"version":3,"file":"cache.js","names":[],"sources":["../../../src/component/connection/cache.ts"],"sourcesContent":["/**\n * `component.connection.cache.*` — read-through cache for external Connection\n * HTTP fetches (OIDC discovery, SAML metadata, OIDC status validation).\n *\n * Each cache wraps an `internalAction` that performs the fetch on miss.\n * The cache key is `(name, args)` where `args` is the URL (plus optional\n * proxy hints). Cache entries persist in the action-cache component's\n * tables, so concurrent / sequential requests for the same URL share\n * results.\n *\n * Direct callers go through the exposed `*Discovery`, `*Metadata`,\n * `*StatusDiscovery` actions which are thin wrappers over the cache's\n * `.fetch()` method. Server-side code at `server/connection/` invokes these via\n * `ctx.runAction(components.auth.connection.cache.X, args)`.\n *\n * To invalidate (e.g. when an admin updates `discoveryUrl` or\n * `metadataUrl`), call the matching `invalidate*` mutation.\n *\n * @module\n */\n\nimport { ActionCache } from \"@convex-dev/action-cache\";\nimport type { FunctionReference } from \"convex/server\";\nimport { v, type Infer } from \"convex/values\";\n\nimport { components, internal } from \"../_generated/api\";\nimport { action, internalAction, mutation } from \"../functions\";\nimport { assertSafeIdpFetchUrl, assertSafeIdpHost } from \"../../shared/fetch/guard\";\n\n/**\n * One isolated typed bridge across `ActionCache.fetch`'s ctx boundary. An\n * `action` handler's ctx supplies `runQuery`/`runMutation`/`runAction`, but over\n * this component's concrete DataModel, which TS treats as incompatible with the\n * action-cache's `GenericDataModel` under invariance — so the two cannot be\n * unified positively. Each caller infers the exact target from the `.fetch`\n * parameter, so results stay precisely typed.\n */\nfunction asActionCacheCtx<T>(ctx: object): T {\n return ctx as T;\n}\n\nconst fetchUrlArgs = {\n /** Absolute URL to fetch. */\n url: v.string(),\n /**\n * Optional proxy-mode origin. When set, the request is sent to\n * `runtimeOrigin + url.pathname + url.search` instead of `url.origin`.\n * Used by self-hosted Convex deployments fronting an external IdP via\n * an internal hostname.\n */\n runtimeOrigin: v.optional(v.string()),\n /** Optional `Host` header value (paired with `runtimeOrigin`). */\n externalHost: v.optional(v.string()),\n};\n\nconst vFetchUrlArgs = v.object(fetchUrlArgs);\n\nconst vOidcDiscovery = v.object({\n issuer: v.string(),\n authorization_endpoint: v.string(),\n token_endpoint: v.string(),\n jwks_uri: v.string(),\n userinfo_endpoint: v.optional(v.string()),\n token_endpoint_auth_methods_supported: v.optional(v.array(v.string())),\n id_token_signing_alg_values_supported: v.optional(v.array(v.string())),\n});\n\ntype FetchUrlArgs = Infer<typeof vFetchUrlArgs>;\n\ntype OidcDiscovery = Infer<typeof vOidcDiscovery>;\n\ntype OidcDiscoveryAction = FunctionReference<\n \"action\",\n \"internal\",\n FetchUrlArgs,\n OidcDiscovery,\n string | undefined\n>;\n\ntype TextAction = FunctionReference<\"action\", \"internal\", FetchUrlArgs, string, string | undefined>;\n\ntype RequestTarget = { url: URL; headers: Headers };\n\nconst requestOidcDiscoveryRef = internal.connection.cache\n .requestOidcDiscovery as OidcDiscoveryAction;\nconst requestTextRef = internal.connection.cache.requestText as TextAction;\n\nfunction normalizeOidcDiscovery(data: unknown): OidcDiscovery {\n if (typeof data !== \"object\" || data === null) {\n throw new Error(\"OIDC discovery response is not an object.\");\n }\n const source = data as Record<string, unknown>;\n if (typeof source.issuer !== \"string\") {\n throw new Error(\"OIDC discovery is missing 'issuer'.\");\n }\n if (typeof source.authorization_endpoint !== \"string\") {\n throw new Error(\"OIDC discovery is missing 'authorization_endpoint'.\");\n }\n if (typeof source.token_endpoint !== \"string\") {\n throw new Error(\"OIDC discovery is missing 'token_endpoint'.\");\n }\n if (typeof source.jwks_uri !== \"string\") {\n throw new Error(\"OIDC discovery is missing 'jwks_uri'.\");\n }\n return {\n issuer: source.issuer,\n authorization_endpoint: source.authorization_endpoint,\n token_endpoint: source.token_endpoint,\n jwks_uri: source.jwks_uri,\n userinfo_endpoint:\n typeof source.userinfo_endpoint === \"string\" ? source.userinfo_endpoint : undefined,\n token_endpoint_auth_methods_supported: Array.isArray(\n source.token_endpoint_auth_methods_supported,\n )\n ? source.token_endpoint_auth_methods_supported.filter(\n (value): value is string => typeof value === \"string\",\n )\n : undefined,\n id_token_signing_alg_values_supported: Array.isArray(\n source.id_token_signing_alg_values_supported,\n )\n ? source.id_token_signing_alg_values_supported.filter(\n (value): value is string => typeof value === \"string\",\n )\n : undefined,\n };\n}\n\nfunction normalizeRuntimeOrigin(runtimeOrigin: string | undefined): string | undefined {\n if (runtimeOrigin === undefined) {\n return undefined;\n }\n let parsed: URL;\n try {\n parsed = new URL(runtimeOrigin);\n } catch {\n throw new Error(\"runtimeOrigin must be a valid absolute URL.\");\n }\n if (\n parsed.username !== \"\" ||\n parsed.password !== \"\" ||\n parsed.pathname !== \"/\" ||\n parsed.search !== \"\" ||\n parsed.hash !== \"\"\n ) {\n throw new Error(\"runtimeOrigin must be an origin with no path, query, hash, or credentials.\");\n }\n assertSafeIdpFetchUrl(parsed.origin);\n return parsed.origin;\n}\n\nfunction validateExternalHost(externalHost: string | undefined, runtimeOrigin: string | undefined) {\n if (externalHost === undefined) {\n return;\n }\n if (runtimeOrigin === undefined) {\n throw new Error(\"externalHost requires runtimeOrigin.\");\n }\n assertSafeIdpHost(externalHost);\n}\n\nconst buildRequestUrl = (\n url: string,\n runtimeOrigin: string | undefined,\n externalHost: string | undefined,\n): RequestTarget => {\n assertSafeIdpFetchUrl(url);\n const normalizedRuntimeOrigin = normalizeRuntimeOrigin(runtimeOrigin);\n validateExternalHost(externalHost, normalizedRuntimeOrigin);\n const parsed = new URL(url);\n const rewritten =\n normalizedRuntimeOrigin !== undefined && parsed.origin !== normalizedRuntimeOrigin\n ? new URL(`${normalizedRuntimeOrigin}${parsed.pathname}${parsed.search}`)\n : parsed;\n assertSafeIdpFetchUrl(rewritten.toString());\n const headers = new Headers();\n if (normalizedRuntimeOrigin !== undefined && externalHost !== undefined) {\n headers.set(\"host\", externalHost);\n }\n return { url: rewritten, headers };\n};\n\n/** Request an OIDC discovery URL and return the normalized fields used by auth. @internal */\nexport const requestOidcDiscovery = internalAction({\n args: fetchUrlArgs,\n returns: vOidcDiscovery,\n handler: async (_ctx, { url, runtimeOrigin, externalHost }) => {\n const req = buildRequestUrl(url, runtimeOrigin, externalHost);\n const response = await fetch(req.url, {\n headers: req.headers,\n redirect: \"manual\",\n signal: AbortSignal.timeout(10_000),\n });\n if (!response.ok) {\n throw new Error(`HTTP ${response.status} fetching ${url}`);\n }\n return normalizeOidcDiscovery(await response.json());\n },\n});\n\n/** Request a URL and return the response body as text. @internal */\nexport const requestText = internalAction({\n args: fetchUrlArgs,\n returns: v.string(),\n handler: async (_ctx, { url, runtimeOrigin, externalHost }) => {\n const req = buildRequestUrl(url, runtimeOrigin, externalHost);\n const response = await fetch(req.url, {\n headers: req.headers,\n redirect: \"manual\",\n signal: AbortSignal.timeout(15_000),\n });\n if (!response.ok) {\n throw new Error(`HTTP ${response.status} fetching ${url}`);\n }\n return await response.text();\n },\n});\n\nconst ONE_HOUR = 60 * 60 * 1000;\nconst TWO_HOURS = 2 * ONE_HOUR;\nconst ONE_DAY = 24 * ONE_HOUR;\n\nconst oidcDiscoveryCache = new ActionCache(components.connectionFetchCache, {\n action: requestOidcDiscoveryRef,\n name: \"oidcDiscovery\",\n ttl: ONE_HOUR,\n});\n\nconst oidcStatusDiscoveryCache = new ActionCache(components.connectionFetchCache, {\n action: requestOidcDiscoveryRef,\n name: \"oidcStatusDiscovery\",\n ttl: TWO_HOURS,\n});\n\nconst samlMetadataCache = new ActionCache(components.connectionFetchCache, {\n action: requestTextRef,\n name: \"samlMetadata\",\n ttl: ONE_DAY,\n});\n\n/**\n * Read-through fetch for OIDC discovery JSON. Cached 1h per URL.\n */\nexport const oidcDiscovery = action({\n args: fetchUrlArgs,\n returns: vOidcDiscovery,\n handler: async (ctx, args) => {\n return await oidcDiscoveryCache.fetch(asActionCacheCtx(ctx), args);\n },\n});\n\n/**\n * Read-through fetch for OIDC discovery during admin status validation.\n * Cached 2h per URL (separate from the runtime sign-in path so admin\n * dashboards don't share keys with hot-path traffic).\n */\nexport const oidcStatusDiscovery = action({\n args: fetchUrlArgs,\n returns: vOidcDiscovery,\n handler: async (ctx, args) => {\n return await oidcStatusDiscoveryCache.fetch(asActionCacheCtx(ctx), args);\n },\n});\n\n/**\n * Read-through fetch for SAML IdP metadata XML. Cached 24h per URL.\n */\nexport const samlMetadata = action({\n args: fetchUrlArgs,\n returns: v.string(),\n handler: async (ctx, args) => {\n return await samlMetadataCache.fetch(asActionCacheCtx(ctx), args);\n },\n});\n\n/** Invalidate a cached OIDC discovery entry (e.g. on `discoveryUrl` update). */\nexport const invalidateOidcDiscovery = mutation({\n args: fetchUrlArgs,\n returns: v.null(),\n handler: async (ctx, args) => {\n await oidcDiscoveryCache.remove(ctx, args);\n await oidcStatusDiscoveryCache.remove(ctx, args);\n return null;\n },\n});\n\n/** Invalidate a cached SAML metadata entry (e.g. on `metadataUrl` update). */\nexport const invalidateSamlMetadata = mutation({\n args: fetchUrlArgs,\n returns: v.null(),\n handler: async (ctx, args) => {\n await samlMetadataCache.remove(ctx, args);\n return null;\n },\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"cache.js","names":[],"sources":["../../../src/component/connection/cache.ts"],"sourcesContent":["/**\n * `component.connection.cache.*` — read-through cache for external Connection\n * HTTP fetches (OIDC discovery, SAML metadata, OIDC status validation).\n *\n * Each cache wraps an `internalAction` that performs the fetch on miss.\n * The cache key is `(name, args)` where `args` is the URL (plus optional\n * proxy hints). Cache entries persist in the action-cache component's\n * tables, so concurrent / sequential requests for the same URL share\n * results.\n *\n * Direct callers go through the exposed `*Discovery`, `*Metadata`,\n * `*StatusDiscovery` actions which are thin wrappers over the cache's\n * `.fetch()` method. Server-side code at `server/connection/` invokes these via\n * `ctx.runAction(components.auth.connection.cache.X, args)`.\n *\n * To invalidate (e.g. when an admin updates `discoveryUrl` or\n * `metadataUrl`), call the matching `invalidate*` mutation.\n *\n * @module\n */\n\nimport { ActionCache } from \"@convex-dev/action-cache\";\nimport type { FunctionReference } from \"convex/server\";\nimport { v, type Infer } from \"convex/values\";\n\nimport { components, internal } from \"../_generated/api\";\nimport { action, internalAction, mutation } from \"../_generated/server\";\nimport { assertSafeIdpFetchUrl, assertSafeIdpHost } from \"../../shared/fetch/guard\";\n\n/**\n * One isolated typed bridge across `ActionCache.fetch`'s ctx boundary. An\n * `action` handler's ctx supplies `runQuery`/`runMutation`/`runAction`, but over\n * this component's concrete DataModel, which TS treats as incompatible with the\n * action-cache's `GenericDataModel` under invariance — so the two cannot be\n * unified positively. Each caller infers the exact target from the `.fetch`\n * parameter, so results stay precisely typed.\n */\nfunction asActionCacheCtx<T>(ctx: object): T {\n return ctx as T;\n}\n\nconst fetchUrlArgs = {\n /** Absolute URL to fetch. */\n url: v.string(),\n /**\n * Optional proxy-mode origin. When set, the request is sent to\n * `runtimeOrigin + url.pathname + url.search` instead of `url.origin`.\n * Used by self-hosted Convex deployments fronting an external IdP via\n * an internal hostname.\n */\n runtimeOrigin: v.optional(v.string()),\n /** Optional `Host` header value (paired with `runtimeOrigin`). */\n externalHost: v.optional(v.string()),\n};\n\nconst vFetchUrlArgs = v.object(fetchUrlArgs);\n\nconst vOidcDiscovery = v.object({\n issuer: v.string(),\n authorization_endpoint: v.string(),\n token_endpoint: v.string(),\n jwks_uri: v.string(),\n userinfo_endpoint: v.optional(v.string()),\n token_endpoint_auth_methods_supported: v.optional(v.array(v.string())),\n id_token_signing_alg_values_supported: v.optional(v.array(v.string())),\n});\n\ntype FetchUrlArgs = Infer<typeof vFetchUrlArgs>;\n\ntype OidcDiscovery = Infer<typeof vOidcDiscovery>;\n\ntype OidcDiscoveryAction = FunctionReference<\n \"action\",\n \"internal\",\n FetchUrlArgs,\n OidcDiscovery,\n string | undefined\n>;\n\ntype TextAction = FunctionReference<\"action\", \"internal\", FetchUrlArgs, string, string | undefined>;\n\ntype RequestTarget = { url: URL; headers: Headers };\n\nconst requestOidcDiscoveryRef = internal.connection.cache\n .requestOidcDiscovery as OidcDiscoveryAction;\nconst requestTextRef = internal.connection.cache.requestText as TextAction;\n\nfunction normalizeOidcDiscovery(data: unknown): OidcDiscovery {\n if (typeof data !== \"object\" || data === null) {\n throw new Error(\"OIDC discovery response is not an object.\");\n }\n const source = data as Record<string, unknown>;\n if (typeof source.issuer !== \"string\") {\n throw new Error(\"OIDC discovery is missing 'issuer'.\");\n }\n if (typeof source.authorization_endpoint !== \"string\") {\n throw new Error(\"OIDC discovery is missing 'authorization_endpoint'.\");\n }\n if (typeof source.token_endpoint !== \"string\") {\n throw new Error(\"OIDC discovery is missing 'token_endpoint'.\");\n }\n if (typeof source.jwks_uri !== \"string\") {\n throw new Error(\"OIDC discovery is missing 'jwks_uri'.\");\n }\n return {\n issuer: source.issuer,\n authorization_endpoint: source.authorization_endpoint,\n token_endpoint: source.token_endpoint,\n jwks_uri: source.jwks_uri,\n userinfo_endpoint:\n typeof source.userinfo_endpoint === \"string\" ? source.userinfo_endpoint : undefined,\n token_endpoint_auth_methods_supported: Array.isArray(\n source.token_endpoint_auth_methods_supported,\n )\n ? source.token_endpoint_auth_methods_supported.filter(\n (value): value is string => typeof value === \"string\",\n )\n : undefined,\n id_token_signing_alg_values_supported: Array.isArray(\n source.id_token_signing_alg_values_supported,\n )\n ? source.id_token_signing_alg_values_supported.filter(\n (value): value is string => typeof value === \"string\",\n )\n : undefined,\n };\n}\n\nfunction normalizeRuntimeOrigin(runtimeOrigin: string | undefined): string | undefined {\n if (runtimeOrigin === undefined) {\n return undefined;\n }\n let parsed: URL;\n try {\n parsed = new URL(runtimeOrigin);\n } catch {\n throw new Error(\"runtimeOrigin must be a valid absolute URL.\");\n }\n if (\n parsed.username !== \"\" ||\n parsed.password !== \"\" ||\n parsed.pathname !== \"/\" ||\n parsed.search !== \"\" ||\n parsed.hash !== \"\"\n ) {\n throw new Error(\"runtimeOrigin must be an origin with no path, query, hash, or credentials.\");\n }\n assertSafeIdpFetchUrl(parsed.origin);\n return parsed.origin;\n}\n\nfunction validateExternalHost(externalHost: string | undefined, runtimeOrigin: string | undefined) {\n if (externalHost === undefined) {\n return;\n }\n if (runtimeOrigin === undefined) {\n throw new Error(\"externalHost requires runtimeOrigin.\");\n }\n assertSafeIdpHost(externalHost);\n}\n\nconst buildRequestUrl = (\n url: string,\n runtimeOrigin: string | undefined,\n externalHost: string | undefined,\n): RequestTarget => {\n assertSafeIdpFetchUrl(url);\n const normalizedRuntimeOrigin = normalizeRuntimeOrigin(runtimeOrigin);\n validateExternalHost(externalHost, normalizedRuntimeOrigin);\n const parsed = new URL(url);\n const rewritten =\n normalizedRuntimeOrigin !== undefined && parsed.origin !== normalizedRuntimeOrigin\n ? new URL(`${normalizedRuntimeOrigin}${parsed.pathname}${parsed.search}`)\n : parsed;\n assertSafeIdpFetchUrl(rewritten.toString());\n const headers = new Headers();\n if (normalizedRuntimeOrigin !== undefined && externalHost !== undefined) {\n headers.set(\"host\", externalHost);\n }\n return { url: rewritten, headers };\n};\n\n/** Request an OIDC discovery URL and return the normalized fields used by auth. @internal */\nexport const requestOidcDiscovery = internalAction({\n args: fetchUrlArgs,\n returns: vOidcDiscovery,\n handler: async (_ctx, { url, runtimeOrigin, externalHost }) => {\n const req = buildRequestUrl(url, runtimeOrigin, externalHost);\n const response = await fetch(req.url, {\n headers: req.headers,\n redirect: \"manual\",\n signal: AbortSignal.timeout(10_000),\n });\n if (!response.ok) {\n throw new Error(`HTTP ${response.status} fetching ${url}`);\n }\n return normalizeOidcDiscovery(await response.json());\n },\n});\n\n/** Request a URL and return the response body as text. @internal */\nexport const requestText = internalAction({\n args: fetchUrlArgs,\n returns: v.string(),\n handler: async (_ctx, { url, runtimeOrigin, externalHost }) => {\n const req = buildRequestUrl(url, runtimeOrigin, externalHost);\n const response = await fetch(req.url, {\n headers: req.headers,\n redirect: \"manual\",\n signal: AbortSignal.timeout(15_000),\n });\n if (!response.ok) {\n throw new Error(`HTTP ${response.status} fetching ${url}`);\n }\n return await response.text();\n },\n});\n\nconst ONE_HOUR = 60 * 60 * 1000;\nconst TWO_HOURS = 2 * ONE_HOUR;\nconst ONE_DAY = 24 * ONE_HOUR;\n\nconst oidcDiscoveryCache = new ActionCache(components.connectionFetchCache, {\n action: requestOidcDiscoveryRef,\n name: \"oidcDiscovery\",\n ttl: ONE_HOUR,\n});\n\nconst oidcStatusDiscoveryCache = new ActionCache(components.connectionFetchCache, {\n action: requestOidcDiscoveryRef,\n name: \"oidcStatusDiscovery\",\n ttl: TWO_HOURS,\n});\n\nconst samlMetadataCache = new ActionCache(components.connectionFetchCache, {\n action: requestTextRef,\n name: \"samlMetadata\",\n ttl: ONE_DAY,\n});\n\n/**\n * Read-through fetch for OIDC discovery JSON. Cached 1h per URL.\n */\nexport const oidcDiscovery = action({\n args: fetchUrlArgs,\n returns: vOidcDiscovery,\n handler: async (ctx, args) => {\n return await oidcDiscoveryCache.fetch(asActionCacheCtx(ctx), args);\n },\n});\n\n/**\n * Read-through fetch for OIDC discovery during admin status validation.\n * Cached 2h per URL (separate from the runtime sign-in path so admin\n * dashboards don't share keys with hot-path traffic).\n */\nexport const oidcStatusDiscovery = action({\n args: fetchUrlArgs,\n returns: vOidcDiscovery,\n handler: async (ctx, args) => {\n return await oidcStatusDiscoveryCache.fetch(asActionCacheCtx(ctx), args);\n },\n});\n\n/**\n * Read-through fetch for SAML IdP metadata XML. Cached 24h per URL.\n */\nexport const samlMetadata = action({\n args: fetchUrlArgs,\n returns: v.string(),\n handler: async (ctx, args) => {\n return await samlMetadataCache.fetch(asActionCacheCtx(ctx), args);\n },\n});\n\n/** Invalidate a cached OIDC discovery entry (e.g. on `discoveryUrl` update). */\nexport const invalidateOidcDiscovery = mutation({\n args: fetchUrlArgs,\n returns: v.null(),\n handler: async (ctx, args) => {\n await oidcDiscoveryCache.remove(ctx, args);\n await oidcStatusDiscoveryCache.remove(ctx, args);\n return null;\n },\n});\n\n/** Invalidate a cached SAML metadata entry (e.g. on `metadataUrl` update). */\nexport const invalidateSamlMetadata = mutation({\n args: fetchUrlArgs,\n returns: v.null(),\n handler: async (ctx, args) => {\n await samlMetadataCache.remove(ctx, args);\n return null;\n },\n});\n"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- import * as convex_values2797 from "convex/values";
2
- import * as convex_server193 from "convex/server";
1
+ import * as convex_values1833 from "convex/values";
2
+ import * as convex_server169 from "convex/server";
3
3
 
4
4
  //#region src/component/connection/domain/verification.d.ts
5
5
  declare namespace verification_d_exports {
@@ -12,36 +12,36 @@ declare namespace verification_d_exports {
12
12
  * @module
13
13
  */
14
14
  /** Read a domain's verification record by `domainId`, or `null` if none. */
15
- declare const get: convex_server193.RegisteredQuery<"public", {
16
- domainId: convex_values2797.GenericId<"GroupConnectionDomain">;
15
+ declare const get: convex_server169.RegisteredQuery<"public", {
16
+ domainId: convex_values1833.GenericId<"GroupConnectionDomain">;
17
17
  }, Promise<{
18
- _id: convex_values2797.GenericId<"GroupConnectionDomainVerification">;
18
+ _id: convex_values1833.GenericId<"GroupConnectionDomainVerification">;
19
19
  _creationTime: number;
20
- connectionId: convex_values2797.GenericId<"GroupConnection">;
21
- expiresAt: number;
22
- groupId: convex_values2797.GenericId<"Group">;
23
- tokenHash: string;
20
+ connectionId: convex_values1833.GenericId<"GroupConnection">;
24
21
  domain: string;
25
- domainId: convex_values2797.GenericId<"GroupConnectionDomain">;
26
22
  recordName: string;
23
+ expiresAt: number;
24
+ groupId: convex_values1833.GenericId<"Group">;
25
+ tokenHash: string;
26
+ domainId: convex_values1833.GenericId<"GroupConnectionDomain">;
27
27
  token: string;
28
28
  requestedAt: number;
29
29
  } | null>>;
30
30
  /** Insert a verification record, or patch it when one already exists for the domain (keyed by `domainId`). */
31
- declare const upsert: convex_server193.RegisteredMutation<"public", {
32
- connectionId: convex_values2797.GenericId<"GroupConnection">;
33
- expiresAt: number;
34
- groupId: convex_values2797.GenericId<"Group">;
35
- tokenHash: string;
31
+ declare const upsert: convex_server169.RegisteredMutation<"public", {
32
+ connectionId: convex_values1833.GenericId<"GroupConnection">;
36
33
  domain: string;
37
- domainId: convex_values2797.GenericId<"GroupConnectionDomain">;
38
34
  recordName: string;
35
+ expiresAt: number;
36
+ groupId: convex_values1833.GenericId<"Group">;
37
+ tokenHash: string;
38
+ domainId: convex_values1833.GenericId<"GroupConnectionDomain">;
39
39
  token: string;
40
40
  requestedAt: number;
41
- }, Promise<convex_values2797.GenericId<"GroupConnectionDomainVerification">>>;
41
+ }, Promise<convex_values1833.GenericId<"GroupConnectionDomainVerification">>>;
42
42
  /** Delete a domain's verification record, if any. */
43
- declare const remove: convex_server193.RegisteredMutation<"public", {
44
- domainId: convex_values2797.GenericId<"GroupConnectionDomain">;
43
+ declare const remove: convex_server169.RegisteredMutation<"public", {
44
+ domainId: convex_values1833.GenericId<"GroupConnectionDomain">;
45
45
  }, Promise<null>>;
46
46
  //#endregion
47
47
  export { verification_d_exports };
@@ -1,6 +1,5 @@
1
- import { vGroupConnectionDomainVerificationDoc } from "../../model.js";
2
1
  import { mutation, query } from "../../_generated/server.js";
3
- import "../../functions.js";
2
+ import { vGroupConnectionDomainVerificationDoc } from "../../documents.js";
4
3
  import { v } from "convex/values";
5
4
 
6
5
  //#region src/component/connection/domain/verification.ts
@@ -1 +1 @@
1
- {"version":3,"file":"verification.js","names":[],"sources":["../../../../src/component/connection/domain/verification.ts"],"sourcesContent":["/**\n * `component.connection.domain.verification.*` — domain\n * ownership-proof records (sub-resource of connection.domain).\n *\n * @module\n */\n\nimport { v } from \"convex/values\";\n\nimport { mutation, query } from \"../../functions\";\nimport { vGroupConnectionDomainVerificationDoc } from \"../../model\";\n\n/** Read a domain's verification record by `domainId`, or `null` if none. */\nexport const get = query({\n args: { domainId: v.id(\"GroupConnectionDomain\") },\n returns: v.union(vGroupConnectionDomainVerificationDoc, v.null()),\n handler: async (ctx, { domainId }) => {\n return await ctx.db\n .query(\"GroupConnectionDomainVerification\")\n .withIndex(\"domain_id\", (idx) => idx.eq(\"domainId\", domainId))\n .first();\n },\n});\n\n/** Insert a verification record, or patch it when one already exists for the domain (keyed by `domainId`). */\nexport const upsert = mutation({\n args: {\n connectionId: v.id(\"GroupConnection\"),\n groupId: v.id(\"Group\"),\n domainId: v.id(\"GroupConnectionDomain\"),\n domain: v.string(),\n recordName: v.string(),\n token: v.string(),\n tokenHash: v.string(),\n requestedAt: v.number(),\n expiresAt: v.number(),\n },\n returns: v.id(\"GroupConnectionDomainVerification\"),\n handler: async (ctx, args) => {\n const { connectionId, ...rest } = args;\n const existing = await ctx.db\n .query(\"GroupConnectionDomainVerification\")\n .withIndex(\"domain_id\", (idx) => idx.eq(\"domainId\", args.domainId))\n .first();\n if (existing) {\n await ctx.db.patch(\"GroupConnectionDomainVerification\", existing._id, {\n connectionId: connectionId,\n ...rest,\n });\n return existing._id;\n }\n return await ctx.db.insert(\"GroupConnectionDomainVerification\", {\n connectionId: connectionId,\n ...rest,\n });\n },\n});\n\n/** Delete a domain's verification record, if any. */\nconst remove = mutation({\n args: { domainId: v.id(\"GroupConnectionDomain\") },\n returns: v.null(),\n handler: async (ctx, { domainId }) => {\n const existing = await ctx.db\n .query(\"GroupConnectionDomainVerification\")\n .withIndex(\"domain_id\", (idx) => idx.eq(\"domainId\", domainId))\n .first();\n if (existing) {\n await ctx.db.delete(\"GroupConnectionDomainVerification\", existing._id);\n }\n return null;\n },\n});\n\nexport { remove };\n"],"mappings":";;;;;;;;;;;;;AAaA,MAAa,MAAM,MAAM;CACvB,MAAM,EAAE,UAAU,EAAE,GAAG,wBAAwB,EAAE;CACjD,SAAS,EAAE,MAAM,uCAAuC,EAAE,MAAM,CAAC;CACjE,SAAS,OAAO,KAAK,EAAE,eAAe;AACpC,SAAO,MAAM,IAAI,GACd,MAAM,oCAAoC,CAC1C,UAAU,cAAc,QAAQ,IAAI,GAAG,YAAY,SAAS,CAAC,CAC7D,OAAO;;CAEb,CAAC;;AAGF,MAAa,SAAS,SAAS;CAC7B,MAAM;EACJ,cAAc,EAAE,GAAG,kBAAkB;EACrC,SAAS,EAAE,GAAG,QAAQ;EACtB,UAAU,EAAE,GAAG,wBAAwB;EACvC,QAAQ,EAAE,QAAQ;EAClB,YAAY,EAAE,QAAQ;EACtB,OAAO,EAAE,QAAQ;EACjB,WAAW,EAAE,QAAQ;EACrB,aAAa,EAAE,QAAQ;EACvB,WAAW,EAAE,QAAQ;EACtB;CACD,SAAS,EAAE,GAAG,oCAAoC;CAClD,SAAS,OAAO,KAAK,SAAS;EAC5B,MAAM,EAAE,cAAc,GAAG,SAAS;EAClC,MAAM,WAAW,MAAM,IAAI,GACxB,MAAM,oCAAoC,CAC1C,UAAU,cAAc,QAAQ,IAAI,GAAG,YAAY,KAAK,SAAS,CAAC,CAClE,OAAO;AACV,MAAI,UAAU;AACZ,SAAM,IAAI,GAAG,MAAM,qCAAqC,SAAS,KAAK;IACtD;IACd,GAAG;IACJ,CAAC;AACF,UAAO,SAAS;;AAElB,SAAO,MAAM,IAAI,GAAG,OAAO,qCAAqC;GAChD;GACd,GAAG;GACJ,CAAC;;CAEL,CAAC;;AAGF,MAAM,SAAS,SAAS;CACtB,MAAM,EAAE,UAAU,EAAE,GAAG,wBAAwB,EAAE;CACjD,SAAS,EAAE,MAAM;CACjB,SAAS,OAAO,KAAK,EAAE,eAAe;EACpC,MAAM,WAAW,MAAM,IAAI,GACxB,MAAM,oCAAoC,CAC1C,UAAU,cAAc,QAAQ,IAAI,GAAG,YAAY,SAAS,CAAC,CAC7D,OAAO;AACV,MAAI,SACF,OAAM,IAAI,GAAG,OAAO,qCAAqC,SAAS,IAAI;AAExE,SAAO;;CAEV,CAAC"}
1
+ {"version":3,"file":"verification.js","names":[],"sources":["../../../../src/component/connection/domain/verification.ts"],"sourcesContent":["/**\n * `component.connection.domain.verification.*` — domain\n * ownership-proof records (sub-resource of connection.domain).\n *\n * @module\n */\n\nimport { v } from \"convex/values\";\n\nimport { mutation, query } from \"../../_generated/server\";\nimport { vGroupConnectionDomainVerificationDoc } from \"../../documents\";\n\n/** Read a domain's verification record by `domainId`, or `null` if none. */\nexport const get = query({\n args: { domainId: v.id(\"GroupConnectionDomain\") },\n returns: v.union(vGroupConnectionDomainVerificationDoc, v.null()),\n handler: async (ctx, { domainId }) => {\n return await ctx.db\n .query(\"GroupConnectionDomainVerification\")\n .withIndex(\"domain_id\", (idx) => idx.eq(\"domainId\", domainId))\n .first();\n },\n});\n\n/** Insert a verification record, or patch it when one already exists for the domain (keyed by `domainId`). */\nexport const upsert = mutation({\n args: {\n connectionId: v.id(\"GroupConnection\"),\n groupId: v.id(\"Group\"),\n domainId: v.id(\"GroupConnectionDomain\"),\n domain: v.string(),\n recordName: v.string(),\n token: v.string(),\n tokenHash: v.string(),\n requestedAt: v.number(),\n expiresAt: v.number(),\n },\n returns: v.id(\"GroupConnectionDomainVerification\"),\n handler: async (ctx, args) => {\n const { connectionId, ...rest } = args;\n const existing = await ctx.db\n .query(\"GroupConnectionDomainVerification\")\n .withIndex(\"domain_id\", (idx) => idx.eq(\"domainId\", args.domainId))\n .first();\n if (existing) {\n await ctx.db.patch(\"GroupConnectionDomainVerification\", existing._id, {\n connectionId: connectionId,\n ...rest,\n });\n return existing._id;\n }\n return await ctx.db.insert(\"GroupConnectionDomainVerification\", {\n connectionId: connectionId,\n ...rest,\n });\n },\n});\n\n/** Delete a domain's verification record, if any. */\nconst remove = mutation({\n args: { domainId: v.id(\"GroupConnectionDomain\") },\n returns: v.null(),\n handler: async (ctx, { domainId }) => {\n const existing = await ctx.db\n .query(\"GroupConnectionDomainVerification\")\n .withIndex(\"domain_id\", (idx) => idx.eq(\"domainId\", domainId))\n .first();\n if (existing) {\n await ctx.db.delete(\"GroupConnectionDomainVerification\", existing._id);\n }\n return null;\n },\n});\n\nexport { remove };\n"],"mappings":";;;;;;;;;;;;AAaA,MAAa,MAAM,MAAM;CACvB,MAAM,EAAE,UAAU,EAAE,GAAG,wBAAwB,EAAE;CACjD,SAAS,EAAE,MAAM,uCAAuC,EAAE,MAAM,CAAC;CACjE,SAAS,OAAO,KAAK,EAAE,eAAe;AACpC,SAAO,MAAM,IAAI,GACd,MAAM,oCAAoC,CAC1C,UAAU,cAAc,QAAQ,IAAI,GAAG,YAAY,SAAS,CAAC,CAC7D,OAAO;;CAEb,CAAC;;AAGF,MAAa,SAAS,SAAS;CAC7B,MAAM;EACJ,cAAc,EAAE,GAAG,kBAAkB;EACrC,SAAS,EAAE,GAAG,QAAQ;EACtB,UAAU,EAAE,GAAG,wBAAwB;EACvC,QAAQ,EAAE,QAAQ;EAClB,YAAY,EAAE,QAAQ;EACtB,OAAO,EAAE,QAAQ;EACjB,WAAW,EAAE,QAAQ;EACrB,aAAa,EAAE,QAAQ;EACvB,WAAW,EAAE,QAAQ;EACtB;CACD,SAAS,EAAE,GAAG,oCAAoC;CAClD,SAAS,OAAO,KAAK,SAAS;EAC5B,MAAM,EAAE,cAAc,GAAG,SAAS;EAClC,MAAM,WAAW,MAAM,IAAI,GACxB,MAAM,oCAAoC,CAC1C,UAAU,cAAc,QAAQ,IAAI,GAAG,YAAY,KAAK,SAAS,CAAC,CAClE,OAAO;AACV,MAAI,UAAU;AACZ,SAAM,IAAI,GAAG,MAAM,qCAAqC,SAAS,KAAK;IACtD;IACd,GAAG;IACJ,CAAC;AACF,UAAO,SAAS;;AAElB,SAAO,MAAM,IAAI,GAAG,OAAO,qCAAqC;GAChD;GACd,GAAG;GACJ,CAAC;;CAEL,CAAC;;AAGF,MAAM,SAAS,SAAS;CACtB,MAAM,EAAE,UAAU,EAAE,GAAG,wBAAwB,EAAE;CACjD,SAAS,EAAE,MAAM;CACjB,SAAS,OAAO,KAAK,EAAE,eAAe;EACpC,MAAM,WAAW,MAAM,IAAI,GACxB,MAAM,oCAAoC,CAC1C,UAAU,cAAc,QAAQ,IAAI,GAAG,YAAY,SAAS,CAAC,CAC7D,OAAO;AACV,MAAI,SACF,OAAM,IAAI,GAAG,OAAO,qCAAqC,SAAS,IAAI;AAExE,SAAO;;CAEV,CAAC"}