@sonicjs-cms/core 3.0.0-beta.12 → 3.0.0-beta.14

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 (86) hide show
  1. package/dist/{chunk-INKP2WNU.js → chunk-32SDMKZ7.js} +2 -2
  2. package/dist/{chunk-INKP2WNU.js.map → chunk-32SDMKZ7.js.map} +1 -1
  3. package/dist/{chunk-NYLWNR6T.cjs → chunk-4YRYGDCQ.cjs} +4 -4
  4. package/dist/{chunk-NYLWNR6T.cjs.map → chunk-4YRYGDCQ.cjs.map} +1 -1
  5. package/dist/{chunk-Q3P7Y5VO.js → chunk-5L6EMI7A.js} +4 -4
  6. package/dist/{chunk-Q3P7Y5VO.js.map → chunk-5L6EMI7A.js.map} +1 -1
  7. package/dist/{chunk-IVPRUGTY.js → chunk-75JKPNUZ.js} +3 -3
  8. package/dist/{chunk-IVPRUGTY.js.map → chunk-75JKPNUZ.js.map} +1 -1
  9. package/dist/{chunk-SY7CBACS.cjs → chunk-G5LC7MYH.cjs} +10 -10
  10. package/dist/{chunk-SY7CBACS.cjs.map → chunk-G5LC7MYH.cjs.map} +1 -1
  11. package/dist/{chunk-KI5KMJH2.cjs → chunk-H5FB6GKR.cjs} +2 -2
  12. package/dist/{chunk-KI5KMJH2.cjs.map → chunk-H5FB6GKR.cjs.map} +1 -1
  13. package/dist/{chunk-R2O6TTQS.js → chunk-HNUGMALL.js} +224 -18
  14. package/dist/chunk-HNUGMALL.js.map +1 -0
  15. package/dist/{chunk-SUHGXAII.js → chunk-INE5E3SL.js} +2 -2
  16. package/dist/{chunk-SUHGXAII.js.map → chunk-INE5E3SL.js.map} +1 -1
  17. package/dist/{chunk-BYLQOBO6.cjs → chunk-L3KHLEHL.cjs} +25 -41
  18. package/dist/chunk-L3KHLEHL.cjs.map +1 -0
  19. package/dist/{chunk-DMXDQ5YI.js → chunk-O32IZ6JS.js} +15 -31
  20. package/dist/chunk-O32IZ6JS.js.map +1 -0
  21. package/dist/{chunk-BLMTL57B.js → chunk-PDC7DLOV.js} +21 -3
  22. package/dist/chunk-PDC7DLOV.js.map +1 -0
  23. package/dist/{chunk-XHBEFQJ3.js → chunk-QNPT6BQP.js} +3 -3
  24. package/dist/{chunk-XHBEFQJ3.js.map → chunk-QNPT6BQP.js.map} +1 -1
  25. package/dist/{chunk-XGH2FVVR.cjs → chunk-SIPBHWMG.cjs} +4 -4
  26. package/dist/{chunk-XGH2FVVR.cjs.map → chunk-SIPBHWMG.cjs.map} +1 -1
  27. package/dist/{chunk-TV7LRFXH.cjs → chunk-SSOP7G4R.cjs} +441 -235
  28. package/dist/chunk-SSOP7G4R.cjs.map +1 -0
  29. package/dist/{chunk-ALNODOY4.js → chunk-U7T5EOHJ.js} +4 -4
  30. package/dist/{chunk-ALNODOY4.js.map → chunk-U7T5EOHJ.js.map} +1 -1
  31. package/dist/{chunk-2CB4KY7I.cjs → chunk-W36OZTJ5.cjs} +21 -3
  32. package/dist/chunk-W36OZTJ5.cjs.map +1 -0
  33. package/dist/{chunk-LLWLHFTD.cjs → chunk-WIV3R2MJ.cjs} +2 -2
  34. package/dist/{chunk-LLWLHFTD.cjs.map → chunk-WIV3R2MJ.cjs.map} +1 -1
  35. package/dist/{chunk-NUKJ54GA.cjs → chunk-ZTEJHSYS.cjs} +3 -3
  36. package/dist/{chunk-NUKJ54GA.cjs.map → chunk-ZTEJHSYS.cjs.map} +1 -1
  37. package/dist/{collection-config-JgHOpFCG.d.cts → collection-config-BTzAvKt2.d.cts} +25 -0
  38. package/dist/{collection-config-JgHOpFCG.d.ts → collection-config-BTzAvKt2.d.ts} +25 -0
  39. package/dist/{config-ON6FNMYX.cjs → config-FLOUCYHH.cjs} +5 -5
  40. package/dist/{config-ON6FNMYX.cjs.map → config-FLOUCYHH.cjs.map} +1 -1
  41. package/dist/config-PLJTDINX.js +6 -0
  42. package/dist/{config-HFXANXCC.js.map → config-PLJTDINX.js.map} +1 -1
  43. package/dist/index.cjs +275 -275
  44. package/dist/index.cjs.map +1 -1
  45. package/dist/index.d.cts +4 -4
  46. package/dist/index.d.ts +4 -4
  47. package/dist/index.js +19 -19
  48. package/dist/index.js.map +1 -1
  49. package/dist/middleware.cjs +34 -33
  50. package/dist/middleware.js +5 -4
  51. package/dist/migrations-DOPZXFK3.js +4 -0
  52. package/dist/{migrations-MLBACCPF.js.map → migrations-DOPZXFK3.js.map} +1 -1
  53. package/dist/migrations-TYYC66P4.cjs +13 -0
  54. package/dist/{migrations-AFSCRO56.cjs.map → migrations-TYYC66P4.cjs.map} +1 -1
  55. package/dist/{plugin-bootstrap-B8ThJU21.d.cts → plugin-bootstrap-BHWQ2df8.d.cts} +1 -1
  56. package/dist/{plugin-bootstrap-qu8hJgUt.d.ts → plugin-bootstrap-Bj4fxX1q.d.ts} +1 -1
  57. package/dist/plugins.cjs +40 -40
  58. package/dist/plugins.js +3 -3
  59. package/dist/rbac-4QLDXIDF.js +5 -0
  60. package/dist/{rbac-O73MFKDA.js.map → rbac-4QLDXIDF.js.map} +1 -1
  61. package/dist/rbac-ESTOCVT2.cjs +14 -0
  62. package/dist/{rbac-VONLJJKB.cjs.map → rbac-ESTOCVT2.cjs.map} +1 -1
  63. package/dist/routes.cjs +27 -27
  64. package/dist/routes.js +7 -7
  65. package/dist/services.cjs +18 -18
  66. package/dist/services.d.cts +2 -2
  67. package/dist/services.d.ts +2 -2
  68. package/dist/services.js +2 -2
  69. package/dist/types.d.cts +1 -1
  70. package/dist/types.d.ts +1 -1
  71. package/dist/utils.cjs +3 -3
  72. package/dist/utils.d.cts +1 -1
  73. package/dist/utils.d.ts +1 -1
  74. package/dist/utils.js +1 -1
  75. package/package.json +2 -2
  76. package/dist/chunk-2CB4KY7I.cjs.map +0 -1
  77. package/dist/chunk-BLMTL57B.js.map +0 -1
  78. package/dist/chunk-BYLQOBO6.cjs.map +0 -1
  79. package/dist/chunk-DMXDQ5YI.js.map +0 -1
  80. package/dist/chunk-R2O6TTQS.js.map +0 -1
  81. package/dist/chunk-TV7LRFXH.cjs.map +0 -1
  82. package/dist/config-HFXANXCC.js +0 -6
  83. package/dist/migrations-AFSCRO56.cjs +0 -13
  84. package/dist/migrations-MLBACCPF.js +0 -4
  85. package/dist/rbac-O73MFKDA.js +0 -5
  86. package/dist/rbac-VONLJJKB.cjs +0 -14
@@ -3,18 +3,18 @@
3
3
  var chunkHIKBY7MS_cjs = require('./chunk-HIKBY7MS.cjs');
4
4
  var chunkN32OWET6_cjs = require('./chunk-N32OWET6.cjs');
5
5
  var chunk4BTBSXMR_cjs = require('./chunk-4BTBSXMR.cjs');
6
- var chunkBYLQOBO6_cjs = require('./chunk-BYLQOBO6.cjs');
7
- var chunk2CB4KY7I_cjs = require('./chunk-2CB4KY7I.cjs');
6
+ var chunkL3KHLEHL_cjs = require('./chunk-L3KHLEHL.cjs');
7
+ var chunkW36OZTJ5_cjs = require('./chunk-W36OZTJ5.cjs');
8
8
  var chunkJEQ7FLOD_cjs = require('./chunk-JEQ7FLOD.cjs');
9
- var chunkLLWLHFTD_cjs = require('./chunk-LLWLHFTD.cjs');
10
- var chunkKI5KMJH2_cjs = require('./chunk-KI5KMJH2.cjs');
9
+ var chunkWIV3R2MJ_cjs = require('./chunk-WIV3R2MJ.cjs');
10
+ var chunkH5FB6GKR_cjs = require('./chunk-H5FB6GKR.cjs');
11
11
  var chunkPXNTCCPE_cjs = require('./chunk-PXNTCCPE.cjs');
12
12
  var chunkK623Q6WD_cjs = require('./chunk-K623Q6WD.cjs');
13
- var chunkNYLWNR6T_cjs = require('./chunk-NYLWNR6T.cjs');
13
+ var chunk4YRYGDCQ_cjs = require('./chunk-4YRYGDCQ.cjs');
14
14
  var chunkJ6JTWD2A_cjs = require('./chunk-J6JTWD2A.cjs');
15
15
  var chunkIXUHXTHW_cjs = require('./chunk-IXUHXTHW.cjs');
16
16
  var chunkRCQ2HIQD_cjs = require('./chunk-RCQ2HIQD.cjs');
17
- var chunkXGH2FVVR_cjs = require('./chunk-XGH2FVVR.cjs');
17
+ var chunkSIPBHWMG_cjs = require('./chunk-SIPBHWMG.cjs');
18
18
  var chunkMNWKYY5E_cjs = require('./chunk-MNWKYY5E.cjs');
19
19
  var hono = require('hono');
20
20
  var zod = require('zod');
@@ -256,7 +256,7 @@ function getDocumentRequestContext(c) {
256
256
 
257
257
  // src/routes/api-documents.ts
258
258
  async function aclAllowsRead(db, tenantId, principalSet, row, preloadedType) {
259
- const docType = preloadedType ?? await new chunkBYLQOBO6_cjs.DocumentTypeRegistry(db).findById(row.type_id);
259
+ const docType = preloadedType ?? await new chunkL3KHLEHL_cjs.DocumentTypeRegistry(db).findById(row.type_id);
260
260
  if (!docType) return false;
261
261
  return new DocumentRepository(db, tenantId).isAllowed(principalSet, row.root_id, "read", docType.settings);
262
262
  }
@@ -274,7 +274,7 @@ apiDocumentsRoutes.get("/", async (c) => {
274
274
  if (!typeId) {
275
275
  return c.json({ error: "type query parameter is required" }, 400);
276
276
  }
277
- const registry = new chunkBYLQOBO6_cjs.DocumentTypeRegistry(db);
277
+ const registry = new chunkL3KHLEHL_cjs.DocumentTypeRegistry(db);
278
278
  const docType = await registry.findById(typeId);
279
279
  if (!docType || !docType.isActive) {
280
280
  return c.json({ error: "Unknown document type" }, 400);
@@ -356,7 +356,7 @@ apiDocumentsRoutes.get("/root/:rootId", async (c) => {
356
356
  AND (expires_at IS NULL OR expires_at > ?) LIMIT 1`
357
357
  ).bind(rootId, now, now).first();
358
358
  if (!row) return c.json({ error: "Not found" }, 404);
359
- const docType = await new chunkBYLQOBO6_cjs.DocumentTypeRegistry(db).findById(row.type_id);
359
+ const docType = await new chunkL3KHLEHL_cjs.DocumentTypeRegistry(db).findById(row.type_id);
360
360
  const effTenant = effectiveTenantForType(tenantId, docType?.settings);
361
361
  if (row.tenant_id !== effTenant) return c.json({ error: "Not found" }, 404);
362
362
  if (!await aclAllowsRead(db, effTenant, principalSet, row, docType)) {
@@ -392,7 +392,7 @@ apiDocumentsRoutes.get("/:id", async (c) => {
392
392
  AND (expires_at IS NULL OR expires_at > ?) LIMIT 1`
393
393
  ).bind(id, now, now).first();
394
394
  if (!row) return c.json({ error: "Not found" }, 404);
395
- const docType = await new chunkBYLQOBO6_cjs.DocumentTypeRegistry(db).findById(row.type_id);
395
+ const docType = await new chunkL3KHLEHL_cjs.DocumentTypeRegistry(db).findById(row.type_id);
396
396
  const effTenant = effectiveTenantForType(tenantId, docType?.settings);
397
397
  if (row.tenant_id !== effTenant) return c.json({ error: "Not found" }, 404);
398
398
  if (!await aclAllowsRead(db, effTenant, principalSet, row, docType)) {
@@ -462,17 +462,17 @@ async function resolveDocScope(c, db, by, opts = {}) {
462
462
  const draft = opts.currentDraftOnly ? " AND is_current_draft = 1" : "";
463
463
  const row = await db.prepare(`SELECT type_id, root_id, tenant_id FROM documents WHERE ${col} = ?${draft} LIMIT 1`).bind(val).first();
464
464
  if (!row) return null;
465
- const docType = await new chunkBYLQOBO6_cjs.DocumentTypeRegistry(db).findById(row.type_id);
465
+ const docType = await new chunkL3KHLEHL_cjs.DocumentTypeRegistry(db).findById(row.type_id);
466
466
  const tenantId = effectiveTenantForType(getRequestTenant(c), docType?.settings);
467
467
  if (row.tenant_id !== tenantId) return null;
468
468
  return { typeId: row.type_id, rootId: row.root_id, tenantId, docType };
469
469
  }
470
470
  var adminDocumentsRoutes = new hono.Hono();
471
- adminDocumentsRoutes.use("*", chunkBYLQOBO6_cjs.requireAuth());
472
- adminDocumentsRoutes.use("*", chunkBYLQOBO6_cjs.requireRole(["admin", "editor"]));
471
+ adminDocumentsRoutes.use("*", chunkL3KHLEHL_cjs.requireAuth());
472
+ adminDocumentsRoutes.use("*", chunkL3KHLEHL_cjs.requireRole(["admin", "editor"]));
473
473
  adminDocumentsRoutes.get("/types", async (c) => {
474
474
  try {
475
- const registry = new chunkBYLQOBO6_cjs.DocumentTypeRegistry(c.env.DB);
475
+ const registry = new chunkL3KHLEHL_cjs.DocumentTypeRegistry(c.env.DB);
476
476
  const types = await registry.findAll();
477
477
  return c.json({ data: types });
478
478
  } catch (error) {
@@ -500,7 +500,7 @@ adminDocumentsRoutes.get("/", async (c) => {
500
500
  if (!typeId) {
501
501
  return c.json({ error: "type query parameter is required" }, 400);
502
502
  }
503
- const registry = new chunkBYLQOBO6_cjs.DocumentTypeRegistry(db);
503
+ const registry = new chunkL3KHLEHL_cjs.DocumentTypeRegistry(db);
504
504
  const docType = await registry.findById(typeId);
505
505
  if (!docType || !docType.isActive) {
506
506
  return c.json({ error: "Unknown document type" }, 400);
@@ -611,7 +611,7 @@ adminDocumentsRoutes.post("/", async (c) => {
611
611
  const input = validation.data;
612
612
  const db = c.env.DB;
613
613
  const user = c.get("user");
614
- const registry = new chunkBYLQOBO6_cjs.DocumentTypeRegistry(db);
614
+ const registry = new chunkL3KHLEHL_cjs.DocumentTypeRegistry(db);
615
615
  const docType = await registry.findById(input.typeId);
616
616
  if (!docType || !docType.isActive) {
617
617
  return c.json({ error: "Unknown document type" }, 400);
@@ -619,7 +619,7 @@ adminDocumentsRoutes.post("/", async (c) => {
619
619
  const createDenied = await denyIfNotAllowed(c, db, "", "create", docType.settings);
620
620
  if (createDenied) return createDenied;
621
621
  const tenantId = effectiveTenantForType(getRequestTenant(c), docType.settings);
622
- const svc = new chunk2CB4KY7I_cjs.DocumentsService(db, {
622
+ const svc = new chunkW36OZTJ5_cjs.DocumentsService(db, {
623
623
  queryableFields: docType.queryableFields,
624
624
  typeSchemaVersion: docType.schemaVersion,
625
625
  maxVersionsPerRoot: docType.settings.maxVersionsPerRoot,
@@ -657,7 +657,7 @@ adminDocumentsRoutes.put("/:rootId", async (c) => {
657
657
  const docType = scope.docType;
658
658
  const updateDenied = await denyIfNotAllowed(c, db, rootId, "update", docType?.settings, scope.tenantId);
659
659
  if (updateDenied) return updateDenied;
660
- const svc = new chunk2CB4KY7I_cjs.DocumentsService(db, {
660
+ const svc = new chunkW36OZTJ5_cjs.DocumentsService(db, {
661
661
  queryableFields: docType?.queryableFields ?? [],
662
662
  typeSchemaVersion: docType?.schemaVersion,
663
663
  maxVersionsPerRoot: docType?.settings.maxVersionsPerRoot,
@@ -682,7 +682,7 @@ adminDocumentsRoutes.post("/:id/publish", async (c) => {
682
682
  const docType = scope.docType;
683
683
  const publishDenied = await denyIfNotAllowed(c, db, scope.rootId, "publish", docType?.settings, scope.tenantId);
684
684
  if (publishDenied) return publishDenied;
685
- const svc = new chunk2CB4KY7I_cjs.DocumentsService(db, {
685
+ const svc = new chunkW36OZTJ5_cjs.DocumentsService(db, {
686
686
  queryableFields: docType?.queryableFields ?? [],
687
687
  typeSchemaVersion: docType?.schemaVersion,
688
688
  tenantId: scope.tenantId,
@@ -705,7 +705,7 @@ adminDocumentsRoutes.post("/:id/unpublish", async (c) => {
705
705
  const docType = scope.docType;
706
706
  const unpublishDenied = await denyIfNotAllowed(c, db, scope.rootId, "publish", docType?.settings, scope.tenantId);
707
707
  if (unpublishDenied) return unpublishDenied;
708
- const svc = new chunk2CB4KY7I_cjs.DocumentsService(db, {
708
+ const svc = new chunkW36OZTJ5_cjs.DocumentsService(db, {
709
709
  queryableFields: docType?.queryableFields ?? [],
710
710
  tenantId: scope.tenantId
711
711
  });
@@ -727,7 +727,7 @@ adminDocumentsRoutes.delete("/:id", async (c) => {
727
727
  const docType = scope.docType;
728
728
  const deleteDenied = await denyIfNotAllowed(c, db, scope.rootId, "delete", docType?.settings, scope.tenantId);
729
729
  if (deleteDenied) return deleteDenied;
730
- const svc = new chunk2CB4KY7I_cjs.DocumentsService(db, { queryableFields: docType?.queryableFields ?? [], tenantId: scope.tenantId });
730
+ const svc = new chunkW36OZTJ5_cjs.DocumentsService(db, { queryableFields: docType?.queryableFields ?? [], tenantId: scope.tenantId });
731
731
  if (docType?.settings.pii) {
732
732
  if (scope.rootId) await svc.erase(scope.rootId, scope.tenantId);
733
733
  } else {
@@ -743,7 +743,7 @@ adminDocumentsRoutes.post("/types/:typeId/reindex", async (c) => {
743
743
  try {
744
744
  const { typeId } = c.req.param();
745
745
  const db = c.env.DB;
746
- const registry = new chunkBYLQOBO6_cjs.DocumentTypeRegistry(db);
746
+ const registry = new chunkL3KHLEHL_cjs.DocumentTypeRegistry(db);
747
747
  const docType = await registry.findById(typeId);
748
748
  if (!docType) return c.json({ error: "Unknown document type" }, 400);
749
749
  const reindexTenant = effectiveTenantForType(getRequestTenant(c), docType.settings);
@@ -897,13 +897,13 @@ async function resolveContentVariables(contentData, db) {
897
897
  // src/routes/api-content-crud.ts
898
898
  var apiContentCrudRoutes = new hono.Hono();
899
899
  async function resolveDocBacking(db, collectionIdOrName) {
900
- const registry = chunkLLWLHFTD_cjs.getCollectionRegistry();
900
+ const registry = chunkWIV3R2MJ_cjs.getCollectionRegistry();
901
901
  const record = registry.getBySlugOrName(collectionIdOrName) ?? registry.getById(collectionIdOrName);
902
902
  if (record) {
903
- const docType2 = await new chunkBYLQOBO6_cjs.DocumentTypeRegistry(db).findById(record.name);
903
+ const docType2 = await new chunkL3KHLEHL_cjs.DocumentTypeRegistry(db).findById(record.name);
904
904
  return docType2 ? { coll: { id: record.id, name: record.name }, docType: docType2 } : null;
905
905
  }
906
- const docType = await new chunkBYLQOBO6_cjs.DocumentTypeRegistry(db).findById(collectionIdOrName);
906
+ const docType = await new chunkL3KHLEHL_cjs.DocumentTypeRegistry(db).findById(collectionIdOrName);
907
907
  if (docType) {
908
908
  return { coll: { id: collectionIdOrName, name: collectionIdOrName }, docType };
909
909
  }
@@ -946,7 +946,7 @@ apiContentCrudRoutes.get("/check-slug", async (c) => {
946
946
  }, 500);
947
947
  }
948
948
  });
949
- apiContentCrudRoutes.get("/:id", chunkBYLQOBO6_cjs.optionalAuth(), async (c) => {
949
+ apiContentCrudRoutes.get("/:id", chunkL3KHLEHL_cjs.optionalAuth(), async (c) => {
950
950
  try {
951
951
  const id = c.req.param("id");
952
952
  const db = c.env.DB;
@@ -956,7 +956,7 @@ apiContentCrudRoutes.get("/:id", chunkBYLQOBO6_cjs.optionalAuth(), async (c) =>
956
956
  ).bind(id, getRequestTenant(c)).first();
957
957
  let transformedContent;
958
958
  if (docRow) {
959
- const coll = chunkLLWLHFTD_cjs.getCollectionRegistry().getByName(docRow.type_id);
959
+ const coll = chunkWIV3R2MJ_cjs.getCollectionRegistry().getByName(docRow.type_id);
960
960
  transformedContent = {
961
961
  id: docRow.root_id,
962
962
  title: docRow.title,
@@ -965,8 +965,8 @@ apiContentCrudRoutes.get("/:id", chunkBYLQOBO6_cjs.optionalAuth(), async (c) =>
965
965
  collectionId: coll?.id ?? docRow.type_id,
966
966
  data: docRow.data ? JSON.parse(docRow.data) : {},
967
967
  // D29: document timestamps are SECONDS; legacy `content` API contract is MILLISECONDS.
968
- created_at: chunk2CB4KY7I_cjs.documentSecondsToMs(docRow.created_at),
969
- updated_at: chunk2CB4KY7I_cjs.documentSecondsToMs(docRow.updated_at)
968
+ created_at: chunkW36OZTJ5_cjs.documentSecondsToMs(docRow.created_at),
969
+ updated_at: chunkW36OZTJ5_cjs.documentSecondsToMs(docRow.updated_at)
970
970
  };
971
971
  } else {
972
972
  return c.json({ error: "Content not found" }, 404);
@@ -990,7 +990,7 @@ apiContentCrudRoutes.get("/:id", chunkBYLQOBO6_cjs.optionalAuth(), async (c) =>
990
990
  }, 500);
991
991
  }
992
992
  });
993
- apiContentCrudRoutes.post("/", chunkBYLQOBO6_cjs.requireAuth(), chunkBYLQOBO6_cjs.requireRole(["admin", "editor", "author"]), async (c) => {
993
+ apiContentCrudRoutes.post("/", chunkL3KHLEHL_cjs.requireAuth(), chunkL3KHLEHL_cjs.requireRole(["admin", "editor", "author"]), async (c) => {
994
994
  try {
995
995
  const db = c.env.DB;
996
996
  const user = c.get("user");
@@ -1024,7 +1024,7 @@ apiContentCrudRoutes.post("/", chunkBYLQOBO6_cjs.requireAuth(), chunkBYLQOBO6_cj
1024
1024
  return c.json({ error: "Write cancelled by plugin", details: String(err) }, 400);
1025
1025
  }
1026
1026
  const tenantId = getRequestTenant(c);
1027
- const svc = new chunk2CB4KY7I_cjs.DocumentsService(db, {
1027
+ const svc = new chunkW36OZTJ5_cjs.DocumentsService(db, {
1028
1028
  queryableFields: backing.docType.queryableFields ?? [],
1029
1029
  typeSchemaVersion: backing.docType.schemaVersion ?? 1,
1030
1030
  maxVersionsPerRoot: backing.docType.settings?.maxVersionsPerRoot ?? 50,
@@ -1053,7 +1053,7 @@ apiContentCrudRoutes.post("/", chunkBYLQOBO6_cjs.requireAuth(), chunkBYLQOBO6_cj
1053
1053
  "fire-and-forget"
1054
1054
  );
1055
1055
  return c.json({
1056
- data: { id: doc.rootId, title: doc.title, slug: doc.slug, status: doc.status, collectionId: backing.coll.id, data: doc.data, created_at: chunk2CB4KY7I_cjs.documentSecondsToMs(doc.createdAt), updated_at: chunk2CB4KY7I_cjs.documentSecondsToMs(doc.updatedAt) }
1056
+ data: { id: doc.rootId, title: doc.title, slug: doc.slug, status: doc.status, collectionId: backing.coll.id, data: doc.data, created_at: chunkW36OZTJ5_cjs.documentSecondsToMs(doc.createdAt), updated_at: chunkW36OZTJ5_cjs.documentSecondsToMs(doc.updatedAt) }
1057
1057
  }, 201);
1058
1058
  }
1059
1059
  return c.json({ error: "Collection is not document-backed" }, 400);
@@ -1065,7 +1065,7 @@ apiContentCrudRoutes.post("/", chunkBYLQOBO6_cjs.requireAuth(), chunkBYLQOBO6_cj
1065
1065
  }, 500);
1066
1066
  }
1067
1067
  });
1068
- apiContentCrudRoutes.put("/:id", chunkBYLQOBO6_cjs.requireAuth(), chunkBYLQOBO6_cjs.requireRole(["admin", "editor", "author"]), async (c) => {
1068
+ apiContentCrudRoutes.put("/:id", chunkL3KHLEHL_cjs.requireAuth(), chunkL3KHLEHL_cjs.requireRole(["admin", "editor", "author"]), async (c) => {
1069
1069
  try {
1070
1070
  const id = c.req.param("id");
1071
1071
  const db = c.env.DB;
@@ -1087,8 +1087,8 @@ apiContentCrudRoutes.put("/:id", chunkBYLQOBO6_cjs.requireAuth(), chunkBYLQOBO6_
1087
1087
  } catch (err) {
1088
1088
  return c.json({ error: "Write cancelled by plugin", details: String(err) }, 400);
1089
1089
  }
1090
- const docType = await new chunkBYLQOBO6_cjs.DocumentTypeRegistry(db).findById(docRow.type_id);
1091
- const svc = new chunk2CB4KY7I_cjs.DocumentsService(db, {
1090
+ const docType = await new chunkL3KHLEHL_cjs.DocumentTypeRegistry(db).findById(docRow.type_id);
1091
+ const svc = new chunkW36OZTJ5_cjs.DocumentsService(db, {
1092
1092
  queryableFields: docType?.queryableFields ?? [],
1093
1093
  typeSchemaVersion: docType?.schemaVersion ?? 1,
1094
1094
  maxVersionsPerRoot: docType?.settings?.maxVersionsPerRoot ?? 50,
@@ -1110,7 +1110,7 @@ apiContentCrudRoutes.put("/:id", chunkBYLQOBO6_cjs.requireAuth(), chunkBYLQOBO6_
1110
1110
  const cache = chunk4BTBSXMR_cjs.getCacheService(chunk4BTBSXMR_cjs.CACHE_CONFIGS.api);
1111
1111
  await cache.invalidate("content-filtered:*");
1112
1112
  await cache.invalidate("collection-content-filtered:*");
1113
- const coll = chunkLLWLHFTD_cjs.getCollectionRegistry().getByName(docRow.type_id);
1113
+ const coll = chunkWIV3R2MJ_cjs.getCollectionRegistry().getByName(docRow.type_id);
1114
1114
  const saved = await db.prepare("SELECT * FROM documents WHERE id = ?").bind(newDraft.id).first();
1115
1115
  const savedData = saved?.data ? JSON.parse(saved.data) : {};
1116
1116
  dispatchHookEvent(c, "content:after:update", { collection: docRow.type_id, id, data: savedData, user: actor }, "fire-and-forget");
@@ -1119,7 +1119,7 @@ apiContentCrudRoutes.put("/:id", chunkBYLQOBO6_cjs.requireAuth(), chunkBYLQOBO6_
1119
1119
  dispatchHookEvent(c, "content:after:publish", { collection: docRow.type_id, id, data: savedData, user: actor }, "fire-and-forget");
1120
1120
  }
1121
1121
  return c.json({
1122
- data: { id: saved.root_id, title: saved.title, slug: saved.slug, status: saved.status, collectionId: coll?.id ?? docRow.type_id, data: savedData, created_at: chunk2CB4KY7I_cjs.documentSecondsToMs(saved.created_at), updated_at: chunk2CB4KY7I_cjs.documentSecondsToMs(saved.updated_at) }
1122
+ data: { id: saved.root_id, title: saved.title, slug: saved.slug, status: saved.status, collectionId: coll?.id ?? docRow.type_id, data: savedData, created_at: chunkW36OZTJ5_cjs.documentSecondsToMs(saved.created_at), updated_at: chunkW36OZTJ5_cjs.documentSecondsToMs(saved.updated_at) }
1123
1123
  });
1124
1124
  }
1125
1125
  return c.json({ error: "Content not found" }, 404);
@@ -1131,7 +1131,7 @@ apiContentCrudRoutes.put("/:id", chunkBYLQOBO6_cjs.requireAuth(), chunkBYLQOBO6_
1131
1131
  }, 500);
1132
1132
  }
1133
1133
  });
1134
- apiContentCrudRoutes.delete("/:id", chunkBYLQOBO6_cjs.requireAuth(), chunkBYLQOBO6_cjs.requireRole(["admin", "editor", "author"]), async (c) => {
1134
+ apiContentCrudRoutes.delete("/:id", chunkL3KHLEHL_cjs.requireAuth(), chunkL3KHLEHL_cjs.requireRole(["admin", "editor", "author"]), async (c) => {
1135
1135
  try {
1136
1136
  const id = c.req.param("id");
1137
1137
  const db = c.env.DB;
@@ -1244,8 +1244,8 @@ function mapDocRowToContent(row, collectionId) {
1244
1244
  collectionId,
1245
1245
  data: row.data ? JSON.parse(row.data) : {},
1246
1246
  // D29: document timestamps are SECONDS; the legacy `content` API contract is MILLISECONDS.
1247
- created_at: chunk2CB4KY7I_cjs.documentSecondsToMs(row.created_at),
1248
- updated_at: chunk2CB4KY7I_cjs.documentSecondsToMs(row.updated_at)
1247
+ created_at: chunkW36OZTJ5_cjs.documentSecondsToMs(row.created_at),
1248
+ updated_at: chunkW36OZTJ5_cjs.documentSecondsToMs(row.updated_at)
1249
1249
  };
1250
1250
  }
1251
1251
  var apiRoutes = new hono.Hono();
@@ -1257,7 +1257,7 @@ apiRoutes.use("*", async (c, next) => {
1257
1257
  c.header("X-Response-Time", `${totalTime}ms`);
1258
1258
  });
1259
1259
  apiRoutes.use("*", async (c, next) => {
1260
- const cacheEnabled = await chunkBYLQOBO6_cjs.isPluginActive(c.env.DB, "core-cache");
1260
+ const cacheEnabled = await chunkL3KHLEHL_cjs.isPluginActive(c.env.DB, "core-cache");
1261
1261
  c.set("cacheEnabled", cacheEnabled);
1262
1262
  await next();
1263
1263
  });
@@ -1280,7 +1280,7 @@ apiRoutes.get("/", (c) => {
1280
1280
  openapi: "3.0.0",
1281
1281
  info: {
1282
1282
  title: "SonicJS AI API",
1283
- version: chunkXGH2FVVR_cjs.getCoreVersion(),
1283
+ version: chunkSIPBHWMG_cjs.getCoreVersion(),
1284
1284
  description: "RESTful API for SonicJS headless CMS - a modern, AI-powered content management system built on Cloudflare Workers",
1285
1285
  contact: {
1286
1286
  name: "SonicJS Support",
@@ -1710,8 +1710,8 @@ apiRoutes.get("/collections", async (c) => {
1710
1710
  }
1711
1711
  c.header("X-Cache-Status", "MISS");
1712
1712
  c.header("X-Cache-Source", "registry");
1713
- const records = chunkLLWLHFTD_cjs.getCollectionRegistry().listActive().filter((r) => !r.internal);
1714
- const transformedResults = records.map(chunkLLWLHFTD_cjs.collectionRecordToRow);
1713
+ const records = chunkWIV3R2MJ_cjs.getCollectionRegistry().listActive().filter((r) => !r.internal);
1714
+ const transformedResults = records.map(chunkWIV3R2MJ_cjs.collectionRecordToRow);
1715
1715
  const responseData = {
1716
1716
  data: transformedResults,
1717
1717
  meta: addTimingMeta(c, {
@@ -1732,7 +1732,7 @@ apiRoutes.get("/collections", async (c) => {
1732
1732
  return c.json({ error: "Failed to fetch collections" }, 500);
1733
1733
  }
1734
1734
  });
1735
- apiRoutes.get("/content", chunkBYLQOBO6_cjs.optionalAuth(), async (c) => {
1735
+ apiRoutes.get("/content", chunkL3KHLEHL_cjs.optionalAuth(), async (c) => {
1736
1736
  const executionStart = Date.now();
1737
1737
  try {
1738
1738
  const db = c.env.DB;
@@ -1741,7 +1741,7 @@ apiRoutes.get("/content", chunkBYLQOBO6_cjs.optionalAuth(), async (c) => {
1741
1741
  const collIdByName = /* @__PURE__ */ new Map();
1742
1742
  let typeId;
1743
1743
  let typeIds;
1744
- const registry = chunkLLWLHFTD_cjs.getCollectionRegistry();
1744
+ const registry = chunkWIV3R2MJ_cjs.getCollectionRegistry();
1745
1745
  if (queryParams.collection) {
1746
1746
  const collectionName = queryParams.collection;
1747
1747
  const record = registry.getByName(collectionName);
@@ -1840,13 +1840,13 @@ apiRoutes.get("/content", chunkBYLQOBO6_cjs.optionalAuth(), async (c) => {
1840
1840
  }, 500);
1841
1841
  }
1842
1842
  });
1843
- apiRoutes.get("/collections/:collection/content", chunkBYLQOBO6_cjs.optionalAuth(), async (c) => {
1843
+ apiRoutes.get("/collections/:collection/content", chunkL3KHLEHL_cjs.optionalAuth(), async (c) => {
1844
1844
  const executionStart = Date.now();
1845
1845
  try {
1846
1846
  const collection = c.req.param("collection");
1847
1847
  const db = c.env.DB;
1848
1848
  const queryParams = c.req.query();
1849
- const record = chunkLLWLHFTD_cjs.getCollectionRegistry().getBySlugOrName(collection);
1849
+ const record = chunkWIV3R2MJ_cjs.getCollectionRegistry().getBySlugOrName(collection);
1850
1850
  if (!record || record.isActive === false) {
1851
1851
  return c.json({ error: "Collection not found" }, 404);
1852
1852
  }
@@ -1902,7 +1902,7 @@ apiRoutes.get("/collections/:collection/content", chunkBYLQOBO6_cjs.optionalAuth
1902
1902
  const responseData = {
1903
1903
  data: transformedResults,
1904
1904
  meta: addTimingMeta(c, {
1905
- ...includeCollection ? { collection: chunkLLWLHFTD_cjs.collectionRecordToRow(record) } : {},
1905
+ ...includeCollection ? { collection: chunkWIV3R2MJ_cjs.collectionRecordToRow(record) } : {},
1906
1906
  count: results.length,
1907
1907
  timestamp: (/* @__PURE__ */ new Date()).toISOString(),
1908
1908
  // D44: echo the caller's filter with the access policy applied (status=published forced for
@@ -1927,13 +1927,13 @@ apiRoutes.get("/collections/:collection/content", chunkBYLQOBO6_cjs.optionalAuth
1927
1927
  }
1928
1928
  });
1929
1929
  apiRoutes.route("/content", api_content_crud_default);
1930
- apiRoutes.get("/:collection", chunkBYLQOBO6_cjs.optionalAuth(), async (c) => {
1930
+ apiRoutes.get("/:collection", chunkL3KHLEHL_cjs.optionalAuth(), async (c) => {
1931
1931
  const executionStart = Date.now();
1932
1932
  try {
1933
1933
  const collection = c.req.param("collection");
1934
1934
  const db = c.env.DB;
1935
1935
  const queryParams = c.req.query();
1936
- const record = chunkLLWLHFTD_cjs.getCollectionRegistry().getBySlugOrName(collection);
1936
+ const record = chunkWIV3R2MJ_cjs.getCollectionRegistry().getBySlugOrName(collection);
1937
1937
  if (!record || record.isActive === false) {
1938
1938
  return c.json({ error: "Collection not found" }, 404);
1939
1939
  }
@@ -1973,7 +1973,7 @@ apiRoutes.get("/:collection", chunkBYLQOBO6_cjs.optionalAuth(), async (c) => {
1973
1973
  const responseData = {
1974
1974
  data: transformedResults,
1975
1975
  meta: addTimingMeta(c, {
1976
- ...includeCollection ? { collection: chunkLLWLHFTD_cjs.collectionRecordToRow(record) } : {},
1976
+ ...includeCollection ? { collection: chunkWIV3R2MJ_cjs.collectionRecordToRow(record) } : {},
1977
1977
  count: results.length,
1978
1978
  timestamp: (/* @__PURE__ */ new Date()).toISOString(),
1979
1979
  filter: normalizePublicContentFilter(filter, role),
@@ -1991,12 +1991,12 @@ apiRoutes.get("/:collection", chunkBYLQOBO6_cjs.optionalAuth(), async (c) => {
1991
1991
  return c.json({ error: "Failed to fetch content", details: error instanceof Error ? error.message : String(error) }, 500);
1992
1992
  }
1993
1993
  });
1994
- apiRoutes.get("/:collection/:id", chunkBYLQOBO6_cjs.optionalAuth(), async (c) => {
1994
+ apiRoutes.get("/:collection/:id", chunkL3KHLEHL_cjs.optionalAuth(), async (c) => {
1995
1995
  try {
1996
1996
  const collection = c.req.param("collection");
1997
1997
  const id = c.req.param("id");
1998
1998
  const db = c.env.DB;
1999
- const record = chunkLLWLHFTD_cjs.getCollectionRegistry().getBySlugOrName(collection);
1999
+ const record = chunkWIV3R2MJ_cjs.getCollectionRegistry().getBySlugOrName(collection);
2000
2000
  if (!record || record.isActive === false) {
2001
2001
  return c.json({ error: "Collection not found" }, 404);
2002
2002
  }
@@ -2005,7 +2005,7 @@ apiRoutes.get("/:collection/:id", chunkBYLQOBO6_cjs.optionalAuth(), async (c) =>
2005
2005
  privileged ? "SELECT * FROM documents WHERE root_id = ? AND type_id = ? AND tenant_id = 'default' AND is_current_draft = 1 AND deleted_at IS NULL" : "SELECT * FROM documents WHERE root_id = ? AND type_id = ? AND tenant_id = 'default' AND is_published = 1 AND deleted_at IS NULL"
2006
2006
  ).bind(id, record.name).first();
2007
2007
  if (!docRow) return c.json({ error: "Content not found" }, 404);
2008
- const coll = chunkLLWLHFTD_cjs.getCollectionRegistry().getByName(docRow.type_id);
2008
+ const coll = chunkWIV3R2MJ_cjs.getCollectionRegistry().getByName(docRow.type_id);
2009
2009
  const transformedContent = {
2010
2010
  id: docRow.root_id,
2011
2011
  title: docRow.title,
@@ -2013,8 +2013,8 @@ apiRoutes.get("/:collection/:id", chunkBYLQOBO6_cjs.optionalAuth(), async (c) =>
2013
2013
  status: docRow.status,
2014
2014
  collectionId: coll?.id ?? docRow.type_id,
2015
2015
  data: docRow.data ? JSON.parse(docRow.data) : {},
2016
- created_at: chunk2CB4KY7I_cjs.documentSecondsToMs(docRow.created_at),
2017
- updated_at: chunk2CB4KY7I_cjs.documentSecondsToMs(docRow.updated_at)
2016
+ created_at: chunkW36OZTJ5_cjs.documentSecondsToMs(docRow.created_at),
2017
+ updated_at: chunkW36OZTJ5_cjs.documentSecondsToMs(docRow.updated_at)
2018
2018
  };
2019
2019
  dispatchHookEvent(c, "content:read", { collection: docRow.type_id, id: docRow.root_id, data: transformedContent.data }, "fire-and-forget");
2020
2020
  return c.json({ data: transformedContent });
@@ -2023,7 +2023,7 @@ apiRoutes.get("/:collection/:id", chunkBYLQOBO6_cjs.optionalAuth(), async (c) =>
2023
2023
  return c.json({ error: "Failed to fetch content", details: error instanceof Error ? error.message : String(error) }, 500);
2024
2024
  }
2025
2025
  });
2026
- apiRoutes.post("/:collection", chunkBYLQOBO6_cjs.requireAuth(), chunkBYLQOBO6_cjs.requireRole(["admin", "editor", "author"]), async (c) => {
2026
+ apiRoutes.post("/:collection", chunkL3KHLEHL_cjs.requireAuth(), chunkL3KHLEHL_cjs.requireRole(["admin", "editor", "author"]), async (c) => {
2027
2027
  try {
2028
2028
  const collection = c.req.param("collection");
2029
2029
  const db = c.env.DB;
@@ -2044,26 +2044,26 @@ apiRoutes.post("/:collection", chunkBYLQOBO6_cjs.requireAuth(), chunkBYLQOBO6_cj
2044
2044
  } catch (err) {
2045
2045
  return c.json({ error: "Write cancelled by plugin", details: String(err) }, 400);
2046
2046
  }
2047
- const svc = new chunk2CB4KY7I_cjs.DocumentsService(db, { queryableFields: backing.docType.queryableFields ?? [], typeSchemaVersion: backing.docType.schemaVersion ?? 1, maxVersionsPerRoot: backing.docType.settings?.maxVersionsPerRoot ?? 50, tenantId: "default", versioning: backing.docType.settings?.versioning ?? false });
2047
+ const svc = new chunkW36OZTJ5_cjs.DocumentsService(db, { queryableFields: backing.docType.queryableFields ?? [], typeSchemaVersion: backing.docType.schemaVersion ?? 1, maxVersionsPerRoot: backing.docType.settings?.maxVersionsPerRoot ?? 50, tenantId: "default", versioning: backing.docType.settings?.versioning ?? false });
2048
2048
  const doc = await svc.create(createDocumentSchema.parse({ typeId: backing.coll.name, tenantId: "default", locale: "default", title, slug: finalSlug, data: hookData, publishOnCreate: (status || "draft") === "published" }), user?.userId);
2049
2049
  const cache = chunk4BTBSXMR_cjs.getCacheService(chunk4BTBSXMR_cjs.CACHE_CONFIGS.api);
2050
2050
  await cache.invalidate("content-filtered:*");
2051
2051
  await cache.invalidate("collection-content-filtered:*");
2052
2052
  dispatchHookEvent(c, "content:after:create", { collection: backing.coll.name, id: doc.rootId, data: doc.data ?? {}, user: actor }, "fire-and-forget");
2053
- return c.json({ data: { id: doc.rootId, title: doc.title, slug: doc.slug, status: doc.status, collectionId: backing.coll.id, data: doc.data, created_at: chunk2CB4KY7I_cjs.documentSecondsToMs(doc.createdAt), updated_at: chunk2CB4KY7I_cjs.documentSecondsToMs(doc.updatedAt) } }, 201);
2053
+ return c.json({ data: { id: doc.rootId, title: doc.title, slug: doc.slug, status: doc.status, collectionId: backing.coll.id, data: doc.data, created_at: chunkW36OZTJ5_cjs.documentSecondsToMs(doc.createdAt), updated_at: chunkW36OZTJ5_cjs.documentSecondsToMs(doc.updatedAt) } }, 201);
2054
2054
  } catch (error) {
2055
2055
  console.error("Error creating content:", error);
2056
2056
  return c.json({ error: "Failed to create content", details: error instanceof Error ? error.message : String(error) }, 500);
2057
2057
  }
2058
2058
  });
2059
- apiRoutes.put("/:collection/:id", chunkBYLQOBO6_cjs.requireAuth(), chunkBYLQOBO6_cjs.requireRole(["admin", "editor", "author"]), async (c) => {
2059
+ apiRoutes.put("/:collection/:id", chunkL3KHLEHL_cjs.requireAuth(), chunkL3KHLEHL_cjs.requireRole(["admin", "editor", "author"]), async (c) => {
2060
2060
  try {
2061
2061
  const collection = c.req.param("collection");
2062
2062
  const id = c.req.param("id");
2063
2063
  const db = c.env.DB;
2064
2064
  const user = c.get("user");
2065
2065
  const body = await c.req.json();
2066
- const collRecord = chunkLLWLHFTD_cjs.getCollectionRegistry().getBySlugOrName(collection);
2066
+ const collRecord = chunkWIV3R2MJ_cjs.getCollectionRegistry().getBySlugOrName(collection);
2067
2067
  const typeName = collRecord?.name ?? collection;
2068
2068
  const docRow = await db.prepare("SELECT root_id, type_id FROM documents WHERE root_id = ? AND type_id = ? AND tenant_id = 'default' AND is_current_draft = 1 AND deleted_at IS NULL").bind(id, typeName).first();
2069
2069
  if (!docRow) return c.json({ error: "Content not found" }, 404);
@@ -2075,8 +2075,8 @@ apiRoutes.put("/:collection/:id", chunkBYLQOBO6_cjs.requireAuth(), chunkBYLQOBO6
2075
2075
  } catch (err) {
2076
2076
  return c.json({ error: "Write cancelled by plugin", details: String(err) }, 400);
2077
2077
  }
2078
- const docType = await new chunkBYLQOBO6_cjs.DocumentTypeRegistry(db).findById(docRow.type_id);
2079
- const svc = new chunk2CB4KY7I_cjs.DocumentsService(db, { queryableFields: docType?.queryableFields ?? [], typeSchemaVersion: docType?.schemaVersion ?? 1, maxVersionsPerRoot: docType?.settings?.maxVersionsPerRoot ?? 50, tenantId: "default", versioning: docType?.settings?.versioning ?? false });
2078
+ const docType = await new chunkL3KHLEHL_cjs.DocumentTypeRegistry(db).findById(docRow.type_id);
2079
+ const svc = new chunkW36OZTJ5_cjs.DocumentsService(db, { queryableFields: docType?.queryableFields ?? [], typeSchemaVersion: docType?.schemaVersion ?? 1, maxVersionsPerRoot: docType?.settings?.maxVersionsPerRoot ?? 50, tenantId: "default", versioning: docType?.settings?.versioning ?? false });
2080
2080
  const input = {};
2081
2081
  if (body.title !== void 0) input.title = body.title;
2082
2082
  if (body.slug !== void 0) input.slug = slugify(body.slug);
@@ -2092,25 +2092,25 @@ apiRoutes.put("/:collection/:id", chunkBYLQOBO6_cjs.requireAuth(), chunkBYLQOBO6
2092
2092
  const cache = chunk4BTBSXMR_cjs.getCacheService(chunk4BTBSXMR_cjs.CACHE_CONFIGS.api);
2093
2093
  await cache.invalidate("content-filtered:*");
2094
2094
  await cache.invalidate("collection-content-filtered:*");
2095
- const coll = chunkLLWLHFTD_cjs.getCollectionRegistry().getByName(docRow.type_id);
2095
+ const coll = chunkWIV3R2MJ_cjs.getCollectionRegistry().getByName(docRow.type_id);
2096
2096
  const saved = await db.prepare("SELECT * FROM documents WHERE id = ?").bind(newDraft.id).first();
2097
2097
  const savedData = saved?.data ? JSON.parse(saved.data) : {};
2098
2098
  dispatchHookEvent(c, "content:after:update", { collection: docRow.type_id, id, data: savedData, user: actor }, "fire-and-forget");
2099
2099
  const nowPublished = body.status === "published" || body.status === void 0 && wasPublished;
2100
2100
  if (nowPublished && !wasPublished) dispatchHookEvent(c, "content:after:publish", { collection: docRow.type_id, id, data: savedData, user: actor }, "fire-and-forget");
2101
- return c.json({ data: { id: saved.root_id, title: saved.title, slug: saved.slug, status: saved.status, collectionId: coll?.id ?? docRow.type_id, data: savedData, created_at: chunk2CB4KY7I_cjs.documentSecondsToMs(saved.created_at), updated_at: chunk2CB4KY7I_cjs.documentSecondsToMs(saved.updated_at) } });
2101
+ return c.json({ data: { id: saved.root_id, title: saved.title, slug: saved.slug, status: saved.status, collectionId: coll?.id ?? docRow.type_id, data: savedData, created_at: chunkW36OZTJ5_cjs.documentSecondsToMs(saved.created_at), updated_at: chunkW36OZTJ5_cjs.documentSecondsToMs(saved.updated_at) } });
2102
2102
  } catch (error) {
2103
2103
  console.error("Error updating content:", error);
2104
2104
  return c.json({ error: "Failed to update content", details: error instanceof Error ? error.message : String(error) }, 500);
2105
2105
  }
2106
2106
  });
2107
- apiRoutes.delete("/:collection/:id", chunkBYLQOBO6_cjs.requireAuth(), chunkBYLQOBO6_cjs.requireRole(["admin", "editor", "author"]), async (c) => {
2107
+ apiRoutes.delete("/:collection/:id", chunkL3KHLEHL_cjs.requireAuth(), chunkL3KHLEHL_cjs.requireRole(["admin", "editor", "author"]), async (c) => {
2108
2108
  try {
2109
2109
  const collection = c.req.param("collection");
2110
2110
  const id = c.req.param("id");
2111
2111
  const db = c.env.DB;
2112
2112
  const user = c.get("user");
2113
- const collRecord = chunkLLWLHFTD_cjs.getCollectionRegistry().getBySlugOrName(collection);
2113
+ const collRecord = chunkWIV3R2MJ_cjs.getCollectionRegistry().getBySlugOrName(collection);
2114
2114
  const typeName = collRecord?.name ?? collection;
2115
2115
  const docRow = await db.prepare("SELECT type_id FROM documents WHERE root_id = ? AND type_id = ? AND tenant_id = 'default' AND deleted_at IS NULL LIMIT 1").bind(id, typeName).first();
2116
2116
  if (!docRow) return c.json({ error: "Content not found" }, 404);
@@ -2195,7 +2195,7 @@ var MediaDocumentService = class {
2195
2195
  }
2196
2196
  /** Create a media_asset document from R2 upload metadata. Published-on-create (immediately usable). */
2197
2197
  async createFromUpload(meta, createdBy) {
2198
- const svc = new chunk2CB4KY7I_cjs.DocumentsService(this.db, { queryableFields: MEDIA_QUERYABLE, tenantId: this.tenantId, maxVersionsPerRoot: 5 });
2198
+ const svc = new chunkW36OZTJ5_cjs.DocumentsService(this.db, { queryableFields: MEDIA_QUERYABLE, tenantId: this.tenantId, maxVersionsPerRoot: 5 });
2199
2199
  return svc.create(
2200
2200
  createDocumentSchema.parse({
2201
2201
  typeId: "media_asset",
@@ -2268,7 +2268,7 @@ var MediaDocumentService = class {
2268
2268
  }
2269
2269
  /** Update alt/caption/tags on a media_asset document (saveDraft + publish atomically). */
2270
2270
  async updateMetadata(rootId, meta, updatedBy) {
2271
- const svc = new chunk2CB4KY7I_cjs.DocumentsService(this.db, { queryableFields: MEDIA_QUERYABLE, tenantId: this.tenantId, maxVersionsPerRoot: 5 });
2271
+ const svc = new chunkW36OZTJ5_cjs.DocumentsService(this.db, { queryableFields: MEDIA_QUERYABLE, tenantId: this.tenantId, maxVersionsPerRoot: 5 });
2272
2272
  const newDraft = await svc.saveDraft(rootId, { data: meta }, updatedBy);
2273
2273
  return svc.publish(newDraft.id, updatedBy);
2274
2274
  }
@@ -2325,7 +2325,7 @@ var fileValidationSchema = zod.z.object({
2325
2325
  // 50MB max
2326
2326
  });
2327
2327
  var apiMediaRoutes = new hono.Hono();
2328
- apiMediaRoutes.use("*", chunkBYLQOBO6_cjs.requireAuth());
2328
+ apiMediaRoutes.use("*", chunkL3KHLEHL_cjs.requireAuth());
2329
2329
  apiMediaRoutes.post("/upload", async (c) => {
2330
2330
  try {
2331
2331
  const user = c.get("user");
@@ -3023,7 +3023,7 @@ apiSystemRoutes.get("/info", (c) => {
3023
3023
  apiSystemRoutes.get("/stats", async (c) => {
3024
3024
  try {
3025
3025
  const db = c.env.DB;
3026
- const typeIds = chunkLLWLHFTD_cjs.getCollectionRegistry().listActive().filter((r) => !r.internal).map((r) => r.name);
3026
+ const typeIds = chunkWIV3R2MJ_cjs.getCollectionRegistry().listActive().filter((r) => !r.internal).map((r) => r.name);
3027
3027
  let contentStats = null;
3028
3028
  if (typeIds.length > 0) {
3029
3029
  const placeholders = typeIds.map(() => "?").join(",");
@@ -3098,12 +3098,12 @@ apiSystemRoutes.get("/env", (c) => {
3098
3098
  });
3099
3099
  var api_system_default = apiSystemRoutes;
3100
3100
  var adminApiRoutes = new hono.Hono();
3101
- adminApiRoutes.use("*", chunkBYLQOBO6_cjs.requireAuth());
3102
- adminApiRoutes.use("*", chunkBYLQOBO6_cjs.requireRole(["admin", "editor"]));
3101
+ adminApiRoutes.use("*", chunkL3KHLEHL_cjs.requireAuth());
3102
+ adminApiRoutes.use("*", chunkL3KHLEHL_cjs.requireRole(["admin", "editor"]));
3103
3103
  adminApiRoutes.get("/stats", async (c) => {
3104
3104
  try {
3105
3105
  const db = c.env.DB;
3106
- const userCollections = chunkLLWLHFTD_cjs.getCollectionRegistry().listActive().filter((r) => !r.internal);
3106
+ const userCollections = chunkWIV3R2MJ_cjs.getCollectionRegistry().listActive().filter((r) => !r.internal);
3107
3107
  const collectionsCount = userCollections.length;
3108
3108
  let contentCount = 0;
3109
3109
  if (userCollections.length > 0) {
@@ -3194,7 +3194,7 @@ adminApiRoutes.get("/collections", async (c) => {
3194
3194
  try {
3195
3195
  const search = c.req.query("search") || "";
3196
3196
  const includeInactive = c.req.query("includeInactive") === "true";
3197
- let records = chunkLLWLHFTD_cjs.getCollectionRegistry().list().filter((r) => !r.internal);
3197
+ let records = chunkWIV3R2MJ_cjs.getCollectionRegistry().list().filter((r) => !r.internal);
3198
3198
  if (!includeInactive) records = records.filter((r) => r.isActive !== false);
3199
3199
  if (search) {
3200
3200
  const needle = search.toLowerCase();
@@ -3226,7 +3226,7 @@ adminApiRoutes.get("/collections", async (c) => {
3226
3226
  adminApiRoutes.get("/collections/:id", async (c) => {
3227
3227
  try {
3228
3228
  const id = c.req.param("id");
3229
- const registry = chunkLLWLHFTD_cjs.getCollectionRegistry();
3229
+ const registry = chunkWIV3R2MJ_cjs.getCollectionRegistry();
3230
3230
  const record = registry.getById(id) ?? registry.getByName(id);
3231
3231
  if (!record) {
3232
3232
  return c.json({ error: "Collection not found" }, 404);
@@ -3276,7 +3276,7 @@ adminApiRoutes.get("/references", async (c) => {
3276
3276
  if (collectionParams.length === 0) {
3277
3277
  return c.json({ error: "Collection is required" }, 400);
3278
3278
  }
3279
- const registry = chunkLLWLHFTD_cjs.getCollectionRegistry();
3279
+ const registry = chunkWIV3R2MJ_cjs.getCollectionRegistry();
3280
3280
  const matched = collectionParams.map((param) => registry.getById(param) ?? registry.getByName(param)).filter((r) => !!r);
3281
3281
  const seen = /* @__PURE__ */ new Set();
3282
3282
  const collections = matched.filter((r) => {
@@ -3391,7 +3391,7 @@ adminApiRoutes.patch("/collections/:id", collectionsReadOnly);
3391
3391
  adminApiRoutes.delete("/collections/:id", collectionsReadOnly);
3392
3392
  adminApiRoutes.get("/migrations/status", async (c) => {
3393
3393
  try {
3394
- const { MigrationService: MigrationService2 } = await import('./migrations-AFSCRO56.cjs');
3394
+ const { MigrationService: MigrationService2 } = await import('./migrations-TYYC66P4.cjs');
3395
3395
  const db = c.env.DB;
3396
3396
  const migrationService = new MigrationService2(db);
3397
3397
  const status = await migrationService.getMigrationStatus();
@@ -3434,7 +3434,7 @@ adminApiRoutes.post("/migrations/run", async (c) => {
3434
3434
  });
3435
3435
  adminApiRoutes.get("/migrations/validate", async (c) => {
3436
3436
  try {
3437
- const { MigrationService: MigrationService2 } = await import('./migrations-AFSCRO56.cjs');
3437
+ const { MigrationService: MigrationService2 } = await import('./migrations-TYYC66P4.cjs');
3438
3438
  const db = c.env.DB;
3439
3439
  const migrationService = new MigrationService2(db);
3440
3440
  const validation = await migrationService.validateSchema();
@@ -3593,7 +3593,7 @@ function renderLoginPage(data, demoLoginActive = false) {
3593
3593
  <!-- Form -->
3594
3594
  <form
3595
3595
  id="login-form"
3596
- hx-post="/auth/login/form"
3596
+ hx-post="/auth/login/form${data.redirect ? `?redirect=${encodeURIComponent(data.redirect)}` : ""}"
3597
3597
  hx-target="#form-response"
3598
3598
  hx-swap="innerHTML"
3599
3599
  class="space-y-6"
@@ -3849,7 +3849,7 @@ function renderRegisterPage(data) {
3849
3849
  }
3850
3850
 
3851
3851
  // src/services/email/email-service-singleton.ts
3852
- var singleton = chunkNYLWNR6T_cjs.createServiceSingleton("EmailService");
3852
+ var singleton = chunk4YRYGDCQ_cjs.createServiceSingleton("EmailService");
3853
3853
  function setEmailService(service2) {
3854
3854
  singleton.set(service2);
3855
3855
  }
@@ -3893,7 +3893,7 @@ function emptyProfile() {
3893
3893
  return { custom: {} };
3894
3894
  }
3895
3895
  function service(db) {
3896
- return new chunk2CB4KY7I_cjs.DocumentsService(db, { tenantId: "default", maxVersionsPerRoot: 1, queryableFields: [] });
3896
+ return new chunkW36OZTJ5_cjs.DocumentsService(db, { tenantId: "default", maxVersionsPerRoot: 1, queryableFields: [] });
3897
3897
  }
3898
3898
  async function readProfileData(db, userId) {
3899
3899
  const row = await db.prepare(
@@ -4657,7 +4657,7 @@ function getLexicalInitScript(settings = {}) {
4657
4657
  </script>
4658
4658
  `;
4659
4659
  }
4660
- var lexicalEditorPlugin = chunkNYLWNR6T_cjs.definePlugin({
4660
+ var lexicalEditorPlugin = chunk4YRYGDCQ_cjs.definePlugin({
4661
4661
  id: "lexical-editor",
4662
4662
  version: "1.0.0",
4663
4663
  name: "Lexical Editor",
@@ -5581,6 +5581,79 @@ function renderDynamicField(field, options = {}) {
5581
5581
  `;
5582
5582
  break;
5583
5583
  }
5584
+ case "json": {
5585
+ const jsonParsedValue = value !== null && value !== void 0 && typeof value !== "string" ? value : typeof value === "string" && value !== "" ? (() => {
5586
+ try {
5587
+ return JSON.parse(value);
5588
+ } catch {
5589
+ return value;
5590
+ }
5591
+ })() : null;
5592
+ const jsonDisplayValue = jsonParsedValue !== null && typeof jsonParsedValue !== "string" ? JSON.stringify(jsonParsedValue, null, 2) : typeof jsonParsedValue === "string" ? jsonParsedValue : "";
5593
+ const viewerId = `${fieldId}-viewer`;
5594
+ const textareaId = `${fieldId}-textarea`;
5595
+ const jsonDataAttr = escapeHtml2(JSON.stringify(jsonParsedValue ?? null));
5596
+ const isEmpty = jsonParsedValue === null || jsonDisplayValue === "";
5597
+ if (disabled) {
5598
+ fieldHTML = `
5599
+ <div
5600
+ id="${viewerId}"
5601
+ class="json-viewer-host rounded-lg px-3 py-2 text-xs bg-white dark:bg-zinc-800 shadow-sm ring-1 ring-inset ring-zinc-950/10 dark:ring-white/10 min-h-[2.5rem] overflow-auto"
5602
+ data-json-viewer
5603
+ data-json="${jsonDataAttr}"
5604
+ data-open="${opts.open ?? 2}"
5605
+ >${isEmpty ? '<span class="text-zinc-400 dark:text-zinc-500 italic">empty</span>' : ""}</div>
5606
+ ${getJsonViewerScript()}
5607
+ `;
5608
+ } else {
5609
+ fieldHTML = `
5610
+ <div class="json-field-wrapper space-y-2">
5611
+ <div class="flex items-center justify-end">
5612
+ <button
5613
+ type="button"
5614
+ id="${fieldId}-toggle"
5615
+ class="text-xs text-zinc-500 dark:text-zinc-400 hover:text-zinc-700 dark:hover:text-zinc-200 underline transition-colors"
5616
+ data-json-toggle
5617
+ data-viewer="${viewerId}"
5618
+ data-textarea="${textareaId}"
5619
+ data-hidden-input="${fieldId}"
5620
+ >Edit JSON</button>
5621
+ </div>
5622
+
5623
+ <div
5624
+ id="${viewerId}"
5625
+ class="json-viewer-host rounded-lg px-3 py-2 text-xs bg-white dark:bg-zinc-800 shadow-sm ring-1 ring-inset ring-zinc-950/10 dark:ring-white/10 min-h-[2.5rem] overflow-auto"
5626
+ data-json-viewer
5627
+ data-json="${jsonDataAttr}"
5628
+ data-open="${opts.open ?? 2}"
5629
+ >${isEmpty ? '<span class="text-zinc-400 dark:text-zinc-500 italic">empty \u2014 click &quot;Edit JSON&quot; to add data</span>' : ""}</div>
5630
+
5631
+ <textarea
5632
+ id="${textareaId}"
5633
+ rows="${opts.rows || 8}"
5634
+ placeholder="${opts.placeholder || "{}"}"
5635
+ class="${baseClasses} ${errorClasses} resize-y font-mono text-xs hidden"
5636
+ aria-label="${escapeHtml2(field.field_label)}"
5637
+ data-json-edit-area
5638
+ data-viewer="${viewerId}"
5639
+ data-hidden-input="${fieldId}"
5640
+ >${escapeHtml2(jsonDisplayValue)}</textarea>
5641
+
5642
+ <input
5643
+ type="hidden"
5644
+ id="${fieldId}"
5645
+ name="${fieldName}"
5646
+ value="${escapeHtml2(jsonDisplayValue)}"
5647
+ ${required}
5648
+ >
5649
+
5650
+ <div id="${fieldId}-json-error" class="text-xs text-pink-500 dark:text-pink-400 hidden"></div>
5651
+ </div>
5652
+ ${getJsonViewerScript()}
5653
+ `;
5654
+ }
5655
+ break;
5656
+ }
5584
5657
  default:
5585
5658
  fieldHTML = `
5586
5659
  <input
@@ -6077,6 +6150,120 @@ function normalizeBlockField(fieldConfig, fieldName) {
6077
6150
  options
6078
6151
  };
6079
6152
  }
6153
+ function getJsonViewerScript() {
6154
+ return `
6155
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/json-formatter-js@2.5.23/dist/json-formatter.min.css" id="json-formatter-css" onload="this.removeAttribute('onload')" onerror="">
6156
+ <script>
6157
+ (function() {
6158
+ var JS_URL = 'https://cdn.jsdelivr.net/npm/json-formatter-js@2.5.23/dist/json-formatter.umd.min.js';
6159
+
6160
+ function isDark() {
6161
+ return document.documentElement.classList.contains('dark') ||
6162
+ document.documentElement.dataset.theme === 'dark' ||
6163
+ window.matchMedia('(prefers-color-scheme: dark)').matches;
6164
+ }
6165
+
6166
+ function initViewer(el) {
6167
+ var raw = el.dataset.json;
6168
+ var open = parseInt(el.dataset.open || '2', 10);
6169
+ if (!raw || raw === 'null') return;
6170
+ var data;
6171
+ try { data = JSON.parse(raw); } catch(e) { el.textContent = raw; return; }
6172
+ var fmt = new JSONFormatter(data, open, {
6173
+ hoverPreviewEnabled: true,
6174
+ hoverPreviewArrayCount: 5,
6175
+ hoverPreviewFieldCount: 5,
6176
+ theme: isDark() ? 'dark' : '',
6177
+ animateOpen: true,
6178
+ animateClose: true,
6179
+ });
6180
+ el.innerHTML = '';
6181
+ el.appendChild(fmt.render());
6182
+ }
6183
+
6184
+ function initAllViewers() {
6185
+ document.querySelectorAll('[data-json-viewer]').forEach(function(el) { initViewer(el); });
6186
+ }
6187
+
6188
+ function ensureLoaded(cb) {
6189
+ if (window.JSONFormatter) { cb(); return; }
6190
+ if (window.__jsonFormatterCallbacks) { window.__jsonFormatterCallbacks.push(cb); return; }
6191
+ window.__jsonFormatterCallbacks = [cb];
6192
+ var s = document.createElement('script');
6193
+ s.src = JS_URL;
6194
+ s.onload = function() {
6195
+ (window.__jsonFormatterCallbacks || []).forEach(function(fn) { fn(); });
6196
+ window.__jsonFormatterCallbacks = null;
6197
+ };
6198
+ document.head.appendChild(s);
6199
+ }
6200
+
6201
+ if (!window.__sonicJsonViewerInit) {
6202
+ window.__sonicJsonViewerInit = true;
6203
+
6204
+ // Toggle between viewer and edit textarea
6205
+ document.addEventListener('click', function(e) {
6206
+ var btn = e.target.closest('[data-json-toggle]');
6207
+ if (!btn) return;
6208
+ var viewerId = btn.dataset.viewer;
6209
+ var textareaId = btn.dataset.textarea;
6210
+ var hiddenId = btn.dataset.hiddenInput;
6211
+ var viewer = document.getElementById(viewerId);
6212
+ var textarea = document.getElementById(textareaId);
6213
+ var hidden = document.getElementById(hiddenId);
6214
+ var errorEl = hidden ? document.getElementById(hiddenId + '-json-error') : null;
6215
+ if (!viewer || !textarea) return;
6216
+ var isEditing = !textarea.classList.contains('hidden');
6217
+ if (isEditing) {
6218
+ // Switching back to viewer \u2014 validate + refresh
6219
+ var raw = textarea.value.trim();
6220
+ if (raw) {
6221
+ try {
6222
+ var parsed = JSON.parse(raw);
6223
+ if (hidden) hidden.value = raw;
6224
+ viewer.dataset.json = JSON.stringify(parsed);
6225
+ ensureLoaded(function() { initViewer(viewer); });
6226
+ if (errorEl) { errorEl.textContent = ''; errorEl.classList.add('hidden'); }
6227
+ } catch(ex) {
6228
+ if (errorEl) { errorEl.textContent = 'Invalid JSON: ' + ex.message; errorEl.classList.remove('hidden'); }
6229
+ return;
6230
+ }
6231
+ } else {
6232
+ if (hidden) hidden.value = '';
6233
+ viewer.innerHTML = '<span class="text-zinc-400 dark:text-zinc-500 italic">empty</span>';
6234
+ }
6235
+ textarea.classList.add('hidden');
6236
+ viewer.classList.remove('hidden');
6237
+ btn.textContent = 'Edit JSON';
6238
+ } else {
6239
+ // Switching to edit \u2014 populate textarea from hidden input
6240
+ if (hidden && hidden.value) {
6241
+ try {
6242
+ textarea.value = JSON.stringify(JSON.parse(hidden.value), null, 2);
6243
+ } catch(e) {
6244
+ textarea.value = hidden.value;
6245
+ }
6246
+ }
6247
+ viewer.classList.add('hidden');
6248
+ textarea.classList.remove('hidden');
6249
+ btn.textContent = 'Preview';
6250
+ }
6251
+ });
6252
+ }
6253
+
6254
+ function run() {
6255
+ ensureLoaded(initAllViewers);
6256
+ }
6257
+
6258
+ if (document.readyState === 'loading') {
6259
+ document.addEventListener('DOMContentLoaded', run);
6260
+ } else {
6261
+ run();
6262
+ }
6263
+ })();
6264
+ </script>
6265
+ `;
6266
+ }
6080
6267
  function getStructuredFieldScript() {
6081
6268
  return `
6082
6269
  ${getReadFieldValueScript()}
@@ -6876,7 +7063,7 @@ api.put("/:userId", async (c) => {
6876
7063
  await saveCustomData(db, userId, sanitized);
6877
7064
  return c.json({ success: true });
6878
7065
  });
6879
- var userProfilesPlugin = chunkNYLWNR6T_cjs.definePlugin({
7066
+ var userProfilesPlugin = chunk4YRYGDCQ_cjs.definePlugin({
6880
7067
  id: "user-profiles",
6881
7068
  version: "1.0.0",
6882
7069
  name: "User Profiles",
@@ -6914,8 +7101,8 @@ function renderPasswordResetEmail(resetLink, firstName) {
6914
7101
  async function setCsrfCookie(c, maxAge) {
6915
7102
  const secret = c.env?.JWT_SECRET || JWT_SECRET_FALLBACK;
6916
7103
  const isDev = c.env?.ENVIRONMENT === "development" || !c.env?.ENVIRONMENT;
6917
- const csrfToken = await chunkBYLQOBO6_cjs.generateCsrfToken(secret);
6918
- const cookieMaxAge = await chunkBYLQOBO6_cjs.getJwtExpirySecondsFromDb(c.env?.DB, c.env);
7104
+ const csrfToken = await chunkL3KHLEHL_cjs.generateCsrfToken(secret);
7105
+ const cookieMaxAge = await chunkL3KHLEHL_cjs.getJwtExpirySecondsFromDb(c.env?.DB, c.env);
6919
7106
  cookie.setCookie(c, "csrf_token", csrfToken, {
6920
7107
  httpOnly: false,
6921
7108
  secure: !isDev,
@@ -6937,10 +7124,12 @@ var authRoutes = new hono.Hono();
6937
7124
  authRoutes.get("/login", async (c) => {
6938
7125
  const error = c.req.query("error");
6939
7126
  const message = c.req.query("message");
7127
+ const redirect = c.req.query("redirect");
6940
7128
  const pageData = {
6941
7129
  error: error || void 0,
6942
7130
  message: message || void 0,
6943
- version: c.get("appVersion")
7131
+ version: c.get("appVersion"),
7132
+ redirect: redirect && redirect.startsWith("/") ? redirect : void 0
6944
7133
  };
6945
7134
  const db = c.env.DB;
6946
7135
  let demoLoginActive = false;
@@ -6972,7 +7161,7 @@ var loginSchema = zod.z.object({
6972
7161
  });
6973
7162
  authRoutes.post(
6974
7163
  "/register",
6975
- chunkBYLQOBO6_cjs.rateLimit({ max: 30, windowMs: 60 * 1e3, keyPrefix: "register" }),
7164
+ chunkL3KHLEHL_cjs.rateLimit({ max: 30, windowMs: 60 * 1e3, keyPrefix: "register" }),
6976
7165
  async (c) => {
6977
7166
  try {
6978
7167
  const db = c.env.DB;
@@ -7008,7 +7197,7 @@ authRoutes.post(
7008
7197
  if (existingUser) {
7009
7198
  return c.json({ error: "User with this email already exists" }, 400);
7010
7199
  }
7011
- const passwordHash = await chunkBYLQOBO6_cjs.AuthManager.hashPassword(password);
7200
+ const passwordHash = await chunkL3KHLEHL_cjs.AuthManager.hashPassword(password);
7012
7201
  const userId = crypto.randomUUID();
7013
7202
  const now = /* @__PURE__ */ new Date();
7014
7203
  const nowSec = Math.floor(now.getTime() / 1e3);
@@ -7041,8 +7230,8 @@ authRoutes.post(
7041
7230
  { user: { id: userId, email: normalizedEmail, role: "viewer" } },
7042
7231
  "fire-and-forget"
7043
7232
  );
7044
- const tokenTtl = await chunkBYLQOBO6_cjs.getJwtExpirySecondsFromDb(c.env.DB, c.env);
7045
- const token = await chunkBYLQOBO6_cjs.AuthManager.generateToken(userId, normalizedEmail, "viewer", c.env.JWT_SECRET, tokenTtl);
7233
+ const tokenTtl = await chunkL3KHLEHL_cjs.getJwtExpirySecondsFromDb(c.env.DB, c.env);
7234
+ const token = await chunkL3KHLEHL_cjs.AuthManager.generateToken(userId, normalizedEmail, "viewer", c.env.JWT_SECRET, tokenTtl);
7046
7235
  cookie.setCookie(c, "auth_token", token, {
7047
7236
  httpOnly: true,
7048
7237
  secure: true,
@@ -7074,7 +7263,7 @@ authRoutes.post(
7074
7263
  );
7075
7264
  authRoutes.post(
7076
7265
  "/login",
7077
- chunkBYLQOBO6_cjs.rateLimit({ max: 30, windowMs: 60 * 1e3, keyPrefix: "login" }),
7266
+ chunkL3KHLEHL_cjs.rateLimit({ max: 30, windowMs: 60 * 1e3, keyPrefix: "login" }),
7078
7267
  async (c) => {
7079
7268
  try {
7080
7269
  const body = await c.req.json();
@@ -7084,7 +7273,7 @@ authRoutes.post(
7084
7273
  }
7085
7274
  const { email, password } = validation.data;
7086
7275
  const normalizedEmail = email.toLowerCase();
7087
- const { createAuth } = await import('./config-ON6FNMYX.cjs');
7276
+ const { createAuth } = await import('./config-FLOUCYHH.cjs');
7088
7277
  const auth = createAuth(c.env);
7089
7278
  const baReq = new Request(new URL("/auth/sign-in/email", c.req.url).href, {
7090
7279
  method: "POST",
@@ -7106,6 +7295,20 @@ authRoutes.post(
7106
7295
  await setCsrfCookie(c);
7107
7296
  const baBody = await baRes.json();
7108
7297
  const user = baBody.user ?? {};
7298
+ const tokenTtl = await chunkL3KHLEHL_cjs.getJwtExpirySecondsFromDb(c.env.DB, c.env);
7299
+ const token = await chunkL3KHLEHL_cjs.AuthManager.generateToken(
7300
+ user.id,
7301
+ user.email,
7302
+ user.role ?? "viewer",
7303
+ c.env.JWT_SECRET,
7304
+ tokenTtl
7305
+ );
7306
+ cookie.setCookie(c, "auth_token", token, {
7307
+ httpOnly: true,
7308
+ secure: true,
7309
+ sameSite: "Strict",
7310
+ maxAge: tokenTtl
7311
+ });
7109
7312
  return c.json({
7110
7313
  user: {
7111
7314
  id: user.id,
@@ -7113,7 +7316,8 @@ authRoutes.post(
7113
7316
  firstName: user.name?.split(" ")[0] ?? "",
7114
7317
  lastName: user.name?.split(" ").slice(1).join(" ") ?? "",
7115
7318
  role: user.role ?? "viewer"
7116
- }
7319
+ },
7320
+ token
7117
7321
  });
7118
7322
  } catch (error) {
7119
7323
  console.error("Login error:", error);
@@ -7123,7 +7327,7 @@ authRoutes.post(
7123
7327
  );
7124
7328
  authRoutes.post("/logout", async (c) => {
7125
7329
  try {
7126
- const { createAuth } = await import('./config-ON6FNMYX.cjs');
7330
+ const { createAuth } = await import('./config-FLOUCYHH.cjs');
7127
7331
  const auth = createAuth(c.env);
7128
7332
  const baReq = new Request(new URL("/auth/sign-out", c.req.url).href, {
7129
7333
  method: "POST",
@@ -7139,7 +7343,7 @@ authRoutes.post("/logout", async (c) => {
7139
7343
  });
7140
7344
  authRoutes.get("/logout", async (c) => {
7141
7345
  try {
7142
- const { createAuth } = await import('./config-ON6FNMYX.cjs');
7346
+ const { createAuth } = await import('./config-FLOUCYHH.cjs');
7143
7347
  const auth = createAuth(c.env);
7144
7348
  const baReq = new Request(new URL("/auth/sign-out", c.req.url).href, {
7145
7349
  method: "POST",
@@ -7153,7 +7357,7 @@ authRoutes.get("/logout", async (c) => {
7153
7357
  clearCsrfCookie(c);
7154
7358
  return c.redirect("/auth/login?message=You have been logged out successfully");
7155
7359
  });
7156
- authRoutes.get("/me", chunkBYLQOBO6_cjs.requireAuth(), async (c) => {
7360
+ authRoutes.get("/me", chunkL3KHLEHL_cjs.requireAuth(), async (c) => {
7157
7361
  try {
7158
7362
  const user = c.get("user");
7159
7363
  if (!user) {
@@ -7173,7 +7377,7 @@ authRoutes.get("/me", chunkBYLQOBO6_cjs.requireAuth(), async (c) => {
7173
7377
  });
7174
7378
  authRoutes.post(
7175
7379
  "/refresh",
7176
- chunkBYLQOBO6_cjs.rateLimit({ max: 60, windowMs: 60 * 1e3, keyPrefix: "refresh" }),
7380
+ chunkL3KHLEHL_cjs.rateLimit({ max: 60, windowMs: 60 * 1e3, keyPrefix: "refresh" }),
7177
7381
  async (c) => {
7178
7382
  try {
7179
7383
  let token = c.req.header("Authorization")?.replace("Bearer ", "");
@@ -7182,8 +7386,8 @@ authRoutes.post(
7182
7386
  return c.json({ error: "Authentication required" }, 401);
7183
7387
  }
7184
7388
  const db = c.env.DB;
7185
- const grace = await chunkBYLQOBO6_cjs.getJwtRefreshGraceSecondsFromDb(db, c.env);
7186
- const payload = await chunkBYLQOBO6_cjs.AuthManager.verifyToken(token, c.env.JWT_SECRET, grace);
7389
+ const grace = await chunkL3KHLEHL_cjs.getJwtRefreshGraceSecondsFromDb(db, c.env);
7390
+ const payload = await chunkL3KHLEHL_cjs.AuthManager.verifyToken(token, c.env.JWT_SECRET, grace);
7187
7391
  if (!payload) {
7188
7392
  return c.json({ error: "Invalid or expired token" }, 401);
7189
7393
  }
@@ -7191,8 +7395,8 @@ authRoutes.post(
7191
7395
  if (!row || !row.is_active) {
7192
7396
  return c.json({ error: "User is not active" }, 401);
7193
7397
  }
7194
- const tokenTtl = await chunkBYLQOBO6_cjs.getJwtExpirySecondsFromDb(db, c.env);
7195
- const newToken = await chunkBYLQOBO6_cjs.AuthManager.generateToken(row.id, row.email, row.role, c.env.JWT_SECRET, tokenTtl);
7398
+ const tokenTtl = await chunkL3KHLEHL_cjs.getJwtExpirySecondsFromDb(db, c.env);
7399
+ const newToken = await chunkL3KHLEHL_cjs.AuthManager.generateToken(row.id, row.email, row.role, c.env.JWT_SECRET, tokenTtl);
7196
7400
  cookie.setCookie(c, "auth_token", newToken, {
7197
7401
  httpOnly: true,
7198
7402
  secure: true,
@@ -7212,7 +7416,7 @@ authRoutes.post(
7212
7416
  );
7213
7417
  authRoutes.post(
7214
7418
  "/register/form",
7215
- chunkBYLQOBO6_cjs.rateLimit({ max: 30, windowMs: 60 * 1e3, keyPrefix: "register" }),
7419
+ chunkL3KHLEHL_cjs.rateLimit({ max: 30, windowMs: 60 * 1e3, keyPrefix: "register" }),
7216
7420
  async (c) => {
7217
7421
  try {
7218
7422
  const db = c.env.DB;
@@ -7257,7 +7461,7 @@ authRoutes.post(
7257
7461
  </div>
7258
7462
  `);
7259
7463
  }
7260
- const passwordHash = await chunkBYLQOBO6_cjs.AuthManager.hashPassword(password);
7464
+ const passwordHash = await chunkL3KHLEHL_cjs.AuthManager.hashPassword(password);
7261
7465
  const role = isFirstUser ? "admin" : "viewer";
7262
7466
  const userId = crypto.randomUUID();
7263
7467
  const now = /* @__PURE__ */ new Date();
@@ -7291,7 +7495,7 @@ authRoutes.post(
7291
7495
  await saveCustomData(db, userId, sanitized);
7292
7496
  }
7293
7497
  }
7294
- const rbacService = new chunk2CB4KY7I_cjs.RbacService(db);
7498
+ const rbacService = new chunkW36OZTJ5_cjs.RbacService(db);
7295
7499
  await rbacService.addUserRoleByName(userId, role);
7296
7500
  dispatchHookEvent(
7297
7501
  c,
@@ -7299,8 +7503,8 @@ authRoutes.post(
7299
7503
  { user: { id: userId, email: normalizedEmail, role } },
7300
7504
  "fire-and-forget"
7301
7505
  );
7302
- const tokenTtl = await chunkBYLQOBO6_cjs.getJwtExpirySecondsFromDb(c.env.DB, c.env);
7303
- const token = await chunkBYLQOBO6_cjs.AuthManager.generateToken(userId, normalizedEmail, role, c.env.JWT_SECRET, tokenTtl);
7506
+ const tokenTtl = await chunkL3KHLEHL_cjs.getJwtExpirySecondsFromDb(c.env.DB, c.env);
7507
+ const token = await chunkL3KHLEHL_cjs.AuthManager.generateToken(userId, normalizedEmail, role, c.env.JWT_SECRET, tokenTtl);
7304
7508
  cookie.setCookie(c, "auth_token", token, {
7305
7509
  httpOnly: true,
7306
7510
  secure: false,
@@ -7332,7 +7536,7 @@ authRoutes.post(
7332
7536
  );
7333
7537
  authRoutes.post(
7334
7538
  "/login/form",
7335
- chunkBYLQOBO6_cjs.rateLimit({ max: 30, windowMs: 60 * 1e3, keyPrefix: "login" }),
7539
+ chunkL3KHLEHL_cjs.rateLimit({ max: 30, windowMs: 60 * 1e3, keyPrefix: "login" }),
7336
7540
  async (c) => {
7337
7541
  try {
7338
7542
  const formData = await c.req.formData();
@@ -7346,7 +7550,7 @@ authRoutes.post(
7346
7550
  </div>
7347
7551
  `);
7348
7552
  }
7349
- const { createAuth } = await import('./config-ON6FNMYX.cjs');
7553
+ const { createAuth } = await import('./config-FLOUCYHH.cjs');
7350
7554
  const auth = createAuth(c.env);
7351
7555
  const baReq = new Request(new URL("/auth/sign-in/email", c.req.url).href, {
7352
7556
  method: "POST",
@@ -7370,6 +7574,8 @@ authRoutes.post(
7370
7574
  }
7371
7575
  }
7372
7576
  await setCsrfCookie(c);
7577
+ const rawRedirect = c.req.query("redirect");
7578
+ const redirectUrl = rawRedirect && rawRedirect.startsWith("/") ? rawRedirect : "/admin/content";
7373
7579
  return c.html(html.html`
7374
7580
  <div id="form-response">
7375
7581
  <div class="rounded-lg bg-green-100 dark:bg-lime-500/10 p-4 ring-1 ring-green-400 dark:ring-lime-500/20">
@@ -7382,7 +7588,7 @@ authRoutes.post(
7382
7588
  </div>
7383
7589
  </div>
7384
7590
  <script>
7385
- setTimeout(() => { window.location.href = '/admin/content'; }, 500);
7591
+ setTimeout(() => { window.location.href = '${redirectUrl}'; }, 500);
7386
7592
  </script>
7387
7593
  </div>
7388
7594
  </div>
@@ -7399,14 +7605,14 @@ authRoutes.post(
7399
7605
  );
7400
7606
  authRoutes.post(
7401
7607
  "/seed-admin",
7402
- chunkBYLQOBO6_cjs.rateLimit({ max: 10, windowMs: 60 * 1e3, keyPrefix: "seed-admin" }),
7608
+ chunkL3KHLEHL_cjs.rateLimit({ max: 10, windowMs: 60 * 1e3, keyPrefix: "seed-admin" }),
7403
7609
  async (c) => {
7404
7610
  try {
7405
7611
  const db = c.env.DB;
7406
- const rbac = new chunk2CB4KY7I_cjs.RbacService(db);
7612
+ const rbac = new chunkW36OZTJ5_cjs.RbacService(db);
7407
7613
  const results = [];
7408
7614
  const upsertSeedUser = async (opts) => {
7409
- const passwordHash = await chunkBYLQOBO6_cjs.AuthManager.hashPassword(opts.password);
7615
+ const passwordHash = await chunkL3KHLEHL_cjs.AuthManager.hashPassword(opts.password);
7410
7616
  const nowMs = Date.now();
7411
7617
  const nowSec = Math.floor(nowMs / 1e3);
7412
7618
  const existing = await db.prepare("SELECT id FROM auth_user WHERE email = ?").bind(opts.email).first();
@@ -7631,7 +7837,7 @@ authRoutes.post("/accept-invitation", async (c) => {
7631
7837
  if (invitationAge > maxAge) {
7632
7838
  return c.json({ error: "Invitation has expired" }, 400);
7633
7839
  }
7634
- const passwordHash = await chunkBYLQOBO6_cjs.AuthManager.hashPassword(password);
7840
+ const passwordHash = await chunkL3KHLEHL_cjs.AuthManager.hashPassword(password);
7635
7841
  const updateStmt = db.prepare(`
7636
7842
  UPDATE auth_user SET
7637
7843
  password_hash = ?,
@@ -7648,8 +7854,8 @@ authRoutes.post("/accept-invitation", async (c) => {
7648
7854
  Date.now(),
7649
7855
  invitedUser.id
7650
7856
  ).run();
7651
- const tokenTtl = await chunkBYLQOBO6_cjs.getJwtExpirySecondsFromDb(c.env.DB, c.env);
7652
- const authToken = await chunkBYLQOBO6_cjs.AuthManager.generateToken(invitedUser.id, invitedUser.email, invitedUser.role, c.env.JWT_SECRET, tokenTtl);
7857
+ const tokenTtl = await chunkL3KHLEHL_cjs.getJwtExpirySecondsFromDb(c.env.DB, c.env);
7858
+ const authToken = await chunkL3KHLEHL_cjs.AuthManager.generateToken(invitedUser.id, invitedUser.email, invitedUser.role, c.env.JWT_SECRET, tokenTtl);
7653
7859
  cookie.setCookie(c, "auth_token", authToken, {
7654
7860
  httpOnly: true,
7655
7861
  secure: true,
@@ -7665,7 +7871,7 @@ authRoutes.post("/accept-invitation", async (c) => {
7665
7871
  });
7666
7872
  authRoutes.post(
7667
7873
  "/request-password-reset",
7668
- chunkBYLQOBO6_cjs.rateLimit({ max: 3, windowMs: 15 * 60 * 1e3, keyPrefix: "password-reset" }),
7874
+ chunkL3KHLEHL_cjs.rateLimit({ max: 3, windowMs: 15 * 60 * 1e3, keyPrefix: "password-reset" }),
7669
7875
  async (c) => {
7670
7876
  try {
7671
7877
  const formData = await c.req.formData();
@@ -7902,7 +8108,7 @@ authRoutes.post("/reset-password", async (c) => {
7902
8108
  if (Date.now() > user.password_reset_expires) {
7903
8109
  return c.json({ error: "Reset token has expired" }, 400);
7904
8110
  }
7905
- const newPasswordHash = await chunkBYLQOBO6_cjs.AuthManager.hashPassword(password);
8111
+ const newPasswordHash = await chunkL3KHLEHL_cjs.AuthManager.hashPassword(password);
7906
8112
  try {
7907
8113
  const historyStmt = db.prepare(`
7908
8114
  INSERT INTO auth_password_history (id, user_id, password_hash, created_at)
@@ -8116,7 +8322,7 @@ app.post("/test-seed-defaults", async (c) => {
8116
8322
  var test_cleanup_default = app;
8117
8323
 
8118
8324
  // src/plugins/available/easy-mdx/index.ts
8119
- chunkNYLWNR6T_cjs.definePlugin({
8325
+ chunk4YRYGDCQ_cjs.definePlugin({
8120
8326
  id: "easy-mdx",
8121
8327
  version: "1.0.0",
8122
8328
  name: "EasyMDE Markdown Editor",
@@ -8316,7 +8522,7 @@ function getMDXEditorInitScript(config) {
8316
8522
  }
8317
8523
 
8318
8524
  // src/plugins/available/tinymce-plugin/index.ts
8319
- chunkNYLWNR6T_cjs.definePlugin({
8525
+ chunk4YRYGDCQ_cjs.definePlugin({
8320
8526
  id: "tinymce-plugin",
8321
8527
  version: "1.0.0",
8322
8528
  name: "TinyMCE",
@@ -8586,7 +8792,7 @@ function getQuillCDN(version = "2.0.2") {
8586
8792
  </style>
8587
8793
  `;
8588
8794
  }
8589
- chunkNYLWNR6T_cjs.definePlugin({
8795
+ chunk4YRYGDCQ_cjs.definePlugin({
8590
8796
  id: "quill-editor",
8591
8797
  version: "1.0.0",
8592
8798
  name: "Quill Editor",
@@ -11160,7 +11366,7 @@ function extractFieldData(fields, formData, options = {}) {
11160
11366
  }
11161
11367
  return { data, errors };
11162
11368
  }
11163
- adminContentRoutes.use("*", chunkBYLQOBO6_cjs.requireAuth());
11369
+ adminContentRoutes.use("*", chunkL3KHLEHL_cjs.requireAuth());
11164
11370
  async function getCollectionFields(db, collectionId) {
11165
11371
  console.log(`[getCollectionFields] Loading fields for collection: ${collectionId}`);
11166
11372
  const collectionStmt = db.prepare("SELECT schema, queryable_fields FROM document_types WHERE id = ?");
@@ -11187,7 +11393,7 @@ async function getCollectionFields(db, collectionId) {
11187
11393
  };
11188
11394
  });
11189
11395
  }
11190
- const codeCollections2 = await chunkLLWLHFTD_cjs.loadCollectionConfigs();
11396
+ const codeCollections2 = await chunkWIV3R2MJ_cjs.loadCollectionConfigs();
11191
11397
  const codeMatch = codeCollections2.find((c) => c.name === collectionId);
11192
11398
  if (codeMatch && codeMatch.schema?.properties) {
11193
11399
  console.log(`[getCollectionFields] DB doc type has no properties \u2014 using code collection schema`);
@@ -11219,7 +11425,7 @@ async function getCollectionFields(db, collectionId) {
11219
11425
  }
11220
11426
  }
11221
11427
  console.log(`[getCollectionFields] Not in database, checking code collections`);
11222
- const codeCollections = await chunkLLWLHFTD_cjs.loadCollectionConfigs();
11428
+ const codeCollections = await chunkWIV3R2MJ_cjs.loadCollectionConfigs();
11223
11429
  console.log(`[getCollectionFields] Found ${codeCollections.length} code collections`);
11224
11430
  const codeCollection = codeCollections.find((c) => c.name === collectionId);
11225
11431
  if (codeCollection && codeCollection.schema) {
@@ -11273,7 +11479,7 @@ async function getCollection(db, collectionId) {
11273
11479
  };
11274
11480
  }
11275
11481
  console.log(`[getCollection] Not in database, checking code collections`);
11276
- const codeCollections = await chunkLLWLHFTD_cjs.loadCollectionConfigs();
11482
+ const codeCollections = await chunkWIV3R2MJ_cjs.loadCollectionConfigs();
11277
11483
  const codeCollection = codeCollections.find((c) => c.name === collectionId);
11278
11484
  if (codeCollection) {
11279
11485
  console.log(`[getCollection] Found code collection: ${collectionId}`);
@@ -11292,7 +11498,7 @@ async function getCollection(db, collectionId) {
11292
11498
  }
11293
11499
  async function getDocBackingType(db, collectionName) {
11294
11500
  if (!collectionName) return null;
11295
- const dt = await new chunkBYLQOBO6_cjs.DocumentTypeRegistry(db).findById(collectionName);
11501
+ const dt = await new chunkL3KHLEHL_cjs.DocumentTypeRegistry(db).findById(collectionName);
11296
11502
  return dt && dt.isActive ? dt : null;
11297
11503
  }
11298
11504
  async function getCollectionByName(db, name) {
@@ -11309,7 +11515,7 @@ async function getCollectionByName(db, name) {
11309
11515
  };
11310
11516
  }
11311
11517
  console.log(`[getCollectionByName] Not in database, checking code collections`);
11312
- const codeCollections = await chunkLLWLHFTD_cjs.loadCollectionConfigs();
11518
+ const codeCollections = await chunkWIV3R2MJ_cjs.loadCollectionConfigs();
11313
11519
  const codeCollection = codeCollections.find((c) => c.name === name);
11314
11520
  if (codeCollection) {
11315
11521
  console.log(`[getCollectionByName] Found code collection: ${name}`);
@@ -11325,7 +11531,7 @@ async function getCollectionByName(db, name) {
11325
11531
  return null;
11326
11532
  }
11327
11533
  async function loadContentEditorFlags(db) {
11328
- const flags = { workflowEnabled: await chunkBYLQOBO6_cjs.isPluginActive(db, "workflow") };
11534
+ const flags = { workflowEnabled: await chunkL3KHLEHL_cjs.isPluginActive(db, "workflow") };
11329
11535
  const editors = [
11330
11536
  ["tinymce-plugin", "tinymce"],
11331
11537
  ["quill-editor", "quill"],
@@ -11333,10 +11539,10 @@ async function loadContentEditorFlags(db) {
11333
11539
  ["lexical-editor", "lexical"]
11334
11540
  ];
11335
11541
  for (const [plugin, key] of editors) {
11336
- const enabled = await chunkBYLQOBO6_cjs.isPluginActive(db, plugin);
11542
+ const enabled = await chunkL3KHLEHL_cjs.isPluginActive(db, plugin);
11337
11543
  flags[`${key}Enabled`] = enabled;
11338
11544
  if (enabled) {
11339
- const ps = new chunkLLWLHFTD_cjs.PluginService(db);
11545
+ const ps = new chunkWIV3R2MJ_cjs.PluginService(db);
11340
11546
  const p = await ps.getPlugin(plugin);
11341
11547
  flags[`${key}Settings`] = p?.settings;
11342
11548
  }
@@ -11344,7 +11550,7 @@ async function loadContentEditorFlags(db) {
11344
11550
  return flags;
11345
11551
  }
11346
11552
  function makeDocService(db, docType, tenantId) {
11347
- return new chunk2CB4KY7I_cjs.DocumentsService(db, {
11553
+ return new chunkW36OZTJ5_cjs.DocumentsService(db, {
11348
11554
  queryableFields: docType.queryableFields ?? [],
11349
11555
  typeSchemaVersion: docType.schemaVersion ?? 1,
11350
11556
  maxVersionsPerRoot: docType.settings?.maxVersionsPerRoot ?? 50,
@@ -11372,9 +11578,9 @@ adminContentRoutes.get("/", async (c) => {
11372
11578
  const offset = (page - 1) * limit;
11373
11579
  const collectionsStmt = db.prepare("SELECT id, name, display_name FROM document_types WHERE is_active = 1 ORDER BY display_name");
11374
11580
  const { results: collectionsResults } = await collectionsStmt.all();
11375
- const codeCollections = await chunkLLWLHFTD_cjs.loadCollectionConfigs();
11581
+ const codeCollections = await chunkWIV3R2MJ_cjs.loadCollectionConfigs();
11376
11582
  const codeCollectionMap = new Map(codeCollections.map((c2) => [c2.name, c2]));
11377
- const docTypeRegistry = new chunkBYLQOBO6_cjs.DocumentTypeRegistry(db);
11583
+ const docTypeRegistry = new chunkL3KHLEHL_cjs.DocumentTypeRegistry(db);
11378
11584
  const docTypes = (await docTypeRegistry.findAll()).filter((dt) => !dt.settings?.internal && !dt.isAuth);
11379
11585
  const visibleTypeIds = new Set(docTypes.map((dt) => dt.id));
11380
11586
  const allCollections = [
@@ -11386,7 +11592,7 @@ adminContentRoutes.get("/", async (c) => {
11386
11592
  ...allCollections.map((c2) => ({ name: c2.name, displayName: c2.displayName })),
11387
11593
  ...docTypes.filter((dt) => !collectionNames.has(dt.id)).map((dt) => ({ name: `doc:${dt.id}`, displayName: dt.displayName }))
11388
11594
  ];
11389
- const newContentCollections = await chunkLLWLHFTD_cjs.getVisibleCollections(db);
11595
+ const newContentCollections = await chunkWIV3R2MJ_cjs.getVisibleCollections(db);
11390
11596
  const docBackedCollection = !modelName.startsWith("doc:") && modelName !== "all" ? docTypes.find((dt) => dt.id === modelName) : void 0;
11391
11597
  const isDocModel = modelName.startsWith("doc:") || !!docBackedCollection;
11392
11598
  if (isDocModel) {
@@ -11663,9 +11869,9 @@ adminContentRoutes.get("/new", async (c) => {
11663
11869
  const collectionsStmt = db2.prepare("SELECT id, name, display_name, description FROM document_types WHERE is_active = 1 ORDER BY display_name");
11664
11870
  const { results } = await collectionsStmt.all();
11665
11871
  const visibleTypeIds = new Set(
11666
- (await new chunkBYLQOBO6_cjs.DocumentTypeRegistry(db2).findAll()).filter((dt) => !dt.settings?.internal && !dt.isAuth).map((dt) => dt.id)
11872
+ (await new chunkL3KHLEHL_cjs.DocumentTypeRegistry(db2).findAll()).filter((dt) => !dt.settings?.internal && !dt.isAuth).map((dt) => dt.id)
11667
11873
  );
11668
- const codeCollections = await chunkLLWLHFTD_cjs.loadCollectionConfigs();
11874
+ const codeCollections = await chunkWIV3R2MJ_cjs.loadCollectionConfigs();
11669
11875
  const dbCollectionNames = new Set((results || []).map((r) => r.name));
11670
11876
  const allCollections = [
11671
11877
  ...codeCollections.filter((c2) => !dbCollectionNames.has(c2.name)).map((c2) => ({
@@ -11731,32 +11937,32 @@ adminContentRoutes.get("/new", async (c) => {
11731
11937
  return c.html(renderContentFormPage(formData2));
11732
11938
  }
11733
11939
  const fields = await getCollectionFields(db, collection.id);
11734
- const workflowEnabled = await chunkBYLQOBO6_cjs.isPluginActive(db, "workflow");
11735
- const tinymceEnabled = await chunkBYLQOBO6_cjs.isPluginActive(db, "tinymce-plugin");
11940
+ const workflowEnabled = await chunkL3KHLEHL_cjs.isPluginActive(db, "workflow");
11941
+ const tinymceEnabled = await chunkL3KHLEHL_cjs.isPluginActive(db, "tinymce-plugin");
11736
11942
  let tinymceSettings;
11737
11943
  if (tinymceEnabled) {
11738
- const pluginService = new chunkLLWLHFTD_cjs.PluginService(db);
11944
+ const pluginService = new chunkWIV3R2MJ_cjs.PluginService(db);
11739
11945
  const tinymcePlugin2 = await pluginService.getPlugin("tinymce-plugin");
11740
11946
  tinymceSettings = tinymcePlugin2?.settings;
11741
11947
  }
11742
- const quillEnabled = await chunkBYLQOBO6_cjs.isPluginActive(db, "quill-editor");
11948
+ const quillEnabled = await chunkL3KHLEHL_cjs.isPluginActive(db, "quill-editor");
11743
11949
  let quillSettings;
11744
11950
  if (quillEnabled) {
11745
- const pluginService = new chunkLLWLHFTD_cjs.PluginService(db);
11951
+ const pluginService = new chunkWIV3R2MJ_cjs.PluginService(db);
11746
11952
  const quillPlugin = await pluginService.getPlugin("quill-editor");
11747
11953
  quillSettings = quillPlugin?.settings;
11748
11954
  }
11749
- const mdxeditorEnabled = await chunkBYLQOBO6_cjs.isPluginActive(db, "easy-mdx");
11955
+ const mdxeditorEnabled = await chunkL3KHLEHL_cjs.isPluginActive(db, "easy-mdx");
11750
11956
  let mdxeditorSettings;
11751
11957
  if (mdxeditorEnabled) {
11752
- const pluginService = new chunkLLWLHFTD_cjs.PluginService(db);
11958
+ const pluginService = new chunkWIV3R2MJ_cjs.PluginService(db);
11753
11959
  const mdxeditorPlugin = await pluginService.getPlugin("easy-mdx");
11754
11960
  mdxeditorSettings = mdxeditorPlugin?.settings;
11755
11961
  }
11756
- const lexicalEnabled = await chunkBYLQOBO6_cjs.isPluginActive(db, "lexical-editor");
11962
+ const lexicalEnabled = await chunkL3KHLEHL_cjs.isPluginActive(db, "lexical-editor");
11757
11963
  let lexicalSettings;
11758
11964
  if (lexicalEnabled) {
11759
- const pluginService = new chunkLLWLHFTD_cjs.PluginService(db);
11965
+ const pluginService = new chunkWIV3R2MJ_cjs.PluginService(db);
11760
11966
  const lexicalPlugin = await pluginService.getPlugin("lexical-editor");
11761
11967
  lexicalSettings = lexicalPlugin?.settings;
11762
11968
  }
@@ -11884,32 +12090,32 @@ adminContentRoutes.get("/:id/edit", async (c) => {
11884
12090
  };
11885
12091
  const fields = await getCollectionFields(db, content.collection_id);
11886
12092
  const contentData = content.data ? JSON.parse(content.data) : {};
11887
- const workflowEnabled = await chunkBYLQOBO6_cjs.isPluginActive(db, "workflow");
11888
- const tinymceEnabled = await chunkBYLQOBO6_cjs.isPluginActive(db, "tinymce-plugin");
12093
+ const workflowEnabled = await chunkL3KHLEHL_cjs.isPluginActive(db, "workflow");
12094
+ const tinymceEnabled = await chunkL3KHLEHL_cjs.isPluginActive(db, "tinymce-plugin");
11889
12095
  let tinymceSettings;
11890
12096
  if (tinymceEnabled) {
11891
- const pluginService = new chunkLLWLHFTD_cjs.PluginService(db);
12097
+ const pluginService = new chunkWIV3R2MJ_cjs.PluginService(db);
11892
12098
  const tinymcePlugin2 = await pluginService.getPlugin("tinymce-plugin");
11893
12099
  tinymceSettings = tinymcePlugin2?.settings;
11894
12100
  }
11895
- const quillEnabled = await chunkBYLQOBO6_cjs.isPluginActive(db, "quill-editor");
12101
+ const quillEnabled = await chunkL3KHLEHL_cjs.isPluginActive(db, "quill-editor");
11896
12102
  let quillSettings;
11897
12103
  if (quillEnabled) {
11898
- const pluginService = new chunkLLWLHFTD_cjs.PluginService(db);
12104
+ const pluginService = new chunkWIV3R2MJ_cjs.PluginService(db);
11899
12105
  const quillPlugin = await pluginService.getPlugin("quill-editor");
11900
12106
  quillSettings = quillPlugin?.settings;
11901
12107
  }
11902
- const mdxeditorEnabled = await chunkBYLQOBO6_cjs.isPluginActive(db, "easy-mdx");
12108
+ const mdxeditorEnabled = await chunkL3KHLEHL_cjs.isPluginActive(db, "easy-mdx");
11903
12109
  let mdxeditorSettings;
11904
12110
  if (mdxeditorEnabled) {
11905
- const pluginService = new chunkLLWLHFTD_cjs.PluginService(db);
12111
+ const pluginService = new chunkWIV3R2MJ_cjs.PluginService(db);
11906
12112
  const mdxeditorPlugin = await pluginService.getPlugin("easy-mdx");
11907
12113
  mdxeditorSettings = mdxeditorPlugin?.settings;
11908
12114
  }
11909
- const lexicalEnabled = await chunkBYLQOBO6_cjs.isPluginActive(db, "lexical-editor");
12115
+ const lexicalEnabled = await chunkL3KHLEHL_cjs.isPluginActive(db, "lexical-editor");
11910
12116
  let lexicalSettings;
11911
12117
  if (lexicalEnabled) {
11912
- const pluginService = new chunkLLWLHFTD_cjs.PluginService(db);
12118
+ const pluginService = new chunkWIV3R2MJ_cjs.PluginService(db);
11913
12119
  const lexicalPlugin = await pluginService.getPlugin("lexical-editor");
11914
12120
  lexicalSettings = lexicalPlugin?.settings;
11915
12121
  }
@@ -12282,7 +12488,7 @@ adminContentRoutes.put("/:id", async (c) => {
12282
12488
  `);
12283
12489
  }
12284
12490
  });
12285
- adminContentRoutes.post("/preview", chunkBYLQOBO6_cjs.requireRole(["admin", "editor", "author"]), async (c) => {
12491
+ adminContentRoutes.post("/preview", chunkL3KHLEHL_cjs.requireRole(["admin", "editor", "author"]), async (c) => {
12286
12492
  try {
12287
12493
  const formData = await c.req.formData();
12288
12494
  const collectionId = formData.get("collection_id");
@@ -12601,7 +12807,7 @@ adminContentRoutes.delete("/:id", async (c) => {
12601
12807
  return c.json({ success: false, error: "Failed to delete content" }, 500);
12602
12808
  }
12603
12809
  });
12604
- adminContentRoutes.get("/:id/version/:version/preview", chunkBYLQOBO6_cjs.requireRole(["admin", "editor", "author"]), async (c) => {
12810
+ adminContentRoutes.get("/:id/version/:version/preview", chunkL3KHLEHL_cjs.requireRole(["admin", "editor", "author"]), async (c) => {
12605
12811
  try {
12606
12812
  const id = c.req.param("id");
12607
12813
  const version = parseInt(c.req.param("version") || "0");
@@ -12697,9 +12903,9 @@ function parseDocFormData(formData, queryableFields = []) {
12697
12903
  return { title, slug, data };
12698
12904
  }
12699
12905
  async function getDocService(db, typeId, tenantId) {
12700
- const registry = new chunkBYLQOBO6_cjs.DocumentTypeRegistry(db);
12906
+ const registry = new chunkL3KHLEHL_cjs.DocumentTypeRegistry(db);
12701
12907
  const docType = await registry.findById(typeId);
12702
- const svc = new chunk2CB4KY7I_cjs.DocumentsService(db, {
12908
+ const svc = new chunkW36OZTJ5_cjs.DocumentsService(db, {
12703
12909
  queryableFields: docType?.queryableFields ?? [],
12704
12910
  typeSchemaVersion: docType?.schemaVersion ?? 1,
12705
12911
  maxVersionsPerRoot: docType?.settings?.maxVersionsPerRoot ?? 50,
@@ -12710,7 +12916,7 @@ async function getDocService(db, typeId, tenantId) {
12710
12916
  }
12711
12917
  adminContentRoutes.get("/documents/:typeId/new", async (c) => {
12712
12918
  const { typeId } = c.req.param();
12713
- const registry = new chunkBYLQOBO6_cjs.DocumentTypeRegistry(c.env.DB);
12919
+ const registry = new chunkL3KHLEHL_cjs.DocumentTypeRegistry(c.env.DB);
12714
12920
  const docType = await registry.findById(typeId);
12715
12921
  if (!docType) return c.html("<p>Unknown document type.</p>", 404);
12716
12922
  return c.html(chunkN32OWET6_cjs.renderDocumentFormPage({ docType, isEdit: false, user: userCtx(c) }));
@@ -12735,7 +12941,7 @@ adminContentRoutes.post("/documents/:typeId/new", async (c) => {
12735
12941
  }), user?.userId);
12736
12942
  return c.redirect(`/admin/content/documents/${typeId}/${doc.rootId}/edit?message=Created+successfully`);
12737
12943
  } catch (err) {
12738
- const registry = new chunkBYLQOBO6_cjs.DocumentTypeRegistry(c.env.DB);
12944
+ const registry = new chunkL3KHLEHL_cjs.DocumentTypeRegistry(c.env.DB);
12739
12945
  const docType = await registry.findById(typeId);
12740
12946
  if (!docType) return c.html("<p>Unknown document type.</p>", 404);
12741
12947
  return c.html(chunkN32OWET6_cjs.renderDocumentFormPage({ docType, isEdit: false, user: userCtx(c), message: err?.message ?? "Failed to create", messageType: "error" }));
@@ -12745,7 +12951,7 @@ adminContentRoutes.get("/documents/:typeId/:rootId/edit", async (c) => {
12745
12951
  const { typeId, rootId } = c.req.param();
12746
12952
  const db = c.env.DB;
12747
12953
  const message = c.req.query("message");
12748
- const registry = new chunkBYLQOBO6_cjs.DocumentTypeRegistry(db);
12954
+ const registry = new chunkL3KHLEHL_cjs.DocumentTypeRegistry(db);
12749
12955
  const docType = await registry.findById(typeId);
12750
12956
  if (!docType) return c.html("<p>Unknown document type.</p>", 404);
12751
12957
  const tenantId = reqTenant(c);
@@ -12858,7 +13064,7 @@ adminContentRoutes.get("/documents/:typeId/:rootId/versions", async (c) => {
12858
13064
  const { typeId, rootId } = c.req.param();
12859
13065
  const db = c.env.DB;
12860
13066
  const { renderVersionHistoryFragment } = await import('./admin-documents-form.template-LSZKGA5J.cjs');
12861
- const registry = new chunkBYLQOBO6_cjs.DocumentTypeRegistry(db);
13067
+ const registry = new chunkL3KHLEHL_cjs.DocumentTypeRegistry(db);
12862
13068
  const docType = await registry.findById(typeId);
12863
13069
  if (!docType) return c.html("<div>Unknown type.</div>", 404);
12864
13070
  const result = await db.prepare(
@@ -14790,7 +14996,7 @@ var TenantService = class {
14790
14996
  SET name = ?, domain = ?, status = ?, notes = ?, updated_at = ?
14791
14997
  WHERE slug = ?
14792
14998
  `).bind(name, domain, status, notes, now, slug).run();
14793
- chunkLLWLHFTD_cjs.invalidateTenantCache();
14999
+ chunkWIV3R2MJ_cjs.invalidateTenantCache();
14794
15000
  const updated = await this.getTenantBySlug(slug);
14795
15001
  if (!updated) throw new Error("Tenant not found");
14796
15002
  return updated;
@@ -14808,7 +15014,7 @@ var TenantService = class {
14808
15014
  throw new Error(`Tenant '${slug}' still owns ${docCount} document(s). Delete or migrate its content first.`);
14809
15015
  }
14810
15016
  await this.db.prepare(`DELETE FROM auth_tenant WHERE slug = ?`).bind(slug).run();
14811
- chunkLLWLHFTD_cjs.invalidateTenantCache();
15017
+ chunkWIV3R2MJ_cjs.invalidateTenantCache();
14812
15018
  }
14813
15019
  // ─── Membership (auth_tenant_member) ───────────────────────────────────────
14814
15020
  // Tenant resolution and the admin switcher are gated on membership: an authed user may only
@@ -15052,7 +15258,7 @@ var TenantService = class {
15052
15258
  INSERT INTO auth_tenant (id, name, slug, status, domain, notes, metadata, created_at, updated_at)
15053
15259
  VALUES (?, ?, ?, 'active', ?, ?, '{}', ?, ?)
15054
15260
  `).bind(id, input.name, input.slug, input.domain, input.notes, now, now).run();
15055
- chunkLLWLHFTD_cjs.invalidateTenantCache();
15261
+ chunkWIV3R2MJ_cjs.invalidateTenantCache();
15056
15262
  const created = await this.getTenantBySlug(input.slug);
15057
15263
  if (!created) throw new Error("Failed to create tenant");
15058
15264
  return created;
@@ -15076,14 +15282,14 @@ function mapRowToTenant(row) {
15076
15282
 
15077
15283
  // src/routes/admin-users.ts
15078
15284
  var userRoutes = new hono.Hono();
15079
- userRoutes.use("*", chunkBYLQOBO6_cjs.requireAuth());
15080
- userRoutes.use("/users/*", chunkBYLQOBO6_cjs.requireRole(["admin"]));
15081
- userRoutes.use("/users", chunkBYLQOBO6_cjs.requireRole(["admin"]));
15082
- userRoutes.use("/invite-user", chunkBYLQOBO6_cjs.requireRole(["admin"]));
15083
- userRoutes.use("/resend-invitation/*", chunkBYLQOBO6_cjs.requireRole(["admin"]));
15084
- userRoutes.use("/cancel-invitation/*", chunkBYLQOBO6_cjs.requireRole(["admin"]));
15085
- userRoutes.use("/activity-logs", chunkBYLQOBO6_cjs.requireRole(["admin"]));
15086
- userRoutes.use("/activity-logs/*", chunkBYLQOBO6_cjs.requireRole(["admin"]));
15285
+ userRoutes.use("*", chunkL3KHLEHL_cjs.requireAuth());
15286
+ userRoutes.use("/users/*", chunkL3KHLEHL_cjs.requireRole(["admin"]));
15287
+ userRoutes.use("/users", chunkL3KHLEHL_cjs.requireRole(["admin"]));
15288
+ userRoutes.use("/invite-user", chunkL3KHLEHL_cjs.requireRole(["admin"]));
15289
+ userRoutes.use("/resend-invitation/*", chunkL3KHLEHL_cjs.requireRole(["admin"]));
15290
+ userRoutes.use("/cancel-invitation/*", chunkL3KHLEHL_cjs.requireRole(["admin"]));
15291
+ userRoutes.use("/activity-logs", chunkL3KHLEHL_cjs.requireRole(["admin"]));
15292
+ userRoutes.use("/activity-logs/*", chunkL3KHLEHL_cjs.requireRole(["admin"]));
15087
15293
  userRoutes.get("/", (c) => {
15088
15294
  return c.redirect("/admin/dashboard");
15089
15295
  });
@@ -15250,7 +15456,7 @@ userRoutes.put("/profile", async (c) => {
15250
15456
  }
15251
15457
  await saveCustomData(db, user.userId, sanitized);
15252
15458
  }
15253
- await chunkBYLQOBO6_cjs.logActivity(
15459
+ await chunkL3KHLEHL_cjs.logActivity(
15254
15460
  db,
15255
15461
  user.userId,
15256
15462
  "profile.update",
@@ -15313,7 +15519,7 @@ userRoutes.post("/profile/avatar", async (c) => {
15313
15519
  SELECT first_name, last_name FROM auth_user WHERE id = ?
15314
15520
  `);
15315
15521
  const userData = await userStmt.bind(user.userId).first();
15316
- await chunkBYLQOBO6_cjs.logActivity(
15522
+ await chunkL3KHLEHL_cjs.logActivity(
15317
15523
  db,
15318
15524
  user.userId,
15319
15525
  "profile.avatar_update",
@@ -15384,7 +15590,7 @@ userRoutes.post("/profile/password", async (c) => {
15384
15590
  dismissible: true
15385
15591
  }));
15386
15592
  }
15387
- const validPassword = await chunkBYLQOBO6_cjs.AuthManager.verifyPassword(currentPassword, userData.password_hash);
15593
+ const validPassword = await chunkL3KHLEHL_cjs.AuthManager.verifyPassword(currentPassword, userData.password_hash);
15388
15594
  if (!validPassword) {
15389
15595
  return c.html(chunkN32OWET6_cjs.renderAlert({
15390
15596
  type: "error",
@@ -15392,7 +15598,7 @@ userRoutes.post("/profile/password", async (c) => {
15392
15598
  dismissible: true
15393
15599
  }));
15394
15600
  }
15395
- const newPasswordHash = await chunkBYLQOBO6_cjs.AuthManager.hashPassword(newPassword);
15601
+ const newPasswordHash = await chunkL3KHLEHL_cjs.AuthManager.hashPassword(newPassword);
15396
15602
  const historyStmt = db.prepare(`
15397
15603
  INSERT INTO auth_password_history (id, user_id, password_hash, created_at)
15398
15604
  VALUES (?, ?, ?, ?)
@@ -15408,7 +15614,7 @@ userRoutes.post("/profile/password", async (c) => {
15408
15614
  WHERE id = ?
15409
15615
  `);
15410
15616
  await updateStmt.bind(newPasswordHash, Date.now(), user.userId).run();
15411
- await chunkBYLQOBO6_cjs.logActivity(
15617
+ await chunkL3KHLEHL_cjs.logActivity(
15412
15618
  db,
15413
15619
  user.userId,
15414
15620
  "profile.password_change",
@@ -15475,7 +15681,7 @@ userRoutes.get("/users", async (c) => {
15475
15681
  `);
15476
15682
  const countResult = await countStmt.bind(...params).first();
15477
15683
  const totalUsers = countResult?.total || 0;
15478
- await chunkBYLQOBO6_cjs.logActivity(
15684
+ await chunkL3KHLEHL_cjs.logActivity(
15479
15685
  db,
15480
15686
  user.userId,
15481
15687
  "users.list_view",
@@ -15656,7 +15862,7 @@ userRoutes.post("/users/new", async (c) => {
15656
15862
  dismissible: true
15657
15863
  }));
15658
15864
  }
15659
- const passwordHash = await chunkBYLQOBO6_cjs.AuthManager.hashPassword(password);
15865
+ const passwordHash = await chunkL3KHLEHL_cjs.AuthManager.hashPassword(password);
15660
15866
  const userId = crypto.randomUUID();
15661
15867
  const createStmt = db.prepare(`
15662
15868
  INSERT INTO auth_user (
@@ -15681,7 +15887,7 @@ userRoutes.post("/users/new", async (c) => {
15681
15887
  if (sanitizedRegistrationCustom !== null && Object.keys(sanitizedRegistrationCustom).length > 0) {
15682
15888
  await writeProfileData(db, userId, { custom: sanitizedRegistrationCustom }, user.userId);
15683
15889
  }
15684
- await chunkBYLQOBO6_cjs.logActivity(
15890
+ await chunkL3KHLEHL_cjs.logActivity(
15685
15891
  db,
15686
15892
  user.userId,
15687
15893
  "user!.create",
@@ -15720,7 +15926,7 @@ userRoutes.get("/users/:id", async (c) => {
15720
15926
  if (!userRecord) {
15721
15927
  return c.json({ error: "User not found" }, 404);
15722
15928
  }
15723
- await chunkBYLQOBO6_cjs.logActivity(
15929
+ await chunkL3KHLEHL_cjs.logActivity(
15724
15930
  db,
15725
15931
  user.userId,
15726
15932
  "user!.view",
@@ -15934,7 +16140,7 @@ userRoutes.put("/users/:id", async (c) => {
15934
16140
  userId
15935
16141
  ).run();
15936
16142
  if (newPassword) {
15937
- const passwordHash = await chunkBYLQOBO6_cjs.AuthManager.hashPassword(newPassword);
16143
+ const passwordHash = await chunkL3KHLEHL_cjs.AuthManager.hashPassword(newPassword);
15938
16144
  const updatePasswordStmt = db.prepare(`
15939
16145
  UPDATE auth_user SET password_hash = ?, updated_at = ? WHERE id = ?
15940
16146
  `);
@@ -15947,7 +16153,7 @@ userRoutes.put("/users/:id", async (c) => {
15947
16153
  ...sanitizedCustom !== null ? { custom: sanitizedCustom } : {}
15948
16154
  }, user.userId);
15949
16155
  }
15950
- await chunkBYLQOBO6_cjs.logActivity(
16156
+ await chunkL3KHLEHL_cjs.logActivity(
15951
16157
  db,
15952
16158
  user.userId,
15953
16159
  "user.update",
@@ -15993,7 +16199,7 @@ userRoutes.post("/users/:id/toggle", async (c) => {
15993
16199
  UPDATE auth_user SET is_active = ?, updated_at = ? WHERE id = ?
15994
16200
  `);
15995
16201
  await toggleStmt.bind(active ? 1 : 0, Date.now(), userId).run();
15996
- await chunkBYLQOBO6_cjs.logActivity(
16202
+ await chunkL3KHLEHL_cjs.logActivity(
15997
16203
  db,
15998
16204
  user.userId,
15999
16205
  active ? "user.activate" : "user.deactivate",
@@ -16034,7 +16240,7 @@ userRoutes.delete("/users/:id", async (c) => {
16034
16240
  DELETE FROM auth_user WHERE id = ?
16035
16241
  `);
16036
16242
  await deleteStmt.bind(userId).run();
16037
- await chunkBYLQOBO6_cjs.logActivity(
16243
+ await chunkL3KHLEHL_cjs.logActivity(
16038
16244
  db,
16039
16245
  user.userId,
16040
16246
  "user!.hard_delete",
@@ -16053,7 +16259,7 @@ userRoutes.delete("/users/:id", async (c) => {
16053
16259
  UPDATE auth_user SET is_active = 0, updated_at = ? WHERE id = ?
16054
16260
  `);
16055
16261
  await deleteStmt.bind(Date.now(), userId).run();
16056
- await chunkBYLQOBO6_cjs.logActivity(
16262
+ await chunkL3KHLEHL_cjs.logActivity(
16057
16263
  db,
16058
16264
  user.userId,
16059
16265
  "user!.soft_delete",
@@ -16119,7 +16325,7 @@ userRoutes.post("/invite-user", async (c) => {
16119
16325
  Date.now(),
16120
16326
  Date.now()
16121
16327
  ).run();
16122
- await chunkBYLQOBO6_cjs.logActivity(
16328
+ await chunkL3KHLEHL_cjs.logActivity(
16123
16329
  db,
16124
16330
  user.userId,
16125
16331
  "user!.invite_sent",
@@ -16176,7 +16382,7 @@ userRoutes.post("/resend-invitation/:id", async (c) => {
16176
16382
  Date.now(),
16177
16383
  userId
16178
16384
  ).run();
16179
- await chunkBYLQOBO6_cjs.logActivity(
16385
+ await chunkL3KHLEHL_cjs.logActivity(
16180
16386
  db,
16181
16387
  user.userId,
16182
16388
  "user!.invitation_resent",
@@ -16212,7 +16418,7 @@ userRoutes.delete("/cancel-invitation/:id", async (c) => {
16212
16418
  }
16213
16419
  const deleteStmt = db.prepare(`DELETE FROM auth_user WHERE id = ?`);
16214
16420
  await deleteStmt.bind(userId).run();
16215
- await chunkBYLQOBO6_cjs.logActivity(
16421
+ await chunkL3KHLEHL_cjs.logActivity(
16216
16422
  db,
16217
16423
  user.userId,
16218
16424
  "user!.invitation_cancelled",
@@ -17593,7 +17799,7 @@ var fileValidationSchema2 = zod.z.object({
17593
17799
  // 50MB max
17594
17800
  });
17595
17801
  var adminMediaRoutes = new hono.Hono();
17596
- adminMediaRoutes.use("*", chunkBYLQOBO6_cjs.requireAuth());
17802
+ adminMediaRoutes.use("*", chunkL3KHLEHL_cjs.requireAuth());
17597
17803
  adminMediaRoutes.get("/", async (c) => {
17598
17804
  try {
17599
17805
  const user = c.get("user");
@@ -17635,7 +17841,7 @@ adminMediaRoutes.get("/selector", async (c) => {
17635
17841
  const { searchParams } = new URL(c.req.url);
17636
17842
  const search = searchParams.get("search") || "";
17637
17843
  const db = c.env.DB;
17638
- const pluginService = new chunkLLWLHFTD_cjs.PluginService(db);
17844
+ const pluginService = new chunkWIV3R2MJ_cjs.PluginService(db);
17639
17845
  const mediaPlugin = await pluginService.getPlugin("core-media");
17640
17846
  if (!mediaPlugin || mediaPlugin.status !== "active") {
17641
17847
  return c.html(html.html`
@@ -18009,7 +18215,7 @@ adminMediaRoutes.put("/:id", async (c) => {
18009
18215
  `);
18010
18216
  }
18011
18217
  });
18012
- adminMediaRoutes.delete("/cleanup", chunkBYLQOBO6_cjs.requireRole("admin"), async (c) => {
18218
+ adminMediaRoutes.delete("/cleanup", chunkL3KHLEHL_cjs.requireRole("admin"), async (c) => {
18013
18219
  try {
18014
18220
  const db = c.env.DB;
18015
18221
  const allMediaStmt = db.prepare("SELECT id, r2_key, filename FROM media WHERE deleted_at IS NULL");
@@ -20442,8 +20648,8 @@ defineUserProfile({
20442
20648
 
20443
20649
  // src/routes/admin-plugins.ts
20444
20650
  var adminPluginRoutes = new hono.Hono();
20445
- adminPluginRoutes.use("*", chunkBYLQOBO6_cjs.requireAuth());
20446
- var AVAILABLE_PLUGINS = Object.values(chunkLLWLHFTD_cjs.PLUGIN_REGISTRY).map((p) => ({
20651
+ adminPluginRoutes.use("*", chunkL3KHLEHL_cjs.requireAuth());
20652
+ var AVAILABLE_PLUGINS = Object.values(chunkWIV3R2MJ_cjs.PLUGIN_REGISTRY).map((p) => ({
20447
20653
  id: p.id,
20448
20654
  name: p.codeName,
20449
20655
  display_name: p.displayName,
@@ -20463,7 +20669,7 @@ adminPluginRoutes.get("/", async (c) => {
20463
20669
  if (user?.role !== "admin") {
20464
20670
  return c.text("Access denied", 403);
20465
20671
  }
20466
- const pluginService = new chunkLLWLHFTD_cjs.PluginService(db);
20672
+ const pluginService = new chunkWIV3R2MJ_cjs.PluginService(db);
20467
20673
  let installedPlugins = [];
20468
20674
  let stats = { total: 0, active: 0, inactive: 0, errors: 0, uninstalled: 0 };
20469
20675
  try {
@@ -20535,10 +20741,10 @@ adminPluginRoutes.get("/:id", async (c) => {
20535
20741
  if (user?.role !== "admin") {
20536
20742
  return c.redirect("/admin/plugins");
20537
20743
  }
20538
- const pluginService = new chunkLLWLHFTD_cjs.PluginService(db);
20744
+ const pluginService = new chunkWIV3R2MJ_cjs.PluginService(db);
20539
20745
  let plugin = await pluginService.getPlugin(pluginId);
20540
20746
  if (!plugin) {
20541
- const def = chunkNYLWNR6T_cjs.getPluginDefinition(pluginId);
20747
+ const def = chunk4YRYGDCQ_cjs.getPluginDefinition(pluginId);
20542
20748
  if (!def) return c.text("Plugin not found", 404);
20543
20749
  plugin = await pluginService.ensurePlugin(pluginId, {
20544
20750
  displayName: def.displayName ?? pluginId,
@@ -20629,14 +20835,14 @@ adminPluginRoutes.get("/:id/configure", async (c) => {
20629
20835
  const user = c.get("user");
20630
20836
  const pluginId = c.req.param("id");
20631
20837
  if (user?.role !== "admin") return c.redirect("/admin/plugins");
20632
- const def = chunkNYLWNR6T_cjs.getPluginDefinition(pluginId);
20838
+ const def = chunk4YRYGDCQ_cjs.getPluginDefinition(pluginId);
20633
20839
  if (!def?.configSchema) return c.text("No schema-driven settings for this plugin", 404);
20634
20840
  const db = c.env.DB;
20635
- const pluginService = new chunkLLWLHFTD_cjs.PluginService(db);
20841
+ const pluginService = new chunkWIV3R2MJ_cjs.PluginService(db);
20636
20842
  const plugin = await pluginService.getPlugin(pluginId);
20637
20843
  const stored = plugin?.settings ?? {};
20638
- const values = chunkNYLWNR6T_cjs.applySchemaDefaults(def.configSchema, stored);
20639
- const fieldsHtml = chunkNYLWNR6T_cjs.renderSchemaFields(def.configSchema, values);
20844
+ const values = chunk4YRYGDCQ_cjs.applySchemaDefaults(def.configSchema, stored);
20845
+ const fieldsHtml = chunk4YRYGDCQ_cjs.renderSchemaFields(def.configSchema, values);
20640
20846
  const displayName = plugin?.display_name ?? def.displayName ?? def.id;
20641
20847
  return c.html(`<!DOCTYPE html>
20642
20848
  <html lang="en"><head>
@@ -20663,12 +20869,12 @@ adminPluginRoutes.post("/:id/configure", async (c) => {
20663
20869
  const user = c.get("user");
20664
20870
  const pluginId = c.req.param("id");
20665
20871
  if (user?.role !== "admin") return c.json({ error: "Access denied" }, 403);
20666
- const def = chunkNYLWNR6T_cjs.getPluginDefinition(pluginId);
20872
+ const def = chunk4YRYGDCQ_cjs.getPluginDefinition(pluginId);
20667
20873
  if (!def?.configSchema) return c.text("No schema-driven settings for this plugin", 404);
20668
20874
  const form = await c.req.formData();
20669
- const parsed = chunkNYLWNR6T_cjs.parseFormDataToSettings(def.configSchema, form);
20875
+ const parsed = chunk4YRYGDCQ_cjs.parseFormDataToSettings(def.configSchema, form);
20670
20876
  const db = c.env.DB;
20671
- const pluginService = new chunkLLWLHFTD_cjs.PluginService(db);
20877
+ const pluginService = new chunkWIV3R2MJ_cjs.PluginService(db);
20672
20878
  await pluginService.ensurePlugin(pluginId, {
20673
20879
  displayName: def.displayName ?? pluginId,
20674
20880
  version: def.version,
@@ -20690,7 +20896,7 @@ adminPluginRoutes.post("/:id/activate", async (c) => {
20690
20896
  if (user?.role !== "admin") {
20691
20897
  return c.json({ error: "Access denied" }, 403);
20692
20898
  }
20693
- const pluginService = new chunkLLWLHFTD_cjs.PluginService(db);
20899
+ const pluginService = new chunkWIV3R2MJ_cjs.PluginService(db);
20694
20900
  await pluginService.activatePlugin(pluginId);
20695
20901
  return c.json({ success: true });
20696
20902
  } catch (error) {
@@ -20707,7 +20913,7 @@ adminPluginRoutes.post("/:id/deactivate", async (c) => {
20707
20913
  if (user?.role !== "admin") {
20708
20914
  return c.json({ error: "Access denied" }, 403);
20709
20915
  }
20710
- const pluginService = new chunkLLWLHFTD_cjs.PluginService(db);
20916
+ const pluginService = new chunkWIV3R2MJ_cjs.PluginService(db);
20711
20917
  await pluginService.deactivatePlugin(pluginId);
20712
20918
  return c.json({ success: true });
20713
20919
  } catch (error) {
@@ -20724,8 +20930,8 @@ adminPluginRoutes.post("/install", async (c) => {
20724
20930
  return c.json({ error: "Access denied" }, 403);
20725
20931
  }
20726
20932
  const body = await c.req.json();
20727
- const pluginService = new chunkLLWLHFTD_cjs.PluginService(db);
20728
- const registryEntry = chunkLLWLHFTD_cjs.findPluginByCodeName(body.name) || chunkLLWLHFTD_cjs.PLUGIN_REGISTRY[body.name] || chunkLLWLHFTD_cjs.PLUGIN_REGISTRY[body.id];
20933
+ const pluginService = new chunkWIV3R2MJ_cjs.PluginService(db);
20934
+ const registryEntry = chunkWIV3R2MJ_cjs.findPluginByCodeName(body.name) || chunkWIV3R2MJ_cjs.PLUGIN_REGISTRY[body.name] || chunkWIV3R2MJ_cjs.PLUGIN_REGISTRY[body.id];
20729
20935
  if (!registryEntry) {
20730
20936
  return c.json({ error: "Plugin not found in registry" }, 404);
20731
20937
  }
@@ -20758,7 +20964,7 @@ adminPluginRoutes.post("/:id/uninstall", async (c) => {
20758
20964
  if (user?.role !== "admin") {
20759
20965
  return c.json({ error: "Access denied" }, 403);
20760
20966
  }
20761
- const pluginService = new chunkLLWLHFTD_cjs.PluginService(db);
20967
+ const pluginService = new chunkWIV3R2MJ_cjs.PluginService(db);
20762
20968
  await pluginService.uninstallPlugin(pluginId);
20763
20969
  return c.json({ success: true });
20764
20970
  } catch (error) {
@@ -20776,7 +20982,7 @@ adminPluginRoutes.post("/:id/settings", async (c) => {
20776
20982
  return c.json({ error: "Access denied" }, 403);
20777
20983
  }
20778
20984
  const settings = await c.req.json();
20779
- const pluginService = new chunkLLWLHFTD_cjs.PluginService(db);
20985
+ const pluginService = new chunkWIV3R2MJ_cjs.PluginService(db);
20780
20986
  await pluginService.updatePluginSettings(pluginId, settings);
20781
20987
  if (pluginId === "core-auth") {
20782
20988
  try {
@@ -21584,7 +21790,7 @@ function renderLogConfigPage(data) {
21584
21790
 
21585
21791
  // src/routes/admin-logs.ts
21586
21792
  var adminLogsRoutes = new hono.Hono();
21587
- adminLogsRoutes.use("*", chunkBYLQOBO6_cjs.requireAuth());
21793
+ adminLogsRoutes.use("*", chunkL3KHLEHL_cjs.requireAuth());
21588
21794
  adminLogsRoutes.get("/", async (c) => {
21589
21795
  try {
21590
21796
  const user = c.get("user");
@@ -22576,9 +22782,9 @@ function renderStorageUsage(databaseSizeBytes, mediaSizeBytes) {
22576
22782
  }
22577
22783
 
22578
22784
  // src/routes/admin-dashboard.ts
22579
- var VERSION = chunkXGH2FVVR_cjs.getCoreVersion();
22785
+ var VERSION = chunkSIPBHWMG_cjs.getCoreVersion();
22580
22786
  var router = new hono.Hono();
22581
- router.use("*", chunkBYLQOBO6_cjs.requireAuth());
22787
+ router.use("*", chunkL3KHLEHL_cjs.requireAuth());
22582
22788
  router.get("/", async (c) => {
22583
22789
  const user = c.get("user");
22584
22790
  try {
@@ -24543,7 +24749,7 @@ function renderCollectionFormPage(data) {
24543
24749
  // src/routes/admin-collections.ts
24544
24750
  chunkK623Q6WD_cjs.init_admin_layout_catalyst_template();
24545
24751
  var adminCollectionsRoutes = new hono.Hono();
24546
- adminCollectionsRoutes.use("*", chunkBYLQOBO6_cjs.requireAuth());
24752
+ adminCollectionsRoutes.use("*", chunkL3KHLEHL_cjs.requireAuth());
24547
24753
  adminCollectionsRoutes.get("/", async (c) => {
24548
24754
  try {
24549
24755
  const user = c.get("user");
@@ -24560,7 +24766,7 @@ adminCollectionsRoutes.get("/", async (c) => {
24560
24766
  results = queryResults.results ?? [];
24561
24767
  } catch (e) {
24562
24768
  }
24563
- const codeCollections = chunkLLWLHFTD_cjs.getCollectionRegistry().list();
24769
+ const codeCollections = chunkWIV3R2MJ_cjs.getCollectionRegistry().list();
24564
24770
  const codeCollectionsMap = new Map(
24565
24771
  codeCollections.map((cfg) => {
24566
24772
  const fieldCount = cfg.schema?.properties ? Object.keys(cfg.schema.properties).length : 0;
@@ -24574,7 +24780,7 @@ adminCollectionsRoutes.get("/", async (c) => {
24574
24780
  field_count: fieldCount,
24575
24781
  managed: cfg.managed !== false,
24576
24782
  source_type: "code",
24577
- internal: chunkLLWLHFTD_cjs.isCodeCollectionInternal(cfg),
24783
+ internal: chunkWIV3R2MJ_cjs.isCodeCollectionInternal(cfg),
24578
24784
  versioning: cfg.versioning === true
24579
24785
  }];
24580
24786
  })
@@ -24613,7 +24819,7 @@ adminCollectionsRoutes.get("/", async (c) => {
24613
24819
  field_count: fieldCount,
24614
24820
  managed: false,
24615
24821
  source_type: row.source === "code" || row.source === "system" || row.source === "plugin" ? "code" : "user",
24616
- internal: chunkLLWLHFTD_cjs.isDbDocTypeInternal(row.source),
24822
+ internal: chunkWIV3R2MJ_cjs.isDbDocTypeInternal(row.source),
24617
24823
  versioning: dbVersioning
24618
24824
  };
24619
24825
  });
@@ -24774,7 +24980,7 @@ export const myPlugin = definePlugin({
24774
24980
  title: "Add a Collection",
24775
24981
  pageTitle: "Add a Collection",
24776
24982
  currentPath: "/admin/collections",
24777
- version: chunkXGH2FVVR_cjs.getCoreVersion(),
24983
+ version: chunkSIPBHWMG_cjs.getCoreVersion(),
24778
24984
  user: u ? { name: u.email ?? "Admin", email: u.email ?? "", role: u.role ?? "admin" } : void 0,
24779
24985
  content
24780
24986
  })
@@ -24791,7 +24997,7 @@ adminCollectionsRoutes.get("/:id", async (c) => {
24791
24997
  collection = await stmt.bind(id).first();
24792
24998
  } catch {
24793
24999
  }
24794
- const registryRecord = chunkLLWLHFTD_cjs.getCollectionRegistry().getById(id) ?? chunkLLWLHFTD_cjs.getCollectionRegistry().getByName(id);
25000
+ const registryRecord = chunkWIV3R2MJ_cjs.getCollectionRegistry().getById(id) ?? chunkWIV3R2MJ_cjs.getCollectionRegistry().getByName(id);
24795
25001
  if (!collection && !registryRecord) {
24796
25002
  const formData2 = {
24797
25003
  isEdit: true,
@@ -24838,9 +25044,9 @@ adminCollectionsRoutes.get("/:id", async (c) => {
24838
25044
  isCodeDriven = true;
24839
25045
  }
24840
25046
  const [tinymceActive, quillActive, mdxeditorActive] = await Promise.all([
24841
- chunkBYLQOBO6_cjs.isPluginActive(db, "tinymce-plugin"),
24842
- chunkBYLQOBO6_cjs.isPluginActive(db, "quill-editor"),
24843
- chunkBYLQOBO6_cjs.isPluginActive(db, "easy-mdx")
25047
+ chunkL3KHLEHL_cjs.isPluginActive(db, "tinymce-plugin"),
25048
+ chunkL3KHLEHL_cjs.isPluginActive(db, "quill-editor"),
25049
+ chunkL3KHLEHL_cjs.isPluginActive(db, "easy-mdx")
24844
25050
  ]);
24845
25051
  const displayName = collection?.display_name ?? registryRecord?.displayName ?? id;
24846
25052
  const formData = {
@@ -24860,9 +25066,9 @@ adminCollectionsRoutes.get("/:id", async (c) => {
24860
25066
  console.error("Error fetching collection:", error);
24861
25067
  const user = c.get("user");
24862
25068
  const [tinymceActive, quillActive, mdxeditorActive] = await Promise.all([
24863
- chunkBYLQOBO6_cjs.isPluginActive(db, "tinymce-plugin"),
24864
- chunkBYLQOBO6_cjs.isPluginActive(db, "quill-editor"),
24865
- chunkBYLQOBO6_cjs.isPluginActive(db, "easy-mdx")
25069
+ chunkL3KHLEHL_cjs.isPluginActive(db, "tinymce-plugin"),
25070
+ chunkL3KHLEHL_cjs.isPluginActive(db, "quill-editor"),
25071
+ chunkL3KHLEHL_cjs.isPluginActive(db, "easy-mdx")
24866
25072
  ]);
24867
25073
  const formData = {
24868
25074
  isEdit: true,
@@ -25811,7 +26017,7 @@ function renderDatabaseToolsSettings(settings) {
25811
26017
 
25812
26018
  // src/routes/admin-settings.ts
25813
26019
  var adminSettingsRoutes = new hono.Hono();
25814
- adminSettingsRoutes.use("*", chunkBYLQOBO6_cjs.requireAuth());
26020
+ adminSettingsRoutes.use("*", chunkL3KHLEHL_cjs.requireAuth());
25815
26021
  function getMockSettings(user) {
25816
26022
  return {
25817
26023
  general: {
@@ -25914,7 +26120,7 @@ adminSettingsRoutes.get("/database-tools", (c) => {
25914
26120
  adminSettingsRoutes.get("/api/migrations/status", async (c) => {
25915
26121
  try {
25916
26122
  const db = c.env.DB;
25917
- const migrationService = new chunkKI5KMJH2_cjs.MigrationService(db);
26123
+ const migrationService = new chunkH5FB6GKR_cjs.MigrationService(db);
25918
26124
  const status = await migrationService.getMigrationStatus();
25919
26125
  return c.json({
25920
26126
  success: true,
@@ -25954,7 +26160,7 @@ adminSettingsRoutes.post("/api/migrations/run", async (c) => {
25954
26160
  adminSettingsRoutes.get("/api/migrations/validate", async (c) => {
25955
26161
  try {
25956
26162
  const db = c.env.DB;
25957
- const migrationService = new chunkKI5KMJH2_cjs.MigrationService(db);
26163
+ const migrationService = new chunkH5FB6GKR_cjs.MigrationService(db);
25958
26164
  const validation = await migrationService.validateSchema();
25959
26165
  return c.json({
25960
26166
  success: true,
@@ -26547,16 +26753,16 @@ function renderAPIReferencePage(data) {
26547
26753
  }
26548
26754
 
26549
26755
  // src/routes/admin-api-reference.ts
26550
- var VERSION2 = chunkXGH2FVVR_cjs.getCoreVersion();
26756
+ var VERSION2 = chunkSIPBHWMG_cjs.getCoreVersion();
26551
26757
  var router2 = new hono.Hono();
26552
- router2.use("*", chunkBYLQOBO6_cjs.requireAuth());
26758
+ router2.use("*", chunkL3KHLEHL_cjs.requireAuth());
26553
26759
  router2.get("/", async (c) => {
26554
26760
  const user = c.get("user");
26555
26761
  try {
26556
26762
  const app2 = chunk4BTBSXMR_cjs.getAppInstance();
26557
26763
  const baseEndpoints = chunk4BTBSXMR_cjs.buildRouteList(app2);
26558
26764
  const collectionRoutes = [];
26559
- const collections = chunkLLWLHFTD_cjs.getCollectionRegistry().listActive().filter((r) => !r.internal);
26765
+ const collections = chunkWIV3R2MJ_cjs.getCollectionRegistry().listActive().filter((r) => !r.internal);
26560
26766
  const methodOrder = { GET: 0, POST: 1, PUT: 2, PATCH: 3, DELETE: 4 };
26561
26767
  for (const col of collections) {
26562
26768
  const displayName = col.displayName || col.name;
@@ -26672,5 +26878,5 @@ exports.setVariablesCache = setVariablesCache;
26672
26878
  exports.test_cleanup_default = test_cleanup_default;
26673
26879
  exports.userProfilesPlugin = userProfilesPlugin;
26674
26880
  exports.userRoutes = userRoutes;
26675
- //# sourceMappingURL=chunk-TV7LRFXH.cjs.map
26676
- //# sourceMappingURL=chunk-TV7LRFXH.cjs.map
26881
+ //# sourceMappingURL=chunk-SSOP7G4R.cjs.map
26882
+ //# sourceMappingURL=chunk-SSOP7G4R.cjs.map