@_mustachio/openauth 0.9.2 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (712) hide show
  1. package/dist/esm/adapters/d1/audit-log.js +15 -0
  2. package/dist/esm/adapters/d1/config-store.js +45 -0
  3. package/dist/esm/adapters/d1/index.js +12 -0
  4. package/dist/esm/adapters/d1/key-store.js +116 -0
  5. package/dist/esm/adapters/d1/method-store.js +52 -0
  6. package/dist/esm/adapters/d1/migrations.js +77 -0
  7. package/dist/esm/adapters/d1/session-store.js +134 -0
  8. package/dist/esm/adapters/d1/session.js +18 -0
  9. package/dist/esm/adapters/d1/token-store.js +140 -0
  10. package/dist/esm/adapters/durable-object/index.js +3 -0
  11. package/dist/esm/adapters/durable-object/session-store.js +139 -0
  12. package/dist/esm/adapters/durable-object/types.js +0 -0
  13. package/dist/esm/adapters/dynamo/audit-log.js +23 -0
  14. package/dist/esm/adapters/dynamo/client.js +0 -0
  15. package/dist/esm/adapters/dynamo/config-store.js +57 -0
  16. package/dist/esm/adapters/dynamo/index.js +10 -0
  17. package/dist/esm/adapters/dynamo/key-store.js +188 -0
  18. package/dist/esm/adapters/dynamo/method-store.js +72 -0
  19. package/dist/esm/adapters/dynamo/passkey-credential-store.js +83 -0
  20. package/dist/esm/adapters/dynamo/sdk.js +128 -0
  21. package/dist/esm/adapters/dynamo/session-store.js +173 -0
  22. package/dist/esm/adapters/dynamo/token-store.js +178 -0
  23. package/dist/esm/adapters/kms/in-memory-backing.js +28 -0
  24. package/dist/esm/adapters/kms/index.js +5 -0
  25. package/dist/esm/adapters/kms/key-store.js +129 -0
  26. package/dist/esm/adapters/kms/sdk.js +23 -0
  27. package/dist/esm/adapters/kms/types.js +0 -0
  28. package/dist/esm/adapters/kv/audit-log.js +21 -0
  29. package/dist/esm/adapters/kv/config-store.js +43 -0
  30. package/dist/esm/adapters/kv/index.js +5 -0
  31. package/dist/esm/adapters/kv/method-store.js +63 -0
  32. package/dist/esm/adapters/kv/types.js +0 -0
  33. package/dist/esm/adapters/memory/audit-log.js +16 -0
  34. package/dist/esm/adapters/memory/clock.js +5 -0
  35. package/dist/esm/adapters/memory/config-store.js +31 -0
  36. package/dist/esm/adapters/memory/index.js +10 -0
  37. package/dist/esm/adapters/memory/key-store.js +78 -0
  38. package/dist/esm/adapters/memory/method-store.js +43 -0
  39. package/dist/esm/adapters/memory/passkey-credential-store.js +53 -0
  40. package/dist/esm/adapters/memory/session-store.js +82 -0
  41. package/dist/esm/adapters/memory/token-store.js +91 -0
  42. package/dist/esm/adapters/postgres/audit-log.js +16 -0
  43. package/dist/esm/adapters/postgres/config-store.js +48 -0
  44. package/dist/esm/adapters/postgres/executor.js +21 -0
  45. package/dist/esm/adapters/postgres/index.js +13 -0
  46. package/dist/esm/adapters/postgres/key-store.js +191 -0
  47. package/dist/esm/adapters/postgres/method-store.js +61 -0
  48. package/dist/esm/adapters/postgres/migrations.js +111 -0
  49. package/dist/esm/adapters/postgres/passkey-credential-store.js +80 -0
  50. package/dist/esm/adapters/postgres/session-store.js +135 -0
  51. package/dist/esm/adapters/postgres/token-store.js +151 -0
  52. package/dist/esm/client.js +26 -10
  53. package/dist/esm/domain/audit.js +13 -0
  54. package/dist/esm/domain/authorize.js +212 -0
  55. package/dist/esm/domain/callback.js +173 -0
  56. package/dist/esm/domain/client-auth.js +61 -0
  57. package/dist/esm/domain/client-credentials.js +91 -0
  58. package/dist/esm/domain/crypto.js +97 -0
  59. package/dist/esm/domain/discovery.js +41 -0
  60. package/dist/esm/domain/introspect.js +51 -0
  61. package/dist/esm/domain/jwt.js +43 -0
  62. package/dist/esm/domain/method-cache.js +136 -0
  63. package/dist/esm/domain/method-dispatch.js +36 -0
  64. package/dist/esm/domain/method-route.js +108 -0
  65. package/dist/esm/domain/pkce.js +16 -0
  66. package/dist/esm/domain/refresh.js +91 -0
  67. package/dist/esm/domain/revoke.js +81 -0
  68. package/dist/esm/domain/state-envelope.js +80 -0
  69. package/dist/esm/domain/token-exchange.js +101 -0
  70. package/dist/esm/domain/token.js +205 -0
  71. package/dist/esm/domain/userinfo.js +27 -0
  72. package/dist/esm/http/context.js +7 -0
  73. package/dist/esm/http/cookies.js +98 -0
  74. package/dist/esm/http/errors.js +71 -0
  75. package/dist/esm/http/handlers/authorize.js +163 -0
  76. package/dist/esm/http/handlers/callback.js +53 -0
  77. package/dist/esm/http/handlers/metadata.js +34 -0
  78. package/dist/esm/http/handlers/method-route.js +87 -0
  79. package/dist/esm/http/handlers/revocation.js +98 -0
  80. package/dist/esm/http/handlers/token.js +167 -0
  81. package/dist/esm/http/handlers/userinfo.js +54 -0
  82. package/dist/esm/http/middleware/error.js +15 -0
  83. package/dist/esm/http/middleware/tenant.js +102 -0
  84. package/dist/esm/http/resolver.js +15 -0
  85. package/dist/esm/http/router.js +35 -0
  86. package/dist/esm/http/schemas/authorize.js +24 -0
  87. package/dist/esm/http/schemas/revocation.js +18 -0
  88. package/dist/esm/http/schemas/token.js +57 -0
  89. package/dist/esm/index.js +121 -9
  90. package/dist/esm/methods/code.js +221 -0
  91. package/dist/esm/methods/m2m.js +41 -0
  92. package/dist/esm/methods/oauth2-factory.js +84 -0
  93. package/dist/esm/methods/oauth2-generic.js +196 -0
  94. package/dist/esm/methods/oidc-generic.js +53 -0
  95. package/dist/esm/methods/passkey.js +275 -0
  96. package/dist/esm/methods/password-hash.js +79 -0
  97. package/dist/esm/methods/password.js +166 -0
  98. package/dist/esm/methods/providers/apple.js +29 -0
  99. package/dist/esm/methods/providers/cognito.js +37 -0
  100. package/dist/esm/methods/providers/discord.js +28 -0
  101. package/dist/esm/methods/providers/facebook.js +42 -0
  102. package/dist/esm/methods/providers/github.js +29 -0
  103. package/dist/esm/methods/providers/google.js +29 -0
  104. package/dist/esm/methods/providers/index.js +17 -0
  105. package/dist/esm/methods/providers/jumpcloud.js +27 -0
  106. package/dist/esm/methods/providers/keycloak.js +32 -0
  107. package/dist/esm/methods/providers/linkedin.js +28 -0
  108. package/dist/esm/methods/providers/microsoft.js +28 -0
  109. package/dist/esm/methods/providers/slack.js +30 -0
  110. package/dist/esm/methods/providers/spotify.js +28 -0
  111. package/dist/esm/methods/providers/twitch.js +28 -0
  112. package/dist/esm/methods/providers/x.js +28 -0
  113. package/dist/esm/methods/providers/yahoo.js +27 -0
  114. package/dist/esm/pkce.js +4 -16
  115. package/dist/esm/ports/audit-log.js +0 -0
  116. package/dist/esm/ports/config-store.js +0 -0
  117. package/dist/esm/ports/key-store.js +0 -0
  118. package/dist/esm/ports/method-store.js +0 -0
  119. package/dist/esm/ports/session-store.js +0 -0
  120. package/dist/esm/ports/token-store.js +0 -0
  121. package/dist/esm/types/authorization.js +0 -0
  122. package/dist/esm/types/error.js +65 -0
  123. package/dist/esm/types/flow.js +0 -0
  124. package/dist/esm/types/idp.js +0 -0
  125. package/dist/esm/types/method.js +0 -0
  126. package/dist/esm/types/picker.js +0 -0
  127. package/dist/esm/types/result.js +11 -0
  128. package/dist/esm/types/subject.js +0 -0
  129. package/dist/esm/types/tenant.js +5 -0
  130. package/dist/esm/types/token.js +0 -0
  131. package/dist/esm/ui/forms.js +253 -0
  132. package/dist/esm/ui/index.js +8 -0
  133. package/dist/esm/ui/picker.js +49 -0
  134. package/dist/types/adapters/d1/audit-log.d.ts +19 -0
  135. package/dist/types/adapters/d1/audit-log.d.ts.map +1 -0
  136. package/dist/types/adapters/d1/config-store.d.ts +20 -0
  137. package/dist/types/adapters/d1/config-store.d.ts.map +1 -0
  138. package/dist/types/adapters/d1/index.d.ts +35 -0
  139. package/dist/types/adapters/d1/index.d.ts.map +1 -0
  140. package/dist/types/adapters/d1/key-store.d.ts +17 -0
  141. package/dist/types/adapters/d1/key-store.d.ts.map +1 -0
  142. package/dist/types/adapters/d1/method-store.d.ts +21 -0
  143. package/dist/types/adapters/d1/method-store.d.ts.map +1 -0
  144. package/dist/types/adapters/d1/migrations.d.ts +18 -0
  145. package/dist/types/adapters/d1/migrations.d.ts.map +1 -0
  146. package/dist/types/adapters/d1/session-store.d.ts +20 -0
  147. package/dist/types/adapters/d1/session-store.d.ts.map +1 -0
  148. package/dist/types/adapters/d1/session.d.ts +18 -0
  149. package/dist/types/adapters/d1/session.d.ts.map +1 -0
  150. package/dist/types/adapters/d1/token-store.d.ts +29 -0
  151. package/dist/types/adapters/d1/token-store.d.ts.map +1 -0
  152. package/dist/types/adapters/d1/types.d.ts +43 -0
  153. package/dist/types/adapters/d1/types.d.ts.map +1 -0
  154. package/dist/types/adapters/durable-object/index.d.ts +17 -0
  155. package/dist/types/adapters/durable-object/index.d.ts.map +1 -0
  156. package/dist/types/adapters/durable-object/session-store.d.ts +21 -0
  157. package/dist/types/adapters/durable-object/session-store.d.ts.map +1 -0
  158. package/dist/types/adapters/durable-object/types.d.ts +23 -0
  159. package/dist/types/adapters/durable-object/types.d.ts.map +1 -0
  160. package/dist/types/adapters/dynamo/audit-log.d.ts +19 -0
  161. package/dist/types/adapters/dynamo/audit-log.d.ts.map +1 -0
  162. package/dist/types/adapters/dynamo/client.d.ts +111 -0
  163. package/dist/types/adapters/dynamo/client.d.ts.map +1 -0
  164. package/dist/types/adapters/dynamo/config-store.d.ts +21 -0
  165. package/dist/types/adapters/dynamo/config-store.d.ts.map +1 -0
  166. package/dist/types/adapters/dynamo/index.d.ts +60 -0
  167. package/dist/types/adapters/dynamo/index.d.ts.map +1 -0
  168. package/dist/types/adapters/dynamo/key-store.d.ts +23 -0
  169. package/dist/types/adapters/dynamo/key-store.d.ts.map +1 -0
  170. package/dist/types/adapters/dynamo/method-store.d.ts +20 -0
  171. package/dist/types/adapters/dynamo/method-store.d.ts.map +1 -0
  172. package/dist/types/adapters/dynamo/passkey-credential-store.d.ts +47 -0
  173. package/dist/types/adapters/dynamo/passkey-credential-store.d.ts.map +1 -0
  174. package/dist/types/adapters/dynamo/sdk.d.ts +23 -0
  175. package/dist/types/adapters/dynamo/sdk.d.ts.map +1 -0
  176. package/dist/types/adapters/dynamo/session-store.d.ts +20 -0
  177. package/dist/types/adapters/dynamo/session-store.d.ts.map +1 -0
  178. package/dist/types/adapters/dynamo/token-store.d.ts +29 -0
  179. package/dist/types/adapters/dynamo/token-store.d.ts.map +1 -0
  180. package/dist/types/adapters/kms/in-memory-backing.d.ts +9 -0
  181. package/dist/types/adapters/kms/in-memory-backing.d.ts.map +1 -0
  182. package/dist/types/adapters/kms/index.d.ts +35 -0
  183. package/dist/types/adapters/kms/index.d.ts.map +1 -0
  184. package/dist/types/adapters/kms/key-store.d.ts +20 -0
  185. package/dist/types/adapters/kms/key-store.d.ts.map +1 -0
  186. package/dist/types/adapters/kms/sdk.d.ts +16 -0
  187. package/dist/types/adapters/kms/sdk.d.ts.map +1 -0
  188. package/dist/types/adapters/kms/types.d.ts +58 -0
  189. package/dist/types/adapters/kms/types.d.ts.map +1 -0
  190. package/dist/types/adapters/kv/audit-log.d.ts +22 -0
  191. package/dist/types/adapters/kv/audit-log.d.ts.map +1 -0
  192. package/dist/types/adapters/kv/config-store.d.ts +25 -0
  193. package/dist/types/adapters/kv/config-store.d.ts.map +1 -0
  194. package/dist/types/adapters/kv/index.d.ts +21 -0
  195. package/dist/types/adapters/kv/index.d.ts.map +1 -0
  196. package/dist/types/adapters/kv/method-store.d.ts +23 -0
  197. package/dist/types/adapters/kv/method-store.d.ts.map +1 -0
  198. package/dist/types/adapters/kv/types.d.ts +28 -0
  199. package/dist/types/adapters/kv/types.d.ts.map +1 -0
  200. package/dist/types/adapters/memory/audit-log.d.ts +18 -0
  201. package/dist/types/adapters/memory/audit-log.d.ts.map +1 -0
  202. package/dist/types/adapters/memory/clock.d.ts +7 -0
  203. package/dist/types/adapters/memory/clock.d.ts.map +1 -0
  204. package/dist/types/adapters/memory/config-store.d.ts +19 -0
  205. package/dist/types/adapters/memory/config-store.d.ts.map +1 -0
  206. package/dist/types/adapters/memory/index.d.ts +15 -0
  207. package/dist/types/adapters/memory/index.d.ts.map +1 -0
  208. package/dist/types/adapters/memory/key-store.d.ts +17 -0
  209. package/dist/types/adapters/memory/key-store.d.ts.map +1 -0
  210. package/dist/types/adapters/memory/method-store.d.ts +26 -0
  211. package/dist/types/adapters/memory/method-store.d.ts.map +1 -0
  212. package/dist/types/adapters/memory/passkey-credential-store.d.ts +43 -0
  213. package/dist/types/adapters/memory/passkey-credential-store.d.ts.map +1 -0
  214. package/dist/types/adapters/memory/session-store.d.ts +19 -0
  215. package/dist/types/adapters/memory/session-store.d.ts.map +1 -0
  216. package/dist/types/adapters/memory/token-store.d.ts +28 -0
  217. package/dist/types/adapters/memory/token-store.d.ts.map +1 -0
  218. package/dist/types/adapters/postgres/audit-log.d.ts +18 -0
  219. package/dist/types/adapters/postgres/audit-log.d.ts.map +1 -0
  220. package/dist/types/adapters/postgres/config-store.d.ts +21 -0
  221. package/dist/types/adapters/postgres/config-store.d.ts.map +1 -0
  222. package/dist/types/adapters/postgres/executor.d.ts +48 -0
  223. package/dist/types/adapters/postgres/executor.d.ts.map +1 -0
  224. package/dist/types/adapters/postgres/index.d.ts +39 -0
  225. package/dist/types/adapters/postgres/index.d.ts.map +1 -0
  226. package/dist/types/adapters/postgres/key-store.d.ts +23 -0
  227. package/dist/types/adapters/postgres/key-store.d.ts.map +1 -0
  228. package/dist/types/adapters/postgres/method-store.d.ts +21 -0
  229. package/dist/types/adapters/postgres/method-store.d.ts.map +1 -0
  230. package/dist/types/adapters/postgres/migrations.d.ts +22 -0
  231. package/dist/types/adapters/postgres/migrations.d.ts.map +1 -0
  232. package/dist/types/adapters/postgres/passkey-credential-store.d.ts +48 -0
  233. package/dist/types/adapters/postgres/passkey-credential-store.d.ts.map +1 -0
  234. package/dist/types/adapters/postgres/session-store.d.ts +20 -0
  235. package/dist/types/adapters/postgres/session-store.d.ts.map +1 -0
  236. package/dist/types/adapters/postgres/token-store.d.ts +30 -0
  237. package/dist/types/adapters/postgres/token-store.d.ts.map +1 -0
  238. package/dist/types/client.d.ts +1 -1
  239. package/dist/types/client.d.ts.map +1 -1
  240. package/dist/types/domain/audit.d.ts +17 -0
  241. package/dist/types/domain/audit.d.ts.map +1 -0
  242. package/dist/types/domain/authorize.d.ts +125 -0
  243. package/dist/types/domain/authorize.d.ts.map +1 -0
  244. package/dist/types/domain/callback.d.ts +70 -0
  245. package/dist/types/domain/callback.d.ts.map +1 -0
  246. package/dist/types/domain/client-auth.d.ts +57 -0
  247. package/dist/types/domain/client-auth.d.ts.map +1 -0
  248. package/dist/types/domain/client-credentials.d.ts +52 -0
  249. package/dist/types/domain/client-credentials.d.ts.map +1 -0
  250. package/dist/types/domain/crypto.d.ts +53 -0
  251. package/dist/types/domain/crypto.d.ts.map +1 -0
  252. package/dist/types/domain/discovery.d.ts +44 -0
  253. package/dist/types/domain/discovery.d.ts.map +1 -0
  254. package/dist/types/domain/introspect.d.ts +71 -0
  255. package/dist/types/domain/introspect.d.ts.map +1 -0
  256. package/dist/types/domain/jwt.d.ts +48 -0
  257. package/dist/types/domain/jwt.d.ts.map +1 -0
  258. package/dist/types/domain/method-cache.d.ts +42 -0
  259. package/dist/types/domain/method-cache.d.ts.map +1 -0
  260. package/dist/types/domain/method-dispatch.d.ts +37 -0
  261. package/dist/types/domain/method-dispatch.d.ts.map +1 -0
  262. package/dist/types/domain/method-route.d.ts +77 -0
  263. package/dist/types/domain/method-route.d.ts.map +1 -0
  264. package/dist/types/domain/pkce.d.ts +15 -0
  265. package/dist/types/domain/pkce.d.ts.map +1 -0
  266. package/dist/types/domain/refresh.d.ts +43 -0
  267. package/dist/types/domain/refresh.d.ts.map +1 -0
  268. package/dist/types/domain/revoke.d.ts +61 -0
  269. package/dist/types/domain/revoke.d.ts.map +1 -0
  270. package/dist/types/domain/state-envelope.d.ts +30 -0
  271. package/dist/types/domain/state-envelope.d.ts.map +1 -0
  272. package/dist/types/domain/token-exchange.d.ts +67 -0
  273. package/dist/types/domain/token-exchange.d.ts.map +1 -0
  274. package/dist/types/domain/token.d.ts +100 -0
  275. package/dist/types/domain/token.d.ts.map +1 -0
  276. package/dist/types/domain/userinfo.d.ts +22 -0
  277. package/dist/types/domain/userinfo.d.ts.map +1 -0
  278. package/dist/types/http/context.d.ts +63 -0
  279. package/dist/types/http/context.d.ts.map +1 -0
  280. package/dist/types/http/cookies.d.ts +45 -0
  281. package/dist/types/http/cookies.d.ts.map +1 -0
  282. package/dist/types/http/errors.d.ts +36 -0
  283. package/dist/types/http/errors.d.ts.map +1 -0
  284. package/dist/types/http/handlers/authorize.d.ts +3 -0
  285. package/dist/types/http/handlers/authorize.d.ts.map +1 -0
  286. package/dist/types/http/handlers/callback.d.ts +3 -0
  287. package/dist/types/http/handlers/callback.d.ts.map +1 -0
  288. package/dist/types/http/handlers/metadata.d.ts +4 -0
  289. package/dist/types/http/handlers/metadata.d.ts.map +1 -0
  290. package/dist/types/http/handlers/method-route.d.ts +3 -0
  291. package/dist/types/http/handlers/method-route.d.ts.map +1 -0
  292. package/dist/types/http/handlers/revocation.d.ts +4 -0
  293. package/dist/types/http/handlers/revocation.d.ts.map +1 -0
  294. package/dist/types/http/handlers/token.d.ts +3 -0
  295. package/dist/types/http/handlers/token.d.ts.map +1 -0
  296. package/dist/types/http/handlers/userinfo.d.ts +3 -0
  297. package/dist/types/http/handlers/userinfo.d.ts.map +1 -0
  298. package/dist/types/http/middleware/error.d.ts +9 -0
  299. package/dist/types/http/middleware/error.d.ts.map +1 -0
  300. package/dist/types/http/middleware/tenant.d.ts +30 -0
  301. package/dist/types/http/middleware/tenant.d.ts.map +1 -0
  302. package/dist/types/http/resolver.d.ts +22 -0
  303. package/dist/types/http/resolver.d.ts.map +1 -0
  304. package/dist/types/http/router.d.ts +21 -0
  305. package/dist/types/http/router.d.ts.map +1 -0
  306. package/dist/types/http/schemas/authorize.d.ts +52 -0
  307. package/dist/types/http/schemas/authorize.d.ts.map +1 -0
  308. package/dist/types/http/schemas/revocation.d.ts +41 -0
  309. package/dist/types/http/schemas/revocation.d.ts.map +1 -0
  310. package/dist/types/http/schemas/token.d.ts +227 -0
  311. package/dist/types/http/schemas/token.d.ts.map +1 -0
  312. package/dist/types/index.d.ts +63 -13
  313. package/dist/types/index.d.ts.map +1 -1
  314. package/dist/types/methods/code.d.ts +96 -0
  315. package/dist/types/methods/code.d.ts.map +1 -0
  316. package/dist/types/methods/m2m.d.ts +41 -0
  317. package/dist/types/methods/m2m.d.ts.map +1 -0
  318. package/dist/types/methods/oauth2-factory.d.ts +133 -0
  319. package/dist/types/methods/oauth2-factory.d.ts.map +1 -0
  320. package/dist/types/methods/oauth2-generic.d.ts +75 -0
  321. package/dist/types/methods/oauth2-generic.d.ts.map +1 -0
  322. package/dist/types/methods/oidc-generic.d.ts +26 -0
  323. package/dist/types/methods/oidc-generic.d.ts.map +1 -0
  324. package/dist/types/methods/passkey.d.ts +106 -0
  325. package/dist/types/methods/passkey.d.ts.map +1 -0
  326. package/dist/types/methods/password-hash.d.ts +25 -0
  327. package/dist/types/methods/password-hash.d.ts.map +1 -0
  328. package/dist/types/methods/password.d.ts +70 -0
  329. package/dist/types/methods/password.d.ts.map +1 -0
  330. package/dist/types/methods/providers/apple.d.ts +29 -0
  331. package/dist/types/methods/providers/apple.d.ts.map +1 -0
  332. package/dist/types/methods/providers/cognito.d.ts +36 -0
  333. package/dist/types/methods/providers/cognito.d.ts.map +1 -0
  334. package/dist/types/methods/providers/discord.d.ts +22 -0
  335. package/dist/types/methods/providers/discord.d.ts.map +1 -0
  336. package/dist/types/methods/providers/facebook.d.ts +29 -0
  337. package/dist/types/methods/providers/facebook.d.ts.map +1 -0
  338. package/dist/types/methods/providers/github.d.ts +25 -0
  339. package/dist/types/methods/providers/github.d.ts.map +1 -0
  340. package/dist/types/methods/providers/google.d.ts +28 -0
  341. package/dist/types/methods/providers/google.d.ts.map +1 -0
  342. package/dist/types/methods/providers/index.d.ts +24 -0
  343. package/dist/types/methods/providers/index.d.ts.map +1 -0
  344. package/dist/types/methods/providers/jumpcloud.d.ts +22 -0
  345. package/dist/types/methods/providers/jumpcloud.d.ts.map +1 -0
  346. package/dist/types/methods/providers/keycloak.d.ts +30 -0
  347. package/dist/types/methods/providers/keycloak.d.ts.map +1 -0
  348. package/dist/types/methods/providers/linkedin.d.ts +22 -0
  349. package/dist/types/methods/providers/linkedin.d.ts.map +1 -0
  350. package/dist/types/methods/providers/microsoft.d.ts +30 -0
  351. package/dist/types/methods/providers/microsoft.d.ts.map +1 -0
  352. package/dist/types/methods/providers/slack.d.ts +25 -0
  353. package/dist/types/methods/providers/slack.d.ts.map +1 -0
  354. package/dist/types/methods/providers/spotify.d.ts +22 -0
  355. package/dist/types/methods/providers/spotify.d.ts.map +1 -0
  356. package/dist/types/methods/providers/twitch.d.ts +23 -0
  357. package/dist/types/methods/providers/twitch.d.ts.map +1 -0
  358. package/dist/types/methods/providers/x.d.ts +25 -0
  359. package/dist/types/methods/providers/x.d.ts.map +1 -0
  360. package/dist/types/methods/providers/yahoo.d.ts +22 -0
  361. package/dist/types/methods/providers/yahoo.d.ts.map +1 -0
  362. package/dist/types/pkce.d.ts +1 -2
  363. package/dist/types/pkce.d.ts.map +1 -1
  364. package/dist/types/ports/audit-log.d.ts +139 -0
  365. package/dist/types/ports/audit-log.d.ts.map +1 -0
  366. package/dist/types/ports/config-store.d.ts +32 -0
  367. package/dist/types/ports/config-store.d.ts.map +1 -0
  368. package/dist/types/ports/key-store.d.ts +98 -0
  369. package/dist/types/ports/key-store.d.ts.map +1 -0
  370. package/dist/types/ports/method-store.d.ts +29 -0
  371. package/dist/types/ports/method-store.d.ts.map +1 -0
  372. package/dist/types/ports/session-store.d.ts +82 -0
  373. package/dist/types/ports/session-store.d.ts.map +1 -0
  374. package/dist/types/ports/token-store.d.ts +93 -0
  375. package/dist/types/ports/token-store.d.ts.map +1 -0
  376. package/dist/types/types/authorization.d.ts +52 -0
  377. package/dist/types/types/authorization.d.ts.map +1 -0
  378. package/dist/types/types/error.d.ts +92 -0
  379. package/dist/types/types/error.d.ts.map +1 -0
  380. package/dist/types/types/flow.d.ts +87 -0
  381. package/dist/types/types/flow.d.ts.map +1 -0
  382. package/dist/types/types/idp.d.ts +234 -0
  383. package/dist/types/types/idp.d.ts.map +1 -0
  384. package/dist/types/types/method.d.ts +256 -0
  385. package/dist/types/types/method.d.ts.map +1 -0
  386. package/dist/types/types/picker.d.ts +31 -0
  387. package/dist/types/types/picker.d.ts.map +1 -0
  388. package/dist/types/types/result.d.ts +29 -0
  389. package/dist/types/types/result.d.ts.map +1 -0
  390. package/dist/types/types/subject.d.ts +47 -0
  391. package/dist/types/types/subject.d.ts.map +1 -0
  392. package/dist/types/types/tenant.d.ts +239 -0
  393. package/dist/types/types/tenant.d.ts.map +1 -0
  394. package/dist/types/types/token.d.ts +103 -0
  395. package/dist/types/types/token.d.ts.map +1 -0
  396. package/dist/types/ui/forms.d.ts +35 -0
  397. package/dist/types/ui/forms.d.ts.map +1 -0
  398. package/dist/types/ui/index.d.ts +14 -0
  399. package/dist/types/ui/index.d.ts.map +1 -0
  400. package/dist/types/ui/picker.d.ts +18 -0
  401. package/dist/types/ui/picker.d.ts.map +1 -0
  402. package/package.json +41 -6
  403. package/src/adapters/d1/audit-log.ts +32 -0
  404. package/src/adapters/d1/config-store.ts +67 -0
  405. package/src/adapters/d1/index.ts +41 -0
  406. package/src/adapters/d1/key-store.ts +218 -0
  407. package/src/adapters/d1/method-store.ts +103 -0
  408. package/src/adapters/d1/migrations.ts +89 -0
  409. package/src/adapters/d1/session-store.ts +230 -0
  410. package/src/adapters/d1/session.ts +38 -0
  411. package/src/adapters/d1/token-store.ts +251 -0
  412. package/src/adapters/d1/types.ts +53 -0
  413. package/src/adapters/durable-object/index.ts +23 -0
  414. package/src/adapters/durable-object/session-store.ts +227 -0
  415. package/src/adapters/durable-object/types.ts +25 -0
  416. package/src/adapters/dynamo/audit-log.ts +35 -0
  417. package/src/adapters/dynamo/client.ts +118 -0
  418. package/src/adapters/dynamo/config-store.ts +72 -0
  419. package/src/adapters/dynamo/index.ts +81 -0
  420. package/src/adapters/dynamo/key-store.ts +267 -0
  421. package/src/adapters/dynamo/method-store.ts +105 -0
  422. package/src/adapters/dynamo/passkey-credential-store.ts +132 -0
  423. package/src/adapters/dynamo/sdk.ts +189 -0
  424. package/src/adapters/dynamo/session-store.ts +229 -0
  425. package/src/adapters/dynamo/token-store.ts +248 -0
  426. package/src/adapters/kms/in-memory-backing.ts +36 -0
  427. package/src/adapters/kms/index.ts +39 -0
  428. package/src/adapters/kms/key-store.ts +176 -0
  429. package/src/adapters/kms/sdk.ts +39 -0
  430. package/src/adapters/kms/types.ts +61 -0
  431. package/src/adapters/kv/audit-log.ts +40 -0
  432. package/src/adapters/kv/config-store.ts +63 -0
  433. package/src/adapters/kv/index.ts +20 -0
  434. package/src/adapters/kv/method-store.ts +98 -0
  435. package/src/adapters/kv/types.ts +26 -0
  436. package/src/adapters/memory/audit-log.ts +28 -0
  437. package/src/adapters/memory/clock.ts +7 -0
  438. package/src/adapters/memory/config-store.ts +41 -0
  439. package/src/adapters/memory/index.ts +26 -0
  440. package/src/adapters/memory/key-store.ts +102 -0
  441. package/src/adapters/memory/method-store.ts +75 -0
  442. package/src/adapters/memory/passkey-credential-store.ts +97 -0
  443. package/src/adapters/memory/session-store.ts +128 -0
  444. package/src/adapters/memory/token-store.ts +165 -0
  445. package/src/adapters/postgres/audit-log.ts +34 -0
  446. package/src/adapters/postgres/config-store.ts +72 -0
  447. package/src/adapters/postgres/executor.ts +76 -0
  448. package/src/adapters/postgres/index.ts +60 -0
  449. package/src/adapters/postgres/key-store.ts +334 -0
  450. package/src/adapters/postgres/method-store.ts +104 -0
  451. package/src/adapters/postgres/migrations.ts +131 -0
  452. package/src/adapters/postgres/passkey-credential-store.ts +150 -0
  453. package/src/adapters/postgres/session-store.ts +216 -0
  454. package/src/adapters/postgres/token-store.ts +263 -0
  455. package/src/client.ts +50 -16
  456. package/src/domain/audit.ts +28 -0
  457. package/src/domain/authorize.ts +405 -0
  458. package/src/domain/callback.ts +263 -0
  459. package/src/domain/client-auth.ts +116 -0
  460. package/src/domain/client-credentials.ts +178 -0
  461. package/src/domain/crypto.ts +168 -0
  462. package/src/domain/discovery.ts +83 -0
  463. package/src/domain/introspect.ts +145 -0
  464. package/src/domain/jwt.ts +106 -0
  465. package/src/domain/method-cache.ts +220 -0
  466. package/src/domain/method-dispatch.ts +95 -0
  467. package/src/domain/method-route.ts +208 -0
  468. package/src/domain/pkce.ts +37 -0
  469. package/src/domain/refresh.ts +169 -0
  470. package/src/domain/revoke.ts +161 -0
  471. package/src/domain/state-envelope.ts +142 -0
  472. package/src/domain/token-exchange.ts +232 -0
  473. package/src/domain/token.ts +357 -0
  474. package/src/domain/userinfo.ts +56 -0
  475. package/src/http/context.ts +86 -0
  476. package/src/http/cookies.ts +167 -0
  477. package/src/http/errors.ts +98 -0
  478. package/src/http/handlers/authorize.ts +221 -0
  479. package/src/http/handlers/callback.ts +77 -0
  480. package/src/http/handlers/metadata.ts +44 -0
  481. package/src/http/handlers/method-route.ts +115 -0
  482. package/src/http/handlers/revocation.ts +151 -0
  483. package/src/http/handlers/token.ts +244 -0
  484. package/src/http/handlers/userinfo.ts +66 -0
  485. package/src/http/middleware/error.ts +26 -0
  486. package/src/http/middleware/tenant.ts +165 -0
  487. package/src/http/resolver.ts +34 -0
  488. package/src/http/router.ts +66 -0
  489. package/src/http/schemas/authorize.ts +58 -0
  490. package/src/http/schemas/revocation.ts +23 -0
  491. package/src/http/schemas/token.ts +85 -0
  492. package/src/index.ts +266 -20
  493. package/src/methods/code.ts +359 -0
  494. package/src/methods/m2m.ts +82 -0
  495. package/src/methods/oauth2-factory.ts +151 -0
  496. package/src/methods/oauth2-generic.ts +360 -0
  497. package/src/methods/oidc-generic.ts +109 -0
  498. package/src/methods/passkey.ts +419 -0
  499. package/src/methods/password-hash.ts +134 -0
  500. package/src/methods/password.ts +298 -0
  501. package/src/methods/providers/apple.ts +42 -0
  502. package/src/methods/providers/cognito.ts +55 -0
  503. package/src/methods/providers/discord.ts +37 -0
  504. package/src/methods/providers/facebook.ts +54 -0
  505. package/src/methods/providers/github.ts +42 -0
  506. package/src/methods/providers/google.ts +43 -0
  507. package/src/methods/providers/index.ts +23 -0
  508. package/src/methods/providers/jumpcloud.ts +36 -0
  509. package/src/methods/providers/keycloak.ts +42 -0
  510. package/src/methods/providers/linkedin.ts +37 -0
  511. package/src/methods/providers/microsoft.ts +42 -0
  512. package/src/methods/providers/slack.ts +42 -0
  513. package/src/methods/providers/spotify.ts +37 -0
  514. package/src/methods/providers/twitch.ts +38 -0
  515. package/src/methods/providers/x.ts +40 -0
  516. package/src/methods/providers/yahoo.ts +36 -0
  517. package/src/pkce.ts +20 -21
  518. package/src/ports/CONSISTENCY.md +88 -0
  519. package/src/ports/audit-log.ts +148 -0
  520. package/src/ports/config-store.ts +34 -0
  521. package/src/ports/key-store.ts +106 -0
  522. package/src/ports/method-store.ts +41 -0
  523. package/src/ports/session-store.ts +98 -0
  524. package/src/ports/token-store.ts +103 -0
  525. package/src/types/authorization.ts +53 -0
  526. package/src/types/error.ts +123 -0
  527. package/src/types/flow.ts +89 -0
  528. package/src/types/idp.ts +269 -0
  529. package/src/types/method.ts +270 -0
  530. package/src/types/picker.ts +32 -0
  531. package/src/types/result.ts +23 -0
  532. package/src/types/subject.ts +50 -0
  533. package/src/types/tenant.ts +248 -0
  534. package/src/types/token.ts +101 -0
  535. package/src/ui/forms.ts +289 -0
  536. package/src/ui/index.ts +14 -0
  537. package/src/ui/picker.ts +63 -0
  538. package/dist/esm/issuer.js +0 -691
  539. package/dist/esm/jwt.js +0 -16
  540. package/dist/esm/keys.js +0 -113
  541. package/dist/esm/provider/apple.js +0 -28
  542. package/dist/esm/provider/arctic.js +0 -43
  543. package/dist/esm/provider/code.js +0 -58
  544. package/dist/esm/provider/cognito.js +0 -16
  545. package/dist/esm/provider/discord.js +0 -15
  546. package/dist/esm/provider/facebook.js +0 -24
  547. package/dist/esm/provider/github.js +0 -15
  548. package/dist/esm/provider/google.js +0 -25
  549. package/dist/esm/provider/index.js +0 -3
  550. package/dist/esm/provider/jumpcloud.js +0 -15
  551. package/dist/esm/provider/keycloak.js +0 -15
  552. package/dist/esm/provider/linkedin.js +0 -15
  553. package/dist/esm/provider/m2m.js +0 -16
  554. package/dist/esm/provider/microsoft.js +0 -24
  555. package/dist/esm/provider/oauth2.js +0 -119
  556. package/dist/esm/provider/oidc.js +0 -69
  557. package/dist/esm/provider/passkey.js +0 -315
  558. package/dist/esm/provider/password.js +0 -306
  559. package/dist/esm/provider/provider.js +0 -10
  560. package/dist/esm/provider/slack.js +0 -15
  561. package/dist/esm/provider/spotify.js +0 -15
  562. package/dist/esm/provider/twitch.js +0 -15
  563. package/dist/esm/provider/x.js +0 -16
  564. package/dist/esm/provider/yahoo.js +0 -15
  565. package/dist/esm/random.js +0 -27
  566. package/dist/esm/storage/aws.js +0 -39
  567. package/dist/esm/storage/cloudflare.js +0 -42
  568. package/dist/esm/storage/dynamo.js +0 -116
  569. package/dist/esm/storage/memory.js +0 -88
  570. package/dist/esm/storage/storage.js +0 -36
  571. package/dist/esm/subject.js +0 -7
  572. package/dist/esm/ui/base.js +0 -407
  573. package/dist/esm/ui/code.js +0 -151
  574. package/dist/esm/ui/form.js +0 -43
  575. package/dist/esm/ui/icon.js +0 -92
  576. package/dist/esm/ui/passkey.js +0 -329
  577. package/dist/esm/ui/password.js +0 -338
  578. package/dist/esm/ui/select.js +0 -187
  579. package/dist/esm/ui/theme.js +0 -115
  580. package/dist/esm/util.js +0 -54
  581. package/dist/types/issuer.d.ts +0 -607
  582. package/dist/types/issuer.d.ts.map +0 -1
  583. package/dist/types/jwt.d.ts +0 -6
  584. package/dist/types/jwt.d.ts.map +0 -1
  585. package/dist/types/keys.d.ts +0 -18
  586. package/dist/types/keys.d.ts.map +0 -1
  587. package/dist/types/provider/apple.d.ts +0 -108
  588. package/dist/types/provider/apple.d.ts.map +0 -1
  589. package/dist/types/provider/arctic.d.ts +0 -16
  590. package/dist/types/provider/arctic.d.ts.map +0 -1
  591. package/dist/types/provider/code.d.ts +0 -74
  592. package/dist/types/provider/code.d.ts.map +0 -1
  593. package/dist/types/provider/cognito.d.ts +0 -64
  594. package/dist/types/provider/cognito.d.ts.map +0 -1
  595. package/dist/types/provider/discord.d.ts +0 -38
  596. package/dist/types/provider/discord.d.ts.map +0 -1
  597. package/dist/types/provider/facebook.d.ts +0 -74
  598. package/dist/types/provider/facebook.d.ts.map +0 -1
  599. package/dist/types/provider/github.d.ts +0 -38
  600. package/dist/types/provider/github.d.ts.map +0 -1
  601. package/dist/types/provider/google.d.ts +0 -74
  602. package/dist/types/provider/google.d.ts.map +0 -1
  603. package/dist/types/provider/index.d.ts +0 -4
  604. package/dist/types/provider/index.d.ts.map +0 -1
  605. package/dist/types/provider/jumpcloud.d.ts +0 -38
  606. package/dist/types/provider/jumpcloud.d.ts.map +0 -1
  607. package/dist/types/provider/keycloak.d.ts +0 -67
  608. package/dist/types/provider/keycloak.d.ts.map +0 -1
  609. package/dist/types/provider/linkedin.d.ts +0 -6
  610. package/dist/types/provider/linkedin.d.ts.map +0 -1
  611. package/dist/types/provider/m2m.d.ts +0 -34
  612. package/dist/types/provider/m2m.d.ts.map +0 -1
  613. package/dist/types/provider/microsoft.d.ts +0 -89
  614. package/dist/types/provider/microsoft.d.ts.map +0 -1
  615. package/dist/types/provider/oauth2.d.ts +0 -133
  616. package/dist/types/provider/oauth2.d.ts.map +0 -1
  617. package/dist/types/provider/oidc.d.ts +0 -91
  618. package/dist/types/provider/oidc.d.ts.map +0 -1
  619. package/dist/types/provider/passkey.d.ts +0 -143
  620. package/dist/types/provider/passkey.d.ts.map +0 -1
  621. package/dist/types/provider/password.d.ts +0 -210
  622. package/dist/types/provider/password.d.ts.map +0 -1
  623. package/dist/types/provider/provider.d.ts +0 -29
  624. package/dist/types/provider/provider.d.ts.map +0 -1
  625. package/dist/types/provider/slack.d.ts +0 -59
  626. package/dist/types/provider/slack.d.ts.map +0 -1
  627. package/dist/types/provider/spotify.d.ts +0 -38
  628. package/dist/types/provider/spotify.d.ts.map +0 -1
  629. package/dist/types/provider/twitch.d.ts +0 -38
  630. package/dist/types/provider/twitch.d.ts.map +0 -1
  631. package/dist/types/provider/x.d.ts +0 -38
  632. package/dist/types/provider/x.d.ts.map +0 -1
  633. package/dist/types/provider/yahoo.d.ts +0 -38
  634. package/dist/types/provider/yahoo.d.ts.map +0 -1
  635. package/dist/types/random.d.ts +0 -3
  636. package/dist/types/random.d.ts.map +0 -1
  637. package/dist/types/storage/aws.d.ts +0 -4
  638. package/dist/types/storage/aws.d.ts.map +0 -1
  639. package/dist/types/storage/cloudflare.d.ts +0 -34
  640. package/dist/types/storage/cloudflare.d.ts.map +0 -1
  641. package/dist/types/storage/dynamo.d.ts +0 -65
  642. package/dist/types/storage/dynamo.d.ts.map +0 -1
  643. package/dist/types/storage/memory.d.ts +0 -49
  644. package/dist/types/storage/memory.d.ts.map +0 -1
  645. package/dist/types/storage/storage.d.ts +0 -15
  646. package/dist/types/storage/storage.d.ts.map +0 -1
  647. package/dist/types/subject.d.ts +0 -122
  648. package/dist/types/subject.d.ts.map +0 -1
  649. package/dist/types/ui/base.d.ts +0 -5
  650. package/dist/types/ui/base.d.ts.map +0 -1
  651. package/dist/types/ui/code.d.ts +0 -104
  652. package/dist/types/ui/code.d.ts.map +0 -1
  653. package/dist/types/ui/form.d.ts +0 -6
  654. package/dist/types/ui/form.d.ts.map +0 -1
  655. package/dist/types/ui/icon.d.ts +0 -6
  656. package/dist/types/ui/icon.d.ts.map +0 -1
  657. package/dist/types/ui/passkey.d.ts +0 -5
  658. package/dist/types/ui/passkey.d.ts.map +0 -1
  659. package/dist/types/ui/password.d.ts +0 -139
  660. package/dist/types/ui/password.d.ts.map +0 -1
  661. package/dist/types/ui/select.d.ts +0 -55
  662. package/dist/types/ui/select.d.ts.map +0 -1
  663. package/dist/types/ui/theme.d.ts +0 -207
  664. package/dist/types/ui/theme.d.ts.map +0 -1
  665. package/dist/types/util.d.ts +0 -8
  666. package/dist/types/util.d.ts.map +0 -1
  667. package/src/css.d.ts +0 -4
  668. package/src/issuer.ts +0 -1628
  669. package/src/jwt.ts +0 -17
  670. package/src/keys.ts +0 -139
  671. package/src/provider/apple.ts +0 -127
  672. package/src/provider/arctic.ts +0 -66
  673. package/src/provider/code.ts +0 -227
  674. package/src/provider/cognito.ts +0 -74
  675. package/src/provider/discord.ts +0 -45
  676. package/src/provider/facebook.ts +0 -84
  677. package/src/provider/github.ts +0 -45
  678. package/src/provider/google.ts +0 -85
  679. package/src/provider/index.ts +0 -3
  680. package/src/provider/jumpcloud.ts +0 -45
  681. package/src/provider/keycloak.ts +0 -75
  682. package/src/provider/linkedin.ts +0 -12
  683. package/src/provider/m2m.ts +0 -56
  684. package/src/provider/microsoft.ts +0 -100
  685. package/src/provider/oauth2.ts +0 -297
  686. package/src/provider/oidc.ts +0 -179
  687. package/src/provider/passkey.ts +0 -655
  688. package/src/provider/password.ts +0 -672
  689. package/src/provider/provider.ts +0 -33
  690. package/src/provider/slack.ts +0 -67
  691. package/src/provider/spotify.ts +0 -45
  692. package/src/provider/twitch.ts +0 -45
  693. package/src/provider/x.ts +0 -46
  694. package/src/provider/yahoo.ts +0 -45
  695. package/src/random.ts +0 -24
  696. package/src/storage/aws.ts +0 -59
  697. package/src/storage/cloudflare.ts +0 -77
  698. package/src/storage/dynamo.ts +0 -193
  699. package/src/storage/memory.ts +0 -135
  700. package/src/storage/storage.ts +0 -46
  701. package/src/subject.ts +0 -130
  702. package/src/ui/base.tsx +0 -118
  703. package/src/ui/code.tsx +0 -215
  704. package/src/ui/form.tsx +0 -40
  705. package/src/ui/icon.tsx +0 -95
  706. package/src/ui/passkey.tsx +0 -321
  707. package/src/ui/password.tsx +0 -405
  708. package/src/ui/select.tsx +0 -221
  709. package/src/ui/theme.ts +0 -319
  710. package/src/ui/ui.css +0 -252
  711. package/src/util.ts +0 -58
  712. /package/dist/esm/{css.d.js → adapters/d1/types.js} +0 -0
@@ -0,0 +1,269 @@
1
+ /**
2
+ * Public-surface types for `createIdP` — the user-facing options object,
3
+ * the returned handle, the `success` callback contract, and observation
4
+ * hook event shapes.
5
+ */
6
+ import type { AuditLog } from "../ports/audit-log"
7
+ import type { ConfigStore } from "../ports/config-store"
8
+ import type { KeyStore } from "../ports/key-store"
9
+ import type { MethodStore } from "../ports/method-store"
10
+ import type { SessionStore } from "../ports/session-store"
11
+ import type { TokenStore } from "../ports/token-store"
12
+
13
+ import type { AuthError } from "./error"
14
+ import type { AnyAuthMethodFactory } from "./method"
15
+ import type { Result } from "./result"
16
+ import type { SubjectClaim, SubjectSchema } from "./subject"
17
+ import type {
18
+ StateKeyRing,
19
+ TenantContext,
20
+ TenantId,
21
+ ThemeConfig,
22
+ } from "./tenant"
23
+ import type { PickerContext, PickerMethod } from "./picker"
24
+
25
+ /**
26
+ * Input handed to the user's `success` callback. The framework provides
27
+ * everything needed to map the upstream / credential result into the
28
+ * issued subject.
29
+ *
30
+ * `methodKind` tells you **which provider** produced the result (e.g.
31
+ * `"google"`); `methodId` tells you **which tenant-local instance** of
32
+ * that provider was used (e.g. `"google-workspace"` vs
33
+ * `"google-personal"`). Use `methodKind` for provider-specific branches;
34
+ * use `methodId` for instance-specific routing.
35
+ */
36
+ export type SuccessMapInput = {
37
+ tenant: TenantContext
38
+ methodId: string
39
+ methodKind: string
40
+ /** Upstream system's stable identifier (from `MethodResult.success`). */
41
+ providerSubject: string
42
+ /** Typed per method via the factory's `P` generic at the call site. */
43
+ properties: unknown
44
+ context: Record<string, unknown> | null
45
+ }
46
+
47
+ /**
48
+ * Optional observation hook payload — fires after the subject claim has
49
+ * already been minted. **Does not** influence the issued subject; use it
50
+ * for audit, analytics, side effects only.
51
+ */
52
+ export type SuccessEvent = SuccessMapInput & {
53
+ /** The final subject claim that became the JWT `sub`. */
54
+ claim: SubjectClaim
55
+ }
56
+
57
+ /**
58
+ * Optional observation hook payload — fires on a failed auth attempt.
59
+ * Carries enough id information for operators to find the offending flow
60
+ * / config row without leaking secrets.
61
+ */
62
+ export type FailureEvent = {
63
+ tenantId: TenantId | null
64
+ clientId: string | null
65
+ methodId?: string
66
+ methodKind?: string
67
+ flowId?: string
68
+ error: AuthError
69
+ }
70
+
71
+ /**
72
+ * Optional hook called at `/token` time, after PKCE has succeeded and
73
+ * after the `success` callback has produced a `SubjectClaim`, but
74
+ * **before** the access/refresh response is returned. Use this when you
75
+ * prefer not to persist upstream tokens in the code payload itself (see
76
+ * the "alternative split" note in the plan §"Code payload
77
+ * confidentiality"). If it throws, the IdP responds with OAuth
78
+ * `server_error` and the token issuance is aborted.
79
+ */
80
+ export type PersistUpstreamTokens = (input: {
81
+ tenant: TenantContext
82
+ methodId: string
83
+ methodKind: string
84
+ providerSubject: string
85
+ properties: unknown
86
+ subjectClaim: SubjectClaim
87
+ }) => Promise<void>
88
+
89
+ /**
90
+ * Optional hook called for RFC 8693 token-exchange requests at
91
+ * `/token`. The host decides whether the authenticated subject can
92
+ * obtain a token scoped to `request.audience` (a new tenant), and
93
+ * returns either:
94
+ *
95
+ * - the `SubjectClaim` representing the subject's identity at the
96
+ * new audience (often the same shape but different `properties` —
97
+ * e.g. a different role), or
98
+ * - an `AuthError` (typically `authError.invalidTarget(...)` if the
99
+ * subject can't access that audience).
100
+ *
101
+ * If this hook is not supplied, token-exchange requests are rejected
102
+ * with `unsupported_grant_type`. This is the graceful-degradation
103
+ * default — the grant simply isn't enabled.
104
+ *
105
+ * The library does NOT inspect the audience string; it's an opaque
106
+ * `TenantId` that the host's `ConfigStore` must be able to resolve.
107
+ */
108
+ export type ExchangeAudience = (
109
+ currentClaim: SubjectClaim,
110
+ request: {
111
+ /** The target tenant id (RFC 8693 `audience`). Opaque to the library. */
112
+ audience: string
113
+ /** Subset of subject_token scopes the caller asked for. */
114
+ requestedScopes?: string[]
115
+ /** The authenticated client doing the exchange. */
116
+ clientId: string
117
+ /** Tenant the subject_token came from. */
118
+ fromTenantId: string
119
+ },
120
+ ) => Promise<SubjectClaim | AuthError>
121
+
122
+ /**
123
+ * Optional override for the default provider picker shown when an
124
+ * `/authorize` request has multiple enabled methods and no `method_id`.
125
+ *
126
+ * The library ships a minimal styled default (see `src/ui/picker.ts`);
127
+ * supply this to render a fully custom selection screen. The returned
128
+ * `Response` is sent as-is; the framework applies `cache-control: no-store`
129
+ * unless the response already sets a `Cache-Control` header.
130
+ */
131
+ export type RenderPicker = (
132
+ methods: PickerMethod[],
133
+ ctx: PickerContext,
134
+ ) => Response | Promise<Response>
135
+
136
+ export type IdPOptions = {
137
+ /**
138
+ * Tenant resolution for the first request in a flow. Not consulted on
139
+ * callbacks — the framework recovers `(tenantId, flowId)` from the
140
+ * MAC-bound state envelope, partitioned host, or `flowId`-in-URI
141
+ * mechanism (see plan §"Tenant Recovery Across Redirects").
142
+ */
143
+ resolveTenant: (req: Request) => Promise<Result<TenantId, AuthError>>
144
+
145
+ /** Opt-in for partitioned callback hosts (recovery mechanism #2). */
146
+ callbackHostFor?: (tenantId: TenantId) => string
147
+
148
+ /**
149
+ * HMAC-SHA-256 key ring used to MAC the minimal state envelope. The
150
+ * envelope carries only `{ tenantId, flowId, nonce, kid }` — never
151
+ * sensitive data — so a global ring is acceptable and necessary
152
+ * (tenant config can't be loaded until we know the tenant). Operators
153
+ * who prefer storing the ring inside `KeyStore` can use the
154
+ * `loadStateKeyRingFromKeyStore` helper.
155
+ *
156
+ * REQUIRED.
157
+ */
158
+ stateKeys: StateKeyRing
159
+
160
+ configStore: ConfigStore
161
+ tokenStore: TokenStore
162
+ keyStore: KeyStore
163
+ /** Required: flow records need strong CAS / atomic delete-on-read. */
164
+ sessionStore: SessionStore
165
+ /** Optional but recommended for any production deployment. */
166
+ auditLog?: AuditLog
167
+ /** Optional — falls back to `ConfigStore` for `MethodConfig` lookups. */
168
+ methodStore?: MethodStore
169
+
170
+ /** Issuer URL. Function form lets multi-tenant deployments derive it per request. */
171
+ issuerUrl: string | ((req: Request) => string)
172
+
173
+ /**
174
+ * Available method factories. **The KEY of this record MUST equal
175
+ * `factory.kind`.** `createIdP` throws on construction if any key
176
+ * disagrees with its factory's declared `kind`, with a list of
177
+ * offending keys in the error message.
178
+ */
179
+ methods: Record<string, AnyAuthMethodFactory>
180
+
181
+ subjects: SubjectSchema
182
+
183
+ /**
184
+ * REQUIRED. Maps method result → issued subject. Runs at `/token` time,
185
+ * after PKCE check, with the same conceptual role as the existing
186
+ * `auth.success` callback in `issuer.ts`.
187
+ */
188
+ success: (input: SuccessMapInput) => Promise<SubjectClaim>
189
+
190
+ theme?: ThemeConfig
191
+
192
+ hooks?: {
193
+ /** Observation only — does NOT influence the subject. */
194
+ onSuccess?: (event: SuccessEvent) => Promise<void>
195
+ onFailure?: (event: FailureEvent) => Promise<void>
196
+ }
197
+
198
+ /**
199
+ * Optional escape hatch for high-sensitivity deployments — see the
200
+ * `PersistUpstreamTokens` type doc.
201
+ */
202
+ persistUpstreamTokens?: PersistUpstreamTokens
203
+
204
+ /**
205
+ * Optional RFC 8693 token-exchange hook. If absent, exchange
206
+ * requests at `/token` return `unsupported_grant_type`. See the
207
+ * `ExchangeAudience` type doc for the contract.
208
+ */
209
+ exchangeAudience?: ExchangeAudience
210
+
211
+ /**
212
+ * Optional override for the default provider picker. See `RenderPicker`.
213
+ */
214
+ renderPicker?: RenderPicker
215
+
216
+ /**
217
+ * Optional hook that builds the `TenantContext.request.custom` blob for
218
+ * each request the framework processes (the initial `/authorize`, the
219
+ * `/cb/*` callback, and any subsequent direct token endpoint hit).
220
+ *
221
+ * The returned record flows through to methods' `MethodContext`, to the
222
+ * `success` callback's `SuccessMapInput.context`, and to authorize-time
223
+ * `FlowRecord.context` (which is then re-presented on the
224
+ * `/cb/*` side as the flow proceeds). Typical contents: a request id,
225
+ * decoded JWT claims from a host edge layer, mTLS cert info, geo
226
+ * hints — anything per-request the host wants methods or `success` to
227
+ * see.
228
+ *
229
+ * Without this hook, `tenant.request.custom` is `{}` and
230
+ * `SuccessMapInput.context` is `null`. There is no semantic difference
231
+ * between an absent hook and one that returns `{}`.
232
+ */
233
+ buildCustomContext?: (
234
+ req: Request,
235
+ ) => Record<string, unknown> | Promise<Record<string, unknown>>
236
+
237
+ /**
238
+ * Optional override for the framework's `Set-Cookie` defaults.
239
+ *
240
+ * Production deployments should rely on the built-in defaults
241
+ * (`secure: true`, no domain, `path: "/"`). Local development over plain
242
+ * HTTP — where Chrome rejects `Secure` cookies — can pass
243
+ * `cookies: { secure: false }` so the `idp.flow` / `auth.*` cookies
244
+ * round-trip on `localhost`. `domain` and `path` are passed through to
245
+ * every framework-issued cookie that doesn't set them itself.
246
+ */
247
+ cookies?: {
248
+ secure?: boolean
249
+ domain?: string
250
+ path?: string
251
+ }
252
+ }
253
+
254
+ /**
255
+ * The returned IdP handle. `handle(req)` is the single fetch-style
256
+ * entrypoint suitable for `export default { fetch: idp.handle }` on
257
+ * Cloudflare Workers; the per-endpoint primitives are exposed for
258
+ * embedding inside a larger app (e.g. mounting alongside admin routes).
259
+ */
260
+ export type IdP = {
261
+ handle: (req: Request) => Promise<Response>
262
+ authorize: (req: Request) => Promise<Response>
263
+ token: (req: Request) => Promise<Response>
264
+ userinfo: (req: Request) => Promise<Response>
265
+ jwks: (req: Request) => Promise<Response>
266
+ discovery: (req: Request) => Promise<Response>
267
+ revoke: (req: Request) => Promise<Response>
268
+ introspect: (req: Request) => Promise<Response>
269
+ }
@@ -0,0 +1,270 @@
1
+ /**
2
+ * `AuthMethod` — the core pluggable authentication abstraction.
3
+ *
4
+ * AD2: methods are **data + handler functions**, not framework modules. They
5
+ * depend on Web Fetch `Request`/`Response` (Web standards available on every
6
+ * runtime) and on a small `MethodContext` of plain data. The full allowed
7
+ * import set for files under `src/methods/` is `src/types/`,
8
+ * `src/domain/crypto`, `src/ui/forms`, sibling `src/methods/*`, and
9
+ * method-specific third-party libraries (e.g. `zod`,
10
+ * `@simplewebauthn/server`); methods MUST NOT import from `src/http/`,
11
+ * `src/adapters/`, or `src/ports/`, and never from Hono or any other HTTP
12
+ * framework. This `types/method.ts` file in particular is enforced
13
+ * framework-import-free by CI lint. See ARCHITECTURE.md §"Methods plug
14
+ * in alongside this stack" for the full contract.
15
+ *
16
+ * Cookies and other policy-sensitive response headers are returned as data
17
+ * (`SetCookie[]`, `CachePolicy`) and applied to the final `Response` by the
18
+ * HTTP layer. The HTTP layer also strips a fixed allowlist-violating set of
19
+ * headers from method-returned `Response` instances (`Set-Cookie`, security
20
+ * headers, `Cache-Control`) so methods cannot bypass framework policy. See
21
+ * `ARCHITECTURE.md` §"Response sanitization".
22
+ */
23
+ import type { v1 } from "@standard-schema/spec"
24
+
25
+ import type { AuthError } from "./error"
26
+ import type { FlowRecord } from "./flow"
27
+ import type { Result } from "./result"
28
+ import type { MethodType, TenantContext, TenantId } from "./tenant"
29
+
30
+ /**
31
+ * A built, ready-to-dispatch auth method instance for a particular tenant.
32
+ *
33
+ * Generics:
34
+ * - `P`: properties type emitted to the user's `success` callback on a
35
+ * successful authentication. Typed per method.
36
+ * - `S`: method-private state stashed in `FlowRecord.methodState`. Opaque
37
+ * to the framework; the method reads and writes it through
38
+ * `MethodContext.methodState` and `MethodResult.challenge.saveMethodState`.
39
+ */
40
+ export type AuthMethod<P = unknown, S = unknown> = {
41
+ /**
42
+ * Tenant-local instance id. Populated by the factory from
43
+ * `MethodConfig.id`. The framework dispatches URL routes by this value.
44
+ */
45
+ id: string
46
+ /**
47
+ * Factory kind. Populated by the factory from `MethodConfig.kind`. Used to
48
+ * tell the user's `success` callback which provider produced the result.
49
+ */
50
+ kind: string
51
+ type: MethodType
52
+ /**
53
+ * Routes the method declares. Key format: `"GET /authorize"`,
54
+ * `"POST /callback"`, etc. The HTTP layer mounts these under
55
+ * `/<AuthMethod.id>/*` (tenant-local instance id, so two instances of the
56
+ * same factory get distinct URL spaces).
57
+ */
58
+ routes: Record<string, MethodHandler<P, S>>
59
+ /**
60
+ * Token-exchange function for the `/token` endpoint when the method
61
+ * participates in client-credentials-style flows (e.g. `m2m`). Most
62
+ * redirect-based methods do not set this.
63
+ */
64
+ client?: ClientFn<P>
65
+ }
66
+
67
+ export type MethodHandler<P, S> = (
68
+ ctx: MethodContext<S>,
69
+ ) => Promise<MethodResult<P, S>>
70
+
71
+ /**
72
+ * Per-request context handed to a method handler.
73
+ *
74
+ * Methods **do not** receive raw `MethodConfig.config`. The factory captured
75
+ * the validated config via closure in `build`, so the handler only sees
76
+ * request-scoped data here.
77
+ *
78
+ * `cookies` is `ReadonlyMap` because methods don't get to mutate the
79
+ * incoming cookie jar — they return `SetCookie[]` instructions and the
80
+ * framework applies them.
81
+ */
82
+ export type MethodContext<S = unknown> = {
83
+ /** The raw Web Fetch `Request`. Web standard, not Hono `Context`. */
84
+ request: Request
85
+ /** Path within the method's mount, e.g. `"/callback"` (without the `/<id>` prefix). */
86
+ subPath: string
87
+ tenant: TenantContext
88
+ /** `null` while `/authorize` is being initiated; populated on callback. */
89
+ flow: FlowRecord | null
90
+ /**
91
+ * Shortcut to `flow?.methodState`, narrowed to this method's `S` generic.
92
+ * `null` when there is no flow yet or no state has been written.
93
+ */
94
+ methodState: S | null
95
+ /** Parsed cookies from the incoming `Request`. Read-only. */
96
+ cookies: ReadonlyMap<string, string>
97
+ /**
98
+ * Framework-supplied dispatch data. Populated for the `GET /authorize`
99
+ * initiation so the method can build an upstream redirect carrying the
100
+ * framework-minted state envelope; `null` for callback handlers (the
101
+ * framework has already verified `state` and the flow record by then,
102
+ * and the relevant data is on `flow`).
103
+ */
104
+ dispatch: MethodDispatchData | null
105
+ }
106
+
107
+ /** Framework-supplied data available to the method at `/authorize` time. */
108
+ export type MethodDispatchData = {
109
+ /**
110
+ * The MAC-signed state envelope the method must include in any upstream
111
+ * redirect. Opaque to the method.
112
+ */
113
+ state: string
114
+ /**
115
+ * Fully qualified callback URL the upstream provider should redirect to.
116
+ * Methods include this as `redirect_uri` (OAuth) or its equivalent.
117
+ */
118
+ callbackUrl: string
119
+ /** The issuer URL of this IdP. Methods may include in upstream OIDC requests. */
120
+ issuerUrl: string
121
+ }
122
+
123
+ /**
124
+ * Discriminated union returned by a `MethodHandler`. The HTTP layer applies
125
+ * the result: rendering the challenge response, kicking off token issuance
126
+ * on success, or surfacing the error.
127
+ */
128
+ export type MethodResult<P = unknown, S = unknown> =
129
+ /**
130
+ * Render UI / redirect to upstream / otherwise pause the flow waiting for
131
+ * the user agent. `setCookies` is applied via the framework's serializer
132
+ * (which enforces `Secure`, `SameSite`, `HttpOnly` defaults).
133
+ * `saveMethodState` is merged into `FlowRecord.methodState` and persisted
134
+ * **before** the response is sent — the user agent never sees the
135
+ * upstream redirect until the upstream verifier / nonce / state is
136
+ * durably saved.
137
+ */
138
+ | {
139
+ kind: "challenge"
140
+ /** Body + non-policy headers. Policy-sensitive headers are stripped. */
141
+ response: Response
142
+ setCookies?: SetCookie[]
143
+ saveMethodState?: S
144
+ /** Serialized into a `Cache-Control` header by the framework. */
145
+ cache?: CachePolicy
146
+ }
147
+ /**
148
+ * Authentication succeeded. The HTTP layer hands `providerSubject` +
149
+ * `properties` to the user's `IdPOptions.success` callback to mint the
150
+ * final `SubjectClaim`. Methods never construct the final subject.
151
+ */
152
+ | {
153
+ kind: "success"
154
+ /** Upstream system's stable identifier for the authenticated principal. */
155
+ providerSubject: string
156
+ properties: P
157
+ setCookies?: SetCookie[]
158
+ }
159
+ /** User refused / failed auth in a non-error way (e.g. consent declined). */
160
+ | { kind: "denied"; reason: string; setCookies?: SetCookie[] }
161
+ /** Method hit an error. The HTTP layer maps to a standards-compliant response. */
162
+ | { kind: "error"; error: AuthError }
163
+
164
+ /**
165
+ * Cache policy for `MethodResult.challenge`. Methods do **not** set
166
+ * `Cache-Control` directly — the framework strips that header from any
167
+ * method-returned `Response`. Opt in to caching via this typed field; the
168
+ * framework serializes it.
169
+ */
170
+ export type CachePolicy = {
171
+ /** Seconds. `0` ≡ `no-store`. Default for auth UI. */
172
+ maxAge?: number
173
+ /** Shared (CDN) cache TTL. */
174
+ sMaxAge?: number
175
+ /** Adds `Cache-Control: private`. */
176
+ isPrivate?: boolean
177
+ /** For static assets only. */
178
+ immutable?: boolean
179
+ }
180
+
181
+ /**
182
+ * Cookie instruction returned from a method, applied by the framework's
183
+ * cookie serializer. Defaults enforced: `Secure` in production, `SameSite`
184
+ * defaults to `Lax`, `HttpOnly` defaults to true for any cookie name in the
185
+ * framework's reserved namespace (`auth.*` / `idp.*`).
186
+ */
187
+ export type SetCookie = {
188
+ name: string
189
+ /** `null` clears the cookie (`Max-Age=0`). */
190
+ value: string | null
191
+ maxAge?: number
192
+ path?: string
193
+ domain?: string
194
+ httpOnly?: boolean
195
+ secure?: boolean
196
+ sameSite?: "lax" | "strict" | "none"
197
+ }
198
+
199
+ /**
200
+ * Token-exchange function for methods that participate in `/token`
201
+ * (currently just `m2m`). Returns the same `P` properties shape as a
202
+ * `MethodResult.success`.
203
+ */
204
+ export type ClientFn<P> = (input: {
205
+ clientID: string
206
+ clientSecret: string
207
+ params: Record<string, string>
208
+ }) => Promise<Result<P, AuthError>>
209
+
210
+ /**
211
+ * Factory that turns a tenant's per-method config into an `AuthMethod`.
212
+ *
213
+ * The factory owns config validation. The framework validates
214
+ * `MethodConfig.config` against `configSchema` before calling `build`;
215
+ * methods never observe `Record<string, unknown>` at runtime.
216
+ *
217
+ * `build` may be async (e.g. to fetch an OIDC discovery doc / JWKS). The
218
+ * result is cached per `(tenantId, MethodConfig.id)` — TTL matches the
219
+ * `ConfigStore` cache TTL; invalidation fires when tenant config changes.
220
+ *
221
+ * The framework verifies the returned `AuthMethod.id` and `AuthMethod.kind`
222
+ * match the `input.id` / `input.kind` passed into `build`. Mismatch fails
223
+ * the load with audit `factory_id_mismatch`.
224
+ */
225
+ // `AnyAuthMethodFactory` is the variance-permissive form used by
226
+ // `IdPOptions.methods` and `MethodCache.factories`. Each entry in such a
227
+ // map may be a `AuthMethodFactory<P, S, Cfg>` with concrete generics —
228
+ // the `any` defaults keep the map type assignable without losing strict
229
+ // typing inside individual factories.
230
+ export type AnyAuthMethodFactory = AuthMethodFactory<
231
+ any, // P — properties emitted to success callback
232
+ any, // S — method-private state
233
+ any // Cfg — tenant-supplied config (validated by configSchema)
234
+ >
235
+
236
+ export type AuthMethodFactory<P = unknown, S = unknown, Cfg = unknown> = {
237
+ /** Matches `MethodConfig.kind`. Multiple `MethodConfig` rows may share the same `kind`. */
238
+ kind: string
239
+
240
+ /**
241
+ * Standard Schema for the tenant-supplied config blob. The framework
242
+ * runs this after `ConfigStore` returns a tenant's `MethodConfig.config`
243
+ * and rejects loads that don't validate (audit + log). The validated
244
+ * value is threaded into `build`.
245
+ *
246
+ * Any validation library implementing [Standard Schema v1] satisfies
247
+ * this contract — Zod 3.24+, Valibot 1.0+, Arktype 2.0+, Effect Schema,
248
+ * etc. This decouples the library from any one validator's version
249
+ * choices.
250
+ *
251
+ * [Standard Schema v1]: https://github.com/standard-schema/standard-schema
252
+ */
253
+ configSchema: v1.StandardSchema<unknown, Cfg>
254
+
255
+ /**
256
+ * Build a concrete `AuthMethod` from validated config plus the binding
257
+ * context. The factory **must** set `AuthMethod.id` to `input.id` and
258
+ * `AuthMethod.kind` to `input.kind` — the framework verifies and audits
259
+ * on mismatch (`factory_id_mismatch`).
260
+ */
261
+ build: (input: {
262
+ /** `MethodConfig.id` — tenant-local instance id, becomes `AuthMethod.id`. */
263
+ id: string
264
+ /** `MethodConfig.kind` — factory id, becomes `AuthMethod.kind`. */
265
+ kind: string
266
+ tenantId: TenantId
267
+ /** Validated against `configSchema`. */
268
+ config: Cfg
269
+ }) => Promise<AuthMethod<P, S>>
270
+ }
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Public-surface types for the default provider picker and any
3
+ * host-supplied override (`IdPOptions.renderPicker`). Kept under `types/`
4
+ * — separate from `ui/picker.ts` which holds the default renderer — so
5
+ * the public-API layer doesn't depend on the UI implementation file.
6
+ */
7
+
8
+ /** Minimal shape of a method as seen by the picker. */
9
+ export type PickerMethod = {
10
+ /** Tenant-local id (e.g. "google-workspace"). Goes into method_id. */
11
+ id: string
12
+ /** Factory kind (e.g. "google"). Identifies the provider family. */
13
+ kind: string
14
+ /** "redirect" for upstream OAuth/OIDC, "credential" for password/code/passkey. */
15
+ type: string
16
+ /** Optional human-readable label provided by tenant config. */
17
+ displayName?: string
18
+ }
19
+
20
+ /** Query params propagated into each picker option's link. */
21
+ export type PickerContext = {
22
+ clientId: string
23
+ redirectUri: string
24
+ state?: string | null
25
+ scope?: string | null
26
+ nonce?: string | null
27
+ codeChallenge?: string | null
28
+ codeChallengeMethod?: string | null
29
+ audience?: string | null
30
+ prompt?: string | null
31
+ uiLocales?: string | null
32
+ }
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Result<T, E> — explicit success / failure encoding used throughout the domain.
3
+ *
4
+ * Domain functions return `Result` instead of throwing. The HTTP layer is the
5
+ * one place that converts `AuthError` into an HTTP response. Keeping the domain
6
+ * throw-free makes composition (chaining validators, branching on error code)
7
+ * straightforward and avoids hidden control flow.
8
+ *
9
+ * AD5 in `docs/plans/claude/idp-rebuild-plan.md`.
10
+ */
11
+ import type { AuthError } from "./error"
12
+
13
+ export type Result<T, E = AuthError> =
14
+ | { ok: true; value: T }
15
+ | { ok: false; error: E }
16
+
17
+ export const ok = <T>(value: T): Result<T, never> => ({ ok: true, value })
18
+ export const err = <E>(error: E): Result<never, E> => ({ ok: false, error })
19
+
20
+ export const isOk = <T, E>(r: Result<T, E>): r is { ok: true; value: T } =>
21
+ r.ok === true
22
+ export const isErr = <T, E>(r: Result<T, E>): r is { ok: false; error: E } =>
23
+ r.ok === false
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Subject — the typed principal the IdP issues at the end of an auth flow.
3
+ *
4
+ * Per AD4 / plan §"Subject", Zod is the canonical schema library. The
5
+ * subject schema type is library-agnostic at the boundary (any schema that
6
+ * implements the [Standard Schema v1] spec — including Zod 3.24+, Valibot,
7
+ * and Arktype) so existing consumers can migrate from Valibot/Arktype
8
+ * without rewriting subject definitions.
9
+ *
10
+ * [Standard Schema v1]: https://github.com/standard-schema/standard-schema
11
+ */
12
+ import type { v1 } from "@standard-schema/spec"
13
+
14
+ /**
15
+ * Map of subject-type id → schema for that subject's `properties`.
16
+ *
17
+ * @example
18
+ * ```ts
19
+ * import { z } from "zod"
20
+ *
21
+ * const subjects: SubjectSchema = {
22
+ * user: z.object({ userId: z.string(), email: z.string().email() }),
23
+ * admin: z.object({ adminId: z.string(), roles: z.array(z.string()) }),
24
+ * }
25
+ * ```
26
+ */
27
+ export type SubjectSchema = Record<string, v1.StandardSchema>
28
+
29
+ /**
30
+ * Helper that infers the discriminated-union `{ type, properties }` shape
31
+ * from a `SubjectSchema`. Used to type the IdP's `success` callback return
32
+ * and the access-token `claim` payload.
33
+ */
34
+ export type SubjectPayload<T extends SubjectSchema> = {
35
+ [type in keyof T & string]: {
36
+ type: type
37
+ properties: v1.InferOutput<T[type]>
38
+ }
39
+ }[keyof T & string]
40
+
41
+ /**
42
+ * Generic typed-subject claim — what the user's `IdPOptions.success`
43
+ * callback returns and what is inlined as `claim` on the access token.
44
+ *
45
+ * Domain / port signatures keep the generic open (`SubjectClaim`) so the
46
+ * framework doesn't need to know each consumer's subject schema. Concrete
47
+ * call sites narrow `T extends SubjectSchema` for type safety.
48
+ */
49
+ export type SubjectClaim<T extends SubjectSchema = SubjectSchema> =
50
+ SubjectPayload<T>