@depup/better-auth__core 1.6.23-depup.2

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 (310) hide show
  1. package/LICENSE.md +20 -0
  2. package/README.md +32 -0
  3. package/changes.json +14 -0
  4. package/dist/api/index.d.mts +281 -0
  5. package/dist/api/index.mjs +92 -0
  6. package/dist/async_hooks/index.d.mts +6 -0
  7. package/dist/async_hooks/index.mjs +20 -0
  8. package/dist/async_hooks/pure.index.d.mts +6 -0
  9. package/dist/async_hooks/pure.index.mjs +33 -0
  10. package/dist/context/endpoint-context.d.mts +18 -0
  11. package/dist/context/endpoint-context.mjs +29 -0
  12. package/dist/context/global.d.mts +6 -0
  13. package/dist/context/global.mjs +36 -0
  14. package/dist/context/index.d.mts +5 -0
  15. package/dist/context/index.mjs +5 -0
  16. package/dist/context/request-state.d.mts +27 -0
  17. package/dist/context/request-state.mjs +47 -0
  18. package/dist/context/transaction.d.mts +27 -0
  19. package/dist/context/transaction.mjs +96 -0
  20. package/dist/db/adapter/factory.d.mts +17 -0
  21. package/dist/db/adapter/factory.mjs +905 -0
  22. package/dist/db/adapter/get-default-field-name.d.mts +18 -0
  23. package/dist/db/adapter/get-default-field-name.mjs +36 -0
  24. package/dist/db/adapter/get-default-model-name.d.mts +12 -0
  25. package/dist/db/adapter/get-default-model-name.mjs +30 -0
  26. package/dist/db/adapter/get-field-attributes.d.mts +26 -0
  27. package/dist/db/adapter/get-field-attributes.mjs +37 -0
  28. package/dist/db/adapter/get-field-name.d.mts +18 -0
  29. package/dist/db/adapter/get-field-name.mjs +31 -0
  30. package/dist/db/adapter/get-id-field.d.mts +36 -0
  31. package/dist/db/adapter/get-id-field.mjs +64 -0
  32. package/dist/db/adapter/get-model-name.d.mts +12 -0
  33. package/dist/db/adapter/get-model-name.mjs +21 -0
  34. package/dist/db/adapter/index.d.mts +615 -0
  35. package/dist/db/adapter/index.mjs +24 -0
  36. package/dist/db/adapter/types.d.mts +105 -0
  37. package/dist/db/adapter/utils.d.mts +7 -0
  38. package/dist/db/adapter/utils.mjs +37 -0
  39. package/dist/db/get-tables.d.mts +6 -0
  40. package/dist/db/get-tables.mjs +266 -0
  41. package/dist/db/index.d.mts +10 -0
  42. package/dist/db/index.mjs +8 -0
  43. package/dist/db/plugin.d.mts +12 -0
  44. package/dist/db/schema/account.d.mts +28 -0
  45. package/dist/db/schema/account.mjs +17 -0
  46. package/dist/db/schema/rate-limit.d.mts +18 -0
  47. package/dist/db/schema/rate-limit.mjs +9 -0
  48. package/dist/db/schema/session.d.mts +23 -0
  49. package/dist/db/schema/session.mjs +12 -0
  50. package/dist/db/schema/shared.d.mts +10 -0
  51. package/dist/db/schema/shared.mjs +9 -0
  52. package/dist/db/schema/user.d.mts +22 -0
  53. package/dist/db/schema/user.mjs +11 -0
  54. package/dist/db/schema/verification.d.mts +21 -0
  55. package/dist/db/schema/verification.mjs +10 -0
  56. package/dist/db/type.d.mts +194 -0
  57. package/dist/env/color-depth.d.mts +4 -0
  58. package/dist/env/color-depth.mjs +86 -0
  59. package/dist/env/env-impl.d.mts +32 -0
  60. package/dist/env/env-impl.mjs +81 -0
  61. package/dist/env/index.d.mts +4 -0
  62. package/dist/env/index.mjs +4 -0
  63. package/dist/env/logger.d.mts +48 -0
  64. package/dist/env/logger.mjs +79 -0
  65. package/dist/error/codes.d.mts +69 -0
  66. package/dist/error/codes.mjs +55 -0
  67. package/dist/error/index.d.mts +26 -0
  68. package/dist/error/index.mjs +27 -0
  69. package/dist/index.d.mts +9 -0
  70. package/dist/index.mjs +1 -0
  71. package/dist/instrumentation/api.mjs +12 -0
  72. package/dist/instrumentation/attributes.d.mts +11 -0
  73. package/dist/instrumentation/attributes.mjs +10 -0
  74. package/dist/instrumentation/index.d.mts +3 -0
  75. package/dist/instrumentation/index.mjs +3 -0
  76. package/dist/instrumentation/noop.mjs +42 -0
  77. package/dist/instrumentation/pure.index.d.mts +7 -0
  78. package/dist/instrumentation/pure.index.mjs +7 -0
  79. package/dist/instrumentation/tracer.d.mts +13 -0
  80. package/dist/instrumentation/tracer.mjs +53 -0
  81. package/dist/oauth2/client-credentials-token.d.mts +56 -0
  82. package/dist/oauth2/client-credentials-token.mjs +64 -0
  83. package/dist/oauth2/create-authorization-url.d.mts +44 -0
  84. package/dist/oauth2/create-authorization-url.mjs +41 -0
  85. package/dist/oauth2/index.d.mts +8 -0
  86. package/dist/oauth2/index.mjs +7 -0
  87. package/dist/oauth2/oauth-provider.d.mts +192 -0
  88. package/dist/oauth2/refresh-access-token.d.mts +54 -0
  89. package/dist/oauth2/refresh-access-token.mjs +73 -0
  90. package/dist/oauth2/reject-redirects.mjs +60 -0
  91. package/dist/oauth2/utils.d.mts +24 -0
  92. package/dist/oauth2/utils.mjs +48 -0
  93. package/dist/oauth2/validate-authorization-code.d.mts +85 -0
  94. package/dist/oauth2/validate-authorization-code.mjs +86 -0
  95. package/dist/oauth2/verify.d.mts +65 -0
  96. package/dist/oauth2/verify.mjs +202 -0
  97. package/dist/social-providers/apple.d.mts +133 -0
  98. package/dist/social-providers/apple.mjs +117 -0
  99. package/dist/social-providers/atlassian.d.mts +70 -0
  100. package/dist/social-providers/atlassian.mjs +80 -0
  101. package/dist/social-providers/cognito.d.mts +85 -0
  102. package/dist/social-providers/cognito.mjs +162 -0
  103. package/dist/social-providers/discord.d.mts +124 -0
  104. package/dist/social-providers/discord.mjs +62 -0
  105. package/dist/social-providers/dropbox.d.mts +69 -0
  106. package/dist/social-providers/dropbox.mjs +72 -0
  107. package/dist/social-providers/facebook.d.mts +79 -0
  108. package/dist/social-providers/facebook.mjs +157 -0
  109. package/dist/social-providers/figma.d.mts +61 -0
  110. package/dist/social-providers/figma.mjs +83 -0
  111. package/dist/social-providers/github.d.mts +102 -0
  112. package/dist/social-providers/github.mjs +92 -0
  113. package/dist/social-providers/gitlab.d.mts +123 -0
  114. package/dist/social-providers/gitlab.mjs +79 -0
  115. package/dist/social-providers/google.d.mts +123 -0
  116. package/dist/social-providers/google.mjs +137 -0
  117. package/dist/social-providers/huggingface.d.mts +83 -0
  118. package/dist/social-providers/huggingface.mjs +73 -0
  119. package/dist/social-providers/index.d.mts +1834 -0
  120. package/dist/social-providers/index.mjs +78 -0
  121. package/dist/social-providers/kakao.d.mts +161 -0
  122. package/dist/social-providers/kakao.mjs +70 -0
  123. package/dist/social-providers/kick.d.mts +73 -0
  124. package/dist/social-providers/kick.mjs +68 -0
  125. package/dist/social-providers/line.d.mts +105 -0
  126. package/dist/social-providers/line.mjs +110 -0
  127. package/dist/social-providers/linear.d.mts +68 -0
  128. package/dist/social-providers/linear.mjs +85 -0
  129. package/dist/social-providers/linkedin.d.mts +67 -0
  130. package/dist/social-providers/linkedin.mjs +73 -0
  131. package/dist/social-providers/microsoft-entra-id.d.mts +174 -0
  132. package/dist/social-providers/microsoft-entra-id.mjs +152 -0
  133. package/dist/social-providers/naver.d.mts +92 -0
  134. package/dist/social-providers/naver.mjs +65 -0
  135. package/dist/social-providers/notion.d.mts +64 -0
  136. package/dist/social-providers/notion.mjs +72 -0
  137. package/dist/social-providers/paybin.d.mts +71 -0
  138. package/dist/social-providers/paybin.mjs +81 -0
  139. package/dist/social-providers/paypal.d.mts +131 -0
  140. package/dist/social-providers/paypal.mjs +188 -0
  141. package/dist/social-providers/polar.d.mts +74 -0
  142. package/dist/social-providers/polar.mjs +71 -0
  143. package/dist/social-providers/railway.d.mts +65 -0
  144. package/dist/social-providers/railway.mjs +74 -0
  145. package/dist/social-providers/reddit.d.mts +62 -0
  146. package/dist/social-providers/reddit.mjs +81 -0
  147. package/dist/social-providers/roblox.d.mts +70 -0
  148. package/dist/social-providers/roblox.mjs +57 -0
  149. package/dist/social-providers/salesforce.d.mts +79 -0
  150. package/dist/social-providers/salesforce.mjs +87 -0
  151. package/dist/social-providers/slack.d.mts +83 -0
  152. package/dist/social-providers/slack.mjs +66 -0
  153. package/dist/social-providers/spotify.d.mts +63 -0
  154. package/dist/social-providers/spotify.mjs +69 -0
  155. package/dist/social-providers/tiktok.d.mts +168 -0
  156. package/dist/social-providers/tiktok.mjs +60 -0
  157. package/dist/social-providers/twitch.d.mts +79 -0
  158. package/dist/social-providers/twitch.mjs +75 -0
  159. package/dist/social-providers/twitter.d.mts +126 -0
  160. package/dist/social-providers/twitter.mjs +85 -0
  161. package/dist/social-providers/vercel.d.mts +62 -0
  162. package/dist/social-providers/vercel.mjs +58 -0
  163. package/dist/social-providers/vk.d.mts +70 -0
  164. package/dist/social-providers/vk.mjs +81 -0
  165. package/dist/social-providers/wechat.d.mts +113 -0
  166. package/dist/social-providers/wechat.mjs +81 -0
  167. package/dist/social-providers/zoom.d.mts +163 -0
  168. package/dist/social-providers/zoom.mjs +69 -0
  169. package/dist/types/context.d.mts +319 -0
  170. package/dist/types/cookie.d.mts +15 -0
  171. package/dist/types/helper.d.mts +10 -0
  172. package/dist/types/index.d.mts +9 -0
  173. package/dist/types/init-options.d.mts +1430 -0
  174. package/dist/types/plugin-client.d.mts +123 -0
  175. package/dist/types/plugin.d.mts +124 -0
  176. package/dist/types/secret.d.mts +11 -0
  177. package/dist/utils/async.d.mts +22 -0
  178. package/dist/utils/async.mjs +32 -0
  179. package/dist/utils/db.d.mts +9 -0
  180. package/dist/utils/db.mjs +15 -0
  181. package/dist/utils/deprecate.d.mts +9 -0
  182. package/dist/utils/deprecate.mjs +16 -0
  183. package/dist/utils/error-codes.d.mts +13 -0
  184. package/dist/utils/error-codes.mjs +10 -0
  185. package/dist/utils/fetch-metadata.d.mts +4 -0
  186. package/dist/utils/fetch-metadata.mjs +6 -0
  187. package/dist/utils/host.d.mts +147 -0
  188. package/dist/utils/host.mjs +295 -0
  189. package/dist/utils/id.d.mts +4 -0
  190. package/dist/utils/id.mjs +7 -0
  191. package/dist/utils/ip.d.mts +77 -0
  192. package/dist/utils/ip.mjs +230 -0
  193. package/dist/utils/is-api-error.d.mts +6 -0
  194. package/dist/utils/is-api-error.mjs +8 -0
  195. package/dist/utils/json.d.mts +4 -0
  196. package/dist/utils/json.mjs +41 -0
  197. package/dist/utils/redirect-uri.d.mts +20 -0
  198. package/dist/utils/redirect-uri.mjs +48 -0
  199. package/dist/utils/string.d.mts +8 -0
  200. package/dist/utils/string.mjs +25 -0
  201. package/dist/utils/url.d.mts +37 -0
  202. package/dist/utils/url.mjs +61 -0
  203. package/package.json +216 -0
  204. package/src/api/index.ts +185 -0
  205. package/src/async_hooks/index.ts +40 -0
  206. package/src/async_hooks/pure.index.ts +46 -0
  207. package/src/context/endpoint-context.ts +50 -0
  208. package/src/context/global.ts +57 -0
  209. package/src/context/index.ts +23 -0
  210. package/src/context/request-state.ts +91 -0
  211. package/src/context/transaction.ts +169 -0
  212. package/src/db/adapter/factory.ts +1740 -0
  213. package/src/db/adapter/get-default-field-name.ts +59 -0
  214. package/src/db/adapter/get-default-model-name.ts +51 -0
  215. package/src/db/adapter/get-field-attributes.ts +62 -0
  216. package/src/db/adapter/get-field-name.ts +43 -0
  217. package/src/db/adapter/get-id-field.ts +150 -0
  218. package/src/db/adapter/get-model-name.ts +36 -0
  219. package/src/db/adapter/index.ts +656 -0
  220. package/src/db/adapter/types.ts +134 -0
  221. package/src/db/adapter/utils.ts +61 -0
  222. package/src/db/get-tables.ts +304 -0
  223. package/src/db/index.ts +43 -0
  224. package/src/db/plugin.ts +11 -0
  225. package/src/db/schema/account.ts +47 -0
  226. package/src/db/schema/rate-limit.ts +36 -0
  227. package/src/db/schema/session.ts +29 -0
  228. package/src/db/schema/shared.ts +7 -0
  229. package/src/db/schema/user.ts +31 -0
  230. package/src/db/schema/verification.ts +28 -0
  231. package/src/db/type.ts +360 -0
  232. package/src/env/color-depth.ts +172 -0
  233. package/src/env/env-impl.ts +123 -0
  234. package/src/env/index.ts +23 -0
  235. package/src/env/logger.ts +145 -0
  236. package/src/error/codes.ts +72 -0
  237. package/src/error/index.ts +44 -0
  238. package/src/index.ts +1 -0
  239. package/src/instrumentation/api.ts +17 -0
  240. package/src/instrumentation/attributes.ts +22 -0
  241. package/src/instrumentation/index.ts +2 -0
  242. package/src/instrumentation/noop.ts +74 -0
  243. package/src/instrumentation/pure.index.ts +31 -0
  244. package/src/instrumentation/tracer.ts +95 -0
  245. package/src/oauth2/client-credentials-token.ts +126 -0
  246. package/src/oauth2/create-authorization-url.ts +89 -0
  247. package/src/oauth2/index.ts +34 -0
  248. package/src/oauth2/oauth-provider.ts +222 -0
  249. package/src/oauth2/refresh-access-token.ts +157 -0
  250. package/src/oauth2/reject-redirects.ts +70 -0
  251. package/src/oauth2/utils.ts +70 -0
  252. package/src/oauth2/validate-authorization-code.ts +190 -0
  253. package/src/oauth2/verify.ts +408 -0
  254. package/src/social-providers/apple.ts +249 -0
  255. package/src/social-providers/atlassian.ts +133 -0
  256. package/src/social-providers/cognito.ts +281 -0
  257. package/src/social-providers/discord.ts +170 -0
  258. package/src/social-providers/dropbox.ts +112 -0
  259. package/src/social-providers/facebook.ts +288 -0
  260. package/src/social-providers/figma.ts +118 -0
  261. package/src/social-providers/github.ts +184 -0
  262. package/src/social-providers/gitlab.ts +155 -0
  263. package/src/social-providers/google.ts +263 -0
  264. package/src/social-providers/huggingface.ts +119 -0
  265. package/src/social-providers/index.ts +132 -0
  266. package/src/social-providers/kakao.ts +179 -0
  267. package/src/social-providers/kick.ts +109 -0
  268. package/src/social-providers/line.ts +169 -0
  269. package/src/social-providers/linear.ts +121 -0
  270. package/src/social-providers/linkedin.ts +110 -0
  271. package/src/social-providers/microsoft-entra-id.ts +391 -0
  272. package/src/social-providers/naver.ts +113 -0
  273. package/src/social-providers/notion.ts +108 -0
  274. package/src/social-providers/paybin.ts +118 -0
  275. package/src/social-providers/paypal.ts +371 -0
  276. package/src/social-providers/polar.ts +111 -0
  277. package/src/social-providers/railway.ts +100 -0
  278. package/src/social-providers/reddit.ts +126 -0
  279. package/src/social-providers/roblox.ts +112 -0
  280. package/src/social-providers/salesforce.ts +159 -0
  281. package/src/social-providers/slack.ts +112 -0
  282. package/src/social-providers/spotify.ts +94 -0
  283. package/src/social-providers/tiktok.ts +211 -0
  284. package/src/social-providers/twitch.ts +112 -0
  285. package/src/social-providers/twitter.ts +199 -0
  286. package/src/social-providers/vercel.ts +87 -0
  287. package/src/social-providers/vk.ts +125 -0
  288. package/src/social-providers/wechat.ts +220 -0
  289. package/src/social-providers/zoom.ts +230 -0
  290. package/src/types/context.ts +460 -0
  291. package/src/types/cookie.ts +10 -0
  292. package/src/types/helper.ts +27 -0
  293. package/src/types/index.ts +40 -0
  294. package/src/types/init-options.ts +1679 -0
  295. package/src/types/plugin-client.ts +143 -0
  296. package/src/types/plugin.ts +163 -0
  297. package/src/types/secret.ts +8 -0
  298. package/src/utils/async.ts +53 -0
  299. package/src/utils/db.ts +20 -0
  300. package/src/utils/deprecate.ts +21 -0
  301. package/src/utils/error-codes.ts +68 -0
  302. package/src/utils/fetch-metadata.ts +3 -0
  303. package/src/utils/host.ts +416 -0
  304. package/src/utils/id.ts +5 -0
  305. package/src/utils/ip.ts +395 -0
  306. package/src/utils/is-api-error.ts +10 -0
  307. package/src/utils/json.ts +56 -0
  308. package/src/utils/redirect-uri.ts +54 -0
  309. package/src/utils/string.ts +40 -0
  310. package/src/utils/url.ts +77 -0
@@ -0,0 +1,162 @@
1
+ import { APIError, BetterAuthError } from "../error/index.mjs";
2
+ import { logger } from "../env/logger.mjs";
3
+ import { getPrimaryClientId } from "../oauth2/utils.mjs";
4
+ import { createAuthorizationURL } from "../oauth2/create-authorization-url.mjs";
5
+ import { refreshAccessToken } from "../oauth2/refresh-access-token.mjs";
6
+ import { validateAuthorizationCode } from "../oauth2/validate-authorization-code.mjs";
7
+ import { betterFetch } from "@better-fetch/fetch";
8
+ import { decodeJwt, decodeProtectedHeader, importJWK, jwtVerify } from "jose";
9
+ //#region src/social-providers/cognito.ts
10
+ const cognito = (options) => {
11
+ if (!options.domain || !options.region || !options.userPoolId) {
12
+ logger.error("Domain, region and userPoolId are required for Amazon Cognito. Make sure to provide them in the options.");
13
+ throw new BetterAuthError("DOMAIN_AND_REGION_REQUIRED");
14
+ }
15
+ const cleanDomain = options.domain.replace(/^https?:\/\//, "");
16
+ const authorizationEndpoint = `https://${cleanDomain}/oauth2/authorize`;
17
+ const tokenEndpoint = `https://${cleanDomain}/oauth2/token`;
18
+ const userInfoEndpoint = `https://${cleanDomain}/oauth2/userinfo`;
19
+ return {
20
+ id: "cognito",
21
+ name: "Cognito",
22
+ async createAuthorizationURL({ state, scopes, codeVerifier, redirectURI }) {
23
+ if (!getPrimaryClientId(options.clientId)) {
24
+ logger.error("ClientId is required for Amazon Cognito. Make sure to provide them in the options.");
25
+ throw new BetterAuthError("CLIENT_ID_AND_SECRET_REQUIRED");
26
+ }
27
+ if (options.requireClientSecret && !options.clientSecret) {
28
+ logger.error("Client Secret is required when requireClientSecret is true. Make sure to provide it in the options.");
29
+ throw new BetterAuthError("CLIENT_SECRET_REQUIRED");
30
+ }
31
+ const _scopes = options.disableDefaultScope ? [] : [
32
+ "openid",
33
+ "profile",
34
+ "email"
35
+ ];
36
+ if (options.scope) _scopes.push(...options.scope);
37
+ if (scopes) _scopes.push(...scopes);
38
+ const url = await createAuthorizationURL({
39
+ id: "cognito",
40
+ options: { ...options },
41
+ authorizationEndpoint,
42
+ scopes: _scopes,
43
+ state,
44
+ codeVerifier,
45
+ redirectURI,
46
+ prompt: options.prompt
47
+ });
48
+ const scopeValue = url.searchParams.get("scope");
49
+ if (scopeValue) {
50
+ url.searchParams.delete("scope");
51
+ const encodedScope = encodeURIComponent(scopeValue);
52
+ const urlString = url.toString();
53
+ const separator = urlString.includes("?") ? "&" : "?";
54
+ return new URL(`${urlString}${separator}scope=${encodedScope}`);
55
+ }
56
+ return url;
57
+ },
58
+ validateAuthorizationCode: async ({ code, codeVerifier, redirectURI }) => {
59
+ return validateAuthorizationCode({
60
+ code,
61
+ codeVerifier,
62
+ redirectURI,
63
+ options,
64
+ tokenEndpoint
65
+ });
66
+ },
67
+ refreshAccessToken: options.refreshAccessToken ? options.refreshAccessToken : async (refreshToken) => {
68
+ return refreshAccessToken({
69
+ refreshToken,
70
+ options: {
71
+ clientId: options.clientId,
72
+ clientKey: options.clientKey,
73
+ clientSecret: options.clientSecret
74
+ },
75
+ tokenEndpoint
76
+ });
77
+ },
78
+ async verifyIdToken(token, nonce) {
79
+ if (options.disableIdTokenSignIn) return false;
80
+ if (options.verifyIdToken) return options.verifyIdToken(token, nonce);
81
+ try {
82
+ const { kid, alg: jwtAlg } = decodeProtectedHeader(token);
83
+ if (!kid || !jwtAlg) return false;
84
+ const publicKey = await getCognitoPublicKey(kid, options.region, options.userPoolId);
85
+ const expectedIssuer = `https://cognito-idp.${options.region}.amazonaws.com/${options.userPoolId}`;
86
+ const { payload: jwtClaims } = await jwtVerify(token, publicKey, {
87
+ algorithms: [jwtAlg],
88
+ issuer: expectedIssuer,
89
+ audience: options.clientId,
90
+ maxTokenAge: "1h"
91
+ });
92
+ if (nonce && jwtClaims.nonce !== nonce) return false;
93
+ return true;
94
+ } catch (error) {
95
+ logger.error("Failed to verify ID token:", error);
96
+ return false;
97
+ }
98
+ },
99
+ async getUserInfo(token) {
100
+ if (options.getUserInfo) return options.getUserInfo(token);
101
+ if (token.idToken) try {
102
+ const profile = decodeJwt(token.idToken);
103
+ if (!profile) return null;
104
+ const name = profile.name || profile.given_name || profile.username || "";
105
+ const enrichedProfile = {
106
+ ...profile,
107
+ name
108
+ };
109
+ const userMap = await options.mapProfileToUser?.(enrichedProfile);
110
+ return {
111
+ user: {
112
+ id: profile.sub,
113
+ name: enrichedProfile.name,
114
+ email: profile.email,
115
+ image: profile.picture,
116
+ emailVerified: profile.email_verified,
117
+ ...userMap
118
+ },
119
+ data: enrichedProfile
120
+ };
121
+ } catch (error) {
122
+ logger.error("Failed to decode ID token:", error);
123
+ }
124
+ if (token.accessToken) try {
125
+ const { data: userInfo } = await betterFetch(userInfoEndpoint, { headers: { Authorization: `Bearer ${token.accessToken}` } });
126
+ if (userInfo) {
127
+ const userMap = await options.mapProfileToUser?.(userInfo);
128
+ return {
129
+ user: {
130
+ id: userInfo.sub,
131
+ name: userInfo.name || userInfo.given_name || userInfo.username || "",
132
+ email: userInfo.email,
133
+ image: userInfo.picture,
134
+ emailVerified: userInfo.email_verified,
135
+ ...userMap
136
+ },
137
+ data: userInfo
138
+ };
139
+ }
140
+ } catch (error) {
141
+ logger.error("Failed to fetch user info from Cognito:", error);
142
+ }
143
+ return null;
144
+ },
145
+ options
146
+ };
147
+ };
148
+ const getCognitoPublicKey = async (kid, region, userPoolId) => {
149
+ const COGNITO_JWKS_URI = `https://cognito-idp.${region}.amazonaws.com/${userPoolId}/.well-known/jwks.json`;
150
+ try {
151
+ const { data } = await betterFetch(COGNITO_JWKS_URI);
152
+ if (!data?.keys) throw new APIError("BAD_REQUEST", { message: "Keys not found" });
153
+ const jwk = data.keys.find((key) => key.kid === kid);
154
+ if (!jwk) throw new Error(`JWK with kid ${kid} not found`);
155
+ return await importJWK(jwk, jwk.alg);
156
+ } catch (error) {
157
+ logger.error("Failed to fetch Cognito public key:", error);
158
+ throw error;
159
+ }
160
+ };
161
+ //#endregion
162
+ export { cognito, getCognitoPublicKey };
@@ -0,0 +1,124 @@
1
+ import { OAuth2Tokens, ProviderOptions } from "../oauth2/oauth-provider.mjs";
2
+ //#region src/social-providers/discord.d.ts
3
+ interface DiscordProfile extends Record<string, any> {
4
+ /** the user's id (i.e. the numerical snowflake) */
5
+ id: string;
6
+ /** the user's username, not unique across the platform */
7
+ username: string;
8
+ /** the user's Discord-tag */
9
+ discriminator: string;
10
+ /** the user's display name, if it is set */
11
+ global_name: string | null;
12
+ /**
13
+ * the user's avatar hash:
14
+ * https://discord.com/developers/docs/reference#image-formatting
15
+ */
16
+ avatar: string | null;
17
+ /** whether the user belongs to an OAuth2 application */
18
+ bot?: boolean | undefined;
19
+ /**
20
+ * whether the user is an Official Discord System user (part of the urgent
21
+ * message system)
22
+ */
23
+ system?: boolean | undefined;
24
+ /** whether the user has two factor enabled on their account */
25
+ mfa_enabled: boolean;
26
+ /**
27
+ * the user's banner hash:
28
+ * https://discord.com/developers/docs/reference#image-formatting
29
+ */
30
+ banner: string | null;
31
+ /** the user's banner color encoded as an integer representation of hexadecimal color code */
32
+ accent_color: number | null;
33
+ /**
34
+ * the user's chosen language option:
35
+ * https://discord.com/developers/docs/reference#locales
36
+ */
37
+ locale: string;
38
+ /** whether the email on this account has been verified */
39
+ verified: boolean;
40
+ /** the user's email */
41
+ email?: string | null;
42
+ /**
43
+ * the flags on a user's account:
44
+ * https://discord.com/developers/docs/resources/user#user-object-user-flags
45
+ */
46
+ flags: number;
47
+ /**
48
+ * the type of Nitro subscription on a user's account:
49
+ * https://discord.com/developers/docs/resources/user#user-object-premium-types
50
+ */
51
+ premium_type: number;
52
+ /**
53
+ * the public flags on a user's account:
54
+ * https://discord.com/developers/docs/resources/user#user-object-user-flags
55
+ */
56
+ public_flags: number;
57
+ /** undocumented field; corresponds to the user's custom nickname */
58
+ display_name: string | null;
59
+ /**
60
+ * undocumented field; corresponds to the Discord feature where you can e.g.
61
+ * put your avatar inside of an ice cube
62
+ */
63
+ avatar_decoration: string | null;
64
+ /**
65
+ * undocumented field; corresponds to the premium feature where you can
66
+ * select a custom banner color
67
+ */
68
+ banner_color: string | null;
69
+ /** undocumented field; the CDN URL of their profile picture */
70
+ image_url: string;
71
+ }
72
+ interface DiscordOptions extends ProviderOptions<DiscordProfile> {
73
+ clientId: string;
74
+ prompt?: ("none" | "consent") | undefined;
75
+ permissions?: number | undefined;
76
+ }
77
+ declare const discord: (options: DiscordOptions) => {
78
+ id: "discord";
79
+ name: string;
80
+ createAuthorizationURL({
81
+ state,
82
+ scopes,
83
+ redirectURI
84
+ }: {
85
+ state: string;
86
+ codeVerifier: string;
87
+ scopes?: string[] | undefined;
88
+ redirectURI: string;
89
+ display?: string | undefined;
90
+ loginHint?: string | undefined;
91
+ }): URL;
92
+ validateAuthorizationCode: ({
93
+ code,
94
+ redirectURI
95
+ }: {
96
+ code: string;
97
+ redirectURI: string;
98
+ codeVerifier?: string | undefined;
99
+ deviceId?: string | undefined;
100
+ }) => Promise<OAuth2Tokens>;
101
+ refreshAccessToken: (refreshToken: string) => Promise<OAuth2Tokens>;
102
+ getUserInfo(token: OAuth2Tokens & {
103
+ user?: {
104
+ name?: {
105
+ firstName?: string;
106
+ lastName?: string;
107
+ };
108
+ email?: string;
109
+ } | undefined;
110
+ }): Promise<{
111
+ user: {
112
+ id: string;
113
+ name?: string;
114
+ email?: string | null;
115
+ image?: string;
116
+ emailVerified: boolean;
117
+ [key: string]: any;
118
+ };
119
+ data: any;
120
+ } | null>;
121
+ options: DiscordOptions;
122
+ };
123
+ //#endregion
124
+ export { DiscordOptions, DiscordProfile, discord };
@@ -0,0 +1,62 @@
1
+ import { refreshAccessToken } from "../oauth2/refresh-access-token.mjs";
2
+ import { validateAuthorizationCode } from "../oauth2/validate-authorization-code.mjs";
3
+ import { betterFetch } from "@better-fetch/fetch";
4
+ //#region src/social-providers/discord.ts
5
+ const discord = (options) => {
6
+ const tokenEndpoint = "https://discord.com/api/oauth2/token";
7
+ return {
8
+ id: "discord",
9
+ name: "Discord",
10
+ createAuthorizationURL({ state, scopes, redirectURI }) {
11
+ const _scopes = options.disableDefaultScope ? [] : ["identify", "email"];
12
+ if (scopes) _scopes.push(...scopes);
13
+ if (options.scope) _scopes.push(...options.scope);
14
+ const permissionsParam = _scopes.includes("bot") && options.permissions !== void 0 ? `&permissions=${options.permissions}` : "";
15
+ return new URL(`https://discord.com/api/oauth2/authorize?scope=${_scopes.join("+")}&response_type=code&client_id=${options.clientId}&redirect_uri=${encodeURIComponent(options.redirectURI || redirectURI)}&state=${state}&prompt=${options.prompt || "none"}${permissionsParam}`);
16
+ },
17
+ validateAuthorizationCode: async ({ code, redirectURI }) => {
18
+ return validateAuthorizationCode({
19
+ code,
20
+ redirectURI,
21
+ options,
22
+ tokenEndpoint
23
+ });
24
+ },
25
+ refreshAccessToken: options.refreshAccessToken ? options.refreshAccessToken : async (refreshToken) => {
26
+ return refreshAccessToken({
27
+ refreshToken,
28
+ options: {
29
+ clientId: options.clientId,
30
+ clientKey: options.clientKey,
31
+ clientSecret: options.clientSecret
32
+ },
33
+ tokenEndpoint
34
+ });
35
+ },
36
+ async getUserInfo(token) {
37
+ if (options.getUserInfo) return options.getUserInfo(token);
38
+ const { data: profile, error } = await betterFetch("https://discord.com/api/users/@me", { headers: { authorization: `Bearer ${token.accessToken}` } });
39
+ if (error) return null;
40
+ if (profile.avatar === null) profile.image_url = `https://cdn.discordapp.com/embed/avatars/${profile.discriminator === "0" ? Number(BigInt(profile.id) >> BigInt(22)) % 6 : parseInt(profile.discriminator) % 5}.png`;
41
+ else {
42
+ const format = profile.avatar.startsWith("a_") ? "gif" : "png";
43
+ profile.image_url = `https://cdn.discordapp.com/avatars/${profile.id}/${profile.avatar}.${format}`;
44
+ }
45
+ const userMap = await options.mapProfileToUser?.(profile);
46
+ return {
47
+ user: {
48
+ id: profile.id,
49
+ name: profile.global_name || profile.username || "",
50
+ email: profile.email,
51
+ emailVerified: profile.verified,
52
+ image: profile.image_url,
53
+ ...userMap
54
+ },
55
+ data: profile
56
+ };
57
+ },
58
+ options
59
+ };
60
+ };
61
+ //#endregion
62
+ export { discord };
@@ -0,0 +1,69 @@
1
+ import { OAuth2Tokens, ProviderOptions } from "../oauth2/oauth-provider.mjs";
2
+ //#region src/social-providers/dropbox.d.ts
3
+ interface DropboxProfile {
4
+ account_id: string;
5
+ name: {
6
+ given_name: string;
7
+ surname: string;
8
+ familiar_name: string;
9
+ display_name: string;
10
+ abbreviated_name: string;
11
+ };
12
+ email: string;
13
+ email_verified: boolean;
14
+ profile_photo_url: string;
15
+ }
16
+ interface DropboxOptions extends ProviderOptions<DropboxProfile> {
17
+ clientId: string;
18
+ accessType?: ("offline" | "online" | "legacy") | undefined;
19
+ }
20
+ declare const dropbox: (options: DropboxOptions) => {
21
+ id: "dropbox";
22
+ name: string;
23
+ createAuthorizationURL: ({
24
+ state,
25
+ scopes,
26
+ codeVerifier,
27
+ redirectURI
28
+ }: {
29
+ state: string;
30
+ codeVerifier: string;
31
+ scopes?: string[] | undefined;
32
+ redirectURI: string;
33
+ display?: string | undefined;
34
+ loginHint?: string | undefined;
35
+ }) => Promise<URL>;
36
+ validateAuthorizationCode: ({
37
+ code,
38
+ codeVerifier,
39
+ redirectURI
40
+ }: {
41
+ code: string;
42
+ redirectURI: string;
43
+ codeVerifier?: string | undefined;
44
+ deviceId?: string | undefined;
45
+ }) => Promise<OAuth2Tokens>;
46
+ refreshAccessToken: (refreshToken: string) => Promise<OAuth2Tokens>;
47
+ getUserInfo(token: OAuth2Tokens & {
48
+ user?: {
49
+ name?: {
50
+ firstName?: string;
51
+ lastName?: string;
52
+ };
53
+ email?: string;
54
+ } | undefined;
55
+ }): Promise<{
56
+ user: {
57
+ id: string;
58
+ name?: string;
59
+ email?: string | null;
60
+ image?: string;
61
+ emailVerified: boolean;
62
+ [key: string]: any;
63
+ };
64
+ data: any;
65
+ } | null>;
66
+ options: DropboxOptions;
67
+ };
68
+ //#endregion
69
+ export { DropboxOptions, DropboxProfile, dropbox };
@@ -0,0 +1,72 @@
1
+ import { createAuthorizationURL } from "../oauth2/create-authorization-url.mjs";
2
+ import { refreshAccessToken } from "../oauth2/refresh-access-token.mjs";
3
+ import { validateAuthorizationCode } from "../oauth2/validate-authorization-code.mjs";
4
+ import { betterFetch } from "@better-fetch/fetch";
5
+ //#region src/social-providers/dropbox.ts
6
+ const dropbox = (options) => {
7
+ const tokenEndpoint = "https://api.dropboxapi.com/oauth2/token";
8
+ return {
9
+ id: "dropbox",
10
+ name: "Dropbox",
11
+ createAuthorizationURL: async ({ state, scopes, codeVerifier, redirectURI }) => {
12
+ const _scopes = options.disableDefaultScope ? [] : ["account_info.read"];
13
+ if (options.scope) _scopes.push(...options.scope);
14
+ if (scopes) _scopes.push(...scopes);
15
+ const additionalParams = {};
16
+ if (options.accessType) additionalParams.token_access_type = options.accessType;
17
+ return await createAuthorizationURL({
18
+ id: "dropbox",
19
+ options,
20
+ authorizationEndpoint: "https://www.dropbox.com/oauth2/authorize",
21
+ scopes: _scopes,
22
+ state,
23
+ redirectURI,
24
+ codeVerifier,
25
+ additionalParams
26
+ });
27
+ },
28
+ validateAuthorizationCode: async ({ code, codeVerifier, redirectURI }) => {
29
+ return await validateAuthorizationCode({
30
+ code,
31
+ codeVerifier,
32
+ redirectURI,
33
+ options,
34
+ tokenEndpoint
35
+ });
36
+ },
37
+ refreshAccessToken: options.refreshAccessToken ? options.refreshAccessToken : async (refreshToken) => {
38
+ return refreshAccessToken({
39
+ refreshToken,
40
+ options: {
41
+ clientId: options.clientId,
42
+ clientKey: options.clientKey,
43
+ clientSecret: options.clientSecret
44
+ },
45
+ tokenEndpoint
46
+ });
47
+ },
48
+ async getUserInfo(token) {
49
+ if (options.getUserInfo) return options.getUserInfo(token);
50
+ const { data: profile, error } = await betterFetch("https://api.dropboxapi.com/2/users/get_current_account", {
51
+ method: "POST",
52
+ headers: { Authorization: `Bearer ${token.accessToken}` }
53
+ });
54
+ if (error) return null;
55
+ const userMap = await options.mapProfileToUser?.(profile);
56
+ return {
57
+ user: {
58
+ id: profile.account_id,
59
+ name: profile.name?.display_name,
60
+ email: profile.email,
61
+ emailVerified: profile.email_verified || false,
62
+ image: profile.profile_photo_url,
63
+ ...userMap
64
+ },
65
+ data: profile
66
+ };
67
+ },
68
+ options
69
+ };
70
+ };
71
+ //#endregion
72
+ export { dropbox };
@@ -0,0 +1,79 @@
1
+ import { OAuth2Tokens, ProviderOptions } from "../oauth2/oauth-provider.mjs";
2
+ //#region src/social-providers/facebook.d.ts
3
+ interface FacebookProfile {
4
+ id: string;
5
+ name: string;
6
+ email?: string;
7
+ email_verified?: boolean;
8
+ picture: {
9
+ data: {
10
+ height: number;
11
+ is_silhouette: boolean;
12
+ url: string;
13
+ width: number;
14
+ };
15
+ };
16
+ }
17
+ interface FacebookOptions extends ProviderOptions<FacebookProfile> {
18
+ clientId: string | string[];
19
+ /**
20
+ * Extend list of fields to retrieve from the Facebook user profile.
21
+ *
22
+ * @default ["id", "name", "email", "picture"]
23
+ */
24
+ fields?: string[] | undefined;
25
+ /**
26
+ * The config id to use when undergoing oauth
27
+ */
28
+ configId?: string | undefined;
29
+ }
30
+ declare const facebook: (options: FacebookOptions) => {
31
+ id: "facebook";
32
+ name: string;
33
+ createAuthorizationURL({
34
+ state,
35
+ scopes,
36
+ redirectURI,
37
+ loginHint
38
+ }: {
39
+ state: string;
40
+ codeVerifier: string;
41
+ scopes?: string[] | undefined;
42
+ redirectURI: string;
43
+ display?: string | undefined;
44
+ loginHint?: string | undefined;
45
+ }): Promise<URL>;
46
+ validateAuthorizationCode: ({
47
+ code,
48
+ redirectURI
49
+ }: {
50
+ code: string;
51
+ redirectURI: string;
52
+ codeVerifier?: string | undefined;
53
+ deviceId?: string | undefined;
54
+ }) => Promise<OAuth2Tokens>;
55
+ verifyIdToken(token: string, nonce: string | undefined): Promise<boolean>;
56
+ refreshAccessToken: (refreshToken: string) => Promise<OAuth2Tokens>;
57
+ getUserInfo(token: OAuth2Tokens & {
58
+ user?: {
59
+ name?: {
60
+ firstName?: string;
61
+ lastName?: string;
62
+ };
63
+ email?: string;
64
+ } | undefined;
65
+ }): Promise<{
66
+ user: {
67
+ id: string;
68
+ name?: string;
69
+ email?: string | null;
70
+ image?: string;
71
+ emailVerified: boolean;
72
+ [key: string]: any;
73
+ };
74
+ data: any;
75
+ } | null>;
76
+ options: FacebookOptions;
77
+ };
78
+ //#endregion
79
+ export { FacebookOptions, FacebookProfile, facebook };