@better-auth/core 1.5.0-beta.6 → 1.5.0-beta.7

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 (43) hide show
  1. package/.turbo/turbo-build.log +26 -22
  2. package/dist/api/index.d.mts +10 -20
  3. package/dist/context/endpoint-context.mjs +6 -6
  4. package/dist/context/global.d.mts +7 -0
  5. package/dist/context/global.mjs +37 -0
  6. package/dist/context/index.d.mts +2 -1
  7. package/dist/context/index.mjs +2 -1
  8. package/dist/context/request-state.mjs +6 -6
  9. package/dist/context/transaction.d.mts +1 -1
  10. package/dist/context/transaction.mjs +6 -6
  11. package/dist/db/adapter/factory.mjs +13 -13
  12. package/dist/db/adapter/get-default-model-name.mjs +1 -1
  13. package/dist/db/adapter/get-id-field.d.mts +1 -1
  14. package/dist/db/adapter/get-id-field.mjs +2 -2
  15. package/dist/error/index.d.mts +3 -1
  16. package/dist/error/index.mjs +2 -3
  17. package/dist/index.d.mts +4 -4
  18. package/dist/social-providers/apple.mjs +3 -1
  19. package/dist/social-providers/gitlab.mjs +1 -1
  20. package/dist/types/context.d.mts +17 -16
  21. package/dist/types/cookie.d.mts +9 -17
  22. package/dist/types/index.d.mts +3 -3
  23. package/dist/types/init-options.d.mts +17 -29
  24. package/dist/utils/url.d.mts +20 -0
  25. package/dist/utils/url.mjs +32 -0
  26. package/package.json +1 -1
  27. package/src/context/endpoint-context.ts +7 -15
  28. package/src/context/global.ts +57 -0
  29. package/src/context/index.ts +1 -0
  30. package/src/context/request-state.ts +7 -12
  31. package/src/context/transaction.ts +7 -16
  32. package/src/db/adapter/factory.ts +13 -13
  33. package/src/db/adapter/get-default-model-name.ts +1 -1
  34. package/src/db/adapter/get-id-field.ts +2 -2
  35. package/src/error/index.ts +2 -3
  36. package/src/social-providers/apple.ts +12 -3
  37. package/src/social-providers/gitlab.ts +1 -1
  38. package/src/types/context.ts +137 -131
  39. package/src/types/cookie.ts +6 -4
  40. package/src/types/index.ts +4 -1
  41. package/src/types/init-options.ts +26 -32
  42. package/src/utils/url.ts +43 -0
  43. package/tsdown.config.ts +8 -0
@@ -1,20 +1,21 @@
1
1
 
2
- > @better-auth/core@1.5.0-beta.6 build /home/runner/work/better-auth/better-auth/packages/core
2
+ > @better-auth/core@1.5.0-beta.7 build /home/runner/work/better-auth/better-auth/packages/core
3
3
  > tsdown
4
4
 
5
5
  ℹ tsdown v0.19.0 powered by rolldown v1.0.0-beta.59
6
6
  ℹ config file: /home/runner/work/better-auth/better-auth/packages/core/tsdown.config.ts
7
- ℹ entry: src/index.ts, src/api/index.ts, src/async_hooks/index.ts, src/async_hooks/pure.index.ts, src/context/index.ts, src/db/index.ts, src/env/index.ts, src/error/index.ts, src/oauth2/index.ts, src/social-providers/index.ts, src/utils/deprecate.ts, src/utils/error-codes.ts, src/utils/id.ts, src/utils/json.ts, src/utils/string.ts, src/db/adapter/index.ts
7
+ ℹ entry: src/index.ts, src/api/index.ts, src/async_hooks/index.ts, src/async_hooks/pure.index.ts, src/context/index.ts, src/db/index.ts, src/env/index.ts, src/error/index.ts, src/oauth2/index.ts, src/social-providers/index.ts, src/utils/deprecate.ts, src/utils/error-codes.ts, src/utils/id.ts, src/utils/json.ts, src/utils/string.ts, src/utils/url.ts, src/db/adapter/index.ts
8
8
  ℹ tsconfig: tsconfig.json
9
9
  ℹ Build start
10
10
  ℹ dist/social-providers/index.mjs  2.32 kB │ gzip: 0.72 kB
11
11
  ℹ dist/api/index.mjs  1.27 kB │ gzip: 0.48 kB
12
+ ℹ dist/utils/url.mjs  1.14 kB │ gzip: 0.51 kB
12
13
  ℹ dist/async_hooks/index.mjs  1.03 kB │ gzip: 0.54 kB
13
14
  ℹ dist/async_hooks/pure.index.mjs  0.99 kB │ gzip: 0.49 kB
14
15
  ℹ dist/oauth2/index.mjs  0.87 kB │ gzip: 0.27 kB
15
- ℹ dist/context/index.mjs  0.72 kB │ gzip: 0.22 kB
16
+ ℹ dist/context/index.mjs  0.79 kB │ gzip: 0.23 kB
16
17
  ℹ dist/db/adapter/index.mjs  0.71 kB │ gzip: 0.22 kB
17
- ℹ dist/error/index.mjs  0.70 kB │ gzip: 0.34 kB
18
+ ℹ dist/error/index.mjs  0.69 kB │ gzip: 0.33 kB
18
19
  ℹ dist/utils/json.mjs  0.59 kB │ gzip: 0.35 kB
19
20
  ℹ dist/db/index.mjs  0.50 kB │ gzip: 0.18 kB
20
21
  ℹ dist/env/index.mjs  0.43 kB │ gzip: 0.21 kB
@@ -23,13 +24,13 @@
23
24
  ℹ dist/utils/id.mjs  0.24 kB │ gzip: 0.18 kB
24
25
  ℹ dist/utils/string.mjs  0.17 kB │ gzip: 0.14 kB
25
26
  ℹ dist/index.mjs  0.01 kB │ gzip: 0.03 kB
26
- ℹ dist/db/adapter/factory.mjs 30.09 kB │ gzip: 6.00 kB
27
+ ℹ dist/db/adapter/factory.mjs 30.11 kB │ gzip: 5.99 kB
27
28
  ℹ dist/db/get-tables.mjs  6.76 kB │ gzip: 1.29 kB
28
29
  ℹ dist/social-providers/cognito.mjs  5.90 kB │ gzip: 1.93 kB
29
30
  ℹ dist/social-providers/paypal.mjs  5.03 kB │ gzip: 1.48 kB
31
+ ℹ dist/social-providers/apple.mjs  3.77 kB │ gzip: 1.36 kB
30
32
  ℹ dist/social-providers/google.mjs  3.75 kB │ gzip: 1.38 kB
31
33
  ℹ dist/oauth2/verify.mjs  3.74 kB │ gzip: 1.32 kB
32
- ℹ dist/social-providers/apple.mjs  3.72 kB │ gzip: 1.34 kB
33
34
  ℹ dist/social-providers/facebook.mjs  3.57 kB │ gzip: 1.27 kB
34
35
  ℹ dist/social-providers/line.mjs  3.57 kB │ gzip: 1.20 kB
35
36
  ℹ dist/social-providers/salesforce.mjs  3.50 kB │ gzip: 1.12 kB
@@ -40,7 +41,7 @@
40
41
  ℹ dist/env/color-depth.mjs  2.72 kB │ gzip: 0.99 kB
41
42
  ℹ dist/social-providers/figma.mjs  2.71 kB │ gzip: 0.98 kB
42
43
  ℹ dist/social-providers/paybin.mjs  2.65 kB │ gzip: 0.97 kB
43
- ℹ dist/social-providers/gitlab.mjs  2.64 kB │ gzip: 0.97 kB
44
+ ℹ dist/social-providers/gitlab.mjs  2.65 kB │ gzip: 0.96 kB
44
45
  ℹ dist/db/adapter/get-id-field.mjs  2.63 kB │ gzip: 0.98 kB
45
46
  ℹ dist/social-providers/reddit.mjs  2.63 kB │ gzip: 1.01 kB
46
47
  ℹ dist/social-providers/discord.mjs  2.62 kB │ gzip: 1.04 kB
@@ -68,15 +69,16 @@
68
69
  ℹ dist/social-providers/vercel.mjs  1.91 kB │ gzip: 0.74 kB
69
70
  ℹ dist/oauth2/create-authorization-url.mjs  1.86 kB │ gzip: 0.73 kB
70
71
  ℹ dist/oauth2/client-credentials-token.mjs  1.83 kB │ gzip: 0.77 kB
71
- ℹ dist/context/request-state.mjs  1.61 kB │ gzip: 0.60 kB
72
- ℹ dist/context/transaction.mjs  1.61 kB │ gzip: 0.57 kB
72
+ ℹ dist/context/request-state.mjs  1.63 kB │ gzip: 0.59 kB
73
+ ℹ dist/context/transaction.mjs  1.60 kB │ gzip: 0.55 kB
73
74
  ℹ dist/db/adapter/get-default-field-name.mjs  1.41 kB │ gzip: 0.66 kB
74
- ℹ dist/db/adapter/get-default-model-name.mjs  1.39 kB │ gzip: 0.65 kB
75
- ℹ dist/context/endpoint-context.mjs  1.30 kB │ gzip: 0.55 kB
75
+ ℹ dist/db/adapter/get-default-model-name.mjs  1.40 kB │ gzip: 0.65 kB
76
+ ℹ dist/context/endpoint-context.mjs  1.31 kB │ gzip: 0.53 kB
76
77
  ℹ dist/db/adapter/get-field-attributes.mjs  1.26 kB │ gzip: 0.46 kB
77
78
  ℹ dist/db/adapter/utils.mjs  1.15 kB │ gzip: 0.46 kB
78
79
  ℹ dist/db/adapter/get-field-name.mjs  1.07 kB │ gzip: 0.47 kB
79
80
  ℹ dist/oauth2/utils.mjs  0.98 kB │ gzip: 0.50 kB
81
+ ℹ dist/context/global.mjs  0.96 kB │ gzip: 0.48 kB
80
82
  ℹ dist/db/adapter/get-model-name.mjs  0.89 kB │ gzip: 0.42 kB
81
83
  ℹ dist/db/schema/account.mjs  0.52 kB │ gzip: 0.24 kB
82
84
  ℹ dist/db/schema/user.mjs  0.33 kB │ gzip: 0.23 kB
@@ -86,13 +88,14 @@
86
88
  ℹ dist/db/schema/rate-limit.mjs  0.21 kB │ gzip: 0.17 kB
87
89
  ℹ dist/social-providers/index.d.mts 45.59 kB │ gzip: 3.09 kB
88
90
  ℹ dist/db/adapter/index.d.mts 15.17 kB │ gzip: 3.60 kB
89
- ℹ dist/api/index.d.mts  7.57 kB │ gzip: 1.44 kB
90
- ℹ dist/index.d.mts  1.20 kB │ gzip: 0.36 kB
91
+ ℹ dist/api/index.d.mts  7.54 kB │ gzip: 1.45 kB
92
+ ℹ dist/index.d.mts  1.36 kB │ gzip: 0.38 kB
91
93
  ℹ dist/oauth2/index.d.mts  1.05 kB │ gzip: 0.32 kB
92
94
  ℹ dist/db/index.d.mts  1.04 kB │ gzip: 0.34 kB
95
+ ℹ dist/context/index.d.mts  0.92 kB │ gzip: 0.27 kB
93
96
  ℹ dist/utils/error-codes.d.mts  0.89 kB │ gzip: 0.45 kB
94
- ℹ dist/context/index.d.mts  0.84 kB │ gzip: 0.24 kB
95
- ℹ dist/error/index.d.mts  0.73 kB │ gzip: 0.33 kB
97
+ ℹ dist/utils/url.d.mts  0.84 kB │ gzip: 0.40 kB
98
+ ℹ dist/error/index.d.mts  0.75 kB │ gzip: 0.34 kB
96
99
  ℹ dist/env/index.d.mts  0.58 kB │ gzip: 0.27 kB
97
100
  ℹ dist/utils/deprecate.d.mts  0.30 kB │ gzip: 0.22 kB
98
101
  ℹ dist/async_hooks/index.d.mts  0.24 kB │ gzip: 0.16 kB
@@ -100,8 +103,8 @@
100
103
  ℹ dist/utils/string.d.mts  0.14 kB │ gzip: 0.12 kB
101
104
  ℹ dist/utils/json.d.mts  0.13 kB │ gzip: 0.13 kB
102
105
  ℹ dist/utils/id.d.mts  0.12 kB │ gzip: 0.12 kB
103
- ℹ dist/types/init-options.d.mts 38.19 kB │ gzip: 8.46 kB
104
- ℹ dist/types/context.d.mts  9.90 kB │ gzip: 2.83 kB
106
+ ℹ dist/types/init-options.d.mts 38.16 kB │ gzip: 8.49 kB
107
+ ℹ dist/types/context.d.mts 10.12 kB │ gzip: 2.96 kB
105
108
  ℹ dist/social-providers/zoom.d.mts  6.71 kB │ gzip: 2.29 kB
106
109
  ℹ dist/oauth2/oauth-provider.d.mts  5.92 kB │ gzip: 1.67 kB
107
110
  ℹ dist/social-providers/microsoft-entra-id.d.mts  5.59 kB │ gzip: 1.96 kB
@@ -153,14 +156,14 @@
153
156
  ℹ dist/oauth2/refresh-access-token.d.mts  1.01 kB │ gzip: 0.41 kB
154
157
  ℹ dist/context/endpoint-context.d.mts  0.99 kB │ gzip: 0.43 kB
155
158
  ℹ dist/oauth2/client-credentials-token.d.mts  0.91 kB │ gzip: 0.36 kB
156
- ℹ dist/context/transaction.d.mts  0.88 kB │ gzip: 0.39 kB
157
- ℹ dist/types/index.d.mts  0.77 kB │ gzip: 0.33 kB
159
+ ℹ dist/context/transaction.d.mts  0.86 kB │ gzip: 0.38 kB
160
+ ℹ dist/types/index.d.mts  0.86 kB │ gzip: 0.34 kB
158
161
  ℹ dist/db/schema/session.d.mts  0.75 kB │ gzip: 0.40 kB
159
162
  ℹ dist/db/adapter/get-field-attributes.d.mts  0.72 kB │ gzip: 0.34 kB
160
163
  ℹ dist/db/schema/user.d.mts  0.71 kB │ gzip: 0.40 kB
161
164
  ℹ dist/db/schema/verification.d.mts  0.66 kB │ gzip: 0.36 kB
162
165
  ℹ dist/types/helper.d.mts  0.45 kB │ gzip: 0.27 kB
163
- ℹ dist/types/cookie.d.mts  0.43 kB │ gzip: 0.19 kB
166
+ ℹ dist/types/cookie.d.mts  0.38 kB │ gzip: 0.20 kB
164
167
  ℹ dist/db/adapter/get-default-field-name.d.mts  0.38 kB │ gzip: 0.24 kB
165
168
  ℹ dist/db/schema/rate-limit.d.mts  0.37 kB │ gzip: 0.25 kB
166
169
  ℹ dist/db/adapter/get-field-name.d.mts  0.36 kB │ gzip: 0.23 kB
@@ -171,6 +174,7 @@
171
174
  ℹ dist/db/adapter/get-model-name.d.mts  0.30 kB │ gzip: 0.21 kB
172
175
  ℹ dist/db/get-tables.d.mts  0.29 kB │ gzip: 0.18 kB
173
176
  ℹ dist/db/schema/shared.d.mts  0.25 kB │ gzip: 0.18 kB
177
+ ℹ dist/context/global.d.mts  0.20 kB │ gzip: 0.16 kB
174
178
  ℹ dist/env/color-depth.d.mts  0.12 kB │ gzip: 0.11 kB
175
- ℹ 165 files, total: 442.95 kB
176
- ✔ Build complete in 5309ms
179
+ ℹ 169 files, total: 446.70 kB
180
+ ✔ Build complete in 5631ms
@@ -6,9 +6,9 @@ import { DBAdapter } from "../db/adapter/index.mjs";
6
6
  import { createLogger } from "../env/logger.mjs";
7
7
  import { OAuthProvider } from "../oauth2/oauth-provider.mjs";
8
8
  import "../oauth2/index.mjs";
9
- import { BetterAuthCookies } from "../types/cookie.mjs";
9
+ import { BetterAuthCookie, BetterAuthCookies } from "../types/cookie.mjs";
10
10
  import { BetterAuthOptions, BetterAuthRateLimitOptions } from "../types/init-options.mjs";
11
- import { AuthContext, GenericEndpointContext, InternalAdapter, PluginContext } from "../types/context.mjs";
11
+ import { AuthContext, GenericEndpointContext, InfoContext, InternalAdapter, PluginContext } from "../types/context.mjs";
12
12
  import "../types/index.mjs";
13
13
  import "../index.mjs";
14
14
  import * as better_call0 from "better-call";
@@ -20,10 +20,8 @@ declare const createAuthMiddleware: {
20
20
  <Options extends better_call0.MiddlewareOptions, R>(options: Options, handler: (ctx: better_call0.MiddlewareContext<Options, {
21
21
  returned?: unknown | undefined;
22
22
  responseHeaders?: Headers | undefined;
23
- } & PluginContext & {
23
+ } & PluginContext & InfoContext & {
24
24
  options: BetterAuthOptions;
25
- appName: string;
26
- baseURL: string;
27
25
  trustedOrigins: string[];
28
26
  isTrustedOrigin: (url: string, settings?: {
29
27
  allowRelativePaths: boolean;
@@ -52,13 +50,10 @@ declare const createAuthMiddleware: {
52
50
  window: number;
53
51
  max: number;
54
52
  storage: "memory" | "database" | "secondary-storage";
55
- } & BetterAuthRateLimitOptions;
53
+ } & Omit<BetterAuthRateLimitOptions, "enabled" | "window" | "max" | "storage">;
56
54
  adapter: DBAdapter<BetterAuthOptions>;
57
55
  internalAdapter: InternalAdapter<BetterAuthOptions>;
58
- createAuthCookie: (cookieName: string, overrideAttributes?: Partial<better_call0.CookieOptions> | undefined) => {
59
- name: string;
60
- attributes: better_call0.CookieOptions;
61
- };
56
+ createAuthCookie: (cookieName: string, overrideAttributes?: Partial<better_call0.CookieOptions> | undefined) => BetterAuthCookie;
62
57
  secret: string;
63
58
  sessionConfig: {
64
59
  updateAge: number;
@@ -93,7 +88,7 @@ declare const createAuthMiddleware: {
93
88
  anonymousId?: string | undefined;
94
89
  payload: Record<string, any>;
95
90
  }) => Promise<void>;
96
- skipOriginCheck: boolean;
91
+ skipOriginCheck: boolean | string[];
97
92
  skipCSRFCheck: boolean;
98
93
  runInBackground: (promise: Promise<void>) => void;
99
94
  runInBackgroundOrAwait: (promise: Promise<unknown> | Promise<void> | void | unknown) => Promise<unknown>;
@@ -101,10 +96,8 @@ declare const createAuthMiddleware: {
101
96
  <Options extends better_call0.MiddlewareOptions, R_1>(handler: (ctx: better_call0.MiddlewareContext<Options, {
102
97
  returned?: unknown | undefined;
103
98
  responseHeaders?: Headers | undefined;
104
- } & PluginContext & {
99
+ } & PluginContext & InfoContext & {
105
100
  options: BetterAuthOptions;
106
- appName: string;
107
- baseURL: string;
108
101
  trustedOrigins: string[];
109
102
  isTrustedOrigin: (url: string, settings?: {
110
103
  allowRelativePaths: boolean;
@@ -133,13 +126,10 @@ declare const createAuthMiddleware: {
133
126
  window: number;
134
127
  max: number;
135
128
  storage: "memory" | "database" | "secondary-storage";
136
- } & BetterAuthRateLimitOptions;
129
+ } & Omit<BetterAuthRateLimitOptions, "enabled" | "window" | "max" | "storage">;
137
130
  adapter: DBAdapter<BetterAuthOptions>;
138
131
  internalAdapter: InternalAdapter<BetterAuthOptions>;
139
- createAuthCookie: (cookieName: string, overrideAttributes?: Partial<better_call0.CookieOptions> | undefined) => {
140
- name: string;
141
- attributes: better_call0.CookieOptions;
142
- };
132
+ createAuthCookie: (cookieName: string, overrideAttributes?: Partial<better_call0.CookieOptions> | undefined) => BetterAuthCookie;
143
133
  secret: string;
144
134
  sessionConfig: {
145
135
  updateAge: number;
@@ -174,7 +164,7 @@ declare const createAuthMiddleware: {
174
164
  anonymousId?: string | undefined;
175
165
  payload: Record<string, any>;
176
166
  }) => Promise<void>;
177
- skipOriginCheck: boolean;
167
+ skipOriginCheck: boolean | string[];
178
168
  skipCSRFCheck: boolean;
179
169
  runInBackground: (promise: Promise<void>) => void;
180
170
  runInBackgroundOrAwait: (promise: Promise<unknown> | Promise<void> | void | unknown) => Promise<unknown>;
@@ -1,14 +1,14 @@
1
+ import { __getBetterAuthGlobal } from "./global.mjs";
1
2
  import { getAsyncLocalStorage } from "@better-auth/core/async_hooks";
2
3
 
3
4
  //#region src/context/endpoint-context.ts
4
- const symbol = Symbol.for("better-auth:endpoint-context-async-storage");
5
- let currentContextAsyncStorage = null;
6
5
  const ensureAsyncStorage = async () => {
7
- if (!currentContextAsyncStorage || globalThis[symbol] === void 0) {
8
- currentContextAsyncStorage = new (await (getAsyncLocalStorage()))();
9
- globalThis[symbol] = currentContextAsyncStorage;
6
+ const betterAuthGlobal = __getBetterAuthGlobal();
7
+ if (!betterAuthGlobal.context.endpointContextAsyncStorage) {
8
+ const AsyncLocalStorage$1 = await getAsyncLocalStorage();
9
+ betterAuthGlobal.context.endpointContextAsyncStorage = new AsyncLocalStorage$1();
10
10
  }
11
- return currentContextAsyncStorage || globalThis[symbol];
11
+ return betterAuthGlobal.context.endpointContextAsyncStorage;
12
12
  };
13
13
  /**
14
14
  * This is for internal use only. Most users should use `getCurrentAuthContext` instead.
@@ -0,0 +1,7 @@
1
+ import { AsyncLocalStorage } from "@better-auth/core/async_hooks";
2
+
3
+ //#region src/context/global.d.ts
4
+
5
+ declare function getBetterAuthVersion(): string;
6
+ //#endregion
7
+ export { getBetterAuthVersion };
@@ -0,0 +1,37 @@
1
+ //#region src/context/global.ts
2
+ const symbol = Symbol.for("better-auth:global");
3
+ let bind = null;
4
+ const __context = {};
5
+ const __betterAuthVersion = "1.5.0-beta.7";
6
+ /**
7
+ * We store context instance in the globalThis.
8
+ *
9
+ * The reason we do this is that some bundlers, web framework, or package managers might
10
+ * create multiple copies of BetterAuth in the same process intentionally or unintentionally.
11
+ *
12
+ * For example, yarn v1, Next.js, SSR, Vite...
13
+ *
14
+ * @internal
15
+ */
16
+ function __getBetterAuthGlobal() {
17
+ if (!globalThis[symbol]) {
18
+ globalThis[symbol] = {
19
+ version: __betterAuthVersion,
20
+ epoch: 1,
21
+ context: __context
22
+ };
23
+ bind = globalThis[symbol];
24
+ }
25
+ bind = globalThis[symbol];
26
+ if (bind.version !== __betterAuthVersion) {
27
+ bind.version = __betterAuthVersion;
28
+ bind.epoch++;
29
+ }
30
+ return globalThis[symbol];
31
+ }
32
+ function getBetterAuthVersion() {
33
+ return __getBetterAuthGlobal().version;
34
+ }
35
+
36
+ //#endregion
37
+ export { __getBetterAuthGlobal, getBetterAuthVersion };
@@ -1,4 +1,5 @@
1
1
  import { AuthEndpointContext, getCurrentAuthContext, getCurrentAuthContextAsyncLocalStorage, runWithEndpointContext } from "./endpoint-context.mjs";
2
+ import { getBetterAuthVersion } from "./global.mjs";
2
3
  import { RequestState, RequestStateWeakMap, defineRequestState, getCurrentRequestState, getRequestStateAsyncLocalStorage, hasRequestState, runWithRequestState } from "./request-state.mjs";
3
4
  import { getCurrentAdapter, getCurrentDBAdapterAsyncLocalStorage, runWithAdapter, runWithTransaction } from "./transaction.mjs";
4
- export { type AuthEndpointContext, type RequestState, type RequestStateWeakMap, defineRequestState, getCurrentAdapter, getCurrentAuthContext, getCurrentAuthContextAsyncLocalStorage, getCurrentDBAdapterAsyncLocalStorage, getCurrentRequestState, getRequestStateAsyncLocalStorage, hasRequestState, runWithAdapter, runWithEndpointContext, runWithRequestState, runWithTransaction };
5
+ export { type AuthEndpointContext, type RequestState, type RequestStateWeakMap, defineRequestState, getBetterAuthVersion, getCurrentAdapter, getCurrentAuthContext, getCurrentAuthContextAsyncLocalStorage, getCurrentDBAdapterAsyncLocalStorage, getCurrentRequestState, getRequestStateAsyncLocalStorage, hasRequestState, runWithAdapter, runWithEndpointContext, runWithRequestState, runWithTransaction };
@@ -1,5 +1,6 @@
1
+ import { getBetterAuthVersion } from "./global.mjs";
1
2
  import { getCurrentAuthContext, getCurrentAuthContextAsyncLocalStorage, runWithEndpointContext } from "./endpoint-context.mjs";
2
3
  import { defineRequestState, getCurrentRequestState, getRequestStateAsyncLocalStorage, hasRequestState, runWithRequestState } from "./request-state.mjs";
3
4
  import { getCurrentAdapter, getCurrentDBAdapterAsyncLocalStorage, runWithAdapter, runWithTransaction } from "./transaction.mjs";
4
5
 
5
- export { defineRequestState, getCurrentAdapter, getCurrentAuthContext, getCurrentAuthContextAsyncLocalStorage, getCurrentDBAdapterAsyncLocalStorage, getCurrentRequestState, getRequestStateAsyncLocalStorage, hasRequestState, runWithAdapter, runWithEndpointContext, runWithRequestState, runWithTransaction };
6
+ export { defineRequestState, getBetterAuthVersion, getCurrentAdapter, getCurrentAuthContext, getCurrentAuthContextAsyncLocalStorage, getCurrentDBAdapterAsyncLocalStorage, getCurrentRequestState, getRequestStateAsyncLocalStorage, hasRequestState, runWithAdapter, runWithEndpointContext, runWithRequestState, runWithTransaction };
@@ -1,14 +1,14 @@
1
+ import { __getBetterAuthGlobal } from "./global.mjs";
1
2
  import { getAsyncLocalStorage } from "@better-auth/core/async_hooks";
2
3
 
3
4
  //#region src/context/request-state.ts
4
- const symbol = Symbol.for("better-auth:request-state-async-storage");
5
- let requestStateAsyncStorage = null;
6
5
  const ensureAsyncStorage = async () => {
7
- if (!requestStateAsyncStorage || globalThis[symbol] === void 0) {
8
- requestStateAsyncStorage = new (await (getAsyncLocalStorage()))();
9
- globalThis[symbol] = requestStateAsyncStorage;
6
+ const betterAuthGlobal = __getBetterAuthGlobal();
7
+ if (!betterAuthGlobal.context.requestStateAsyncStorage) {
8
+ const AsyncLocalStorage$1 = await getAsyncLocalStorage();
9
+ betterAuthGlobal.context.requestStateAsyncStorage = new AsyncLocalStorage$1();
10
10
  }
11
- return requestStateAsyncStorage || globalThis[symbol];
11
+ return betterAuthGlobal.context.requestStateAsyncStorage;
12
12
  };
13
13
  async function getRequestStateAsyncLocalStorage() {
14
14
  return ensureAsyncStorage();
@@ -1,5 +1,5 @@
1
1
  import { DBAdapter, DBTransactionAdapter } from "../db/adapter/index.mjs";
2
- import { AsyncLocalStorage } from "@better-auth/core/async_hooks";
2
+ import { AsyncLocalStorage } from "node:async_hooks";
3
3
 
4
4
  //#region src/context/transaction.d.ts
5
5
 
@@ -1,14 +1,14 @@
1
+ import { __getBetterAuthGlobal } from "./global.mjs";
1
2
  import { getAsyncLocalStorage } from "@better-auth/core/async_hooks";
2
3
 
3
4
  //#region src/context/transaction.ts
4
- const symbol = Symbol.for("better-auth:transaction-adapter-async-storage");
5
- let currentAdapterAsyncStorage = null;
6
5
  const ensureAsyncStorage = async () => {
7
- if (!currentAdapterAsyncStorage || globalThis[symbol] === void 0) {
8
- currentAdapterAsyncStorage = new (await (getAsyncLocalStorage()))();
9
- globalThis[symbol] = currentAdapterAsyncStorage;
6
+ const betterAuthGlobal = __getBetterAuthGlobal();
7
+ if (!betterAuthGlobal.context.adapterAsyncStorage) {
8
+ const AsyncLocalStorage$1 = await getAsyncLocalStorage();
9
+ betterAuthGlobal.context.adapterAsyncStorage = new AsyncLocalStorage$1();
10
10
  }
11
- return currentAdapterAsyncStorage || globalThis[symbol];
11
+ return betterAuthGlobal.context.adapterAsyncStorage;
12
12
  };
13
13
  /**
14
14
  * This is for internal use only. Most users should use `getCurrentAdapter` instead.
@@ -108,7 +108,7 @@ const createAdapterFactory = ({ adapter: customAdapter, config: cfg }) => (optio
108
108
  for (const field in fields) {
109
109
  let value = data[field];
110
110
  const fieldAttributes = fields[field];
111
- let newFieldName = newMappedKeys[field] || fields[field].fieldName || field;
111
+ const newFieldName = newMappedKeys[field] || fields[field].fieldName || field;
112
112
  if (value === void 0 && (fieldAttributes.defaultValue === void 0 && !fieldAttributes.transform?.input && !(action === "update" && fieldAttributes.onUpdate) || action === "update" && !fieldAttributes.onUpdate)) continue;
113
113
  if (fieldAttributes && fieldAttributes.type === "date" && !(value instanceof Date) && typeof value === "string") try {
114
114
  value = new Date(value);
@@ -154,7 +154,7 @@ const createAdapterFactory = ({ adapter: customAdapter, config: cfg }) => (optio
154
154
  const originalKey = field.fieldName || key;
155
155
  let newValue = data$1[Object.entries(newMappedKeys).find(([_, v]) => v === originalKey)?.[0] || originalKey];
156
156
  if (field.transform?.output) newValue = await field.transform.output(newValue);
157
- let newFieldName = newMappedKeys[key] || key;
157
+ const newFieldName = newMappedKeys[key] || key;
158
158
  if (originalKey === "id" || field.references?.field === "id") {
159
159
  if (typeof newValue !== "undefined" && newValue !== null) newValue = String(newValue);
160
160
  } else if (config.supportsJSON === false && typeof newValue === "string" && field.type === "json") newValue = safeJSONParse(newValue);
@@ -177,7 +177,7 @@ const createAdapterFactory = ({ adapter: customAdapter, config: cfg }) => (optio
177
177
  };
178
178
  if (!join || Object.keys(join).length === 0) return await transformSingleOutput(data, unsafe_model, select);
179
179
  unsafe_model = getDefaultModelName(unsafe_model);
180
- let transformedData = await transformSingleOutput(data, unsafe_model, select);
180
+ const transformedData = await transformSingleOutput(data, unsafe_model, select);
181
181
  const requiredModels = Object.entries(join).map(([model, joinConfig]) => ({
182
182
  modelName: getModelName(model),
183
183
  defaultModelName: getDefaultModelName(model),
@@ -196,7 +196,7 @@ const createAdapterFactory = ({ adapter: customAdapter, config: cfg }) => (optio
196
196
  })();
197
197
  if (joinedData === void 0 || joinedData === null) joinedData = joinConfig.relation === "one-to-one" ? null : [];
198
198
  if (joinConfig.relation === "one-to-many" && !Array.isArray(joinedData)) joinedData = [joinedData];
199
- let transformed = [];
199
+ const transformed = [];
200
200
  if (Array.isArray(joinedData)) for (const item of joinedData) {
201
201
  const transformedItem = await transformSingleOutput(item, modelName, []);
202
202
  transformed.push(transformedItem);
@@ -392,7 +392,7 @@ const createAdapterFactory = ({ adapter: customAdapter, config: cfg }) => (optio
392
392
  },
393
393
  create: async ({ data: unsafeData, model: unsafeModel, select, forceAllowId = false }) => {
394
394
  transactionId++;
395
- let thisTransactionId = transactionId;
395
+ const thisTransactionId = transactionId;
396
396
  const model = getModelName(unsafeModel);
397
397
  unsafeModel = getDefaultModelName(unsafeModel);
398
398
  if ("id" in unsafeData && typeof unsafeData.id !== "undefined" && !forceAllowId) {
@@ -429,7 +429,7 @@ const createAdapterFactory = ({ adapter: customAdapter, config: cfg }) => (optio
429
429
  },
430
430
  update: async ({ model: unsafeModel, where: unsafeWhere, update: unsafeData }) => {
431
431
  transactionId++;
432
- let thisTransactionId = transactionId;
432
+ const thisTransactionId = transactionId;
433
433
  unsafeModel = getDefaultModelName(unsafeModel);
434
434
  const model = getModelName(unsafeModel);
435
435
  const where = transformWhereClause({
@@ -466,7 +466,7 @@ const createAdapterFactory = ({ adapter: customAdapter, config: cfg }) => (optio
466
466
  },
467
467
  updateMany: async ({ model: unsafeModel, where: unsafeWhere, update: unsafeData }) => {
468
468
  transactionId++;
469
- let thisTransactionId = transactionId;
469
+ const thisTransactionId = transactionId;
470
470
  const model = getModelName(unsafeModel);
471
471
  const where = transformWhereClause({
472
472
  model: unsafeModel,
@@ -501,7 +501,7 @@ const createAdapterFactory = ({ adapter: customAdapter, config: cfg }) => (optio
501
501
  },
502
502
  findOne: async ({ model: unsafeModel, where: unsafeWhere, select, join: unsafeJoin }) => {
503
503
  transactionId++;
504
- let thisTransactionId = transactionId;
504
+ const thisTransactionId = transactionId;
505
505
  const model = getModelName(unsafeModel);
506
506
  const where = transformWhereClause({
507
507
  model: unsafeModel,
@@ -545,7 +545,7 @@ const createAdapterFactory = ({ adapter: customAdapter, config: cfg }) => (optio
545
545
  },
546
546
  findMany: async ({ model: unsafeModel, where: unsafeWhere, limit: unsafeLimit, sortBy, offset, join: unsafeJoin }) => {
547
547
  transactionId++;
548
- let thisTransactionId = transactionId;
548
+ const thisTransactionId = transactionId;
549
549
  const limit = unsafeLimit ?? options.advanced?.database?.defaultFindManyLimit ?? 100;
550
550
  const model = getModelName(unsafeModel);
551
551
  const where = transformWhereClause({
@@ -593,7 +593,7 @@ const createAdapterFactory = ({ adapter: customAdapter, config: cfg }) => (optio
593
593
  },
594
594
  delete: async ({ model: unsafeModel, where: unsafeWhere }) => {
595
595
  transactionId++;
596
- let thisTransactionId = transactionId;
596
+ const thisTransactionId = transactionId;
597
597
  const model = getModelName(unsafeModel);
598
598
  const where = transformWhereClause({
599
599
  model: unsafeModel,
@@ -613,7 +613,7 @@ const createAdapterFactory = ({ adapter: customAdapter, config: cfg }) => (optio
613
613
  },
614
614
  deleteMany: async ({ model: unsafeModel, where: unsafeWhere }) => {
615
615
  transactionId++;
616
- let thisTransactionId = transactionId;
616
+ const thisTransactionId = transactionId;
617
617
  const model = getModelName(unsafeModel);
618
618
  const where = transformWhereClause({
619
619
  model: unsafeModel,
@@ -637,7 +637,7 @@ const createAdapterFactory = ({ adapter: customAdapter, config: cfg }) => (optio
637
637
  },
638
638
  count: async ({ model: unsafeModel, where: unsafeWhere }) => {
639
639
  transactionId++;
640
- let thisTransactionId = transactionId;
640
+ const thisTransactionId = transactionId;
641
641
  const model = getModelName(unsafeModel);
642
642
  const where = transformWhereClause({
643
643
  model: unsafeModel,
@@ -703,7 +703,7 @@ const createAdapterFactory = ({ adapter: customAdapter, config: cfg }) => (optio
703
703
  const separator = `─`.repeat(80);
704
704
  const logs = debugLogs.filter((log$1) => log$1.instance === uniqueAdapterFactoryInstanceId);
705
705
  if (logs.length === 0) return;
706
- let log = logs.reverse().map((log$1) => {
706
+ const log = logs.reverse().map((log$1) => {
707
707
  log$1.args[0] = `\n${log$1.args[0]}`;
708
708
  return [...log$1.args, "\n"];
709
709
  }).reduce((prev, curr) => {
@@ -15,7 +15,7 @@ const initGetDefaultModelName = ({ usePlural, schema }) => {
15
15
  */
16
16
  const getDefaultModelName = (model) => {
17
17
  if (usePlural && model.charAt(model.length - 1) === "s") {
18
- let pluralessModel = model.slice(0, -1);
18
+ const pluralessModel = model.slice(0, -1);
19
19
  let m$1 = schema[pluralessModel] ? pluralessModel : void 0;
20
20
  if (!m$1) m$1 = Object.entries(schema).find(([_, f]) => f.modelName === pluralessModel)?.[0];
21
21
  if (m$1) return m$1;
@@ -28,7 +28,7 @@ declare const initGetIdField: ({
28
28
  forceAllowId?: boolean;
29
29
  }) => {
30
30
  transform: {
31
- input: (value: DBPrimitive) => string | number | true | Date | Record<string, unknown> | unknown[] | undefined;
31
+ input: (value: DBPrimitive) => string | number | true | unknown[] | Date | Record<string, unknown> | undefined;
32
32
  output: (value: DBPrimitive) => string | undefined;
33
33
  };
34
34
  defaultValue?: (() => string | false | undefined) | undefined;
@@ -12,7 +12,7 @@ const initGetIdField = ({ usePlural, schema, disableIdGeneration, options, custo
12
12
  const idField = ({ customModelName, forceAllowId }) => {
13
13
  const useNumberId = options.advanced?.database?.useNumberId || options.advanced?.database?.generateId === "serial";
14
14
  const useUUIDs = options.advanced?.database?.generateId === "uuid";
15
- let shouldGenerateId = (() => {
15
+ const shouldGenerateId = (() => {
16
16
  if (disableIdGeneration) return false;
17
17
  else if (useNumberId && !forceAllowId) return false;
18
18
  else if (useUUIDs) return !supportsUUIDs;
@@ -24,7 +24,7 @@ const initGetIdField = ({ usePlural, schema, disableIdGeneration, options, custo
24
24
  required: shouldGenerateId ? true : false,
25
25
  ...shouldGenerateId ? { defaultValue() {
26
26
  if (disableIdGeneration) return void 0;
27
- let generateId$1 = options.advanced?.database?.generateId;
27
+ const generateId$1 = options.advanced?.database?.generateId;
28
28
  if (generateId$1 === false || useNumberId) return void 0;
29
29
  if (typeof generateId$1 === "function") return generateId$1({ model });
30
30
  if (customIdGenerator) return customIdGenerator({ model });
@@ -3,7 +3,9 @@ import { APIError as APIError$1 } from "better-call/error";
3
3
 
4
4
  //#region src/error/index.d.ts
5
5
  declare class BetterAuthError extends Error {
6
- constructor(message: string, cause?: string | undefined);
6
+ constructor(message: string, options?: {
7
+ cause?: unknown | undefined;
8
+ });
7
9
  }
8
10
  declare class APIError extends APIError$1 {
9
11
  constructor(...args: ConstructorParameters<typeof APIError$1>);
@@ -3,11 +3,10 @@ import { APIError as APIError$1 } from "better-call/error";
3
3
 
4
4
  //#region src/error/index.ts
5
5
  var BetterAuthError = class extends Error {
6
- constructor(message, cause) {
7
- super(message);
6
+ constructor(message, options) {
7
+ super(message, options);
8
8
  this.name = "BetterAuthError";
9
9
  this.message = message;
10
- this.cause = cause;
11
10
  this.stack = "";
12
11
  }
13
12
  };
package/dist/index.d.mts CHANGED
@@ -1,8 +1,8 @@
1
1
  import { Awaitable, LiteralString, LiteralUnion, Prettify, Primitive } from "./types/helper.mjs";
2
- import { BetterAuthCookies } from "./types/cookie.mjs";
2
+ import { BetterAuthCookie, BetterAuthCookies } from "./types/cookie.mjs";
3
3
  import { BetterAuthPlugin, HookEndpointContext } from "./types/plugin.mjs";
4
- import { BetterAuthAdvancedOptions, BetterAuthOptions, BetterAuthRateLimitOptions, GenerateIdFn } from "./types/init-options.mjs";
5
- import { AuthContext, BetterAuthPluginRegistry, BetterAuthPluginRegistryIdentifier, GenericEndpointContext, InternalAdapter, PluginContext } from "./types/context.mjs";
4
+ import { BetterAuthAdvancedOptions, BetterAuthOptions, BetterAuthRateLimitOptions, BetterAuthRateLimitRule, BetterAuthRateLimitStorage, GenerateIdFn } from "./types/init-options.mjs";
5
+ import { AuthContext, BetterAuthPluginRegistry, BetterAuthPluginRegistryIdentifier, GenericEndpointContext, InfoContext, InternalAdapter, PluginContext } from "./types/context.mjs";
6
6
  import { BetterAuthClientOptions, BetterAuthClientPlugin, ClientAtomListener, ClientFetchOption, ClientStore } from "./types/plugin-client.mjs";
7
7
  import { StandardSchemaV1 } from "./types/index.mjs";
8
- export { AuthContext, Awaitable, BetterAuthAdvancedOptions, BetterAuthClientOptions, BetterAuthClientPlugin, BetterAuthCookies, BetterAuthOptions, BetterAuthPlugin, BetterAuthPluginRegistry, BetterAuthPluginRegistryIdentifier, BetterAuthRateLimitOptions, ClientAtomListener, ClientFetchOption, ClientStore, GenerateIdFn, GenericEndpointContext, HookEndpointContext, InternalAdapter, LiteralString, LiteralUnion, PluginContext, Prettify, Primitive, StandardSchemaV1 };
8
+ export { AuthContext, Awaitable, BetterAuthAdvancedOptions, BetterAuthClientOptions, BetterAuthClientPlugin, BetterAuthCookie, BetterAuthCookies, BetterAuthOptions, BetterAuthPlugin, BetterAuthPluginRegistry, BetterAuthPluginRegistryIdentifier, BetterAuthRateLimitOptions, BetterAuthRateLimitRule, BetterAuthRateLimitStorage, ClientAtomListener, ClientFetchOption, ClientStore, GenerateIdFn, GenericEndpointContext, HookEndpointContext, InfoContext, InternalAdapter, LiteralString, LiteralUnion, PluginContext, Prettify, Primitive, StandardSchemaV1 };
@@ -69,7 +69,9 @@ const apple = (options) => {
69
69
  if (!token.idToken) return null;
70
70
  const profile = decodeJwt(token.idToken);
71
71
  if (!profile) return null;
72
- const name = token.user ? `${token.user.name?.firstName} ${token.user.name?.lastName}` : profile.name || profile.email;
72
+ let name;
73
+ if (token.user?.name) name = `${token.user.name.firstName || ""} ${token.user.name.lastName || ""}`.trim() || " ";
74
+ else name = profile.name || " ";
73
75
  const emailVerified = typeof profile.email_verified === "boolean" ? profile.email_verified : profile.email_verified === "true";
74
76
  const enrichedProfile = {
75
77
  ...profile,
@@ -9,7 +9,7 @@ const cleanDoubleSlashes = (input = "") => {
9
9
  return input.split("://").map((str) => str.replace(/\/{2,}/g, "/")).join("://");
10
10
  };
11
11
  const issuerToEndpoints = (issuer) => {
12
- let baseUrl = issuer || "https://gitlab.com";
12
+ const baseUrl = issuer || "https://gitlab.com";
13
13
  return {
14
14
  authorizationEndpoint: cleanDoubleSlashes(`${baseUrl}/oauth/authorize`),
15
15
  tokenEndpoint: cleanDoubleSlashes(`${baseUrl}/oauth/token`),