@voidbase-cloud/voidbase 0.1.0

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 (134) hide show
  1. package/.env.example +9 -0
  2. package/CHANGELOG.md +19 -0
  3. package/COMPAT.md +43 -0
  4. package/LICENSE +21 -0
  5. package/NOTICE +8 -0
  6. package/README.md +124 -0
  7. package/bin/voidbase.ts +158 -0
  8. package/crons/every-minute.ts +13 -0
  9. package/db/migrations/20260905175935_large_swarm.sql +87 -0
  10. package/db/migrations/20260905185720_wild_sunspot.sql +16 -0
  11. package/db/migrations/20260905190723_solid_toro.sql +1 -0
  12. package/db/migrations/20260905213340_remarkable_union_jack.sql +11 -0
  13. package/db/migrations/meta/20260905175935_snapshot.json +599 -0
  14. package/db/migrations/meta/20260905185720_snapshot.json +703 -0
  15. package/db/migrations/meta/20260905190723_snapshot.json +710 -0
  16. package/db/migrations/meta/20260905213340_snapshot.json +781 -0
  17. package/db/migrations/meta/_journal.json +34 -0
  18. package/db/schema.ts +130 -0
  19. package/docs/deploy.md +153 -0
  20. package/docs/differences.md +88 -0
  21. package/docs/hooks.md +84 -0
  22. package/docs/migrating.md +29 -0
  23. package/docs/perf.md +53 -0
  24. package/docs/platform.md +208 -0
  25. package/docs/releasing.md +38 -0
  26. package/env.ts +23 -0
  27. package/hooks-plugin.ts +237 -0
  28. package/package.json +134 -0
  29. package/queues/jobs.ts +13 -0
  30. package/routes/api/[...path].ts +19 -0
  31. package/scripts/bench-realtime.ts +46 -0
  32. package/scripts/bench.ts +39 -0
  33. package/scripts/ci-suites.sh +27 -0
  34. package/scripts/dev.sh +29 -0
  35. package/scripts/export.ts +70 -0
  36. package/scripts/seed-app-user.sh +14 -0
  37. package/scripts/seed-d1.ts +17 -0
  38. package/scripts/seed-reference.sh +29 -0
  39. package/scripts/starter.sh +22 -0
  40. package/scripts/sync-app.ts +22 -0
  41. package/scripts/sync-panel.ts +66 -0
  42. package/src/cloud/rest.ts +297 -0
  43. package/src/node/assets.ts +22 -0
  44. package/src/node/bundle.ts +88 -0
  45. package/src/node/cloud-init.ts +51 -0
  46. package/src/node/d1.ts +44 -0
  47. package/src/node/deploy-cf.ts +179 -0
  48. package/src/node/index.ts +5 -0
  49. package/src/node/panel.ts +21 -0
  50. package/src/node/serve.ts +125 -0
  51. package/src/node/storage.ts +51 -0
  52. package/src/platform/node/env.ts +4 -0
  53. package/src/platform/node/hooks.ts +19 -0
  54. package/src/platform/node/log.ts +7 -0
  55. package/src/platform/node/migrations.ts +5 -0
  56. package/src/platform/node/photon.ts +1 -0
  57. package/src/platform/node/sockets.ts +22 -0
  58. package/src/platform/node/sse.ts +23 -0
  59. package/src/platform/workers/env.ts +3 -0
  60. package/src/platform/workers/hooks.ts +2 -0
  61. package/src/platform/workers/log.ts +1 -0
  62. package/src/platform/workers/migrations.ts +1 -0
  63. package/src/platform/workers/photon.ts +1 -0
  64. package/src/platform/workers/sockets.ts +3 -0
  65. package/src/platform/workers/sse.ts +1 -0
  66. package/src/server/api.ts +27 -0
  67. package/src/server/app.ts +582 -0
  68. package/src/server/auth-extra.ts +113 -0
  69. package/src/server/auth-flows.ts +186 -0
  70. package/src/server/auth-response.ts +111 -0
  71. package/src/server/auth.ts +187 -0
  72. package/src/server/backups.ts +234 -0
  73. package/src/server/batch.ts +123 -0
  74. package/src/server/bootstrap.ts +71 -0
  75. package/src/server/collections/auth-option-shape.json +71 -0
  76. package/src/server/collections/ddl.ts +127 -0
  77. package/src/server/collections/fields.ts +120 -0
  78. package/src/server/collections/model.ts +185 -0
  79. package/src/server/collections/oauth2-providers.json +1 -0
  80. package/src/server/collections/scaffolds.json +210 -0
  81. package/src/server/collections/service.ts +392 -0
  82. package/src/server/collections/system.json +605 -0
  83. package/src/server/collections/system.ts +19 -0
  84. package/src/server/collections/validate.ts +239 -0
  85. package/src/server/crc32.ts +13 -0
  86. package/src/server/crons.ts +100 -0
  87. package/src/server/crypto.ts +26 -0
  88. package/src/server/db.ts +37 -0
  89. package/src/server/errors.ts +53 -0
  90. package/src/server/files-api.ts +52 -0
  91. package/src/server/filter/compile.ts +420 -0
  92. package/src/server/filter/lexer.ts +107 -0
  93. package/src/server/filter/parser.ts +49 -0
  94. package/src/server/hardening.ts +136 -0
  95. package/src/server/hooks/index.ts +147 -0
  96. package/src/server/hooks/migrations.ts +58 -0
  97. package/src/server/hooks/node-async-hooks.d.ts +7 -0
  98. package/src/server/hooks/record.ts +152 -0
  99. package/src/server/hooks/runtime.ts +344 -0
  100. package/src/server/hooks/virtual-migrations.d.ts +4 -0
  101. package/src/server/hooks/virtual.d.ts +7 -0
  102. package/src/server/hub.ts +91 -0
  103. package/src/server/ids.ts +22 -0
  104. package/src/server/jobs.ts +84 -0
  105. package/src/server/jwt.ts +61 -0
  106. package/src/server/logs.ts +144 -0
  107. package/src/server/mail/index.ts +99 -0
  108. package/src/server/mail/message.ts +43 -0
  109. package/src/server/mail/smtp.ts +82 -0
  110. package/src/server/mail/templates.ts +168 -0
  111. package/src/server/oauth2/index.ts +198 -0
  112. package/src/server/oauth2/providers.ts +153 -0
  113. package/src/server/password.ts +17 -0
  114. package/src/server/realtime/hub-client.ts +50 -0
  115. package/src/server/realtime/index.ts +239 -0
  116. package/src/server/records/expand.ts +129 -0
  117. package/src/server/records/files.ts +69 -0
  118. package/src/server/records/json.ts +23 -0
  119. package/src/server/records/picker.ts +80 -0
  120. package/src/server/records/service.ts +598 -0
  121. package/src/server/records/thumbs.ts +148 -0
  122. package/src/server/records/values.ts +295 -0
  123. package/src/server/settings-api.ts +104 -0
  124. package/src/server/settings.ts +215 -0
  125. package/src/server/sql.ts +61 -0
  126. package/src/server/static.ts +17 -0
  127. package/src/server/storage/s3.ts +118 -0
  128. package/src/server/types.ts +25 -0
  129. package/src/server/webauthn.ts +168 -0
  130. package/tsconfig.json +36 -0
  131. package/tsconfig.node.json +27 -0
  132. package/types/pb_data.d.ts +24438 -0
  133. package/vite.config.ts +10 -0
  134. package/void.json +12 -0
@@ -0,0 +1,605 @@
1
+ [
2
+ {
3
+ "id": "pbc_4275539003",
4
+ "listRule": "@request.auth.id != '' && recordRef = @request.auth.id && collectionRef = @request.auth.collectionId",
5
+ "viewRule": "@request.auth.id != '' && recordRef = @request.auth.id && collectionRef = @request.auth.collectionId",
6
+ "createRule": null,
7
+ "updateRule": null,
8
+ "deleteRule": "@request.auth.id != '' && recordRef = @request.auth.id && collectionRef = @request.auth.collectionId",
9
+ "name": "_authOrigins",
10
+ "type": "base",
11
+ "fields": [
12
+ {
13
+ "autogeneratePattern": "[a-z0-9]{15}",
14
+ "help": "",
15
+ "hidden": false,
16
+ "id": "text3208210256",
17
+ "max": 15,
18
+ "min": 15,
19
+ "name": "id",
20
+ "pattern": "^[a-z0-9]+$",
21
+ "presentable": false,
22
+ "primaryKey": true,
23
+ "required": true,
24
+ "system": true,
25
+ "type": "text"
26
+ },
27
+ {
28
+ "autogeneratePattern": "",
29
+ "help": "",
30
+ "hidden": false,
31
+ "id": "text455797646",
32
+ "max": 0,
33
+ "min": 0,
34
+ "name": "collectionRef",
35
+ "pattern": "",
36
+ "presentable": false,
37
+ "primaryKey": false,
38
+ "required": true,
39
+ "system": true,
40
+ "type": "text"
41
+ },
42
+ {
43
+ "autogeneratePattern": "",
44
+ "help": "",
45
+ "hidden": false,
46
+ "id": "text127846527",
47
+ "max": 0,
48
+ "min": 0,
49
+ "name": "recordRef",
50
+ "pattern": "",
51
+ "presentable": false,
52
+ "primaryKey": false,
53
+ "required": true,
54
+ "system": true,
55
+ "type": "text"
56
+ },
57
+ {
58
+ "autogeneratePattern": "",
59
+ "help": "",
60
+ "hidden": false,
61
+ "id": "text4228609354",
62
+ "max": 0,
63
+ "min": 0,
64
+ "name": "fingerprint",
65
+ "pattern": "",
66
+ "presentable": false,
67
+ "primaryKey": false,
68
+ "required": true,
69
+ "system": true,
70
+ "type": "text"
71
+ },
72
+ {
73
+ "hidden": false,
74
+ "id": "autodate2990389176",
75
+ "name": "created",
76
+ "onCreate": true,
77
+ "onUpdate": false,
78
+ "presentable": false,
79
+ "system": true,
80
+ "type": "autodate"
81
+ },
82
+ {
83
+ "hidden": false,
84
+ "id": "autodate3332085495",
85
+ "name": "updated",
86
+ "onCreate": true,
87
+ "onUpdate": true,
88
+ "presentable": false,
89
+ "system": true,
90
+ "type": "autodate"
91
+ }
92
+ ],
93
+ "indexes": [
94
+ "CREATE UNIQUE INDEX `idx_authOrigins_unique_pairs` ON `_authOrigins` (collectionRef, recordRef, fingerprint)"
95
+ ],
96
+ "created": "2026-09-05 16:27:35.766Z",
97
+ "updated": "2026-09-05 16:27:35.868Z",
98
+ "system": true
99
+ },
100
+ {
101
+ "id": "pbc_2281828961",
102
+ "listRule": "@request.auth.id != '' && recordRef = @request.auth.id && collectionRef = @request.auth.collectionId",
103
+ "viewRule": "@request.auth.id != '' && recordRef = @request.auth.id && collectionRef = @request.auth.collectionId",
104
+ "createRule": null,
105
+ "updateRule": null,
106
+ "deleteRule": "@request.auth.id != '' && recordRef = @request.auth.id && collectionRef = @request.auth.collectionId",
107
+ "name": "_externalAuths",
108
+ "type": "base",
109
+ "fields": [
110
+ {
111
+ "autogeneratePattern": "[a-z0-9]{15}",
112
+ "help": "",
113
+ "hidden": false,
114
+ "id": "text3208210256",
115
+ "max": 15,
116
+ "min": 15,
117
+ "name": "id",
118
+ "pattern": "^[a-z0-9]+$",
119
+ "presentable": false,
120
+ "primaryKey": true,
121
+ "required": true,
122
+ "system": true,
123
+ "type": "text"
124
+ },
125
+ {
126
+ "autogeneratePattern": "",
127
+ "help": "",
128
+ "hidden": false,
129
+ "id": "text455797646",
130
+ "max": 0,
131
+ "min": 0,
132
+ "name": "collectionRef",
133
+ "pattern": "",
134
+ "presentable": false,
135
+ "primaryKey": false,
136
+ "required": true,
137
+ "system": true,
138
+ "type": "text"
139
+ },
140
+ {
141
+ "autogeneratePattern": "",
142
+ "help": "",
143
+ "hidden": false,
144
+ "id": "text127846527",
145
+ "max": 0,
146
+ "min": 0,
147
+ "name": "recordRef",
148
+ "pattern": "",
149
+ "presentable": false,
150
+ "primaryKey": false,
151
+ "required": true,
152
+ "system": true,
153
+ "type": "text"
154
+ },
155
+ {
156
+ "autogeneratePattern": "",
157
+ "help": "",
158
+ "hidden": false,
159
+ "id": "text2462348188",
160
+ "max": 0,
161
+ "min": 0,
162
+ "name": "provider",
163
+ "pattern": "",
164
+ "presentable": false,
165
+ "primaryKey": false,
166
+ "required": true,
167
+ "system": true,
168
+ "type": "text"
169
+ },
170
+ {
171
+ "autogeneratePattern": "",
172
+ "help": "",
173
+ "hidden": false,
174
+ "id": "text1044722854",
175
+ "max": 0,
176
+ "min": 0,
177
+ "name": "providerId",
178
+ "pattern": "",
179
+ "presentable": false,
180
+ "primaryKey": false,
181
+ "required": true,
182
+ "system": true,
183
+ "type": "text"
184
+ },
185
+ {
186
+ "hidden": false,
187
+ "id": "autodate2990389176",
188
+ "name": "created",
189
+ "onCreate": true,
190
+ "onUpdate": false,
191
+ "presentable": false,
192
+ "system": true,
193
+ "type": "autodate"
194
+ },
195
+ {
196
+ "hidden": false,
197
+ "id": "autodate3332085495",
198
+ "name": "updated",
199
+ "onCreate": true,
200
+ "onUpdate": true,
201
+ "presentable": false,
202
+ "system": true,
203
+ "type": "autodate"
204
+ }
205
+ ],
206
+ "indexes": [
207
+ "CREATE UNIQUE INDEX `idx_externalAuths_record_provider` ON `_externalAuths` (collectionRef, recordRef, provider)",
208
+ "CREATE UNIQUE INDEX `idx_externalAuths_collection_provider` ON `_externalAuths` (collectionRef, provider, providerId)"
209
+ ],
210
+ "created": "2026-09-05 16:27:35.765Z",
211
+ "updated": "2026-09-05 16:27:35.867Z",
212
+ "system": true
213
+ },
214
+ {
215
+ "id": "pbc_2279338944",
216
+ "listRule": "@request.auth.id != '' && recordRef = @request.auth.id && collectionRef = @request.auth.collectionId",
217
+ "viewRule": "@request.auth.id != '' && recordRef = @request.auth.id && collectionRef = @request.auth.collectionId",
218
+ "createRule": null,
219
+ "updateRule": null,
220
+ "deleteRule": null,
221
+ "name": "_mfas",
222
+ "type": "base",
223
+ "fields": [
224
+ {
225
+ "autogeneratePattern": "[a-z0-9]{15}",
226
+ "help": "",
227
+ "hidden": false,
228
+ "id": "text3208210256",
229
+ "max": 15,
230
+ "min": 15,
231
+ "name": "id",
232
+ "pattern": "^[a-z0-9]+$",
233
+ "presentable": false,
234
+ "primaryKey": true,
235
+ "required": true,
236
+ "system": true,
237
+ "type": "text"
238
+ },
239
+ {
240
+ "autogeneratePattern": "",
241
+ "help": "",
242
+ "hidden": false,
243
+ "id": "text455797646",
244
+ "max": 0,
245
+ "min": 0,
246
+ "name": "collectionRef",
247
+ "pattern": "",
248
+ "presentable": false,
249
+ "primaryKey": false,
250
+ "required": true,
251
+ "system": true,
252
+ "type": "text"
253
+ },
254
+ {
255
+ "autogeneratePattern": "",
256
+ "help": "",
257
+ "hidden": false,
258
+ "id": "text127846527",
259
+ "max": 0,
260
+ "min": 0,
261
+ "name": "recordRef",
262
+ "pattern": "",
263
+ "presentable": false,
264
+ "primaryKey": false,
265
+ "required": true,
266
+ "system": true,
267
+ "type": "text"
268
+ },
269
+ {
270
+ "autogeneratePattern": "",
271
+ "help": "",
272
+ "hidden": false,
273
+ "id": "text1582905952",
274
+ "max": 0,
275
+ "min": 0,
276
+ "name": "method",
277
+ "pattern": "",
278
+ "presentable": false,
279
+ "primaryKey": false,
280
+ "required": true,
281
+ "system": true,
282
+ "type": "text"
283
+ },
284
+ {
285
+ "hidden": false,
286
+ "id": "autodate2990389176",
287
+ "name": "created",
288
+ "onCreate": true,
289
+ "onUpdate": false,
290
+ "presentable": false,
291
+ "system": true,
292
+ "type": "autodate"
293
+ },
294
+ {
295
+ "hidden": false,
296
+ "id": "autodate3332085495",
297
+ "name": "updated",
298
+ "onCreate": true,
299
+ "onUpdate": true,
300
+ "presentable": false,
301
+ "system": true,
302
+ "type": "autodate"
303
+ }
304
+ ],
305
+ "indexes": [
306
+ "CREATE INDEX `idx_mfas_collectionRef_recordRef` ON `_mfas` (collectionRef,recordRef)"
307
+ ],
308
+ "created": "2026-09-05 16:27:35.762Z",
309
+ "updated": "2026-09-05 16:27:35.864Z",
310
+ "system": true
311
+ },
312
+ {
313
+ "id": "pbc_1638494021",
314
+ "listRule": "@request.auth.id != '' && recordRef = @request.auth.id && collectionRef = @request.auth.collectionId",
315
+ "viewRule": "@request.auth.id != '' && recordRef = @request.auth.id && collectionRef = @request.auth.collectionId",
316
+ "createRule": null,
317
+ "updateRule": null,
318
+ "deleteRule": null,
319
+ "name": "_otps",
320
+ "type": "base",
321
+ "fields": [
322
+ {
323
+ "autogeneratePattern": "[a-z0-9]{15}",
324
+ "help": "",
325
+ "hidden": false,
326
+ "id": "text3208210256",
327
+ "max": 15,
328
+ "min": 15,
329
+ "name": "id",
330
+ "pattern": "^[a-z0-9]+$",
331
+ "presentable": false,
332
+ "primaryKey": true,
333
+ "required": true,
334
+ "system": true,
335
+ "type": "text"
336
+ },
337
+ {
338
+ "autogeneratePattern": "",
339
+ "help": "",
340
+ "hidden": false,
341
+ "id": "text455797646",
342
+ "max": 0,
343
+ "min": 0,
344
+ "name": "collectionRef",
345
+ "pattern": "",
346
+ "presentable": false,
347
+ "primaryKey": false,
348
+ "required": true,
349
+ "system": true,
350
+ "type": "text"
351
+ },
352
+ {
353
+ "autogeneratePattern": "",
354
+ "help": "",
355
+ "hidden": false,
356
+ "id": "text127846527",
357
+ "max": 0,
358
+ "min": 0,
359
+ "name": "recordRef",
360
+ "pattern": "",
361
+ "presentable": false,
362
+ "primaryKey": false,
363
+ "required": true,
364
+ "system": true,
365
+ "type": "text"
366
+ },
367
+ {
368
+ "cost": 8,
369
+ "help": "",
370
+ "hidden": true,
371
+ "id": "password901924565",
372
+ "max": 0,
373
+ "min": 0,
374
+ "name": "password",
375
+ "pattern": "",
376
+ "presentable": false,
377
+ "required": true,
378
+ "system": true,
379
+ "type": "password"
380
+ },
381
+ {
382
+ "autogeneratePattern": "",
383
+ "help": "",
384
+ "hidden": true,
385
+ "id": "text3866985172",
386
+ "max": 0,
387
+ "min": 0,
388
+ "name": "sentTo",
389
+ "pattern": "",
390
+ "presentable": false,
391
+ "primaryKey": false,
392
+ "required": false,
393
+ "system": true,
394
+ "type": "text"
395
+ },
396
+ {
397
+ "hidden": false,
398
+ "id": "autodate2990389176",
399
+ "name": "created",
400
+ "onCreate": true,
401
+ "onUpdate": false,
402
+ "presentable": false,
403
+ "system": true,
404
+ "type": "autodate"
405
+ },
406
+ {
407
+ "hidden": false,
408
+ "id": "autodate3332085495",
409
+ "name": "updated",
410
+ "onCreate": true,
411
+ "onUpdate": true,
412
+ "presentable": false,
413
+ "system": true,
414
+ "type": "autodate"
415
+ }
416
+ ],
417
+ "indexes": [
418
+ "CREATE INDEX `idx_otps_collectionRef_recordRef` ON `_otps` (collectionRef, recordRef)"
419
+ ],
420
+ "created": "2026-09-05 16:27:35.764Z",
421
+ "updated": "2026-09-05 16:27:35.866Z",
422
+ "system": true
423
+ },
424
+ {
425
+ "id": "pbc_3142635823",
426
+ "listRule": null,
427
+ "viewRule": null,
428
+ "createRule": null,
429
+ "updateRule": null,
430
+ "deleteRule": null,
431
+ "name": "_superusers",
432
+ "type": "auth",
433
+ "fields": [
434
+ {
435
+ "autogeneratePattern": "[a-z0-9]{15}",
436
+ "help": "",
437
+ "hidden": false,
438
+ "id": "text3208210256",
439
+ "max": 15,
440
+ "min": 15,
441
+ "name": "id",
442
+ "pattern": "^[a-z0-9]+$",
443
+ "presentable": false,
444
+ "primaryKey": true,
445
+ "required": true,
446
+ "system": true,
447
+ "type": "text"
448
+ },
449
+ {
450
+ "cost": 0,
451
+ "help": "",
452
+ "hidden": true,
453
+ "id": "password901924565",
454
+ "max": 0,
455
+ "min": 8,
456
+ "name": "password",
457
+ "pattern": "",
458
+ "presentable": false,
459
+ "required": true,
460
+ "system": true,
461
+ "type": "password"
462
+ },
463
+ {
464
+ "autogeneratePattern": "[a-zA-Z0-9]{50}",
465
+ "help": "",
466
+ "hidden": true,
467
+ "id": "text2504183744",
468
+ "max": 60,
469
+ "min": 30,
470
+ "name": "tokenKey",
471
+ "pattern": "",
472
+ "presentable": false,
473
+ "primaryKey": false,
474
+ "required": true,
475
+ "system": true,
476
+ "type": "text"
477
+ },
478
+ {
479
+ "exceptDomains": null,
480
+ "help": "",
481
+ "hidden": false,
482
+ "id": "email3885137012",
483
+ "name": "email",
484
+ "onlyDomains": null,
485
+ "presentable": false,
486
+ "required": true,
487
+ "system": true,
488
+ "type": "email"
489
+ },
490
+ {
491
+ "help": "",
492
+ "hidden": false,
493
+ "id": "bool1547992806",
494
+ "name": "emailVisibility",
495
+ "presentable": false,
496
+ "required": false,
497
+ "system": true,
498
+ "type": "bool"
499
+ },
500
+ {
501
+ "help": "",
502
+ "hidden": false,
503
+ "id": "bool256245529",
504
+ "name": "verified",
505
+ "presentable": false,
506
+ "required": false,
507
+ "system": true,
508
+ "type": "bool"
509
+ },
510
+ {
511
+ "hidden": false,
512
+ "id": "autodate2990389176",
513
+ "name": "created",
514
+ "onCreate": true,
515
+ "onUpdate": false,
516
+ "presentable": false,
517
+ "system": true,
518
+ "type": "autodate"
519
+ },
520
+ {
521
+ "hidden": false,
522
+ "id": "autodate3332085495",
523
+ "name": "updated",
524
+ "onCreate": true,
525
+ "onUpdate": true,
526
+ "presentable": false,
527
+ "system": true,
528
+ "type": "autodate"
529
+ }
530
+ ],
531
+ "indexes": [
532
+ "CREATE UNIQUE INDEX `idx_tokenKey_pbc_3142635823` ON `_superusers` (`tokenKey`)",
533
+ "CREATE UNIQUE INDEX `idx_email_pbc_3142635823` ON `_superusers` (`email`) WHERE `email` != ''"
534
+ ],
535
+ "created": "2026-09-05 16:27:35.768Z",
536
+ "updated": "2026-09-05 16:27:35.870Z",
537
+ "system": true,
538
+ "authRule": "",
539
+ "manageRule": null,
540
+ "authAlert": {
541
+ "enabled": true,
542
+ "emailTemplate": {
543
+ "subject": "Login from a new location",
544
+ "body": "<p>Hello,</p>\n<p>We noticed a login to your {APP_NAME} account from a new location.</p>\n<p>If this was you, you may disregard this email.</p>\n<p><strong>If this wasn't you, you should immediately change your {APP_NAME} account password to revoke access from all other locations.</strong></p>\n<p>\n Thanks,<br/>\n {APP_NAME} team\n</p>"
545
+ }
546
+ },
547
+ "oauth2": {
548
+ "providers": [],
549
+ "mappedFields": {
550
+ "id": "",
551
+ "name": "",
552
+ "username": "",
553
+ "avatarURL": ""
554
+ },
555
+ "enabled": false
556
+ },
557
+ "passwordAuth": {
558
+ "enabled": true,
559
+ "identityFields": [
560
+ "email"
561
+ ]
562
+ },
563
+ "mfa": {
564
+ "enabled": false,
565
+ "duration": 1800,
566
+ "rule": ""
567
+ },
568
+ "otp": {
569
+ "enabled": false,
570
+ "duration": 180,
571
+ "length": 8,
572
+ "emailTemplate": {
573
+ "subject": "OTP for {APP_NAME}",
574
+ "body": "<p>Hello,</p>\n<p>Your one-time password is: <strong>{OTP}</strong></p>\n<p><i>If you didn't ask for the one-time password, you can ignore this email.</i></p>\n<p>\n Thanks,<br/>\n {APP_NAME} team\n</p>"
575
+ }
576
+ },
577
+ "authToken": {
578
+ "duration": 1209600
579
+ },
580
+ "passwordResetToken": {
581
+ "duration": 1800
582
+ },
583
+ "emailChangeToken": {
584
+ "duration": 1800
585
+ },
586
+ "verificationToken": {
587
+ "duration": 259200
588
+ },
589
+ "fileToken": {
590
+ "duration": 120
591
+ },
592
+ "verificationTemplate": {
593
+ "subject": "Verify your {APP_NAME} email",
594
+ "body": "<p>Hello,</p>\n<p>Thank you for joining us at {APP_NAME}.</p>\n<p>Click on the button below to verify your email address.</p>\n<p>\n <a class=\"btn\" href=\"{APP_URL}/_/#/auth/confirm-verification/{TOKEN}\" target=\"_blank\" rel=\"noopener\">Verify</a>\n</p>\n<p>\n Thanks,<br/>\n {APP_NAME} team\n</p>"
595
+ },
596
+ "resetPasswordTemplate": {
597
+ "subject": "Reset your {APP_NAME} password",
598
+ "body": "<p>Hello,</p>\n<p>Click on the button below to reset your password.</p>\n<p>\n <a class=\"btn\" href=\"{APP_URL}/_/#/auth/confirm-password-reset/{TOKEN}\" target=\"_blank\" rel=\"noopener\">Reset password</a>\n</p>\n<p><i>If you didn't ask to reset your password, you can ignore this email.</i></p>\n<p>\n Thanks,<br/>\n {APP_NAME} team\n</p>"
599
+ },
600
+ "confirmEmailChangeTemplate": {
601
+ "subject": "Confirm your {APP_NAME} new email address",
602
+ "body": "<p>Hello,</p>\n<p>Click on the button below to confirm your new email address.</p>\n<p>\n <a class=\"btn\" href=\"{APP_URL}/_/#/auth/confirm-email-change/{TOKEN}\" target=\"_blank\" rel=\"noopener\">Confirm new email</a>\n</p>\n<p><i>If you didn't ask to change your email address, you can ignore this email.</i></p>\n<p>\n Thanks,<br/>\n {APP_NAME} team\n</p>"
603
+ }
604
+ }
605
+ ]
@@ -0,0 +1,19 @@
1
+ import systemJSON from "./system.json";
2
+ import { jsonToCollection, type Collection } from "./model";
3
+ import { randomString } from "../ids";
4
+
5
+ // Secrets never ship in snapshots; PocketBase generates them per collection. So do we, at bootstrap.
6
+ const SECRET_OPTIONS = ["authToken", "passwordResetToken", "emailChangeToken", "verificationToken", "fileToken"];
7
+
8
+ export function systemCollections(): Collection[] {
9
+ return (systemJSON as Record<string, unknown>[]).map((json) => {
10
+ const c = jsonToCollection(json);
11
+ if (c.type === "auth") {
12
+ for (const key of SECRET_OPTIONS) {
13
+ const cfg = (c.options[key] as Record<string, unknown> | undefined) ?? {};
14
+ if (!cfg.secret) c.options[key] = { ...cfg, secret: randomString(50) };
15
+ }
16
+ }
17
+ return c;
18
+ });
19
+ }