wabe 0.6.9 → 0.6.10

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