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,484 @@
1
+ import { describe, expect, it } from 'bun:test'
2
+ import { Schema } from './Schema'
3
+ import { RoleEnum } from '../../generated/wabe'
4
+ import type { DevWabeTypes } from '../utils/helper'
5
+
6
+ describe('Schema', () => {
7
+ it('should merge default class with custom class', () => {
8
+ const schema = new Schema<DevWabeTypes>({
9
+ schema: {
10
+ classes: [
11
+ {
12
+ name: 'Class1',
13
+ fields: {
14
+ field1: {
15
+ type: 'String',
16
+ },
17
+ field2: {
18
+ type: 'Int',
19
+ },
20
+ },
21
+ },
22
+ {
23
+ name: 'Class2',
24
+ fields: {
25
+ field3: {
26
+ type: 'String',
27
+ },
28
+ field4: {
29
+ type: 'Int',
30
+ },
31
+ },
32
+ },
33
+ {
34
+ name: 'Class1',
35
+ fields: {
36
+ fields3: {
37
+ type: 'String',
38
+ },
39
+ },
40
+ },
41
+ ],
42
+ },
43
+ } as any)
44
+
45
+ expect(schema.schema?.classes?.[0]).toEqual({
46
+ name: 'Class1',
47
+ fields: {
48
+ field1: {
49
+ type: 'String',
50
+ },
51
+ field2: {
52
+ type: 'Int',
53
+ },
54
+ fields3: {
55
+ type: 'String',
56
+ },
57
+ createdAt: {
58
+ type: 'Date',
59
+ },
60
+ updatedAt: {
61
+ type: 'Date',
62
+ },
63
+ acl: expect.any(Object),
64
+ search: {
65
+ type: 'Array',
66
+ typeValue: 'String',
67
+ },
68
+ },
69
+ })
70
+
71
+ expect(schema.schema?.classes?.[1]).toEqual({
72
+ name: 'Class2',
73
+ fields: {
74
+ field3: {
75
+ type: 'String',
76
+ },
77
+ field4: {
78
+ type: 'Int',
79
+ },
80
+ createdAt: {
81
+ type: 'Date',
82
+ },
83
+ updatedAt: {
84
+ type: 'Date',
85
+ },
86
+ acl: expect.any(Object),
87
+ search: {
88
+ type: 'Array',
89
+ typeValue: 'String',
90
+ },
91
+ },
92
+ })
93
+ })
94
+
95
+ it('should merge default class with custom class with resolvers', () => {
96
+ const schema = new Schema({
97
+ schema: {
98
+ classes: [
99
+ {
100
+ name: 'Class1',
101
+ fields: {
102
+ field1: {
103
+ type: 'String',
104
+ },
105
+ field2: {
106
+ type: 'Int',
107
+ },
108
+ },
109
+ },
110
+ {
111
+ name: 'Class2',
112
+ fields: {
113
+ field3: {
114
+ type: 'String',
115
+ },
116
+ field4: {
117
+ type: 'Int',
118
+ },
119
+ },
120
+ },
121
+ {
122
+ name: 'Class1',
123
+ fields: {
124
+ field1: {
125
+ type: 'Int',
126
+ defaultValue: 1,
127
+ },
128
+ },
129
+ },
130
+ ],
131
+ resolvers: {
132
+ queries: {
133
+ getClass1: {
134
+ type: 'String',
135
+ resolve: () => 'Class1',
136
+ },
137
+ getClass2: {
138
+ type: 'String',
139
+ resolve: () => 'Class1',
140
+ },
141
+ },
142
+ },
143
+ },
144
+ } as any)
145
+
146
+ expect(schema.schema?.classes?.[0]).toEqual({
147
+ name: 'Class1',
148
+ fields: expect.objectContaining({
149
+ field1: {
150
+ type: 'Int',
151
+ defaultValue: 1,
152
+ },
153
+ field2: {
154
+ type: 'Int',
155
+ },
156
+ createdAt: {
157
+ type: 'Date',
158
+ },
159
+ updatedAt: {
160
+ type: 'Date',
161
+ },
162
+ acl: expect.any(Object),
163
+ }),
164
+ })
165
+
166
+ expect(schema.schema?.classes?.[1]).toEqual({
167
+ name: 'Class2',
168
+ fields: expect.objectContaining({
169
+ field3: {
170
+ type: 'String',
171
+ },
172
+ field4: {
173
+ type: 'Int',
174
+ },
175
+ createdAt: {
176
+ type: 'Date',
177
+ },
178
+ updatedAt: {
179
+ type: 'Date',
180
+ },
181
+ acl: expect.any(Object),
182
+ }),
183
+ })
184
+ })
185
+
186
+ it('should merge default class with custom class with field with same name', () => {
187
+ const schema = new Schema({
188
+ schema: {
189
+ classes: [
190
+ {
191
+ name: 'Class1',
192
+ fields: {
193
+ field1: {
194
+ type: 'String',
195
+ },
196
+ field2: {
197
+ type: 'Int',
198
+ },
199
+ },
200
+ },
201
+ {
202
+ name: 'Class2',
203
+ fields: {
204
+ field3: {
205
+ type: 'String',
206
+ },
207
+ field4: {
208
+ type: 'Int',
209
+ },
210
+ },
211
+ },
212
+ {
213
+ name: 'Class1',
214
+ fields: {
215
+ field1: {
216
+ type: 'Int',
217
+ defaultValue: 1,
218
+ },
219
+ },
220
+ },
221
+ ],
222
+ },
223
+ } as any)
224
+
225
+ expect(schema.schema?.classes?.[0]).toEqual({
226
+ name: 'Class1',
227
+ fields: expect.objectContaining({
228
+ field1: {
229
+ type: 'Int',
230
+ defaultValue: 1,
231
+ },
232
+ field2: {
233
+ type: 'Int',
234
+ },
235
+ createdAt: {
236
+ type: 'Date',
237
+ },
238
+ updatedAt: {
239
+ type: 'Date',
240
+ },
241
+ acl: expect.any(Object),
242
+ }),
243
+ })
244
+
245
+ expect(schema.schema?.classes?.[1]).toEqual({
246
+ name: 'Class2',
247
+ fields: expect.objectContaining({
248
+ field3: {
249
+ type: 'String',
250
+ },
251
+ field4: {
252
+ type: 'Int',
253
+ },
254
+ createdAt: {
255
+ type: 'Date',
256
+ },
257
+ updatedAt: {
258
+ type: 'Date',
259
+ },
260
+ acl: expect.any(Object),
261
+ }),
262
+ })
263
+ })
264
+
265
+ it('should merge default class with custom class with same different description', () => {
266
+ const schema = new Schema({
267
+ schema: {
268
+ classes: [
269
+ {
270
+ name: 'Class1',
271
+ description: 'Class1 description',
272
+ fields: {
273
+ field1: {
274
+ type: 'String',
275
+ },
276
+ field2: {
277
+ type: 'Int',
278
+ },
279
+ },
280
+ },
281
+ {
282
+ name: 'Class2',
283
+ fields: {
284
+ field3: {
285
+ type: 'String',
286
+ },
287
+ field4: {
288
+ type: 'Int',
289
+ },
290
+ },
291
+ },
292
+ {
293
+ name: 'Class1',
294
+ description: 'new Class1 description',
295
+ fields: {
296
+ field1: {
297
+ type: 'Int',
298
+ defaultValue: 1,
299
+ },
300
+ },
301
+ },
302
+ ],
303
+ },
304
+ } as any)
305
+
306
+ expect(schema.schema?.classes?.[0]).toEqual({
307
+ name: 'Class1',
308
+ description: 'new Class1 description',
309
+ fields: expect.objectContaining({
310
+ field1: {
311
+ type: 'Int',
312
+ defaultValue: 1,
313
+ },
314
+ field2: {
315
+ type: 'Int',
316
+ },
317
+ createdAt: {
318
+ type: 'Date',
319
+ },
320
+ updatedAt: {
321
+ type: 'Date',
322
+ },
323
+ acl: expect.any(Object),
324
+ }),
325
+ })
326
+
327
+ expect(schema.schema?.classes?.[1]).toEqual({
328
+ name: 'Class2',
329
+ fields: expect.objectContaining({
330
+ field3: {
331
+ type: 'String',
332
+ },
333
+ field4: {
334
+ type: 'Int',
335
+ },
336
+ createdAt: {
337
+ type: 'Date',
338
+ },
339
+ updatedAt: {
340
+ type: 'Date',
341
+ },
342
+ acl: expect.any(Object),
343
+ }),
344
+ })
345
+ })
346
+
347
+ it('should add default enums', () => {
348
+ const schema = new Schema({
349
+ schema: {
350
+ classes: [],
351
+ enums: [
352
+ {
353
+ name: 'EnumTest',
354
+ values: {
355
+ A: 'A',
356
+ B: 'B',
357
+ },
358
+ },
359
+ ],
360
+ },
361
+ } as any)
362
+
363
+ expect(schema.schema.enums).toEqual(
364
+ expect.arrayContaining([
365
+ {
366
+ name: 'EnumTest',
367
+ values: {
368
+ A: 'A',
369
+ B: 'B',
370
+ },
371
+ },
372
+ {
373
+ name: 'AuthenticationProvider',
374
+ values: expect.any(Object),
375
+ },
376
+ {
377
+ name: 'SecondaryFactor',
378
+ values: expect.any(Object),
379
+ },
380
+ ]),
381
+ )
382
+ })
383
+
384
+ it('should overwrite class permissions', () => {
385
+ const schema = new Schema({
386
+ schema: {
387
+ classes: [
388
+ {
389
+ name: 'User',
390
+ fields: {},
391
+ permissions: {
392
+ read: {
393
+ requireAuthentication: false,
394
+ },
395
+ update: {
396
+ requireAuthentication: false,
397
+ },
398
+ },
399
+ },
400
+ ],
401
+ },
402
+ } as any)
403
+
404
+ const userClass = schema.schema?.classes?.find(
405
+ (schemaClass) => schemaClass.name === 'User',
406
+ )
407
+
408
+ expect(userClass?.permissions).toEqual({
409
+ // Default permissions
410
+ create: {
411
+ requireAuthentication: false,
412
+ },
413
+ delete: {
414
+ authorizedRoles: [],
415
+ requireAuthentication: true,
416
+ },
417
+ // Overwrite permissions
418
+ read: {
419
+ requireAuthentication: false,
420
+ },
421
+ update: {
422
+ requireAuthentication: false,
423
+ },
424
+ })
425
+ })
426
+
427
+ it('should merge default class with permissions', () => {
428
+ const schema = new Schema<DevWabeTypes>({
429
+ schema: {
430
+ classes: [
431
+ {
432
+ name: '_Session',
433
+ fields: {},
434
+ permissions: {
435
+ read: {
436
+ authorizedRoles: [RoleEnum.Admin],
437
+ requireAuthentication: true,
438
+ },
439
+ update: {
440
+ authorizedRoles: [RoleEnum.Admin],
441
+ requireAuthentication: true,
442
+ },
443
+ delete: {
444
+ authorizedRoles: [RoleEnum.Admin],
445
+ requireAuthentication: true,
446
+ },
447
+ create: {
448
+ authorizedRoles: [RoleEnum.Admin],
449
+ requireAuthentication: true,
450
+ },
451
+ },
452
+ },
453
+ ],
454
+ },
455
+ } as any)
456
+
457
+ const _sessionClass = schema.schema?.classes?.find(
458
+ (schemaClass) => schemaClass.name === '_Session',
459
+ )
460
+
461
+ expect(_sessionClass).toEqual({
462
+ name: '_Session',
463
+ fields: expect.anything(),
464
+ permissions: {
465
+ read: {
466
+ authorizedRoles: [RoleEnum.Admin],
467
+ requireAuthentication: true,
468
+ },
469
+ update: {
470
+ authorizedRoles: [RoleEnum.Admin],
471
+ requireAuthentication: true,
472
+ },
473
+ delete: {
474
+ authorizedRoles: [RoleEnum.Admin],
475
+ requireAuthentication: true,
476
+ },
477
+ create: {
478
+ authorizedRoles: [RoleEnum.Admin],
479
+ requireAuthentication: true,
480
+ },
481
+ },
482
+ })
483
+ })
484
+ })