better-auth-studio 1.1.2-beta.2 → 1.1.2-beta.21

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 (109) hide show
  1. package/README.md +48 -78
  2. package/data/default-geo.json +1 -1
  3. package/dist/adapters/astro.d.ts +1 -1
  4. package/dist/adapters/astro.js +13 -13
  5. package/dist/adapters/elysia.d.ts +2 -2
  6. package/dist/adapters/elysia.js +13 -13
  7. package/dist/adapters/express.d.ts +2 -2
  8. package/dist/adapters/express.js +4 -4
  9. package/dist/adapters/hono.d.ts +2 -2
  10. package/dist/adapters/hono.js +12 -12
  11. package/dist/adapters/nextjs.d.ts +1 -1
  12. package/dist/adapters/nextjs.js +10 -10
  13. package/dist/adapters/nuxt.d.ts +1 -1
  14. package/dist/adapters/nuxt.js +22 -22
  15. package/dist/adapters/remix.d.ts +1 -1
  16. package/dist/adapters/remix.js +13 -13
  17. package/dist/adapters/solid-start.d.ts +1 -1
  18. package/dist/adapters/solid-start.js +13 -13
  19. package/dist/adapters/svelte-kit.d.ts +2 -2
  20. package/dist/adapters/svelte-kit.js +13 -13
  21. package/dist/adapters/tanstack-start.d.ts +1 -1
  22. package/dist/adapters/tanstack-start.js +13 -13
  23. package/dist/add-svelte-kit-env-modules.js +11 -11
  24. package/dist/auth-adapter.d.ts +1 -1
  25. package/dist/auth-adapter.js +96 -96
  26. package/dist/cli/commands/init.js +57 -57
  27. package/dist/cli.js +75 -75
  28. package/dist/config.d.ts +5 -5
  29. package/dist/config.js +37 -37
  30. package/dist/core/handler.d.ts +1 -1
  31. package/dist/core/handler.js +116 -115
  32. package/dist/core/handler.js.map +1 -1
  33. package/dist/data.d.ts +2 -2
  34. package/dist/data.js +60 -60
  35. package/dist/geo-service.js +78 -78
  36. package/dist/get-tsconfig-info.js +4 -4
  37. package/dist/index.d.ts +8 -8
  38. package/dist/index.js +6 -6
  39. package/dist/providers/events/helpers.d.ts +2 -2
  40. package/dist/providers/events/helpers.d.ts.map +1 -1
  41. package/dist/providers/events/helpers.js +178 -154
  42. package/dist/providers/events/helpers.js.map +1 -1
  43. package/dist/public/assets/{main-BDJUrMKx.js → main-BeCk6LUx.js} +133 -133
  44. package/dist/public/assets/main-w2bJSKlF.css +1 -0
  45. package/dist/public/index.html +2 -2
  46. package/dist/routes/api-router.d.ts +3 -1
  47. package/dist/routes/api-router.d.ts.map +1 -1
  48. package/dist/routes/api-router.js +3 -3
  49. package/dist/routes/api-router.js.map +1 -1
  50. package/dist/routes.d.ts +6 -4
  51. package/dist/routes.d.ts.map +1 -1
  52. package/dist/routes.js +1333 -1277
  53. package/dist/routes.js.map +1 -1
  54. package/dist/studio.d.ts +3 -3
  55. package/dist/studio.d.ts.map +1 -1
  56. package/dist/studio.js +64 -65
  57. package/dist/studio.js.map +1 -1
  58. package/dist/types/events.d.ts +8 -7
  59. package/dist/types/events.d.ts.map +1 -1
  60. package/dist/types/events.js +165 -165
  61. package/dist/types/events.js.map +1 -1
  62. package/dist/types/handler.d.ts +14 -4
  63. package/dist/types/handler.d.ts.map +1 -1
  64. package/dist/types/handler.js.map +1 -1
  65. package/dist/utils/auth-callbacks-injector.d.ts +2 -2
  66. package/dist/utils/auth-callbacks-injector.js +27 -27
  67. package/dist/utils/auth-callbacks-wrapper.d.ts +3 -3
  68. package/dist/utils/auth-callbacks-wrapper.js +117 -107
  69. package/dist/utils/database-detection.d.ts +1 -1
  70. package/dist/utils/database-detection.js +44 -44
  71. package/dist/utils/database-hook-injector.d.ts +3 -3
  72. package/dist/utils/database-hook-injector.js +135 -131
  73. package/dist/utils/email-otp-hooks-injector.d.ts +28 -12
  74. package/dist/utils/email-otp-hooks-injector.js +104 -97
  75. package/dist/utils/event-ingestion.d.ts +5 -5
  76. package/dist/utils/event-ingestion.d.ts.map +1 -1
  77. package/dist/utils/event-ingestion.js +32 -12
  78. package/dist/utils/event-ingestion.js.map +1 -1
  79. package/dist/utils/hook-injector.d.ts +2 -2
  80. package/dist/utils/hook-injector.js +199 -199
  81. package/dist/utils/hook-injector.js.map +1 -1
  82. package/dist/utils/html-injector.d.ts +11 -2
  83. package/dist/utils/html-injector.d.ts.map +1 -1
  84. package/dist/utils/html-injector.js +40 -39
  85. package/dist/utils/html-injector.js.map +1 -1
  86. package/dist/utils/org-hooks-injector.d.ts +3 -3
  87. package/dist/utils/org-hooks-injector.js +63 -63
  88. package/dist/utils/org-hooks-wrapper.d.ts +41 -35
  89. package/dist/utils/org-hooks-wrapper.js +778 -658
  90. package/dist/utils/organization-hooks-wrapper.d.ts +23 -17
  91. package/dist/utils/organization-hooks-wrapper.js +325 -277
  92. package/dist/utils/package-json.js +11 -11
  93. package/dist/utils/paths.js +1 -1
  94. package/dist/utils/server-init.d.ts +1 -1
  95. package/dist/utils/server-init.js +25 -25
  96. package/dist/utils/session.d.ts +0 -1
  97. package/dist/utils/session.d.ts.map +1 -1
  98. package/dist/utils/session.js +19 -12
  99. package/dist/utils/session.js.map +1 -1
  100. package/dist/utils.js +24 -24
  101. package/package.json +56 -47
  102. package/public/assets/{main-BDJUrMKx.js → main-BeCk6LUx.js} +133 -133
  103. package/public/assets/main-w2bJSKlF.css +1 -0
  104. package/public/index.html +2 -2
  105. package/scripts/download-geolite2.js +8 -8
  106. package/scripts/generate-default-db.js +324 -324
  107. package/scripts/postinstall.js +25 -25
  108. package/dist/public/assets/main-CBA9bZ-w.css +0 -1
  109. package/public/assets/main-CBA9bZ-w.css +0 -1
@@ -1,3 +1,3 @@
1
- import type { StudioConfig } from '../types/handler.js';
2
- export declare function wrapAuthCallbacks(auth: any, eventsConfig: StudioConfig['events']): void;
1
+ import type { StudioConfig } from "../types/handler.js";
2
+ export declare function wrapAuthCallbacks(auth: any, eventsConfig: StudioConfig["events"]): void;
3
3
  //# sourceMappingURL=auth-callbacks-injector.d.ts.map
@@ -1,4 +1,4 @@
1
- import { emitEvent } from './event-ingestion.js';
1
+ import { emitEvent } from "./event-ingestion.js";
2
2
  /**
3
3
  * Helper to extract request info from Better Auth request object
4
4
  */
@@ -12,18 +12,18 @@ function getRequestInfo(request) {
12
12
  headersObj[key] = value;
13
13
  });
14
14
  ip =
15
- request.headers.get('x-forwarded-for') || request.headers.get('x-real-ip') || undefined;
15
+ request.headers.get("x-forwarded-for") || request.headers.get("x-real-ip") || undefined;
16
16
  }
17
17
  else if (request.headers) {
18
- if (typeof request.headers.get === 'function') {
18
+ if (typeof request.headers.get === "function") {
19
19
  ip =
20
- request.headers.get('x-forwarded-for') || request.headers.get('x-real-ip') || undefined;
20
+ request.headers.get("x-forwarded-for") || request.headers.get("x-real-ip") || undefined;
21
21
  request.headers.forEach?.((value, key) => {
22
22
  headersObj[key] = value;
23
23
  });
24
24
  }
25
25
  else {
26
- ip = request.headers['x-forwarded-for'] || request.headers['x-real-ip'] || undefined;
26
+ ip = request.headers["x-forwarded-for"] || request.headers["x-real-ip"] || undefined;
27
27
  Object.entries(request.headers).forEach(([key, value]) => {
28
28
  headersObj[key] = String(value);
29
29
  });
@@ -53,7 +53,7 @@ export function wrapAuthCallbacks(auth, eventsConfig) {
53
53
  const data = eventData(args);
54
54
  const requestInfo = getRequestInfo(args[args.length - 1]);
55
55
  emitEvent(eventType, {
56
- status: 'success',
56
+ status: "success",
57
57
  ...data,
58
58
  request: requestInfo,
59
59
  }, capturedConfig).catch(() => { });
@@ -62,7 +62,7 @@ export function wrapAuthCallbacks(auth, eventsConfig) {
62
62
  const deleteUserConfig = auth.options?.user?.deleteUser || auth.user?.deleteUser;
63
63
  if (deleteUserConfig && !deleteUserConfig.__studio_wrapped) {
64
64
  const originalSendDeleteVerification = deleteUserConfig.sendDeleteAccountVerification;
65
- deleteUserConfig.sendDeleteAccountVerification = wrapCallback(originalSendDeleteVerification, 'user.delete_verification_requested', (args) => {
65
+ deleteUserConfig.sendDeleteAccountVerification = wrapCallback(originalSendDeleteVerification, "user.delete_verification_requested", (args) => {
66
66
  const data = args[0];
67
67
  const user = data?.user;
68
68
  return {
@@ -76,7 +76,7 @@ export function wrapAuthCallbacks(auth, eventsConfig) {
76
76
  });
77
77
  // Wrap afterDelete callback
78
78
  const originalAfterDelete = deleteUserConfig.afterDelete;
79
- deleteUserConfig.afterDelete = wrapCallback(originalAfterDelete, 'user.deleted', (args) => {
79
+ deleteUserConfig.afterDelete = wrapCallback(originalAfterDelete, "user.deleted", (args) => {
80
80
  const user = args[0];
81
81
  return {
82
82
  userId: user?.id,
@@ -91,7 +91,7 @@ export function wrapAuthCallbacks(auth, eventsConfig) {
91
91
  const emailVerificationConfig = auth.options?.emailVerification || auth.emailVerification;
92
92
  if (emailVerificationConfig && !emailVerificationConfig.__studio_wrapped) {
93
93
  const originalOnEmailVerification = emailVerificationConfig.onEmailVerification;
94
- emailVerificationConfig.onEmailVerification = wrapCallback(originalOnEmailVerification, 'user.email_verified', (args) => {
94
+ emailVerificationConfig.onEmailVerification = wrapCallback(originalOnEmailVerification, "user.email_verified", (args) => {
95
95
  const user = args[0];
96
96
  return {
97
97
  userId: user?.id,
@@ -107,7 +107,7 @@ export function wrapAuthCallbacks(auth, eventsConfig) {
107
107
  const emailAndPasswordConfig = auth.options?.emailAndPassword || auth.emailAndPassword;
108
108
  if (emailAndPasswordConfig && !emailAndPasswordConfig.__studio_wrapped) {
109
109
  const originalOnPasswordChange = emailAndPasswordConfig.onPasswordChange;
110
- emailAndPasswordConfig.onPasswordChange = wrapCallback(originalOnPasswordChange, 'user.password_changed', (args) => {
110
+ emailAndPasswordConfig.onPasswordChange = wrapCallback(originalOnPasswordChange, "user.password_changed", (args) => {
111
111
  const data = args[0];
112
112
  return {
113
113
  userId: data?.user?.id,
@@ -129,15 +129,15 @@ export function wrapAuthCallbacks(auth, eventsConfig) {
129
129
  // Mark this email as using token-based reset
130
130
  const email = data?.user?.email?.toLowerCase();
131
131
  if (email) {
132
- passwordResetMethod.set(email, 'token');
132
+ passwordResetMethod.set(email, "token");
133
133
  }
134
134
  const originalPromise = originalSendResetPassword(...args);
135
- const eventPromise = emitEvent('password.reset_requested', {
136
- status: 'success',
135
+ const eventPromise = emitEvent("password.reset_requested", {
136
+ status: "success",
137
137
  userId: data?.user?.id,
138
138
  metadata: {
139
139
  email: data?.user?.email,
140
- name: data?.user?.name || data?.user?.email || 'Someone',
140
+ name: data?.user?.name || data?.user?.email || "Someone",
141
141
  requestedAt: new Date().toISOString(),
142
142
  },
143
143
  request: requestInfo,
@@ -156,43 +156,43 @@ export function wrapAuthCallbacks(auth, eventsConfig) {
156
156
  const requestInfo = getRequestInfo(request);
157
157
  const userEmail = data?.user?.email?.toLowerCase();
158
158
  const method = userEmail ? passwordResetMethod.get(userEmail) : undefined;
159
- const isOtpReset = method === 'otp';
159
+ const isOtpReset = method === "otp";
160
160
  if (userEmail) {
161
161
  passwordResetMethod.delete(userEmail);
162
162
  }
163
- const eventType = isOtpReset ? 'password.reset_completed_otp' : 'password.reset_completed';
163
+ const eventType = isOtpReset ? "password.reset_completed_otp" : "password.reset_completed";
164
164
  emitEvent(eventType, {
165
- status: 'success',
165
+ status: "success",
166
166
  userId: data?.user?.id,
167
167
  metadata: {
168
168
  email: data?.user?.email,
169
- name: data?.user?.name || data?.user?.email || 'Someone',
169
+ name: data?.user?.name || data?.user?.email || "Someone",
170
170
  resetAt: new Date().toISOString(),
171
- method: isOtpReset ? 'email_otp' : 'token',
171
+ method: isOtpReset ? "email_otp" : "token",
172
172
  },
173
173
  request: requestInfo,
174
174
  }, capturedConfig).catch(() => { });
175
175
  };
176
176
  emailAndPasswordConfig.__studio_wrapped = true;
177
177
  }
178
- const emailOtpPlugin = auth.options?.plugins?.find((p) => p?.id === 'email-otp');
178
+ const emailOtpPlugin = auth.options?.plugins?.find((p) => p?.id === "email-otp");
179
179
  // TODO: Fix email-otp sendVerificationOTP callback wrapping because of plugin closure
180
180
  if (emailOtpPlugin && !emailOtpPlugin.__studio_wrapped) {
181
181
  const originalSendVerificationOTP = emailOtpPlugin.options?.sendVerificationOTP;
182
182
  if (originalSendVerificationOTP) {
183
183
  const wrappedSendVerificationOTP = async (data, ctx) => {
184
184
  const requestInfo = getRequestInfo(ctx?.request || ctx);
185
- if (data.type === 'forget-password') {
185
+ if (data.type === "forget-password") {
186
186
  const email = data.email.toLowerCase();
187
- passwordResetMethod.set(email, 'otp');
187
+ passwordResetMethod.set(email, "otp");
188
188
  }
189
189
  const originalPromise = originalSendVerificationOTP(data, ctx);
190
- if (data.type === 'forget-password') {
191
- const eventPromise = emitEvent('password.reset_requested_otp', {
192
- status: 'success',
190
+ if (data.type === "forget-password") {
191
+ const eventPromise = emitEvent("password.reset_requested_otp", {
192
+ status: "success",
193
193
  metadata: {
194
194
  email: data.email,
195
- type: 'forget-password',
195
+ type: "forget-password",
196
196
  requestedAt: new Date().toISOString(),
197
197
  },
198
198
  request: requestInfo,
@@ -206,7 +206,7 @@ export function wrapAuthCallbacks(auth, eventsConfig) {
206
206
  };
207
207
  emailOtpPlugin.options.sendVerificationOTP = wrappedSendVerificationOTP;
208
208
  const originalInit = emailOtpPlugin.init;
209
- if (originalInit && typeof originalInit === 'function') {
209
+ if (originalInit && typeof originalInit === "function") {
210
210
  emailOtpPlugin.init = async (authInstance) => {
211
211
  emailOtpPlugin.options.sendVerificationOTP = wrappedSendVerificationOTP;
212
212
  await originalInit(authInstance);
@@ -1,7 +1,7 @@
1
- import type { StudioConfig } from '../types/handler.js';
1
+ import type { StudioConfig } from "../types/handler.js";
2
2
  /**
3
3
  * Wraps Better Auth callbacks to automatically emit events
4
4
  * This should be called during Better Auth initialization
5
5
  */
6
- export declare function wrapAuthCallbacks(auth: any, eventsConfig: StudioConfig['events']): void;
7
- //# sourceMappingURL=auth-callbacks-wrapper.d.ts.map
6
+ export declare function wrapAuthCallbacks(auth: any, eventsConfig: StudioConfig["events"]): void;
7
+ //# sourceMappingURL=auth-callbacks-wrapper.d.ts.map
@@ -1,123 +1,133 @@
1
- import { emitEvent } from './event-ingestion.js';
1
+ import { emitEvent } from "./event-ingestion.js";
2
2
  /**
3
3
  * Helper to extract request info from Better Auth request object
4
4
  */
5
5
  function getRequestInfo(request) {
6
- const headersObj = {};
7
- let ip;
8
- if (request) {
9
- try {
10
- if (request instanceof Request) {
11
- // Standard Request object
12
- request.headers.forEach((value, key) => {
13
- headersObj[key] = value;
14
- });
15
- ip = request.headers.get('x-forwarded-for') || request.headers.get('x-real-ip') || undefined;
16
- }
17
- else if (request.headers) {
18
- // Object with headers property
19
- if (typeof request.headers.get === 'function') {
20
- ip = request.headers.get('x-forwarded-for') || request.headers.get('x-real-ip') || undefined;
21
- request.headers.forEach?.((value, key) => {
22
- headersObj[key] = value;
23
- });
24
- }
25
- else {
26
- ip = request.headers['x-forwarded-for'] || request.headers['x-real-ip'] || undefined;
27
- Object.entries(request.headers).forEach(([key, value]) => {
28
- headersObj[key] = String(value);
29
- });
30
- }
31
- }
32
- }
33
- catch (e) {
34
- // Ignore errors
6
+ const headersObj = {};
7
+ let ip;
8
+ if (request) {
9
+ try {
10
+ if (request instanceof Request) {
11
+ // Standard Request object
12
+ request.headers.forEach((value, key) => {
13
+ headersObj[key] = value;
14
+ });
15
+ ip =
16
+ request.headers.get("x-forwarded-for") || request.headers.get("x-real-ip") || undefined;
17
+ } else if (request.headers) {
18
+ // Object with headers property
19
+ if (typeof request.headers.get === "function") {
20
+ ip =
21
+ request.headers.get("x-forwarded-for") || request.headers.get("x-real-ip") || undefined;
22
+ request.headers.forEach?.((value, key) => {
23
+ headersObj[key] = value;
24
+ });
25
+ } else {
26
+ ip = request.headers["x-forwarded-for"] || request.headers["x-real-ip"] || undefined;
27
+ Object.entries(request.headers).forEach(([key, value]) => {
28
+ headersObj[key] = String(value);
29
+ });
35
30
  }
31
+ }
32
+ } catch (e) {
33
+ // Ignore errors
36
34
  }
37
- return { headers: headersObj, ip };
35
+ }
36
+ return { headers: headersObj, ip };
38
37
  }
39
38
  /**
40
39
  * Wraps Better Auth callbacks to automatically emit events
41
40
  * This should be called during Better Auth initialization
42
41
  */
43
42
  export function wrapAuthCallbacks(auth, eventsConfig) {
44
- if (!auth || !eventsConfig?.enabled) {
45
- return;
46
- }
47
- try {
48
- const capturedConfig = eventsConfig;
49
- // Helper to wrap a callback function
50
- const wrapCallback = (originalCallback, eventType, eventData) => {
51
- return (async (...args) => {
52
- // Call original callback if it exists
53
- if (originalCallback) {
54
- await originalCallback(...args);
55
- }
56
- // Emit event
57
- const data = eventData(args);
58
- const requestInfo = getRequestInfo(args[args.length - 1]); // Last arg is usually request
59
- emitEvent(eventType, {
60
- status: 'success',
61
- ...data,
62
- request: requestInfo,
63
- }, capturedConfig).catch(() => { });
64
- });
65
- };
66
- // Wrap user.deleteUser.afterDelete callback
67
- // Check multiple possible locations
68
- const deleteUserConfig = auth.options?.user?.deleteUser || auth.user?.deleteUser;
69
- if (deleteUserConfig && !deleteUserConfig.__studio_wrapped) {
70
- const originalAfterDelete = deleteUserConfig.afterDelete;
71
- deleteUserConfig.afterDelete = wrapCallback(originalAfterDelete, 'user.deleted', (args) => {
72
- const user = args[0];
73
- return {
74
- userId: user?.id,
75
- metadata: {
76
- email: user?.email,
77
- name: user?.name,
78
- },
79
- };
80
- });
81
- deleteUserConfig.__studio_wrapped = true;
82
- }
83
- // Wrap emailVerification.onEmailVerification callback
84
- const emailVerificationConfig = auth.options?.emailVerification || auth.emailVerification;
85
- if (emailVerificationConfig && !emailVerificationConfig.__studio_wrapped) {
86
- const originalOnEmailVerification = emailVerificationConfig.onEmailVerification;
87
- emailVerificationConfig.onEmailVerification = wrapCallback(originalOnEmailVerification, 'user.email_verified', (args) => {
88
- const user = args[0];
89
- return {
90
- userId: user?.id,
91
- metadata: {
92
- email: user?.email,
93
- name: user?.name,
94
- verifiedAt: new Date().toISOString(),
95
- },
96
- };
97
- });
98
- emailVerificationConfig.__studio_wrapped = true;
99
- }
100
- // Wrap emailAndPassword.onPasswordChange callback
101
- const emailAndPasswordConfig = auth.options?.emailAndPassword || auth.emailAndPassword;
102
- if (emailAndPasswordConfig && !emailAndPasswordConfig.__studio_wrapped) {
103
- const originalOnPasswordChange = emailAndPasswordConfig.onPasswordChange;
104
- emailAndPasswordConfig.onPasswordChange = wrapCallback(originalOnPasswordChange, 'user.password_changed', (args) => {
105
- const data = args[0];
106
- return {
107
- userId: data?.user?.id,
108
- metadata: {
109
- email: data?.user?.email,
110
- name: data?.user?.name,
111
- revokeOtherSessions: data?.revokeOtherSessions || false,
112
- changedAt: new Date().toISOString(),
113
- },
114
- };
115
- });
116
- emailAndPasswordConfig.__studio_wrapped = true;
43
+ if (!auth || !eventsConfig?.enabled) {
44
+ return;
45
+ }
46
+ try {
47
+ const capturedConfig = eventsConfig;
48
+ // Helper to wrap a callback function
49
+ const wrapCallback = (originalCallback, eventType, eventData) => {
50
+ return async (...args) => {
51
+ // Call original callback if it exists
52
+ if (originalCallback) {
53
+ await originalCallback(...args);
117
54
  }
55
+ // Emit event
56
+ const data = eventData(args);
57
+ const requestInfo = getRequestInfo(args[args.length - 1]); // Last arg is usually request
58
+ emitEvent(
59
+ eventType,
60
+ {
61
+ status: "success",
62
+ ...data,
63
+ request: requestInfo,
64
+ },
65
+ capturedConfig,
66
+ ).catch(() => {});
67
+ };
68
+ };
69
+ // Wrap user.deleteUser.afterDelete callback
70
+ // Check multiple possible locations
71
+ const deleteUserConfig = auth.options?.user?.deleteUser || auth.user?.deleteUser;
72
+ if (deleteUserConfig && !deleteUserConfig.__studio_wrapped) {
73
+ const originalAfterDelete = deleteUserConfig.afterDelete;
74
+ deleteUserConfig.afterDelete = wrapCallback(originalAfterDelete, "user.deleted", (args) => {
75
+ const user = args[0];
76
+ return {
77
+ userId: user?.id,
78
+ metadata: {
79
+ email: user?.email,
80
+ name: user?.name,
81
+ },
82
+ };
83
+ });
84
+ deleteUserConfig.__studio_wrapped = true;
85
+ }
86
+ // Wrap emailVerification.onEmailVerification callback
87
+ const emailVerificationConfig = auth.options?.emailVerification || auth.emailVerification;
88
+ if (emailVerificationConfig && !emailVerificationConfig.__studio_wrapped) {
89
+ const originalOnEmailVerification = emailVerificationConfig.onEmailVerification;
90
+ emailVerificationConfig.onEmailVerification = wrapCallback(
91
+ originalOnEmailVerification,
92
+ "user.email_verified",
93
+ (args) => {
94
+ const user = args[0];
95
+ return {
96
+ userId: user?.id,
97
+ metadata: {
98
+ email: user?.email,
99
+ name: user?.name,
100
+ verifiedAt: new Date().toISOString(),
101
+ },
102
+ };
103
+ },
104
+ );
105
+ emailVerificationConfig.__studio_wrapped = true;
118
106
  }
119
- catch (error) {
120
- console.error('[Auth Callbacks] Failed to wrap callbacks:', error);
107
+ // Wrap emailAndPassword.onPasswordChange callback
108
+ const emailAndPasswordConfig = auth.options?.emailAndPassword || auth.emailAndPassword;
109
+ if (emailAndPasswordConfig && !emailAndPasswordConfig.__studio_wrapped) {
110
+ const originalOnPasswordChange = emailAndPasswordConfig.onPasswordChange;
111
+ emailAndPasswordConfig.onPasswordChange = wrapCallback(
112
+ originalOnPasswordChange,
113
+ "user.password_changed",
114
+ (args) => {
115
+ const data = args[0];
116
+ return {
117
+ userId: data?.user?.id,
118
+ metadata: {
119
+ email: data?.user?.email,
120
+ name: data?.user?.name,
121
+ revokeOtherSessions: data?.revokeOtherSessions || false,
122
+ changedAt: new Date().toISOString(),
123
+ },
124
+ };
125
+ },
126
+ );
127
+ emailAndPasswordConfig.__studio_wrapped = true;
121
128
  }
129
+ } catch (error) {
130
+ console.error("[Auth Callbacks] Failed to wrap callbacks:", error);
131
+ }
122
132
  }
123
- //# sourceMappingURL=auth-callbacks-wrapper.js.map
133
+ //# sourceMappingURL=auth-callbacks-wrapper.js.map
@@ -1,4 +1,4 @@
1
- import type { DatabaseDetectionResult, DetectionInfo } from '../types';
1
+ import type { DatabaseDetectionResult, DetectionInfo } from "../types";
2
2
  /**
3
3
  * Detect database type and version from installed packages
4
4
  * @param cwd - Current working directory to search in
@@ -1,23 +1,23 @@
1
- import { getPackageVersion } from './package-json.js';
1
+ import { getPackageVersion } from "./package-json.js";
2
2
  const DATABASES = {
3
- 'drizzle-orm': 'drizzle',
4
- '@prisma/client': 'prisma',
5
- mongoose: 'mongodb',
6
- mongodb: 'mongodb',
7
- pg: 'postgresql',
8
- mysql: 'mysql',
9
- mariadb: 'mariadb',
10
- sqlite3: 'sqlite',
11
- 'better-sqlite3': 'sqlite',
3
+ "drizzle-orm": "drizzle",
4
+ "@prisma/client": "prisma",
5
+ mongoose: "mongodb",
6
+ mongodb: "mongodb",
7
+ pg: "postgresql",
8
+ mysql: "mysql",
9
+ mariadb: "mariadb",
10
+ sqlite3: "sqlite",
11
+ "better-sqlite3": "sqlite",
12
12
  };
13
13
  const _DATABASE_DIALECTS = {
14
- postgresql: ['pg', 'postgres'],
15
- mysql: ['mysql', 'mysql2'],
16
- mariadb: ['mariadb'],
17
- sqlite: ['sqlite3', 'better-sqlite3'],
18
- prisma: ['@prisma/client'],
19
- mongodb: ['mongoose', 'mongodb'],
20
- drizzle: ['drizzle-orm'],
14
+ postgresql: ["pg", "postgres"],
15
+ mysql: ["mysql", "mysql2"],
16
+ mariadb: ["mariadb"],
17
+ sqlite: ["sqlite3", "better-sqlite3"],
18
+ prisma: ["@prisma/client"],
19
+ mongodb: ["mongoose", "mongodb"],
20
+ drizzle: ["drizzle-orm"],
21
21
  };
22
22
  /**
23
23
  * Detect database type and version from installed packages
@@ -44,39 +44,39 @@ export async function detectDatabaseWithDialect(cwd) {
44
44
  let dialect = detection.name;
45
45
  let adapter = detection.name;
46
46
  switch (detection.name) {
47
- case 'postgresql':
48
- dialect = 'postgresql';
49
- adapter = 'pg';
47
+ case "postgresql":
48
+ dialect = "postgresql";
49
+ adapter = "pg";
50
50
  break;
51
- case 'mysql':
52
- dialect = 'mysql';
53
- adapter = 'mysql2';
51
+ case "mysql":
52
+ dialect = "mysql";
53
+ adapter = "mysql2";
54
54
  break;
55
- case 'sqlite': {
56
- const sqlite3Version = await getPackageVersion('sqlite3', cwd);
57
- const betterSqlite3Version = await getPackageVersion('better-sqlite3', cwd);
55
+ case "sqlite": {
56
+ const sqlite3Version = await getPackageVersion("sqlite3", cwd);
57
+ const betterSqlite3Version = await getPackageVersion("better-sqlite3", cwd);
58
58
  if (betterSqlite3Version) {
59
- adapter = 'better-sqlite3';
59
+ adapter = "better-sqlite3";
60
60
  }
61
61
  else if (sqlite3Version) {
62
- adapter = 'sqlite3';
62
+ adapter = "sqlite3";
63
63
  }
64
64
  break;
65
65
  }
66
- case 'prisma': {
66
+ case "prisma": {
67
67
  const prismaDialect = await detectPrismaDialect(cwd);
68
68
  if (prismaDialect) {
69
69
  dialect = prismaDialect;
70
70
  }
71
- adapter = 'prisma';
71
+ adapter = "prisma";
72
72
  break;
73
73
  }
74
- case 'drizzle': {
74
+ case "drizzle": {
75
75
  const drizzleDialect = await detectDrizzleDialect(cwd);
76
76
  if (drizzleDialect) {
77
77
  dialect = drizzleDialect;
78
78
  }
79
- adapter = 'drizzle';
79
+ adapter = "drizzle";
80
80
  break;
81
81
  }
82
82
  }
@@ -89,10 +89,10 @@ export async function detectDatabaseWithDialect(cwd) {
89
89
  }
90
90
  async function detectPrismaDialect(cwd) {
91
91
  const drivers = [
92
- { pkg: 'pg', dialect: 'postgresql' },
93
- { pkg: 'mysql2', dialect: 'mysql' },
94
- { pkg: 'sqlite3', dialect: 'sqlite' },
95
- { pkg: 'better-sqlite3', dialect: 'sqlite' },
92
+ { pkg: "pg", dialect: "postgresql" },
93
+ { pkg: "mysql2", dialect: "mysql" },
94
+ { pkg: "sqlite3", dialect: "sqlite" },
95
+ { pkg: "better-sqlite3", dialect: "sqlite" },
96
96
  ];
97
97
  for (const { pkg, dialect } of drivers) {
98
98
  const version = await getPackageVersion(pkg, cwd);
@@ -103,14 +103,14 @@ async function detectPrismaDialect(cwd) {
103
103
  }
104
104
  async function detectDrizzleDialect(cwd) {
105
105
  const drizzleDrivers = [
106
- { pkg: 'drizzle-orm/postgres-js', dialect: 'postgresql' },
107
- { pkg: 'drizzle-orm/node-postgres', dialect: 'postgresql' },
108
- { pkg: 'drizzle-orm/mysql2', dialect: 'mysql' },
109
- { pkg: 'drizzle-orm/better-sqlite3', dialect: 'sqlite' },
110
- { pkg: 'drizzle-orm/libsql', dialect: 'sqlite' },
111
- { pkg: 'postgres', dialect: 'postgresql' },
112
- { pkg: 'mysql2', dialect: 'mysql' },
113
- { pkg: 'better-sqlite3', dialect: 'sqlite' },
106
+ { pkg: "drizzle-orm/postgres-js", dialect: "postgresql" },
107
+ { pkg: "drizzle-orm/node-postgres", dialect: "postgresql" },
108
+ { pkg: "drizzle-orm/mysql2", dialect: "mysql" },
109
+ { pkg: "drizzle-orm/better-sqlite3", dialect: "sqlite" },
110
+ { pkg: "drizzle-orm/libsql", dialect: "sqlite" },
111
+ { pkg: "postgres", dialect: "postgresql" },
112
+ { pkg: "mysql2", dialect: "mysql" },
113
+ { pkg: "better-sqlite3", dialect: "sqlite" },
114
114
  ];
115
115
  for (const { pkg, dialect } of drizzleDrivers) {
116
116
  try {
@@ -1,3 +1,3 @@
1
- import type { StudioConfig } from '../types/handler.js';
2
- export declare function wrapDatabaseHooks(auth: any, eventsConfig: StudioConfig['events']): void;
3
- //# sourceMappingURL=database-hook-injector.d.ts.map
1
+ import type { StudioConfig } from "../types/handler.js";
2
+ export declare function wrapDatabaseHooks(auth: any, eventsConfig: StudioConfig["events"]): void;
3
+ //# sourceMappingURL=database-hook-injector.d.ts.map