@draftlab/auth 0.15.0 → 0.16.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 (272) hide show
  1. package/dist/esm/allow.js +26 -0
  2. package/dist/esm/client.js +254 -0
  3. package/dist/esm/core.js +597 -0
  4. package/dist/esm/css.d.js +0 -0
  5. package/dist/esm/error.js +88 -0
  6. package/dist/esm/index.js +5 -0
  7. package/dist/esm/keys.js +126 -0
  8. package/dist/esm/mutex.js +53 -0
  9. package/dist/esm/pkce.js +87 -0
  10. package/dist/esm/provider/apple.js +15 -0
  11. package/dist/esm/provider/code.js +62 -0
  12. package/dist/esm/provider/discord.js +15 -0
  13. package/dist/esm/provider/facebook.js +15 -0
  14. package/dist/esm/provider/github.js +15 -0
  15. package/dist/esm/provider/gitlab.js +15 -0
  16. package/dist/esm/provider/google.js +16 -0
  17. package/dist/esm/provider/linkedin.js +15 -0
  18. package/dist/esm/provider/magiclink.js +83 -0
  19. package/dist/esm/provider/microsoft.js +15 -0
  20. package/dist/esm/provider/oauth2.js +130 -0
  21. package/dist/esm/provider/password.js +331 -0
  22. package/dist/esm/provider/provider.js +18 -0
  23. package/dist/esm/provider/reddit.js +15 -0
  24. package/dist/esm/provider/slack.js +15 -0
  25. package/dist/esm/provider/spotify.js +15 -0
  26. package/dist/esm/provider/twitch.js +15 -0
  27. package/dist/esm/provider/vercel.js +17 -0
  28. package/dist/esm/random.js +40 -0
  29. package/dist/esm/revocation.js +27 -0
  30. package/dist/esm/storage/memory.js +110 -0
  31. package/dist/esm/storage/storage.js +56 -0
  32. package/dist/esm/storage/turso.js +93 -0
  33. package/dist/esm/storage/unstorage.js +78 -0
  34. package/dist/esm/subject.js +7 -0
  35. package/dist/esm/themes/theme.js +115 -0
  36. package/dist/esm/toolkit/client.js +119 -0
  37. package/dist/esm/toolkit/index.js +25 -0
  38. package/dist/esm/toolkit/providers/facebook.js +11 -0
  39. package/dist/esm/toolkit/providers/github.js +11 -0
  40. package/dist/esm/toolkit/providers/google.js +11 -0
  41. package/dist/esm/toolkit/providers/strategy.js +0 -0
  42. package/dist/esm/toolkit/storage.js +81 -0
  43. package/dist/esm/toolkit/utils.js +18 -0
  44. package/dist/esm/types.js +0 -0
  45. package/dist/esm/ui/base.js +478 -0
  46. package/dist/esm/ui/code.js +186 -0
  47. package/dist/esm/ui/form.js +46 -0
  48. package/dist/esm/ui/icon.js +242 -0
  49. package/dist/esm/ui/magiclink.js +158 -0
  50. package/dist/esm/ui/password.js +435 -0
  51. package/dist/esm/ui/select.js +102 -0
  52. package/dist/esm/util.js +59 -0
  53. package/dist/{allow.d.mts → types/allow.d.ts} +9 -11
  54. package/dist/types/allow.d.ts.map +1 -0
  55. package/dist/types/client.d.ts +462 -0
  56. package/dist/types/client.d.ts.map +1 -0
  57. package/dist/types/core.d.ts +113 -0
  58. package/dist/types/core.d.ts.map +1 -0
  59. package/dist/{error.d.mts → types/error.d.ts} +95 -97
  60. package/dist/types/error.d.ts.map +1 -0
  61. package/dist/types/index.d.ts +2 -0
  62. package/dist/types/index.d.ts.map +1 -0
  63. package/dist/{keys.d.mts → types/keys.d.ts} +20 -24
  64. package/dist/types/keys.d.ts.map +1 -0
  65. package/dist/types/mutex.d.ts +42 -0
  66. package/dist/types/mutex.d.ts.map +1 -0
  67. package/dist/{pkce.d.mts → types/pkce.d.ts} +10 -11
  68. package/dist/types/pkce.d.ts.map +1 -0
  69. package/dist/types/provider/apple.d.ts +197 -0
  70. package/dist/types/provider/apple.d.ts.map +1 -0
  71. package/dist/types/provider/code.d.ts +288 -0
  72. package/dist/types/provider/code.d.ts.map +1 -0
  73. package/dist/types/provider/discord.d.ts +206 -0
  74. package/dist/types/provider/discord.d.ts.map +1 -0
  75. package/dist/types/provider/facebook.d.ts +200 -0
  76. package/dist/types/provider/facebook.d.ts.map +1 -0
  77. package/dist/types/provider/github.d.ts +220 -0
  78. package/dist/types/provider/github.d.ts.map +1 -0
  79. package/dist/types/provider/gitlab.d.ts +180 -0
  80. package/dist/types/provider/gitlab.d.ts.map +1 -0
  81. package/dist/types/provider/google.d.ts +158 -0
  82. package/dist/types/provider/google.d.ts.map +1 -0
  83. package/dist/types/provider/linkedin.d.ts +190 -0
  84. package/dist/types/provider/linkedin.d.ts.map +1 -0
  85. package/dist/types/provider/magiclink.d.ts +141 -0
  86. package/dist/types/provider/magiclink.d.ts.map +1 -0
  87. package/dist/types/provider/microsoft.d.ts +247 -0
  88. package/dist/types/provider/microsoft.d.ts.map +1 -0
  89. package/dist/types/provider/oauth2.d.ts +229 -0
  90. package/dist/types/provider/oauth2.d.ts.map +1 -0
  91. package/dist/types/provider/password.d.ts +408 -0
  92. package/dist/types/provider/password.d.ts.map +1 -0
  93. package/dist/types/provider/provider.d.ts +226 -0
  94. package/dist/types/provider/provider.d.ts.map +1 -0
  95. package/dist/types/provider/reddit.d.ts +159 -0
  96. package/dist/types/provider/reddit.d.ts.map +1 -0
  97. package/dist/types/provider/slack.d.ts +171 -0
  98. package/dist/types/provider/slack.d.ts.map +1 -0
  99. package/dist/types/provider/spotify.d.ts +168 -0
  100. package/dist/types/provider/spotify.d.ts.map +1 -0
  101. package/dist/types/provider/twitch.d.ts +163 -0
  102. package/dist/types/provider/twitch.d.ts.map +1 -0
  103. package/dist/types/provider/vercel.d.ts +294 -0
  104. package/dist/types/provider/vercel.d.ts.map +1 -0
  105. package/dist/{random.d.mts → types/random.d.ts} +4 -6
  106. package/dist/types/random.d.ts.map +1 -0
  107. package/dist/types/revocation.d.ts +76 -0
  108. package/dist/types/revocation.d.ts.map +1 -0
  109. package/dist/{storage/memory.d.mts → types/storage/memory.d.ts} +17 -21
  110. package/dist/types/storage/memory.d.ts.map +1 -0
  111. package/dist/types/storage/storage.d.ts +177 -0
  112. package/dist/types/storage/storage.d.ts.map +1 -0
  113. package/dist/{storage/turso.d.mts → types/storage/turso.d.ts} +4 -8
  114. package/dist/types/storage/turso.d.ts.map +1 -0
  115. package/dist/{storage/unstorage.d.mts → types/storage/unstorage.d.ts} +12 -11
  116. package/dist/types/storage/unstorage.d.ts.map +1 -0
  117. package/dist/types/subject.d.ts +115 -0
  118. package/dist/types/subject.d.ts.map +1 -0
  119. package/dist/types/themes/theme.d.ts +207 -0
  120. package/dist/types/themes/theme.d.ts.map +1 -0
  121. package/dist/types/toolkit/client.d.ts +235 -0
  122. package/dist/types/toolkit/client.d.ts.map +1 -0
  123. package/dist/types/toolkit/index.d.ts +45 -0
  124. package/dist/types/toolkit/index.d.ts.map +1 -0
  125. package/dist/types/toolkit/providers/facebook.d.ts +8 -0
  126. package/dist/types/toolkit/providers/facebook.d.ts.map +1 -0
  127. package/dist/types/toolkit/providers/github.d.ts +8 -0
  128. package/dist/types/toolkit/providers/github.d.ts.map +1 -0
  129. package/dist/types/toolkit/providers/google.d.ts +8 -0
  130. package/dist/types/toolkit/providers/google.d.ts.map +1 -0
  131. package/dist/types/toolkit/providers/strategy.d.ts +38 -0
  132. package/dist/types/toolkit/providers/strategy.d.ts.map +1 -0
  133. package/dist/{toolkit/storage.d.mts → types/toolkit/storage.d.ts} +37 -39
  134. package/dist/types/toolkit/storage.d.ts.map +1 -0
  135. package/dist/{toolkit/utils.d.mts → types/toolkit/utils.d.ts} +2 -4
  136. package/dist/types/toolkit/utils.d.ts.map +1 -0
  137. package/dist/types/types.d.ts +92 -0
  138. package/dist/types/types.d.ts.map +1 -0
  139. package/dist/types/ui/base.d.ts +18 -0
  140. package/dist/types/ui/base.d.ts.map +1 -0
  141. package/dist/types/ui/code.d.ts +43 -0
  142. package/dist/types/ui/code.d.ts.map +1 -0
  143. package/dist/types/ui/form.d.ts +24 -0
  144. package/dist/types/ui/form.d.ts.map +1 -0
  145. package/dist/types/ui/icon.d.ts +60 -0
  146. package/dist/types/ui/icon.d.ts.map +1 -0
  147. package/dist/types/ui/magiclink.d.ts +41 -0
  148. package/dist/types/ui/magiclink.d.ts.map +1 -0
  149. package/dist/types/ui/password.d.ts +43 -0
  150. package/dist/types/ui/password.d.ts.map +1 -0
  151. package/dist/types/ui/select.d.ts +33 -0
  152. package/dist/types/ui/select.d.ts.map +1 -0
  153. package/dist/{util.d.mts → types/util.d.ts} +11 -13
  154. package/dist/types/util.d.ts.map +1 -0
  155. package/package.json +10 -16
  156. package/dist/adapters/node.d.mts +0 -18
  157. package/dist/adapters/node.mjs +0 -69
  158. package/dist/allow.mjs +0 -63
  159. package/dist/client.d.mts +0 -456
  160. package/dist/client.mjs +0 -283
  161. package/dist/core.d.mts +0 -110
  162. package/dist/core.mjs +0 -595
  163. package/dist/error.mjs +0 -237
  164. package/dist/index.d.mts +0 -2
  165. package/dist/index.mjs +0 -3
  166. package/dist/keys.mjs +0 -146
  167. package/dist/mutex.d.mts +0 -44
  168. package/dist/mutex.mjs +0 -110
  169. package/dist/pkce.mjs +0 -157
  170. package/dist/provider/apple.d.mts +0 -111
  171. package/dist/provider/apple.mjs +0 -164
  172. package/dist/provider/code.d.mts +0 -228
  173. package/dist/provider/code.mjs +0 -246
  174. package/dist/provider/discord.d.mts +0 -146
  175. package/dist/provider/discord.mjs +0 -156
  176. package/dist/provider/facebook.d.mts +0 -142
  177. package/dist/provider/facebook.mjs +0 -150
  178. package/dist/provider/github.d.mts +0 -140
  179. package/dist/provider/github.mjs +0 -169
  180. package/dist/provider/gitlab.d.mts +0 -106
  181. package/dist/provider/gitlab.mjs +0 -147
  182. package/dist/provider/google.d.mts +0 -112
  183. package/dist/provider/google.mjs +0 -109
  184. package/dist/provider/linkedin.d.mts +0 -132
  185. package/dist/provider/linkedin.mjs +0 -142
  186. package/dist/provider/magiclink.d.mts +0 -89
  187. package/dist/provider/magiclink.mjs +0 -143
  188. package/dist/provider/microsoft.d.mts +0 -178
  189. package/dist/provider/microsoft.mjs +0 -177
  190. package/dist/provider/oauth2.d.mts +0 -176
  191. package/dist/provider/oauth2.mjs +0 -222
  192. package/dist/provider/passkey.d.mts +0 -104
  193. package/dist/provider/passkey.mjs +0 -320
  194. package/dist/provider/password.d.mts +0 -412
  195. package/dist/provider/password.mjs +0 -363
  196. package/dist/provider/provider.d.mts +0 -227
  197. package/dist/provider/provider.mjs +0 -44
  198. package/dist/provider/reddit.d.mts +0 -107
  199. package/dist/provider/reddit.mjs +0 -127
  200. package/dist/provider/slack.d.mts +0 -114
  201. package/dist/provider/slack.mjs +0 -138
  202. package/dist/provider/spotify.d.mts +0 -113
  203. package/dist/provider/spotify.mjs +0 -135
  204. package/dist/provider/totp.d.mts +0 -112
  205. package/dist/provider/totp.mjs +0 -191
  206. package/dist/provider/twitch.d.mts +0 -108
  207. package/dist/provider/twitch.mjs +0 -131
  208. package/dist/provider/vercel.d.mts +0 -177
  209. package/dist/provider/vercel.mjs +0 -230
  210. package/dist/random.mjs +0 -86
  211. package/dist/revocation.d.mts +0 -55
  212. package/dist/revocation.mjs +0 -63
  213. package/dist/router/context.d.mts +0 -21
  214. package/dist/router/context.mjs +0 -193
  215. package/dist/router/cookies.d.mts +0 -8
  216. package/dist/router/cookies.mjs +0 -13
  217. package/dist/router/index.d.mts +0 -21
  218. package/dist/router/index.mjs +0 -107
  219. package/dist/router/matcher.d.mts +0 -15
  220. package/dist/router/matcher.mjs +0 -76
  221. package/dist/router/middleware/cors.d.mts +0 -15
  222. package/dist/router/middleware/cors.mjs +0 -114
  223. package/dist/router/safe-request.d.mts +0 -52
  224. package/dist/router/safe-request.mjs +0 -160
  225. package/dist/router/types.d.mts +0 -67
  226. package/dist/router/types.mjs +0 -1
  227. package/dist/router/variables.d.mts +0 -12
  228. package/dist/router/variables.mjs +0 -20
  229. package/dist/storage/memory.mjs +0 -125
  230. package/dist/storage/storage.d.mts +0 -179
  231. package/dist/storage/storage.mjs +0 -104
  232. package/dist/storage/turso.mjs +0 -117
  233. package/dist/storage/unstorage.mjs +0 -103
  234. package/dist/subject.d.mts +0 -62
  235. package/dist/subject.mjs +0 -36
  236. package/dist/themes/theme.d.mts +0 -209
  237. package/dist/themes/theme.mjs +0 -120
  238. package/dist/toolkit/client.d.mts +0 -169
  239. package/dist/toolkit/client.mjs +0 -209
  240. package/dist/toolkit/index.d.mts +0 -9
  241. package/dist/toolkit/index.mjs +0 -9
  242. package/dist/toolkit/providers/facebook.d.mts +0 -12
  243. package/dist/toolkit/providers/facebook.mjs +0 -16
  244. package/dist/toolkit/providers/github.d.mts +0 -12
  245. package/dist/toolkit/providers/github.mjs +0 -16
  246. package/dist/toolkit/providers/google.d.mts +0 -12
  247. package/dist/toolkit/providers/google.mjs +0 -20
  248. package/dist/toolkit/providers/strategy.d.mts +0 -40
  249. package/dist/toolkit/providers/strategy.mjs +0 -1
  250. package/dist/toolkit/storage.mjs +0 -157
  251. package/dist/toolkit/utils.mjs +0 -30
  252. package/dist/types.d.mts +0 -94
  253. package/dist/types.mjs +0 -1
  254. package/dist/ui/base.d.mts +0 -30
  255. package/dist/ui/base.mjs +0 -407
  256. package/dist/ui/code.d.mts +0 -43
  257. package/dist/ui/code.mjs +0 -173
  258. package/dist/ui/form.d.mts +0 -32
  259. package/dist/ui/form.mjs +0 -49
  260. package/dist/ui/icon.d.mts +0 -58
  261. package/dist/ui/icon.mjs +0 -247
  262. package/dist/ui/magiclink.d.mts +0 -41
  263. package/dist/ui/magiclink.mjs +0 -152
  264. package/dist/ui/passkey.d.mts +0 -27
  265. package/dist/ui/passkey.mjs +0 -323
  266. package/dist/ui/password.d.mts +0 -42
  267. package/dist/ui/password.mjs +0 -402
  268. package/dist/ui/select.d.mts +0 -34
  269. package/dist/ui/select.mjs +0 -98
  270. package/dist/ui/totp.d.mts +0 -34
  271. package/dist/ui/totp.mjs +0 -270
  272. package/dist/util.mjs +0 -128
@@ -0,0 +1,462 @@
1
+ import type { StandardSchemaV1 } from "@standard-schema/spec";
2
+ import { InvalidAccessTokenError, InvalidAuthorizationCodeError, InvalidRefreshTokenError, InvalidSubjectError } from "./error";
3
+ import type { SubjectSchema } from "./subject";
4
+ /**
5
+ * Result type for operations that can succeed or fail.
6
+ *
7
+ * @template T - The success data type
8
+ * @template E - The error type
9
+ *
10
+ * @example
11
+ * ```ts
12
+ * const result = await client.exchange(code, redirectUri)
13
+ * if (result.success) {
14
+ * // Access token available: result.data.access
15
+ * } else {
16
+ * // Handle error: result.error.message
17
+ * }
18
+ * ```
19
+ */
20
+ export type Result<T, E = Error> = {
21
+ success: true;
22
+ data: T;
23
+ } | {
24
+ success: false;
25
+ error: E;
26
+ };
27
+ interface FetchResponse {
28
+ ok: boolean;
29
+ text(): Promise<string>;
30
+ json(): Promise<unknown>;
31
+ }
32
+ type FetchLike = (url: string, init?: RequestInit) => Promise<FetchResponse>;
33
+ /**
34
+ * Authorization server metadata from well-known endpoints.
35
+ */
36
+ export interface WellKnown {
37
+ /**
38
+ * URI to the JWKS endpoint for token verification.
39
+ */
40
+ jwks_uri: string;
41
+ /**
42
+ * URI to the token endpoint for authorization code exchange.
43
+ */
44
+ token_endpoint: string;
45
+ /**
46
+ * URI to the authorization endpoint for starting flows.
47
+ */
48
+ authorization_endpoint: string;
49
+ }
50
+ /**
51
+ * Tokens returned by the authorization server.
52
+ */
53
+ export interface Tokens {
54
+ /**
55
+ * Access token for making authenticated API requests.
56
+ */
57
+ access: string;
58
+ /**
59
+ * Refresh token for obtaining new access tokens.
60
+ */
61
+ refresh: string;
62
+ /**
63
+ * Number of seconds until the access token expires.
64
+ */
65
+ expiresIn: number;
66
+ }
67
+ /**
68
+ * Challenge data for PKCE flows.
69
+ */
70
+ export type Challenge = {
71
+ /**
72
+ * State parameter for CSRF protection.
73
+ */
74
+ state: string;
75
+ /**
76
+ * PKCE code verifier for token exchange.
77
+ */
78
+ verifier?: string;
79
+ };
80
+ /**
81
+ * Client configuration options.
82
+ */
83
+ export interface ClientInput {
84
+ /**
85
+ * Client ID that identifies your application.
86
+ *
87
+ * @example
88
+ * ```ts
89
+ * {
90
+ * clientID: "my-web-app"
91
+ * }
92
+ * ```
93
+ */
94
+ clientID: string;
95
+ /**
96
+ * Base URL of your Draft Auth server.
97
+ *
98
+ * @example
99
+ * ```ts
100
+ * {
101
+ * issuer: "https://auth.myserver.com"
102
+ * }
103
+ * ```
104
+ */
105
+ issuer: string;
106
+ /**
107
+ * Optionally, override the internally used fetch function.
108
+ *
109
+ * @example
110
+ * ```ts
111
+ * {
112
+ * fetch: customFetch
113
+ * }
114
+ * ```
115
+ */
116
+ fetch?: FetchLike;
117
+ }
118
+ /**
119
+ * Options for starting an authorization flow.
120
+ */
121
+ export interface AuthorizeOptions {
122
+ /**
123
+ * Enable PKCE flow for enhanced security.
124
+ *
125
+ * Recommended for single-page applications and mobile apps.
126
+ *
127
+ * @default false
128
+ * @example
129
+ * ```ts
130
+ * {
131
+ * pkce: true
132
+ * }
133
+ * ```
134
+ */
135
+ pkce?: boolean;
136
+ /**
137
+ * Specific authentication provider to use.
138
+ *
139
+ * If not specified, users see a provider selection screen
140
+ * or are redirected to the single configured provider.
141
+ *
142
+ * @example
143
+ * ```ts
144
+ * {
145
+ * provider: "google"
146
+ * }
147
+ * ```
148
+ */
149
+ provider?: string;
150
+ }
151
+ /**
152
+ * Result of starting an authorization flow.
153
+ */
154
+ export interface AuthorizeResult {
155
+ /**
156
+ * Challenge data needed for PKCE flows.
157
+ *
158
+ * Store this securely and use when exchanging the code.
159
+ *
160
+ * @example
161
+ * ```ts
162
+ * sessionStorage.setItem("challenge", JSON.stringify(challenge))
163
+ * ```
164
+ */
165
+ challenge: Challenge;
166
+ /**
167
+ * Authorization URL to redirect the user to.
168
+ *
169
+ * @example
170
+ * ```ts
171
+ * window.location.href = url
172
+ * ```
173
+ */
174
+ url: string;
175
+ }
176
+ /**
177
+ * Options for token refresh operations.
178
+ */
179
+ export interface RefreshOptions {
180
+ /**
181
+ * Current access token to check before refreshing.
182
+ *
183
+ * Helps avoid unnecessary refresh requests.
184
+ *
185
+ * @example
186
+ * ```ts
187
+ * {
188
+ * access: currentAccessToken
189
+ * }
190
+ * ```
191
+ */
192
+ access?: string;
193
+ }
194
+ /**
195
+ * Options for token verification.
196
+ */
197
+ export interface VerifyOptions {
198
+ /**
199
+ * Refresh token for automatic refresh if access token is expired.
200
+ *
201
+ * If passed in, this will automatically refresh the access token if it has expired.
202
+ *
203
+ * @example
204
+ * ```ts
205
+ * {
206
+ * refresh: refreshToken
207
+ * }
208
+ * ```
209
+ */
210
+ refresh?: string;
211
+ /**
212
+ * Expected issuer for validation.
213
+ * @internal
214
+ */
215
+ issuer?: string;
216
+ /**
217
+ * Expected audience for validation.
218
+ * Defaults to clientID for security. Override only if you know what you're doing.
219
+ * @internal
220
+ */
221
+ audience?: string;
222
+ /**
223
+ * Custom fetch for HTTP requests.
224
+ *
225
+ * Optionally, override the internally used fetch function.
226
+ */
227
+ fetch?: FetchLike;
228
+ }
229
+ /**
230
+ * Result of successful token verification.
231
+ */
232
+ export interface VerifyResult<T extends SubjectSchema> {
233
+ /**
234
+ * New tokens if access token was refreshed during verification.
235
+ */
236
+ tokens?: Tokens;
237
+ /**
238
+ * Audience (client ID) the token was issued for.
239
+ * @internal
240
+ */
241
+ aud: string;
242
+ /**
243
+ * Unique subject identifier.
244
+ *
245
+ * This is a stable, consistent identifier derived from the subject type and properties.
246
+ * Format: `{type}:{hash}` (e.g., `user:30e16a2659c8bbb2`)
247
+ */
248
+ sub: string;
249
+ /**
250
+ * Decoded subject information from the access token.
251
+ *
252
+ * Contains user data that was encoded when the token was issued.
253
+ */
254
+ subject: {
255
+ [K in keyof T]: {
256
+ type: K;
257
+ properties: StandardSchemaV1.InferOutput<T[K]>;
258
+ };
259
+ }[keyof T];
260
+ }
261
+ /**
262
+ * Options for token revocation.
263
+ */
264
+ export interface RevokeOptions {
265
+ /**
266
+ * Optional hint about the token type.
267
+ * Can be "access_token" or "refresh_token".
268
+ *
269
+ * Helps the server optimize token lookup.
270
+ *
271
+ * @example
272
+ * ```ts
273
+ * {
274
+ * tokenTypeHint: "refresh_token"
275
+ * }
276
+ * ```
277
+ */
278
+ tokenTypeHint?: "access_token" | "refresh_token";
279
+ }
280
+ /**
281
+ * Draft Auth client with OAuth 2.0 operations.
282
+ */
283
+ export interface Client {
284
+ /**
285
+ * Start an OAuth authorization flow.
286
+ *
287
+ * @param redirectURI - Where users will be sent after authorization
288
+ * @param response - Response type ("code" or "token")
289
+ * @param opts - Additional authorization options
290
+ * @returns Authorization URL and challenge data
291
+ *
292
+ * @example Basic flow
293
+ * ```ts
294
+ * const result = await client.authorize(
295
+ * "https://myapp.com/callback",
296
+ * "code"
297
+ * )
298
+ * if (result.success) {
299
+ * window.location.href = result.data.url
300
+ * }
301
+ * ```
302
+ *
303
+ * @example PKCE flow
304
+ * ```ts
305
+ * const result = await client.authorize(
306
+ * "https://spa.example.com/callback",
307
+ * "code",
308
+ * { pkce: true, scopes: ["read", "write"] }
309
+ * )
310
+ * if (result.success) {
311
+ * sessionStorage.setItem("challenge", JSON.stringify(result.data.challenge))
312
+ * window.location.href = result.data.url
313
+ * }
314
+ * ```
315
+ */
316
+ authorize(redirectURI: string, response: "code" | "token", opts?: AuthorizeOptions): Promise<Result<AuthorizeResult>>;
317
+ /**
318
+ * Exchange authorization code for tokens.
319
+ *
320
+ * @param code - Authorization code from the callback
321
+ * @param redirectURI - Same redirect URI used in authorization
322
+ * @param verifier - PKCE code verifier (required for PKCE flows)
323
+ * @returns Access tokens and metadata
324
+ *
325
+ * @example Basic exchange
326
+ * ```ts
327
+ * const urlParams = new URLSearchParams(window.location.search)
328
+ * const code = urlParams.get('code')
329
+ *
330
+ * if (code) {
331
+ * const result = await client.exchange(code, "https://myapp.com/callback")
332
+ * if (result.success) {
333
+ * const { access, refresh } = result.data
334
+ * // Store tokens securely
335
+ * }
336
+ * }
337
+ * ```
338
+ *
339
+ * @example PKCE exchange
340
+ * ```ts
341
+ * const challenge = JSON.parse(sessionStorage.getItem("challenge") || "{}")
342
+ * const code = new URLSearchParams(window.location.search).get('code')
343
+ *
344
+ * if (code && challenge.verifier) {
345
+ * const result = await client.exchange(
346
+ * code,
347
+ * "https://spa.example.com/callback",
348
+ * challenge.verifier
349
+ * )
350
+ * if (result.success) {
351
+ * sessionStorage.removeItem("challenge")
352
+ * // Handle tokens
353
+ * }
354
+ * }
355
+ * ```
356
+ */
357
+ exchange(code: string, redirectURI: string, verifier?: string): Promise<Result<Tokens, InvalidAuthorizationCodeError>>;
358
+ /**
359
+ * Refresh an access token using a refresh token.
360
+ *
361
+ * @param refresh - Refresh token to use
362
+ * @param opts - Additional refresh options
363
+ * @returns New tokens if refresh was needed
364
+ *
365
+ * @example Basic refresh
366
+ * ```ts
367
+ * const result = await client.refresh(storedRefreshToken)
368
+ *
369
+ * if (result.success && result.data.tokens) {
370
+ * const { access, refresh: newRefresh } = result.data.tokens
371
+ * updateStoredTokens(access, newRefresh)
372
+ * } else if (result.success) {
373
+ * // Token still valid
374
+ * } else {
375
+ * redirectToLogin()
376
+ * }
377
+ * ```
378
+ */
379
+ refresh(refresh: string, opts?: RefreshOptions): Promise<Result<{
380
+ tokens?: Tokens;
381
+ }, InvalidRefreshTokenError | InvalidAccessTokenError>>;
382
+ /**
383
+ * Verify and decode an access token.
384
+ *
385
+ * @param subjects - Subject schema used when creating the issuer
386
+ * @param token - Access token to verify
387
+ * @param options - Additional verification options
388
+ * @returns Decoded token data and user information
389
+ *
390
+ * @example Basic verification
391
+ * ```ts
392
+ * const result = await client.verify(subjects, accessToken)
393
+ *
394
+ * if (result.success) {
395
+ * const { subject, scopes } = result.data
396
+ * // Access user ID: subject.properties.userID
397
+ * // Access scopes: scopes?.join(', ')
398
+ * }
399
+ * ```
400
+ *
401
+ * @example With automatic refresh
402
+ * ```ts
403
+ * const result = await client.verify(subjects, accessToken, {
404
+ * refresh: refreshToken
405
+ * })
406
+ *
407
+ * if (result.success) {
408
+ * if (result.data.tokens) {
409
+ * // Tokens were refreshed
410
+ * updateStoredTokens(result.data.tokens.access, result.data.tokens.refresh)
411
+ * }
412
+ * // Use verified subject data
413
+ * const user = result.data.subject.properties
414
+ * }
415
+ * ```
416
+ */
417
+ verify<T extends SubjectSchema>(subjects: T, token: string, options?: VerifyOptions): Promise<Result<VerifyResult<T>, InvalidRefreshTokenError | InvalidAccessTokenError | InvalidSubjectError>>;
418
+ /**
419
+ * Revoke a token (access or refresh token).
420
+ *
421
+ * Once revoked, the token cannot be used to access resources or refresh.
422
+ * Useful for implementing logout functionality.
423
+ *
424
+ * @param token - The token to revoke
425
+ * @param opts - Additional revocation options
426
+ * @returns Empty result on success
427
+ *
428
+ * @example Logout with refresh token revocation
429
+ * ```ts
430
+ * const result = await client.revoke(refreshToken, {
431
+ * tokenTypeHint: "refresh_token"
432
+ * })
433
+ *
434
+ * if (result.success) {
435
+ * // Token revoked successfully, user is logged out
436
+ * clearStoredTokens()
437
+ * redirectToHome()
438
+ * } else {
439
+ * // Revocation failed, but still clear tokens on client
440
+ * clearStoredTokens()
441
+ * }
442
+ * ```
443
+ */
444
+ revoke(token: string, opts?: RevokeOptions): Promise<Result<void>>;
445
+ }
446
+ /**
447
+ * Create a Draft Auth client.
448
+ *
449
+ * @param input - Client configuration
450
+ * @returns Configured client instance
451
+ *
452
+ * @example Basic setup
453
+ * ```ts
454
+ * const client = createClient({
455
+ * clientID: "my-web-app",
456
+ * issuer: "https://auth.mycompany.com"
457
+ * })
458
+ * ```
459
+ */
460
+ export declare const createClient: (input: ClientInput) => Client;
461
+ export {};
462
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,113 @@
1
+ /**
2
+ * Core issuer implementation using Hono.
3
+ */
4
+ import { Hono } from "hono";
5
+ import { type AllowCheckInput } from "./allow";
6
+ import { UnknownStateError } from "./error";
7
+ import type { Provider } from "./provider/provider";
8
+ import { type StorageAdapter } from "./storage/storage";
9
+ import type { SubjectPayload, SubjectSchema } from "./subject";
10
+ import { type Theme } from "./themes/theme";
11
+ import type { AuthorizationState } from "./types";
12
+ import { type Prettify } from "./util";
13
+ /**
14
+ * Sets the subject payload in the JWT token and returns the response.
15
+ */
16
+ export interface OnSuccessResponder<T extends {
17
+ type: string;
18
+ properties: unknown;
19
+ }> {
20
+ subject<Type extends T["type"]>(type: Type, properties: Extract<T, {
21
+ type: Type;
22
+ }>["properties"], opts?: {
23
+ ttl?: {
24
+ access?: number;
25
+ refresh?: number;
26
+ };
27
+ subject?: string;
28
+ }): Promise<Response>;
29
+ }
30
+ /**
31
+ * Main issuer input configuration interface.
32
+ */
33
+ interface IssuerInput<Providers extends Record<string, Provider<unknown>>, Subjects extends SubjectSchema, Result = {
34
+ [Key in keyof Providers]: Prettify<{
35
+ provider: Key;
36
+ } & (Providers[Key] extends Provider<infer T> ? T : Record<string, unknown>)>;
37
+ }[keyof Providers]> {
38
+ /** The storage adapter for persisting tokens and sessions */
39
+ storage: StorageAdapter;
40
+ /** Auth providers configuration */
41
+ providers: Providers;
42
+ /** Subject schemas for token validation */
43
+ subjects: Subjects;
44
+ /** Base path for embedded scenarios (e.g., "/auth" or "/api/auth") */
45
+ basePath?: string;
46
+ /** Success callback for completed authentication */
47
+ success(response: OnSuccessResponder<SubjectPayload<Subjects>>, input: Result, req: Request, clientID: string): Promise<Response>;
48
+ /** Theme configuration for UI */
49
+ theme?: Theme;
50
+ /** TTL configuration for tokens and sessions */
51
+ ttl?: {
52
+ access?: number;
53
+ refresh?: number;
54
+ reuse?: number;
55
+ retention?: number;
56
+ };
57
+ /** Provider selection UI function */
58
+ select?(providers: Record<string, string>, req: Request): Promise<Response>;
59
+ /** Optional start callback */
60
+ start?(req: Request): Promise<void>;
61
+ /** Error handling callback */
62
+ error?(error: UnknownStateError, req: Request): Promise<Response>;
63
+ /** Client authorization check function */
64
+ allow?(input: AllowCheckInput, req: Request): Promise<boolean>;
65
+ /**
66
+ * Refresh callback for updating user claims.
67
+ *
68
+ * @example
69
+ * ```typescript
70
+ * refresh: async (payload, req) => {
71
+ * const user = await getUserBySubject(payload.subject)
72
+ * if (!user || !user.active) {
73
+ * return undefined // Revoke the token
74
+ * }
75
+ *
76
+ * return {
77
+ * type: payload.type,
78
+ * properties: {
79
+ * userID: user.id,
80
+ * role: user.role,
81
+ * permissions: user.permissions,
82
+ * lastLogin: new Date().toISOString()
83
+ * }
84
+ * }
85
+ * }
86
+ * ```
87
+ */
88
+ refresh?(payload: {
89
+ type: SubjectPayload<Subjects>["type"];
90
+ properties: SubjectPayload<Subjects>["properties"];
91
+ subject: string;
92
+ clientID: string;
93
+ scopes?: string[];
94
+ }, req: Request): Promise<{
95
+ type: SubjectPayload<Subjects>["type"];
96
+ properties: SubjectPayload<Subjects>["properties"];
97
+ subject?: string;
98
+ scopes?: string[];
99
+ } | undefined>;
100
+ }
101
+ /**
102
+ * Create a Draft Auth server, a Hono app that handles OAuth 2.0 flows.
103
+ */
104
+ export declare const issuer: <Providers extends Record<string, Provider<unknown>>, Subjects extends SubjectSchema, Result = { [key in keyof Providers]: {
105
+ provider: key;
106
+ } & (Providers[key] extends Provider<infer T> ? T : Record<string, unknown>); }[keyof Providers]>(input: IssuerInput<Providers, Subjects, Result>) => Hono<{
107
+ Variables: {
108
+ authorization: AuthorizationState;
109
+ provider: string;
110
+ };
111
+ }>;
112
+ export {};
113
+ //# sourceMappingURL=core.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../src/core.ts"],"names":[],"mappings":"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"}