@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
@@ -1,4 +1,3 @@
1
- //#region src/error.d.ts
2
1
  /**
3
2
  * Error classes and types for Draft Auth operations.
4
3
  * Provides comprehensive error handling for OAuth 2.0 and authentication flows.
@@ -38,93 +37,93 @@
38
37
  * Standard OAuth error types
39
38
  * These error codes are returned by OAuth authorization servers.
40
39
  */
41
- type OauthErrorType = "invalid_request" | "invalid_client" | "invalid_grant" | "invalid_token" | "invalid_redirect_uri" | "insufficient_scope" | "unauthorized_client" | "access_denied" | "unsupported_grant_type" | "server_error" | "temporarily_unavailable" | "unsupported_response_type";
40
+ export type OauthErrorType = "invalid_request" | "invalid_client" | "invalid_grant" | "invalid_token" | "invalid_redirect_uri" | "insufficient_scope" | "unauthorized_client" | "access_denied" | "unsupported_grant_type" | "server_error" | "temporarily_unavailable" | "unsupported_response_type";
42
41
  /**
43
42
  * Base OAuth error class for handling standard OAuth error responses.
44
43
  * Contains both the error code and human-readable description.
45
44
  */
46
- declare class OauthError extends Error {
47
- /** The OAuth error code as defined in the specification */
48
- readonly error: OauthErrorType;
49
- /** Human-readable description of the error */
50
- readonly description: string;
51
- /**
52
- * Creates a new OAuth error with the specified error code and description.
53
- *
54
- * @param error - The OAuth error type
55
- * @param description - Human-readable error description
56
- *
57
- * @example
58
- * ```ts
59
- * throw new OauthError("invalid_grant", "Authorization code has expired")
60
- * ```
61
- */
62
- constructor(error: OauthErrorType, description: string);
63
- /**
64
- * Converts the error to a standard OAuth JSON response format.
65
- *
66
- * @returns Object with error and error_description fields
67
- *
68
- * @example
69
- * ```ts
70
- * const oauthError = new OauthError("invalid_request", "Missing parameter")
71
- * return c.json(oauthError.toJSON(), 400)
72
- * ```
73
- */
74
- toJSON(): {
75
- error: OauthErrorType;
76
- error_description: string;
77
- };
45
+ export declare class OauthError extends Error {
46
+ /** The OAuth error code as defined in the specification */
47
+ readonly error: OauthErrorType;
48
+ /** Human-readable description of the error */
49
+ readonly description: string;
50
+ /**
51
+ * Creates a new OAuth error with the specified error code and description.
52
+ *
53
+ * @param error - The OAuth error type
54
+ * @param description - Human-readable error description
55
+ *
56
+ * @example
57
+ * ```ts
58
+ * throw new OauthError("invalid_grant", "Authorization code has expired")
59
+ * ```
60
+ */
61
+ constructor(error: OauthErrorType, description: string);
62
+ /**
63
+ * Converts the error to a standard OAuth JSON response format.
64
+ *
65
+ * @returns Object with error and error_description fields
66
+ *
67
+ * @example
68
+ * ```ts
69
+ * const oauthError = new OauthError("invalid_request", "Missing parameter")
70
+ * return c.json(oauthError.toJSON(), 400)
71
+ * ```
72
+ */
73
+ toJSON(): {
74
+ error: OauthErrorType;
75
+ error_description: string;
76
+ };
78
77
  }
79
78
  /**
80
79
  * Error thrown when a provider parameter is missing from the authorization request.
81
80
  * Occurs when multiple providers are configured but no specific provider is selected.
82
81
  */
83
- declare class MissingProviderError extends OauthError {
84
- /**
85
- * Creates a missing provider error.
86
- * Thrown when the provider query parameter is required but not provided.
87
- */
88
- constructor();
82
+ export declare class MissingProviderError extends OauthError {
83
+ /**
84
+ * Creates a missing provider error.
85
+ * Thrown when the provider query parameter is required but not provided.
86
+ */
87
+ constructor();
89
88
  }
90
89
  /**
91
90
  * Error thrown when a required parameter is missing from a request.
92
91
  * Used for validating OAuth request parameters.
93
92
  */
94
- declare class MissingParameterError extends OauthError {
95
- /** The name of the missing parameter */
96
- readonly parameter: string;
97
- /**
98
- * Creates a missing parameter error.
99
- *
100
- * @param parameter - The name of the missing parameter
101
- *
102
- * @example
103
- * ```ts
104
- * throw new MissingParameterError("client_id")
105
- * ```
106
- */
107
- constructor(parameter: string);
93
+ export declare class MissingParameterError extends OauthError {
94
+ /** The name of the missing parameter */
95
+ readonly parameter: string;
96
+ /**
97
+ * Creates a missing parameter error.
98
+ *
99
+ * @param parameter - The name of the missing parameter
100
+ *
101
+ * @example
102
+ * ```ts
103
+ * throw new MissingParameterError("client_id")
104
+ * ```
105
+ */
106
+ constructor(parameter: string);
108
107
  }
109
108
  /**
110
109
  * Error thrown when a client is not authorized to use a specific redirect URI.
111
110
  * Prevents unauthorized clients from hijacking authorization codes.
112
111
  */
113
- declare class UnauthorizedClientError extends OauthError {
114
- /** The client ID that attempted unauthorized access */
115
- readonly clientID: string;
116
- /**
117
- * Creates an unauthorized client error.
118
- *
119
- * @param clientID - The client ID attempting unauthorized access
120
- * @param redirectURI - The unauthorized redirect URI
121
- *
122
- * @example
123
- * ```ts
124
- * throw new UnauthorizedClientError("malicious-client", "https://evil.com/callback")
125
- * ```
126
- */
127
- constructor(clientID: string, redirectURI: string);
112
+ export declare class UnauthorizedClientError extends OauthError {
113
+ /** The client ID that attempted unauthorized access */
114
+ readonly clientID: string;
115
+ /**
116
+ * Creates an unauthorized client error.
117
+ *
118
+ * @param clientID - The client ID attempting unauthorized access
119
+ * @param redirectURI - The unauthorized redirect URI
120
+ *
121
+ * @example
122
+ * ```ts
123
+ * throw new UnauthorizedClientError("malicious-client", "https://evil.com/callback")
124
+ * ```
125
+ */
126
+ constructor(clientID: string, redirectURI: string);
128
127
  }
129
128
  /**
130
129
  * Error thrown when the authentication flow is in an unknown or invalid state.
@@ -144,12 +143,12 @@ declare class UnauthorizedClientError extends OauthError {
144
143
  * }
145
144
  * ```
146
145
  */
147
- declare class UnknownStateError extends Error {
148
- /**
149
- * Creates an unknown state error.
150
- * Indicates that the authentication flow cannot continue due to missing state.
151
- */
152
- constructor();
146
+ export declare class UnknownStateError extends Error {
147
+ /**
148
+ * Creates an unknown state error.
149
+ * Indicates that the authentication flow cannot continue due to missing state.
150
+ */
151
+ constructor();
153
152
  }
154
153
  /**
155
154
  * Error thrown when a subject (user identifier) is invalid or malformed.
@@ -164,11 +163,11 @@ declare class UnknownStateError extends Error {
164
163
  * }
165
164
  * ```
166
165
  */
167
- declare class InvalidSubjectError extends Error {
168
- /**
169
- * Creates an invalid subject error.
170
- */
171
- constructor();
166
+ export declare class InvalidSubjectError extends Error {
167
+ /**
168
+ * Creates an invalid subject error.
169
+ */
170
+ constructor();
172
171
  }
173
172
  /**
174
173
  * Error thrown when a refresh token is invalid, expired, or revoked.
@@ -187,11 +186,11 @@ declare class InvalidSubjectError extends Error {
187
186
  * }
188
187
  * ```
189
188
  */
190
- declare class InvalidRefreshTokenError extends Error {
191
- /**
192
- * Creates an invalid refresh token error.
193
- */
194
- constructor();
189
+ export declare class InvalidRefreshTokenError extends Error {
190
+ /**
191
+ * Creates an invalid refresh token error.
192
+ */
193
+ constructor();
195
194
  }
196
195
  /**
197
196
  * Error thrown when an access token is invalid, expired, or malformed.
@@ -210,11 +209,11 @@ declare class InvalidRefreshTokenError extends Error {
210
209
  * }
211
210
  * ```
212
211
  */
213
- declare class InvalidAccessTokenError extends Error {
214
- /**
215
- * Creates an invalid access token error.
216
- */
217
- constructor();
212
+ export declare class InvalidAccessTokenError extends Error {
213
+ /**
214
+ * Creates an invalid access token error.
215
+ */
216
+ constructor();
218
217
  }
219
218
  /**
220
219
  * Error thrown when an authorization code is invalid, expired, or already used.
@@ -233,11 +232,10 @@ declare class InvalidAccessTokenError extends Error {
233
232
  * }
234
233
  * ```
235
234
  */
236
- declare class InvalidAuthorizationCodeError extends Error {
237
- /**
238
- * Creates an invalid authorization code error.
239
- */
240
- constructor();
235
+ export declare class InvalidAuthorizationCodeError extends Error {
236
+ /**
237
+ * Creates an invalid authorization code error.
238
+ */
239
+ constructor();
241
240
  }
242
- //#endregion
243
- export { InvalidAccessTokenError, InvalidAuthorizationCodeError, InvalidRefreshTokenError, InvalidSubjectError, MissingParameterError, MissingProviderError, OauthError, OauthErrorType, UnauthorizedClientError, UnknownStateError };
241
+ //# sourceMappingURL=error.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error.d.ts","sourceRoot":"","sources":["../../src/error.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAEH;;;GAGG;AACH,MAAM,MAAM,cAAc,GACvB,iBAAiB,GACjB,gBAAgB,GAChB,eAAe,GACf,eAAe,GACf,sBAAsB,GACtB,oBAAoB,GACpB,qBAAqB,GACrB,eAAe,GACf,wBAAwB,GACxB,cAAc,GACd,yBAAyB,GACzB,2BAA2B,CAAA;AAE9B;;;GAGG;AACH,qBAAa,UAAW,SAAQ,KAAK;IACpC,2DAA2D;IAC3D,SAAgB,KAAK,EAAE,cAAc,CAAA;IACrC,8CAA8C;IAC9C,SAAgB,WAAW,EAAE,MAAM,CAAA;IAEnC;;;;;;;;;;OAUG;gBACS,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM;IAOtD;;;;;;;;;;OAUG;IACH,MAAM;;;;CAMN;AAED;;;GAGG;AACH,qBAAa,oBAAqB,SAAQ,UAAU;IACnD;;;OAGG;;CAQH;AAED;;;GAGG;AACH,qBAAa,qBAAsB,SAAQ,UAAU;IACpD,wCAAwC;IACxC,SAAgB,SAAS,EAAE,MAAM,CAAA;IAEjC;;;;;;;;;OASG;gBACS,SAAS,EAAE,MAAM;CAK7B;AAED;;;GAGG;AACH,qBAAa,uBAAwB,SAAQ,UAAU;IACtD,uDAAuD;IACvD,SAAgB,QAAQ,EAAE,MAAM,CAAA;IAEhC;;;;;;;;;;OAUG;gBACS,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM;CAQjD;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,iBAAkB,SAAQ,KAAK;IAC3C;;;OAGG;;CAOH;AAED;;;;;;;;;;;;GAYG;AACH,qBAAa,mBAAoB,SAAQ,KAAK;IAC7C;;OAEG;;CAKH;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,wBAAyB,SAAQ,KAAK;IAClD;;OAEG;;CAKH;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,uBAAwB,SAAQ,KAAK;IACjD;;OAEG;;CAKH;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,6BAA8B,SAAQ,KAAK;IACvD;;OAEG;;CAKH"}
@@ -0,0 +1,2 @@
1
+ export { issuer } from "./core";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA"}
@@ -1,27 +1,24 @@
1
- import { StorageAdapter } from "./storage/storage.mjs";
2
- import { CryptoKey, JWK } from "jose";
3
-
4
- //#region src/keys.d.ts
5
-
1
+ import { type CryptoKey, type JWK } from "jose";
2
+ import { type StorageAdapter } from "./storage/storage";
6
3
  /**
7
4
  * Runtime key pair with loaded cryptographic keys and metadata.
8
5
  * Ready for immediate use in signing and encryption operations.
9
6
  */
10
- interface KeyPair {
11
- /** Unique identifier for the key pair */
12
- readonly id: string;
13
- /** Algorithm used for this key pair */
14
- readonly alg: string;
15
- /** Loaded public key for verification/encryption */
16
- readonly public: CryptoKey;
17
- /** Loaded private key for signing/decryption */
18
- readonly private: CryptoKey;
19
- /** Date when the key was created */
20
- readonly created: Date;
21
- /** Optional expiration date */
22
- readonly expired?: Date;
23
- /** JSON Web Key representation for JWKS endpoints */
24
- readonly jwk: JWK;
7
+ export interface KeyPair {
8
+ /** Unique identifier for the key pair */
9
+ readonly id: string;
10
+ /** Algorithm used for this key pair */
11
+ readonly alg: string;
12
+ /** Loaded public key for verification/encryption */
13
+ readonly public: CryptoKey;
14
+ /** Loaded private key for signing/decryption */
15
+ readonly private: CryptoKey;
16
+ /** Date when the key was created */
17
+ readonly created: Date;
18
+ /** Optional expiration date */
19
+ readonly expired?: Date;
20
+ /** JSON Web Key representation for JWKS endpoints */
21
+ readonly jwk: JWK;
25
22
  }
26
23
  /**
27
24
  * Loads or generates signing keys for JWT operations.
@@ -42,7 +39,7 @@ interface KeyPair {
42
39
  * .sign(currentKey.private)
43
40
  * ```
44
41
  */
45
- declare const signingKeys: (storage: StorageAdapter) => Promise<KeyPair[]>;
42
+ export declare const signingKeys: (storage: StorageAdapter) => Promise<KeyPair[]>;
46
43
  /**
47
44
  * Loads or generates encryption keys for token encryption operations.
48
45
  * Returns existing valid keys, or generates new ones if none are available.
@@ -62,6 +59,5 @@ declare const signingKeys: (storage: StorageAdapter) => Promise<KeyPair[]>;
62
59
  * .encrypt(currentKey.public)
63
60
  * ```
64
61
  */
65
- declare const encryptionKeys: (storage: StorageAdapter) => Promise<KeyPair[]>;
66
- //#endregion
67
- export { KeyPair, encryptionKeys, signingKeys };
62
+ export declare const encryptionKeys: (storage: StorageAdapter) => Promise<KeyPair[]>;
63
+ //# sourceMappingURL=keys.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keys.d.ts","sourceRoot":"","sources":["../../src/keys.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,KAAK,SAAS,EAOd,KAAK,GAAG,EACR,MAAM,MAAM,CAAA;AAGb,OAAO,EAAW,KAAK,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAoChE;;;GAGG;AACH,MAAM,WAAW,OAAO;IACvB,yCAAyC;IACzC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,uCAAuC;IACvC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,oDAAoD;IACpD,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAA;IAC1B,gDAAgD;IAChD,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAA;IAC3B,oCAAoC;IACpC,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAA;IACtB,+BAA+B;IAC/B,QAAQ,CAAC,OAAO,CAAC,EAAE,IAAI,CAAA;IACvB,qDAAqD;IACrD,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAA;CACjB;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,WAAW,GAAU,SAAS,cAAc,KAAG,OAAO,CAAC,OAAO,EAAE,CAmE5E,CAAA;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,cAAc,GAAU,SAAS,cAAc,KAAG,OAAO,CAAC,OAAO,EAAE,CAiE/E,CAAA"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * A Mutex (mutual exclusion lock) for async functions.
3
+ * It allows only one async task to access a critical section at a time.
4
+ *
5
+ * @example
6
+ * const mutex = new Mutex();
7
+ *
8
+ * async function criticalSection() {
9
+ * await mutex.acquire();
10
+ * try {
11
+ * // This code section cannot be executed simultaneously
12
+ * } finally {
13
+ * mutex.release();
14
+ * }
15
+ * }
16
+ */
17
+ export declare class Mutex {
18
+ private semaphore;
19
+ /**
20
+ * Checks if the mutex is currently locked.
21
+ * @returns True if the mutex is locked, false otherwise.
22
+ */
23
+ get isLocked(): boolean;
24
+ /**
25
+ * Acquires the mutex, blocking if necessary until it is available.
26
+ * @returns A promise that resolves when the mutex is acquired.
27
+ */
28
+ acquire(): Promise<void>;
29
+ /**
30
+ * Releases the mutex, allowing another waiting task to proceed.
31
+ */
32
+ release(): void;
33
+ /**
34
+ * Runs a function while holding the mutex lock.
35
+ * Automatically acquires before and releases after the function execution.
36
+ *
37
+ * @param fn - The function to execute while holding the lock
38
+ * @returns The result of the function
39
+ */
40
+ runExclusive<T>(fn: () => Promise<T>): Promise<T>;
41
+ }
42
+ //# sourceMappingURL=mutex.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mutex.d.ts","sourceRoot":"","sources":["../../src/mutex.ts"],"names":[],"mappings":"AA8DA;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,KAAK;IACjB,OAAO,CAAC,SAAS,CAAmB;IAEpC;;;OAGG;IACH,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED;;;OAGG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAI9B;;OAEG;IACH,OAAO,IAAI,IAAI;IAIf;;;;;;OAMG;IACG,YAAY,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;CAQvD"}
@@ -1,4 +1,3 @@
1
- //#region src/pkce.d.ts
2
1
  /**
3
2
  * PKCE (Proof Key for Code Exchange) implementation for OAuth security.
4
3
  * Provides protection against authorization code interception attacks by using
@@ -12,12 +11,12 @@ type PKCEMethod = "S256" | "plain";
12
11
  * Complete PKCE challenge data containing verifier, challenge, and method.
13
12
  */
14
13
  interface PKCEChallenge {
15
- /** The code verifier to be sent to the token endpoint */
16
- readonly verifier: string;
17
- /** The code challenge to be sent to the authorization endpoint */
18
- readonly challenge: string;
19
- /** The challenge method used */
20
- readonly method: "S256";
14
+ /** The code verifier to be sent to the token endpoint */
15
+ readonly verifier: string;
16
+ /** The code challenge to be sent to the authorization endpoint */
17
+ readonly challenge: string;
18
+ /** The challenge method used */
19
+ readonly method: "S256";
21
20
  }
22
21
  /**
23
22
  * Generates a complete PKCE challenge for OAuth authorization requests.
@@ -41,7 +40,7 @@ interface PKCEChallenge {
41
40
  *
42
41
  * @throws {RangeError} If length is outside valid range or generated verifier doesn't meet requirements
43
42
  */
44
- declare const generatePKCE: (length?: number) => Promise<PKCEChallenge>;
43
+ export declare const generatePKCE: (length?: number) => Promise<PKCEChallenge>;
45
44
  /**
46
45
  * Validates a PKCE code verifier against a previously generated challenge.
47
46
  * Uses timing-safe comparison and timing normalization to prevent timing attacks.
@@ -67,6 +66,6 @@ declare const generatePKCE: (length?: number) => Promise<PKCEChallenge>;
67
66
  * }
68
67
  * ```
69
68
  */
70
- declare const validatePKCE: (verifier: string, challenge: string, method?: PKCEMethod) => Promise<boolean>;
71
- //#endregion
72
- export { generatePKCE, validatePKCE };
69
+ export declare const validatePKCE: (verifier: string, challenge: string, method?: PKCEMethod) => Promise<boolean>;
70
+ export {};
71
+ //# sourceMappingURL=pkce.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pkce.d.ts","sourceRoot":"","sources":["../../src/pkce.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AAEH;;GAEG;AACH,KAAK,UAAU,GAAG,MAAM,GAAG,OAAO,CAAA;AA0DlC;;GAEG;AACH,UAAU,aAAa;IACtB,yDAAyD;IACzD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,kEAAkE;IAClE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,gCAAgC;IAChC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CACvB;AAmCD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,YAAY,GAAU,eAAW,KAAG,OAAO,CAAC,aAAa,CA0BrE,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,eAAO,MAAM,YAAY,GACxB,UAAU,MAAM,EAChB,WAAW,MAAM,EACjB,SAAQ,UAAmB,KACzB,OAAO,CAAC,OAAO,CAqDjB,CAAA"}
@@ -0,0 +1,197 @@
1
+ /**
2
+ * Apple authentication provider for Draft Auth.
3
+ * Implements OAuth 2.0 flow for authenticating users with their Apple accounts.
4
+ *
5
+ * ## Quick Setup
6
+ *
7
+ * ```ts
8
+ * import { AppleProvider } from "@draftlab/auth/provider/apple"
9
+ *
10
+ * export default issuer({
11
+ * basePath: "/auth", // Important for callback URL
12
+ * providers: {
13
+ * apple: AppleProvider({
14
+ * clientID: process.env.APPLE_CLIENT_ID,
15
+ * clientSecret: process.env.APPLE_CLIENT_SECRET,
16
+ * scopes: ["name", "email"]
17
+ * })
18
+ * }
19
+ * })
20
+ * ```
21
+ *
22
+ * **Callback URL Pattern**: `{baseURL}{basePath}/{provider}/callback`
23
+ * - Development: `http://localhost:3000/auth/apple/callback`
24
+ * - Production: `https://yourapp.com/auth/apple/callback`
25
+ *
26
+ * Register this URL in your Apple Developer Portal.
27
+ *
28
+ * ## Setup Instructions
29
+ *
30
+ * ### 1. Create App ID
31
+ * - Go to [Apple Developer](https://developer.apple.com)
32
+ * - Create a new App ID with "Sign in with Apple" capability
33
+ *
34
+ * ### 2. Create Service ID
35
+ * - Create a new Service ID (this is your clientID)
36
+ * - Configure "Sign in with Apple"
37
+ * - Add your redirect URI
38
+ *
39
+ * ### 3. Create Private Key
40
+ * - Create a private key for "Sign in with Apple"
41
+ * - Download the .p8 file (this is used to create your clientSecret)
42
+ *
43
+ * ## Client Secret Generation
44
+ *
45
+ * Apple requires a JWT token as the client secret. You'll need:
46
+ * - Key ID from the private key
47
+ * - Team ID from your Apple Developer account
48
+ * - Private key (.p8 file)
49
+ *
50
+ * Use a library to generate the JWT (valid for ~15 minutes):
51
+ *
52
+ * ```ts
53
+ * import { SignJWT } from "jose"
54
+ *
55
+ * const secret = await new SignJWT({
56
+ * iss: "YOUR_TEAM_ID",
57
+ * aud: "https://appleid.apple.com",
58
+ * sub: process.env.APPLE_CLIENT_ID,
59
+ * iat: Math.floor(Date.now() / 1000),
60
+ * exp: Math.floor(Date.now() / 1000) + 15 * 60
61
+ * })
62
+ * .setProtectedHeader({ alg: "ES256", kid: "YOUR_KEY_ID" })
63
+ * .sign(privateKey)
64
+ * ```
65
+ *
66
+ * ## Common Scopes
67
+ *
68
+ * - `name` - Access user's name (first and last name)
69
+ * - `email` - Access user's email address
70
+ *
71
+ * Note: Apple only returns user data on the first authorization. Subsequent authorizations won't include name/email.
72
+ *
73
+ * ## User Data Access
74
+ *
75
+ * ```ts
76
+ * success: async (ctx, value) => {
77
+ * if (value.provider === "apple") {
78
+ * const accessToken = value.tokenset.access
79
+ *
80
+ * // Apple doesn't provide a userinfo endpoint
81
+ * // User data is returned in the authorization response
82
+ * // You need to parse the id_token JWT to get user info
83
+ *
84
+ * // For subsequent logins without name/email, use the subject (user_id)
85
+ * // from the ID token to identify the user
86
+ * }
87
+ * }
88
+ * ```
89
+ *
90
+ * @packageDocumentation
91
+ */
92
+ import { type Oauth2WrappedConfig } from "./oauth2";
93
+ /**
94
+ * Configuration options for Apple OAuth 2.0 provider.
95
+ * Extends the base OAuth 2.0 configuration with Apple-specific documentation.
96
+ */
97
+ export interface AppleConfig extends Oauth2WrappedConfig {
98
+ /**
99
+ * Apple Service ID (app identifier for your Sign in with Apple implementation).
100
+ * Get this from your Apple Developer account when creating a Service ID.
101
+ *
102
+ * @example
103
+ * ```ts
104
+ * {
105
+ * clientID: "com.example.app.signin"
106
+ * }
107
+ * ```
108
+ */
109
+ readonly clientID: string;
110
+ /**
111
+ * Apple client secret (JWT token signed with your private key).
112
+ * This is different from other providers - Apple requires a JWT token
113
+ * generated from your private key.
114
+ *
115
+ * @example
116
+ * ```ts
117
+ * {
118
+ * clientSecret: process.env.APPLE_CLIENT_SECRET
119
+ * }
120
+ * ```
121
+ */
122
+ readonly clientSecret: string;
123
+ /**
124
+ * Apple OAuth scopes to request access for.
125
+ * Apple only supports "name" and "email" scopes.
126
+ *
127
+ * Important: Apple only provides user data (name, email) on the FIRST authorization.
128
+ * Subsequent authorizations won't include this data.
129
+ *
130
+ * @example
131
+ * ```ts
132
+ * {
133
+ * scopes: ["name", "email"]
134
+ * }
135
+ * ```
136
+ */
137
+ readonly scopes: string[];
138
+ }
139
+ /**
140
+ * Creates an Apple OAuth 2.0 authentication provider.
141
+ * Allows users to authenticate using their Apple accounts.
142
+ *
143
+ * @param config - Apple OAuth 2.0 configuration
144
+ * @returns OAuth 2.0 provider configured for Apple
145
+ *
146
+ * @example
147
+ * ```ts
148
+ * // Basic Apple authentication
149
+ * const basicApple = AppleProvider({
150
+ * clientID: process.env.APPLE_CLIENT_ID,
151
+ * clientSecret: process.env.APPLE_CLIENT_SECRET
152
+ * })
153
+ *
154
+ * // Apple with name and email scopes
155
+ * const appleWithScopes = AppleProvider({
156
+ * clientID: process.env.APPLE_CLIENT_ID,
157
+ * clientSecret: process.env.APPLE_CLIENT_SECRET,
158
+ * scopes: ["name", "email"]
159
+ * })
160
+ *
161
+ * // Using the tokens and id_token
162
+ * export default issuer({
163
+ * providers: { apple: appleWithScopes },
164
+ * success: async (ctx, value) => {
165
+ * if (value.provider === "apple") {
166
+ * // Apple returns user data in the initial authorization response
167
+ * // You need to decode the id_token to extract user information
168
+ *
169
+ * // The id_token contains:
170
+ * // - sub: unique Apple user identifier
171
+ * // - email: user email (only on first authorization)
172
+ * // - email_verified: whether email is verified
173
+ * // - is_private_email: whether user used private relay
174
+ *
175
+ * // Decode and verify the id_token using jose:
176
+ * // const verified = await jwtVerify(value.tokenset.id, jwks)
177
+ * // const user = verified.payload
178
+ *
179
+ * return ctx.subject("user", {
180
+ * appleId: user.sub,
181
+ * email: user.email,
182
+ * emailVerified: user.email_verified,
183
+ * isPrivateEmail: user.is_private_email
184
+ * })
185
+ * }
186
+ * }
187
+ * })
188
+ * ```
189
+ *
190
+ * **Callback URL Pattern**: `{baseURL}{basePath}/{provider}/callback`
191
+ * - Development: `http://localhost:3000/auth/apple/callback`
192
+ * - Production: `https://yourapp.com/auth/apple/callback`
193
+ *
194
+ * Register this URL in your Apple Developer Portal.
195
+ */
196
+ export declare const AppleProvider: (config: AppleConfig) => import("./provider").Provider<import("./oauth2").Oauth2UserData>;
197
+ //# sourceMappingURL=apple.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apple.d.ts","sourceRoot":"","sources":["../../../src/provider/apple.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0FG;AAEH,OAAO,EAAkB,KAAK,mBAAmB,EAAE,MAAM,UAAU,CAAA;AAEnE;;;GAGG;AACH,MAAM,WAAW,WAAY,SAAQ,mBAAmB;IACvD;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IAEzB;;;;;;;;;;;OAWG;IACH,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;IAE7B;;;;;;;;;;;;;OAaG;IACH,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CACzB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwDG;AACH,eAAO,MAAM,aAAa,GAAI,QAAQ,WAAW,qEAShD,CAAA"}