@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,60 @@
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/tiktok.ts
5
+ const tiktok = (options) => {
6
+ const tokenEndpoint = "https://open.tiktokapis.com/v2/oauth/token/";
7
+ return {
8
+ id: "tiktok",
9
+ name: "TikTok",
10
+ createAuthorizationURL({ state, scopes, redirectURI }) {
11
+ const _scopes = options.disableDefaultScope ? [] : ["user.info.profile"];
12
+ if (options.scope) _scopes.push(...options.scope);
13
+ if (scopes) _scopes.push(...scopes);
14
+ return new URL(`https://www.tiktok.com/v2/auth/authorize?scope=${_scopes.join(",")}&response_type=code&client_key=${options.clientKey}&redirect_uri=${encodeURIComponent(options.redirectURI || redirectURI)}&state=${state}`);
15
+ },
16
+ validateAuthorizationCode: async ({ code, redirectURI }) => {
17
+ return validateAuthorizationCode({
18
+ code,
19
+ redirectURI: options.redirectURI || redirectURI,
20
+ options: {
21
+ clientKey: options.clientKey,
22
+ clientSecret: options.clientSecret
23
+ },
24
+ tokenEndpoint
25
+ });
26
+ },
27
+ refreshAccessToken: options.refreshAccessToken ? options.refreshAccessToken : async (refreshToken) => {
28
+ return refreshAccessToken({
29
+ refreshToken,
30
+ options: { clientSecret: options.clientSecret },
31
+ tokenEndpoint,
32
+ authentication: "post",
33
+ extraParams: { client_key: options.clientKey }
34
+ });
35
+ },
36
+ async getUserInfo(token) {
37
+ if (options.getUserInfo) return options.getUserInfo(token);
38
+ const { data: profile, error } = await betterFetch(`https://open.tiktokapis.com/v2/user/info/?fields=${[
39
+ "open_id",
40
+ "avatar_large_url",
41
+ "display_name",
42
+ "username"
43
+ ].join(",")}`, { headers: { authorization: `Bearer ${token.accessToken}` } });
44
+ if (error) return null;
45
+ return {
46
+ user: {
47
+ email: profile.data.user.email || profile.data.user.username,
48
+ id: profile.data.user.open_id,
49
+ name: profile.data.user.display_name || profile.data.user.username || "",
50
+ image: profile.data.user.avatar_large_url,
51
+ emailVerified: false
52
+ },
53
+ data: profile
54
+ };
55
+ },
56
+ options
57
+ };
58
+ };
59
+ //#endregion
60
+ export { tiktok };
@@ -0,0 +1,79 @@
1
+ import { OAuth2Tokens, ProviderOptions } from "../oauth2/oauth-provider.mjs";
2
+ //#region src/social-providers/twitch.d.ts
3
+ /**
4
+ * @see https://dev.twitch.tv/docs/authentication/getting-tokens-oidc/#requesting-claims
5
+ */
6
+ interface TwitchProfile {
7
+ /**
8
+ * The sub of the user
9
+ */
10
+ sub: string;
11
+ /**
12
+ * The preferred username of the user
13
+ */
14
+ preferred_username: string;
15
+ /**
16
+ * The email of the user
17
+ */
18
+ email: string;
19
+ /**
20
+ * Indicate if this user has a verified email.
21
+ */
22
+ email_verified: boolean;
23
+ /**
24
+ * The picture of the user
25
+ */
26
+ picture: string;
27
+ }
28
+ interface TwitchOptions extends ProviderOptions<TwitchProfile> {
29
+ clientId: string;
30
+ claims?: string[] | undefined;
31
+ }
32
+ declare const twitch: (options: TwitchOptions) => {
33
+ id: "twitch";
34
+ name: string;
35
+ createAuthorizationURL({
36
+ state,
37
+ scopes,
38
+ redirectURI
39
+ }: {
40
+ state: string;
41
+ codeVerifier: string;
42
+ scopes?: string[] | undefined;
43
+ redirectURI: string;
44
+ display?: string | undefined;
45
+ loginHint?: string | undefined;
46
+ }): Promise<URL>;
47
+ validateAuthorizationCode: ({
48
+ code,
49
+ redirectURI
50
+ }: {
51
+ code: string;
52
+ redirectURI: string;
53
+ codeVerifier?: string | undefined;
54
+ deviceId?: string | undefined;
55
+ }) => Promise<OAuth2Tokens>;
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: TwitchOptions;
77
+ };
78
+ //#endregion
79
+ export { TwitchOptions, TwitchProfile, twitch };
@@ -0,0 +1,75 @@
1
+ import { logger } from "../env/logger.mjs";
2
+ import { createAuthorizationURL } from "../oauth2/create-authorization-url.mjs";
3
+ import { refreshAccessToken } from "../oauth2/refresh-access-token.mjs";
4
+ import { validateAuthorizationCode } from "../oauth2/validate-authorization-code.mjs";
5
+ import { decodeJwt } from "jose";
6
+ //#region src/social-providers/twitch.ts
7
+ const twitch = (options) => {
8
+ const tokenEndpoint = "https://id.twitch.tv/oauth2/token";
9
+ return {
10
+ id: "twitch",
11
+ name: "Twitch",
12
+ createAuthorizationURL({ state, scopes, redirectURI }) {
13
+ const _scopes = options.disableDefaultScope ? [] : ["user:read:email", "openid"];
14
+ if (options.scope) _scopes.push(...options.scope);
15
+ if (scopes) _scopes.push(...scopes);
16
+ return createAuthorizationURL({
17
+ id: "twitch",
18
+ redirectURI,
19
+ options,
20
+ authorizationEndpoint: "https://id.twitch.tv/oauth2/authorize",
21
+ scopes: _scopes,
22
+ state,
23
+ claims: options.claims || [
24
+ "email",
25
+ "email_verified",
26
+ "preferred_username",
27
+ "picture"
28
+ ]
29
+ });
30
+ },
31
+ validateAuthorizationCode: async ({ code, redirectURI }) => {
32
+ return validateAuthorizationCode({
33
+ code,
34
+ redirectURI,
35
+ options,
36
+ tokenEndpoint
37
+ });
38
+ },
39
+ refreshAccessToken: options.refreshAccessToken ? options.refreshAccessToken : async (refreshToken) => {
40
+ return refreshAccessToken({
41
+ refreshToken,
42
+ options: {
43
+ clientId: options.clientId,
44
+ clientKey: options.clientKey,
45
+ clientSecret: options.clientSecret
46
+ },
47
+ tokenEndpoint
48
+ });
49
+ },
50
+ async getUserInfo(token) {
51
+ if (options.getUserInfo) return options.getUserInfo(token);
52
+ const idToken = token.idToken;
53
+ if (!idToken) {
54
+ logger.error("No idToken found in token");
55
+ return null;
56
+ }
57
+ const profile = decodeJwt(idToken);
58
+ const userMap = await options.mapProfileToUser?.(profile);
59
+ return {
60
+ user: {
61
+ id: profile.sub,
62
+ name: profile.preferred_username,
63
+ email: profile.email,
64
+ image: profile.picture,
65
+ emailVerified: profile.email_verified,
66
+ ...userMap
67
+ },
68
+ data: profile
69
+ };
70
+ },
71
+ options
72
+ };
73
+ };
74
+ //#endregion
75
+ export { twitch };
@@ -0,0 +1,126 @@
1
+ import { OAuth2Tokens, ProviderOptions } from "../oauth2/oauth-provider.mjs";
2
+ //#region src/social-providers/twitter.d.ts
3
+ interface TwitterProfile {
4
+ data: {
5
+ /**
6
+ * Unique identifier of this user. This is returned as a string in order to avoid complications with languages and tools
7
+ * that cannot handle large integers.
8
+ */
9
+ id: string; /** The friendly name of this user, as shown on their profile. */
10
+ name: string; /** The email address of this user. */
11
+ email?: string | undefined; /** The Twitter handle (screen name) of this user. */
12
+ username: string;
13
+ /**
14
+ * The location specified in the user's profile, if the user provided one.
15
+ * As this is a freeform value, it may not indicate a valid location, but it may be fuzzily evaluated when performing searches with location queries.
16
+ *
17
+ * To return this field, add `user.fields=location` in the authorization request's query parameter.
18
+ */
19
+ location?: string | undefined;
20
+ /**
21
+ * This object and its children fields contain details about text that has a special meaning in the user's description.
22
+ *
23
+ *To return this field, add `user.fields=entities` in the authorization request's query parameter.
24
+ */
25
+ entities?: {
26
+ /** Contains details about the user's profile website. */url: {
27
+ /** Contains details about the user's profile website. */urls: Array<{
28
+ /** The start position (zero-based) of the recognized user's profile website. All start indices are inclusive. */start: number; /** The end position (zero-based) of the recognized user's profile website. This end index is exclusive. */
29
+ end: number; /** The URL in the format entered by the user. */
30
+ url: string; /** The fully resolved URL. */
31
+ expanded_url: string; /** The URL as displayed in the user's profile. */
32
+ display_url: string;
33
+ }>;
34
+ }; /** Contains details about URLs, Hashtags, Cashtags, or mentions located within a user's description. */
35
+ description: {
36
+ hashtags: Array<{
37
+ start: number;
38
+ end: number;
39
+ tag: string;
40
+ }>;
41
+ };
42
+ } | undefined;
43
+ /**
44
+ * Indicate if this user is a verified Twitter user.
45
+ *
46
+ * To return this field, add `user.fields=verified` in the authorization request's query parameter.
47
+ */
48
+ verified?: boolean | undefined;
49
+ /**
50
+ * The text of this user's profile description (also known as bio), if the user provided one.
51
+ *
52
+ * To return this field, add `user.fields=description` in the authorization request's query parameter.
53
+ */
54
+ description?: string | undefined;
55
+ /**
56
+ * The URL specified in the user's profile, if present.
57
+ *
58
+ * To return this field, add `user.fields=url` in the authorization request's query parameter.
59
+ */
60
+ url?: string | undefined; /** The URL to the profile image for this user, as shown on the user's profile. */
61
+ profile_image_url?: string | undefined;
62
+ protected?: boolean | undefined;
63
+ /**
64
+ * Unique identifier of this user's pinned Tweet.
65
+ *
66
+ * You can obtain the expanded object in `includes.tweets` by adding `expansions=pinned_tweet_id` in the authorization request's query parameter.
67
+ */
68
+ pinned_tweet_id?: string | undefined;
69
+ created_at?: string | undefined;
70
+ };
71
+ includes?: {
72
+ tweets?: Array<{
73
+ id: string;
74
+ text: string;
75
+ }>;
76
+ } | undefined;
77
+ [claims: string]: unknown;
78
+ }
79
+ interface TwitterOption extends ProviderOptions<TwitterProfile> {
80
+ clientId: string;
81
+ }
82
+ declare const twitter: (options: TwitterOption) => {
83
+ id: "twitter";
84
+ name: string;
85
+ createAuthorizationURL(data: {
86
+ state: string;
87
+ codeVerifier: string;
88
+ scopes?: string[] | undefined;
89
+ redirectURI: string;
90
+ display?: string | undefined;
91
+ loginHint?: string | undefined;
92
+ }): Promise<URL>;
93
+ validateAuthorizationCode: ({
94
+ code,
95
+ codeVerifier,
96
+ redirectURI
97
+ }: {
98
+ code: string;
99
+ redirectURI: string;
100
+ codeVerifier?: string | undefined;
101
+ deviceId?: string | undefined;
102
+ }) => Promise<OAuth2Tokens>;
103
+ refreshAccessToken: (refreshToken: string) => Promise<OAuth2Tokens>;
104
+ getUserInfo(token: OAuth2Tokens & {
105
+ user?: {
106
+ name? /** The start position (zero-based) of the recognized user's profile website. All start indices are inclusive. */: {
107
+ firstName?: string;
108
+ lastName?: string;
109
+ };
110
+ email?: string;
111
+ } | undefined;
112
+ }): Promise<{
113
+ user: {
114
+ id: string;
115
+ name?: string;
116
+ email?: string | null;
117
+ image?: string;
118
+ emailVerified: boolean;
119
+ [key: string]: any;
120
+ };
121
+ data: any;
122
+ } | null>;
123
+ options: TwitterOption;
124
+ };
125
+ //#endregion
126
+ export { TwitterOption, TwitterProfile, twitter };
@@ -0,0 +1,85 @@
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/twitter.ts
6
+ const twitter = (options) => {
7
+ const tokenEndpoint = "https://api.x.com/2/oauth2/token";
8
+ return {
9
+ id: "twitter",
10
+ name: "Twitter",
11
+ createAuthorizationURL(data) {
12
+ const _scopes = options.disableDefaultScope ? [] : [
13
+ "users.read",
14
+ "tweet.read",
15
+ "offline.access",
16
+ "users.email"
17
+ ];
18
+ if (options.scope) _scopes.push(...options.scope);
19
+ if (data.scopes) _scopes.push(...data.scopes);
20
+ return createAuthorizationURL({
21
+ id: "twitter",
22
+ options,
23
+ authorizationEndpoint: "https://x.com/i/oauth2/authorize",
24
+ scopes: _scopes,
25
+ state: data.state,
26
+ codeVerifier: data.codeVerifier,
27
+ redirectURI: data.redirectURI
28
+ });
29
+ },
30
+ validateAuthorizationCode: async ({ code, codeVerifier, redirectURI }) => {
31
+ return validateAuthorizationCode({
32
+ code,
33
+ codeVerifier,
34
+ authentication: "basic",
35
+ redirectURI,
36
+ options,
37
+ tokenEndpoint
38
+ });
39
+ },
40
+ refreshAccessToken: options.refreshAccessToken ? options.refreshAccessToken : async (refreshToken) => {
41
+ return refreshAccessToken({
42
+ refreshToken,
43
+ options: {
44
+ clientId: options.clientId,
45
+ clientKey: options.clientKey,
46
+ clientSecret: options.clientSecret
47
+ },
48
+ authentication: "basic",
49
+ tokenEndpoint
50
+ });
51
+ },
52
+ async getUserInfo(token) {
53
+ if (options.getUserInfo) return options.getUserInfo(token);
54
+ const { data: profile, error: profileError } = await betterFetch("https://api.x.com/2/users/me?user.fields=profile_image_url", {
55
+ method: "GET",
56
+ headers: { Authorization: `Bearer ${token.accessToken}` }
57
+ });
58
+ if (profileError) return null;
59
+ const { data: emailData, error: emailError } = await betterFetch("https://api.x.com/2/users/me?user.fields=confirmed_email", {
60
+ method: "GET",
61
+ headers: { Authorization: `Bearer ${token.accessToken}` }
62
+ });
63
+ let emailVerified = false;
64
+ if (!emailError && emailData?.data?.confirmed_email) {
65
+ profile.data.email = emailData.data.confirmed_email;
66
+ emailVerified = true;
67
+ }
68
+ const userMap = await options.mapProfileToUser?.(profile);
69
+ return {
70
+ user: {
71
+ id: profile.data.id,
72
+ name: profile.data.name,
73
+ email: profile.data.email || profile.data.username || null,
74
+ image: profile.data.profile_image_url,
75
+ emailVerified,
76
+ ...userMap
77
+ },
78
+ data: profile
79
+ };
80
+ },
81
+ options
82
+ };
83
+ };
84
+ //#endregion
85
+ export { twitter };
@@ -0,0 +1,62 @@
1
+ import { OAuth2Tokens, ProviderOptions } from "../oauth2/oauth-provider.mjs";
2
+ //#region src/social-providers/vercel.d.ts
3
+ interface VercelProfile {
4
+ sub: string;
5
+ name?: string;
6
+ preferred_username?: string;
7
+ email?: string;
8
+ email_verified?: boolean;
9
+ picture?: string;
10
+ }
11
+ interface VercelOptions extends ProviderOptions<VercelProfile> {
12
+ clientId: string;
13
+ }
14
+ declare const vercel: (options: VercelOptions) => {
15
+ id: "vercel";
16
+ name: string;
17
+ createAuthorizationURL({
18
+ state,
19
+ scopes,
20
+ codeVerifier,
21
+ redirectURI
22
+ }: {
23
+ state: string;
24
+ codeVerifier: string;
25
+ scopes?: string[] | undefined;
26
+ redirectURI: string;
27
+ display?: string | undefined;
28
+ loginHint?: string | undefined;
29
+ }): Promise<URL>;
30
+ validateAuthorizationCode: ({
31
+ code,
32
+ codeVerifier,
33
+ redirectURI
34
+ }: {
35
+ code: string;
36
+ redirectURI: string;
37
+ codeVerifier?: string | undefined;
38
+ deviceId?: string | undefined;
39
+ }) => Promise<OAuth2Tokens>;
40
+ getUserInfo(token: OAuth2Tokens & {
41
+ user?: {
42
+ name?: {
43
+ firstName?: string;
44
+ lastName?: string;
45
+ };
46
+ email?: string;
47
+ } | undefined;
48
+ }): Promise<{
49
+ user: {
50
+ id: string;
51
+ name?: string;
52
+ email?: string | null;
53
+ image?: string;
54
+ emailVerified: boolean;
55
+ [key: string]: any;
56
+ };
57
+ data: any;
58
+ } | null>;
59
+ options: VercelOptions;
60
+ };
61
+ //#endregion
62
+ export { VercelOptions, VercelProfile, vercel };
@@ -0,0 +1,58 @@
1
+ import { BetterAuthError } from "../error/index.mjs";
2
+ import { createAuthorizationURL } from "../oauth2/create-authorization-url.mjs";
3
+ import { validateAuthorizationCode } from "../oauth2/validate-authorization-code.mjs";
4
+ import { betterFetch } from "@better-fetch/fetch";
5
+ //#region src/social-providers/vercel.ts
6
+ const vercel = (options) => {
7
+ return {
8
+ id: "vercel",
9
+ name: "Vercel",
10
+ createAuthorizationURL({ state, scopes, codeVerifier, redirectURI }) {
11
+ if (!codeVerifier) throw new BetterAuthError("codeVerifier is required for Vercel");
12
+ let _scopes = void 0;
13
+ if (options.scope !== void 0 || scopes !== void 0) {
14
+ _scopes = [];
15
+ if (options.scope) _scopes.push(...options.scope);
16
+ if (scopes) _scopes.push(...scopes);
17
+ }
18
+ return createAuthorizationURL({
19
+ id: "vercel",
20
+ options,
21
+ authorizationEndpoint: "https://vercel.com/oauth/authorize",
22
+ scopes: _scopes,
23
+ state,
24
+ codeVerifier,
25
+ redirectURI
26
+ });
27
+ },
28
+ validateAuthorizationCode: async ({ code, codeVerifier, redirectURI }) => {
29
+ return validateAuthorizationCode({
30
+ code,
31
+ codeVerifier,
32
+ redirectURI,
33
+ options,
34
+ tokenEndpoint: "https://api.vercel.com/login/oauth/token"
35
+ });
36
+ },
37
+ async getUserInfo(token) {
38
+ if (options.getUserInfo) return options.getUserInfo(token);
39
+ const { data: profile, error } = await betterFetch("https://api.vercel.com/login/oauth/userinfo", { headers: { Authorization: `Bearer ${token.accessToken}` } });
40
+ if (error || !profile) return null;
41
+ const userMap = await options.mapProfileToUser?.(profile);
42
+ return {
43
+ user: {
44
+ id: profile.sub,
45
+ name: profile.name ?? profile.preferred_username ?? "",
46
+ email: profile.email,
47
+ image: profile.picture,
48
+ emailVerified: profile.email_verified ?? false,
49
+ ...userMap
50
+ },
51
+ data: profile
52
+ };
53
+ },
54
+ options
55
+ };
56
+ };
57
+ //#endregion
58
+ export { vercel };
@@ -0,0 +1,70 @@
1
+ import { OAuth2Tokens, ProviderOptions } from "../oauth2/oauth-provider.mjs";
2
+ //#region src/social-providers/vk.d.ts
3
+ interface VkProfile {
4
+ user: {
5
+ user_id: string;
6
+ first_name: string;
7
+ last_name: string;
8
+ email?: string | undefined;
9
+ phone?: number | undefined;
10
+ avatar?: string | undefined;
11
+ sex?: number | undefined;
12
+ verified?: boolean | undefined;
13
+ birthday: string;
14
+ };
15
+ }
16
+ interface VkOption extends ProviderOptions {
17
+ clientId: string;
18
+ scheme?: ("light" | "dark") | undefined;
19
+ }
20
+ declare const vk: (options: VkOption) => {
21
+ id: "vk";
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
+ deviceId
41
+ }: {
42
+ code: string;
43
+ redirectURI: string;
44
+ codeVerifier?: string | undefined;
45
+ deviceId?: string | undefined;
46
+ }) => Promise<OAuth2Tokens>;
47
+ refreshAccessToken: (refreshToken: string) => Promise<OAuth2Tokens>;
48
+ getUserInfo(data: OAuth2Tokens & {
49
+ user?: {
50
+ name?: {
51
+ firstName?: string;
52
+ lastName?: string;
53
+ };
54
+ email?: string;
55
+ } | undefined;
56
+ }): Promise<{
57
+ user: {
58
+ id: string;
59
+ name?: string;
60
+ email?: string | null;
61
+ image?: string;
62
+ emailVerified: boolean;
63
+ [key: string]: any;
64
+ };
65
+ data: any;
66
+ } | null>;
67
+ options: VkOption;
68
+ };
69
+ //#endregion
70
+ export { VkOption, VkProfile, vk };
@@ -0,0 +1,81 @@
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/vk.ts
6
+ const vk = (options) => {
7
+ const tokenEndpoint = "https://id.vk.com/oauth2/auth";
8
+ return {
9
+ id: "vk",
10
+ name: "VK",
11
+ async createAuthorizationURL({ state, scopes, codeVerifier, redirectURI }) {
12
+ const _scopes = options.disableDefaultScope ? [] : ["email", "phone"];
13
+ if (options.scope) _scopes.push(...options.scope);
14
+ if (scopes) _scopes.push(...scopes);
15
+ return createAuthorizationURL({
16
+ id: "vk",
17
+ options,
18
+ authorizationEndpoint: "https://id.vk.com/authorize",
19
+ scopes: _scopes,
20
+ state,
21
+ redirectURI,
22
+ codeVerifier
23
+ });
24
+ },
25
+ validateAuthorizationCode: async ({ code, codeVerifier, redirectURI, deviceId }) => {
26
+ return validateAuthorizationCode({
27
+ code,
28
+ codeVerifier,
29
+ redirectURI: options.redirectURI || redirectURI,
30
+ options,
31
+ deviceId,
32
+ tokenEndpoint
33
+ });
34
+ },
35
+ refreshAccessToken: options.refreshAccessToken ? options.refreshAccessToken : async (refreshToken) => {
36
+ return refreshAccessToken({
37
+ refreshToken,
38
+ options: {
39
+ clientId: options.clientId,
40
+ clientKey: options.clientKey,
41
+ clientSecret: options.clientSecret
42
+ },
43
+ tokenEndpoint
44
+ });
45
+ },
46
+ async getUserInfo(data) {
47
+ if (options.getUserInfo) return options.getUserInfo(data);
48
+ if (!data.accessToken) return null;
49
+ const formBody = new URLSearchParams({
50
+ access_token: data.accessToken,
51
+ client_id: options.clientId
52
+ }).toString();
53
+ const { data: profile, error } = await betterFetch("https://id.vk.com/oauth2/user_info", {
54
+ method: "POST",
55
+ headers: { "Content-Type": "application/x-www-form-urlencoded" },
56
+ body: formBody
57
+ });
58
+ if (error) return null;
59
+ const userMap = await options.mapProfileToUser?.(profile);
60
+ if (!profile.user.email && !userMap?.email) return null;
61
+ return {
62
+ user: {
63
+ id: profile.user.user_id,
64
+ first_name: profile.user.first_name,
65
+ last_name: profile.user.last_name,
66
+ email: profile.user.email,
67
+ image: profile.user.avatar,
68
+ emailVerified: false,
69
+ birthday: profile.user.birthday,
70
+ sex: profile.user.sex,
71
+ name: `${profile.user.first_name} ${profile.user.last_name}`,
72
+ ...userMap
73
+ },
74
+ data: profile
75
+ };
76
+ },
77
+ options
78
+ };
79
+ };
80
+ //#endregion
81
+ export { vk };