@_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,239 @@
1
+ /**
2
+ * Tenant model + tenant-resolution / callback-recovery types.
3
+ *
4
+ * Per AD1, tenancy is **not** a URL concept. A tenant is whatever the
5
+ * user-supplied `resolveTenant(req)` says it is for an incoming request, plus
6
+ * a deterministic callback-recovery chain (MAC-bound state, partitioned host,
7
+ * or `flowId`-in-URI) for the post-redirect leg where the original tenant
8
+ * signal may no longer be available.
9
+ *
10
+ * The minimal state envelope MACed and round-tripped through upstream
11
+ * providers carries only `{ tenantId, flowId, nonce, kid }`. Everything else
12
+ * lives in the server-side `FlowRecord` (see `./flow.ts`).
13
+ */
14
+ /**
15
+ * Branded tenant id — **opaque to the framework**.
16
+ *
17
+ * The framework treats `TenantId` as a comparable string and nothing more.
18
+ * It never parses it, never assumes a hierarchy or naming convention, never
19
+ * imposes uniqueness rules, never knows the lifecycle of a tenant. The
20
+ * embedding application decides what a tenant *is* (an organization, a
21
+ * workspace, an App-Tenant tuple, a customer, …) and supplies a
22
+ * `resolveTenant(req)` that maps incoming requests to the right key.
23
+ *
24
+ * Common embedding pattern when the host application has two levels of
25
+ * scoping (e.g. `App` ⇒ `App-Tenant`): encode the tuple into the key.
26
+ *
27
+ * ```ts
28
+ * // Inside the host application's resolveTenant:
29
+ * return ok(`${app.id}:${appTenant?.id ?? "__default__"}` as TenantId)
30
+ *
31
+ * // Inside the host application's ConfigStore.getTenantConfig:
32
+ * const [appId, subId] = (id as string).split(":")
33
+ * // merge App defaults + App-Tenant overrides from your own DB ...
34
+ * ```
35
+ *
36
+ * The brand exists to keep arbitrary `string` values from being passed
37
+ * where a `TenantId` is expected; the *meaning* of the string is the host
38
+ * application's concern.
39
+ */
40
+ export type TenantId = string & {
41
+ readonly __brand: "TenantId";
42
+ };
43
+ /**
44
+ * Cast helper for code that mints `TenantId` from a validated string. The
45
+ * framework imposes no validation on the value — callers ensure their key
46
+ * is non-empty and stable per partition.
47
+ */
48
+ export declare const asTenantId: (value: string) => TenantId;
49
+ /** OAuth 2.1 grant types in scope for this IdP. Implicit is intentionally absent. */
50
+ export type GrantType = "authorization_code" | "refresh_token" | "client_credentials";
51
+ /**
52
+ * `MethodType` is the canonical discriminator for an `AuthMethod`. It mirrors
53
+ * the existing provider taxonomy. The UI uses it to decide which selection /
54
+ * form to render; the framework uses it as a routing / dispatch hint.
55
+ */
56
+ export type MethodType = "oauth2" | "oidc" | "password" | "code" | "m2m" | "passkey" | "custom";
57
+ /**
58
+ * Per-tenant configuration for a single auth method **instance**.
59
+ *
60
+ * `id` is the **tenant-local instance id** — the value that ends up in URLs
61
+ * (`/<id>/*`) and that the framework dispatches by.
62
+ *
63
+ * `kind` is the **factory id** — the value that selects which
64
+ * `AuthMethodFactory` builds this instance. A tenant may register multiple
65
+ * instances of the same factory (e.g. one Google Workspace SSO and one
66
+ * consumer Google Sign-In) by giving each instance a unique `id` while
67
+ * sharing a `kind`.
68
+ *
69
+ * `type` is the `MethodType` discriminator the UI uses. The framework
70
+ * verifies it agrees with the factory's declared type at load time.
71
+ *
72
+ * `config` is the tenant-supplied configuration blob. The framework validates
73
+ * it against the factory's Zod `configSchema` before any handler runs.
74
+ */
75
+ export type MethodConfig = {
76
+ id: string;
77
+ kind: string;
78
+ type: MethodType;
79
+ enabled: boolean;
80
+ config: Record<string, unknown>;
81
+ };
82
+ /** Optional theme metadata. Schema expanded in later phases. */
83
+ export type ThemeConfig = {
84
+ primary?: string;
85
+ logo?: string;
86
+ favicon?: string;
87
+ background?: string;
88
+ font?: string;
89
+ };
90
+ /**
91
+ * Registered OAuth client of this IdP (an app, SPA, mobile, M2M).
92
+ *
93
+ * Phase 8: split into a discriminated union so misconfiguration is a type
94
+ * error, not a runtime check. The runtime in `domain/authorize.ts` still
95
+ * enforces PKCE for public clients defensively, but hosts will see the
96
+ * problem at compile time.
97
+ *
98
+ * - **Public clients** (SPAs, mobile apps, native apps): no client secret;
99
+ * `pkceRequired` is the literal `true`. PKCE is non-negotiable per
100
+ * OAuth 2.1 BCP §2.1.1.
101
+ * - **Confidential clients** (server-side apps, M2M): `secretHash` is
102
+ * required (this used to be optional, in practice always set). PKCE
103
+ * recommended but may be disabled by the host.
104
+ */
105
+ export type ClientConfig = PublicClientConfig | ConfidentialClientConfig;
106
+ export type PublicClientConfig = {
107
+ id: string;
108
+ name: string;
109
+ type: "public";
110
+ redirectUris: string[];
111
+ grantTypes: GrantType[];
112
+ scopes: string[];
113
+ /** Must be `true` for public clients per OAuth 2.1 §2.1.1. */
114
+ pkceRequired: true;
115
+ /** Phase 8. */
116
+ dpopRequired?: boolean;
117
+ };
118
+ export type ConfidentialClientConfig = {
119
+ id: string;
120
+ name: string;
121
+ type: "confidential";
122
+ /** Hash of the client secret. Required for confidential clients. */
123
+ secretHash: string;
124
+ redirectUris: string[];
125
+ grantTypes: GrantType[];
126
+ scopes: string[];
127
+ /**
128
+ * Default true. Disabling it is permitted for confidential clients but
129
+ * strongly discouraged; OAuth 2.1 §2.1.1 recommends PKCE for every client.
130
+ */
131
+ pkceRequired: boolean;
132
+ /** Phase 8. */
133
+ dpopRequired?: boolean;
134
+ };
135
+ export type TenantConfig = {
136
+ id: TenantId;
137
+ displayName: string;
138
+ clients: ClientConfig[];
139
+ methods: MethodConfig[];
140
+ theme?: ThemeConfig;
141
+ /** Set when the tenant needs cross-subdomain SSO. */
142
+ cookieDomain?: string;
143
+ /** Override default refresh-token TTL (seconds). */
144
+ refreshTtl?: number;
145
+ /** Override default access-token TTL (seconds). */
146
+ accessTtl?: number;
147
+ };
148
+ /**
149
+ * Per-request tenant context handed to methods and the user-supplied
150
+ * `success` callback. `request.raw` is the Web Fetch `Request` the framework
151
+ * received; `request.custom` is whatever the host returned from the
152
+ * `IdPOptions.buildCustomContext` hook (request id, decoded JWT claims, mTLS
153
+ * cert info, geo hints — anything per-request that methods or `success`
154
+ * should see). Without the hook the blob is `{}`. The same blob is also
155
+ * persisted on the `FlowRecord` at `/authorize` time so it survives the
156
+ * upstream redirect and re-presents on the callback side.
157
+ */
158
+ export type TenantContext = {
159
+ id: TenantId;
160
+ config: TenantConfig;
161
+ request: {
162
+ raw: Request;
163
+ custom: Record<string, unknown>;
164
+ };
165
+ };
166
+ /**
167
+ * Outcome of the framework's tenant-recovery chain, evaluated **before**
168
+ * `resolveTenant` runs on the incoming request. Each non-`fresh-request`
169
+ * variant carries a `flowId`; the framework consumes the matching
170
+ * `FlowRecord` and dispatches without consulting `resolveTenant`.
171
+ *
172
+ * Order of evaluation (see plan §"Tenant Recovery Across Redirects"):
173
+ * 1. If `callbackHostFor` configured AND host matches a known tenant:
174
+ * a. `state` MAC-verifies → host-plus-mac
175
+ * b. `flowId` in URI → host-plus-uri
176
+ * c. otherwise → invalid_request, audit unrecoverable_flow
177
+ * 2. Else if `state` MAC-verifies → mac-state
178
+ * 3. Else if `flowId` in registered URI path/query → flow-id-in-uri
179
+ * 4. Else → fresh-request → call user's `resolveTenant(req)`
180
+ */
181
+ export type TenantRecovery = {
182
+ kind: "mac-state";
183
+ tenantId: TenantId;
184
+ flowId: string;
185
+ } | {
186
+ kind: "host-plus-uri";
187
+ tenantId: TenantId;
188
+ flowId: string;
189
+ } | {
190
+ kind: "host-plus-mac";
191
+ tenantId: TenantId;
192
+ flowId: string;
193
+ } | {
194
+ kind: "flow-id-in-uri";
195
+ tenantId: TenantId;
196
+ flowId: string;
197
+ } | {
198
+ kind: "fresh-request";
199
+ };
200
+ /**
201
+ * Minimal envelope MACed into the `state` query parameter. Intentionally
202
+ * tiny — under 256 base64url bytes — so it stays clear of provider URL
203
+ * limits. **No sensitive data must ever be added here.** Everything else
204
+ * lives in the server-side `FlowRecord`.
205
+ */
206
+ export type StateEnvelope = {
207
+ tenantId: TenantId;
208
+ flowId: string;
209
+ /** Per-flow nonce. Distinct from the relying party's `state` param. */
210
+ nonce: string;
211
+ /** Key id of the HMAC key used to mint this envelope (`StateKeyRing` lookup). */
212
+ kid: string;
213
+ };
214
+ /**
215
+ * HMAC-SHA-256 key entry used to mint / verify the `state` envelope MAC.
216
+ * The 32-byte key is global (shared across IdP instances) — recovery has to
217
+ * work before tenant config is loaded, so per-tenant keys would create a
218
+ * bootstrap problem.
219
+ */
220
+ export type StateKey = {
221
+ kid: string;
222
+ /** 32 raw bytes. */
223
+ key: Uint8Array;
224
+ };
225
+ /**
226
+ * State-MAC key ring with overlap-based rotation. `active` mints new state;
227
+ * any key in `verify` accepts existing state during its overlap window.
228
+ *
229
+ * Rotation cadence: monthly. The overlap window must be at least as long as
230
+ * the flow-record TTL (default 10 minutes); a 1-hour overlap is the
231
+ * recommended default. New keys are added to `verify` first, promoted to
232
+ * `active` on the next rotation, then dropped from `verify` after overlap.
233
+ */
234
+ export type StateKeyRing = {
235
+ active: StateKey;
236
+ /** Includes `active` plus any previous keys still inside their overlap window. */
237
+ verify: ReadonlyArray<StateKey>;
238
+ };
239
+ //# sourceMappingURL=tenant.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tenant.d.ts","sourceRoot":"","sources":["../../../src/types/tenant.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG;IAAE,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAA;CAAE,CAAA;AAEhE;;;;GAIG;AACH,eAAO,MAAM,UAAU,UAAW,MAAM,KAAG,QAA6B,CAAA;AAExE,qFAAqF;AACrF,MAAM,MAAM,SAAS,GACjB,oBAAoB,GACpB,eAAe,GACf,oBAAoB,CAAA;AAExB;;;;GAIG;AACH,MAAM,MAAM,UAAU,GAClB,QAAQ,GACR,MAAM,GACN,UAAU,GACV,MAAM,GACN,KAAK,GACL,SAAS,GACT,QAAQ,CAAA;AAEZ;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,UAAU,CAAA;IAChB,OAAO,EAAE,OAAO,CAAA;IAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAChC,CAAA;AAED,gEAAgE;AAChE,MAAM,MAAM,WAAW,GAAG;IACxB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,IAAI,CAAC,EAAE,MAAM,CAAA;CACd,CAAA;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,MAAM,YAAY,GAAG,kBAAkB,GAAG,wBAAwB,CAAA;AAExE,MAAM,MAAM,kBAAkB,GAAG;IAC/B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,QAAQ,CAAA;IACd,YAAY,EAAE,MAAM,EAAE,CAAA;IACtB,UAAU,EAAE,SAAS,EAAE,CAAA;IACvB,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,8DAA8D;IAC9D,YAAY,EAAE,IAAI,CAAA;IAClB,eAAe;IACf,YAAY,CAAC,EAAE,OAAO,CAAA;CACvB,CAAA;AAED,MAAM,MAAM,wBAAwB,GAAG;IACrC,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,cAAc,CAAA;IACpB,oEAAoE;IACpE,UAAU,EAAE,MAAM,CAAA;IAClB,YAAY,EAAE,MAAM,EAAE,CAAA;IACtB,UAAU,EAAE,SAAS,EAAE,CAAA;IACvB,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB;;;OAGG;IACH,YAAY,EAAE,OAAO,CAAA;IACrB,eAAe;IACf,YAAY,CAAC,EAAE,OAAO,CAAA;CACvB,CAAA;AAED,MAAM,MAAM,YAAY,GAAG;IACzB,EAAE,EAAE,QAAQ,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,OAAO,EAAE,YAAY,EAAE,CAAA;IACvB,OAAO,EAAE,YAAY,EAAE,CAAA;IACvB,KAAK,CAAC,EAAE,WAAW,CAAA;IACnB,qDAAqD;IACrD,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,oDAAoD;IACpD,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,mDAAmD;IACnD,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,CAAA;AAED;;;;;;;;;GASG;AACH,MAAM,MAAM,aAAa,GAAG;IAC1B,EAAE,EAAE,QAAQ,CAAA;IACZ,MAAM,EAAE,YAAY,CAAA;IACpB,OAAO,EAAE;QACP,GAAG,EAAE,OAAO,CAAA;QACZ,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAChC,CAAA;CACF,CAAA;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,MAAM,cAAc,GACtB;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,QAAQ,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACzD;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,QAAQ,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC7D;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,QAAQ,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC7D;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,QAAQ,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC9D;IAAE,IAAI,EAAE,eAAe,CAAA;CAAE,CAAA;AAE7B;;;;;GAKG;AACH,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,EAAE,QAAQ,CAAA;IAClB,MAAM,EAAE,MAAM,CAAA;IACd,uEAAuE;IACvE,KAAK,EAAE,MAAM,CAAA;IACb,iFAAiF;IACjF,GAAG,EAAE,MAAM,CAAA;CACZ,CAAA;AAED;;;;;GAKG;AACH,MAAM,MAAM,QAAQ,GAAG;IACrB,GAAG,EAAE,MAAM,CAAA;IACX,oBAAoB;IACpB,GAAG,EAAE,UAAU,CAAA;CAChB,CAAA;AAED;;;;;;;;GAQG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB,MAAM,EAAE,QAAQ,CAAA;IAChB,kFAAkF;IAClF,MAAM,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAA;CAChC,CAAA"}
@@ -0,0 +1,103 @@
1
+ /**
2
+ * Token-domain shapes — auth code payload (snapshot of `FlowRecord` at
3
+ * handoff), access-token claims, refresh-token payload, and the small
4
+ * envelopes the `TokenStore` persists.
5
+ *
6
+ * Per AD9, access tokens are JWTs (ES256 by default, Ed25519 optional per
7
+ * AD11) and refresh tokens are opaque server-side records.
8
+ */
9
+ import type { SubjectClaim } from "./subject";
10
+ import type { TenantId } from "./tenant";
11
+ /**
12
+ * Payload stored under an auth code. Built at callback time from the consumed
13
+ * `FlowRecord` plus the method's `success` result. Encrypted at rest by
14
+ * `TokenStore.saveCode` (see `ports/CONSISTENCY.md`).
15
+ *
16
+ * `methodState` is intentionally **not** snapshotted: it served its
17
+ * upstream-callback purpose and is dropped with the flow record.
18
+ */
19
+ export type CodePayload = {
20
+ tenantId: TenantId;
21
+ clientId: string;
22
+ appRedirectUri: string;
23
+ /** Relying party's `state` param, echoed back at success. */
24
+ appState: string | null;
25
+ scopes: string[];
26
+ audience?: string;
27
+ /** Relying-party → IdP PKCE; verified at `/token` against the RP's verifier. */
28
+ clientPkce?: {
29
+ challenge: string;
30
+ method: "S256";
31
+ };
32
+ /** Tenant-local method instance id (`MethodConfig.id`). */
33
+ methodId: string;
34
+ /** Factory kind (`MethodConfig.kind`). */
35
+ methodKind: string;
36
+ /** User's `requestContext` snapshot, if any. */
37
+ context?: Record<string, unknown> | null;
38
+ /** Upstream system's stable identifier (from `MethodResult.success`). */
39
+ providerSubject: string;
40
+ /** Typed-per-method properties from `MethodResult.success`. */
41
+ properties: unknown;
42
+ /** Auth-code TTL is 60 s — framework refuses anything longer. */
43
+ expiresAt: number;
44
+ };
45
+ /** Access-token JWT claims this IdP issues. */
46
+ export type AccessTokenClaims = {
47
+ iss: string;
48
+ sub: string;
49
+ aud: string;
50
+ exp: number;
51
+ iat: number;
52
+ /** Tenant id. */
53
+ tid: TenantId;
54
+ /** Tenant-local method instance id that originated this token. */
55
+ mid?: string;
56
+ /** Factory kind that originated this token. */
57
+ mkind?: string;
58
+ scope?: string;
59
+ /** DPoP confirmation claim (Phase 8). */
60
+ cnf?: {
61
+ jkt: string;
62
+ };
63
+ /** The structured subject (matches `SubjectClaim`). Inlined for resource servers. */
64
+ claim: SubjectClaim;
65
+ };
66
+ /**
67
+ * Opaque refresh-token payload — persisted in `TokenStore` with strong CAS
68
+ * semantics (see `ports/CONSISTENCY.md`). The token itself is a random
69
+ * string; the payload is what the store returns on consume.
70
+ */
71
+ export type RefreshTokenPayload = {
72
+ tenantId: TenantId;
73
+ clientId: string;
74
+ /** Stable subject id derived from the issued `SubjectClaim`. */
75
+ subjectId: string;
76
+ claim: SubjectClaim;
77
+ scopes: string[];
78
+ audience?: string;
79
+ /** Reuse-detection chain id. Rotation issues a new token with the same family. */
80
+ family: string;
81
+ /**
82
+ * Tenant-local method instance id (`MethodConfig.id`) that originated the
83
+ * chain. Preserved across `refresh_token` rotations so descendant access
84
+ * tokens carry the original `mid` / `mkind` claims instead of the
85
+ * grant-type literal "refresh".
86
+ */
87
+ methodId: string;
88
+ /** Factory kind (`MethodConfig.kind`) that originated the chain. */
89
+ methodKind: string;
90
+ /** Wall-clock issuance and absolute-expiry timestamps. */
91
+ issuedAt: number;
92
+ expiresAt: number;
93
+ };
94
+ /** Response body of `/token` (RFC 6749 §5.1). */
95
+ export type TokenResponse = {
96
+ access_token: string;
97
+ token_type: "Bearer" | "DPoP";
98
+ expires_in: number;
99
+ refresh_token?: string;
100
+ scope?: string;
101
+ id_token?: string;
102
+ };
103
+ //# sourceMappingURL=token.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token.d.ts","sourceRoot":"","sources":["../../../src/types/token.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAC7C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAExC;;;;;;;GAOG;AACH,MAAM,MAAM,WAAW,GAAG;IACxB,QAAQ,EAAE,QAAQ,CAAA;IAClB,QAAQ,EAAE,MAAM,CAAA;IAChB,cAAc,EAAE,MAAM,CAAA;IACtB,6DAA6D;IAC7D,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,gFAAgF;IAChF,UAAU,CAAC,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;IAClD,2DAA2D;IAC3D,QAAQ,EAAE,MAAM,CAAA;IAChB,0CAA0C;IAC1C,UAAU,EAAE,MAAM,CAAA;IAClB,gDAAgD;IAChD,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAA;IACxC,yEAAyE;IACzE,eAAe,EAAE,MAAM,CAAA;IACvB,+DAA+D;IAC/D,UAAU,EAAE,OAAO,CAAA;IACnB,iEAAiE;IACjE,SAAS,EAAE,MAAM,CAAA;CAClB,CAAA;AAED,+CAA+C;AAC/C,MAAM,MAAM,iBAAiB,GAAG;IAC9B,GAAG,EAAE,MAAM,CAAA;IACX,GAAG,EAAE,MAAM,CAAA;IACX,GAAG,EAAE,MAAM,CAAA;IACX,GAAG,EAAE,MAAM,CAAA;IACX,GAAG,EAAE,MAAM,CAAA;IACX,iBAAiB;IACjB,GAAG,EAAE,QAAQ,CAAA;IACb,kEAAkE;IAClE,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,+CAA+C;IAC/C,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,yCAAyC;IACzC,GAAG,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,CAAA;IACrB,qFAAqF;IACrF,KAAK,EAAE,YAAY,CAAA;CACpB,CAAA;AAED;;;;GAIG;AACH,MAAM,MAAM,mBAAmB,GAAG;IAChC,QAAQ,EAAE,QAAQ,CAAA;IAClB,QAAQ,EAAE,MAAM,CAAA;IAChB,gEAAgE;IAChE,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,YAAY,CAAA;IACnB,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,kFAAkF;IAClF,MAAM,EAAE,MAAM,CAAA;IACd;;;;;OAKG;IACH,QAAQ,EAAE,MAAM,CAAA;IAChB,oEAAoE;IACpE,UAAU,EAAE,MAAM,CAAA;IAClB,0DAA0D;IAC1D,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;CAClB,CAAA;AAED,iDAAiD;AACjD,MAAM,MAAM,aAAa,GAAG;IAC1B,YAAY,EAAE,MAAM,CAAA;IACpB,UAAU,EAAE,QAAQ,GAAG,MAAM,CAAA;IAC7B,UAAU,EAAE,MAAM,CAAA;IAClB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB,CAAA"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Server-rendered HTML helpers for the bundled credential methods and the
3
+ * default authorization picker.
4
+ *
5
+ * Intentionally minimal — zero JS, no client framework. Hosts that want a
6
+ * richer UI override `IdPOptions.renderPicker` (for method selection) or
7
+ * supply their own `success-response` from method handlers (for credential
8
+ * forms). The helpers escape user-provided strings so callers can drop
9
+ * arbitrary labels or error messages without thinking about XSS.
10
+ */
11
+ export declare function escapeHtml(s: string): string;
12
+ export declare const BASE_STYLES = "\n:root {\n color-scheme: light dark;\n\n --bg-page: #eef0f4;\n --bg-card: #ffffff;\n --bg-input: #ffffff;\n --bg-row: #f5f6f8;\n --bg-row-hover: #eaecf1;\n --fg-high: #0e1116;\n --fg-mid: #4a5160;\n --fg-low: #8b93a3;\n --border: #d8dce3;\n --border-strong: #9aa3b2;\n --primary: #2f3137;\n --primary-fg: #ffffff;\n --primary-hover: #1b1d22;\n --focus-ring: rgba(47, 49, 55, 0.18);\n --error-bg: #fdecec;\n --error-fg: #8a1a1a;\n --radius: 8px;\n --shadow-card: 0 1px 2px rgba(15, 18, 25, 0.04), 0 12px 28px rgba(15, 18, 25, 0.08);\n}\n\n@media (prefers-color-scheme: dark) {\n :root {\n --bg-page: #0e0f12;\n --bg-card: #16181d;\n --bg-input: #1c1f25;\n --bg-row: #20242c;\n --bg-row-hover: #2a2f38;\n --fg-high: #f3f4f6;\n --fg-mid: #b6bcc7;\n --fg-low: #7a8190;\n --border: #2a2e36;\n --border-strong: #3a4049;\n --primary: #f3f4f6;\n --primary-fg: #0e1116;\n --primary-hover: #ffffff;\n --focus-ring: rgba(243, 244, 246, 0.22);\n --error-bg: #2a1414;\n --error-fg: #f5b4b4;\n --shadow-card: 0 1px 2px rgba(0, 0, 0, 0.5), 0 18px 40px rgba(0, 0, 0, 0.5);\n }\n}\n\n* { box-sizing: border-box; }\n\nhtml, body { margin: 0; padding: 0; }\n\nbody {\n min-height: 100vh;\n background: var(--bg-page);\n color: var(--fg-high);\n font-family: ui-sans-serif, system-ui, -apple-system, \"Segoe UI\", \"Inter\", \"Helvetica Neue\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\";\n font-size: 15px;\n line-height: 1.45;\n display: grid;\n place-items: center;\n padding: 1.5rem;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\nmain {\n max-width: 380px;\n width: 100%;\n padding: 2rem 1.75rem;\n background: var(--bg-card);\n border-radius: var(--radius);\n box-shadow: var(--shadow-card);\n}\n\nh1 {\n font-size: 1.125rem;\n font-weight: 600;\n letter-spacing: -0.01em;\n margin: 0 0 1.25rem;\n color: var(--fg-high);\n}\n\nform {\n display: grid;\n gap: 0.85rem;\n margin: 0;\n}\n\nlabel {\n display: grid;\n gap: 0.4rem;\n font-size: 0.78rem;\n font-weight: 500;\n color: var(--fg-mid);\n text-transform: none;\n}\n\ninput {\n width: 100%;\n height: 2.5rem;\n padding: 0 0.85rem;\n background: var(--bg-input);\n color: var(--fg-high);\n border: 1px solid var(--border);\n border-radius: calc(var(--radius) - 2px);\n font-size: 0.95rem;\n font-family: inherit;\n outline: none;\n transition: border-color 120ms ease, box-shadow 120ms ease;\n}\ninput::placeholder { color: var(--fg-low); }\ninput:hover { border-color: var(--border-strong); }\ninput:focus {\n border-color: var(--primary);\n box-shadow: 0 0 0 3px var(--focus-ring);\n}\ninput:user-invalid:not(:focus) {\n border-color: var(--error-fg);\n}\n\nbutton {\n height: 2.5rem;\n padding: 0 1rem;\n border: 0;\n border-radius: calc(var(--radius) - 2px);\n background: var(--primary);\n color: var(--primary-fg);\n font-family: inherit;\n font-size: 0.9rem;\n font-weight: 600;\n letter-spacing: 0.01em;\n cursor: pointer;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 0.5rem;\n transition: background 120ms ease, transform 80ms ease;\n}\nbutton:hover { background: var(--primary-hover); }\nbutton:active { transform: translateY(1px); }\nbutton:focus-visible { box-shadow: 0 0 0 3px var(--focus-ring); outline: none; }\n\n.error {\n display: flex;\n align-items: center;\n min-height: 2.25rem;\n padding: 0.5rem 0.85rem;\n margin: 0 0 0.25rem;\n background: var(--error-bg);\n color: var(--error-fg);\n font-size: 0.82rem;\n border-radius: calc(var(--radius) - 2px);\n}\n\n.methods {\n list-style: none;\n padding: 0;\n margin: 0;\n display: grid;\n gap: 0.5rem;\n}\n.methods a {\n display: flex;\n align-items: center;\n justify-content: space-between;\n min-height: 2.75rem;\n padding: 0 1rem;\n background: var(--bg-row);\n border: 1px solid var(--border);\n border-radius: calc(var(--radius) - 2px);\n color: var(--fg-high);\n font-size: 0.92rem;\n font-weight: 500;\n text-decoration: none;\n transition: background 120ms ease, border-color 120ms ease, transform 80ms ease;\n}\n.methods a::after {\n content: \"\u203A\";\n color: var(--fg-mid);\n font-size: 1.15rem;\n font-weight: 500;\n line-height: 1;\n}\n.methods a:hover {\n background: var(--bg-row-hover);\n border-color: var(--border-strong);\n color: var(--fg-high);\n}\n.methods a:hover::after {\n color: var(--fg-high);\n}\n.methods a:active { transform: translateY(1px); }\n.methods a:focus-visible {\n outline: none;\n border-color: var(--primary);\n box-shadow: 0 0 0 3px var(--focus-ring);\n}\n";
13
+ export declare function htmlPage(opts: {
14
+ title: string;
15
+ body: string;
16
+ }): string;
17
+ export type FormField = {
18
+ name: string;
19
+ label: string;
20
+ type?: "text" | "password" | "email" | "tel";
21
+ value?: string;
22
+ required?: boolean;
23
+ autocomplete?: string;
24
+ inputmode?: string;
25
+ };
26
+ /** Build a `<form>` POSTing to `action`. */
27
+ export declare function renderForm(opts: {
28
+ title: string;
29
+ action: string;
30
+ fields: FormField[];
31
+ submit: string;
32
+ error?: string;
33
+ hidden?: Record<string, string>;
34
+ }): string;
35
+ //# sourceMappingURL=forms.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"forms.d.ts","sourceRoot":"","sources":["../../../src/ui/forms.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAiB5C;AAED,eAAO,MAAM,WAAW,+jJAoMvB,CAAA;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAatE;AAED,MAAM,MAAM,SAAS,GAAG;IACtB,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,OAAO,GAAG,KAAK,CAAA;IAC5C,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,CAAA;AAED,4CAA4C;AAC5C,wBAAgB,UAAU,CAAC,IAAI,EAAE;IAC/B,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,SAAS,EAAE,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAChC,GAAG,MAAM,CA2BT"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Public surface for the built-in server-rendered UI helpers.
3
+ *
4
+ * Hosts who want their own UI typically don't import from here at all —
5
+ * they intercept at the host application layer. Hosts that want to keep
6
+ * the defaults but tweak around the edges (e.g. supply a custom picker
7
+ * while keeping the default credential forms) can pull renderForm /
8
+ * renderPicker from here.
9
+ */
10
+ export { renderForm, escapeHtml, htmlPage, BASE_STYLES } from "./forms";
11
+ export type { FormField } from "./forms";
12
+ export { renderPicker, buildMethodLink } from "./picker";
13
+ export type { PickerMethod, PickerContext } from "./picker";
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/ui/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AACvE,YAAY,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAExC,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AACxD,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Default provider picker — rendered when an `/authorize` request matches
3
+ * more than one enabled method and no `method_id` was specified.
4
+ *
5
+ * Hosts that want a fully custom UI override `IdPOptions.renderPicker`.
6
+ * Both the default and any override return a `Response`; the framework
7
+ * applies caching headers afterward.
8
+ */
9
+ import type { PickerContext, PickerMethod } from "../types/picker";
10
+ export type { PickerContext, PickerMethod };
11
+ /**
12
+ * Build an `/authorize` URL that pre-selects a specific `method_id` while
13
+ * carrying every other OAuth param through unchanged.
14
+ */
15
+ export declare function buildMethodLink(methodId: string, ctx: PickerContext): string;
16
+ /** Default styled HTML picker. */
17
+ export declare function renderPicker(methods: PickerMethod[], ctx: PickerContext): Response;
18
+ //# sourceMappingURL=picker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"picker.d.ts","sourceRoot":"","sources":["../../../src/ui/picker.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAGlE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,CAAA;AAE3C;;;GAGG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,aAAa,GAAG,MAAM,CAgB5E;AAED,kCAAkC;AAClC,wBAAgB,YAAY,CAC1B,OAAO,EAAE,YAAY,EAAE,EACvB,GAAG,EAAE,aAAa,GACjB,QAAQ,CAeV"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@_mustachio/openauth",
3
- "version": "0.9.2",
3
+ "version": "0.10.0",
4
4
  "license": "MIT",
5
5
  "repository": {
6
6
  "type": "git",
@@ -9,15 +9,22 @@
9
9
  "type": "module",
10
10
  "scripts": {
11
11
  "build": "bun run script/build.ts",
12
- "test": "bun test"
12
+ "build:watch": "bun run script/build-watch.ts",
13
+ "test": "bun test",
14
+ "preview:ui": "bun --hot run script/preview-ui.ts"
13
15
  },
14
16
  "sideEffects": false,
15
17
  "devDependencies": {
18
+ "@aws-sdk/client-dynamodb": "3.1045.0",
19
+ "@aws-sdk/client-kms": "3.1045.0",
20
+ "@aws-sdk/lib-dynamodb": "3.1045.0",
16
21
  "@cloudflare/workers-types": "4.20241205.0",
22
+ "@electric-sql/pglite": "0.4.5",
17
23
  "@tsconfig/node22": "22.0.0",
18
24
  "@types/node": "22.10.1",
19
- "arctic": "2.2.2",
25
+ "aws-sdk-client-mock": "4.1.0",
20
26
  "hono": "4.11.3",
27
+ "postgres": "3.4.9",
21
28
  "typescript": "5.6.3",
22
29
  "valibot": "1.0.0-beta.15"
23
30
  },
@@ -26,6 +33,10 @@
26
33
  "import": "./dist/esm/index.js",
27
34
  "types": "./dist/types/index.d.ts"
28
35
  },
36
+ "./adapters/*": {
37
+ "import": "./dist/esm/adapters/*/index.js",
38
+ "types": "./dist/types/adapters/*/index.d.ts"
39
+ },
29
40
  "./*": {
30
41
  "import": "./dist/esm/*.js",
31
42
  "types": "./dist/types/*.d.ts"
@@ -36,14 +47,38 @@
36
47
  }
37
48
  },
38
49
  "peerDependencies": {
39
- "arctic": "^2.2.2",
40
- "hono": "^4.0.0"
50
+ "@aws-sdk/client-dynamodb": "^3.0.0",
51
+ "@aws-sdk/client-kms": "^3.0.0",
52
+ "@aws-sdk/lib-dynamodb": "^3.0.0",
53
+ "@cloudflare/workers-types": "^4.0.0",
54
+ "hono": "^4.0.0",
55
+ "postgres": "^3.0.0"
56
+ },
57
+ "peerDependenciesMeta": {
58
+ "@aws-sdk/client-dynamodb": {
59
+ "optional": true
60
+ },
61
+ "@aws-sdk/client-kms": {
62
+ "optional": true
63
+ },
64
+ "@aws-sdk/lib-dynamodb": {
65
+ "optional": true
66
+ },
67
+ "@cloudflare/workers-types": {
68
+ "optional": true
69
+ },
70
+ "postgres": {
71
+ "optional": true
72
+ }
41
73
  },
42
74
  "dependencies": {
75
+ "@noble/hashes": "2.2.0",
43
76
  "@simplewebauthn/server": "13.1.1",
44
77
  "@standard-schema/spec": "1.0.0-beta.3",
45
78
  "aws4fetch": "1.0.20",
46
- "jose": "5.9.6"
79
+ "jose": "5.9.6",
80
+ "oauth4webapi": "3.8.6",
81
+ "zod": "^3.24.1"
47
82
  },
48
83
  "files": [
49
84
  "src",
@@ -0,0 +1,32 @@
1
+ /**
2
+ * D1 `AuditLog`. Append-only inserts; D1's autoincrement provides the
3
+ * insertion order index for SIEM queries. Per `ports/audit-log.ts`, `log()`
4
+ * never throws — durability failures are swallowed because the hot OAuth
5
+ * paths cannot be gated on the audit log.
6
+ */
7
+ import type { AuditEvent, AuditLog } from "../../ports/audit-log"
8
+
9
+ import type { AnyD1Database } from "./types"
10
+
11
+ export type D1AuditLogOptions = {
12
+ db: AnyD1Database
13
+ }
14
+
15
+ export class D1AuditLog implements AuditLog {
16
+ #db: AnyD1Database
17
+
18
+ constructor(opts: D1AuditLogOptions) {
19
+ this.#db = opts.db
20
+ }
21
+
22
+ async log(event: AuditEvent & { timestamp: number }): Promise<void> {
23
+ try {
24
+ await this.#db
25
+ .prepare(
26
+ `INSERT INTO openauth_audit_events (ts, kind, payload) VALUES (?1, ?2, ?3)`,
27
+ )
28
+ .bind(event.timestamp, event.kind, JSON.stringify(event))
29
+ .run()
30
+ } catch {}
31
+ }
32
+ }
@@ -0,0 +1,67 @@
1
+ /**
2
+ * D1 `ConfigStore`. JSON-as-TEXT, eventual-consistency reads acceptable per
3
+ * `ports/CONSISTENCY.md`. Invalidation hook fires on every put.
4
+ */
5
+ import type { ConfigStore } from "../../ports/config-store"
6
+ import { authError } from "../../types/error"
7
+ import type { Result } from "../../types/result"
8
+ import { err, ok } from "../../types/result"
9
+ import type { TenantConfig, TenantId } from "../../types/tenant"
10
+
11
+ import type { AnyD1Database } from "./types"
12
+
13
+ export type D1ConfigStoreOptions = {
14
+ db: AnyD1Database
15
+ clock?: () => number
16
+ }
17
+
18
+ export class D1ConfigStore implements ConfigStore {
19
+ #db: AnyD1Database
20
+ #clock: () => number
21
+ #listeners = new Set<(id: TenantId) => void>()
22
+
23
+ constructor(opts: D1ConfigStoreOptions) {
24
+ this.#db = opts.db
25
+ this.#clock = opts.clock ?? (() => Date.now())
26
+ }
27
+
28
+ async getTenantConfig(id: TenantId): Promise<Result<TenantConfig>> {
29
+ let row: { config: string } | null
30
+ try {
31
+ row = await this.#db
32
+ .prepare(`SELECT config FROM openauth_tenants WHERE id = ?1`)
33
+ .bind(id)
34
+ .first<{ config: string }>()
35
+ } catch (e) {
36
+ return err(authError.internalError("getTenantConfig: query failed", e))
37
+ }
38
+ if (!row) {
39
+ return err(authError.tenantNotFound(`tenant "${id}" not found`, id))
40
+ }
41
+ return ok(JSON.parse(row.config) as TenantConfig)
42
+ }
43
+
44
+ async putTenantConfig(config: TenantConfig): Promise<Result<void>> {
45
+ try {
46
+ await this.#db
47
+ .prepare(
48
+ `INSERT INTO openauth_tenants (id, config, updated_at) VALUES (?1, ?2, ?3)
49
+ ON CONFLICT(id) DO UPDATE SET config = excluded.config, updated_at = excluded.updated_at`,
50
+ )
51
+ .bind(config.id, JSON.stringify(config), this.#clock())
52
+ .run()
53
+ } catch (e) {
54
+ return err(authError.internalError("putTenantConfig: insert failed", e))
55
+ }
56
+ for (const fn of this.#listeners) {
57
+ try {
58
+ fn(config.id)
59
+ } catch {}
60
+ }
61
+ return ok(undefined)
62
+ }
63
+
64
+ onInvalidate(handler: (id: TenantId) => void): void {
65
+ this.#listeners.add(handler)
66
+ }
67
+ }