@robelest/convex-auth 0.0.4-preview.18 → 0.0.4-preview.19

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 (541) hide show
  1. package/README.md +6 -3
  2. package/dist/authorization/index.d.ts +46 -0
  3. package/dist/authorization/index.d.ts.map +1 -1
  4. package/dist/authorization/index.js +46 -0
  5. package/dist/authorization/index.js.map +1 -1
  6. package/dist/bin.cjs +21 -13
  7. package/dist/client/core/types.d.ts +20 -0
  8. package/dist/client/core/types.d.ts.map +1 -0
  9. package/dist/client/index.d.ts +2 -16
  10. package/dist/client/index.d.ts.map +1 -1
  11. package/dist/client/index.js +67 -565
  12. package/dist/client/index.js.map +1 -1
  13. package/dist/component/_generated/api.d.ts +40 -12
  14. package/dist/component/_generated/api.d.ts.map +1 -1
  15. package/dist/component/_generated/api.js.map +1 -1
  16. package/dist/component/_generated/component.d.ts +1306 -1344
  17. package/dist/component/_generated/component.d.ts.map +1 -1
  18. package/dist/component/client/core/types.d.ts +2 -0
  19. package/dist/component/client/index.d.ts +2 -2
  20. package/dist/component/model.d.ts +80 -80
  21. package/dist/component/model.d.ts.map +1 -1
  22. package/dist/component/model.js +5 -1
  23. package/dist/component/model.js.map +1 -1
  24. package/dist/component/providers/credentials.d.ts +3 -2
  25. package/dist/component/providers/credentials.d.ts.map +1 -1
  26. package/dist/component/providers/email.d.ts +30 -0
  27. package/dist/component/providers/email.d.ts.map +1 -1
  28. package/dist/component/providers/phone.d.ts +28 -0
  29. package/dist/component/providers/phone.d.ts.map +1 -1
  30. package/dist/component/public/enterprise/audit.d.ts +73 -0
  31. package/dist/component/public/enterprise/audit.d.ts.map +1 -0
  32. package/dist/component/public/enterprise/audit.js +108 -0
  33. package/dist/component/public/enterprise/audit.js.map +1 -0
  34. package/dist/component/public/enterprise/core.d.ts +176 -0
  35. package/dist/component/public/enterprise/core.d.ts.map +1 -0
  36. package/dist/component/public/enterprise/core.js +292 -0
  37. package/dist/component/public/enterprise/core.js.map +1 -0
  38. package/dist/component/public/enterprise/domains.d.ts +174 -0
  39. package/dist/component/public/enterprise/domains.d.ts.map +1 -0
  40. package/dist/component/public/enterprise/domains.js +271 -0
  41. package/dist/component/public/enterprise/domains.js.map +1 -0
  42. package/dist/component/public/enterprise/scim.d.ts +245 -0
  43. package/dist/component/public/enterprise/scim.d.ts.map +1 -0
  44. package/dist/component/public/enterprise/scim.js +344 -0
  45. package/dist/component/public/enterprise/scim.js.map +1 -0
  46. package/dist/component/public/enterprise/secrets.d.ts +78 -0
  47. package/dist/component/public/enterprise/secrets.d.ts.map +1 -0
  48. package/dist/component/public/enterprise/secrets.js +118 -0
  49. package/dist/component/public/enterprise/secrets.js.map +1 -0
  50. package/dist/component/public/enterprise/webhooks.d.ts +211 -0
  51. package/dist/component/public/enterprise/webhooks.d.ts.map +1 -0
  52. package/dist/component/public/enterprise/webhooks.js +300 -0
  53. package/dist/component/public/enterprise/webhooks.js.map +1 -0
  54. package/dist/component/public/factors/devices.d.ts +157 -0
  55. package/dist/component/public/factors/devices.d.ts.map +1 -0
  56. package/dist/component/public/factors/devices.js +216 -0
  57. package/dist/component/public/factors/devices.js.map +1 -0
  58. package/dist/component/public/factors/passkeys.d.ts +175 -0
  59. package/dist/component/public/factors/passkeys.d.ts.map +1 -0
  60. package/dist/component/public/factors/passkeys.js +238 -0
  61. package/dist/component/public/factors/passkeys.js.map +1 -0
  62. package/dist/component/public/factors/totp.d.ts +189 -0
  63. package/dist/component/public/factors/totp.d.ts.map +1 -0
  64. package/dist/component/public/factors/totp.js +254 -0
  65. package/dist/component/public/factors/totp.js.map +1 -0
  66. package/dist/component/public/groups/core.d.ts +137 -0
  67. package/dist/component/public/groups/core.d.ts.map +1 -0
  68. package/dist/component/public/groups/core.js +321 -0
  69. package/dist/component/public/groups/core.js.map +1 -0
  70. package/dist/component/public/groups/invites.d.ts +217 -0
  71. package/dist/component/public/groups/invites.d.ts.map +1 -0
  72. package/dist/component/public/groups/invites.js +457 -0
  73. package/dist/component/public/groups/invites.js.map +1 -0
  74. package/dist/component/public/groups/members.d.ts +204 -0
  75. package/dist/component/public/groups/members.d.ts.map +1 -0
  76. package/dist/component/public/groups/members.js +355 -0
  77. package/dist/component/public/groups/members.js.map +1 -0
  78. package/dist/component/public/identity/accounts.d.ts +147 -0
  79. package/dist/component/public/identity/accounts.d.ts.map +1 -0
  80. package/dist/component/public/identity/accounts.js +200 -0
  81. package/dist/component/public/identity/accounts.js.map +1 -0
  82. package/dist/component/public/identity/codes.d.ts +104 -0
  83. package/dist/component/public/identity/codes.d.ts.map +1 -0
  84. package/dist/component/public/identity/codes.js +140 -0
  85. package/dist/component/public/identity/codes.js.map +1 -0
  86. package/dist/component/public/identity/sessions.d.ts +128 -0
  87. package/dist/component/public/identity/sessions.d.ts.map +1 -0
  88. package/dist/component/public/identity/sessions.js +192 -0
  89. package/dist/component/public/identity/sessions.js.map +1 -0
  90. package/dist/component/public/identity/tokens.d.ts +169 -0
  91. package/dist/component/public/identity/tokens.d.ts.map +1 -0
  92. package/dist/component/public/identity/tokens.js +227 -0
  93. package/dist/component/public/identity/tokens.js.map +1 -0
  94. package/dist/component/public/identity/users.d.ts +212 -0
  95. package/dist/component/public/identity/users.d.ts.map +1 -0
  96. package/dist/component/public/identity/users.js +311 -0
  97. package/dist/component/public/identity/users.js.map +1 -0
  98. package/dist/component/public/identity/verifiers.d.ts +116 -0
  99. package/dist/component/public/identity/verifiers.d.ts.map +1 -0
  100. package/dist/component/public/identity/verifiers.js +154 -0
  101. package/dist/component/public/identity/verifiers.js.map +1 -0
  102. package/dist/component/public/security/keys.d.ts +209 -0
  103. package/dist/component/public/security/keys.d.ts.map +1 -0
  104. package/dist/component/public/security/keys.js +319 -0
  105. package/dist/component/public/security/keys.js.map +1 -0
  106. package/dist/component/public/security/limits.d.ts +114 -0
  107. package/dist/component/public/security/limits.d.ts.map +1 -0
  108. package/dist/component/public/security/limits.js +169 -0
  109. package/dist/component/public/security/limits.js.map +1 -0
  110. package/dist/component/public.d.ts +22 -7
  111. package/dist/component/public.js +21 -6
  112. package/dist/component/schema.d.ts +288 -288
  113. package/dist/component/server/auth.d.ts +212 -25
  114. package/dist/component/server/auth.d.ts.map +1 -1
  115. package/dist/component/server/auth.js +68 -4
  116. package/dist/component/server/auth.js.map +1 -1
  117. package/dist/component/server/authError.js +34 -0
  118. package/dist/component/server/authError.js.map +1 -0
  119. package/dist/component/server/{providers.js → config.js} +2 -2
  120. package/dist/component/server/config.js.map +1 -0
  121. package/dist/component/server/{domains/core.js → core.js} +107 -88
  122. package/dist/component/server/core.js.map +1 -0
  123. package/dist/component/server/{provider.js → crypto.js} +3 -3
  124. package/dist/component/server/crypto.js.map +1 -0
  125. package/dist/component/server/device.js +1 -1
  126. package/dist/component/server/device.js.map +1 -1
  127. package/dist/component/server/enterprise/config.js +46 -0
  128. package/dist/component/server/enterprise/config.js.map +1 -0
  129. package/dist/component/server/{domains/sso.js → enterprise/domain.js} +6 -5
  130. package/dist/component/server/enterprise/domain.js.map +1 -0
  131. package/dist/component/server/enterprise/http.js +766 -0
  132. package/dist/component/server/enterprise/http.js.map +1 -0
  133. package/dist/component/server/enterprise/oidc.js +248 -0
  134. package/dist/component/server/enterprise/oidc.js.map +1 -0
  135. package/dist/component/server/enterprise/policy.js +85 -0
  136. package/dist/component/server/enterprise/policy.js.map +1 -0
  137. package/dist/component/server/enterprise/saml.js +338 -0
  138. package/dist/component/server/enterprise/saml.js.map +1 -0
  139. package/dist/component/server/enterprise/scim.js +97 -0
  140. package/dist/component/server/enterprise/scim.js.map +1 -0
  141. package/dist/component/server/enterprise/shared.js +51 -0
  142. package/dist/component/server/enterprise/shared.js.map +1 -0
  143. package/dist/component/server/errors.js.map +1 -1
  144. package/dist/component/server/http.js +2 -1
  145. package/dist/component/server/http.js.map +1 -1
  146. package/dist/component/server/identity.js +1 -1
  147. package/dist/component/server/identity.js.map +1 -1
  148. package/dist/component/server/{ratelimit.js → limits.js} +3 -3
  149. package/dist/component/server/limits.js.map +1 -0
  150. package/dist/component/server/mutations/account.js +3 -3
  151. package/dist/component/server/mutations/account.js.map +1 -1
  152. package/dist/component/server/mutations/code.js +2 -2
  153. package/dist/component/server/mutations/code.js.map +1 -1
  154. package/dist/component/server/mutations/invalidate.js +1 -1
  155. package/dist/component/server/mutations/invalidate.js.map +1 -1
  156. package/dist/component/server/mutations/oauth.js +5 -3
  157. package/dist/component/server/mutations/oauth.js.map +1 -1
  158. package/dist/component/server/mutations/refresh.js +1 -1
  159. package/dist/component/server/mutations/refresh.js.map +1 -1
  160. package/dist/component/server/mutations/register.js +3 -3
  161. package/dist/component/server/mutations/register.js.map +1 -1
  162. package/dist/component/server/mutations/retrieve.js +4 -4
  163. package/dist/component/server/mutations/retrieve.js.map +1 -1
  164. package/dist/component/server/mutations/signature.js +2 -2
  165. package/dist/component/server/mutations/signature.js.map +1 -1
  166. package/dist/component/server/mutations/signin.js +1 -1
  167. package/dist/component/server/mutations/signin.js.map +1 -1
  168. package/dist/component/server/mutations/signout.js +1 -1
  169. package/dist/component/server/mutations/signout.js.map +1 -1
  170. package/dist/component/server/mutations/store/refs.js +15 -0
  171. package/dist/component/server/mutations/store/refs.js.map +1 -0
  172. package/dist/component/server/mutations/store.js +80 -10
  173. package/dist/component/server/mutations/store.js.map +1 -1
  174. package/dist/component/server/mutations/verifier.js +1 -1
  175. package/dist/component/server/mutations/verifier.js.map +1 -1
  176. package/dist/component/server/mutations/verify.js +4 -3
  177. package/dist/component/server/mutations/verify.js.map +1 -1
  178. package/dist/component/server/oauth.js +1 -1
  179. package/dist/component/server/oauth.js.map +1 -1
  180. package/dist/component/server/passkey.js +2 -1
  181. package/dist/component/server/passkey.js.map +1 -1
  182. package/dist/component/server/redirects.js +1 -1
  183. package/dist/component/server/redirects.js.map +1 -1
  184. package/dist/component/server/refresh.js +1 -1
  185. package/dist/component/server/refresh.js.map +1 -1
  186. package/dist/component/server/{factory.d.ts → runtime.d.ts} +2 -2
  187. package/dist/component/server/runtime.d.ts.map +1 -0
  188. package/dist/component/server/runtime.js +413 -0
  189. package/dist/component/server/runtime.js.map +1 -0
  190. package/dist/component/server/signin.js +2 -1
  191. package/dist/component/server/signin.js.map +1 -1
  192. package/dist/component/server/totp.js +2 -1
  193. package/dist/component/server/totp.js.map +1 -1
  194. package/dist/component/server/types.d.ts +225 -41
  195. package/dist/component/server/types.d.ts.map +1 -1
  196. package/dist/component/server/types.js.map +1 -1
  197. package/dist/component/server/users.js +1 -1
  198. package/dist/component/server/users.js.map +1 -1
  199. package/dist/component/server/utils.js +1 -1
  200. package/dist/component/server/utils.js.map +1 -1
  201. package/dist/core/types.d.ts +369 -0
  202. package/dist/core/types.d.ts.map +1 -0
  203. package/dist/factors/device.js +105 -0
  204. package/dist/factors/device.js.map +1 -0
  205. package/dist/factors/passkey.js +181 -0
  206. package/dist/factors/passkey.js.map +1 -0
  207. package/dist/factors/totp.js +122 -0
  208. package/dist/factors/totp.js.map +1 -0
  209. package/dist/providers/credentials.d.ts +5 -2
  210. package/dist/providers/credentials.d.ts.map +1 -1
  211. package/dist/providers/credentials.js +2 -0
  212. package/dist/providers/credentials.js.map +1 -1
  213. package/dist/providers/email.d.ts +30 -0
  214. package/dist/providers/email.d.ts.map +1 -1
  215. package/dist/providers/email.js +24 -0
  216. package/dist/providers/email.js.map +1 -1
  217. package/dist/providers/phone.d.ts +28 -0
  218. package/dist/providers/phone.d.ts.map +1 -1
  219. package/dist/providers/phone.js +22 -0
  220. package/dist/providers/phone.js.map +1 -1
  221. package/dist/runtime/browser.js +68 -0
  222. package/dist/runtime/browser.js.map +1 -0
  223. package/dist/runtime/invite.js +51 -0
  224. package/dist/runtime/invite.js.map +1 -0
  225. package/dist/runtime/proxy.js +70 -0
  226. package/dist/runtime/proxy.js.map +1 -0
  227. package/dist/runtime/storage.js +37 -0
  228. package/dist/runtime/storage.js.map +1 -0
  229. package/dist/server/auth.d.ts +218 -28
  230. package/dist/server/auth.d.ts.map +1 -1
  231. package/dist/server/auth.js +68 -4
  232. package/dist/server/auth.js.map +1 -1
  233. package/dist/server/{fx.d.ts → authError.d.ts} +25 -15
  234. package/dist/server/authError.d.ts.map +1 -0
  235. package/dist/server/authError.js +34 -0
  236. package/dist/server/authError.js.map +1 -0
  237. package/dist/server/{providers.js → config.js} +2 -2
  238. package/dist/server/config.js.map +1 -0
  239. package/dist/server/core.d.ts +1436 -0
  240. package/dist/server/core.d.ts.map +1 -0
  241. package/dist/server/{domains/core.js → core.js} +107 -88
  242. package/dist/server/core.js.map +1 -0
  243. package/dist/server/{provider.d.ts → crypto.d.ts} +2 -2
  244. package/dist/server/crypto.d.ts.map +1 -0
  245. package/dist/server/{provider.js → crypto.js} +3 -3
  246. package/dist/{component/server/provider.js.map → server/crypto.js.map} +1 -1
  247. package/dist/server/device.js +1 -1
  248. package/dist/server/device.js.map +1 -1
  249. package/dist/server/enterprise/config.js +46 -0
  250. package/dist/server/enterprise/config.js.map +1 -0
  251. package/dist/server/{domains/sso.d.ts → enterprise/domain.d.ts} +4 -4
  252. package/dist/server/enterprise/domain.d.ts.map +1 -0
  253. package/dist/server/{domains/sso.js → enterprise/domain.js} +6 -5
  254. package/dist/server/enterprise/domain.js.map +1 -0
  255. package/dist/server/enterprise/http.d.ts +26 -0
  256. package/dist/server/enterprise/http.d.ts.map +1 -0
  257. package/dist/server/enterprise/http.js +766 -0
  258. package/dist/server/enterprise/http.js.map +1 -0
  259. package/dist/server/enterprise/oidc.js +248 -0
  260. package/dist/server/enterprise/oidc.js.map +1 -0
  261. package/dist/server/enterprise/policy.js +85 -0
  262. package/dist/server/enterprise/policy.js.map +1 -0
  263. package/dist/server/enterprise/saml.d.ts +1 -0
  264. package/dist/server/enterprise/saml.js +338 -0
  265. package/dist/server/enterprise/saml.js.map +1 -0
  266. package/dist/server/enterprise/scim.d.ts +1 -0
  267. package/dist/server/enterprise/scim.js +97 -0
  268. package/dist/server/enterprise/scim.js.map +1 -0
  269. package/dist/server/enterprise/shared.d.ts +5 -0
  270. package/dist/server/enterprise/shared.d.ts.map +1 -0
  271. package/dist/server/enterprise/shared.js +51 -0
  272. package/dist/server/enterprise/shared.js.map +1 -0
  273. package/dist/server/enterprise/validators.d.ts +1 -0
  274. package/dist/server/{enterpriseValidators.js → enterprise/validators.js} +2 -2
  275. package/dist/server/enterprise/validators.js.map +1 -0
  276. package/dist/server/errors.d.ts +2 -0
  277. package/dist/server/errors.d.ts.map +1 -1
  278. package/dist/server/errors.js +2 -0
  279. package/dist/server/errors.js.map +1 -1
  280. package/dist/server/http.d.ts +2 -2
  281. package/dist/server/http.d.ts.map +1 -1
  282. package/dist/server/http.js +2 -1
  283. package/dist/server/http.js.map +1 -1
  284. package/dist/server/identity.js +1 -1
  285. package/dist/server/identity.js.map +1 -1
  286. package/dist/server/index.d.ts +4 -705
  287. package/dist/server/index.js +4 -1367
  288. package/dist/server/limits.d.ts +1 -0
  289. package/dist/server/{ratelimit.js → limits.js} +3 -3
  290. package/dist/server/limits.js.map +1 -0
  291. package/dist/server/mounts.d.ts +647 -0
  292. package/dist/server/mounts.d.ts.map +1 -0
  293. package/dist/server/mounts.js +643 -0
  294. package/dist/server/mounts.js.map +1 -0
  295. package/dist/server/mutations/account.d.ts +8 -8
  296. package/dist/server/mutations/account.js +3 -3
  297. package/dist/server/mutations/account.js.map +1 -1
  298. package/dist/server/mutations/code.d.ts +13 -13
  299. package/dist/server/mutations/code.js +2 -2
  300. package/dist/server/mutations/code.js.map +1 -1
  301. package/dist/server/mutations/index.d.ts +8 -312
  302. package/dist/server/mutations/index.js +14 -84
  303. package/dist/server/mutations/invalidate.d.ts +5 -5
  304. package/dist/server/mutations/invalidate.d.ts.map +1 -1
  305. package/dist/server/mutations/invalidate.js +1 -1
  306. package/dist/server/mutations/invalidate.js.map +1 -1
  307. package/dist/server/mutations/oauth.d.ts +9 -9
  308. package/dist/server/mutations/oauth.d.ts.map +1 -1
  309. package/dist/server/mutations/oauth.js +5 -3
  310. package/dist/server/mutations/oauth.js.map +1 -1
  311. package/dist/server/mutations/refresh.d.ts +4 -4
  312. package/dist/server/mutations/refresh.js +1 -1
  313. package/dist/server/mutations/refresh.js.map +1 -1
  314. package/dist/server/mutations/register.d.ts +10 -10
  315. package/dist/server/mutations/register.d.ts.map +1 -1
  316. package/dist/server/mutations/register.js +3 -3
  317. package/dist/server/mutations/register.js.map +1 -1
  318. package/dist/server/mutations/retrieve.d.ts +8 -10
  319. package/dist/server/mutations/retrieve.d.ts.map +1 -1
  320. package/dist/server/mutations/retrieve.js +5 -7
  321. package/dist/server/mutations/retrieve.js.map +1 -1
  322. package/dist/server/mutations/signature.d.ts +6 -6
  323. package/dist/server/mutations/signature.d.ts.map +1 -1
  324. package/dist/server/mutations/signature.js +2 -2
  325. package/dist/server/mutations/signature.js.map +1 -1
  326. package/dist/server/mutations/signin.d.ts +1 -1
  327. package/dist/server/mutations/signin.js +1 -1
  328. package/dist/server/mutations/signin.js.map +1 -1
  329. package/dist/server/mutations/signout.d.ts +1 -1
  330. package/dist/server/mutations/signout.js +1 -1
  331. package/dist/server/mutations/signout.js.map +1 -1
  332. package/dist/server/mutations/store/refs.d.ts +12 -0
  333. package/dist/server/mutations/store/refs.d.ts.map +1 -0
  334. package/dist/server/mutations/store/refs.js +15 -0
  335. package/dist/server/mutations/store/refs.js.map +1 -0
  336. package/dist/server/mutations/store.d.ts +303 -9
  337. package/dist/server/mutations/store.d.ts.map +1 -1
  338. package/dist/server/mutations/store.js +80 -10
  339. package/dist/server/mutations/store.js.map +1 -1
  340. package/dist/server/mutations/verifier.d.ts +1 -1
  341. package/dist/server/mutations/verifier.js +1 -1
  342. package/dist/server/mutations/verifier.js.map +1 -1
  343. package/dist/server/mutations/verify.d.ts +8 -8
  344. package/dist/server/mutations/verify.d.ts.map +1 -1
  345. package/dist/server/mutations/verify.js +4 -3
  346. package/dist/server/mutations/verify.js.map +1 -1
  347. package/dist/server/oauth.js +1 -1
  348. package/dist/server/oauth.js.map +1 -1
  349. package/dist/server/passkey.d.ts +2 -2
  350. package/dist/server/passkey.d.ts.map +1 -1
  351. package/dist/server/passkey.js +3 -2
  352. package/dist/server/passkey.js.map +1 -1
  353. package/dist/server/redirects.js +1 -1
  354. package/dist/server/redirects.js.map +1 -1
  355. package/dist/server/refresh.js +1 -1
  356. package/dist/server/refresh.js.map +1 -1
  357. package/dist/server/{factory.d.ts → runtime.d.ts} +16 -16
  358. package/dist/server/runtime.d.ts.map +1 -0
  359. package/dist/server/runtime.js +413 -0
  360. package/dist/server/runtime.js.map +1 -0
  361. package/dist/server/signin.js +3 -2
  362. package/dist/server/signin.js.map +1 -1
  363. package/dist/server/ssr.d.ts +226 -0
  364. package/dist/server/ssr.d.ts.map +1 -0
  365. package/dist/server/ssr.js +786 -0
  366. package/dist/server/ssr.js.map +1 -0
  367. package/dist/server/totp.js +2 -1
  368. package/dist/server/totp.js.map +1 -1
  369. package/dist/server/types.d.ts +242 -42
  370. package/dist/server/types.d.ts.map +1 -1
  371. package/dist/server/types.js +12 -1
  372. package/dist/server/types.js.map +1 -1
  373. package/dist/server/users.js +1 -1
  374. package/dist/server/users.js.map +1 -1
  375. package/dist/server/utils.js +1 -1
  376. package/dist/server/utils.js.map +1 -1
  377. package/package.json +3 -4
  378. package/src/authorization/index.ts +46 -0
  379. package/src/cli/index.ts +38 -20
  380. package/src/client/core/types.ts +437 -0
  381. package/src/client/factors/device.ts +160 -0
  382. package/src/client/factors/passkey.ts +282 -0
  383. package/src/client/factors/totp.ts +150 -0
  384. package/src/client/index.ts +133 -1267
  385. package/src/client/runtime/browser.ts +112 -0
  386. package/src/client/runtime/invite.ts +65 -0
  387. package/src/client/runtime/proxy.ts +111 -0
  388. package/src/client/runtime/storage.ts +79 -0
  389. package/src/component/_generated/api.ts +40 -12
  390. package/src/component/_generated/component.ts +1772 -1798
  391. package/src/component/model.ts +6 -0
  392. package/src/component/public/enterprise/audit.ts +120 -0
  393. package/src/component/public/enterprise/core.ts +354 -0
  394. package/src/component/public/enterprise/domains.ts +323 -0
  395. package/src/component/public/enterprise/scim.ts +396 -0
  396. package/src/component/public/enterprise/secrets.ts +132 -0
  397. package/src/component/public/enterprise/webhooks.ts +306 -0
  398. package/src/component/public/factors/devices.ts +223 -0
  399. package/src/component/public/factors/passkeys.ts +242 -0
  400. package/src/component/public/factors/totp.ts +258 -0
  401. package/src/component/public/groups/core.ts +481 -0
  402. package/src/component/public/groups/invites.ts +602 -0
  403. package/src/component/public/groups/members.ts +409 -0
  404. package/src/component/public/identity/accounts.ts +206 -0
  405. package/src/component/public/identity/codes.ts +148 -0
  406. package/src/component/public/identity/sessions.ts +209 -0
  407. package/src/component/public/identity/tokens.ts +250 -0
  408. package/src/component/public/identity/users.ts +354 -0
  409. package/src/component/public/identity/verifiers.ts +157 -0
  410. package/src/component/public/security/keys.ts +365 -0
  411. package/src/component/public/security/limits.ts +173 -0
  412. package/src/component/public.ts +27 -5
  413. package/src/providers/credentials.ts +4 -5
  414. package/src/providers/email.ts +30 -0
  415. package/src/providers/phone.ts +28 -0
  416. package/src/server/auth.ts +282 -28
  417. package/src/server/authError.ts +44 -0
  418. package/src/server/core.ts +2095 -0
  419. package/src/server/{provider.ts → crypto.ts} +1 -1
  420. package/src/server/device.ts +1 -1
  421. package/src/server/enterprise/config.ts +51 -0
  422. package/src/server/{domains/sso.ts → enterprise/domain.ts} +4 -2
  423. package/src/server/enterprise/http.ts +1324 -0
  424. package/src/server/enterprise/oidc.ts +500 -0
  425. package/src/server/enterprise/policy.ts +128 -0
  426. package/src/server/enterprise/saml.ts +578 -0
  427. package/src/server/enterprise/scim.ts +135 -0
  428. package/src/server/enterprise/shared.ts +134 -0
  429. package/src/server/errors.ts +2 -0
  430. package/src/server/http.ts +3 -1
  431. package/src/server/identity.ts +1 -1
  432. package/src/server/index.ts +32 -2605
  433. package/src/server/{ratelimit.ts → limits.ts} +1 -1
  434. package/src/server/mounts.ts +948 -0
  435. package/src/server/mutations/account.ts +4 -4
  436. package/src/server/mutations/code.ts +3 -3
  437. package/src/server/mutations/index.ts +8 -148
  438. package/src/server/mutations/invalidate.ts +2 -2
  439. package/src/server/mutations/oauth.ts +8 -6
  440. package/src/server/mutations/refresh.ts +3 -3
  441. package/src/server/mutations/register.ts +3 -3
  442. package/src/server/mutations/retrieve.ts +4 -8
  443. package/src/server/mutations/signature.ts +3 -3
  444. package/src/server/mutations/signin.ts +2 -2
  445. package/src/server/mutations/signout.ts +2 -2
  446. package/src/server/mutations/store/refs.ts +10 -0
  447. package/src/server/mutations/store.ts +137 -9
  448. package/src/server/mutations/verifier.ts +2 -2
  449. package/src/server/mutations/verify.ts +5 -5
  450. package/src/server/oauth.ts +1 -1
  451. package/src/server/passkey.ts +3 -4
  452. package/src/server/redirects.ts +1 -1
  453. package/src/server/refresh.ts +1 -1
  454. package/src/server/runtime.ts +880 -0
  455. package/src/server/signin.ts +3 -1
  456. package/src/server/ssr.ts +1764 -0
  457. package/src/server/totp.ts +3 -1
  458. package/src/server/types.ts +254 -43
  459. package/src/server/users.ts +1 -1
  460. package/src/server/utils.ts +1 -1
  461. package/src/test.ts +25 -0
  462. package/dist/component/public/enterprise.d.ts +0 -54
  463. package/dist/component/public/enterprise.d.ts.map +0 -1
  464. package/dist/component/public/enterprise.js +0 -515
  465. package/dist/component/public/enterprise.js.map +0 -1
  466. package/dist/component/public/factors.d.ts +0 -52
  467. package/dist/component/public/factors.d.ts.map +0 -1
  468. package/dist/component/public/factors.js +0 -285
  469. package/dist/component/public/factors.js.map +0 -1
  470. package/dist/component/public/groups.d.ts +0 -124
  471. package/dist/component/public/groups.d.ts.map +0 -1
  472. package/dist/component/public/groups.js +0 -680
  473. package/dist/component/public/groups.js.map +0 -1
  474. package/dist/component/public/identity.d.ts +0 -93
  475. package/dist/component/public/identity.d.ts.map +0 -1
  476. package/dist/component/public/identity.js +0 -426
  477. package/dist/component/public/identity.js.map +0 -1
  478. package/dist/component/public/keys.d.ts +0 -41
  479. package/dist/component/public/keys.d.ts.map +0 -1
  480. package/dist/component/public/keys.js +0 -157
  481. package/dist/component/public/keys.js.map +0 -1
  482. package/dist/component/public/shared.d.ts +0 -26
  483. package/dist/component/public/shared.d.ts.map +0 -1
  484. package/dist/component/public/shared.js +0 -32
  485. package/dist/component/public/shared.js.map +0 -1
  486. package/dist/component/server/domains/core.js.map +0 -1
  487. package/dist/component/server/domains/sso.js.map +0 -1
  488. package/dist/component/server/factory.d.ts.map +0 -1
  489. package/dist/component/server/factory.js +0 -1134
  490. package/dist/component/server/factory.js.map +0 -1
  491. package/dist/component/server/fx.js +0 -66
  492. package/dist/component/server/fx.js.map +0 -1
  493. package/dist/component/server/mutations/index.js +0 -85
  494. package/dist/component/server/mutations/index.js.map +0 -1
  495. package/dist/component/server/providers.js.map +0 -1
  496. package/dist/component/server/ratelimit.js.map +0 -1
  497. package/dist/component/server/sso.js +0 -830
  498. package/dist/component/server/sso.js.map +0 -1
  499. package/dist/server/domains/core.d.ts +0 -449
  500. package/dist/server/domains/core.d.ts.map +0 -1
  501. package/dist/server/domains/core.js.map +0 -1
  502. package/dist/server/domains/sso.d.ts.map +0 -1
  503. package/dist/server/domains/sso.js.map +0 -1
  504. package/dist/server/enterpriseValidators.js.map +0 -1
  505. package/dist/server/factory.d.ts.map +0 -1
  506. package/dist/server/factory.js +0 -1134
  507. package/dist/server/factory.js.map +0 -1
  508. package/dist/server/fx.d.ts.map +0 -1
  509. package/dist/server/fx.js +0 -66
  510. package/dist/server/fx.js.map +0 -1
  511. package/dist/server/index.d.ts.map +0 -1
  512. package/dist/server/index.js.map +0 -1
  513. package/dist/server/mutations/index.d.ts.map +0 -1
  514. package/dist/server/mutations/index.js.map +0 -1
  515. package/dist/server/provider.d.ts.map +0 -1
  516. package/dist/server/provider.js.map +0 -1
  517. package/dist/server/providers.js.map +0 -1
  518. package/dist/server/ratelimit.js.map +0 -1
  519. package/dist/server/sso.js +0 -830
  520. package/dist/server/sso.js.map +0 -1
  521. package/dist/server/version.d.ts +0 -5
  522. package/dist/server/version.d.ts.map +0 -1
  523. package/dist/server/version.js +0 -6
  524. package/dist/server/version.js.map +0 -1
  525. package/src/component/public/enterprise.ts +0 -753
  526. package/src/component/public/factors.ts +0 -333
  527. package/src/component/public/groups.ts +0 -1066
  528. package/src/component/public/identity.ts +0 -569
  529. package/src/component/public/keys.ts +0 -209
  530. package/src/component/public/shared.ts +0 -119
  531. package/src/server/domains/core.ts +0 -1096
  532. package/src/server/factory.ts +0 -2181
  533. package/src/server/fx.ts +0 -152
  534. package/src/server/sso.ts +0 -1516
  535. package/src/server/version.ts +0 -2
  536. /package/dist/server/{enterpriseValidators.d.ts → config.d.ts} +0 -0
  537. /package/dist/server/{providers.d.ts → enterprise/config.d.ts} +0 -0
  538. /package/dist/server/{ratelimit.d.ts → enterprise/oidc.d.ts} +0 -0
  539. /package/dist/server/{sso.d.ts → enterprise/policy.d.ts} +0 -0
  540. /package/src/server/{providers.ts → config.ts} +0 -0
  541. /package/src/server/{enterpriseValidators.ts → enterprise/validators.ts} +0 -0
@@ -1,830 +0,0 @@
1
- import { sha256 } from "@oslojs/crypto/sha2";
2
- import { decodeBase64urlIgnorePadding, encodeBase64urlNoPadding } from "@oslojs/encoding";
3
- import { Fx } from "@robelest/fx";
4
- import { createRemoteJWKSet, customFetch, decodeProtectedHeader, jwtVerify } from "jose";
5
- import { Constants, IdentityProvider, ServiceProvider, setSchemaValidator } from "@robelest/samlify";
6
- import { decodeIdToken } from "arctic";
7
-
8
- //#region src/server/sso.ts
9
- const _samlifyPermissiveValidator = { validate: (_xml) => Promise.resolve("OK") };
10
- function ensureSamlifyValidator() {
11
- setSchemaValidator(_samlifyPermissiveValidator);
12
- }
13
- /** @internal */
14
- const SCIM_USER_SCHEMA_ID = "urn:ietf:params:scim:schemas:core:2.0:User";
15
- /** @internal */
16
- const SCIM_GROUP_SCHEMA_ID = "urn:ietf:params:scim:schemas:core:2.0:Group";
17
- /** @internal */
18
- const ENTERPRISE_OIDC_PROVIDER_PREFIX = "enterprise:oidc:";
19
- /** @internal */
20
- const ENTERPRISE_SAML_PROVIDER_PREFIX = "enterprise:saml:";
21
- const OIDC_JWKS_CACHE = /* @__PURE__ */ new Map();
22
- /** @internal */
23
- function normalizeDomain(domain) {
24
- return domain.trim().toLowerCase().replace(/^@+/, "");
25
- }
26
- /** @internal */
27
- function enterpriseOidcProviderId(enterpriseId) {
28
- return `${ENTERPRISE_OIDC_PROVIDER_PREFIX}${enterpriseId}`;
29
- }
30
- /** @internal */
31
- function enterpriseSamlProviderId(enterpriseId) {
32
- return `${ENTERPRISE_SAML_PROVIDER_PREFIX}${enterpriseId}`;
33
- }
34
- /** @internal */
35
- function getEnterpriseSamlUrls(opts) {
36
- const root = opts.rootUrl.replace(/\/$/, "");
37
- return {
38
- metadataUrl: `${root}/api/auth/sso/${opts.source.id}/saml/metadata`,
39
- acsUrl: `${root}/api/auth/sso/${opts.source.id}/saml/acs`,
40
- sloUrl: `${root}/api/auth/sso/${opts.source.id}/saml/slo`
41
- };
42
- }
43
- /** @internal */
44
- function getEnterpriseOidcUrls(opts) {
45
- const root = opts.rootUrl.replace(/\/$/, "");
46
- return {
47
- signInUrl: `${root}/api/auth/sso/${opts.enterpriseId}/oidc/signin`,
48
- callbackUrl: `${root}/api/auth/sso/${opts.enterpriseId}/oidc/callback`
49
- };
50
- }
51
- /** @internal */
52
- function isEnterpriseSamlSourceActive(source) {
53
- return source.status === "active";
54
- }
55
- /** @internal */
56
- function isEnterpriseProviderId(providerId) {
57
- return providerId.startsWith(ENTERPRISE_OIDC_PROVIDER_PREFIX) || providerId.startsWith(ENTERPRISE_SAML_PROVIDER_PREFIX);
58
- }
59
- const asRecord = (value) => typeof value === "object" && value !== null ? value : null;
60
- /** @internal */
61
- const DEFAULT_ENTERPRISE_POLICY = {
62
- version: 1,
63
- identity: { accountLinking: {
64
- oidc: "verifiedEmail",
65
- saml: "verifiedEmail"
66
- } },
67
- provisioning: {
68
- scimReuse: { user: "externalId" },
69
- jit: {
70
- mode: "createUserAndMembership",
71
- defaultRoleIds: []
72
- },
73
- deprovision: { mode: "soft" }
74
- }
75
- };
76
- /** @internal */
77
- function normalizeEnterprisePolicy(policy) {
78
- const input = asRecord(policy) ?? {};
79
- const accountLinking = asRecord((asRecord(input.identity) ?? {}).accountLinking) ?? {};
80
- const provisioning = asRecord(input.provisioning) ?? {};
81
- const scimReuse = asRecord(provisioning.scimReuse) ?? {};
82
- const jit = asRecord(provisioning.jit) ?? {};
83
- const deprovision = asRecord(provisioning.deprovision) ?? {};
84
- const extend = asRecord(input.extend) ?? void 0;
85
- return {
86
- version: 1,
87
- identity: { accountLinking: {
88
- oidc: accountLinking.oidc === "none" ? "none" : DEFAULT_ENTERPRISE_POLICY.identity.accountLinking.oidc,
89
- saml: accountLinking.saml === "none" ? "none" : DEFAULT_ENTERPRISE_POLICY.identity.accountLinking.saml
90
- } },
91
- provisioning: {
92
- scimReuse: { user: scimReuse.user === "none" ? "none" : DEFAULT_ENTERPRISE_POLICY.provisioning.scimReuse.user },
93
- jit: {
94
- mode: jit.mode === "off" || jit.mode === "createUser" || jit.mode === "createUserAndMembership" ? jit.mode : DEFAULT_ENTERPRISE_POLICY.provisioning.jit.mode,
95
- defaultRoleIds: Array.isArray(jit.defaultRoleIds) ? Array.from(new Set(jit.defaultRoleIds.filter((value) => typeof value === "string" && value.length > 0))) : typeof jit.defaultRole === "string" && jit.defaultRole.length > 0 ? [jit.defaultRole] : DEFAULT_ENTERPRISE_POLICY.provisioning.jit.defaultRoleIds
96
- },
97
- deprovision: { mode: deprovision.mode === "hard" ? "hard" : DEFAULT_ENTERPRISE_POLICY.provisioning.deprovision.mode }
98
- },
99
- ...extend ? { extend } : {}
100
- };
101
- }
102
- /** @internal */
103
- function patchEnterprisePolicy(current, patch) {
104
- const base = normalizeEnterprisePolicy(current);
105
- return normalizeEnterprisePolicy({
106
- ...base,
107
- ...patch,
108
- identity: {
109
- ...base.identity,
110
- ...patch.identity,
111
- accountLinking: {
112
- ...base.identity.accountLinking,
113
- ...patch.identity?.accountLinking
114
- }
115
- },
116
- provisioning: {
117
- ...base.provisioning,
118
- ...patch.provisioning,
119
- scimReuse: {
120
- ...base.provisioning.scimReuse,
121
- ...patch.provisioning?.scimReuse
122
- },
123
- jit: {
124
- ...base.provisioning.jit,
125
- ...patch.provisioning?.jit
126
- },
127
- deprovision: {
128
- ...base.provisioning.deprovision,
129
- ...patch.provisioning?.deprovision
130
- }
131
- },
132
- extend: patch.extend === void 0 ? base.extend : {
133
- ...base.extend,
134
- ...patch.extend
135
- }
136
- });
137
- }
138
- const getProtocolConfig = (config, protocol) => {
139
- const base = asRecord(config);
140
- const direct = base?.[protocol];
141
- const viaProtocols = asRecord(base?.protocols)?.[protocol];
142
- return asRecord(direct) ?? asRecord(viaProtocols) ?? {};
143
- };
144
- /** @internal */
145
- function getOidcConfig(config) {
146
- return getProtocolConfig(config, "oidc");
147
- }
148
- /** @internal */
149
- function getPublicOidcConfig(config) {
150
- const { clientSecret: _clientSecret, ...publicOidc } = getOidcConfig(config);
151
- return publicOidc;
152
- }
153
- /** @internal */
154
- function withOidcSecretState(config, hasClientSecret) {
155
- return {
156
- ...config,
157
- hasClientSecret
158
- };
159
- }
160
- /** @internal */
161
- function getSamlConfig(config) {
162
- return getProtocolConfig(config, "saml");
163
- }
164
- /** @internal */
165
- function upsertProtocolConfig(config, protocol, protocolConfig) {
166
- const base = asRecord(config) ?? {};
167
- const protocols = asRecord(base.protocols) ?? {};
168
- protocols[protocol] = {
169
- ...asRecord(protocols[protocol]),
170
- ...protocolConfig
171
- };
172
- return {
173
- ...base,
174
- protocols
175
- };
176
- }
177
- /** @internal */
178
- function createSamlPostBindingResponse(opts) {
179
- const fields = [`<input type="hidden" name="${opts.parameter}" value="${opts.value.replace(/"/g, "&quot;")}" />`, opts.relayState ? `<input type="hidden" name="RelayState" value="${opts.relayState.replace(/"/g, "&quot;")}" />` : ""].join("");
180
- return new Response(`<!doctype html><html><body><form method="POST" action="${opts.endpoint}">${fields}</form><script>document.forms[0].submit();<\/script></body></html>`, {
181
- status: 200,
182
- headers: { "Content-Type": "text/html; charset=utf-8" }
183
- });
184
- }
185
- /** @internal */
186
- function decodeRelayState(value) {
187
- if (!value) return {};
188
- try {
189
- return JSON.parse(new TextDecoder().decode(decodeBase64urlIgnorePadding(value)));
190
- } catch {
191
- return {};
192
- }
193
- }
194
- /** @internal */
195
- function encodeEnterpriseSamlRelayState(value) {
196
- return encodeBase64urlNoPadding(new TextEncoder().encode(JSON.stringify({
197
- source: `${value.source.kind}:${value.source.id}`,
198
- signature: value.signature,
199
- requestId: value.requestId,
200
- state: value.state,
201
- redirectTo: value.redirectTo
202
- })));
203
- }
204
- /** @internal */
205
- function decodeEnterpriseSamlRelayStateOrThrow(value) {
206
- if (!value) throw new Error("Missing SAML RelayState.");
207
- const decoded = decodeRelayState(value);
208
- if (typeof decoded.source !== "string" || typeof decoded.signature !== "string" || typeof decoded.requestId !== "string" || typeof decoded.state !== "string") throw new Error("Invalid SAML RelayState.");
209
- const [kind, ...rest] = decoded.source.split(":");
210
- const id = rest.join(":");
211
- if (kind !== "enterprise" || id.length === 0) throw new Error("Invalid enterprise SAML source.");
212
- return {
213
- source: {
214
- kind,
215
- id
216
- },
217
- signature: decoded.signature,
218
- requestId: decoded.requestId,
219
- state: decoded.state,
220
- redirectTo: typeof decoded.redirectTo === "string" ? decoded.redirectTo : void 0
221
- };
222
- }
223
- /** @internal */
224
- async function readRequestBody(request) {
225
- const contentType = request.headers.get("Content-Type") ?? "";
226
- if (contentType.includes("application/x-www-form-urlencoded") || contentType.includes("multipart/form-data")) {
227
- const form = await request.formData();
228
- const body = {};
229
- form.forEach((value, key) => {
230
- body[key] = typeof value === "string" ? value : value.name;
231
- });
232
- return body;
233
- }
234
- return {};
235
- }
236
- /** @internal */
237
- async function readEnterpriseSamlHttpRequest(request) {
238
- const url = new URL(request.url);
239
- const body = await readRequestBody(request);
240
- return {
241
- url,
242
- body,
243
- query: Object.fromEntries(url.searchParams),
244
- binding: request.method === "GET" ? "redirect" : body.SAMLResponse || body.SAMLRequest ? "post" : "redirect",
245
- relayState: body.RelayState ?? url.searchParams.get("RelayState") ?? void 0,
246
- hasSamlRequest: Boolean(body.SAMLRequest ?? url.searchParams.get("SAMLRequest")),
247
- hasSamlResponse: Boolean(body.SAMLResponse ?? url.searchParams.get("SAMLResponse"))
248
- };
249
- }
250
- async function discoverOidcConfiguration(config) {
251
- const discoveryUrl = typeof config.discoveryUrl === "string" ? config.discoveryUrl : typeof config.issuer === "string" ? `${config.issuer.replace(/\/$/, "")}/.well-known/openid-configuration` : null;
252
- if (!discoveryUrl) throw new Error("Enterprise OIDC requires an issuer or discoveryUrl.");
253
- const oidcFetch = createEnterpriseOidcFetch(config, config.issuer);
254
- return await Fx.run(Fx.defer(() => Fx.from({
255
- ok: async () => {
256
- const response = await oidcFetch(discoveryUrl);
257
- if (!response.ok) throw new Error(`Failed to discover OIDC configuration: ${response.status}`);
258
- const discovery = await response.json();
259
- if (typeof discovery.issuer !== "string" || typeof discovery.authorization_endpoint !== "string" || typeof discovery.token_endpoint !== "string" || typeof discovery.jwks_uri !== "string") throw new Error("OIDC discovery document is missing required fields.");
260
- return discovery;
261
- },
262
- err: (error) => error instanceof Error ? error : new Error(String(error))
263
- })).pipe(Fx.timeout(1e4), Fx.retry(Fx.retry.compose(Fx.retry.jittered(Fx.retry.exponential(200)), Fx.retry.recurs(2))), Fx.recover((error) => Fx.fail(error instanceof Error ? error : new Error(String(error))))));
264
- }
265
- function createEnterpriseOidcFetch(config, discoveredIssuer) {
266
- const runtimeOrigin = typeof config.discoveryUrl === "string" ? new URL(config.discoveryUrl).origin : void 0;
267
- const externalHost = typeof config.issuer === "string" ? new URL(config.issuer).host : typeof discoveredIssuer === "string" ? new URL(discoveredIssuer).host : void 0;
268
- return async (input, init) => {
269
- const url = new URL(typeof input === "string" ? input : input.toString());
270
- const rewrittenUrl = runtimeOrigin !== void 0 && url.origin !== runtimeOrigin ? new URL(`${runtimeOrigin}${url.pathname}${url.search}`) : url;
271
- const headers = new Headers(init?.headers);
272
- if (runtimeOrigin !== void 0 && externalHost !== void 0) headers.set("host", externalHost);
273
- return await fetch(rewrittenUrl, {
274
- ...init,
275
- headers
276
- });
277
- };
278
- }
279
- function getOidcJwks(url, fetchImpl) {
280
- const cacheKey = fetchImpl ? `${url}::custom` : url;
281
- let jwks = OIDC_JWKS_CACHE.get(cacheKey);
282
- if (!jwks) {
283
- jwks = fetchImpl ? createRemoteJWKSet(new URL(url), { [customFetch]: fetchImpl }) : createRemoteJWKSet(new URL(url));
284
- OIDC_JWKS_CACHE.set(cacheKey, jwks);
285
- }
286
- return jwks;
287
- }
288
- function userInfoProfileFx(opts) {
289
- return Fx.from({
290
- ok: async () => {
291
- const response = await (opts.fetchImpl ?? fetch)(opts.endpoint, { headers: { Authorization: `Bearer ${opts.accessToken}` } });
292
- if (!response.ok) throw new Error(`OIDC userinfo request failed: ${response.status}`);
293
- return await response.json();
294
- },
295
- err: (error) => ({
296
- kind: "transport",
297
- error
298
- })
299
- }).pipe(Fx.chain((userInfo) => {
300
- const userInfoSubject = typeof userInfo.sub === "string" ? userInfo.sub : void 0;
301
- const tokenSubject = typeof opts.verifiedClaims.sub === "string" ? opts.verifiedClaims.sub : void 0;
302
- return userInfoSubject !== void 0 && tokenSubject !== void 0 && userInfoSubject !== tokenSubject ? Fx.fail({ kind: "subject-mismatch" }) : Fx.succeed({
303
- id: userInfoSubject ?? (typeof opts.verifiedClaims.sub === "string" ? opts.verifiedClaims.sub : void 0) ?? crypto.randomUUID(),
304
- email: typeof userInfo.email === "string" ? userInfo.email : opts.verifiedProfile.email,
305
- emailVerified: typeof userInfo.email_verified === "boolean" ? userInfo.email_verified : opts.verifiedProfile.emailVerified,
306
- name: typeof userInfo.name === "string" ? userInfo.name : opts.verifiedProfile.name,
307
- image: typeof userInfo.picture === "string" ? userInfo.picture : opts.verifiedProfile.image
308
- });
309
- }), Fx.recover((failure) => {
310
- if (failure.kind === "transport") return Fx.succeed(null);
311
- return Fx.fail(/* @__PURE__ */ new Error("OIDC userinfo subject does not match ID token subject."));
312
- }));
313
- }
314
- /** @internal */
315
- async function createEnterpriseOidcProvider(config, redirectUri) {
316
- const discovery = await discoverOidcConfiguration(config);
317
- const expectedIssuer = String(config.issuer ?? discovery.issuer).replace(/\/$/, "");
318
- const discoveredIssuer = String(discovery.issuer).replace(/\/$/, "");
319
- const strictIssuer = config.strictIssuer === true;
320
- if (typeof config.issuer === "string" && expectedIssuer !== discoveredIssuer) {
321
- if (strictIssuer) throw new Error(`Configured OIDC issuer mismatch. configured=${expectedIssuer} discovery=${discoveredIssuer}`);
322
- console.warn("Configured OIDC issuer differs from discovery issuer; accepting both for token verification.", {
323
- configuredIssuer: expectedIssuer,
324
- discoveryIssuer: discoveredIssuer
325
- });
326
- }
327
- const authorizationEndpoint = discovery.authorization_endpoint;
328
- const tokenEndpoint = discovery.token_endpoint;
329
- const jwksUri = String(config.jwksUri ?? discovery.jwks_uri);
330
- const supportedIdTokenSigningAlgs = Array.isArray(discovery.id_token_signing_alg_values_supported) ? discovery.id_token_signing_alg_values_supported.filter((value) => typeof value === "string") : [];
331
- const userinfoEndpoint = discovery.userinfo_endpoint ?? void 0;
332
- const oidcFetch = createEnterpriseOidcFetch(config, discovery.issuer);
333
- const scopes = Array.isArray(config.scopes) ? config.scopes.filter((value) => typeof value === "string") : [
334
- "openid",
335
- "profile",
336
- "email"
337
- ];
338
- const expectedAudience = config.audience ?? String(config.clientId);
339
- const getIssuerCandidates = (issuer) => {
340
- const candidates = [issuer];
341
- if (issuer.startsWith("https://")) candidates.push(`http://${issuer.slice(8)}`);
342
- else if (issuer.startsWith("http://")) candidates.push(`https://${issuer.slice(7)}`);
343
- return candidates;
344
- };
345
- const expectedIssuers = strictIssuer ? [expectedIssuer] : Array.from(new Set([...getIssuerCandidates(expectedIssuer), ...getIssuerCandidates(discoveredIssuer)]));
346
- const jwks = getOidcJwks(jwksUri, oidcFetch);
347
- let verifiedClaims = null;
348
- let verifiedProfile = null;
349
- const normalizeProfile = (claims) => ({
350
- id: typeof claims.sub === "string" ? claims.sub : crypto.randomUUID(),
351
- email: typeof claims.email === "string" ? claims.email : void 0,
352
- emailVerified: typeof claims.email_verified === "boolean" ? claims.email_verified : void 0,
353
- name: typeof claims.name === "string" ? claims.name : void 0,
354
- image: typeof claims.picture === "string" ? claims.picture : void 0
355
- });
356
- return {
357
- provider: {
358
- createAuthorizationURL(state, codeVerifier, requestedScopes) {
359
- const url = new URL(authorizationEndpoint);
360
- url.searchParams.set("response_type", "code");
361
- url.searchParams.set("client_id", String(config.clientId));
362
- url.searchParams.set("redirect_uri", redirectUri);
363
- url.searchParams.set("scope", (requestedScopes.length > 0 ? requestedScopes : scopes).join(" "));
364
- url.searchParams.set("state", state);
365
- url.searchParams.set("code_challenge_method", "S256");
366
- url.searchParams.set("code_challenge", encodeBase64urlNoPadding(sha256(new TextEncoder().encode(codeVerifier))));
367
- const authorizationParams = typeof config.authorizationParams === "object" && config.authorizationParams !== null ? config.authorizationParams : {};
368
- for (const [key, value] of Object.entries(authorizationParams)) if (typeof value === "string") url.searchParams.set(key, value);
369
- return url;
370
- },
371
- async validateAuthorizationCode(code, codeVerifier) {
372
- const body = new URLSearchParams({
373
- grant_type: "authorization_code",
374
- code,
375
- redirect_uri: redirectUri,
376
- client_id: String(config.clientId)
377
- });
378
- if (typeof config.clientSecret === "string") body.set("client_secret", config.clientSecret);
379
- if (codeVerifier) body.set("code_verifier", codeVerifier);
380
- const response = await oidcFetch(tokenEndpoint, {
381
- method: "POST",
382
- headers: { "Content-Type": "application/x-www-form-urlencoded" },
383
- body
384
- });
385
- if (!response.ok) throw new Error(`OIDC token exchange failed: ${response.status}`);
386
- const data = await response.json();
387
- return {
388
- data,
389
- idToken() {
390
- if (typeof data.id_token !== "string") throw new Error("OIDC response is missing id_token.");
391
- return data.id_token;
392
- },
393
- accessToken() {
394
- if (typeof data.access_token !== "string") throw new Error("OIDC response is missing access_token.");
395
- return data.access_token;
396
- }
397
- };
398
- }
399
- },
400
- oauthConfig: {
401
- scopes,
402
- nonce: true,
403
- validateTokens: async (tokens, ctx) => {
404
- const verified = await Fx.run(Fx.gen(function* () {
405
- yield* Fx.guard(ctx.nonce === void 0, Fx.fail(/* @__PURE__ */ new Error("OIDC nonce is required.")));
406
- const idToken = tokens.idToken();
407
- const tokenAlg = decodeProtectedHeader(idToken).alg;
408
- const useSymmetricValidation = typeof tokenAlg === "string" && (tokenAlg === "HS256" || tokenAlg === "HS384" || tokenAlg === "HS512") && supportedIdTokenSigningAlgs.includes(tokenAlg);
409
- const verificationOptions = {
410
- audience: expectedAudience,
411
- requiredClaims: [
412
- "iss",
413
- "sub",
414
- "aud",
415
- "exp",
416
- "iat"
417
- ],
418
- clockTolerance: config.clockToleranceSeconds ?? 10
419
- };
420
- const payload = (yield* Fx.from({
421
- ok: () => useSymmetricValidation ? jwtVerify(idToken, (() => {
422
- if (typeof config.clientSecret !== "string") throw new Error("OIDC provider uses symmetric ID token signatures but clientSecret is missing.");
423
- return new TextEncoder().encode(config.clientSecret);
424
- })(), verificationOptions) : jwtVerify(idToken, jwks, verificationOptions),
425
- err: (error) => error instanceof Error ? error : new Error(String(error))
426
- })).payload;
427
- const tokenIssuerRaw = typeof payload.iss === "string" ? payload.iss : void 0;
428
- const tokenIssuer = typeof tokenIssuerRaw === "string" ? tokenIssuerRaw.replace(/\/$/, "") : void 0;
429
- yield* Fx.guard(!tokenIssuer || !expectedIssuers.includes(tokenIssuer), Fx.fail(/* @__PURE__ */ new Error(`OIDC token issuer mismatch. Received: ${tokenIssuer ?? "<missing>"}. Expected one of: ${expectedIssuers.join(", ")}`)));
430
- yield* Fx.guard(payload.nonce !== ctx.nonce, Fx.fail(/* @__PURE__ */ new Error("OIDC nonce mismatch.")));
431
- yield* Fx.guard(Array.isArray(payload.aud) && payload.aud.length > 1 && payload.azp !== String(config.clientId), Fx.fail(/* @__PURE__ */ new Error("OIDC authorized party does not match client ID.")));
432
- return payload;
433
- }));
434
- verifiedClaims = verified;
435
- verifiedProfile = normalizeProfile(verified);
436
- },
437
- accountLinking: config.accountLinking,
438
- profile: async (tokens) => {
439
- if (verifiedProfile === null || verifiedClaims === null) {
440
- const claims = decodeIdToken(tokens.idToken());
441
- verifiedClaims = claims;
442
- verifiedProfile = normalizeProfile(claims);
443
- }
444
- if (userinfoEndpoint && typeof tokens.accessToken === "function") {
445
- const userInfoProfile = await Fx.run(userInfoProfileFx({
446
- endpoint: userinfoEndpoint,
447
- accessToken: tokens.accessToken(),
448
- verifiedClaims,
449
- verifiedProfile,
450
- fetchImpl: oidcFetch
451
- }));
452
- if (userInfoProfile !== null) return userInfoProfile;
453
- }
454
- return verifiedProfile;
455
- }
456
- }
457
- };
458
- }
459
- /** @internal */
460
- function createSyntheticOAuthMaterializedConfig(providerId, options) {
461
- return {
462
- id: providerId,
463
- type: "oauth",
464
- provider: null,
465
- scopes: [],
466
- accountLinking: options?.accountLinking ?? "verifiedEmail"
467
- };
468
- }
469
- /** @internal */
470
- function parseSamlIdpMetadata(metadata) {
471
- const entityMeta = IdentityProvider({ metadata }).entityMeta;
472
- const normalizeService = (value) => {
473
- return typeof value === "string" && value.length > 0 ? value : void 0;
474
- };
475
- return {
476
- issuer: entityMeta.getEntityID(),
477
- sso: {
478
- redirect: normalizeService(entityMeta.getSingleSignOnService("redirect")),
479
- post: normalizeService(entityMeta.getSingleSignOnService("post"))
480
- },
481
- slo: {
482
- redirect: normalizeService(entityMeta.getSingleLogoutService("redirect")),
483
- post: normalizeService(entityMeta.getSingleLogoutService("post"))
484
- },
485
- signingCert: entityMeta.getX509Certificate("signing"),
486
- encryptionCert: entityMeta.getX509Certificate("encrypt"),
487
- nameIdFormats: (() => {
488
- const nameIdFormat = entityMeta.getNameIDFormat();
489
- return Array.isArray(nameIdFormat) ? nameIdFormat : [];
490
- })(),
491
- wantsSignedAuthnRequests: entityMeta.isWantAuthnRequestsSigned()
492
- };
493
- }
494
- /** @internal */
495
- function createServiceProviderMetadata(opts) {
496
- const binding = Constants.namespace.binding;
497
- return ServiceProvider({
498
- entityID: opts.entityId,
499
- authnRequestsSigned: opts.authnRequestsSigned ?? false,
500
- privateKey: opts.privateKey,
501
- privateKeyPass: opts.privateKeyPass,
502
- signingCert: opts.signingCert,
503
- encryptCert: opts.encryptCert,
504
- encPrivateKey: opts.encPrivateKey,
505
- encPrivateKeyPass: opts.encPrivateKeyPass,
506
- assertionConsumerService: [{
507
- Binding: binding.post,
508
- Location: opts.acsUrl
509
- }],
510
- singleLogoutService: opts.sloUrl ? [{
511
- Binding: binding.redirect,
512
- Location: opts.sloUrl
513
- }, {
514
- Binding: binding.post,
515
- Location: opts.sloUrl
516
- }] : void 0
517
- }).getMetadata();
518
- }
519
- /** @internal */
520
- function createEnterpriseSamlMetadataXml(opts) {
521
- return createServiceProviderMetadata(getSamlServiceProviderOptions({
522
- rootUrl: opts.rootUrl,
523
- source: opts.source,
524
- config: opts.config
525
- }));
526
- }
527
- /** @internal */
528
- function getSamlServiceProviderOptions(opts) {
529
- const saml = getSamlConfig(opts.config);
530
- const sp = asRecord(saml.sp) ?? {};
531
- const urls = getEnterpriseSamlUrls({
532
- rootUrl: opts.rootUrl,
533
- source: opts.source
534
- });
535
- return {
536
- entityId: opts.overrides?.entityId ?? sp.entityId ?? urls.metadataUrl,
537
- acsUrl: opts.overrides?.acsUrl ?? sp.acsUrl ?? urls.acsUrl,
538
- sloUrl: opts.overrides?.sloUrl ?? sp.sloUrl ?? urls.sloUrl,
539
- relayState: opts.relayState,
540
- authnRequestsSigned: saml.signAuthnRequests,
541
- signingCert: sp.signingCert,
542
- encryptCert: sp.encryptCert,
543
- privateKey: sp.privateKey,
544
- privateKeyPass: sp.privateKeyPass,
545
- encPrivateKey: sp.encPrivateKey,
546
- encPrivateKeyPass: sp.encPrivateKeyPass
547
- };
548
- }
549
- /** @internal */
550
- function createSamlServiceProvider(opts) {
551
- const binding = Constants.namespace.binding;
552
- return ServiceProvider({
553
- entityID: opts.entityId,
554
- relayState: opts.relayState ?? "",
555
- authnRequestsSigned: opts.authnRequestsSigned ?? false,
556
- privateKey: opts.privateKey,
557
- privateKeyPass: opts.privateKeyPass,
558
- signingCert: opts.signingCert,
559
- encryptCert: opts.encryptCert,
560
- encPrivateKey: opts.encPrivateKey,
561
- encPrivateKeyPass: opts.encPrivateKeyPass,
562
- assertionConsumerService: [{
563
- Binding: binding.post,
564
- Location: opts.acsUrl
565
- }],
566
- singleLogoutService: opts.sloUrl ? [{
567
- Binding: binding.redirect,
568
- Location: opts.sloUrl
569
- }, {
570
- Binding: binding.post,
571
- Location: opts.sloUrl
572
- }] : void 0
573
- });
574
- }
575
- /** @internal */
576
- function createEnterpriseSamlRuntime(opts) {
577
- const saml = getSamlConfig(opts.config);
578
- const spOptions = getSamlServiceProviderOptions({
579
- rootUrl: opts.rootUrl,
580
- source: opts.source,
581
- config: opts.config,
582
- relayState: opts.relayState,
583
- overrides: opts.overrides
584
- });
585
- if (typeof saml.idp?.metadataXml !== "string") throw new Error("SAML IdP metadata is missing.");
586
- return {
587
- saml,
588
- sp: createSamlServiceProvider(spOptions),
589
- idp: IdentityProvider({ metadata: saml.idp.metadataXml }),
590
- urls: getEnterpriseSamlUrls({
591
- rootUrl: opts.rootUrl,
592
- source: opts.source
593
- })
594
- };
595
- }
596
- /** @internal */
597
- function createEnterpriseSamlSignInRequest(opts) {
598
- const runtime = createEnterpriseSamlRuntime({
599
- rootUrl: opts.rootUrl,
600
- source: opts.source,
601
- config: opts.config
602
- });
603
- const binding = runtime.saml.idp.sso?.redirect ? "redirect" : "post";
604
- const loginRequest = runtime.sp.createLoginRequest(runtime.idp, binding);
605
- const relayState = encodeEnterpriseSamlRelayState({
606
- source: opts.source,
607
- signature: opts.signature,
608
- requestId: loginRequest.id,
609
- state: opts.state,
610
- redirectTo: opts.redirectTo
611
- });
612
- return {
613
- requestId: loginRequest.id,
614
- binding,
615
- relayState,
616
- redirectUrl: binding === "redirect" ? (() => {
617
- const redirectUrl = new URL(loginRequest.context);
618
- redirectUrl.searchParams.set("RelayState", relayState);
619
- return redirectUrl.toString();
620
- })() : void 0,
621
- post: binding === "post" ? {
622
- endpoint: loginRequest.entityEndpoint,
623
- value: loginRequest.context
624
- } : void 0
625
- };
626
- }
627
- /** @internal */
628
- async function parseEnterpriseSamlLoginResponse(opts) {
629
- ensureSamlifyValidator();
630
- const httpRequest = await readEnterpriseSamlHttpRequest(opts.request);
631
- const runtime = createEnterpriseSamlRuntime({
632
- rootUrl: opts.rootUrl,
633
- source: opts.source,
634
- config: opts.config
635
- });
636
- const parsed = await runtime.sp.parseLoginResponse(runtime.idp, httpRequest.binding, {
637
- query: httpRequest.query,
638
- body: httpRequest.body
639
- });
640
- warnDeprecatedSamlAlgorithms(parsed);
641
- return {
642
- ...httpRequest,
643
- runtime,
644
- parsed,
645
- relayState: decodeEnterpriseSamlRelayStateOrThrow(httpRequest.relayState ?? null)
646
- };
647
- }
648
- const DEPRECATED_SAML_ALGORITHMS = new Set([
649
- "http://www.w3.org/2000/09/xmldsig#rsa-sha1",
650
- "http://www.w3.org/2000/09/xmldsig#dsa-sha1",
651
- "http://www.w3.org/2000/09/xmldsig#sha1",
652
- "http://www.w3.org/2001/04/xmlenc#rsa-1_5",
653
- "http://www.w3.org/2001/04/xmlenc#tripledes-cbc"
654
- ]);
655
- /**
656
- * Warn when the SAML response uses deprecated cryptographic algorithms
657
- * (SHA-1, RSA 1.5, 3DES). These are still accepted for compatibility
658
- * but should be flagged.
659
- */
660
- function warnDeprecatedSamlAlgorithms(parsed) {
661
- try {
662
- const sigAlg = parsed?.extract?.signature?.signatureAlgorithm ?? parsed?.extract?.response?.signatureAlgorithm;
663
- const digestAlg = parsed?.extract?.signature?.digestAlgorithm;
664
- if (sigAlg && DEPRECATED_SAML_ALGORITHMS.has(sigAlg)) console.warn(`[convex-auth] SAML response uses deprecated signature algorithm: ${sigAlg}. Consider upgrading your IdP to use RSA-SHA256 or stronger.`);
665
- if (digestAlg && DEPRECATED_SAML_ALGORITHMS.has(digestAlg)) console.warn(`[convex-auth] SAML response uses deprecated digest algorithm: ${digestAlg}. Consider upgrading your IdP to use SHA-256 or stronger.`);
666
- } catch {}
667
- }
668
- /** @internal */
669
- function validateEnterpriseSamlLoginRelayState(opts) {
670
- if (opts.relayState.source.kind !== opts.source.kind || opts.relayState.source.id !== opts.source.id || opts.relayState.requestId !== opts.inResponseTo) throw new Error("SAML RelayState did not match the pending login request.");
671
- }
672
- /** @internal */
673
- async function parseEnterpriseSamlLogoutMessage(opts) {
674
- ensureSamlifyValidator();
675
- const httpRequest = await readEnterpriseSamlHttpRequest(opts.request);
676
- const runtime = createEnterpriseSamlRuntime({
677
- rootUrl: opts.rootUrl,
678
- source: opts.source,
679
- config: opts.config,
680
- relayState: httpRequest.relayState
681
- });
682
- const parsedRequest = httpRequest.hasSamlRequest ? await runtime.sp.parseLogoutRequest(runtime.idp, httpRequest.binding, {
683
- query: httpRequest.query,
684
- body: httpRequest.body
685
- }) : void 0;
686
- return {
687
- ...httpRequest,
688
- runtime,
689
- parsedRequest
690
- };
691
- }
692
- /** @internal */
693
- async function createEnterpriseOidcRuntime(opts) {
694
- const providerId = enterpriseOidcProviderId(opts.enterpriseId);
695
- const urls = getEnterpriseOidcUrls({
696
- rootUrl: opts.rootUrl,
697
- enterpriseId: opts.enterpriseId
698
- });
699
- const { provider, oauthConfig } = await createEnterpriseOidcProvider(opts.oidc, urls.callbackUrl);
700
- return {
701
- oidc: opts.oidc,
702
- providerId,
703
- provider,
704
- oauthConfig,
705
- ...urls
706
- };
707
- }
708
- /** @internal */
709
- function profileFromSamlExtract(extract, mapping) {
710
- const attributes = typeof extract?.attributes === "object" && extract.attributes !== null ? extract.attributes : {};
711
- const resolveFirst = (...keys) => {
712
- for (const key of keys) {
713
- if (!key) continue;
714
- const attribute = attributes[key];
715
- const value = Array.isArray(attribute) ? attribute[0] : attribute;
716
- if (value !== void 0) return value;
717
- }
718
- };
719
- const fieldResolvers = {
720
- email: () => resolveFirst(mapping?.email),
721
- name: () => resolveFirst(mapping?.name) ?? ([resolveFirst(mapping?.firstName), resolveFirst(mapping?.lastName)].filter(Boolean).join(" ") || void 0),
722
- subject: () => resolveFirst(mapping?.subject) ?? extract?.nameID
723
- };
724
- const subject = fieldResolvers.subject();
725
- if (subject === void 0) throw new Error("SAML profile is missing a subject. Configure `attributeMapping.subject` or ensure the assertion includes a NameID.");
726
- const email = fieldResolvers.email();
727
- const name = fieldResolvers.name();
728
- return {
729
- id: subject,
730
- email,
731
- emailVerified: typeof email === "string" ? true : void 0,
732
- name,
733
- samlAttributes: attributes,
734
- samlSessionIndex: extract?.sessionIndex?.SessionIndex
735
- };
736
- }
737
- /** @internal */
738
- function parseScimPath(pathname) {
739
- const [api, auth, sso, enterpriseId, protocol, version, ...rest] = pathname.split("/").filter(Boolean);
740
- if (api !== "api" || auth !== "auth" || sso !== "sso" || !enterpriseId || enterpriseId === "setup" || protocol !== "scim" || version !== "v2") return {
741
- enterpriseId: "",
742
- resource: "",
743
- resourceId: void 0
744
- };
745
- return {
746
- enterpriseId,
747
- resource: rest[0] ?? "",
748
- resourceId: rest[1]
749
- };
750
- }
751
- /** @internal */
752
- function parseScimListRequest(url) {
753
- const startIndex = Math.max(1, Number(url.searchParams.get("startIndex") ?? "1"));
754
- const count = Math.min(100, Math.max(1, Number(url.searchParams.get("count") ?? "100")));
755
- const filterParam = url.searchParams.get("filter");
756
- return {
757
- startIndex,
758
- count,
759
- filter: filterParam ? (() => {
760
- const match = filterParam.match(/^([A-Za-z0-9_.]+)\s+eq\s+"([^"]+)"$/);
761
- if (!match) throw new Error("Unsupported SCIM filter.");
762
- return {
763
- attribute: match[1],
764
- value: match[2]
765
- };
766
- })() : void 0
767
- };
768
- }
769
- /** @internal */
770
- function scimJson(data, status = 200, headers) {
771
- const responseHeaders = new Headers({ "Content-Type": "application/scim+json" });
772
- if (headers) new Headers(headers).forEach((value, key) => {
773
- responseHeaders.set(key, value);
774
- });
775
- return new Response(JSON.stringify(data), {
776
- status,
777
- headers: responseHeaders
778
- });
779
- }
780
- /** @internal */
781
- function scimError(status, scimType, detail) {
782
- return scimJson({
783
- schemas: ["urn:ietf:params:scim:api:messages:2.0:Error"],
784
- status: String(status),
785
- scimType,
786
- detail
787
- }, status);
788
- }
789
- /** @internal */
790
- function serializeScimUser(args) {
791
- return {
792
- schemas: [SCIM_USER_SCHEMA_ID],
793
- id: args.id,
794
- externalId: args.externalId,
795
- meta: {
796
- resourceType: "User",
797
- location: args.location
798
- },
799
- userName: args.user.email ?? args.user.phone ?? args.user.name ?? args.id,
800
- active: args.active ?? true,
801
- name: args.user.name !== void 0 ? { formatted: args.user.name } : void 0,
802
- emails: typeof args.user.email === "string" ? [{
803
- value: args.user.email,
804
- primary: true
805
- }] : void 0,
806
- phoneNumbers: typeof args.user.phone === "string" ? [{
807
- value: args.user.phone,
808
- primary: true
809
- }] : void 0,
810
- displayName: args.user.name
811
- };
812
- }
813
- /** @internal */
814
- function serializeScimGroup(args) {
815
- return {
816
- schemas: [SCIM_GROUP_SCHEMA_ID],
817
- id: args.id,
818
- externalId: args.externalId,
819
- meta: {
820
- resourceType: "Group",
821
- location: args.location
822
- },
823
- displayName: args.group.name ?? args.id,
824
- members: args.members ?? []
825
- };
826
- }
827
-
828
- //#endregion
829
- export { ENTERPRISE_OIDC_PROVIDER_PREFIX, ENTERPRISE_SAML_PROVIDER_PREFIX, SCIM_GROUP_SCHEMA_ID, SCIM_USER_SCHEMA_ID, createEnterpriseOidcRuntime, createEnterpriseSamlMetadataXml, createEnterpriseSamlSignInRequest, createSamlPostBindingResponse, createServiceProviderMetadata, createSyntheticOAuthMaterializedConfig, encodeEnterpriseSamlRelayState, enterpriseOidcProviderId, enterpriseSamlProviderId, getEnterpriseOidcUrls, getOidcConfig, getPublicOidcConfig, getSamlConfig, getSamlServiceProviderOptions, isEnterpriseProviderId, isEnterpriseSamlSourceActive, normalizeDomain, normalizeEnterprisePolicy, parseEnterpriseSamlLoginResponse, parseEnterpriseSamlLogoutMessage, parseSamlIdpMetadata, parseScimListRequest, parseScimPath, patchEnterprisePolicy, profileFromSamlExtract, scimError, scimJson, serializeScimGroup, serializeScimUser, upsertProtocolConfig, validateEnterpriseSamlLoginRelayState, withOidcSecretState };
830
- //# sourceMappingURL=sso.js.map