@better-auth/core 1.7.0-rc.1 → 1.7.0-rc.3

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 (213) hide show
  1. package/dist/api/index.d.mts +28 -28
  2. package/dist/async_hooks/index.d.mts +0 -1
  3. package/dist/async_hooks/pure.index.d.mts +0 -1
  4. package/dist/context/endpoint-context.d.mts +1 -1
  5. package/dist/context/global.d.mts +0 -1
  6. package/dist/context/global.mjs +1 -1
  7. package/dist/context/request-state.d.mts +0 -1
  8. package/dist/context/request-state.mjs +8 -5
  9. package/dist/context/transaction.d.mts +8 -3
  10. package/dist/context/transaction.mjs +27 -10
  11. package/dist/db/adapter/factory.d.mts +3 -5
  12. package/dist/db/adapter/factory.mjs +7 -5
  13. package/dist/db/adapter/get-default-field-name.d.mts +2 -9
  14. package/dist/db/adapter/get-default-model-name.d.mts +1 -5
  15. package/dist/db/adapter/get-default-model-name.mjs +6 -5
  16. package/dist/db/adapter/get-field-attributes.d.mts +4 -11
  17. package/dist/db/adapter/get-field-name.d.mts +2 -9
  18. package/dist/db/adapter/get-id-field.d.mts +4 -12
  19. package/dist/db/adapter/get-model-name.d.mts +1 -5
  20. package/dist/db/adapter/index.d.mts +7 -32
  21. package/dist/db/adapter/types.d.mts +5 -17
  22. package/dist/db/adapter/utils.d.mts +0 -1
  23. package/dist/db/database-index.d.mts +44 -0
  24. package/dist/db/database-index.mjs +168 -0
  25. package/dist/db/get-tables.d.mts +7 -1
  26. package/dist/db/get-tables.mjs +47 -6
  27. package/dist/db/index.d.mts +3 -3
  28. package/dist/db/index.mjs +2 -2
  29. package/dist/db/internal.d.mts +3 -0
  30. package/dist/db/internal.mjs +3 -0
  31. package/dist/db/plugin.d.mts +4 -3
  32. package/dist/db/schema/account.d.mts +16 -3
  33. package/dist/db/schema/account.mjs +35 -2
  34. package/dist/db/schema/rate-limit.d.mts +1 -1
  35. package/dist/db/schema/rate-limit.mjs +9 -0
  36. package/dist/db/schema/session.d.mts +1 -1
  37. package/dist/db/schema/shared.d.mts +0 -1
  38. package/dist/db/schema/user.d.mts +1 -1
  39. package/dist/db/schema/verification.d.mts +1 -1
  40. package/dist/db/type.d.mts +17 -9
  41. package/dist/env/logger.d.mts +25 -25
  42. package/dist/error/codes.d.mts +0 -1
  43. package/dist/error/index.d.mts +0 -1
  44. package/dist/index.d.mts +1 -1
  45. package/dist/instrumentation/attributes.d.mts +0 -1
  46. package/dist/instrumentation/pure.index.d.mts +0 -1
  47. package/dist/instrumentation/tracer.mjs +1 -1
  48. package/dist/oauth2/authorization-params.d.mts +0 -1
  49. package/dist/oauth2/client-assertion.d.mts +3 -13
  50. package/dist/oauth2/client-credentials-token.d.mts +3 -17
  51. package/dist/oauth2/client-credentials-token.mjs +1 -4
  52. package/dist/oauth2/create-authorization-url.d.mts +3 -21
  53. package/dist/oauth2/dpop.d.mts +2 -23
  54. package/dist/oauth2/dpop.mjs +1 -1
  55. package/dist/oauth2/index.d.mts +3 -3
  56. package/dist/oauth2/index.mjs +2 -2
  57. package/dist/oauth2/oauth-provider.d.mts +94 -36
  58. package/dist/oauth2/refresh-access-token.d.mts +3 -19
  59. package/dist/oauth2/refresh-access-token.mjs +3 -9
  60. package/dist/oauth2/reject-redirects.mjs +1 -1
  61. package/dist/oauth2/token-endpoint-auth.d.mts +0 -1
  62. package/dist/oauth2/utils.d.mts +0 -1
  63. package/dist/oauth2/utils.mjs +2 -3
  64. package/dist/oauth2/validate-authorization-code.d.mts +5 -29
  65. package/dist/oauth2/verify-id-token.d.mts +3 -2
  66. package/dist/oauth2/verify-id-token.mjs +3 -3
  67. package/dist/oauth2/verify.d.mts +18 -9
  68. package/dist/oauth2/verify.mjs +68 -5
  69. package/dist/social-providers/apple.d.mts +9 -24
  70. package/dist/social-providers/apple.mjs +2 -1
  71. package/dist/social-providers/atlassian.d.mts +18 -19
  72. package/dist/social-providers/atlassian.mjs +1 -1
  73. package/dist/social-providers/cognito.d.mts +33 -22
  74. package/dist/social-providers/cognito.mjs +2 -2
  75. package/dist/social-providers/discord.d.mts +7 -20
  76. package/dist/social-providers/discord.mjs +1 -1
  77. package/dist/social-providers/dropbox.d.mts +7 -22
  78. package/dist/social-providers/dropbox.mjs +1 -1
  79. package/dist/social-providers/facebook.d.mts +19 -27
  80. package/dist/social-providers/facebook.mjs +6 -17
  81. package/dist/social-providers/figma.d.mts +7 -22
  82. package/dist/social-providers/figma.mjs +1 -1
  83. package/dist/social-providers/github.d.mts +7 -23
  84. package/dist/social-providers/github.mjs +1 -1
  85. package/dist/social-providers/gitlab.d.mts +6 -43
  86. package/dist/social-providers/gitlab.mjs +1 -1
  87. package/dist/social-providers/google.d.mts +10 -32
  88. package/dist/social-providers/google.mjs +2 -1
  89. package/dist/social-providers/huggingface.d.mts +7 -22
  90. package/dist/social-providers/huggingface.mjs +1 -1
  91. package/dist/social-providers/index.d.mts +229 -787
  92. package/dist/social-providers/kakao.d.mts +8 -33
  93. package/dist/social-providers/kakao.mjs +1 -1
  94. package/dist/social-providers/kick.d.mts +7 -22
  95. package/dist/social-providers/kick.mjs +1 -1
  96. package/dist/social-providers/line.d.mts +8 -44
  97. package/dist/social-providers/line.mjs +4 -6
  98. package/dist/social-providers/linear.d.mts +7 -21
  99. package/dist/social-providers/linear.mjs +1 -1
  100. package/dist/social-providers/linkedin.d.mts +7 -21
  101. package/dist/social-providers/linkedin.mjs +1 -1
  102. package/dist/social-providers/microsoft-entra-id.d.mts +8 -18
  103. package/dist/social-providers/microsoft-entra-id.mjs +24 -4
  104. package/dist/social-providers/naver.d.mts +27 -42
  105. package/dist/social-providers/naver.mjs +1 -1
  106. package/dist/social-providers/notion.d.mts +7 -21
  107. package/dist/social-providers/notion.mjs +1 -1
  108. package/dist/social-providers/paybin.d.mts +8 -23
  109. package/dist/social-providers/paybin.mjs +2 -1
  110. package/dist/social-providers/paypal.d.mts +8 -33
  111. package/dist/social-providers/paypal.mjs +1 -1
  112. package/dist/social-providers/polar.d.mts +7 -22
  113. package/dist/social-providers/polar.mjs +1 -1
  114. package/dist/social-providers/railway.d.mts +7 -22
  115. package/dist/social-providers/railway.mjs +1 -1
  116. package/dist/social-providers/reddit.d.mts +7 -20
  117. package/dist/social-providers/reddit.mjs +1 -1
  118. package/dist/social-providers/roblox.d.mts +7 -20
  119. package/dist/social-providers/roblox.mjs +1 -1
  120. package/dist/social-providers/salesforce.d.mts +7 -22
  121. package/dist/social-providers/salesforce.mjs +1 -1
  122. package/dist/social-providers/slack.d.mts +7 -20
  123. package/dist/social-providers/slack.mjs +1 -1
  124. package/dist/social-providers/spotify.d.mts +7 -22
  125. package/dist/social-providers/spotify.mjs +1 -1
  126. package/dist/social-providers/tiktok.d.mts +10 -22
  127. package/dist/social-providers/tiktok.mjs +1 -1
  128. package/dist/social-providers/twitch.d.mts +7 -20
  129. package/dist/social-providers/twitch.mjs +1 -1
  130. package/dist/social-providers/twitter.d.mts +29 -26
  131. package/dist/social-providers/twitter.mjs +1 -1
  132. package/dist/social-providers/vercel.d.mts +7 -22
  133. package/dist/social-providers/vercel.mjs +1 -1
  134. package/dist/social-providers/vk.d.mts +8 -24
  135. package/dist/social-providers/vk.mjs +5 -6
  136. package/dist/social-providers/wechat.d.mts +7 -19
  137. package/dist/social-providers/wechat.mjs +1 -1
  138. package/dist/social-providers/zoom.d.mts +9 -25
  139. package/dist/social-providers/zoom.mjs +1 -1
  140. package/dist/types/context.d.mts +16 -9
  141. package/dist/types/cookie.d.mts +0 -1
  142. package/dist/types/helper.d.mts +1 -1
  143. package/dist/types/index.d.mts +1 -1
  144. package/dist/types/init-options.d.mts +37 -26
  145. package/dist/types/plugin-client.d.mts +1 -3
  146. package/dist/types/plugin.d.mts +2 -2
  147. package/dist/utils/async.d.mts +0 -1
  148. package/dist/utils/db.d.mts +1 -0
  149. package/dist/utils/deprecate.d.mts +0 -1
  150. package/dist/utils/error-codes.d.mts +2 -2
  151. package/dist/utils/host.d.mts +27 -1
  152. package/dist/utils/host.mjs +1 -1
  153. package/dist/utils/ip.d.mts +1 -0
  154. package/dist/utils/ip.mjs +1 -1
  155. package/dist/utils/is-api-error.d.mts +0 -1
  156. package/dist/utils/redirect-uri.d.mts +6 -2
  157. package/dist/utils/redirect-uri.mjs +11 -1
  158. package/package.json +10 -2
  159. package/src/context/request-state.ts +26 -6
  160. package/src/context/transaction.ts +37 -18
  161. package/src/db/adapter/factory.ts +34 -28
  162. package/src/db/adapter/get-default-model-name.ts +23 -14
  163. package/src/db/database-index.ts +351 -0
  164. package/src/db/get-tables.ts +89 -9
  165. package/src/db/index.ts +4 -0
  166. package/src/db/internal.ts +12 -0
  167. package/src/db/plugin.ts +3 -1
  168. package/src/db/schema/account.ts +27 -1
  169. package/src/db/schema/user.ts +1 -1
  170. package/src/db/type.ts +12 -0
  171. package/src/error/codes.ts +1 -0
  172. package/src/oauth2/index.ts +5 -0
  173. package/src/oauth2/oauth-provider.ts +105 -36
  174. package/src/oauth2/verify-id-token.ts +4 -2
  175. package/src/oauth2/verify.ts +121 -12
  176. package/src/social-providers/apple.ts +2 -1
  177. package/src/social-providers/atlassian.ts +1 -1
  178. package/src/social-providers/cognito.ts +2 -2
  179. package/src/social-providers/discord.ts +1 -1
  180. package/src/social-providers/dropbox.ts +1 -1
  181. package/src/social-providers/facebook.ts +21 -28
  182. package/src/social-providers/figma.ts +1 -1
  183. package/src/social-providers/github.ts +1 -1
  184. package/src/social-providers/gitlab.ts +1 -1
  185. package/src/social-providers/google.ts +2 -1
  186. package/src/social-providers/huggingface.ts +1 -1
  187. package/src/social-providers/kakao.ts +1 -1
  188. package/src/social-providers/kick.ts +1 -1
  189. package/src/social-providers/line.ts +7 -12
  190. package/src/social-providers/linear.ts +1 -1
  191. package/src/social-providers/linkedin.ts +1 -1
  192. package/src/social-providers/microsoft-entra-id.ts +36 -27
  193. package/src/social-providers/naver.ts +1 -1
  194. package/src/social-providers/notion.ts +1 -1
  195. package/src/social-providers/paybin.ts +2 -1
  196. package/src/social-providers/paypal.ts +1 -1
  197. package/src/social-providers/polar.ts +1 -1
  198. package/src/social-providers/railway.ts +1 -1
  199. package/src/social-providers/reddit.ts +1 -1
  200. package/src/social-providers/roblox.ts +1 -1
  201. package/src/social-providers/salesforce.ts +1 -1
  202. package/src/social-providers/slack.ts +1 -1
  203. package/src/social-providers/spotify.ts +1 -1
  204. package/src/social-providers/tiktok.ts +2 -2
  205. package/src/social-providers/twitch.ts +1 -1
  206. package/src/social-providers/twitter.ts +1 -1
  207. package/src/social-providers/vercel.ts +1 -1
  208. package/src/social-providers/vk.ts +2 -2
  209. package/src/social-providers/wechat.ts +1 -1
  210. package/src/social-providers/zoom.ts +1 -1
  211. package/src/types/context.ts +21 -14
  212. package/src/types/init-options.ts +15 -14
  213. package/src/utils/redirect-uri.ts +20 -0
@@ -59,6 +59,7 @@ export const wechat = (options: WeChatOptions) => {
59
59
  return {
60
60
  id: "wechat",
61
61
  name: "WeChat",
62
+ accountSubject: ({ profile }) => profile.unionid || profile.openid,
62
63
  createAuthorizationURL({ state, scopes, redirectURI, additionalParams }) {
63
64
  const _scopes = options.disableDefaultScope ? [] : ["snsapi_login"];
64
65
  options.scope && _scopes.push(...options.scope);
@@ -206,7 +207,6 @@ export const wechat = (options: WeChatOptions) => {
206
207
  const userMap = await options.mapProfileToUser?.(profile);
207
208
  return {
208
209
  user: {
209
- id: profile.unionid || profile.openid || openid,
210
210
  name: profile.nickname,
211
211
  // WeChat does not return an email, and the OAuth callback rejects a
212
212
  // missing one, so the default sign-in would always fail. Synthesize a
@@ -152,6 +152,7 @@ export const zoom = (userOptions: ZoomOptions) => {
152
152
  return {
153
153
  id: "zoom",
154
154
  name: "Zoom",
155
+ accountSubject: ({ profile }) => profile.id,
155
156
  createAuthorizationURL: async ({
156
157
  state,
157
158
  redirectURI,
@@ -210,7 +211,6 @@ export const zoom = (userOptions: ZoomOptions) => {
210
211
 
211
212
  return {
212
213
  user: {
213
- id: profile.id,
214
214
  name: profile.display_name,
215
215
  image: profile.pic_url,
216
216
  email: profile.email,
@@ -9,6 +9,7 @@ import type {
9
9
  Verification,
10
10
  } from "../db";
11
11
  import type { DBAdapter, Where } from "../db/adapter";
12
+ import type { AccountKey } from "../db/schema/account";
12
13
  import type { createLogger } from "../env";
13
14
  import type { OAuthProvider } from "../oauth2";
14
15
  import type { BetterAuthCookie, BetterAuthCookies } from "./cookie";
@@ -132,6 +133,9 @@ export interface InternalAdapter<
132
133
  dontRememberMe?: boolean | undefined,
133
134
  override?: (Partial<Session> & Record<string, any>) | undefined,
134
135
  overrideAll?: boolean | undefined,
136
+ storageOptions?:
137
+ | { deferSecondaryStorageWrites?: boolean | undefined }
138
+ | undefined,
135
139
  ): Promise<Session>;
136
140
 
137
141
  findSession(token: string): Promise<{
@@ -160,7 +164,7 @@ export interface InternalAdapter<
160
164
  /**
161
165
  * Delete an account by its primary key.
162
166
  *
163
- * @param id - The account row's primary key (the `id` column, not the `accountId` column).
167
+ * @param id - The account row's primary key, not its provider account ID.
164
168
  */
165
169
  deleteAccount(id: string): Promise<void>;
166
170
 
@@ -174,15 +178,18 @@ export interface InternalAdapter<
174
178
  */
175
179
  deleteSessions(sessionTokens: string[]): Promise<void>;
176
180
 
177
- findOAuthUser(
178
- email: string,
179
- accountId: string,
180
- providerId: string,
181
- ): Promise<{
182
- user: User;
183
- linkedAccount: Account | null;
184
- accounts: Account[];
185
- } | null>;
181
+ findAccountOwnerByKey(accountKey: AccountKey): Promise<
182
+ | {
183
+ kind: "owned";
184
+ user: User;
185
+ account: Account;
186
+ }
187
+ | {
188
+ kind: "orphaned";
189
+ account: Account;
190
+ }
191
+ | null
192
+ >;
186
193
 
187
194
  findUserByEmail(
188
195
  email: string,
@@ -210,10 +217,10 @@ export interface InternalAdapter<
210
217
 
211
218
  findAccounts(userId: string): Promise<Account[]>;
212
219
 
213
- findAccountByProviderId(
214
- accountId: string,
215
- providerId: string,
216
- ): Promise<Account | null>;
220
+ /** Find the credential account whose stable local subject is the user ID. */
221
+ findCredentialAccount(userId: string): Promise<Account | null>;
222
+
223
+ findAccountByKey(accountKey: AccountKey): Promise<Account | null>;
217
224
 
218
225
  findAccountByUserId(userId: string): Promise<Account[]>;
219
226
 
@@ -454,6 +454,21 @@ export type BetterAuthAdvancedOptions = {
454
454
  * function.
455
455
  */
456
456
  generateId?: GenerateIdFn | false | "serial" | "uuid";
457
+ /**
458
+ * Enable database joins for adapters that support them.
459
+ *
460
+ * When disabled (default), related data is fetched via
461
+ * separate queries. When enabled, adapters that support
462
+ * native joins use them; otherwise Better Auth falls back
463
+ * to separate queries.
464
+ *
465
+ * Please read the adapter documentation for more
466
+ * information regarding joins before enabling this.
467
+ * Not all adapters support joins.
468
+ *
469
+ * @default false
470
+ */
471
+ joins?: boolean;
457
472
  }
458
473
  | undefined;
459
474
  /**
@@ -1783,18 +1798,4 @@ export type BetterAuthOptions = {
1783
1798
  debug?: boolean;
1784
1799
  }
1785
1800
  | undefined;
1786
- /**
1787
- * Experimental features
1788
- */
1789
- experimental?: {
1790
- /**
1791
- * Enable experimental joins for your database adapter.
1792
- *
1793
- * Please read the adapter documentation for more information regarding joins before enabling this.
1794
- * Not all adapters support joins.
1795
- *
1796
- * @default false
1797
- */
1798
- joins?: boolean;
1799
- };
1800
1801
  };
@@ -2,6 +2,26 @@ import * as z from "zod";
2
2
  import { isLoopbackHost } from "./host";
3
3
  import { DANGEROUS_URL_SCHEMES } from "./url";
4
4
 
5
+ const REVERSE_DOMAIN_PRIVATE_USE_SCHEME =
6
+ /^[a-z](?:[a-z0-9-]*[a-z0-9])?(?:\.[a-z0-9](?:[a-z0-9-]*[a-z0-9])?)+$/i;
7
+
8
+ /**
9
+ * Returns whether a parsed redirect URI uses an authority-free, reverse-domain
10
+ * private-use scheme as recommended by RFC 8252 §7.1.
11
+ */
12
+ export function isReverseDomainPrivateUseRedirectUri(uri: URL): boolean {
13
+ const scheme = uri.protocol.slice(0, -1);
14
+ const schemeSpecificPart = uri.href.slice(uri.protocol.length);
15
+ return (
16
+ uri.protocol !== "http:" &&
17
+ uri.protocol !== "https:" &&
18
+ uri.host.length === 0 &&
19
+ schemeSpecificPart.startsWith("/") &&
20
+ !schemeSpecificPart.startsWith("//") &&
21
+ REVERSE_DOMAIN_PRIVATE_USE_SCHEME.test(scheme)
22
+ );
23
+ }
24
+
5
25
  /**
6
26
  * Zod schema for OAuth redirect URIs and other developer-supplied URLs that the
7
27
  * server stores and later hands back to a browser.