wabe 0.6.9 → 0.6.11

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 (162) hide show
  1. package/README.md +156 -50
  2. package/bucket/b.txt +1 -0
  3. package/dev/index.ts +215 -0
  4. package/dist/authentication/Session.d.ts +4 -1
  5. package/dist/authentication/interface.d.ts +16 -0
  6. package/dist/cron/index.d.ts +0 -1
  7. package/dist/database/DatabaseController.d.ts +41 -13
  8. package/dist/database/interface.d.ts +1 -0
  9. package/dist/email/DevAdapter.d.ts +0 -1
  10. package/dist/email/interface.d.ts +1 -1
  11. package/dist/graphql/resolvers.d.ts +4 -2
  12. package/dist/hooks/index.d.ts +8 -2
  13. package/dist/index.d.ts +0 -1
  14. package/dist/index.js +32144 -32058
  15. package/dist/schema/Schema.d.ts +2 -1
  16. package/dist/server/index.d.ts +4 -2
  17. package/dist/utils/crypto.d.ts +7 -0
  18. package/dist/utils/helper.d.ts +5 -1
  19. package/generated/schema.graphql +22 -14
  20. package/generated/wabe.ts +4 -4
  21. package/package.json +23 -23
  22. package/src/authentication/OTP.test.ts +69 -0
  23. package/src/authentication/OTP.ts +64 -0
  24. package/src/authentication/Session.test.ts +629 -0
  25. package/src/authentication/Session.ts +493 -0
  26. package/src/authentication/defaultAuthentication.ts +209 -0
  27. package/src/authentication/index.ts +3 -0
  28. package/src/authentication/interface.ts +155 -0
  29. package/src/authentication/oauth/GitHub.test.ts +91 -0
  30. package/src/authentication/oauth/GitHub.ts +121 -0
  31. package/src/authentication/oauth/Google.test.ts +91 -0
  32. package/src/authentication/oauth/Google.ts +101 -0
  33. package/src/authentication/oauth/Oauth2Client.test.ts +219 -0
  34. package/src/authentication/oauth/Oauth2Client.ts +135 -0
  35. package/src/authentication/oauth/index.ts +2 -0
  36. package/src/authentication/oauth/utils.test.ts +33 -0
  37. package/src/authentication/oauth/utils.ts +27 -0
  38. package/src/authentication/providers/EmailOTP.test.ts +127 -0
  39. package/src/authentication/providers/EmailOTP.ts +84 -0
  40. package/src/authentication/providers/EmailPassword.test.ts +176 -0
  41. package/src/authentication/providers/EmailPassword.ts +116 -0
  42. package/src/authentication/providers/EmailPasswordSRP.test.ts +208 -0
  43. package/src/authentication/providers/EmailPasswordSRP.ts +179 -0
  44. package/src/authentication/providers/GitHub.ts +24 -0
  45. package/src/authentication/providers/Google.ts +24 -0
  46. package/src/authentication/providers/OAuth.test.ts +185 -0
  47. package/src/authentication/providers/OAuth.ts +106 -0
  48. package/src/authentication/providers/PhonePassword.test.ts +176 -0
  49. package/src/authentication/providers/PhonePassword.ts +115 -0
  50. package/src/authentication/providers/QRCodeOTP.test.ts +77 -0
  51. package/src/authentication/providers/QRCodeOTP.ts +58 -0
  52. package/src/authentication/providers/index.ts +6 -0
  53. package/src/authentication/resolvers/refreshResolver.test.ts +30 -0
  54. package/src/authentication/resolvers/refreshResolver.ts +19 -0
  55. package/src/authentication/resolvers/signInWithResolver.inte.test.ts +59 -0
  56. package/src/authentication/resolvers/signInWithResolver.test.ts +293 -0
  57. package/src/authentication/resolvers/signInWithResolver.ts +92 -0
  58. package/src/authentication/resolvers/signOutResolver.test.ts +38 -0
  59. package/src/authentication/resolvers/signOutResolver.ts +18 -0
  60. package/src/authentication/resolvers/signUpWithResolver.test.ts +180 -0
  61. package/src/authentication/resolvers/signUpWithResolver.ts +65 -0
  62. package/src/authentication/resolvers/verifyChallenge.test.ts +133 -0
  63. package/src/authentication/resolvers/verifyChallenge.ts +62 -0
  64. package/src/authentication/roles.test.ts +49 -0
  65. package/src/authentication/roles.ts +40 -0
  66. package/src/authentication/utils.test.ts +97 -0
  67. package/src/authentication/utils.ts +39 -0
  68. package/src/cache/InMemoryCache.test.ts +62 -0
  69. package/src/cache/InMemoryCache.ts +45 -0
  70. package/src/cron/index.test.ts +17 -0
  71. package/src/cron/index.ts +43 -0
  72. package/src/database/DatabaseController.test.ts +613 -0
  73. package/src/database/DatabaseController.ts +1007 -0
  74. package/src/database/index.test.ts +1372 -0
  75. package/src/database/index.ts +9 -0
  76. package/src/database/interface.ts +302 -0
  77. package/src/email/DevAdapter.ts +7 -0
  78. package/src/email/EmailController.test.ts +29 -0
  79. package/src/email/EmailController.ts +13 -0
  80. package/src/email/index.ts +2 -0
  81. package/src/email/interface.ts +36 -0
  82. package/src/email/templates/sendOtpCode.ts +120 -0
  83. package/src/file/FileController.ts +28 -0
  84. package/src/file/FileDevAdapter.ts +51 -0
  85. package/src/file/hookDeleteFile.ts +25 -0
  86. package/src/file/hookReadFile.ts +66 -0
  87. package/src/file/hookUploadFile.ts +50 -0
  88. package/src/file/index.test.ts +932 -0
  89. package/src/file/index.ts +2 -0
  90. package/src/file/interface.ts +39 -0
  91. package/src/graphql/GraphQLSchema.test.ts +4408 -0
  92. package/src/graphql/GraphQLSchema.ts +880 -0
  93. package/src/graphql/index.ts +2 -0
  94. package/src/graphql/parseGraphqlSchema.ts +85 -0
  95. package/src/graphql/parser.test.ts +203 -0
  96. package/src/graphql/parser.ts +542 -0
  97. package/src/graphql/pointerAndRelationFunction.ts +191 -0
  98. package/src/graphql/resolvers.ts +442 -0
  99. package/src/graphql/tests/aggregation.test.ts +1115 -0
  100. package/src/graphql/tests/e2e.test.ts +590 -0
  101. package/src/graphql/tests/scalars.test.ts +250 -0
  102. package/src/graphql/types.ts +227 -0
  103. package/src/hooks/HookObject.test.ts +122 -0
  104. package/src/hooks/HookObject.ts +165 -0
  105. package/src/hooks/authentication.ts +67 -0
  106. package/src/hooks/createUser.test.ts +77 -0
  107. package/src/hooks/createUser.ts +10 -0
  108. package/src/hooks/defaultFields.test.ts +176 -0
  109. package/src/hooks/defaultFields.ts +32 -0
  110. package/src/hooks/deleteSession.test.ts +181 -0
  111. package/src/hooks/deleteSession.ts +20 -0
  112. package/src/hooks/hashFieldHook.test.ts +152 -0
  113. package/src/hooks/hashFieldHook.ts +89 -0
  114. package/src/hooks/index.test.ts +258 -0
  115. package/src/hooks/index.ts +414 -0
  116. package/src/hooks/permissions.test.ts +412 -0
  117. package/src/hooks/permissions.ts +93 -0
  118. package/src/hooks/protected.test.ts +551 -0
  119. package/src/hooks/protected.ts +60 -0
  120. package/src/hooks/searchableFields.test.ts +147 -0
  121. package/src/hooks/searchableFields.ts +86 -0
  122. package/src/hooks/session.test.ts +134 -0
  123. package/src/hooks/session.ts +76 -0
  124. package/src/hooks/setEmail.test.ts +216 -0
  125. package/src/hooks/setEmail.ts +33 -0
  126. package/src/hooks/setupAcl.test.ts +618 -0
  127. package/src/hooks/setupAcl.ts +25 -0
  128. package/src/index.ts +9 -0
  129. package/src/schema/Schema.test.ts +482 -0
  130. package/src/schema/Schema.ts +757 -0
  131. package/src/schema/defaultResolvers.ts +93 -0
  132. package/src/schema/index.ts +1 -0
  133. package/src/schema/resolvers/meResolver.test.ts +62 -0
  134. package/src/schema/resolvers/meResolver.ts +10 -0
  135. package/src/schema/resolvers/resetPassword.test.ts +341 -0
  136. package/src/schema/resolvers/resetPassword.ts +63 -0
  137. package/src/schema/resolvers/sendEmail.test.ts +118 -0
  138. package/src/schema/resolvers/sendEmail.ts +21 -0
  139. package/src/schema/resolvers/sendOtpCode.test.ts +141 -0
  140. package/src/schema/resolvers/sendOtpCode.ts +52 -0
  141. package/src/security.test.ts +3434 -0
  142. package/src/server/defaultSessionHandler.test.ts +62 -0
  143. package/src/server/defaultSessionHandler.ts +105 -0
  144. package/src/server/generateCodegen.ts +433 -0
  145. package/src/server/index.test.ts +532 -0
  146. package/src/server/index.ts +334 -0
  147. package/src/server/interface.ts +11 -0
  148. package/src/server/routes/authHandler.ts +169 -0
  149. package/src/server/routes/index.ts +39 -0
  150. package/src/utils/crypto.test.ts +41 -0
  151. package/src/utils/crypto.ts +105 -0
  152. package/src/utils/export.ts +11 -0
  153. package/src/utils/helper.ts +204 -0
  154. package/src/utils/index.test.ts +11 -0
  155. package/src/utils/index.ts +189 -0
  156. package/src/utils/preload.ts +8 -0
  157. package/src/utils/testHelper.ts +116 -0
  158. package/tsconfig.json +32 -0
  159. package/bunfig.toml +0 -4
  160. package/dist/ai/index.d.ts +0 -1
  161. package/dist/ai/interface.d.ts +0 -9
  162. /package/dist/server/{defaultHandlers.d.ts → defaultSessionHandler.d.ts} +0 -0
@@ -0,0 +1,414 @@
1
+ import type { MutationData, OutputType, Select, WhereType } from '../database'
2
+ import { contextWithoutGraphQLCall } from '../utils'
3
+ import { defaultAfterDeleteFile } from '../file/hookDeleteFile'
4
+ import { defaultAfterReadFile } from '../file/hookReadFile'
5
+ import { defaultBeforeCreateUpload, defaultBeforeUpdateUpload } from '../file/hookUploadFile'
6
+ import type { WabeConfig, WabeTypes } from '../server'
7
+ import type { WabeContext } from '../server/interface'
8
+
9
+ import type { DevWabeTypes } from '../utils/helper'
10
+ import { HookObject } from './HookObject'
11
+ import {
12
+ defaultBeforeCreateForCreatedAt,
13
+ defaultBeforeCreateForDefaultValue,
14
+ defaultBeforeUpdateForUpdatedAt,
15
+ } from './defaultFields'
16
+ import { defaultDeleteSessionOnDeleteUser } from './deleteSession'
17
+ import {
18
+ defaultCheckPermissionOnCreate,
19
+ defaultCheckPermissionOnDelete,
20
+ defaultCheckPermissionOnRead,
21
+ defaultCheckPermissionOnUpdate,
22
+ } from './permissions'
23
+ import {
24
+ defaultCheckProtectedOnBeforeCreate,
25
+ defaultCheckProtectedOnBeforeRead,
26
+ defaultCheckProtectedOnBeforeUpdate,
27
+ } from './protected'
28
+ import {
29
+ defaultSearchableFieldsBeforeCreate,
30
+ defaultSearchableFieldsBeforeUpdate,
31
+ } from './searchableFields'
32
+ import {
33
+ defaultAfterCreateSession,
34
+ defaultAfterDeleteSession,
35
+ defaultBeforeUpdateSessionOnUser,
36
+ } from './session'
37
+ import { defaultSetEmail, defaultSetEmailOnUpdate } from './setEmail'
38
+ import { defaultSetupAclBeforeCreate, defaultSetupAclOnUserAfterCreate } from './setupAcl'
39
+ import { hashFieldHook } from './hashFieldHook'
40
+ import { defaultBeforeCreateUser } from './createUser'
41
+ import {
42
+ defaultCallAuthenticationProviderOnBeforeCreateUser,
43
+ defaultCallAuthenticationProviderOnBeforeUpdateUser,
44
+ } from './authentication'
45
+
46
+ export enum OperationType {
47
+ AfterCreate = 'afterCreate',
48
+ AfterUpdate = 'afterUpdate',
49
+ AfterDelete = 'afterDelete',
50
+ AfterRead = 'afterRead',
51
+ BeforeCreate = 'beforeCreate',
52
+ BeforeUpdate = 'beforeUpdate',
53
+ BeforeDelete = 'beforeDelete',
54
+ BeforeRead = 'beforeRead',
55
+ }
56
+
57
+ export type Hook<T extends WabeTypes, K extends keyof WabeTypes['types']> = {
58
+ operationType: OperationType
59
+ // If the className is undefined the hook is called on each class
60
+ className?: K
61
+ // The priority of the hook. The lower the number the earlier the hook is called
62
+ // The priority 0 is for the security hooks
63
+ // The default priority is 1
64
+ priority: number
65
+ callback: (hookObject: HookObject<T, K>) => Promise<void> | void
66
+ }
67
+
68
+ export const _findHooksByPriority = async <T extends keyof WabeTypes['types']>({
69
+ className,
70
+ operationType,
71
+ priority,
72
+ config,
73
+ }: {
74
+ operationType: OperationType
75
+ className: T
76
+ priority: number
77
+ config: WabeConfig<any>
78
+ }) =>
79
+ config.hooks?.filter(
80
+ (hook) =>
81
+ hook.operationType === operationType &&
82
+ hook.priority === priority &&
83
+ (className === hook.className || !hook.className),
84
+ ) || []
85
+
86
+ const _getHooksOrderByPriorities = (config: WabeConfig<any>) =>
87
+ config.hooks
88
+ ?.reduce((acc, hook) => {
89
+ if (!acc.includes(hook.priority)) acc.push(hook.priority)
90
+
91
+ return acc
92
+ }, [] as number[])
93
+ .sort((a, b) => a - b) || []
94
+
95
+ export const initializeHook = <T extends WabeTypes, K extends keyof T['types']>({
96
+ className,
97
+ newData,
98
+ context,
99
+ select,
100
+ objectLoader,
101
+ objectsLoader,
102
+ }: {
103
+ className: K
104
+ newData?: MutationData<DevWabeTypes, any, any>
105
+ select: Select
106
+ context: WabeContext<any>
107
+ objectLoader?: (id: string) => Promise<OutputType<DevWabeTypes, any, any> | null>
108
+ objectsLoader?: (opts: {
109
+ where?: WhereType<DevWabeTypes, any>
110
+ ids: string[]
111
+ }) => Promise<OutputType<DevWabeTypes, any, any>[]>
112
+ }) => {
113
+ const computeObject = ({ id }: { id?: string }): Promise<OutputType<DevWabeTypes, any, any>> => {
114
+ // If we don't have an id, like for example after delete, we return an empty object
115
+ // Hook after delete will be called but we should not have any object
116
+ // Same of before create
117
+ // @ts-expect-error
118
+ if (!id) return {}
119
+
120
+ // @ts-expect-error
121
+ if (!objectLoader) return {}
122
+
123
+ return objectLoader(id)
124
+ }
125
+
126
+ const computeObjects = async ({
127
+ where,
128
+ ids,
129
+ }: {
130
+ where?: WhereType<DevWabeTypes, any>
131
+ ids: string[]
132
+ }): Promise<OutputType<DevWabeTypes, any, any>[]> => {
133
+ // @ts-expect-error
134
+ if (!where && ids.length === 0) return [{}] // Because we have a map below, so we need to have at least one turn
135
+
136
+ if (!objectsLoader) return [{}] as any
137
+
138
+ const res = await objectsLoader({ where, ids })
139
+
140
+ // @ts-expect-error
141
+ if (res.length === 0) return [{}] // Because we have a map below, so we need to have at least one turn
142
+
143
+ return res
144
+ }
145
+
146
+ const hooksOrderByPriorities = _getHooksOrderByPriorities(context.wabe.config)
147
+
148
+ return {
149
+ runOnSingleObject: async (options: {
150
+ operationType: OperationType
151
+ id?: string
152
+ originalObject?: OutputType<DevWabeTypes, any, any>
153
+ object?: OutputType<DevWabeTypes, any, any>
154
+ }): Promise<MutationData<T, K, any>> => {
155
+ if (hooksOrderByPriorities.length === 0) return { object: undefined, newData: undefined }
156
+
157
+ const object =
158
+ options.object ??
159
+ (options.operationType === OperationType.AfterDelete
160
+ ? ({} as any)
161
+ : await computeObject({
162
+ id: options.id,
163
+ }))
164
+
165
+ const hookObject = new HookObject<DevWabeTypes, K>({
166
+ className,
167
+ newData,
168
+ operationType: options.operationType,
169
+ context: contextWithoutGraphQLCall(context),
170
+ object,
171
+ originalObject: options.originalObject,
172
+ select,
173
+ })
174
+
175
+ // We need to keep the order of the data but we need to execute the hooks in parallel
176
+ await hooksOrderByPriorities.reduce(async (acc, priority) => {
177
+ await acc
178
+
179
+ const hooksToCompute = await _findHooksByPriority({
180
+ className,
181
+ operationType: options.operationType,
182
+ priority,
183
+ config: context.wabe.config,
184
+ })
185
+
186
+ await Promise.all(hooksToCompute.map((hook) => hook.callback(hookObject)))
187
+ }, Promise.resolve())
188
+
189
+ return { object, newData: hookObject.getNewData() }
190
+ },
191
+
192
+ runOnMultipleObjects: async (options: {
193
+ operationType: OperationType
194
+ where?: WhereType<any, any>
195
+ ids?: string[]
196
+ originalObjects?: OutputType<DevWabeTypes, any, any>[]
197
+ objects?: OutputType<DevWabeTypes, any, any>[]
198
+ }) => {
199
+ if (hooksOrderByPriorities.length === 0) return { objects: [], newData: [newData || {}] }
200
+
201
+ const objects =
202
+ options.objects ||
203
+ (await computeObjects({
204
+ where: options.where,
205
+ ids: options.ids || [],
206
+ }))
207
+
208
+ const objectsToUseInMap =
209
+ (options.operationType === OperationType.AfterDelete ? options.originalObjects : objects) ||
210
+ []
211
+
212
+ const newDataAfterHooks = await Promise.all(
213
+ objectsToUseInMap.map(async (object) => {
214
+ const originalObjectToUse = (options.originalObjects || []).find(
215
+ (originalObject) => originalObject?.id === object?.id,
216
+ )
217
+
218
+ const hookObject = new HookObject<DevWabeTypes, K>({
219
+ className,
220
+ newData,
221
+ operationType: options.operationType,
222
+ context: contextWithoutGraphQLCall(context),
223
+ object,
224
+ originalObject: originalObjectToUse,
225
+ select,
226
+ })
227
+
228
+ // We need to keep the order of the data but we need to execute the hooks in parallel
229
+ await hooksOrderByPriorities.reduce(async (acc, priority) => {
230
+ await acc
231
+
232
+ const hooksToCompute = await _findHooksByPriority({
233
+ className,
234
+ operationType: options.operationType,
235
+ priority,
236
+ config: context.wabe.config,
237
+ })
238
+
239
+ await Promise.all(hooksToCompute.map((hook) => hook.callback(hookObject)))
240
+ }, Promise.resolve())
241
+
242
+ return hookObject.getNewData()
243
+ }),
244
+ )
245
+
246
+ return { objects, newData: newDataAfterHooks }
247
+ },
248
+ }
249
+ }
250
+
251
+ export const getDefaultHooks = (): Hook<any, any>[] => [
252
+ {
253
+ operationType: OperationType.BeforeRead,
254
+ priority: 0,
255
+ callback: defaultCheckPermissionOnRead,
256
+ },
257
+ {
258
+ operationType: OperationType.BeforeUpdate,
259
+ priority: 0,
260
+ callback: defaultCheckPermissionOnUpdate,
261
+ },
262
+ {
263
+ operationType: OperationType.BeforeCreate,
264
+ priority: 0,
265
+ callback: defaultCheckPermissionOnCreate,
266
+ },
267
+ {
268
+ operationType: OperationType.BeforeDelete,
269
+ priority: 0,
270
+ callback: defaultCheckPermissionOnDelete,
271
+ },
272
+ {
273
+ operationType: OperationType.BeforeRead,
274
+ priority: 0,
275
+ callback: defaultCheckProtectedOnBeforeRead,
276
+ },
277
+ {
278
+ operationType: OperationType.BeforeUpdate,
279
+ priority: 0,
280
+ callback: defaultCheckProtectedOnBeforeUpdate,
281
+ },
282
+ {
283
+ operationType: OperationType.BeforeCreate,
284
+ priority: 0,
285
+ callback: defaultCheckProtectedOnBeforeCreate,
286
+ },
287
+ {
288
+ operationType: OperationType.BeforeCreate,
289
+ priority: 1,
290
+ callback: defaultBeforeCreateForCreatedAt,
291
+ },
292
+ {
293
+ operationType: OperationType.BeforeCreate,
294
+ priority: 1,
295
+ callback: defaultBeforeCreateForDefaultValue,
296
+ },
297
+ {
298
+ operationType: OperationType.BeforeUpdate,
299
+ priority: 1,
300
+ callback: defaultBeforeUpdateForUpdatedAt,
301
+ },
302
+ {
303
+ operationType: OperationType.BeforeCreate,
304
+ priority: 1,
305
+ callback: defaultBeforeCreateUpload,
306
+ },
307
+ {
308
+ operationType: OperationType.BeforeUpdate,
309
+ priority: 1,
310
+ callback: defaultBeforeUpdateUpload,
311
+ },
312
+ {
313
+ operationType: OperationType.AfterRead,
314
+ priority: 1,
315
+ callback: defaultAfterReadFile,
316
+ },
317
+ {
318
+ operationType: OperationType.AfterDelete,
319
+ priority: 1,
320
+ callback: defaultAfterDeleteFile,
321
+ },
322
+
323
+ {
324
+ operationType: OperationType.BeforeCreate,
325
+ // Need to be after email setup
326
+ priority: 3,
327
+ callback: defaultSearchableFieldsBeforeCreate,
328
+ },
329
+ {
330
+ operationType: OperationType.BeforeUpdate,
331
+ // Need to be after email setup
332
+ priority: 3,
333
+ callback: defaultSearchableFieldsBeforeUpdate,
334
+ },
335
+ {
336
+ operationType: OperationType.BeforeCreate,
337
+ priority: 0,
338
+ callback: defaultSetupAclBeforeCreate,
339
+ },
340
+ {
341
+ className: 'User',
342
+ operationType: OperationType.AfterCreate,
343
+ priority: 0,
344
+ callback: defaultSetupAclOnUserAfterCreate,
345
+ },
346
+ {
347
+ className: 'User',
348
+ operationType: OperationType.BeforeCreate,
349
+ // Need to be after authentication for update and create user hook
350
+ priority: 2,
351
+ callback: defaultSetEmail,
352
+ },
353
+ {
354
+ className: 'User',
355
+ operationType: OperationType.BeforeUpdate,
356
+ // Need to be after authentication for update and create user hook
357
+ priority: 2,
358
+ callback: defaultSetEmailOnUpdate,
359
+ },
360
+ {
361
+ className: 'User',
362
+ // TODO: It should better to do this in after delete to avoid case when deleteUser failed
363
+ // For the moment KISS
364
+ operationType: OperationType.BeforeDelete,
365
+ priority: 1,
366
+ callback: defaultDeleteSessionOnDeleteUser,
367
+ },
368
+ {
369
+ className: '_Session',
370
+ operationType: OperationType.AfterCreate,
371
+ priority: 1,
372
+ callback: defaultAfterCreateSession,
373
+ },
374
+ {
375
+ className: '_Session',
376
+ operationType: OperationType.AfterDelete,
377
+ priority: 1,
378
+ callback: defaultAfterDeleteSession,
379
+ },
380
+ {
381
+ className: 'User',
382
+ operationType: OperationType.BeforeUpdate,
383
+ priority: 1,
384
+ callback: defaultBeforeUpdateSessionOnUser,
385
+ },
386
+ {
387
+ operationType: OperationType.BeforeCreate,
388
+ priority: 1,
389
+ callback: hashFieldHook,
390
+ },
391
+ {
392
+ operationType: OperationType.BeforeUpdate,
393
+ priority: 1,
394
+ callback: hashFieldHook,
395
+ },
396
+ {
397
+ className: 'User',
398
+ operationType: OperationType.BeforeCreate,
399
+ priority: 1,
400
+ callback: defaultBeforeCreateUser,
401
+ },
402
+ {
403
+ className: 'User',
404
+ operationType: OperationType.BeforeCreate,
405
+ priority: 1,
406
+ callback: defaultCallAuthenticationProviderOnBeforeCreateUser,
407
+ },
408
+ {
409
+ className: 'User',
410
+ operationType: OperationType.BeforeUpdate,
411
+ priority: 1,
412
+ callback: defaultCallAuthenticationProviderOnBeforeUpdateUser,
413
+ },
414
+ ]