@udibo/oauth2 0.1.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 (375) hide show
  1. package/LICENSE +20 -0
  2. package/README.md +174 -0
  3. package/SECURITY.md +77 -0
  4. package/esm/_dnt.polyfills.d.ts +17 -0
  5. package/esm/_dnt.polyfills.js +15 -0
  6. package/esm/adapters/hono/_common.d.ts +66 -0
  7. package/esm/adapters/hono/_common.js +108 -0
  8. package/esm/adapters/hono/authorization-server.d.ts +211 -0
  9. package/esm/adapters/hono/authorization-server.js +214 -0
  10. package/esm/adapters/hono/bff/auth-request-store.d.ts +164 -0
  11. package/esm/adapters/hono/bff/auth-request-store.js +154 -0
  12. package/esm/adapters/hono/bff/bff.d.ts +852 -0
  13. package/esm/adapters/hono/bff/bff.js +1194 -0
  14. package/esm/adapters/hono/bff/cookie-prefix.d.ts +72 -0
  15. package/esm/adapters/hono/bff/cookie-prefix.js +85 -0
  16. package/esm/adapters/hono/bff/mod.d.ts +19 -0
  17. package/esm/adapters/hono/bff/mod.js +19 -0
  18. package/esm/adapters/hono/bff/proxy.d.ts +108 -0
  19. package/esm/adapters/hono/bff/proxy.js +314 -0
  20. package/esm/adapters/hono/bff/session-store.d.ts +250 -0
  21. package/esm/adapters/hono/bff/session-store.js +216 -0
  22. package/esm/adapters/hono/bff/testing.d.ts +165 -0
  23. package/esm/adapters/hono/bff/testing.js +254 -0
  24. package/esm/adapters/hono/identity.d.ts +117 -0
  25. package/esm/adapters/hono/identity.js +215 -0
  26. package/esm/adapters/hono/log.d.ts +49 -0
  27. package/esm/adapters/hono/log.js +66 -0
  28. package/esm/adapters/hono/resource-server.d.ts +101 -0
  29. package/esm/adapters/hono/resource-server.js +108 -0
  30. package/esm/client/_http.d.ts +91 -0
  31. package/esm/client/_http.js +303 -0
  32. package/esm/client/base.d.ts +184 -0
  33. package/esm/client/base.js +93 -0
  34. package/esm/client/bff-client.d.ts +235 -0
  35. package/esm/client/bff-client.js +280 -0
  36. package/esm/client/browser-storage.d.ts +152 -0
  37. package/esm/client/browser-storage.js +246 -0
  38. package/esm/client/check.d.ts +114 -0
  39. package/esm/client/check.js +97 -0
  40. package/esm/client/direct-client.d.ts +707 -0
  41. package/esm/client/direct-client.js +1237 -0
  42. package/esm/client/discovery-cache.d.ts +138 -0
  43. package/esm/client/discovery-cache.js +124 -0
  44. package/esm/client/events.d.ts +54 -0
  45. package/esm/client/events.js +37 -0
  46. package/esm/client/mod.d.ts +35 -0
  47. package/esm/client/mod.js +33 -0
  48. package/esm/client/storage.d.ts +127 -0
  49. package/esm/client/storage.js +81 -0
  50. package/esm/deps/jsr.io/@std/assert/1.0.19/almost_equals.d.ts +29 -0
  51. package/esm/deps/jsr.io/@std/assert/1.0.19/almost_equals.js +47 -0
  52. package/esm/deps/jsr.io/@std/assert/1.0.19/array_includes.d.ts +28 -0
  53. package/esm/deps/jsr.io/@std/assert/1.0.19/array_includes.js +65 -0
  54. package/esm/deps/jsr.io/@std/assert/1.0.19/assert.d.ts +16 -0
  55. package/esm/deps/jsr.io/@std/assert/1.0.19/assert.js +23 -0
  56. package/esm/deps/jsr.io/@std/assert/1.0.19/assertion_error.d.ts +25 -0
  57. package/esm/deps/jsr.io/@std/assert/1.0.19/assertion_error.js +30 -0
  58. package/esm/deps/jsr.io/@std/assert/1.0.19/equal.d.ts +24 -0
  59. package/esm/deps/jsr.io/@std/assert/1.0.19/equal.js +193 -0
  60. package/esm/deps/jsr.io/@std/assert/1.0.19/equals.d.ts +36 -0
  61. package/esm/deps/jsr.io/@std/assert/1.0.19/equals.js +61 -0
  62. package/esm/deps/jsr.io/@std/assert/1.0.19/exists.d.ts +17 -0
  63. package/esm/deps/jsr.io/@std/assert/1.0.19/exists.js +27 -0
  64. package/esm/deps/jsr.io/@std/assert/1.0.19/fail.d.ts +14 -0
  65. package/esm/deps/jsr.io/@std/assert/1.0.19/fail.js +20 -0
  66. package/esm/deps/jsr.io/@std/assert/1.0.19/false.d.ts +18 -0
  67. package/esm/deps/jsr.io/@std/assert/1.0.19/false.js +23 -0
  68. package/esm/deps/jsr.io/@std/assert/1.0.19/greater.d.ts +19 -0
  69. package/esm/deps/jsr.io/@std/assert/1.0.19/greater.js +29 -0
  70. package/esm/deps/jsr.io/@std/assert/1.0.19/greater_or_equal.d.ts +19 -0
  71. package/esm/deps/jsr.io/@std/assert/1.0.19/greater_or_equal.js +29 -0
  72. package/esm/deps/jsr.io/@std/assert/1.0.19/instance_of.d.ts +22 -0
  73. package/esm/deps/jsr.io/@std/assert/1.0.19/instance_of.js +52 -0
  74. package/esm/deps/jsr.io/@std/assert/1.0.19/is_error.d.ts +24 -0
  75. package/esm/deps/jsr.io/@std/assert/1.0.19/is_error.js +53 -0
  76. package/esm/deps/jsr.io/@std/assert/1.0.19/less.d.ts +18 -0
  77. package/esm/deps/jsr.io/@std/assert/1.0.19/less.js +28 -0
  78. package/esm/deps/jsr.io/@std/assert/1.0.19/less_or_equal.d.ts +19 -0
  79. package/esm/deps/jsr.io/@std/assert/1.0.19/less_or_equal.js +29 -0
  80. package/esm/deps/jsr.io/@std/assert/1.0.19/match.d.ts +17 -0
  81. package/esm/deps/jsr.io/@std/assert/1.0.19/match.js +26 -0
  82. package/esm/deps/jsr.io/@std/assert/1.0.19/mod.d.ts +43 -0
  83. package/esm/deps/jsr.io/@std/assert/1.0.19/mod.js +45 -0
  84. package/esm/deps/jsr.io/@std/assert/1.0.19/not_equals.d.ts +26 -0
  85. package/esm/deps/jsr.io/@std/assert/1.0.19/not_equals.js +39 -0
  86. package/esm/deps/jsr.io/@std/assert/1.0.19/not_instance_of.d.ts +19 -0
  87. package/esm/deps/jsr.io/@std/assert/1.0.19/not_instance_of.js +29 -0
  88. package/esm/deps/jsr.io/@std/assert/1.0.19/not_match.d.ts +17 -0
  89. package/esm/deps/jsr.io/@std/assert/1.0.19/not_match.js +26 -0
  90. package/esm/deps/jsr.io/@std/assert/1.0.19/not_strict_equals.d.ts +22 -0
  91. package/esm/deps/jsr.io/@std/assert/1.0.19/not_strict_equals.js +32 -0
  92. package/esm/deps/jsr.io/@std/assert/1.0.19/object_match.d.ts +28 -0
  93. package/esm/deps/jsr.io/@std/assert/1.0.19/object_match.js +177 -0
  94. package/esm/deps/jsr.io/@std/assert/1.0.19/rejects.d.ts +41 -0
  95. package/esm/deps/jsr.io/@std/assert/1.0.19/rejects.js +53 -0
  96. package/esm/deps/jsr.io/@std/assert/1.0.19/strict_equals.d.ts +23 -0
  97. package/esm/deps/jsr.io/@std/assert/1.0.19/strict_equals.js +58 -0
  98. package/esm/deps/jsr.io/@std/assert/1.0.19/string_includes.d.ts +17 -0
  99. package/esm/deps/jsr.io/@std/assert/1.0.19/string_includes.js +26 -0
  100. package/esm/deps/jsr.io/@std/assert/1.0.19/throws.d.ts +44 -0
  101. package/esm/deps/jsr.io/@std/assert/1.0.19/throws.js +44 -0
  102. package/esm/deps/jsr.io/@std/assert/1.0.19/unimplemented.d.ts +14 -0
  103. package/esm/deps/jsr.io/@std/assert/1.0.19/unimplemented.js +20 -0
  104. package/esm/deps/jsr.io/@std/assert/1.0.19/unreachable.d.ts +14 -0
  105. package/esm/deps/jsr.io/@std/assert/1.0.19/unreachable.js +20 -0
  106. package/esm/deps/jsr.io/@std/async/1.5.0/delay.d.ts +44 -0
  107. package/esm/deps/jsr.io/@std/async/1.5.0/delay.js +84 -0
  108. package/esm/deps/jsr.io/@std/crypto/1.1.0/timing_safe_equal.d.ts +39 -0
  109. package/esm/deps/jsr.io/@std/crypto/1.1.0/timing_safe_equal.js +61 -0
  110. package/esm/deps/jsr.io/@std/encoding/1.0.11/_common16.d.ts +22 -0
  111. package/esm/deps/jsr.io/@std/encoding/1.0.11/_common16.js +51 -0
  112. package/esm/deps/jsr.io/@std/encoding/1.0.11/_common32.d.ts +34 -0
  113. package/esm/deps/jsr.io/@std/encoding/1.0.11/_common32.js +192 -0
  114. package/esm/deps/jsr.io/@std/encoding/1.0.11/_common64.d.ts +34 -0
  115. package/esm/deps/jsr.io/@std/encoding/1.0.11/_common64.js +113 -0
  116. package/esm/deps/jsr.io/@std/encoding/1.0.11/_common_detach.d.ts +3 -0
  117. package/esm/deps/jsr.io/@std/encoding/1.0.11/_common_detach.js +13 -0
  118. package/esm/deps/jsr.io/@std/encoding/1.0.11/_types.d.ts +8 -0
  119. package/esm/deps/jsr.io/@std/encoding/1.0.11/_types.js +2 -0
  120. package/esm/deps/jsr.io/@std/encoding/1.0.11/_validate_binary_like.d.ts +1 -0
  121. package/esm/deps/jsr.io/@std/encoding/1.0.11/_validate_binary_like.js +26 -0
  122. package/esm/deps/jsr.io/@std/encoding/1.0.11/ascii85.d.ts +60 -0
  123. package/esm/deps/jsr.io/@std/encoding/1.0.11/ascii85.js +152 -0
  124. package/esm/deps/jsr.io/@std/encoding/1.0.11/base32.d.ts +39 -0
  125. package/esm/deps/jsr.io/@std/encoding/1.0.11/base32.js +87 -0
  126. package/esm/deps/jsr.io/@std/encoding/1.0.11/base58.d.ts +39 -0
  127. package/esm/deps/jsr.io/@std/encoding/1.0.11/base58.js +131 -0
  128. package/esm/deps/jsr.io/@std/encoding/1.0.11/base64.d.ts +39 -0
  129. package/esm/deps/jsr.io/@std/encoding/1.0.11/base64.js +82 -0
  130. package/esm/deps/jsr.io/@std/encoding/1.0.11/base64url.d.ts +39 -0
  131. package/esm/deps/jsr.io/@std/encoding/1.0.11/base64url.js +72 -0
  132. package/esm/deps/jsr.io/@std/encoding/1.0.11/hex.d.ts +38 -0
  133. package/esm/deps/jsr.io/@std/encoding/1.0.11/hex.js +87 -0
  134. package/esm/deps/jsr.io/@std/encoding/1.0.11/mod.d.ts +97 -0
  135. package/esm/deps/jsr.io/@std/encoding/1.0.11/mod.js +99 -0
  136. package/esm/deps/jsr.io/@std/encoding/1.0.11/varint.d.ts +119 -0
  137. package/esm/deps/jsr.io/@std/encoding/1.0.11/varint.js +209 -0
  138. package/esm/deps/jsr.io/@std/http/1.1.3/status.d.ts +343 -0
  139. package/esm/deps/jsr.io/@std/http/1.1.3/status.js +343 -0
  140. package/esm/deps/jsr.io/@std/internal/1.0.14/assertion_state.d.ts +159 -0
  141. package/esm/deps/jsr.io/@std/internal/1.0.14/assertion_state.js +223 -0
  142. package/esm/deps/jsr.io/@std/internal/1.0.14/build_message.d.ts +79 -0
  143. package/esm/deps/jsr.io/@std/internal/1.0.14/build_message.js +116 -0
  144. package/esm/deps/jsr.io/@std/internal/1.0.14/diff.d.ts +139 -0
  145. package/esm/deps/jsr.io/@std/internal/1.0.14/diff.js +277 -0
  146. package/esm/deps/jsr.io/@std/internal/1.0.14/diff_str.d.ts +98 -0
  147. package/esm/deps/jsr.io/@std/internal/1.0.14/diff_str.js +181 -0
  148. package/esm/deps/jsr.io/@std/internal/1.0.14/format.d.ts +29 -0
  149. package/esm/deps/jsr.io/@std/internal/1.0.14/format.js +68 -0
  150. package/esm/deps/jsr.io/@std/internal/1.0.14/styles.d.ts +158 -0
  151. package/esm/deps/jsr.io/@std/internal/1.0.14/styles.js +206 -0
  152. package/esm/deps/jsr.io/@std/internal/1.0.14/types.d.ts +24 -0
  153. package/esm/deps/jsr.io/@std/internal/1.0.14/types.js +3 -0
  154. package/esm/deps/jsr.io/@std/testing/1.0.20/_test_suite.d.ts +91 -0
  155. package/esm/deps/jsr.io/@std/testing/1.0.20/_test_suite.js +347 -0
  156. package/esm/deps/jsr.io/@std/testing/1.0.20/bdd.d.ts +382 -0
  157. package/esm/deps/jsr.io/@std/testing/1.0.20/bdd.js +1110 -0
  158. package/esm/deps/jsr.io/@udibo/http-error/0.11.1/mod.d.ts +363 -0
  159. package/esm/deps/jsr.io/@udibo/http-error/0.11.1/mod.js +616 -0
  160. package/esm/errors.d.ts +203 -0
  161. package/esm/errors.js +287 -0
  162. package/esm/identity/captcha.d.ts +147 -0
  163. package/esm/identity/captcha.js +64 -0
  164. package/esm/identity/delivery.d.ts +96 -0
  165. package/esm/identity/delivery.js +41 -0
  166. package/esm/identity/errors.d.ts +39 -0
  167. package/esm/identity/errors.js +46 -0
  168. package/esm/identity/events.d.ts +242 -0
  169. package/esm/identity/events.js +39 -0
  170. package/esm/identity/external/_shared.d.ts +86 -0
  171. package/esm/identity/external/_shared.js +107 -0
  172. package/esm/identity/external/_token-exchange.d.ts +61 -0
  173. package/esm/identity/external/_token-exchange.js +179 -0
  174. package/esm/identity/external/apple-client-secret.d.ts +82 -0
  175. package/esm/identity/external/apple-client-secret.js +133 -0
  176. package/esm/identity/external/apple.d.ts +64 -0
  177. package/esm/identity/external/apple.js +248 -0
  178. package/esm/identity/external/discord.d.ts +38 -0
  179. package/esm/identity/external/discord.js +62 -0
  180. package/esm/identity/external/errors.d.ts +48 -0
  181. package/esm/identity/external/errors.js +36 -0
  182. package/esm/identity/external/flow.d.ts +107 -0
  183. package/esm/identity/external/flow.js +158 -0
  184. package/esm/identity/external/github.d.ts +42 -0
  185. package/esm/identity/external/github.js +164 -0
  186. package/esm/identity/external/google.d.ts +52 -0
  187. package/esm/identity/external/google.js +38 -0
  188. package/esm/identity/external/mod.d.ts +63 -0
  189. package/esm/identity/external/mod.js +61 -0
  190. package/esm/identity/external/oauth2.d.ts +110 -0
  191. package/esm/identity/external/oauth2.js +158 -0
  192. package/esm/identity/external/oidc.d.ts +81 -0
  193. package/esm/identity/external/oidc.js +250 -0
  194. package/esm/identity/external/provider.d.ts +132 -0
  195. package/esm/identity/external/provider.js +12 -0
  196. package/esm/identity/hibp.d.ts +67 -0
  197. package/esm/identity/hibp.js +87 -0
  198. package/esm/identity/identifier.d.ts +44 -0
  199. package/esm/identity/identifier.js +47 -0
  200. package/esm/identity/lockout.d.ts +155 -0
  201. package/esm/identity/lockout.js +117 -0
  202. package/esm/identity/mfa/mod.d.ts +42 -0
  203. package/esm/identity/mfa/mod.js +42 -0
  204. package/esm/identity/mfa/recovery-codes.d.ts +96 -0
  205. package/esm/identity/mfa/recovery-codes.js +80 -0
  206. package/esm/identity/mfa/service.d.ts +338 -0
  207. package/esm/identity/mfa/service.js +351 -0
  208. package/esm/identity/mfa/totp.d.ts +186 -0
  209. package/esm/identity/mfa/totp.js +194 -0
  210. package/esm/identity/migration.d.ts +155 -0
  211. package/esm/identity/migration.js +243 -0
  212. package/esm/identity/mod.d.ts +65 -0
  213. package/esm/identity/mod.js +64 -0
  214. package/esm/identity/otp.d.ts +255 -0
  215. package/esm/identity/otp.js +245 -0
  216. package/esm/identity/password-policy.d.ts +45 -0
  217. package/esm/identity/password-policy.js +60 -0
  218. package/esm/identity/password.d.ts +171 -0
  219. package/esm/identity/password.js +160 -0
  220. package/esm/identity/rate-limit.d.ts +192 -0
  221. package/esm/identity/rate-limit.js +168 -0
  222. package/esm/identity/service.d.ts +579 -0
  223. package/esm/identity/service.js +835 -0
  224. package/esm/identity/session.d.ts +122 -0
  225. package/esm/identity/session.js +48 -0
  226. package/esm/identity/token-flow.d.ts +214 -0
  227. package/esm/identity/token-flow.js +173 -0
  228. package/esm/models/authentication.d.ts +24 -0
  229. package/esm/models/authentication.js +1 -0
  230. package/esm/models/authorization-code.d.ts +63 -0
  231. package/esm/models/authorization-code.js +1 -0
  232. package/esm/models/authorization.d.ts +165 -0
  233. package/esm/models/authorization.js +160 -0
  234. package/esm/models/client.d.ts +78 -0
  235. package/esm/models/client.js +1 -0
  236. package/esm/models/device-authorization.d.ts +30 -0
  237. package/esm/models/device-authorization.js +1 -0
  238. package/esm/models/responses.d.ts +93 -0
  239. package/esm/models/responses.js +1 -0
  240. package/esm/models/scope.d.ts +81 -0
  241. package/esm/models/scope.js +125 -0
  242. package/esm/models/token.d.ts +135 -0
  243. package/esm/models/token.js +1 -0
  244. package/esm/package.json +3 -0
  245. package/esm/react/callback.d.ts +52 -0
  246. package/esm/react/callback.js +71 -0
  247. package/esm/react/components/class-names.d.ts +91 -0
  248. package/esm/react/components/class-names.js +118 -0
  249. package/esm/react/components/internal.d.ts +62 -0
  250. package/esm/react/components/internal.js +102 -0
  251. package/esm/react/components/mfa-challenge-form.d.ts +66 -0
  252. package/esm/react/components/mfa-challenge-form.js +46 -0
  253. package/esm/react/components/mfa-enrollment-form.d.ts +83 -0
  254. package/esm/react/components/mfa-enrollment-form.js +41 -0
  255. package/esm/react/components/mod.d.ts +103 -0
  256. package/esm/react/components/mod.js +93 -0
  257. package/esm/react/components/request-password-reset-form.d.ts +61 -0
  258. package/esm/react/components/request-password-reset-form.js +41 -0
  259. package/esm/react/components/reset-password-form.d.ts +66 -0
  260. package/esm/react/components/reset-password-form.js +56 -0
  261. package/esm/react/components/sign-in-form.d.ts +74 -0
  262. package/esm/react/components/sign-in-form.js +43 -0
  263. package/esm/react/components/sign-up-form.d.ts +85 -0
  264. package/esm/react/components/sign-up-form.js +57 -0
  265. package/esm/react/components/types.d.ts +208 -0
  266. package/esm/react/components/types.js +14 -0
  267. package/esm/react/components/use-auth-form.d.ts +118 -0
  268. package/esm/react/components/use-auth-form.js +172 -0
  269. package/esm/react/components/user-menu.d.ts +79 -0
  270. package/esm/react/components/user-menu.js +73 -0
  271. package/esm/react/context.d.ts +51 -0
  272. package/esm/react/context.js +16 -0
  273. package/esm/react/mod.d.ts +26 -0
  274. package/esm/react/mod.js +26 -0
  275. package/esm/react/provider.d.ts +40 -0
  276. package/esm/react/provider.js +189 -0
  277. package/esm/react/require-auth.d.ts +31 -0
  278. package/esm/react/require-auth.js +37 -0
  279. package/esm/react/testing.d.ts +322 -0
  280. package/esm/react/testing.js +461 -0
  281. package/esm/react/use-authorization.d.ts +31 -0
  282. package/esm/react/use-authorization.js +36 -0
  283. package/esm/react/use-oauth2.d.ts +112 -0
  284. package/esm/react/use-oauth2.js +127 -0
  285. package/esm/server/authorization-server.d.ts +736 -0
  286. package/esm/server/authorization-server.js +1304 -0
  287. package/esm/server/client-authentication.d.ts +28 -0
  288. package/esm/server/client-authentication.js +51 -0
  289. package/esm/server/grants/authorization-code.d.ts +179 -0
  290. package/esm/server/grants/authorization-code.js +232 -0
  291. package/esm/server/grants/client-credentials.d.ts +52 -0
  292. package/esm/server/grants/client-credentials.js +53 -0
  293. package/esm/server/grants/device-authorization.d.ts +103 -0
  294. package/esm/server/grants/device-authorization.js +156 -0
  295. package/esm/server/grants/grant.d.ts +165 -0
  296. package/esm/server/grants/grant.js +173 -0
  297. package/esm/server/grants/password.d.ts +80 -0
  298. package/esm/server/grants/password.js +92 -0
  299. package/esm/server/grants/refresh-token.d.ts +80 -0
  300. package/esm/server/grants/refresh-token.js +136 -0
  301. package/esm/server/introspection-token-reader.d.ts +153 -0
  302. package/esm/server/introspection-token-reader.js +164 -0
  303. package/esm/server/jwks-token-reader.d.ts +263 -0
  304. package/esm/server/jwks-token-reader.js +508 -0
  305. package/esm/server/mod.d.ts +23 -0
  306. package/esm/server/mod.js +15 -0
  307. package/esm/server/public-suffix/mod.d.ts +62 -0
  308. package/esm/server/public-suffix/mod.js +103 -0
  309. package/esm/server/public-suffix/rules.d.ts +23 -0
  310. package/esm/server/public-suffix/rules.js +23 -0
  311. package/esm/server/redirect-uri.d.ts +187 -0
  312. package/esm/server/redirect-uri.js +331 -0
  313. package/esm/server/resource-server.d.ts +286 -0
  314. package/esm/server/resource-server.js +365 -0
  315. package/esm/server/services/authorization-code.d.ts +84 -0
  316. package/esm/server/services/authorization-code.js +35 -0
  317. package/esm/server/services/client.d.ts +35 -0
  318. package/esm/server/services/client.js +1 -0
  319. package/esm/server/services/device-authorization.d.ts +134 -0
  320. package/esm/server/services/device-authorization.js +7 -0
  321. package/esm/server/services/token.d.ts +242 -0
  322. package/esm/server/services/token.js +78 -0
  323. package/esm/server/services/user.d.ts +29 -0
  324. package/esm/server/services/user.js +7 -0
  325. package/esm/server/signing-keys.d.ts +201 -0
  326. package/esm/server/signing-keys.js +225 -0
  327. package/esm/server/utils/hash.d.ts +6 -0
  328. package/esm/server/utils/hash.js +11 -0
  329. package/esm/testing/contract/authorization-code.d.ts +37 -0
  330. package/esm/testing/contract/authorization-code.js +93 -0
  331. package/esm/testing/contract/client.d.ts +85 -0
  332. package/esm/testing/contract/client.js +126 -0
  333. package/esm/testing/contract/device-authorization.d.ts +37 -0
  334. package/esm/testing/contract/device-authorization.js +193 -0
  335. package/esm/testing/contract/lockout-store.d.ts +47 -0
  336. package/esm/testing/contract/lockout-store.js +122 -0
  337. package/esm/testing/contract/mfa-store.d.ts +50 -0
  338. package/esm/testing/contract/mfa-store.js +226 -0
  339. package/esm/testing/contract/mod.d.ts +39 -0
  340. package/esm/testing/contract/mod.js +39 -0
  341. package/esm/testing/contract/otp-store.d.ts +48 -0
  342. package/esm/testing/contract/otp-store.js +197 -0
  343. package/esm/testing/contract/rate-limit-store.d.ts +52 -0
  344. package/esm/testing/contract/rate-limit-store.js +105 -0
  345. package/esm/testing/contract/token-flow-store.d.ts +54 -0
  346. package/esm/testing/contract/token-flow-store.js +179 -0
  347. package/esm/testing/contract/token-reader.d.ts +77 -0
  348. package/esm/testing/contract/token-reader.js +78 -0
  349. package/esm/testing/contract/token.d.ts +61 -0
  350. package/esm/testing/contract/token.js +287 -0
  351. package/esm/testing/contract/user.d.ts +63 -0
  352. package/esm/testing/contract/user.js +75 -0
  353. package/esm/testing/mod.d.ts +34 -0
  354. package/esm/testing/mod.js +34 -0
  355. package/esm/testing/server.d.ts +197 -0
  356. package/esm/testing/server.js +193 -0
  357. package/esm/testing/services.d.ts +373 -0
  358. package/esm/testing/services.js +703 -0
  359. package/esm/utils/_buffer.d.ts +10 -0
  360. package/esm/utils/_buffer.js +12 -0
  361. package/esm/utils/_timing-safe.d.ts +13 -0
  362. package/esm/utils/_timing-safe.js +22 -0
  363. package/esm/utils/authentication-context.d.ts +3 -0
  364. package/esm/utils/authentication-context.js +14 -0
  365. package/esm/utils/basic-auth.d.ts +50 -0
  366. package/esm/utils/basic-auth.js +106 -0
  367. package/esm/utils/crypto.d.ts +97 -0
  368. package/esm/utils/crypto.js +162 -0
  369. package/esm/utils/pkce.d.ts +151 -0
  370. package/esm/utils/pkce.js +179 -0
  371. package/esm/utils/text.d.ts +24 -0
  372. package/esm/utils/text.js +28 -0
  373. package/esm/utils/url.d.ts +66 -0
  374. package/esm/utils/url.js +90 -0
  375. package/package.json +92 -0
@@ -0,0 +1,66 @@
1
+ /**
2
+ * {@link ResetPasswordForm} — a default, accessible, unstyled "set a new
3
+ * password" form built on {@link useAuthForm}. Collects a new password and its
4
+ * confirmation, validates the match on the client, and forwards an opaque
5
+ * reset `token` (from the reset link) to your `onSubmit`.
6
+ *
7
+ * @module
8
+ */
9
+ import { type ReactNode } from "react";
10
+ import type { AuthFormState } from "./use-auth-form.js";
11
+ import type { BaseAuthFormProps } from "./types.js";
12
+ /** Values collected by {@link ResetPasswordForm}. */
13
+ export type ResetPasswordValues = {
14
+ /** The new password. */
15
+ password: string;
16
+ /** Confirmation of the new password. */
17
+ confirmPassword: string;
18
+ /** The opaque reset token from the link; passed through from `token`. */
19
+ token: string;
20
+ };
21
+ /** Visible text overrides for {@link ResetPasswordForm}. */
22
+ export interface ResetPasswordLabels {
23
+ /** Label for the password field. Default: `"New password"`. */
24
+ password?: string;
25
+ /** Label for the confirm field. Default: `"Confirm new password"`. */
26
+ confirmPassword?: string;
27
+ /** Submit button text. Default: `"Reset password"`. */
28
+ submit?: string;
29
+ /** Submit button text while submitting. Default: `"Resetting…"`. */
30
+ submitting?: string;
31
+ /** Password-mismatch message. Default: `"Passwords do not match."`. */
32
+ passwordMismatch?: string;
33
+ }
34
+ /** Props for {@link ResetPasswordForm}. */
35
+ export interface ResetPasswordFormProps extends BaseAuthFormProps<ResetPasswordValues> {
36
+ /** The opaque reset token, typically read from the URL by your route. */
37
+ token?: string;
38
+ /** Text overrides. */
39
+ labels?: ResetPasswordLabels;
40
+ /**
41
+ * Render-prop escape hatch. When provided, you own the markup and receive
42
+ * the live {@link AuthFormState}.
43
+ */
44
+ children?: (state: AuthFormState<ResetPasswordValues>) => ReactNode;
45
+ }
46
+ /**
47
+ * A ready-to-use "set a new password" form. Pass the reset `token` from the
48
+ * link; it is forwarded to `onSubmit` alongside the password. A client-side
49
+ * check blocks submission on password mismatch.
50
+ *
51
+ * @example
52
+ * ```tsx
53
+ * <ResetPasswordForm
54
+ * token={new URLSearchParams(location.search).get("token") ?? ""}
55
+ * onSubmit={async (values) => {
56
+ * const res = await fetch("/auth/reset-password", {
57
+ * method: "POST",
58
+ * headers: { "content-type": "application/json" },
59
+ * body: JSON.stringify(values),
60
+ * });
61
+ * if (!res.ok) return await res.json();
62
+ * }}
63
+ * />
64
+ * ```
65
+ */
66
+ export declare function ResetPasswordForm(props: ResetPasswordFormProps): ReactNode;
@@ -0,0 +1,56 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * {@link ResetPasswordForm} — a default, accessible, unstyled "set a new
4
+ * password" form built on {@link useAuthForm}. Collects a new password and its
5
+ * confirmation, validates the match on the client, and forwards an opaque
6
+ * reset `token` (from the reset link) to your `onSubmit`.
7
+ *
8
+ * @module
9
+ */
10
+ import { useEffect } from "react";
11
+ import { useAuthForm } from "./use-auth-form.js";
12
+ import { AuthFormShell, SubmitButton, TextField, useFocusFirstError, } from "./internal.js";
13
+ import { useAuthFormClassNames } from "./class-names.js";
14
+ /**
15
+ * A ready-to-use "set a new password" form. Pass the reset `token` from the
16
+ * link; it is forwarded to `onSubmit` alongside the password. A client-side
17
+ * check blocks submission on password mismatch.
18
+ *
19
+ * @example
20
+ * ```tsx
21
+ * <ResetPasswordForm
22
+ * token={new URLSearchParams(location.search).get("token") ?? ""}
23
+ * onSubmit={async (values) => {
24
+ * const res = await fetch("/auth/reset-password", {
25
+ * method: "POST",
26
+ * headers: { "content-type": "application/json" },
27
+ * body: JSON.stringify(values),
28
+ * });
29
+ * if (!res.ok) return await res.json();
30
+ * }}
31
+ * />
32
+ * ```
33
+ */
34
+ export function ResetPasswordForm(props) {
35
+ const { onSubmit, token = "", className, labels, children } = props;
36
+ const form = useAuthForm({
37
+ initialValues: { password: "", confirmPassword: "", token },
38
+ onSubmit,
39
+ onSuccess: props.onSuccess,
40
+ validate: (values) => {
41
+ const errors = {};
42
+ if (values.password !== values.confirmPassword) {
43
+ errors.confirmPassword = labels?.passwordMismatch ??
44
+ "Passwords do not match.";
45
+ }
46
+ return errors;
47
+ },
48
+ });
49
+ const { setValue } = form;
50
+ useEffect(() => {
51
+ setValue("token", token);
52
+ }, [token, setValue]);
53
+ useFocusFirstError(form);
54
+ const classNames = useAuthFormClassNames(props.classNames);
55
+ return (_jsxs(AuthFormShell, { name: "reset-password", form: form, className: className, classNames: classNames, render: children, action: props.action, method: props.method, formRef: props.formRef, children: [_jsx(TextField, { fieldProps: form.getFieldProps("password"), label: labels?.password ?? "New password", type: "password", autoComplete: "new-password", required: true, error: form.errors.password }), _jsx(TextField, { fieldProps: form.getFieldProps("confirmPassword"), label: labels?.confirmPassword ?? "Confirm new password", type: "password", autoComplete: "new-password", required: true, error: form.errors.confirmPassword }), _jsx(SubmitButton, { isSubmitting: form.isSubmitting, label: labels?.submit ?? "Reset password", submittingLabel: labels?.submitting ?? "Resetting…" })] }));
56
+ }
@@ -0,0 +1,74 @@
1
+ /**
2
+ * {@link SignInForm} — a default, accessible, unstyled sign-in form built on
3
+ * {@link useAuthForm}. Collects an identifier and password (optionally a
4
+ * "remember me" checkbox), renders "Continue with …" social buttons when
5
+ * providers are supplied, and reports the outcome through the injected
6
+ * `onSubmit`.
7
+ *
8
+ * @module
9
+ */
10
+ import type { ReactNode } from "react";
11
+ import type { AuthFormState } from "./use-auth-form.js";
12
+ import type { BaseAuthFormProps, SocialProvidersProps } from "./types.js";
13
+ /** Values collected by {@link SignInForm}. */
14
+ export type SignInValues = {
15
+ /** Email address or username. */
16
+ identifier: string;
17
+ /** The user's password. */
18
+ password: string;
19
+ /** Whether to keep the session beyond the browser session. */
20
+ remember: boolean;
21
+ };
22
+ /** Visible text overrides for {@link SignInForm}. */
23
+ export interface SignInLabels {
24
+ /** Label for the identifier field. Default: `"Email or username"`. */
25
+ identifier?: string;
26
+ /** Label for the password field. Default: `"Password"`. */
27
+ password?: string;
28
+ /** Label for the remember checkbox. Default: `"Remember me"`. */
29
+ remember?: string;
30
+ /** Submit button text. Default: `"Sign in"`. */
31
+ submit?: string;
32
+ /** Submit button text while submitting. Default: `"Signing in…"`. */
33
+ submitting?: string;
34
+ /** Text of the "forgot password" link. Default: `"Forgot password?"`. */
35
+ forgotPassword?: string;
36
+ }
37
+ /** Props for {@link SignInForm}. */
38
+ export interface SignInFormProps extends BaseAuthFormProps<SignInValues>, SocialProvidersProps {
39
+ /** Render the "remember me" checkbox. Default: `false`. */
40
+ showRemember?: boolean;
41
+ /** Href for the "forgot password?" link. Omit to hide the link. */
42
+ forgotPasswordHref?: string;
43
+ /** Text overrides. */
44
+ labels?: SignInLabels;
45
+ /**
46
+ * Render-prop escape hatch. When provided, you own the markup and receive
47
+ * the live {@link AuthFormState}; the component still owns state and submit.
48
+ */
49
+ children?: (state: AuthFormState<SignInValues>) => ReactNode;
50
+ }
51
+ /**
52
+ * A ready-to-use sign-in form. Wire `onSubmit` to your auth endpoint; pass
53
+ * `socialProviders` to add federated buttons. Drop to {@link useAuthForm} (or
54
+ * pass a function as `children`) for full markup control.
55
+ *
56
+ * @example
57
+ * ```tsx
58
+ * <SignInForm
59
+ * showRemember
60
+ * forgotPasswordHref="/forgot-password"
61
+ * socialProviders={[{ id: "github", name: "GitHub" }]}
62
+ * socialHref={(p) => `/auth/login?connection=${p.id}`}
63
+ * onSubmit={async (values) => {
64
+ * const res = await fetch("/auth/sign-in", {
65
+ * method: "POST",
66
+ * headers: { "content-type": "application/json" },
67
+ * body: JSON.stringify(values),
68
+ * });
69
+ * if (!res.ok) return await res.json();
70
+ * }}
71
+ * />
72
+ * ```
73
+ */
74
+ export declare function SignInForm(props: SignInFormProps): ReactNode;
@@ -0,0 +1,43 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useAuthForm } from "./use-auth-form.js";
3
+ import { AuthFormShell, SocialButtons, SubmitButton, TextField, useFocusFirstError, } from "./internal.js";
4
+ import { useAuthFormClassNames } from "./class-names.js";
5
+ /**
6
+ * A ready-to-use sign-in form. Wire `onSubmit` to your auth endpoint; pass
7
+ * `socialProviders` to add federated buttons. Drop to {@link useAuthForm} (or
8
+ * pass a function as `children`) for full markup control.
9
+ *
10
+ * @example
11
+ * ```tsx
12
+ * <SignInForm
13
+ * showRemember
14
+ * forgotPasswordHref="/forgot-password"
15
+ * socialProviders={[{ id: "github", name: "GitHub" }]}
16
+ * socialHref={(p) => `/auth/login?connection=${p.id}`}
17
+ * onSubmit={async (values) => {
18
+ * const res = await fetch("/auth/sign-in", {
19
+ * method: "POST",
20
+ * headers: { "content-type": "application/json" },
21
+ * body: JSON.stringify(values),
22
+ * });
23
+ * if (!res.ok) return await res.json();
24
+ * }}
25
+ * />
26
+ * ```
27
+ */
28
+ export function SignInForm(props) {
29
+ const { onSubmit, className, socialProviders, onSocialSelect, socialHref, showRemember = false, forgotPasswordHref, labels, children, } = props;
30
+ const form = useAuthForm({
31
+ initialValues: { identifier: "", password: "", remember: false },
32
+ onSubmit,
33
+ onSuccess: props.onSuccess,
34
+ });
35
+ useFocusFirstError(form);
36
+ const classNames = useAuthFormClassNames(props.classNames);
37
+ const rememberField = form.getFieldProps("remember");
38
+ return (_jsxs(AuthFormShell, { name: "sign-in", form: form, className: className, classNames: classNames, render: children, action: props.action, method: props.method, formRef: props.formRef, aboveForm: _jsx(SocialButtons, { socialProviders: socialProviders, onSocialSelect: onSocialSelect, socialHref: socialHref }), children: [_jsx(TextField, { fieldProps: form.getFieldProps("identifier"), label: labels?.identifier ?? "Email or username", autoComplete: "username", required: true, error: form.errors.identifier }), _jsx(TextField, { fieldProps: form.getFieldProps("password"), label: labels?.password ?? "Password", type: "password", autoComplete: "current-password", required: true, error: form.errors.password, children: forgotPasswordHref
39
+ ? (_jsx("a", { href: forgotPasswordHref, "data-oauth2-forgot-password": "", className: classNames.hint, children: labels?.forgotPassword ?? "Forgot password?" }))
40
+ : null }), showRemember
41
+ ? (_jsx("div", { "data-oauth2-field": "remember", className: classNames.field, children: _jsxs("label", { htmlFor: rememberField.id, "data-oauth2-label": "", className: classNames.label, children: [_jsx("input", { ...rememberField, type: "checkbox", "data-oauth2-input": "", className: classNames.input }), labels?.remember ?? "Remember me"] }) }))
42
+ : null, _jsx(SubmitButton, { isSubmitting: form.isSubmitting, label: labels?.submit ?? "Sign in", submittingLabel: labels?.submitting ?? "Signing in…" })] }));
43
+ }
@@ -0,0 +1,85 @@
1
+ /**
2
+ * {@link SignUpForm} — a default, accessible, unstyled account-creation form
3
+ * built on {@link useAuthForm}. Collects email and password, optionally a
4
+ * confirm-password, username, and name, validates the password match on the
5
+ * client, and renders social buttons when providers are supplied.
6
+ *
7
+ * @module
8
+ */
9
+ import type { ReactNode } from "react";
10
+ import type { AuthFormState } from "./use-auth-form.js";
11
+ import type { BaseAuthFormProps, SocialProvidersProps } from "./types.js";
12
+ /** Values collected by {@link SignUpForm}. */
13
+ export type SignUpValues = {
14
+ /** Email address. */
15
+ email: string;
16
+ /** The chosen password. */
17
+ password: string;
18
+ /** Confirmation of the password (present when `showConfirmPassword`). */
19
+ confirmPassword: string;
20
+ /** Username (present when `showUsername`). */
21
+ username: string;
22
+ /** Given name (present when `showName`). */
23
+ firstName: string;
24
+ /** Family name (present when `showName`). */
25
+ lastName: string;
26
+ };
27
+ /** Visible text overrides for {@link SignUpForm}. */
28
+ export interface SignUpLabels {
29
+ /** Label for the email field. Default: `"Email"`. */
30
+ email?: string;
31
+ /** Label for the username field. Default: `"Username"`. */
32
+ username?: string;
33
+ /** Label for the first-name field. Default: `"First name"`. */
34
+ firstName?: string;
35
+ /** Label for the last-name field. Default: `"Last name"`. */
36
+ lastName?: string;
37
+ /** Label for the password field. Default: `"Password"`. */
38
+ password?: string;
39
+ /** Label for the confirm-password field. Default: `"Confirm password"`. */
40
+ confirmPassword?: string;
41
+ /** Submit button text. Default: `"Create account"`. */
42
+ submit?: string;
43
+ /** Submit button text while submitting. Default: `"Creating account…"`. */
44
+ submitting?: string;
45
+ /** Password-mismatch message. Default: `"Passwords do not match."`. */
46
+ passwordMismatch?: string;
47
+ }
48
+ /** Props for {@link SignUpForm}. */
49
+ export interface SignUpFormProps extends BaseAuthFormProps<SignUpValues>, SocialProvidersProps {
50
+ /** Render the username field. Default: `false`. */
51
+ showUsername?: boolean;
52
+ /** Render the first/last name fields. Default: `false`. */
53
+ showName?: boolean;
54
+ /** Render the confirm-password field. Default: `true`. */
55
+ showConfirmPassword?: boolean;
56
+ /** Text overrides. */
57
+ labels?: SignUpLabels;
58
+ /**
59
+ * Render-prop escape hatch. When provided, you own the markup and receive
60
+ * the live {@link AuthFormState}.
61
+ */
62
+ children?: (state: AuthFormState<SignUpValues>) => ReactNode;
63
+ }
64
+ /**
65
+ * A ready-to-use account-creation form. Wire `onSubmit` to your sign-up
66
+ * endpoint. When the confirm-password field is shown, a client-side check
67
+ * blocks submission on mismatch before `onSubmit` runs.
68
+ *
69
+ * @example
70
+ * ```tsx
71
+ * <SignUpForm
72
+ * showUsername
73
+ * showName
74
+ * onSubmit={async (values) => {
75
+ * const res = await fetch("/auth/sign-up", {
76
+ * method: "POST",
77
+ * headers: { "content-type": "application/json" },
78
+ * body: JSON.stringify(values),
79
+ * });
80
+ * if (!res.ok) return await res.json();
81
+ * }}
82
+ * />
83
+ * ```
84
+ */
85
+ export declare function SignUpForm(props: SignUpFormProps): ReactNode;
@@ -0,0 +1,57 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useAuthForm } from "./use-auth-form.js";
3
+ import { AuthFormShell, SocialButtons, SubmitButton, TextField, useFocusFirstError, } from "./internal.js";
4
+ import { useAuthFormClassNames } from "./class-names.js";
5
+ /**
6
+ * A ready-to-use account-creation form. Wire `onSubmit` to your sign-up
7
+ * endpoint. When the confirm-password field is shown, a client-side check
8
+ * blocks submission on mismatch before `onSubmit` runs.
9
+ *
10
+ * @example
11
+ * ```tsx
12
+ * <SignUpForm
13
+ * showUsername
14
+ * showName
15
+ * onSubmit={async (values) => {
16
+ * const res = await fetch("/auth/sign-up", {
17
+ * method: "POST",
18
+ * headers: { "content-type": "application/json" },
19
+ * body: JSON.stringify(values),
20
+ * });
21
+ * if (!res.ok) return await res.json();
22
+ * }}
23
+ * />
24
+ * ```
25
+ */
26
+ export function SignUpForm(props) {
27
+ const { onSubmit, className, socialProviders, onSocialSelect, socialHref, showUsername = false, showName = false, showConfirmPassword = true, labels, children, } = props;
28
+ const form = useAuthForm({
29
+ initialValues: {
30
+ email: "",
31
+ password: "",
32
+ confirmPassword: "",
33
+ username: "",
34
+ firstName: "",
35
+ lastName: "",
36
+ },
37
+ onSubmit,
38
+ onSuccess: props.onSuccess,
39
+ validate: (values) => {
40
+ const errors = {};
41
+ if (showConfirmPassword && values.password !== values.confirmPassword) {
42
+ errors.confirmPassword = labels?.passwordMismatch ??
43
+ "Passwords do not match.";
44
+ }
45
+ return errors;
46
+ },
47
+ });
48
+ useFocusFirstError(form);
49
+ const classNames = useAuthFormClassNames(props.classNames);
50
+ return (_jsxs(AuthFormShell, { name: "sign-up", form: form, className: className, classNames: classNames, render: children, action: props.action, method: props.method, formRef: props.formRef, aboveForm: _jsx(SocialButtons, { socialProviders: socialProviders, onSocialSelect: onSocialSelect, socialHref: socialHref }), children: [showUsername
51
+ ? (_jsx(TextField, { fieldProps: form.getFieldProps("username"), label: labels?.username ?? "Username", autoComplete: "username", required: true, error: form.errors.username }))
52
+ : null, _jsx(TextField, { fieldProps: form.getFieldProps("email"), label: labels?.email ?? "Email", type: "email", autoComplete: "email", required: true, error: form.errors.email }), showName
53
+ ? (_jsxs(_Fragment, { children: [_jsx(TextField, { fieldProps: form.getFieldProps("firstName"), label: labels?.firstName ?? "First name", autoComplete: "given-name", required: true, error: form.errors.firstName }), _jsx(TextField, { fieldProps: form.getFieldProps("lastName"), label: labels?.lastName ?? "Last name", autoComplete: "family-name", required: true, error: form.errors.lastName })] }))
54
+ : null, _jsx(TextField, { fieldProps: form.getFieldProps("password"), label: labels?.password ?? "Password", type: "password", autoComplete: "new-password", required: true, error: form.errors.password }), showConfirmPassword
55
+ ? (_jsx(TextField, { fieldProps: form.getFieldProps("confirmPassword"), label: labels?.confirmPassword ?? "Confirm password", type: "password", autoComplete: "new-password", required: true, error: form.errors.confirmPassword }))
56
+ : null, _jsx(SubmitButton, { isSubmitting: form.isSubmitting, label: labels?.submit ?? "Create account", submittingLabel: labels?.submitting ?? "Creating account…" })] }));
57
+ }
@@ -0,0 +1,208 @@
1
+ /**
2
+ * Shared types for the prebuilt auth components
3
+ * (`@udibo/oauth2/react/components`).
4
+ *
5
+ * These types describe the wiring contract every component shares: how a
6
+ * submit handler reports success and errors ({@link AuthFormResult}), the
7
+ * per-slot class hooks used for theming ({@link BaseClassNames} and
8
+ * {@link AuthFormClassNames}), and the social-provider descriptor
9
+ * ({@link SocialProvider}). The headless hook state ({@link AuthFormState}) is
10
+ * defined alongside the hook in `use-auth-form.ts`.
11
+ *
12
+ * @module
13
+ */
14
+ import type { ReactNode, Ref } from "react";
15
+ /**
16
+ * A record of field values a form collects. Keys are field names; values are
17
+ * strings for text inputs and booleans for checkboxes.
18
+ */
19
+ export type AuthFormValues = Record<string, string | boolean>;
20
+ /**
21
+ * Per-field error messages keyed by field name. Only fields with an error
22
+ * appear; a missing key means the field is valid.
23
+ */
24
+ export type AuthFormErrors<V extends AuthFormValues> = Partial<Record<keyof V & string, string>>;
25
+ /**
26
+ * The result an {@link AuthSubmitHandler} may return to drive the form's UI.
27
+ *
28
+ * Return nothing (or an empty object) to signal success. Populate `error`
29
+ * and/or `fieldErrors` to surface validation problems inline without throwing.
30
+ * A thrown error is also treated as a form-level failure, using its message.
31
+ */
32
+ export interface AuthFormResult {
33
+ /** A form-level error message shown in the error summary region. */
34
+ error?: string;
35
+ /** Per-field error messages keyed by field name. */
36
+ fieldErrors?: Record<string, string>;
37
+ }
38
+ /**
39
+ * The app-provided function that performs a form's action — a client-side
40
+ * `fetch` in a plain React Router app, or a call that submits a router action
41
+ * in Juniper. Receives the collected values; resolve/return an
42
+ * {@link AuthFormResult} (or throw) to report the outcome.
43
+ */
44
+ export type AuthSubmitHandler<V extends AuthFormValues> = (values: V) => Promise<AuthFormResult | void> | AuthFormResult | void;
45
+ /**
46
+ * A social / federated identity provider to render a "Continue with …" button
47
+ * for. Supply an array of these to a sign-in or sign-up component and the
48
+ * buttons appear automatically; omit or pass an empty array for no social
49
+ * section.
50
+ */
51
+ export interface SocialProvider {
52
+ /** Stable identifier passed back to your handler / href builder. */
53
+ id: string;
54
+ /** Human-readable name rendered in the button ("Continue with {name}"). */
55
+ name: string;
56
+ /** Optional icon node rendered before the label. */
57
+ iconSlot?: ReactNode;
58
+ }
59
+ /**
60
+ * Props mixed into the sign-in / sign-up components for the social section.
61
+ * Provide `socialHref` to render anchors (full-page redirects), or
62
+ * `onSocialSelect` to render buttons that call back. `socialHref` wins when
63
+ * both are given.
64
+ */
65
+ export interface SocialProvidersProps {
66
+ /** Providers to render buttons for. Empty/absent → no social section. */
67
+ socialProviders?: SocialProvider[];
68
+ /** Called with the chosen provider when a social button is clicked. */
69
+ onSocialSelect?: (provider: SocialProvider) => void;
70
+ /** Builds the href for a provider; renders anchors instead of buttons. */
71
+ socialHref?: (provider: SocialProvider) => string;
72
+ }
73
+ /**
74
+ * The class hook every prebuilt component shares. Component-specific class-name
75
+ * maps ({@link AuthFormClassNames}, `UserMenuClassNames`) extend this, so `root`
76
+ * means the same thing everywhere.
77
+ */
78
+ export interface BaseClassNames {
79
+ /**
80
+ * The component's outermost element — the one carrying its
81
+ * `data-oauth2-form` / `data-oauth2-user-menu` marker. Merged with the
82
+ * component's top-level `className` prop.
83
+ */
84
+ root?: string;
85
+ }
86
+ /**
87
+ * Per-slot class hooks for theming the default form components — the complete
88
+ * slot set they share, so one map themes any of them and a form simply ignores
89
+ * the slots its markup has no element for. Every slot is optional; unset slots
90
+ * render with no class. Each rendered element also carries a stable
91
+ * `data-oauth2-*` attribute for CSS-only theming.
92
+ *
93
+ * Pass it as a component's `classNames` prop, or to
94
+ * `AuthFormClassNamesProvider` to theme every form in a subtree at once.
95
+ */
96
+ export interface AuthFormClassNames extends BaseClassNames {
97
+ /** The `<form>` element (`data-oauth2-form-element`). */
98
+ form?: string;
99
+ /** The form-level error summary region (`data-oauth2-error-summary`). */
100
+ errorSummary?: string;
101
+ /** Each field wrapper (`data-oauth2-field`). */
102
+ field?: string;
103
+ /** Each `<label>` (`data-oauth2-label`). */
104
+ label?: string;
105
+ /** Each `<input>` (`data-oauth2-input`). */
106
+ input?: string;
107
+ /** Each inline field error (`data-oauth2-error`). */
108
+ error?: string;
109
+ /**
110
+ * Inline content rendered under a field — today the sign-in form's "Forgot
111
+ * password?" link (`data-oauth2-forgot-password`).
112
+ */
113
+ hint?: string;
114
+ /** The actions row wrapping the submit button (`data-oauth2-actions`). */
115
+ actions?: string;
116
+ /** The submit `<button>` (`data-oauth2-submit`). */
117
+ submit?: string;
118
+ /**
119
+ * A secondary action below the submit button (`data-oauth2-secondary`) — the
120
+ * MFA challenge's recovery-code toggle is the one form that renders it, and it
121
+ * also carries `data-oauth2-toggle-recovery`.
122
+ */
123
+ secondary?: string;
124
+ /** The social section wrapper (`data-oauth2-social`). */
125
+ socialSection?: string;
126
+ /**
127
+ * The divider between the social section and the form
128
+ * (`data-oauth2-social-divider`). Rendered only when social providers are
129
+ * present.
130
+ */
131
+ socialDivider?: string;
132
+ /** Each social button/anchor (`data-oauth2-social-button`). */
133
+ socialButton?: string;
134
+ /**
135
+ * The terminal success panel that replaces the form (`data-oauth2-success`) —
136
+ * rendered by the forms that have a success state, such as
137
+ * `RequestPasswordResetForm`.
138
+ */
139
+ success?: string;
140
+ /** The secret display block (`data-oauth2-secret`), an `MfaEnrollmentForm` slot. */
141
+ secret?: string;
142
+ /** The QR slot wrapper (`data-oauth2-qr`), an `MfaEnrollmentForm` slot. */
143
+ qr?: string;
144
+ /**
145
+ * The recovery-codes list (`data-oauth2-recovery-codes`), an
146
+ * `MfaEnrollmentForm` slot.
147
+ */
148
+ recoveryCodes?: string;
149
+ /**
150
+ * Each recovery code item (`data-oauth2-recovery-code`), an
151
+ * `MfaEnrollmentForm` slot.
152
+ */
153
+ recoveryCode?: string;
154
+ }
155
+ /**
156
+ * Base props shared by the default form components: the injected submit
157
+ * handler, theming hooks, and an optional render-prop escape hatch.
158
+ *
159
+ * Passing a function as `children` "ejects" to headless mode: you receive the
160
+ * live {@link AuthFormState} and render your own markup, while the component
161
+ * keeps owning state and the submit lifecycle. For full control over state as
162
+ * well, call {@link useAuthForm} directly instead.
163
+ */
164
+ export interface BaseAuthFormProps<V extends AuthFormValues> {
165
+ /** The action that performs the submit. See {@link AuthSubmitHandler}. */
166
+ onSubmit: AuthSubmitHandler<V>;
167
+ /**
168
+ * Called after a successful submit, with the values that were submitted —
169
+ * the seam for navigating, redirecting, or revealing your own "done" panel
170
+ * without ejecting to {@link useAuthForm}. A promise it returns is awaited,
171
+ * but a throw or rejection is caught and logged rather than surfaced: the
172
+ * form still reports success.
173
+ */
174
+ onSuccess?: (values: V) => void;
175
+ /** Class for the root wrapper (merged with `classNames.root`). */
176
+ className?: string;
177
+ /**
178
+ * Per-slot class hooks for theming. Overrides an inherited
179
+ * `AuthFormClassNamesProvider` map slot by slot. See
180
+ * {@link AuthFormClassNames}.
181
+ */
182
+ classNames?: AuthFormClassNames;
183
+ /**
184
+ * `action` for the rendered `<form>`. Set it (with {@link method}) on a
185
+ * server-rendered page so the form still posts when JavaScript never
186
+ * arrives; every field carries its `name`, so a native post sends the same
187
+ * keys `onSubmit` receives. Once React is running, `onSubmit` handles the
188
+ * submit and the native post is suppressed.
189
+ *
190
+ * Ignored in render-prop mode — you own the `<form>` there.
191
+ */
192
+ action?: string;
193
+ /**
194
+ * `method` for the rendered `<form>`. Defaults to `"post"` whenever
195
+ * {@link action} is set, because the fields these forms render — passwords,
196
+ * one-time codes, reset tokens — must never reach a URL, where a `get` form
197
+ * would put them: browser history, the `Referer` sent to every third-party
198
+ * asset on the destination page, and the server's access log.
199
+ */
200
+ method?: "get" | "post";
201
+ /**
202
+ * Ref to the rendered `<form>` element — for example to call its native
203
+ * `submit()`, which bypasses `onSubmit` and posts to {@link action}.
204
+ *
205
+ * Ignored in render-prop mode.
206
+ */
207
+ formRef?: Ref<HTMLFormElement>;
208
+ }
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Shared types for the prebuilt auth components
3
+ * (`@udibo/oauth2/react/components`).
4
+ *
5
+ * These types describe the wiring contract every component shares: how a
6
+ * submit handler reports success and errors ({@link AuthFormResult}), the
7
+ * per-slot class hooks used for theming ({@link BaseClassNames} and
8
+ * {@link AuthFormClassNames}), and the social-provider descriptor
9
+ * ({@link SocialProvider}). The headless hook state ({@link AuthFormState}) is
10
+ * defined alongside the hook in `use-auth-form.ts`.
11
+ *
12
+ * @module
13
+ */
14
+ export {};