@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,123 @@
1
+ import { OAuth2Tokens, ProviderOptions } from "../oauth2/oauth-provider.mjs";
2
+ import { JWTPayload } from "jose";
3
+
4
+ //#region src/social-providers/google.d.ts
5
+ interface GoogleProfile {
6
+ aud: string;
7
+ azp: string;
8
+ email: string;
9
+ email_verified: boolean;
10
+ exp: number;
11
+ /**
12
+ * The family name of the user, or last name in most
13
+ * Western languages.
14
+ */
15
+ family_name: string;
16
+ /**
17
+ * The given name of the user, or first name in most
18
+ * Western languages.
19
+ */
20
+ given_name: string;
21
+ hd?: string | undefined;
22
+ iat: number;
23
+ iss: string;
24
+ jti?: string | undefined;
25
+ locale?: string | undefined;
26
+ name: string;
27
+ nbf?: number | undefined;
28
+ picture: string;
29
+ sub: string;
30
+ }
31
+ interface GoogleOptions extends ProviderOptions<GoogleProfile> {
32
+ clientId: string | string[];
33
+ /**
34
+ * The access type to use for the authorization code request
35
+ */
36
+ accessType?: ("offline" | "online") | undefined;
37
+ /**
38
+ * The display mode to use for the authorization code request
39
+ */
40
+ display?: ("page" | "popup" | "touch" | "wap") | undefined;
41
+ /**
42
+ * The hosted domain (Google Workspace) the user must belong to.
43
+ *
44
+ * This is sent to Google as the `hd` authorization hint and, when set, is
45
+ * also enforced against the `hd` claim of the returned id token/profile.
46
+ * Set `hd: "*"` to require any Workspace hosted-domain claim. Sign-in is
47
+ * rejected when the claim is missing or does not satisfy this restriction.
48
+ */
49
+ hd?: string | undefined;
50
+ }
51
+ interface VerifyGoogleIdTokenOptions {
52
+ token: string;
53
+ audience: string | string[];
54
+ nonce?: string | undefined;
55
+ }
56
+ /**
57
+ * Verifies a Google ID token against Google's issuer, audience, signature,
58
+ * expiry, and maximum token age.
59
+ */
60
+ declare const verifyGoogleIdToken: ({
61
+ token,
62
+ audience,
63
+ nonce
64
+ }: VerifyGoogleIdTokenOptions) => Promise<JWTPayload | null>;
65
+ /**
66
+ * Checks whether Google's verified `hd` claim satisfies the configured hosted
67
+ * domain restriction. `hd: "*"` accepts any Google Workspace hosted domain.
68
+ */
69
+ declare const isGoogleHostedDomainAllowed: (configuredHostedDomain: string | undefined, tokenHostedDomain: unknown) => boolean;
70
+ declare const google: (options: GoogleOptions) => {
71
+ id: "google";
72
+ name: string;
73
+ createAuthorizationURL({
74
+ state,
75
+ scopes,
76
+ codeVerifier,
77
+ redirectURI,
78
+ loginHint,
79
+ display
80
+ }: {
81
+ state: string;
82
+ codeVerifier: string;
83
+ scopes?: string[] | undefined;
84
+ redirectURI: string;
85
+ display?: string | undefined;
86
+ loginHint?: string | undefined;
87
+ }): Promise<URL>;
88
+ validateAuthorizationCode: ({
89
+ code,
90
+ codeVerifier,
91
+ redirectURI
92
+ }: {
93
+ code: string;
94
+ redirectURI: string;
95
+ codeVerifier?: string | undefined;
96
+ deviceId?: string | undefined;
97
+ }) => Promise<OAuth2Tokens>;
98
+ refreshAccessToken: (refreshToken: string) => Promise<OAuth2Tokens>;
99
+ verifyIdToken(token: string, nonce: string | undefined): Promise<boolean>;
100
+ getUserInfo(token: OAuth2Tokens & {
101
+ user?: {
102
+ name?: {
103
+ firstName?: string;
104
+ lastName?: string;
105
+ };
106
+ email?: string;
107
+ } | undefined;
108
+ }): Promise<{
109
+ user: {
110
+ id: string;
111
+ name?: string;
112
+ email?: string | null;
113
+ image?: string;
114
+ emailVerified: boolean;
115
+ [key: string]: any;
116
+ };
117
+ data: any;
118
+ } | null>;
119
+ options: GoogleOptions;
120
+ };
121
+ declare const getGooglePublicKey: (kid: string) => Promise<Uint8Array<ArrayBufferLike> | CryptoKey>;
122
+ //#endregion
123
+ export { GoogleOptions, GoogleProfile, VerifyGoogleIdTokenOptions, getGooglePublicKey, google, isGoogleHostedDomainAllowed, verifyGoogleIdToken };
@@ -0,0 +1,137 @@
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/google.ts
10
+ const GOOGLE_ID_TOKEN_MAX_AGE = "1h";
11
+ /**
12
+ * Verifies a Google ID token against Google's issuer, audience, signature,
13
+ * expiry, and maximum token age.
14
+ */
15
+ const verifyGoogleIdToken = async ({ token, audience, nonce }) => {
16
+ try {
17
+ const { kid, alg: jwtAlg } = decodeProtectedHeader(token);
18
+ if (!kid || !jwtAlg) return null;
19
+ const { payload: jwtClaims } = await jwtVerify(token, await getGooglePublicKey(kid), {
20
+ algorithms: [jwtAlg],
21
+ issuer: ["https://accounts.google.com", "accounts.google.com"],
22
+ audience,
23
+ maxTokenAge: GOOGLE_ID_TOKEN_MAX_AGE
24
+ });
25
+ if (nonce && jwtClaims.nonce !== nonce) return null;
26
+ return jwtClaims;
27
+ } catch {
28
+ return null;
29
+ }
30
+ };
31
+ /**
32
+ * Checks whether Google's verified `hd` claim satisfies the configured hosted
33
+ * domain restriction. `hd: "*"` accepts any Google Workspace hosted domain.
34
+ */
35
+ const isGoogleHostedDomainAllowed = (configuredHostedDomain, tokenHostedDomain) => {
36
+ if (!configuredHostedDomain) return true;
37
+ if (typeof tokenHostedDomain !== "string" || !tokenHostedDomain) return false;
38
+ if (configuredHostedDomain === "*") return true;
39
+ return tokenHostedDomain === configuredHostedDomain;
40
+ };
41
+ const google = (options) => {
42
+ return {
43
+ id: "google",
44
+ name: "Google",
45
+ async createAuthorizationURL({ state, scopes, codeVerifier, redirectURI, loginHint, display }) {
46
+ if (!getPrimaryClientId(options.clientId) || !options.clientSecret) {
47
+ logger.error("Client Id and Client Secret is required for Google. Make sure to provide them in the options.");
48
+ throw new BetterAuthError("CLIENT_ID_AND_SECRET_REQUIRED");
49
+ }
50
+ if (!codeVerifier) throw new BetterAuthError("codeVerifier is required for Google");
51
+ const _scopes = options.disableDefaultScope ? [] : [
52
+ "email",
53
+ "profile",
54
+ "openid"
55
+ ];
56
+ if (options.scope) _scopes.push(...options.scope);
57
+ if (scopes) _scopes.push(...scopes);
58
+ return await createAuthorizationURL({
59
+ id: "google",
60
+ options,
61
+ authorizationEndpoint: "https://accounts.google.com/o/oauth2/v2/auth",
62
+ scopes: _scopes,
63
+ state,
64
+ codeVerifier,
65
+ redirectURI,
66
+ prompt: options.prompt,
67
+ accessType: options.accessType,
68
+ display: display || options.display,
69
+ loginHint,
70
+ hd: options.hd,
71
+ additionalParams: { include_granted_scopes: "true" }
72
+ });
73
+ },
74
+ validateAuthorizationCode: async ({ code, codeVerifier, redirectURI }) => {
75
+ return validateAuthorizationCode({
76
+ code,
77
+ codeVerifier,
78
+ redirectURI,
79
+ options,
80
+ tokenEndpoint: "https://oauth2.googleapis.com/token"
81
+ });
82
+ },
83
+ refreshAccessToken: options.refreshAccessToken ? options.refreshAccessToken : async (refreshToken) => {
84
+ return refreshAccessToken({
85
+ refreshToken,
86
+ options: {
87
+ clientId: options.clientId,
88
+ clientKey: options.clientKey,
89
+ clientSecret: options.clientSecret
90
+ },
91
+ tokenEndpoint: "https://oauth2.googleapis.com/token"
92
+ });
93
+ },
94
+ async verifyIdToken(token, nonce) {
95
+ if (options.disableIdTokenSignIn) return false;
96
+ if (options.verifyIdToken) return options.verifyIdToken(token, nonce);
97
+ const jwtClaims = await verifyGoogleIdToken({
98
+ token,
99
+ audience: options.clientId,
100
+ nonce
101
+ });
102
+ if (!jwtClaims) return false;
103
+ return isGoogleHostedDomainAllowed(options.hd, jwtClaims.hd);
104
+ },
105
+ async getUserInfo(token) {
106
+ if (options.getUserInfo) return options.getUserInfo(token);
107
+ if (!token.idToken) return null;
108
+ const user = decodeJwt(token.idToken);
109
+ if (!isGoogleHostedDomainAllowed(options.hd, user.hd)) {
110
+ logger.error(`Google sign-in rejected: id token hosted domain (hd) "${user.hd ?? "<missing>"}" does not satisfy the configured "hd" option "${options.hd}".`);
111
+ return null;
112
+ }
113
+ const userMap = await options.mapProfileToUser?.(user);
114
+ return {
115
+ user: {
116
+ id: user.sub,
117
+ name: user.name,
118
+ email: user.email,
119
+ image: user.picture,
120
+ emailVerified: user.email_verified,
121
+ ...userMap
122
+ },
123
+ data: user
124
+ };
125
+ },
126
+ options
127
+ };
128
+ };
129
+ const getGooglePublicKey = async (kid) => {
130
+ const { data } = await betterFetch("https://www.googleapis.com/oauth2/v3/certs");
131
+ if (!data?.keys) throw new APIError("BAD_REQUEST", { message: "Keys not found" });
132
+ const jwk = data.keys.find((key) => key.kid === kid);
133
+ if (!jwk) throw new Error(`JWK with kid ${kid} not found`);
134
+ return await importJWK(jwk, jwk.alg);
135
+ };
136
+ //#endregion
137
+ export { getGooglePublicKey, google, isGoogleHostedDomainAllowed, verifyGoogleIdToken };
@@ -0,0 +1,83 @@
1
+ import { OAuth2Tokens, ProviderOptions } from "../oauth2/oauth-provider.mjs";
2
+ //#region src/social-providers/huggingface.d.ts
3
+ interface HuggingFaceProfile {
4
+ sub: string;
5
+ name: string;
6
+ preferred_username: string;
7
+ profile: string;
8
+ picture: string;
9
+ website?: string | undefined;
10
+ email?: string | undefined;
11
+ email_verified?: boolean | undefined;
12
+ isPro: boolean;
13
+ canPay?: boolean | undefined;
14
+ orgs?: {
15
+ sub: string;
16
+ name: string;
17
+ picture: string;
18
+ preferred_username: string;
19
+ isEnterprise: boolean | "plus";
20
+ canPay?: boolean;
21
+ roleInOrg?: "admin" | "write" | "contributor" | "read";
22
+ pendingSSO?: boolean;
23
+ missingMFA?: boolean;
24
+ resourceGroups?: {
25
+ sub: string;
26
+ name: string;
27
+ role: "admin" | "write" | "contributor" | "read";
28
+ }[];
29
+ } | undefined;
30
+ }
31
+ interface HuggingFaceOptions extends ProviderOptions<HuggingFaceProfile> {
32
+ clientId: string;
33
+ }
34
+ declare const huggingface: (options: HuggingFaceOptions) => {
35
+ id: "huggingface";
36
+ name: string;
37
+ createAuthorizationURL({
38
+ state,
39
+ scopes,
40
+ codeVerifier,
41
+ redirectURI
42
+ }: {
43
+ state: string;
44
+ codeVerifier: string;
45
+ scopes?: string[] | undefined;
46
+ redirectURI: string;
47
+ display?: string | undefined;
48
+ loginHint?: string | undefined;
49
+ }): Promise<URL>;
50
+ validateAuthorizationCode: ({
51
+ code,
52
+ codeVerifier,
53
+ redirectURI
54
+ }: {
55
+ code: string;
56
+ redirectURI: string;
57
+ codeVerifier?: string | undefined;
58
+ deviceId?: string | undefined;
59
+ }) => Promise<OAuth2Tokens>;
60
+ refreshAccessToken: (refreshToken: string) => Promise<OAuth2Tokens>;
61
+ getUserInfo(token: OAuth2Tokens & {
62
+ user?: {
63
+ name?: {
64
+ firstName?: string;
65
+ lastName?: string;
66
+ };
67
+ email?: string;
68
+ } | undefined;
69
+ }): Promise<{
70
+ user: {
71
+ id: string;
72
+ name?: string;
73
+ email?: string | null;
74
+ image?: string;
75
+ emailVerified: boolean;
76
+ [key: string]: any;
77
+ };
78
+ data: any;
79
+ } | null>;
80
+ options: HuggingFaceOptions;
81
+ };
82
+ //#endregion
83
+ export { HuggingFaceOptions, HuggingFaceProfile, huggingface };
@@ -0,0 +1,73 @@
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/huggingface.ts
6
+ const huggingface = (options) => {
7
+ const tokenEndpoint = "https://huggingface.co/oauth/token";
8
+ return {
9
+ id: "huggingface",
10
+ name: "Hugging Face",
11
+ createAuthorizationURL({ state, scopes, codeVerifier, redirectURI }) {
12
+ const _scopes = options.disableDefaultScope ? [] : [
13
+ "openid",
14
+ "profile",
15
+ "email"
16
+ ];
17
+ if (options.scope) _scopes.push(...options.scope);
18
+ if (scopes) _scopes.push(...scopes);
19
+ return createAuthorizationURL({
20
+ id: "huggingface",
21
+ options,
22
+ authorizationEndpoint: "https://huggingface.co/oauth/authorize",
23
+ scopes: _scopes,
24
+ state,
25
+ codeVerifier,
26
+ redirectURI
27
+ });
28
+ },
29
+ validateAuthorizationCode: async ({ code, codeVerifier, redirectURI }) => {
30
+ return validateAuthorizationCode({
31
+ code,
32
+ codeVerifier,
33
+ redirectURI,
34
+ options,
35
+ tokenEndpoint
36
+ });
37
+ },
38
+ refreshAccessToken: options.refreshAccessToken ? options.refreshAccessToken : async (refreshToken) => {
39
+ return refreshAccessToken({
40
+ refreshToken,
41
+ options: {
42
+ clientId: options.clientId,
43
+ clientKey: options.clientKey,
44
+ clientSecret: options.clientSecret
45
+ },
46
+ tokenEndpoint
47
+ });
48
+ },
49
+ async getUserInfo(token) {
50
+ if (options.getUserInfo) return options.getUserInfo(token);
51
+ const { data: profile, error } = await betterFetch("https://huggingface.co/oauth/userinfo", {
52
+ method: "GET",
53
+ headers: { Authorization: `Bearer ${token.accessToken}` }
54
+ });
55
+ if (error) return null;
56
+ const userMap = await options.mapProfileToUser?.(profile);
57
+ return {
58
+ user: {
59
+ id: profile.sub,
60
+ name: profile.name || profile.preferred_username || "",
61
+ email: profile.email,
62
+ image: profile.picture,
63
+ emailVerified: profile.email_verified ?? false,
64
+ ...userMap
65
+ },
66
+ data: profile
67
+ };
68
+ },
69
+ options
70
+ };
71
+ };
72
+ //#endregion
73
+ export { huggingface };