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.
- package/README.md +48 -78
- package/data/default-geo.json +1 -1
- package/dist/adapters/astro.d.ts +1 -1
- package/dist/adapters/astro.js +13 -13
- package/dist/adapters/elysia.d.ts +2 -2
- package/dist/adapters/elysia.js +13 -13
- package/dist/adapters/express.d.ts +2 -2
- package/dist/adapters/express.js +4 -4
- package/dist/adapters/hono.d.ts +2 -2
- package/dist/adapters/hono.js +12 -12
- package/dist/adapters/nextjs.d.ts +1 -1
- package/dist/adapters/nextjs.js +10 -10
- package/dist/adapters/nuxt.d.ts +1 -1
- package/dist/adapters/nuxt.js +22 -22
- package/dist/adapters/remix.d.ts +1 -1
- package/dist/adapters/remix.js +13 -13
- package/dist/adapters/solid-start.d.ts +1 -1
- package/dist/adapters/solid-start.js +13 -13
- package/dist/adapters/svelte-kit.d.ts +2 -2
- package/dist/adapters/svelte-kit.js +13 -13
- package/dist/adapters/tanstack-start.d.ts +1 -1
- package/dist/adapters/tanstack-start.js +13 -13
- package/dist/add-svelte-kit-env-modules.js +11 -11
- package/dist/auth-adapter.d.ts +1 -1
- package/dist/auth-adapter.js +96 -96
- package/dist/cli/commands/init.js +57 -57
- package/dist/cli.js +75 -75
- package/dist/config.d.ts +5 -5
- package/dist/config.js +37 -37
- package/dist/core/handler.d.ts +1 -1
- package/dist/core/handler.js +116 -115
- package/dist/core/handler.js.map +1 -1
- package/dist/data.d.ts +2 -2
- package/dist/data.js +60 -60
- package/dist/geo-service.js +78 -78
- package/dist/get-tsconfig-info.js +4 -4
- package/dist/index.d.ts +8 -8
- package/dist/index.js +6 -6
- package/dist/providers/events/helpers.d.ts +2 -2
- package/dist/providers/events/helpers.d.ts.map +1 -1
- package/dist/providers/events/helpers.js +178 -154
- package/dist/providers/events/helpers.js.map +1 -1
- package/dist/public/assets/{main-BDJUrMKx.js → main-BeCk6LUx.js} +133 -133
- package/dist/public/assets/main-w2bJSKlF.css +1 -0
- package/dist/public/index.html +2 -2
- package/dist/routes/api-router.d.ts +3 -1
- package/dist/routes/api-router.d.ts.map +1 -1
- package/dist/routes/api-router.js +3 -3
- package/dist/routes/api-router.js.map +1 -1
- package/dist/routes.d.ts +6 -4
- package/dist/routes.d.ts.map +1 -1
- package/dist/routes.js +1333 -1277
- package/dist/routes.js.map +1 -1
- package/dist/studio.d.ts +3 -3
- package/dist/studio.d.ts.map +1 -1
- package/dist/studio.js +64 -65
- package/dist/studio.js.map +1 -1
- package/dist/types/events.d.ts +8 -7
- package/dist/types/events.d.ts.map +1 -1
- package/dist/types/events.js +165 -165
- package/dist/types/events.js.map +1 -1
- package/dist/types/handler.d.ts +14 -4
- package/dist/types/handler.d.ts.map +1 -1
- package/dist/types/handler.js.map +1 -1
- package/dist/utils/auth-callbacks-injector.d.ts +2 -2
- package/dist/utils/auth-callbacks-injector.js +27 -27
- package/dist/utils/auth-callbacks-wrapper.d.ts +3 -3
- package/dist/utils/auth-callbacks-wrapper.js +117 -107
- package/dist/utils/database-detection.d.ts +1 -1
- package/dist/utils/database-detection.js +44 -44
- package/dist/utils/database-hook-injector.d.ts +3 -3
- package/dist/utils/database-hook-injector.js +135 -131
- package/dist/utils/email-otp-hooks-injector.d.ts +28 -12
- package/dist/utils/email-otp-hooks-injector.js +104 -97
- package/dist/utils/event-ingestion.d.ts +5 -5
- package/dist/utils/event-ingestion.d.ts.map +1 -1
- package/dist/utils/event-ingestion.js +32 -12
- package/dist/utils/event-ingestion.js.map +1 -1
- package/dist/utils/hook-injector.d.ts +2 -2
- package/dist/utils/hook-injector.js +199 -199
- package/dist/utils/hook-injector.js.map +1 -1
- package/dist/utils/html-injector.d.ts +11 -2
- package/dist/utils/html-injector.d.ts.map +1 -1
- package/dist/utils/html-injector.js +40 -39
- package/dist/utils/html-injector.js.map +1 -1
- package/dist/utils/org-hooks-injector.d.ts +3 -3
- package/dist/utils/org-hooks-injector.js +63 -63
- package/dist/utils/org-hooks-wrapper.d.ts +41 -35
- package/dist/utils/org-hooks-wrapper.js +778 -658
- package/dist/utils/organization-hooks-wrapper.d.ts +23 -17
- package/dist/utils/organization-hooks-wrapper.js +325 -277
- package/dist/utils/package-json.js +11 -11
- package/dist/utils/paths.js +1 -1
- package/dist/utils/server-init.d.ts +1 -1
- package/dist/utils/server-init.js +25 -25
- package/dist/utils/session.d.ts +0 -1
- package/dist/utils/session.d.ts.map +1 -1
- package/dist/utils/session.js +19 -12
- package/dist/utils/session.js.map +1 -1
- package/dist/utils.js +24 -24
- package/package.json +56 -47
- package/public/assets/{main-BDJUrMKx.js → main-BeCk6LUx.js} +133 -133
- package/public/assets/main-w2bJSKlF.css +1 -0
- package/public/index.html +2 -2
- package/scripts/download-geolite2.js +8 -8
- package/scripts/generate-default-db.js +324 -324
- package/scripts/postinstall.js +25 -25
- package/dist/public/assets/main-CBA9bZ-w.css +0 -1
- package/public/assets/main-CBA9bZ-w.css +0 -1
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import type { StudioConfig } from
|
|
2
|
-
export declare function wrapAuthCallbacks(auth: any, eventsConfig: StudioConfig[
|
|
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
|
|
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(
|
|
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 ===
|
|
18
|
+
if (typeof request.headers.get === "function") {
|
|
19
19
|
ip =
|
|
20
|
-
request.headers.get(
|
|
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[
|
|
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:
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
132
|
+
passwordResetMethod.set(email, "token");
|
|
133
133
|
}
|
|
134
134
|
const originalPromise = originalSendResetPassword(...args);
|
|
135
|
-
const eventPromise = emitEvent(
|
|
136
|
-
status:
|
|
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 ||
|
|
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 ===
|
|
159
|
+
const isOtpReset = method === "otp";
|
|
160
160
|
if (userEmail) {
|
|
161
161
|
passwordResetMethod.delete(userEmail);
|
|
162
162
|
}
|
|
163
|
-
const eventType = isOtpReset ?
|
|
163
|
+
const eventType = isOtpReset ? "password.reset_completed_otp" : "password.reset_completed";
|
|
164
164
|
emitEvent(eventType, {
|
|
165
|
-
status:
|
|
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 ||
|
|
169
|
+
name: data?.user?.name || data?.user?.email || "Someone",
|
|
170
170
|
resetAt: new Date().toISOString(),
|
|
171
|
-
method: isOtpReset ?
|
|
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 ===
|
|
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 ===
|
|
185
|
+
if (data.type === "forget-password") {
|
|
186
186
|
const email = data.email.toLowerCase();
|
|
187
|
-
passwordResetMethod.set(email,
|
|
187
|
+
passwordResetMethod.set(email, "otp");
|
|
188
188
|
}
|
|
189
189
|
const originalPromise = originalSendVerificationOTP(data, ctx);
|
|
190
|
-
if (data.type ===
|
|
191
|
-
const eventPromise = emitEvent(
|
|
192
|
-
status:
|
|
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:
|
|
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 ===
|
|
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
|
|
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[
|
|
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
|
|
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
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
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
|
-
|
|
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
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
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
|
-
|
|
120
|
-
|
|
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,23 +1,23 @@
|
|
|
1
|
-
import { getPackageVersion } from
|
|
1
|
+
import { getPackageVersion } from "./package-json.js";
|
|
2
2
|
const DATABASES = {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
mongoose:
|
|
6
|
-
mongodb:
|
|
7
|
-
pg:
|
|
8
|
-
mysql:
|
|
9
|
-
mariadb:
|
|
10
|
-
sqlite3:
|
|
11
|
-
|
|
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: [
|
|
15
|
-
mysql: [
|
|
16
|
-
mariadb: [
|
|
17
|
-
sqlite: [
|
|
18
|
-
prisma: [
|
|
19
|
-
mongodb: [
|
|
20
|
-
drizzle: [
|
|
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
|
|
48
|
-
dialect =
|
|
49
|
-
adapter =
|
|
47
|
+
case "postgresql":
|
|
48
|
+
dialect = "postgresql";
|
|
49
|
+
adapter = "pg";
|
|
50
50
|
break;
|
|
51
|
-
case
|
|
52
|
-
dialect =
|
|
53
|
-
adapter =
|
|
51
|
+
case "mysql":
|
|
52
|
+
dialect = "mysql";
|
|
53
|
+
adapter = "mysql2";
|
|
54
54
|
break;
|
|
55
|
-
case
|
|
56
|
-
const sqlite3Version = await getPackageVersion(
|
|
57
|
-
const betterSqlite3Version = await getPackageVersion(
|
|
55
|
+
case "sqlite": {
|
|
56
|
+
const sqlite3Version = await getPackageVersion("sqlite3", cwd);
|
|
57
|
+
const betterSqlite3Version = await getPackageVersion("better-sqlite3", cwd);
|
|
58
58
|
if (betterSqlite3Version) {
|
|
59
|
-
adapter =
|
|
59
|
+
adapter = "better-sqlite3";
|
|
60
60
|
}
|
|
61
61
|
else if (sqlite3Version) {
|
|
62
|
-
adapter =
|
|
62
|
+
adapter = "sqlite3";
|
|
63
63
|
}
|
|
64
64
|
break;
|
|
65
65
|
}
|
|
66
|
-
case
|
|
66
|
+
case "prisma": {
|
|
67
67
|
const prismaDialect = await detectPrismaDialect(cwd);
|
|
68
68
|
if (prismaDialect) {
|
|
69
69
|
dialect = prismaDialect;
|
|
70
70
|
}
|
|
71
|
-
adapter =
|
|
71
|
+
adapter = "prisma";
|
|
72
72
|
break;
|
|
73
73
|
}
|
|
74
|
-
case
|
|
74
|
+
case "drizzle": {
|
|
75
75
|
const drizzleDialect = await detectDrizzleDialect(cwd);
|
|
76
76
|
if (drizzleDialect) {
|
|
77
77
|
dialect = drizzleDialect;
|
|
78
78
|
}
|
|
79
|
-
adapter =
|
|
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:
|
|
93
|
-
{ pkg:
|
|
94
|
-
{ pkg:
|
|
95
|
-
{ pkg:
|
|
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:
|
|
107
|
-
{ pkg:
|
|
108
|
-
{ pkg:
|
|
109
|
-
{ pkg:
|
|
110
|
-
{ pkg:
|
|
111
|
-
{ pkg:
|
|
112
|
-
{ pkg:
|
|
113
|
-
{ pkg:
|
|
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
|
|
2
|
-
export declare function wrapDatabaseHooks(auth: any, eventsConfig: StudioConfig[
|
|
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
|