nucleus-core-ts 0.8.0 → 0.8.2

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 (33) hide show
  1. package/README.md +84 -14
  2. package/dist/client.js +1 -1
  3. package/dist/dist/index.d.ts +3 -3
  4. package/dist/fe/index.js +1 -1
  5. package/dist/index-0yyw12k6.js +1 -1
  6. package/dist/index-tv67j5qd.js +1 -1
  7. package/dist/index.js +1 -1
  8. package/dist/infra/scripts/nucleus-init.d.ts +3 -0
  9. package/dist/infra/templates/backend/src/index.d.ts +2 -0
  10. package/dist/infra/templates/frontend/app/change-password/page.d.ts +2 -0
  11. package/dist/infra/templates/frontend/app/devices/page.d.ts +2 -0
  12. package/dist/infra/templates/frontend/app/forgot-password/page.d.ts +2 -0
  13. package/dist/infra/templates/frontend/app/layout.d.ts +7 -0
  14. package/dist/infra/templates/frontend/app/login/page.d.ts +2 -0
  15. package/dist/infra/templates/frontend/app/page.d.ts +2 -0
  16. package/dist/infra/templates/frontend/app/profile/page.d.ts +2 -0
  17. package/dist/infra/templates/frontend/app/register/page.d.ts +2 -0
  18. package/dist/infra/templates/frontend/app/reset-password/page.d.ts +2 -0
  19. package/dist/infra/templates/frontend/app/set-password/page.d.ts +2 -0
  20. package/dist/infra/templates/frontend/app/verify-email/page.d.ts +2 -0
  21. package/dist/infra/templates/frontend/app/verify-magic-link/page.d.ts +2 -0
  22. package/dist/infra/templates/frontend/lib/api/endpoints.d.ts +10 -0
  23. package/dist/infra/templates/frontend/lib/api/factory.d.ts +2 -0
  24. package/dist/infra/templates/frontend/lib/api/hook.d.ts +4 -0
  25. package/dist/infra/templates/frontend/next.config.d.ts +4 -0
  26. package/dist/infra/templates/frontend/postcss.config.d.mts +7 -0
  27. package/dist/infra/templates/frontend/server.d.ts +4 -0
  28. package/dist/src/Client/Proxy/index.js +1 -1
  29. package/dist/src/types.d.ts +1 -1
  30. package/package.json +2 -2
  31. package/schemas/config.nucleus.json +1027 -1009
  32. package/schemas/nucleus.tables.schema.json +20 -18
  33. package/schemas/table.schema.json +529 -497
@@ -1,1010 +1,1028 @@
1
1
  {
2
- "$id": "config.nucleus.json",
3
- "$schema": "https://json-schema.org/draft/2020-12/schema",
4
- "title": "Nucleus Config",
5
- "description": "Generated from NucleusConfigOptions interface in types.ts",
6
- "type": "object",
7
- "properties": {
8
- "$schema": {
9
- "type": "string",
10
- "description": "JSON Schema reference"
11
- },
12
- "appId": {
13
- "type": "string",
14
- "description": "Application ID",
15
- "minLength": 1
16
- },
17
- "mode": {
18
- "type": "string",
19
- "enum": ["development", "production"],
20
- "default": "development"
21
- },
22
- "database": {
23
- "type": "object",
24
- "properties": {
25
- "url": {
26
- "type": "string",
27
- "description": "Environment variable name for database URL"
28
- },
29
- "type": {
30
- "type": "string",
31
- "enum": ["postgres"],
32
- "default": "postgres"
33
- },
34
- "isMultiTenant": {
35
- "type": "boolean",
36
- "default": false
37
- },
38
- "schemas": {
39
- "type": "array",
40
- "items": {
41
- "type": "string"
42
- },
43
- "default": ["main"]
44
- },
45
- "allowDataLoss": {
46
- "type": "boolean",
47
- "default": false
48
- }
49
- }
50
- },
51
- "redis": {
52
- "type": "object",
53
- "properties": {
54
- "url": {
55
- "type": "string",
56
- "description": "Environment variable name for Redis URL"
57
- },
58
- "host": {
59
- "type": "string"
60
- },
61
- "port": {
62
- "type": "number"
63
- },
64
- "withDapr": {
65
- "type": "boolean"
66
- },
67
- "stateStoreName": {
68
- "type": "string"
69
- }
70
- }
71
- },
72
- "authentication": {
73
- "type": "object",
74
- "properties": {
75
- "enabled": {
76
- "type": "boolean",
77
- "default": false
78
- },
79
- "accessToken": {
80
- "type": "object",
81
- "properties": {
82
- "secret": {
83
- "type": "string",
84
- "description": "Environment variable name for JWT secret"
85
- },
86
- "expiresIn": {
87
- "type": "string",
88
- "description": "Token expiration (e.g., \"15m\", \"7d\")"
89
- },
90
- "algorithm": {
91
- "type": "string",
92
- "enum": [
93
- "HS256",
94
- "HS384",
95
- "HS512",
96
- "RS256",
97
- "RS384",
98
- "RS512",
99
- "ES256",
100
- "ES384",
101
- "ES512",
102
- "PS256",
103
- "PS384",
104
- "PS512"
105
- ],
106
- "description": "JWT algorithm"
107
- },
108
- "issuer": {
109
- "type": "string",
110
- "description": "Token issuer"
111
- },
112
- "audience": {
113
- "type": "string",
114
- "description": "Token audience"
115
- },
116
- "name": {
117
- "type": "string",
118
- "description": "Cookie name"
119
- },
120
- "setHeadersEnabled": {
121
- "type": "boolean",
122
- "description": "Set token in response headers"
123
- },
124
- "returnJson": {
125
- "type": "boolean",
126
- "description": "Return token in JSON response"
127
- }
128
- }
129
- },
130
- "refreshToken": {
131
- "type": "object",
132
- "properties": {
133
- "secret": {
134
- "type": "string",
135
- "description": "Environment variable name for JWT secret"
136
- },
137
- "expiresIn": {
138
- "type": "string",
139
- "description": "Token expiration (e.g., \"15m\", \"7d\")"
140
- },
141
- "algorithm": {
142
- "type": "string",
143
- "enum": [
144
- "HS256",
145
- "HS384",
146
- "HS512",
147
- "RS256",
148
- "RS384",
149
- "RS512",
150
- "ES256",
151
- "ES384",
152
- "ES512",
153
- "PS256",
154
- "PS384",
155
- "PS512"
156
- ],
157
- "description": "JWT algorithm"
158
- },
159
- "issuer": {
160
- "type": "string",
161
- "description": "Token issuer"
162
- },
163
- "audience": {
164
- "type": "string",
165
- "description": "Token audience"
166
- },
167
- "name": {
168
- "type": "string",
169
- "description": "Cookie name"
170
- },
171
- "setHeadersEnabled": {
172
- "type": "boolean",
173
- "description": "Set token in response headers"
174
- },
175
- "returnJson": {
176
- "type": "boolean",
177
- "description": "Return token in JSON response"
178
- }
179
- }
180
- },
181
- "sessionToken": {
182
- "type": "object",
183
- "properties": {
184
- "secret": {
185
- "type": "string",
186
- "description": "Environment variable name for JWT secret"
187
- },
188
- "expiresIn": {
189
- "type": "string",
190
- "description": "Token expiration (e.g., \"15m\", \"7d\")"
191
- },
192
- "algorithm": {
193
- "type": "string",
194
- "enum": [
195
- "HS256",
196
- "HS384",
197
- "HS512",
198
- "RS256",
199
- "RS384",
200
- "RS512",
201
- "ES256",
202
- "ES384",
203
- "ES512",
204
- "PS256",
205
- "PS384",
206
- "PS512"
207
- ],
208
- "description": "JWT algorithm"
209
- },
210
- "issuer": {
211
- "type": "string",
212
- "description": "Token issuer"
213
- },
214
- "audience": {
215
- "type": "string",
216
- "description": "Token audience"
217
- },
218
- "name": {
219
- "type": "string",
220
- "description": "Cookie name"
221
- },
222
- "setHeadersEnabled": {
223
- "type": "boolean",
224
- "description": "Set token in response headers"
225
- },
226
- "returnJson": {
227
- "type": "boolean",
228
- "description": "Return token in JSON response"
229
- }
230
- }
231
- },
232
- "login": {
233
- "type": "object",
234
- "properties": {
235
- "route": {
236
- "type": "string"
237
- },
238
- "rememberMe": {
239
- "type": "boolean"
240
- },
241
- "isPublic": {
242
- "type": "boolean"
243
- },
244
- "enabled": {
245
- "type": "boolean"
246
- }
247
- }
248
- },
249
- "register": {
250
- "type": "object",
251
- "properties": {
252
- "route": {
253
- "type": "string",
254
- "description": "Custom route path"
255
- },
256
- "isPublic": {
257
- "type": "boolean",
258
- "description": "Route is public (no auth required)"
259
- },
260
- "enabled": {
261
- "type": "boolean",
262
- "description": "Route is enabled"
263
- }
264
- }
265
- },
266
- "logout": {
267
- "type": "object",
268
- "properties": {
269
- "route": {
270
- "type": "string",
271
- "description": "Custom route path"
272
- },
273
- "isPublic": {
274
- "type": "boolean",
275
- "description": "Route is public (no auth required)"
276
- },
277
- "enabled": {
278
- "type": "boolean",
279
- "description": "Route is enabled"
280
- }
281
- }
282
- },
283
- "refresh": {
284
- "type": "object",
285
- "properties": {
286
- "route": {
287
- "type": "string",
288
- "description": "Custom route path"
289
- },
290
- "isPublic": {
291
- "type": "boolean",
292
- "description": "Route is public (no auth required)"
293
- },
294
- "enabled": {
295
- "type": "boolean",
296
- "description": "Route is enabled"
297
- }
298
- }
299
- },
300
- "passwordReset": {
301
- "type": "object",
302
- "properties": {
303
- "route": {
304
- "type": "string"
305
- },
306
- "isPublic": {
307
- "type": "boolean"
308
- },
309
- "enabled": {
310
- "type": "boolean"
311
- },
312
- "redirectUrl": {
313
- "type": "string"
314
- }
315
- }
316
- },
317
- "passwordChange": {
318
- "type": "object",
319
- "properties": {
320
- "route": {
321
- "type": "string",
322
- "description": "Custom route path"
323
- },
324
- "isPublic": {
325
- "type": "boolean",
326
- "description": "Route is public (no auth required)"
327
- },
328
- "enabled": {
329
- "type": "boolean",
330
- "description": "Route is enabled"
331
- }
332
- }
333
- },
334
- "sessions": {
335
- "type": "object",
336
- "properties": {
337
- "route": {
338
- "type": "string"
339
- },
340
- "isPublic": {
341
- "type": "boolean"
342
- },
343
- "enabled": {
344
- "type": "boolean"
345
- },
346
- "maxActiveSessions": {
347
- "type": "number"
348
- },
349
- "inactivityTimeout": {
350
- "type": "string"
351
- },
352
- "allowMultipleDevices": {
353
- "type": "boolean"
354
- },
355
- "trustNewDevices": {
356
- "type": "boolean"
357
- },
358
- "notifyOnNewDevice": {
359
- "type": "boolean"
360
- }
361
- }
362
- },
363
- "magicLink": {
364
- "type": "object",
365
- "properties": {
366
- "route": {
367
- "type": "string"
368
- },
369
- "verifyRoute": {
370
- "type": "string"
371
- },
372
- "isPublic": {
373
- "type": "boolean"
374
- },
375
- "enabled": {
376
- "type": "boolean"
377
- },
378
- "expiresIn": {
379
- "type": "string"
380
- },
381
- "redirectUrl": {
382
- "type": "string"
383
- }
384
- }
385
- },
386
- "me": {
387
- "type": "object",
388
- "properties": {
389
- "route": {
390
- "type": "string"
391
- },
392
- "isPublic": {
393
- "type": "boolean"
394
- },
395
- "enabled": {
396
- "type": "boolean"
397
- },
398
- "includeProfile": {
399
- "type": "boolean"
400
- },
401
- "includeAddresses": {
402
- "type": "boolean"
403
- },
404
- "includePhones": {
405
- "type": "boolean"
406
- },
407
- "includeFiles": {
408
- "type": "boolean"
409
- }
410
- }
411
- }
412
- }
413
- },
414
- "authorization": {
415
- "type": "object",
416
- "properties": {
417
- "enabled": {
418
- "type": "boolean",
419
- "default": false
420
- },
421
- "autoSeedClaims": {
422
- "type": "boolean",
423
- "default": true
424
- },
425
- "skipTables": {
426
- "type": "array",
427
- "items": {
428
- "type": "string"
429
- }
430
- },
431
- "skipColumns": {
432
- "type": "array",
433
- "items": {
434
- "type": "string"
435
- }
436
- },
437
- "excludedPaths": {
438
- "type": "array",
439
- "items": {
440
- "type": "string"
441
- }
442
- },
443
- "publicPaths": {
444
- "type": "array",
445
- "items": {
446
- "type": "string"
447
- }
448
- },
449
- "godminEmail": {
450
- "type": "string"
451
- },
452
- "godminPassword": {
453
- "type": "string"
454
- }
455
- }
456
- },
457
- "audit": {
458
- "type": "object",
459
- "properties": {
460
- "enabled": {
461
- "type": "boolean",
462
- "default": false
463
- },
464
- "actions": {
465
- "type": "object",
466
- "properties": {
467
- "GET": {
468
- "type": "boolean"
469
- },
470
- "INSERT": {
471
- "type": "boolean"
472
- },
473
- "UPDATE": {
474
- "type": "boolean"
475
- },
476
- "DELETE": {
477
- "type": "boolean"
478
- },
479
- "TOGGLE": {
480
- "type": "boolean"
481
- },
482
- "VERIFICATION": {
483
- "type": "boolean"
484
- }
485
- }
486
- }
487
- }
488
- },
489
- "verification": {
490
- "type": "object",
491
- "properties": {
492
- "enabled": {
493
- "type": "boolean"
494
- },
495
- "autoResetOnRejection": {
496
- "type": "boolean"
497
- },
498
- "requireSignatureByDefault": {
499
- "type": "boolean"
500
- },
501
- "diffTrackingEnabled": {
502
- "type": "boolean"
503
- },
504
- "endpoints": {
505
- "type": "object",
506
- "properties": {
507
- "enabled": {
508
- "type": "boolean"
509
- },
510
- "basePath": {
511
- "type": "string"
512
- }
513
- }
514
- }
515
- }
516
- },
517
- "notification": {
518
- "type": "object",
519
- "properties": {
520
- "enabled": {
521
- "type": "boolean"
522
- },
523
- "portalEnabled": {
524
- "type": "boolean"
525
- },
526
- "emailEnabled": {
527
- "type": "boolean"
528
- },
529
- "defaultChannel": {
530
- "type": "string",
531
- "enum": ["portal", "email", "both"]
532
- },
533
- "templateVariables": {
534
- "type": "object",
535
- "additionalProperties": {
536
- "type": "string"
537
- }
538
- }
539
- }
540
- },
541
- "rateLimit": {
542
- "type": "object",
543
- "properties": {
544
- "enabled": {
545
- "type": "boolean"
546
- },
547
- "strategy": {
548
- "type": "string",
549
- "enum": ["sliding-window", "fixed-window", "token-bucket"]
550
- },
551
- "keyPrefix": {
552
- "type": "string"
553
- },
554
- "authRoutes": {
555
- "type": "object",
556
- "properties": {
557
- "window": {
558
- "type": "string"
559
- },
560
- "max": {
561
- "type": "number"
562
- },
563
- "login": {
564
- "type": "object",
565
- "properties": {
566
- "window": {
567
- "type": "string",
568
- "description": "Time window (e.g., \"1m\", \"1h\")"
569
- },
570
- "max": {
571
- "type": "number",
572
- "description": "Maximum requests in window"
573
- },
574
- "blockDuration": {
575
- "type": "string",
576
- "description": "Block duration after limit exceeded"
577
- }
578
- }
579
- },
580
- "register": {
581
- "type": "object",
582
- "properties": {
583
- "window": {
584
- "type": "string",
585
- "description": "Time window (e.g., \"1m\", \"1h\")"
586
- },
587
- "max": {
588
- "type": "number",
589
- "description": "Maximum requests in window"
590
- },
591
- "blockDuration": {
592
- "type": "string",
593
- "description": "Block duration after limit exceeded"
594
- }
595
- }
596
- },
597
- "passwordReset": {
598
- "type": "object",
599
- "properties": {
600
- "window": {
601
- "type": "string",
602
- "description": "Time window (e.g., \"1m\", \"1h\")"
603
- },
604
- "max": {
605
- "type": "number",
606
- "description": "Maximum requests in window"
607
- },
608
- "blockDuration": {
609
- "type": "string",
610
- "description": "Block duration after limit exceeded"
611
- }
612
- }
613
- },
614
- "magicLink": {
615
- "type": "object",
616
- "properties": {
617
- "window": {
618
- "type": "string",
619
- "description": "Time window (e.g., \"1m\", \"1h\")"
620
- },
621
- "max": {
622
- "type": "number",
623
- "description": "Maximum requests in window"
624
- },
625
- "blockDuration": {
626
- "type": "string",
627
- "description": "Block duration after limit exceeded"
628
- }
629
- }
630
- }
631
- }
632
- },
633
- "publicRoutes": {
634
- "type": "object",
635
- "properties": {
636
- "window": {
637
- "type": "string"
638
- },
639
- "max": {
640
- "type": "number"
641
- }
642
- }
643
- },
644
- "privateRoutes": {
645
- "type": "object",
646
- "properties": {
647
- "window": {
648
- "type": "string"
649
- },
650
- "max": {
651
- "type": "number"
652
- }
653
- }
654
- },
655
- "byIp": {
656
- "type": "boolean"
657
- },
658
- "byUserId": {
659
- "type": "boolean"
660
- },
661
- "byEndpoint": {
662
- "type": "boolean"
663
- },
664
- "skipSuccessfulRequests": {
665
- "type": "boolean"
666
- },
667
- "headers": {
668
- "type": "object",
669
- "properties": {
670
- "remaining": {
671
- "type": "string"
672
- },
673
- "reset": {
674
- "type": "string"
675
- },
676
- "limit": {
677
- "type": "string"
678
- }
679
- }
680
- },
681
- "whitelist": {
682
- "type": "array",
683
- "items": {
684
- "type": "string"
685
- }
686
- },
687
- "blacklist": {
688
- "type": "array",
689
- "items": {
690
- "type": "string"
691
- }
692
- }
693
- }
694
- },
695
- "monitoring": {
696
- "type": "object",
697
- "properties": {
698
- "enabled": {
699
- "type": "boolean"
700
- },
701
- "system": {
702
- "type": "object",
703
- "properties": {
704
- "enabled": {
705
- "type": "boolean"
706
- },
707
- "collectInterval": {
708
- "type": "string"
709
- },
710
- "metrics": {
711
- "type": "object",
712
- "properties": {
713
- "cpu": {
714
- "type": "boolean"
715
- },
716
- "memory": {
717
- "type": "boolean"
718
- },
719
- "disk": {
720
- "type": "boolean"
721
- },
722
- "network": {
723
- "type": "boolean"
724
- },
725
- "process": {
726
- "type": "boolean"
727
- }
728
- }
729
- }
730
- }
731
- },
732
- "application": {
733
- "type": "object",
734
- "properties": {
735
- "enabled": {
736
- "type": "boolean"
737
- },
738
- "metrics": {
739
- "type": "object",
740
- "properties": {
741
- "requests": {
742
- "type": "boolean"
743
- },
744
- "responseTime": {
745
- "type": "boolean"
746
- },
747
- "errors": {
748
- "type": "boolean"
749
- },
750
- "rateLimits": {
751
- "type": "boolean"
752
- }
753
- }
754
- }
755
- }
756
- },
757
- "database": {
758
- "type": "object",
759
- "properties": {
760
- "enabled": {
761
- "type": "boolean"
762
- },
763
- "metrics": {
764
- "type": "object",
765
- "properties": {
766
- "connections": {
767
- "type": "boolean"
768
- },
769
- "queryTime": {
770
- "type": "boolean"
771
- },
772
- "slowQueryThreshold": {
773
- "type": "string"
774
- }
775
- }
776
- }
777
- }
778
- },
779
- "redis": {
780
- "type": "object",
781
- "properties": {
782
- "enabled": {
783
- "type": "boolean"
784
- }
785
- }
786
- },
787
- "persistence": {
788
- "type": "object",
789
- "properties": {
790
- "enabled": {
791
- "type": "boolean"
792
- },
793
- "flushInterval": {
794
- "type": "string"
795
- },
796
- "retentionDays": {
797
- "type": "number"
798
- }
799
- }
800
- },
801
- "alerts": {
802
- "type": "object",
803
- "properties": {
804
- "enabled": {
805
- "type": "boolean"
806
- },
807
- "email": {
808
- "type": "object",
809
- "properties": {
810
- "enabled": {
811
- "type": "boolean"
812
- },
813
- "recipients": {
814
- "type": "array",
815
- "items": {
816
- "type": "string"
817
- }
818
- }
819
- }
820
- },
821
- "thresholds": {
822
- "type": "object",
823
- "properties": {
824
- "cpuPercent": {
825
- "type": "number"
826
- },
827
- "memoryPercent": {
828
- "type": "number"
829
- },
830
- "diskPercent": {
831
- "type": "number"
832
- },
833
- "errorRatePercent": {
834
- "type": "number"
835
- },
836
- "responseTimeMs": {
837
- "type": "number"
838
- },
839
- "rateLimitBlocksPerMinute": {
840
- "type": "number"
841
- }
842
- }
843
- },
844
- "cooldown": {
845
- "type": "string"
846
- }
847
- }
848
- },
849
- "endpoints": {
850
- "type": "object",
851
- "properties": {
852
- "enabled": {
853
- "type": "boolean"
854
- },
855
- "basePath": {
856
- "type": "string"
857
- },
858
- "stream": {
859
- "type": "object",
860
- "properties": {
861
- "enabled": {
862
- "type": "boolean"
863
- },
864
- "path": {
865
- "type": "string"
866
- },
867
- "interval": {
868
- "type": "string"
869
- }
870
- }
871
- },
872
- "snapshot": {
873
- "type": "object",
874
- "properties": {
875
- "enabled": {
876
- "type": "boolean"
877
- },
878
- "path": {
879
- "type": "string"
880
- }
881
- }
882
- },
883
- "history": {
884
- "type": "object",
885
- "properties": {
886
- "enabled": {
887
- "type": "boolean"
888
- },
889
- "path": {
890
- "type": "string"
891
- },
892
- "maxMinutes": {
893
- "type": "number"
894
- }
895
- }
896
- },
897
- "alerts": {
898
- "type": "object",
899
- "properties": {
900
- "enabled": {
901
- "type": "boolean"
902
- },
903
- "path": {
904
- "type": "string"
905
- }
906
- }
907
- }
908
- }
909
- }
910
- }
911
- },
912
- "email": {
913
- "type": "object",
914
- "properties": {
915
- "gmail": {
916
- "type": "object",
917
- "properties": {
918
- "enabled": {
919
- "type": "boolean"
920
- },
921
- "json_file_path": {
922
- "type": "string"
923
- },
924
- "from_email": {
925
- "type": "string"
926
- },
927
- "from_name": {
928
- "type": "string"
929
- }
930
- }
931
- }
932
- }
933
- },
934
- "storage": {
935
- "type": "object",
936
- "properties": {
937
- "enabled": {
938
- "type": "boolean"
939
- },
940
- "basePath": {
941
- "type": "string"
942
- },
943
- "maxFileSizeBytes": {
944
- "type": "number"
945
- },
946
- "allowedMimeTypes": {
947
- "type": "array",
948
- "items": {
949
- "type": "string"
950
- }
951
- },
952
- "blockedMimeTypes": {
953
- "type": "array",
954
- "items": {
955
- "type": "string"
956
- }
957
- },
958
- "cdn": {
959
- "type": "object",
960
- "properties": {
961
- "enabled": {
962
- "type": "boolean"
963
- },
964
- "basePath": {
965
- "type": "string"
966
- },
967
- "cacheMaxAge": {
968
- "type": "number"
969
- },
970
- "enableRangeRequests": {
971
- "type": "boolean"
972
- },
973
- "enableEtag": {
974
- "type": "boolean"
975
- },
976
- "corsOrigins": {
977
- "type": "array",
978
- "items": {
979
- "type": "string"
980
- }
981
- }
982
- }
983
- },
984
- "formData": {
985
- "type": "object",
986
- "properties": {
987
- "filesField": {
988
- "type": "string"
989
- },
990
- "dataField": {
991
- "type": "string"
992
- },
993
- "maxFiles": {
994
- "type": "number"
995
- }
996
- }
997
- }
998
- }
999
- },
1000
- "entities": {
1001
- "type": "array",
1002
- "description": "Entity/table definitions",
1003
- "items": {
1004
- "$ref": "table.schema.json"
1005
- }
1006
- }
1007
- },
1008
- "required": ["appId", "entities"],
1009
- "additionalProperties": false
1010
- }
2
+ "$id": "config.nucleus.json",
3
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
4
+ "title": "Nucleus Config",
5
+ "description": "Generated from NucleusConfigOptions interface in types.ts",
6
+ "type": "object",
7
+ "properties": {
8
+ "$schema": {
9
+ "type": "string",
10
+ "description": "JSON Schema reference"
11
+ },
12
+ "appId": {
13
+ "type": "string",
14
+ "description": "Application ID",
15
+ "minLength": 1
16
+ },
17
+ "mode": {
18
+ "type": "string",
19
+ "enum": [
20
+ "development",
21
+ "production"
22
+ ],
23
+ "default": "development"
24
+ },
25
+ "database": {
26
+ "type": "object",
27
+ "properties": {
28
+ "url": {
29
+ "type": "string",
30
+ "description": "Environment variable name for database URL"
31
+ },
32
+ "type": {
33
+ "type": "string",
34
+ "enum": [
35
+ "postgres"
36
+ ],
37
+ "default": "postgres"
38
+ },
39
+ "isMultiTenant": {
40
+ "type": "boolean",
41
+ "default": false
42
+ },
43
+ "schemas": {
44
+ "type": "array",
45
+ "items": {
46
+ "type": "string"
47
+ },
48
+ "default": [
49
+ "main"
50
+ ]
51
+ },
52
+ "allowDataLoss": {
53
+ "type": "boolean",
54
+ "default": false
55
+ }
56
+ }
57
+ },
58
+ "redis": {
59
+ "type": "object",
60
+ "properties": {
61
+ "url": {
62
+ "type": "string",
63
+ "description": "Environment variable name for Redis URL"
64
+ },
65
+ "host": {
66
+ "type": "string"
67
+ },
68
+ "port": {
69
+ "type": "number"
70
+ },
71
+ "withDapr": {
72
+ "type": "boolean"
73
+ },
74
+ "stateStoreName": {
75
+ "type": "string"
76
+ }
77
+ }
78
+ },
79
+ "authentication": {
80
+ "type": "object",
81
+ "properties": {
82
+ "enabled": {
83
+ "type": "boolean",
84
+ "default": false
85
+ },
86
+ "accessToken": {
87
+ "type": "object",
88
+ "properties": {
89
+ "secret": {
90
+ "type": "string",
91
+ "description": "Environment variable name for JWT secret"
92
+ },
93
+ "expiresIn": {
94
+ "type": "string",
95
+ "description": "Token expiration (e.g., \"15m\", \"7d\")"
96
+ },
97
+ "algorithm": {
98
+ "type": "string",
99
+ "enum": [
100
+ "HS256",
101
+ "HS384",
102
+ "HS512",
103
+ "RS256",
104
+ "RS384",
105
+ "RS512",
106
+ "ES256",
107
+ "ES384",
108
+ "ES512",
109
+ "PS256",
110
+ "PS384",
111
+ "PS512"
112
+ ],
113
+ "description": "JWT algorithm"
114
+ },
115
+ "issuer": {
116
+ "type": "string",
117
+ "description": "Token issuer"
118
+ },
119
+ "audience": {
120
+ "type": "string",
121
+ "description": "Token audience"
122
+ },
123
+ "name": {
124
+ "type": "string",
125
+ "description": "Cookie name"
126
+ },
127
+ "setHeadersEnabled": {
128
+ "type": "boolean",
129
+ "description": "Set token in response headers"
130
+ },
131
+ "returnJson": {
132
+ "type": "boolean",
133
+ "description": "Return token in JSON response"
134
+ }
135
+ }
136
+ },
137
+ "refreshToken": {
138
+ "type": "object",
139
+ "properties": {
140
+ "secret": {
141
+ "type": "string",
142
+ "description": "Environment variable name for JWT secret"
143
+ },
144
+ "expiresIn": {
145
+ "type": "string",
146
+ "description": "Token expiration (e.g., \"15m\", \"7d\")"
147
+ },
148
+ "algorithm": {
149
+ "type": "string",
150
+ "enum": [
151
+ "HS256",
152
+ "HS384",
153
+ "HS512",
154
+ "RS256",
155
+ "RS384",
156
+ "RS512",
157
+ "ES256",
158
+ "ES384",
159
+ "ES512",
160
+ "PS256",
161
+ "PS384",
162
+ "PS512"
163
+ ],
164
+ "description": "JWT algorithm"
165
+ },
166
+ "issuer": {
167
+ "type": "string",
168
+ "description": "Token issuer"
169
+ },
170
+ "audience": {
171
+ "type": "string",
172
+ "description": "Token audience"
173
+ },
174
+ "name": {
175
+ "type": "string",
176
+ "description": "Cookie name"
177
+ },
178
+ "setHeadersEnabled": {
179
+ "type": "boolean",
180
+ "description": "Set token in response headers"
181
+ },
182
+ "returnJson": {
183
+ "type": "boolean",
184
+ "description": "Return token in JSON response"
185
+ }
186
+ }
187
+ },
188
+ "sessionToken": {
189
+ "type": "object",
190
+ "properties": {
191
+ "secret": {
192
+ "type": "string",
193
+ "description": "Environment variable name for JWT secret"
194
+ },
195
+ "expiresIn": {
196
+ "type": "string",
197
+ "description": "Token expiration (e.g., \"15m\", \"7d\")"
198
+ },
199
+ "algorithm": {
200
+ "type": "string",
201
+ "enum": [
202
+ "HS256",
203
+ "HS384",
204
+ "HS512",
205
+ "RS256",
206
+ "RS384",
207
+ "RS512",
208
+ "ES256",
209
+ "ES384",
210
+ "ES512",
211
+ "PS256",
212
+ "PS384",
213
+ "PS512"
214
+ ],
215
+ "description": "JWT algorithm"
216
+ },
217
+ "issuer": {
218
+ "type": "string",
219
+ "description": "Token issuer"
220
+ },
221
+ "audience": {
222
+ "type": "string",
223
+ "description": "Token audience"
224
+ },
225
+ "name": {
226
+ "type": "string",
227
+ "description": "Cookie name"
228
+ },
229
+ "setHeadersEnabled": {
230
+ "type": "boolean",
231
+ "description": "Set token in response headers"
232
+ },
233
+ "returnJson": {
234
+ "type": "boolean",
235
+ "description": "Return token in JSON response"
236
+ }
237
+ }
238
+ },
239
+ "login": {
240
+ "type": "object",
241
+ "properties": {
242
+ "route": {
243
+ "type": "string"
244
+ },
245
+ "rememberMe": {
246
+ "type": "boolean"
247
+ },
248
+ "isPublic": {
249
+ "type": "boolean"
250
+ },
251
+ "enabled": {
252
+ "type": "boolean"
253
+ }
254
+ }
255
+ },
256
+ "register": {
257
+ "type": "object",
258
+ "properties": {
259
+ "route": {
260
+ "type": "string",
261
+ "description": "Custom route path"
262
+ },
263
+ "isPublic": {
264
+ "type": "boolean",
265
+ "description": "Route is public (no auth required)"
266
+ },
267
+ "enabled": {
268
+ "type": "boolean",
269
+ "description": "Route is enabled"
270
+ }
271
+ }
272
+ },
273
+ "logout": {
274
+ "type": "object",
275
+ "properties": {
276
+ "route": {
277
+ "type": "string",
278
+ "description": "Custom route path"
279
+ },
280
+ "isPublic": {
281
+ "type": "boolean",
282
+ "description": "Route is public (no auth required)"
283
+ },
284
+ "enabled": {
285
+ "type": "boolean",
286
+ "description": "Route is enabled"
287
+ }
288
+ }
289
+ },
290
+ "refresh": {
291
+ "type": "object",
292
+ "properties": {
293
+ "route": {
294
+ "type": "string",
295
+ "description": "Custom route path"
296
+ },
297
+ "isPublic": {
298
+ "type": "boolean",
299
+ "description": "Route is public (no auth required)"
300
+ },
301
+ "enabled": {
302
+ "type": "boolean",
303
+ "description": "Route is enabled"
304
+ }
305
+ }
306
+ },
307
+ "passwordReset": {
308
+ "type": "object",
309
+ "properties": {
310
+ "route": {
311
+ "type": "string"
312
+ },
313
+ "isPublic": {
314
+ "type": "boolean"
315
+ },
316
+ "enabled": {
317
+ "type": "boolean"
318
+ },
319
+ "redirectUrl": {
320
+ "type": "string"
321
+ }
322
+ }
323
+ },
324
+ "passwordChange": {
325
+ "type": "object",
326
+ "properties": {
327
+ "route": {
328
+ "type": "string",
329
+ "description": "Custom route path"
330
+ },
331
+ "isPublic": {
332
+ "type": "boolean",
333
+ "description": "Route is public (no auth required)"
334
+ },
335
+ "enabled": {
336
+ "type": "boolean",
337
+ "description": "Route is enabled"
338
+ }
339
+ }
340
+ },
341
+ "sessions": {
342
+ "type": "object",
343
+ "properties": {
344
+ "route": {
345
+ "type": "string"
346
+ },
347
+ "isPublic": {
348
+ "type": "boolean"
349
+ },
350
+ "enabled": {
351
+ "type": "boolean"
352
+ },
353
+ "maxActiveSessions": {
354
+ "type": "number"
355
+ },
356
+ "inactivityTimeout": {
357
+ "type": "string"
358
+ },
359
+ "allowMultipleDevices": {
360
+ "type": "boolean"
361
+ },
362
+ "trustNewDevices": {
363
+ "type": "boolean"
364
+ },
365
+ "notifyOnNewDevice": {
366
+ "type": "boolean"
367
+ }
368
+ }
369
+ },
370
+ "magicLink": {
371
+ "type": "object",
372
+ "properties": {
373
+ "route": {
374
+ "type": "string"
375
+ },
376
+ "verifyRoute": {
377
+ "type": "string"
378
+ },
379
+ "isPublic": {
380
+ "type": "boolean"
381
+ },
382
+ "enabled": {
383
+ "type": "boolean"
384
+ },
385
+ "expiresIn": {
386
+ "type": "string"
387
+ },
388
+ "redirectUrl": {
389
+ "type": "string"
390
+ }
391
+ }
392
+ },
393
+ "me": {
394
+ "type": "object",
395
+ "properties": {
396
+ "route": {
397
+ "type": "string"
398
+ },
399
+ "isPublic": {
400
+ "type": "boolean"
401
+ },
402
+ "enabled": {
403
+ "type": "boolean"
404
+ },
405
+ "includeProfile": {
406
+ "type": "boolean"
407
+ },
408
+ "includeAddresses": {
409
+ "type": "boolean"
410
+ },
411
+ "includePhones": {
412
+ "type": "boolean"
413
+ },
414
+ "includeFiles": {
415
+ "type": "boolean"
416
+ }
417
+ }
418
+ }
419
+ }
420
+ },
421
+ "authorization": {
422
+ "type": "object",
423
+ "properties": {
424
+ "enabled": {
425
+ "type": "boolean",
426
+ "default": false
427
+ },
428
+ "autoSeedClaims": {
429
+ "type": "boolean",
430
+ "default": true
431
+ },
432
+ "skipTables": {
433
+ "type": "array",
434
+ "items": {
435
+ "type": "string"
436
+ }
437
+ },
438
+ "skipColumns": {
439
+ "type": "array",
440
+ "items": {
441
+ "type": "string"
442
+ }
443
+ },
444
+ "excludedPaths": {
445
+ "type": "array",
446
+ "items": {
447
+ "type": "string"
448
+ }
449
+ },
450
+ "publicPaths": {
451
+ "type": "array",
452
+ "items": {
453
+ "type": "string"
454
+ }
455
+ },
456
+ "godminEmail": {
457
+ "type": "string"
458
+ },
459
+ "godminPassword": {
460
+ "type": "string"
461
+ }
462
+ }
463
+ },
464
+ "audit": {
465
+ "type": "object",
466
+ "properties": {
467
+ "enabled": {
468
+ "type": "boolean",
469
+ "default": false
470
+ },
471
+ "actions": {
472
+ "type": "object",
473
+ "properties": {
474
+ "GET": {
475
+ "type": "boolean"
476
+ },
477
+ "INSERT": {
478
+ "type": "boolean"
479
+ },
480
+ "UPDATE": {
481
+ "type": "boolean"
482
+ },
483
+ "DELETE": {
484
+ "type": "boolean"
485
+ },
486
+ "TOGGLE": {
487
+ "type": "boolean"
488
+ },
489
+ "VERIFICATION": {
490
+ "type": "boolean"
491
+ }
492
+ }
493
+ }
494
+ }
495
+ },
496
+ "verification": {
497
+ "type": "object",
498
+ "properties": {
499
+ "enabled": {
500
+ "type": "boolean"
501
+ },
502
+ "autoResetOnRejection": {
503
+ "type": "boolean"
504
+ },
505
+ "requireSignatureByDefault": {
506
+ "type": "boolean"
507
+ },
508
+ "diffTrackingEnabled": {
509
+ "type": "boolean"
510
+ },
511
+ "endpoints": {
512
+ "type": "object",
513
+ "properties": {
514
+ "enabled": {
515
+ "type": "boolean"
516
+ },
517
+ "basePath": {
518
+ "type": "string"
519
+ }
520
+ }
521
+ }
522
+ }
523
+ },
524
+ "notification": {
525
+ "type": "object",
526
+ "properties": {
527
+ "enabled": {
528
+ "type": "boolean"
529
+ },
530
+ "portalEnabled": {
531
+ "type": "boolean"
532
+ },
533
+ "emailEnabled": {
534
+ "type": "boolean"
535
+ },
536
+ "defaultChannel": {
537
+ "type": "string",
538
+ "enum": [
539
+ "portal",
540
+ "email",
541
+ "both"
542
+ ]
543
+ },
544
+ "templateVariables": {
545
+ "type": "object",
546
+ "additionalProperties": {
547
+ "type": "string"
548
+ }
549
+ }
550
+ }
551
+ },
552
+ "rateLimit": {
553
+ "type": "object",
554
+ "properties": {
555
+ "enabled": {
556
+ "type": "boolean"
557
+ },
558
+ "strategy": {
559
+ "type": "string",
560
+ "enum": [
561
+ "sliding-window",
562
+ "fixed-window",
563
+ "token-bucket"
564
+ ]
565
+ },
566
+ "keyPrefix": {
567
+ "type": "string"
568
+ },
569
+ "authRoutes": {
570
+ "type": "object",
571
+ "properties": {
572
+ "window": {
573
+ "type": "string"
574
+ },
575
+ "max": {
576
+ "type": "number"
577
+ },
578
+ "login": {
579
+ "type": "object",
580
+ "properties": {
581
+ "window": {
582
+ "type": "string",
583
+ "description": "Time window (e.g., \"1m\", \"1h\")"
584
+ },
585
+ "max": {
586
+ "type": "number",
587
+ "description": "Maximum requests in window"
588
+ },
589
+ "blockDuration": {
590
+ "type": "string",
591
+ "description": "Block duration after limit exceeded"
592
+ }
593
+ }
594
+ },
595
+ "register": {
596
+ "type": "object",
597
+ "properties": {
598
+ "window": {
599
+ "type": "string",
600
+ "description": "Time window (e.g., \"1m\", \"1h\")"
601
+ },
602
+ "max": {
603
+ "type": "number",
604
+ "description": "Maximum requests in window"
605
+ },
606
+ "blockDuration": {
607
+ "type": "string",
608
+ "description": "Block duration after limit exceeded"
609
+ }
610
+ }
611
+ },
612
+ "passwordReset": {
613
+ "type": "object",
614
+ "properties": {
615
+ "window": {
616
+ "type": "string",
617
+ "description": "Time window (e.g., \"1m\", \"1h\")"
618
+ },
619
+ "max": {
620
+ "type": "number",
621
+ "description": "Maximum requests in window"
622
+ },
623
+ "blockDuration": {
624
+ "type": "string",
625
+ "description": "Block duration after limit exceeded"
626
+ }
627
+ }
628
+ },
629
+ "magicLink": {
630
+ "type": "object",
631
+ "properties": {
632
+ "window": {
633
+ "type": "string",
634
+ "description": "Time window (e.g., \"1m\", \"1h\")"
635
+ },
636
+ "max": {
637
+ "type": "number",
638
+ "description": "Maximum requests in window"
639
+ },
640
+ "blockDuration": {
641
+ "type": "string",
642
+ "description": "Block duration after limit exceeded"
643
+ }
644
+ }
645
+ }
646
+ }
647
+ },
648
+ "publicRoutes": {
649
+ "type": "object",
650
+ "properties": {
651
+ "window": {
652
+ "type": "string"
653
+ },
654
+ "max": {
655
+ "type": "number"
656
+ }
657
+ }
658
+ },
659
+ "privateRoutes": {
660
+ "type": "object",
661
+ "properties": {
662
+ "window": {
663
+ "type": "string"
664
+ },
665
+ "max": {
666
+ "type": "number"
667
+ }
668
+ }
669
+ },
670
+ "byIp": {
671
+ "type": "boolean"
672
+ },
673
+ "byUserId": {
674
+ "type": "boolean"
675
+ },
676
+ "byEndpoint": {
677
+ "type": "boolean"
678
+ },
679
+ "skipSuccessfulRequests": {
680
+ "type": "boolean"
681
+ },
682
+ "headers": {
683
+ "type": "object",
684
+ "properties": {
685
+ "remaining": {
686
+ "type": "string"
687
+ },
688
+ "reset": {
689
+ "type": "string"
690
+ },
691
+ "limit": {
692
+ "type": "string"
693
+ }
694
+ }
695
+ },
696
+ "whitelist": {
697
+ "type": "array",
698
+ "items": {
699
+ "type": "string"
700
+ }
701
+ },
702
+ "blacklist": {
703
+ "type": "array",
704
+ "items": {
705
+ "type": "string"
706
+ }
707
+ }
708
+ }
709
+ },
710
+ "monitoring": {
711
+ "type": "object",
712
+ "properties": {
713
+ "enabled": {
714
+ "type": "boolean"
715
+ },
716
+ "system": {
717
+ "type": "object",
718
+ "properties": {
719
+ "enabled": {
720
+ "type": "boolean"
721
+ },
722
+ "collectInterval": {
723
+ "type": "string"
724
+ },
725
+ "metrics": {
726
+ "type": "object",
727
+ "properties": {
728
+ "cpu": {
729
+ "type": "boolean"
730
+ },
731
+ "memory": {
732
+ "type": "boolean"
733
+ },
734
+ "disk": {
735
+ "type": "boolean"
736
+ },
737
+ "network": {
738
+ "type": "boolean"
739
+ },
740
+ "process": {
741
+ "type": "boolean"
742
+ }
743
+ }
744
+ }
745
+ }
746
+ },
747
+ "application": {
748
+ "type": "object",
749
+ "properties": {
750
+ "enabled": {
751
+ "type": "boolean"
752
+ },
753
+ "metrics": {
754
+ "type": "object",
755
+ "properties": {
756
+ "requests": {
757
+ "type": "boolean"
758
+ },
759
+ "responseTime": {
760
+ "type": "boolean"
761
+ },
762
+ "errors": {
763
+ "type": "boolean"
764
+ },
765
+ "rateLimits": {
766
+ "type": "boolean"
767
+ }
768
+ }
769
+ }
770
+ }
771
+ },
772
+ "database": {
773
+ "type": "object",
774
+ "properties": {
775
+ "enabled": {
776
+ "type": "boolean"
777
+ },
778
+ "metrics": {
779
+ "type": "object",
780
+ "properties": {
781
+ "connections": {
782
+ "type": "boolean"
783
+ },
784
+ "queryTime": {
785
+ "type": "boolean"
786
+ },
787
+ "slowQueryThreshold": {
788
+ "type": "string"
789
+ }
790
+ }
791
+ }
792
+ }
793
+ },
794
+ "redis": {
795
+ "type": "object",
796
+ "properties": {
797
+ "enabled": {
798
+ "type": "boolean"
799
+ }
800
+ }
801
+ },
802
+ "persistence": {
803
+ "type": "object",
804
+ "properties": {
805
+ "enabled": {
806
+ "type": "boolean"
807
+ },
808
+ "flushInterval": {
809
+ "type": "string"
810
+ },
811
+ "retentionDays": {
812
+ "type": "number"
813
+ }
814
+ }
815
+ },
816
+ "alerts": {
817
+ "type": "object",
818
+ "properties": {
819
+ "enabled": {
820
+ "type": "boolean"
821
+ },
822
+ "email": {
823
+ "type": "object",
824
+ "properties": {
825
+ "enabled": {
826
+ "type": "boolean"
827
+ },
828
+ "recipients": {
829
+ "type": "array",
830
+ "items": {
831
+ "type": "string"
832
+ }
833
+ }
834
+ }
835
+ },
836
+ "thresholds": {
837
+ "type": "object",
838
+ "properties": {
839
+ "cpuPercent": {
840
+ "type": "number"
841
+ },
842
+ "memoryPercent": {
843
+ "type": "number"
844
+ },
845
+ "diskPercent": {
846
+ "type": "number"
847
+ },
848
+ "errorRatePercent": {
849
+ "type": "number"
850
+ },
851
+ "responseTimeMs": {
852
+ "type": "number"
853
+ },
854
+ "rateLimitBlocksPerMinute": {
855
+ "type": "number"
856
+ }
857
+ }
858
+ },
859
+ "cooldown": {
860
+ "type": "string"
861
+ }
862
+ }
863
+ },
864
+ "endpoints": {
865
+ "type": "object",
866
+ "properties": {
867
+ "enabled": {
868
+ "type": "boolean"
869
+ },
870
+ "basePath": {
871
+ "type": "string"
872
+ },
873
+ "stream": {
874
+ "type": "object",
875
+ "properties": {
876
+ "enabled": {
877
+ "type": "boolean"
878
+ },
879
+ "path": {
880
+ "type": "string"
881
+ },
882
+ "interval": {
883
+ "type": "string"
884
+ }
885
+ }
886
+ },
887
+ "snapshot": {
888
+ "type": "object",
889
+ "properties": {
890
+ "enabled": {
891
+ "type": "boolean"
892
+ },
893
+ "path": {
894
+ "type": "string"
895
+ }
896
+ }
897
+ },
898
+ "history": {
899
+ "type": "object",
900
+ "properties": {
901
+ "enabled": {
902
+ "type": "boolean"
903
+ },
904
+ "path": {
905
+ "type": "string"
906
+ },
907
+ "maxMinutes": {
908
+ "type": "number"
909
+ }
910
+ }
911
+ },
912
+ "alerts": {
913
+ "type": "object",
914
+ "properties": {
915
+ "enabled": {
916
+ "type": "boolean"
917
+ },
918
+ "path": {
919
+ "type": "string"
920
+ }
921
+ }
922
+ }
923
+ }
924
+ }
925
+ }
926
+ },
927
+ "email": {
928
+ "type": "object",
929
+ "properties": {
930
+ "gmail": {
931
+ "type": "object",
932
+ "properties": {
933
+ "enabled": {
934
+ "type": "boolean"
935
+ },
936
+ "json_file_path": {
937
+ "type": "string"
938
+ },
939
+ "from_email": {
940
+ "type": "string"
941
+ },
942
+ "from_name": {
943
+ "type": "string"
944
+ }
945
+ }
946
+ }
947
+ }
948
+ },
949
+ "storage": {
950
+ "type": "object",
951
+ "properties": {
952
+ "enabled": {
953
+ "type": "boolean"
954
+ },
955
+ "basePath": {
956
+ "type": "string"
957
+ },
958
+ "maxFileSizeBytes": {
959
+ "type": "number"
960
+ },
961
+ "allowedMimeTypes": {
962
+ "type": "array",
963
+ "items": {
964
+ "type": "string"
965
+ }
966
+ },
967
+ "blockedMimeTypes": {
968
+ "type": "array",
969
+ "items": {
970
+ "type": "string"
971
+ }
972
+ },
973
+ "cdn": {
974
+ "type": "object",
975
+ "properties": {
976
+ "enabled": {
977
+ "type": "boolean"
978
+ },
979
+ "basePath": {
980
+ "type": "string"
981
+ },
982
+ "cacheMaxAge": {
983
+ "type": "number"
984
+ },
985
+ "enableRangeRequests": {
986
+ "type": "boolean"
987
+ },
988
+ "enableEtag": {
989
+ "type": "boolean"
990
+ },
991
+ "corsOrigins": {
992
+ "type": "array",
993
+ "items": {
994
+ "type": "string"
995
+ }
996
+ }
997
+ }
998
+ },
999
+ "formData": {
1000
+ "type": "object",
1001
+ "properties": {
1002
+ "filesField": {
1003
+ "type": "string"
1004
+ },
1005
+ "dataField": {
1006
+ "type": "string"
1007
+ },
1008
+ "maxFiles": {
1009
+ "type": "number"
1010
+ }
1011
+ }
1012
+ }
1013
+ }
1014
+ },
1015
+ "entities": {
1016
+ "type": "array",
1017
+ "description": "Entity/table definitions",
1018
+ "items": {
1019
+ "$ref": "table.schema.json"
1020
+ }
1021
+ }
1022
+ },
1023
+ "required": [
1024
+ "appId",
1025
+ "entities"
1026
+ ],
1027
+ "additionalProperties": false
1028
+ }