better-auth-studio 1.1.1-beta.4 → 1.1.1-beta.6

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 (78) hide show
  1. package/dist/adapters/hono.d.ts.map +1 -1
  2. package/dist/adapters/hono.js +5 -0
  3. package/dist/adapters/hono.js.map +1 -1
  4. package/dist/config.d.ts.map +1 -1
  5. package/dist/config.js.map +1 -1
  6. package/dist/core/handler.d.ts.map +1 -1
  7. package/dist/core/handler.js +85 -4
  8. package/dist/core/handler.js.map +1 -1
  9. package/dist/index.d.ts +4 -0
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.js +3 -0
  12. package/dist/index.js.map +1 -1
  13. package/dist/providers/events/helpers.d.ts +22 -0
  14. package/dist/providers/events/helpers.d.ts.map +1 -0
  15. package/dist/providers/events/helpers.js +874 -0
  16. package/dist/providers/events/helpers.js.map +1 -0
  17. package/dist/public/assets/main-RoeYO1I-.css +1 -0
  18. package/dist/public/assets/{main-BDwnIMk3.js → main-wiXkwSx1.js} +82 -82
  19. package/dist/public/index.html +2 -2
  20. package/dist/routes.d.ts.map +1 -1
  21. package/dist/routes.js +181 -0
  22. package/dist/routes.js.map +1 -1
  23. package/dist/studio.d.ts.map +1 -1
  24. package/dist/studio.js +78 -2
  25. package/dist/studio.js.map +1 -1
  26. package/dist/types/events.d.ts +43 -0
  27. package/dist/types/events.d.ts.map +1 -0
  28. package/dist/types/events.js +306 -0
  29. package/dist/types/events.js.map +1 -0
  30. package/dist/types/handler.d.ts +31 -0
  31. package/dist/types/handler.d.ts.map +1 -1
  32. package/dist/types/handler.js.map +1 -1
  33. package/dist/utils/auth-callbacks-injector.d.ts +3 -0
  34. package/dist/utils/auth-callbacks-injector.d.ts.map +1 -0
  35. package/dist/utils/auth-callbacks-injector.js +225 -0
  36. package/dist/utils/auth-callbacks-injector.js.map +1 -0
  37. package/dist/utils/auth-callbacks-wrapper.d.ts +7 -0
  38. package/dist/utils/auth-callbacks-wrapper.d.ts.map +1 -0
  39. package/dist/utils/auth-callbacks-wrapper.js +123 -0
  40. package/dist/utils/auth-callbacks-wrapper.js.map +1 -0
  41. package/dist/utils/database-hook-injector.d.ts +3 -0
  42. package/dist/utils/database-hook-injector.d.ts.map +1 -0
  43. package/dist/utils/database-hook-injector.js +141 -0
  44. package/dist/utils/database-hook-injector.js.map +1 -0
  45. package/dist/utils/email-otp-hooks-injector.d.ts +29 -0
  46. package/dist/utils/email-otp-hooks-injector.d.ts.map +1 -0
  47. package/dist/utils/email-otp-hooks-injector.js +134 -0
  48. package/dist/utils/email-otp-hooks-injector.js.map +1 -0
  49. package/dist/utils/event-ingestion.d.ts +38 -0
  50. package/dist/utils/event-ingestion.d.ts.map +1 -0
  51. package/dist/utils/event-ingestion.js +169 -0
  52. package/dist/utils/event-ingestion.js.map +1 -0
  53. package/dist/utils/hook-injector.d.ts +9 -0
  54. package/dist/utils/hook-injector.d.ts.map +1 -0
  55. package/dist/utils/hook-injector.js +592 -0
  56. package/dist/utils/hook-injector.js.map +1 -0
  57. package/dist/utils/html-injector.d.ts +17 -0
  58. package/dist/utils/html-injector.d.ts.map +1 -1
  59. package/dist/utils/html-injector.js +15 -1
  60. package/dist/utils/html-injector.js.map +1 -1
  61. package/dist/utils/org-hooks-injector.d.ts +74 -0
  62. package/dist/utils/org-hooks-injector.d.ts.map +1 -0
  63. package/dist/utils/org-hooks-injector.js +648 -0
  64. package/dist/utils/org-hooks-injector.js.map +1 -0
  65. package/dist/utils/org-hooks-wrapper.d.ts +74 -0
  66. package/dist/utils/org-hooks-wrapper.d.ts.map +1 -0
  67. package/dist/utils/org-hooks-wrapper.js +687 -0
  68. package/dist/utils/org-hooks-wrapper.js.map +1 -0
  69. package/dist/utils/organization-hooks-wrapper.d.ts +38 -0
  70. package/dist/utils/organization-hooks-wrapper.d.ts.map +1 -0
  71. package/dist/utils/organization-hooks-wrapper.js +297 -0
  72. package/dist/utils/organization-hooks-wrapper.js.map +1 -0
  73. package/package.json +3 -3
  74. package/public/assets/main-RoeYO1I-.css +1 -0
  75. package/public/assets/{main-BDwnIMk3.js → main-wiXkwSx1.js} +82 -82
  76. package/public/index.html +2 -2
  77. package/dist/public/assets/main-s8HrXBxq.css +0 -1
  78. package/public/assets/main-s8HrXBxq.css +0 -1
@@ -0,0 +1,648 @@
1
+ import { emitEvent } from './event-ingestion.js';
2
+ /**
3
+ * Wraps organization hooks to automatically emit events
4
+ * This should be used in the organization plugin's organizationHooks option
5
+ */
6
+ export function createOrganizationHooksWithEvents(eventsConfig, userHooks) {
7
+ if (!eventsConfig?.enabled) {
8
+ return userHooks || {};
9
+ }
10
+ const capturedConfig = eventsConfig;
11
+ const getRequestInfo = () => {
12
+ return { headers: {}, ip: undefined };
13
+ };
14
+ return {
15
+ // Organization hooks
16
+ beforeCreateOrganization: userHooks?.beforeCreateOrganization
17
+ ? async (data) => {
18
+ const result = await userHooks.beforeCreateOrganization(data);
19
+ return result;
20
+ }
21
+ : undefined,
22
+ afterCreateOrganization: userHooks?.afterCreateOrganization
23
+ ? async (data) => {
24
+ await userHooks.afterCreateOrganization(data);
25
+ emitEvent('organization.created', {
26
+ status: 'success',
27
+ organizationId: data.organization.id,
28
+ userId: data.user.id,
29
+ metadata: {
30
+ organizationName: data.organization.name,
31
+ organizationSlug: data.organization.slug,
32
+ email: data.user.email,
33
+ name: data.user.name,
34
+ },
35
+ request: getRequestInfo(),
36
+ }, capturedConfig).catch(() => { });
37
+ }
38
+ : async (data) => {
39
+ emitEvent('organization.created', {
40
+ status: 'success',
41
+ organizationId: data.organization.id,
42
+ userId: data.user.id,
43
+ metadata: {
44
+ organizationName: data.organization.name,
45
+ organizationSlug: data.organization.slug,
46
+ email: data.user.email,
47
+ name: data.user.name,
48
+ },
49
+ request: getRequestInfo(),
50
+ }, capturedConfig).catch(() => { });
51
+ },
52
+ beforeUpdateOrganization: userHooks?.beforeUpdateOrganization
53
+ ? async (data) => {
54
+ const result = await userHooks.beforeUpdateOrganization(data);
55
+ return result;
56
+ }
57
+ : undefined,
58
+ afterUpdateOrganization: userHooks?.afterUpdateOrganization
59
+ ? async (data) => {
60
+ await userHooks.afterUpdateOrganization?.(data);
61
+ if (data.organization) {
62
+ emitEvent('organization.updated', {
63
+ status: 'success',
64
+ organizationId: data.organization.id,
65
+ userId: data.user.id,
66
+ metadata: {
67
+ organizationName: data.organization.name,
68
+ organizationSlug: data.organization.slug,
69
+ email: data.user.email,
70
+ name: data.user.name,
71
+ },
72
+ request: getRequestInfo(),
73
+ }, capturedConfig).catch(() => { });
74
+ }
75
+ }
76
+ : async (data) => {
77
+ if (data.organization) {
78
+ emitEvent('organization.updated', {
79
+ status: 'success',
80
+ organizationId: data.organization.id,
81
+ userId: data.user.id,
82
+ metadata: {
83
+ organizationName: data.organization.name,
84
+ organizationSlug: data.organization.slug,
85
+ email: data.user.email,
86
+ name: data.user.name,
87
+ },
88
+ request: getRequestInfo(),
89
+ }, capturedConfig).catch(() => { });
90
+ }
91
+ },
92
+ beforeDeleteOrganization: userHooks?.beforeDeleteOrganization
93
+ ? async (data) => {
94
+ await userHooks.beforeDeleteOrganization(data);
95
+ }
96
+ : undefined,
97
+ afterDeleteOrganization: userHooks?.afterDeleteOrganization
98
+ ? async (data) => {
99
+ await userHooks.afterDeleteOrganization?.(data);
100
+ emitEvent('organization.deleted', {
101
+ status: 'success',
102
+ organizationId: data.organization.id,
103
+ userId: data.user.id,
104
+ metadata: {
105
+ organizationName: data.organization.name,
106
+ organizationSlug: data.organization.slug,
107
+ email: data.user.email,
108
+ name: data.user.name,
109
+ },
110
+ request: getRequestInfo(),
111
+ }, capturedConfig).catch(() => { });
112
+ }
113
+ : async (data) => {
114
+ emitEvent('organization.deleted', {
115
+ status: 'success',
116
+ organizationId: data.organization.id,
117
+ userId: data.user.id,
118
+ metadata: {
119
+ organizationName: data.organization.name,
120
+ organizationSlug: data.organization.slug,
121
+ email: data.user.email,
122
+ name: data.user.name,
123
+ },
124
+ request: getRequestInfo(),
125
+ }, capturedConfig).catch(() => { });
126
+ },
127
+ // Member hooks
128
+ beforeAddMember: userHooks?.beforeAddMember
129
+ ? async (data) => {
130
+ const result = await userHooks.beforeAddMember(data);
131
+ return result;
132
+ }
133
+ : undefined,
134
+ afterAddMember: userHooks?.afterAddMember
135
+ ? async (data) => {
136
+ await userHooks.afterAddMember?.(data);
137
+ emitEvent('member.added', {
138
+ status: 'success',
139
+ organizationId: data.organization.id,
140
+ userId: data.member.userId,
141
+ metadata: {
142
+ memberId: data.member.id,
143
+ role: data.member.role,
144
+ addedByUserId: data.user.id,
145
+ addedByEmail: data.user.email,
146
+ addedByName: data.user.name,
147
+ memberEmail: data.user.email,
148
+ memberName: data.user.name,
149
+ },
150
+ request: getRequestInfo(),
151
+ }, capturedConfig).catch(() => { });
152
+ }
153
+ : async (data) => {
154
+ emitEvent('member.added', {
155
+ status: 'success',
156
+ organizationId: data.organization.id,
157
+ userId: data.member.userId,
158
+ metadata: {
159
+ memberId: data.member.id,
160
+ role: data.member.role,
161
+ addedByUserId: data.user.id,
162
+ addedByEmail: data.user.email,
163
+ addedByName: data.user.name,
164
+ memberEmail: data.user.email,
165
+ memberName: data.user.name,
166
+ },
167
+ request: getRequestInfo(),
168
+ }, capturedConfig).catch(() => { });
169
+ },
170
+ beforeRemoveMember: userHooks?.beforeRemoveMember
171
+ ? async (data) => {
172
+ await userHooks.beforeRemoveMember(data);
173
+ }
174
+ : undefined,
175
+ afterRemoveMember: userHooks?.afterRemoveMember
176
+ ? async (data) => {
177
+ await userHooks.afterRemoveMember?.(data);
178
+ emitEvent('member.removed', {
179
+ status: 'success',
180
+ organizationId: data.organization.id,
181
+ userId: data.member.userId,
182
+ metadata: {
183
+ memberId: data.member.id,
184
+ removedByUserId: data.user.id,
185
+ removedByEmail: data.user.email,
186
+ removedByName: data.user.name,
187
+ },
188
+ request: getRequestInfo(),
189
+ }, capturedConfig).catch(() => { });
190
+ }
191
+ : async (data) => {
192
+ emitEvent('member.removed', {
193
+ status: 'success',
194
+ organizationId: data.organization.id,
195
+ userId: data.member.userId,
196
+ metadata: {
197
+ memberId: data.member.id,
198
+ removedByUserId: data.user.id,
199
+ removedByEmail: data.user.email,
200
+ removedByName: data.user.name,
201
+ },
202
+ request: getRequestInfo(),
203
+ }, capturedConfig).catch(() => { });
204
+ },
205
+ beforeUpdateMemberRole: userHooks?.beforeUpdateMemberRole
206
+ ? async (data) => {
207
+ const result = await userHooks.beforeUpdateMemberRole(data);
208
+ return result;
209
+ }
210
+ : undefined,
211
+ afterUpdateMemberRole: userHooks?.afterUpdateMemberRole
212
+ ? async (data) => {
213
+ await userHooks.afterUpdateMemberRole?.(data);
214
+ emitEvent('member.role_changed', {
215
+ status: 'success',
216
+ organizationId: data.organization.id,
217
+ userId: data.member.userId,
218
+ metadata: {
219
+ memberId: data.member.id,
220
+ oldRole: data.previousRole,
221
+ newRole: data.member.role,
222
+ changedByUserId: data.user.id,
223
+ changedByEmail: data.user.email,
224
+ changedByName: data.user.name,
225
+ },
226
+ request: getRequestInfo(),
227
+ }, capturedConfig).catch(() => { });
228
+ }
229
+ : async (data) => {
230
+ emitEvent('member.role_changed', {
231
+ status: 'success',
232
+ organizationId: data.organization.id,
233
+ userId: data.member.userId,
234
+ metadata: {
235
+ memberId: data.member.id,
236
+ oldRole: data.previousRole,
237
+ newRole: data.member.role,
238
+ changedByUserId: data.user.id,
239
+ changedByEmail: data.user.email,
240
+ changedByName: data.user.name,
241
+ },
242
+ request: getRequestInfo(),
243
+ }, capturedConfig).catch(() => { });
244
+ },
245
+ // Team hooks
246
+ beforeCreateTeam: userHooks?.beforeCreateTeam
247
+ ? async (data) => {
248
+ const result = await userHooks.beforeCreateTeam(data);
249
+ return result;
250
+ }
251
+ : undefined,
252
+ afterCreateTeam: userHooks?.afterCreateTeam
253
+ ? async (data) => {
254
+ await userHooks.afterCreateTeam?.(data);
255
+ emitEvent('team.created', {
256
+ status: 'success',
257
+ organizationId: data.organization.id,
258
+ userId: data.user?.id,
259
+ metadata: {
260
+ teamId: data.team.id,
261
+ teamName: data.team.name,
262
+ organizationName: data.organization.name,
263
+ organizationSlug: data.organization.slug,
264
+ email: data.user?.email,
265
+ name: data.user?.name,
266
+ },
267
+ request: getRequestInfo(),
268
+ }, capturedConfig).catch(() => { });
269
+ }
270
+ : async (data) => {
271
+ emitEvent('team.created', {
272
+ status: 'success',
273
+ organizationId: data.organization.id,
274
+ userId: data.user?.id,
275
+ metadata: {
276
+ teamId: data.team.id,
277
+ teamName: data.team.name,
278
+ organizationName: data.organization.name,
279
+ organizationSlug: data.organization.slug,
280
+ email: data.user?.email,
281
+ name: data.user?.name,
282
+ },
283
+ request: getRequestInfo(),
284
+ }, capturedConfig).catch(() => { });
285
+ },
286
+ beforeUpdateTeam: userHooks?.beforeUpdateTeam
287
+ ? async (data) => {
288
+ const result = await userHooks.beforeUpdateTeam(data);
289
+ return result;
290
+ }
291
+ : undefined,
292
+ afterUpdateTeam: userHooks?.afterUpdateTeam
293
+ ? async (data) => {
294
+ await userHooks.afterUpdateTeam?.(data);
295
+ if (data.team) {
296
+ emitEvent('team.updated', {
297
+ status: 'success',
298
+ organizationId: data.organization.id,
299
+ userId: data.user.id,
300
+ metadata: {
301
+ teamId: data.team.id,
302
+ teamName: data.team.name,
303
+ organizationName: data.organization.name,
304
+ organizationSlug: data.organization.slug,
305
+ email: data.user.email,
306
+ name: data.user.name,
307
+ },
308
+ request: getRequestInfo(),
309
+ }, capturedConfig).catch(() => { });
310
+ }
311
+ }
312
+ : async (data) => {
313
+ if (data.team) {
314
+ emitEvent('team.updated', {
315
+ status: 'success',
316
+ organizationId: data.organization.id,
317
+ userId: data.user.id,
318
+ metadata: {
319
+ teamId: data.team.id,
320
+ teamName: data.team.name,
321
+ organizationName: data.organization.name,
322
+ organizationSlug: data.organization.slug,
323
+ email: data.user.email,
324
+ name: data.user.name,
325
+ },
326
+ request: getRequestInfo(),
327
+ }, capturedConfig).catch(() => { });
328
+ }
329
+ },
330
+ beforeDeleteTeam: userHooks?.beforeDeleteTeam
331
+ ? async (data) => {
332
+ await userHooks.beforeDeleteTeam(data);
333
+ }
334
+ : undefined,
335
+ afterDeleteTeam: userHooks?.afterDeleteTeam
336
+ ? async (data) => {
337
+ await userHooks.afterDeleteTeam?.(data);
338
+ emitEvent('team.deleted', {
339
+ status: 'success',
340
+ organizationId: data.organization.id,
341
+ userId: data.user?.id,
342
+ metadata: {
343
+ teamId: data.team.id,
344
+ teamName: data.team.name,
345
+ organizationName: data.organization.name,
346
+ organizationSlug: data.organization.slug,
347
+ email: data.user?.email,
348
+ name: data.user?.name,
349
+ },
350
+ request: getRequestInfo(),
351
+ }, capturedConfig).catch(() => { });
352
+ }
353
+ : async (data) => {
354
+ emitEvent('team.deleted', {
355
+ status: 'success',
356
+ organizationId: data.organization.id,
357
+ userId: data.user?.id,
358
+ metadata: {
359
+ teamId: data.team.id,
360
+ teamName: data.team.name,
361
+ organizationName: data.organization.name,
362
+ organizationSlug: data.organization.slug,
363
+ email: data.user?.email,
364
+ name: data.user?.name,
365
+ },
366
+ request: getRequestInfo(),
367
+ }, capturedConfig).catch(() => { });
368
+ },
369
+ // Team member hooks
370
+ beforeAddTeamMember: userHooks?.beforeAddTeamMember
371
+ ? async (data) => {
372
+ const result = await userHooks.beforeAddTeamMember(data);
373
+ return result;
374
+ }
375
+ : undefined,
376
+ afterAddTeamMember: userHooks?.afterAddTeamMember
377
+ ? async (data) => {
378
+ await userHooks.afterAddTeamMember?.(data);
379
+ emitEvent('team.member.added', {
380
+ status: 'success',
381
+ organizationId: data.organization.id,
382
+ userId: data.teamMember.userId,
383
+ metadata: {
384
+ teamMemberId: data.teamMember.id,
385
+ teamId: data.team.id,
386
+ teamName: data.team.name,
387
+ organizationName: data.organization.name,
388
+ memberEmail: data.user.email,
389
+ memberName: data.user.name,
390
+ addedByUserId: data.user.id,
391
+ addedByEmail: data.user.email,
392
+ addedByName: data.user.name,
393
+ },
394
+ request: getRequestInfo(),
395
+ }, capturedConfig).catch(() => { });
396
+ }
397
+ : async (data) => {
398
+ emitEvent('team.member.added', {
399
+ status: 'success',
400
+ organizationId: data.organization.id,
401
+ userId: data.teamMember.userId,
402
+ metadata: {
403
+ teamMemberId: data.teamMember.id,
404
+ teamId: data.team.id,
405
+ teamName: data.team.name,
406
+ organizationName: data.organization.name,
407
+ memberEmail: data.user.email,
408
+ memberName: data.user.name,
409
+ addedUserId: data.user.id,
410
+ addedEmail: data.user.email,
411
+ addedName: data.user.name,
412
+ },
413
+ request: getRequestInfo(),
414
+ }, capturedConfig).catch(() => { });
415
+ },
416
+ beforeRemoveTeamMember: userHooks?.beforeRemoveTeamMember
417
+ ? async (data) => {
418
+ await userHooks.beforeRemoveTeamMember(data);
419
+ }
420
+ : undefined,
421
+ afterRemoveTeamMember: userHooks?.afterRemoveTeamMember
422
+ ? async (data) => {
423
+ await userHooks.afterRemoveTeamMember?.(data);
424
+ emitEvent('team.member.removed', {
425
+ status: 'success',
426
+ organizationId: data.organization.id,
427
+ userId: data.teamMember.userId,
428
+ metadata: {
429
+ teamMemberId: data.teamMember.id,
430
+ teamId: data.team.id,
431
+ teamName: data.team.name,
432
+ organizationName: data.organization.name,
433
+ removedUserId: data.user.id,
434
+ removedEmail: data.user.email,
435
+ removedName: data.user.name,
436
+ },
437
+ request: getRequestInfo(),
438
+ }, capturedConfig).catch(() => { });
439
+ }
440
+ : async (data) => {
441
+ emitEvent('team.member.removed', {
442
+ status: 'success',
443
+ organizationId: data.organization.id,
444
+ userId: data.teamMember.userId,
445
+ metadata: {
446
+ teamMemberId: data.teamMember.id,
447
+ teamId: data.team.id,
448
+ teamName: data.team.name,
449
+ organizationName: data.organization.name,
450
+ removedUserId: data.user.id,
451
+ removedEmail: data.user.email,
452
+ removedName: data.user.name,
453
+ },
454
+ request: getRequestInfo(),
455
+ }, capturedConfig).catch(() => { });
456
+ },
457
+ // Invitation hooks
458
+ beforeCreateInvitation: userHooks?.beforeCreateInvitation
459
+ ? async (data) => {
460
+ const result = await userHooks.beforeCreateInvitation(data);
461
+ return result;
462
+ }
463
+ : undefined,
464
+ afterCreateInvitation: userHooks?.afterCreateInvitation
465
+ ? async (data) => {
466
+ await userHooks.afterCreateInvitation?.(data);
467
+ emitEvent('invitation.created', {
468
+ status: 'success',
469
+ organizationId: data.organization.id,
470
+ metadata: {
471
+ invitationId: data.invitation.id,
472
+ email: data.invitation.email,
473
+ role: data.invitation.role,
474
+ organizationName: data.organization.name,
475
+ organizationSlug: data.organization.slug,
476
+ inviterEmail: data.inviter.email,
477
+ inviterName: data.inviter.name,
478
+ inviterId: data.inviter.id,
479
+ teamId: data.invitation.teamId,
480
+ },
481
+ request: getRequestInfo(),
482
+ }, capturedConfig).catch(() => { });
483
+ }
484
+ : async (data) => {
485
+ emitEvent('invitation.created', {
486
+ status: 'success',
487
+ organizationId: data.organization.id,
488
+ metadata: {
489
+ invitationId: data.invitation.id,
490
+ email: data.invitation.email,
491
+ role: data.invitation.role,
492
+ organizationName: data.organization.name,
493
+ organizationSlug: data.organization.slug,
494
+ inviterEmail: data.inviter.email,
495
+ inviterName: data.inviter.name,
496
+ inviterId: data.inviter.id,
497
+ teamId: data.invitation.teamId,
498
+ },
499
+ request: getRequestInfo(),
500
+ }, capturedConfig).catch(() => { });
501
+ },
502
+ beforeAcceptInvitation: userHooks?.beforeAcceptInvitation
503
+ ? async (data) => {
504
+ await userHooks.beforeAcceptInvitation(data);
505
+ }
506
+ : undefined,
507
+ afterAcceptInvitation: userHooks?.afterAcceptInvitation
508
+ ? async (data) => {
509
+ await userHooks.afterAcceptInvitation?.(data);
510
+ emitEvent('invitation.accepted', {
511
+ status: 'success',
512
+ organizationId: data.organization.id,
513
+ userId: data.user.id,
514
+ metadata: {
515
+ invitationId: data.invitation.id,
516
+ email: data.user.email,
517
+ name: data.user.name,
518
+ role: data.member.role,
519
+ organizationName: data.organization.name,
520
+ organizationSlug: data.organization.slug,
521
+ },
522
+ request: getRequestInfo(),
523
+ }, capturedConfig).catch(() => { });
524
+ }
525
+ : async (data) => {
526
+ emitEvent('invitation.accepted', {
527
+ status: 'success',
528
+ organizationId: data.organization.id,
529
+ userId: data.user.id,
530
+ metadata: {
531
+ invitationId: data.invitation.id,
532
+ email: data.user.email,
533
+ name: data.user.name,
534
+ role: data.member.role,
535
+ organizationName: data.organization.name,
536
+ organizationSlug: data.organization.slug,
537
+ },
538
+ request: getRequestInfo(),
539
+ }, capturedConfig).catch(() => { });
540
+ },
541
+ beforeRejectInvitation: userHooks?.beforeRejectInvitation
542
+ ? async (data) => {
543
+ await userHooks.beforeRejectInvitation(data);
544
+ }
545
+ : undefined,
546
+ afterRejectInvitation: userHooks?.afterRejectInvitation
547
+ ? async (data) => {
548
+ await userHooks.afterRejectInvitation?.(data);
549
+ emitEvent('invitation.rejected', {
550
+ status: 'success',
551
+ organizationId: data.organization.id,
552
+ userId: data.user.id,
553
+ metadata: {
554
+ invitationId: data.invitation.id,
555
+ email: data.user.email,
556
+ name: data.user.name,
557
+ organizationName: data.organization.name,
558
+ organizationSlug: data.organization.slug,
559
+ },
560
+ request: getRequestInfo(),
561
+ }, capturedConfig).catch(() => { });
562
+ }
563
+ : async (data) => {
564
+ emitEvent('invitation.rejected', {
565
+ status: 'success',
566
+ organizationId: data.organization.id,
567
+ userId: data.user.id,
568
+ metadata: {
569
+ invitationId: data.invitation.id,
570
+ email: data.user.email,
571
+ name: data.user.name,
572
+ organizationName: data.organization.name,
573
+ organizationSlug: data.organization.slug,
574
+ },
575
+ request: getRequestInfo(),
576
+ }, capturedConfig).catch(() => { });
577
+ },
578
+ beforeCancelInvitation: userHooks?.beforeCancelInvitation
579
+ ? async (data) => {
580
+ await userHooks.beforeCancelInvitation(data);
581
+ }
582
+ : undefined,
583
+ afterCancelInvitation: userHooks?.afterCancelInvitation
584
+ ? async (data) => {
585
+ await userHooks.afterCancelInvitation?.(data);
586
+ emitEvent('invitation.cancelled', {
587
+ status: 'success',
588
+ organizationId: data.organization.id,
589
+ userId: data.cancelledBy.id,
590
+ metadata: {
591
+ invitationId: data.invitation.id,
592
+ email: data.invitation.email,
593
+ organizationName: data.organization.name,
594
+ organizationSlug: data.organization.slug,
595
+ cancelledByEmail: data.cancelledBy.email,
596
+ cancelledByName: data.cancelledBy.name,
597
+ },
598
+ request: getRequestInfo(),
599
+ }, capturedConfig).catch(() => { });
600
+ }
601
+ : async (data) => {
602
+ emitEvent('invitation.cancelled', {
603
+ status: 'success',
604
+ organizationId: data.organization.id,
605
+ userId: data.cancelledBy.id,
606
+ metadata: {
607
+ invitationId: data.invitation.id,
608
+ email: data.invitation.email,
609
+ organizationName: data.organization.name,
610
+ organizationSlug: data.organization.slug,
611
+ cancelledByEmail: data.cancelledBy.email,
612
+ cancelledByName: data.cancelledBy.name,
613
+ },
614
+ request: getRequestInfo(),
615
+ }, capturedConfig).catch(() => { });
616
+ },
617
+ };
618
+ }
619
+ /**
620
+ * Automatically wraps organization plugin hooks to emit events
621
+ * This should be called during Better Auth initialization
622
+ */
623
+ export function wrapOrganizationPluginHooks(auth, eventsConfig) {
624
+ if (!auth || !eventsConfig?.enabled) {
625
+ return;
626
+ }
627
+ try {
628
+ const plugins = auth.options?.plugins || [];
629
+ const orgPlugin = plugins.find((p) => p?.id === 'organization');
630
+ if (!orgPlugin) {
631
+ return;
632
+ }
633
+ const existingHooks = orgPlugin.options?.organizationHooks ||
634
+ orgPlugin.organizationHooks ||
635
+ (orgPlugin.options && orgPlugin.options.organizationHooks) ||
636
+ {};
637
+ const wrappedHooks = createOrganizationHooksWithEvents(eventsConfig, existingHooks);
638
+ if (!orgPlugin.options) {
639
+ orgPlugin.options = {};
640
+ }
641
+ orgPlugin.options.organizationHooks = wrappedHooks;
642
+ orgPlugin.organizationHooks = wrappedHooks;
643
+ }
644
+ catch (error) {
645
+ console.error('[Organization Hooks] Failed to wrap hooks:', error);
646
+ }
647
+ }
648
+ //# sourceMappingURL=org-hooks-injector.js.map