@sonicjs-cms/core 2.19.0 → 3.0.0-beta.11

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 (230) hide show
  1. package/README.md +52 -52
  2. package/dist/admin-documents-form.template-DDSH6ROU.js +6 -0
  3. package/dist/{admin-layout-catalyst.template-UMTIN66R.js.map → admin-documents-form.template-DDSH6ROU.js.map} +1 -1
  4. package/dist/admin-documents-form.template-LSZKGA5J.cjs +19 -0
  5. package/dist/{admin-layout-catalyst.template-HFD37TY5.cjs.map → admin-documents-form.template-LSZKGA5J.cjs.map} +1 -1
  6. package/dist/{filter-bar.template-DlVYMk-T.d.cts → admin-layout-catalyst.template-DrwDUfsE.d.cts} +25 -1
  7. package/dist/{filter-bar.template-DlVYMk-T.d.ts → admin-layout-catalyst.template-DrwDUfsE.d.ts} +25 -1
  8. package/dist/admin-layout-catalyst.template-KDHKVLXR.cjs +21 -0
  9. package/dist/admin-layout-catalyst.template-KDHKVLXR.cjs.map +1 -0
  10. package/dist/admin-layout-catalyst.template-YQ4EMF2J.js +7 -0
  11. package/dist/admin-layout-catalyst.template-YQ4EMF2J.js.map +1 -0
  12. package/dist/app-Bo0X1OWX.d.ts +1268 -0
  13. package/dist/app-Do66yCcV.d.cts +1268 -0
  14. package/dist/cache-DDARE4QE.js +4 -0
  15. package/dist/cache-DDARE4QE.js.map +1 -0
  16. package/dist/cache-LVYS4BPL.cjs +33 -0
  17. package/dist/cache-LVYS4BPL.cjs.map +1 -0
  18. package/dist/chunk-2CB4KY7I.cjs +771 -0
  19. package/dist/chunk-2CB4KY7I.cjs.map +1 -0
  20. package/dist/{chunk-4NPCDK6B.js → chunk-3PU4WVU6.js} +557 -90
  21. package/dist/chunk-3PU4WVU6.js.map +1 -0
  22. package/dist/chunk-4BTBSXMR.cjs +912 -0
  23. package/dist/chunk-4BTBSXMR.cjs.map +1 -0
  24. package/dist/{chunk-55RDMDOP.js → chunk-5V62WT6M.js} +181 -57
  25. package/dist/chunk-5V62WT6M.js.map +1 -0
  26. package/dist/chunk-6H66MSSL.js +273 -0
  27. package/dist/chunk-6H66MSSL.js.map +1 -0
  28. package/dist/chunk-AI663NBO.js +821 -0
  29. package/dist/chunk-AI663NBO.js.map +1 -0
  30. package/dist/chunk-BLMTL57B.js +767 -0
  31. package/dist/chunk-BLMTL57B.js.map +1 -0
  32. package/dist/{chunk-4ZSNJDLS.cjs → chunk-CRGUD4KC.cjs} +9 -9
  33. package/dist/chunk-CRGUD4KC.cjs.map +1 -0
  34. package/dist/chunk-GCDZZNIN.js +192 -0
  35. package/dist/chunk-GCDZZNIN.js.map +1 -0
  36. package/dist/chunk-HIKBY7MS.cjs +70 -0
  37. package/dist/chunk-HIKBY7MS.cjs.map +1 -0
  38. package/dist/chunk-HPAJKZAQ.js +387 -0
  39. package/dist/chunk-HPAJKZAQ.js.map +1 -0
  40. package/dist/chunk-IESEVHXL.js +66 -0
  41. package/dist/chunk-IESEVHXL.js.map +1 -0
  42. package/dist/chunk-IVPRUGTY.js +242 -0
  43. package/dist/chunk-IVPRUGTY.js.map +1 -0
  44. package/dist/{chunk-JZVHLLSI.cjs → chunk-IXUHXTHW.cjs} +2 -151
  45. package/dist/chunk-IXUHXTHW.cjs.map +1 -0
  46. package/dist/chunk-J6JTWD2A.cjs +100 -0
  47. package/dist/chunk-J6JTWD2A.cjs.map +1 -0
  48. package/dist/chunk-JEQ7FLOD.cjs +199 -0
  49. package/dist/chunk-JEQ7FLOD.cjs.map +1 -0
  50. package/dist/{chunk-ON5ZMSU4.js → chunk-JQISFW6U.js} +3 -3
  51. package/dist/chunk-JQISFW6U.js.map +1 -0
  52. package/dist/chunk-K25XHMM3.js +566 -0
  53. package/dist/chunk-K25XHMM3.js.map +1 -0
  54. package/dist/{chunk-R4FOLLFB.cjs → chunk-K342JMA3.cjs} +8730 -11520
  55. package/dist/chunk-K342JMA3.cjs.map +1 -0
  56. package/dist/{chunk-UYJ6TJHX.cjs → chunk-K623Q6WD.cjs} +181 -56
  57. package/dist/chunk-K623Q6WD.cjs.map +1 -0
  58. package/dist/chunk-KV3CM5RK.cjs +158 -0
  59. package/dist/chunk-KV3CM5RK.cjs.map +1 -0
  60. package/dist/{chunk-ABB34XUS.cjs → chunk-MKKGA3C4.cjs} +667 -19
  61. package/dist/chunk-MKKGA3C4.cjs.map +1 -0
  62. package/dist/chunk-N32OWET6.cjs +327 -0
  63. package/dist/chunk-N32OWET6.cjs.map +1 -0
  64. package/dist/chunk-NUKJ54GA.cjs +245 -0
  65. package/dist/chunk-NUKJ54GA.cjs.map +1 -0
  66. package/dist/{chunk-XWIA3HVX.js → chunk-OBA2RYZN.js} +6 -1249
  67. package/dist/chunk-OBA2RYZN.js.map +1 -0
  68. package/dist/chunk-ORF4CT74.cjs +276 -0
  69. package/dist/chunk-ORF4CT74.cjs.map +1 -0
  70. package/dist/{chunk-TFNTM3OA.js → chunk-PDYRDYXI.js} +645 -15
  71. package/dist/chunk-PDYRDYXI.js.map +1 -0
  72. package/dist/{chunk-OHYBNCVL.cjs → chunk-PXNTCCPE.cjs} +10 -1256
  73. package/dist/chunk-PXNTCCPE.cjs.map +1 -0
  74. package/dist/{chunk-E4YFJBM2.cjs → chunk-QJNKSFDJ.cjs} +876 -829
  75. package/dist/chunk-QJNKSFDJ.cjs.map +1 -0
  76. package/dist/chunk-QLFTG3QJ.js +1828 -0
  77. package/dist/chunk-QLFTG3QJ.js.map +1 -0
  78. package/dist/{chunk-BU7SFHGP.js → chunk-QZGABF2M.js} +3 -149
  79. package/dist/chunk-QZGABF2M.js.map +1 -0
  80. package/dist/chunk-RMRJGMDE.js +323 -0
  81. package/dist/chunk-RMRJGMDE.js.map +1 -0
  82. package/dist/chunk-RNZFGN4R.js +88 -0
  83. package/dist/chunk-RNZFGN4R.js.map +1 -0
  84. package/dist/chunk-RQ6N3FTV.js +900 -0
  85. package/dist/chunk-RQ6N3FTV.js.map +1 -0
  86. package/dist/{chunk-OCL3HMEG.js → chunk-SXLVXD2X.js} +7004 -9807
  87. package/dist/chunk-SXLVXD2X.js.map +1 -0
  88. package/dist/chunk-UHRHZXVR.cjs +408 -0
  89. package/dist/chunk-UHRHZXVR.cjs.map +1 -0
  90. package/dist/chunk-YA3TJ65D.cjs +575 -0
  91. package/dist/chunk-YA3TJ65D.cjs.map +1 -0
  92. package/dist/{chunk-7A4CB7T3.cjs → chunk-YJEBDJDV.cjs} +561 -91
  93. package/dist/chunk-YJEBDJDV.cjs.map +1 -0
  94. package/dist/chunk-YP7GW2G5.cjs +866 -0
  95. package/dist/chunk-YP7GW2G5.cjs.map +1 -0
  96. package/dist/chunk-ZUEIQFE5.js +154 -0
  97. package/dist/chunk-ZUEIQFE5.js.map +1 -0
  98. package/dist/{collection-config-B4PG-AaF.d.cts → collection-config-JgHOpFCG.d.cts} +30 -2
  99. package/dist/{collection-config-B4PG-AaF.d.ts → collection-config-JgHOpFCG.d.ts} +30 -2
  100. package/dist/config-HFXANXCC.js +6 -0
  101. package/dist/config-HFXANXCC.js.map +1 -0
  102. package/dist/config-ON6FNMYX.cjs +19 -0
  103. package/dist/config-ON6FNMYX.cjs.map +1 -0
  104. package/dist/define-plugin-BzNHc1ZI.d.ts +1321 -0
  105. package/dist/define-plugin-IWDKYaVm.d.cts +1321 -0
  106. package/dist/document-projection-TDWRJX3Z.cjs +13 -0
  107. package/dist/document-projection-TDWRJX3Z.cjs.map +1 -0
  108. package/dist/document-projection-YYMC6I4U.js +4 -0
  109. package/dist/document-projection-YYMC6I4U.js.map +1 -0
  110. package/dist/index.cjs +13739 -4328
  111. package/dist/index.cjs.map +1 -1
  112. package/dist/index.d.cts +331 -493
  113. package/dist/index.d.ts +331 -493
  114. package/dist/index.js +13456 -4067
  115. package/dist/index.js.map +1 -1
  116. package/dist/middleware.cjs +38 -32
  117. package/dist/middleware.d.cts +50 -7
  118. package/dist/middleware.d.ts +50 -7
  119. package/dist/middleware.js +9 -3
  120. package/dist/migrations-XQLBY7E5.js +4 -0
  121. package/dist/{migrations-H5IXZNCO.js.map → migrations-XQLBY7E5.js.map} +1 -1
  122. package/dist/migrations-ZXJEUTFA.cjs +13 -0
  123. package/dist/{migrations-566IIPS2.cjs.map → migrations-ZXJEUTFA.cjs.map} +1 -1
  124. package/dist/{plugin-bootstrap-DfVerYV4.d.cts → plugin-bootstrap-B8ThJU21.d.cts} +4315 -1661
  125. package/dist/{plugin-bootstrap-P_ciLp_C.d.ts → plugin-bootstrap-qu8hJgUt.d.ts} +4315 -1661
  126. package/dist/plugins.cjs +171 -12
  127. package/dist/plugins.d.cts +36 -2
  128. package/dist/plugins.d.ts +36 -2
  129. package/dist/plugins.js +5 -2
  130. package/dist/rbac-O73MFKDA.js +5 -0
  131. package/dist/rbac-O73MFKDA.js.map +1 -0
  132. package/dist/rbac-VONLJJKB.cjs +14 -0
  133. package/dist/rbac-VONLJJKB.cjs.map +1 -0
  134. package/dist/routes.cjs +42 -46
  135. package/dist/routes.d.cts +56 -146
  136. package/dist/routes.d.ts +56 -146
  137. package/dist/routes.js +18 -10
  138. package/dist/services.cjs +43 -76
  139. package/dist/services.d.cts +93 -55
  140. package/dist/services.d.ts +93 -55
  141. package/dist/services.js +6 -3
  142. package/dist/{telemetry-B9vIV4wh.d.cts → telemetry-Cku1ax74.d.cts} +1 -1
  143. package/dist/{telemetry-B9vIV4wh.d.ts → telemetry-Cku1ax74.d.ts} +1 -1
  144. package/dist/templates.cjs +17 -29
  145. package/dist/templates.d.cts +2 -89
  146. package/dist/templates.d.ts +2 -89
  147. package/dist/templates.js +3 -3
  148. package/dist/types-Dea1eNxU.d.cts +286 -0
  149. package/dist/types-Dea1eNxU.d.ts +286 -0
  150. package/dist/types.d.cts +2 -2
  151. package/dist/types.d.ts +2 -2
  152. package/dist/utils.cjs +21 -20
  153. package/dist/utils.d.cts +2 -2
  154. package/dist/utils.d.ts +2 -2
  155. package/dist/utils.js +3 -2
  156. package/migrations/0001_core.sql +184 -0
  157. package/migrations/0002_documents.sql +163 -0
  158. package/package.json +12 -7
  159. package/dist/admin-layout-catalyst.template-HFD37TY5.cjs +0 -17
  160. package/dist/admin-layout-catalyst.template-UMTIN66R.js +0 -7
  161. package/dist/app-C9esKLmh.d.cts +0 -112
  162. package/dist/app-C9esKLmh.d.ts +0 -112
  163. package/dist/chunk-4NPCDK6B.js.map +0 -1
  164. package/dist/chunk-4ZSNJDLS.cjs.map +0 -1
  165. package/dist/chunk-55RDMDOP.js.map +0 -1
  166. package/dist/chunk-635JAMSE.cjs +0 -653
  167. package/dist/chunk-635JAMSE.cjs.map +0 -1
  168. package/dist/chunk-7A4CB7T3.cjs.map +0 -1
  169. package/dist/chunk-ABB34XUS.cjs.map +0 -1
  170. package/dist/chunk-BU7SFHGP.js.map +0 -1
  171. package/dist/chunk-E4YFJBM2.cjs.map +0 -1
  172. package/dist/chunk-EXNEW5US.js +0 -648
  173. package/dist/chunk-EXNEW5US.js.map +0 -1
  174. package/dist/chunk-JZV22DEV.js +0 -1783
  175. package/dist/chunk-JZV22DEV.js.map +0 -1
  176. package/dist/chunk-JZVHLLSI.cjs.map +0 -1
  177. package/dist/chunk-OCL3HMEG.js.map +0 -1
  178. package/dist/chunk-OHYBNCVL.cjs.map +0 -1
  179. package/dist/chunk-ON5ZMSU4.js.map +0 -1
  180. package/dist/chunk-QFWHAFEO.js +0 -1843
  181. package/dist/chunk-QFWHAFEO.js.map +0 -1
  182. package/dist/chunk-R4FOLLFB.cjs.map +0 -1
  183. package/dist/chunk-RLMUFFUD.cjs +0 -2219
  184. package/dist/chunk-RLMUFFUD.cjs.map +0 -1
  185. package/dist/chunk-TFNTM3OA.js.map +0 -1
  186. package/dist/chunk-UYJ6TJHX.cjs.map +0 -1
  187. package/dist/chunk-WAEQXGCX.cjs +0 -1898
  188. package/dist/chunk-WAEQXGCX.cjs.map +0 -1
  189. package/dist/chunk-XWIA3HVX.js.map +0 -1
  190. package/dist/chunk-ZYAYUIZE.js +0 -2217
  191. package/dist/chunk-ZYAYUIZE.js.map +0 -1
  192. package/dist/migrations-566IIPS2.cjs +0 -13
  193. package/dist/migrations-H5IXZNCO.js +0 -4
  194. package/dist/plugin-manager-BoM3Q7o7.d.cts +0 -328
  195. package/dist/plugin-manager-Efx9RyDX.d.ts +0 -328
  196. package/migrations/001_initial_schema.sql +0 -170
  197. package/migrations/002_faq_plugin.sql +0 -86
  198. package/migrations/003_stage5_enhancements.sql +0 -121
  199. package/migrations/004_stage6_user_management.sql +0 -183
  200. package/migrations/005_stage7_workflow_automation.sql +0 -294
  201. package/migrations/006_plugin_system.sql +0 -155
  202. package/migrations/007_demo_login_plugin.sql +0 -23
  203. package/migrations/008_fix_slug_validation.sql +0 -22
  204. package/migrations/009_system_logging.sql +0 -57
  205. package/migrations/011_config_managed_collections.sql +0 -15
  206. package/migrations/012_testimonials_plugin.sql +0 -80
  207. package/migrations/013_code_examples_plugin.sql +0 -177
  208. package/migrations/014_fix_plugin_registry.sql +0 -88
  209. package/migrations/015_add_remaining_plugins.sql +0 -89
  210. package/migrations/016_remove_duplicate_cache_plugin.sql +0 -17
  211. package/migrations/017_auth_configurable_fields.sql +0 -49
  212. package/migrations/018_settings_table.sql +0 -23
  213. package/migrations/019_remove_blog_posts_collection.sql +0 -15
  214. package/migrations/020_add_email_plugin.sql +0 -22
  215. package/migrations/021_add_magic_link_auth_plugin.sql +0 -42
  216. package/migrations/022_add_tinymce_plugin.sql +0 -25
  217. package/migrations/023_add_easy_mdx_plugin.sql +0 -25
  218. package/migrations/024_add_quill_editor_plugin.sql +0 -25
  219. package/migrations/025_add_easymde_plugin.sql +0 -25
  220. package/migrations/026_add_otp_login.sql +0 -42
  221. package/migrations/027_fix_slug_field_type.sql +0 -18
  222. package/migrations/028_fix_slug_field_type_in_schemas.sql +0 -30
  223. package/migrations/029_add_forms_system.sql +0 -184
  224. package/migrations/030_add_turnstile_to_forms.sql +0 -14
  225. package/migrations/031_ai_search_plugin.sql +0 -45
  226. package/migrations/032_user_profiles.sql +0 -37
  227. package/migrations/033_form_content_integration.sql +0 -19
  228. package/migrations/034_security_audit_plugin.sql +0 -27
  229. package/migrations/035_user_profiles_data_column.sql +0 -16
  230. package/migrations/036_analytics_events.sql +0 -22
@@ -1,12 +1,370 @@
1
1
  'use strict';
2
2
 
3
- var chunkE4YFJBM2_cjs = require('./chunk-E4YFJBM2.cjs');
4
- var chunkRLMUFFUD_cjs = require('./chunk-RLMUFFUD.cjs');
3
+ var chunk2CB4KY7I_cjs = require('./chunk-2CB4KY7I.cjs');
4
+ var chunkQJNKSFDJ_cjs = require('./chunk-QJNKSFDJ.cjs');
5
+ var chunkORF4CT74_cjs = require('./chunk-ORF4CT74.cjs');
6
+ var chunkK623Q6WD_cjs = require('./chunk-K623Q6WD.cjs');
7
+ var chunkJ6JTWD2A_cjs = require('./chunk-J6JTWD2A.cjs');
5
8
  var chunkRCQ2HIQD_cjs = require('./chunk-RCQ2HIQD.cjs');
9
+ var zod = require('zod');
6
10
  var jwt = require('hono/jwt');
7
11
  var cookie = require('hono/cookie');
8
12
 
13
+ // src/services/document-type-registry.ts
14
+ function rowToDocumentType(row) {
15
+ return {
16
+ id: row.id,
17
+ name: row.name,
18
+ displayName: row.display_name,
19
+ description: row.description,
20
+ schema: JSON.parse(row.schema),
21
+ queryableFields: JSON.parse(row.queryable_fields),
22
+ settings: JSON.parse(row.settings),
23
+ pluginId: row.plugin_id,
24
+ source: row.source,
25
+ schemaVersion: row.schema_version,
26
+ isSystem: row.is_system === 1,
27
+ isActive: row.is_active === 1,
28
+ isAuth: row.is_auth === 1,
29
+ createdAt: row.created_at,
30
+ updatedAt: row.updated_at
31
+ };
32
+ }
33
+ var DocumentTypeRegistry = class {
34
+ constructor(db) {
35
+ this.db = db;
36
+ }
37
+ cache = /* @__PURE__ */ new Map();
38
+ // Register or update a document type. Idempotent: bumps schema_version only when schema changes.
39
+ async register(def) {
40
+ const now = Math.floor(Date.now() / 1e3);
41
+ const existing = await this.findById(def.id);
42
+ const schemaJson = JSON.stringify({ queryableFields: def.queryableFields ?? [], settings: def.settings ?? {} });
43
+ const queryableJson = JSON.stringify(def.queryableFields ?? []);
44
+ const settingsJson = JSON.stringify(def.settings ?? {});
45
+ if (existing) {
46
+ const schemaChanged = schemaJson !== JSON.stringify(existing.schema);
47
+ const newVersion = schemaChanged ? existing.schemaVersion + 1 : existing.schemaVersion;
48
+ await this.db.prepare(
49
+ `UPDATE document_types SET
50
+ display_name = ?,
51
+ description = ?,
52
+ schema = ?,
53
+ queryable_fields = ?,
54
+ settings = ?,
55
+ plugin_id = ?,
56
+ schema_version = ?,
57
+ is_active = 1,
58
+ is_auth = ?,
59
+ updated_at = ?
60
+ WHERE id = ?`
61
+ ).bind(
62
+ def.displayName,
63
+ def.description ?? null,
64
+ schemaJson,
65
+ queryableJson,
66
+ settingsJson,
67
+ def.pluginId ?? null,
68
+ newVersion,
69
+ def.isAuth ? 1 : 0,
70
+ now,
71
+ def.id
72
+ ).run();
73
+ await chunkORF4CT74_cjs.ensureScalarSchema(this.db, def.id, def.queryableFields ?? []);
74
+ const updated = await this.findById(def.id);
75
+ this.cache.set(def.id, updated);
76
+ return updated;
77
+ }
78
+ await this.db.prepare(
79
+ `INSERT INTO document_types (id, name, display_name, description, schema, queryable_fields, settings, plugin_id, source, schema_version, is_system, is_active, is_auth, created_at, updated_at)
80
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, 1, 0, 1, ?, ?, ?)`
81
+ ).bind(
82
+ def.id,
83
+ def.name ?? def.id,
84
+ def.displayName,
85
+ def.description ?? null,
86
+ schemaJson,
87
+ queryableJson,
88
+ settingsJson,
89
+ def.pluginId ?? null,
90
+ def.source ?? "code",
91
+ def.isAuth ? 1 : 0,
92
+ now,
93
+ now
94
+ ).run();
95
+ await chunkORF4CT74_cjs.ensureScalarSchema(this.db, def.id, def.queryableFields ?? []);
96
+ const created = await this.findById(def.id);
97
+ this.cache.set(def.id, created);
98
+ return created;
99
+ }
100
+ async findById(id) {
101
+ if (this.cache.has(id)) return this.cache.get(id);
102
+ const row = await this.db.prepare("SELECT * FROM document_types WHERE id = ?").bind(id).first();
103
+ if (!row) return null;
104
+ const dt = rowToDocumentType(row);
105
+ this.cache.set(id, dt);
106
+ return dt;
107
+ }
108
+ async findAll(activeOnly = true) {
109
+ const sql = activeOnly ? "SELECT * FROM document_types WHERE is_active = 1 ORDER BY name" : "SELECT * FROM document_types ORDER BY name";
110
+ const result = await this.db.prepare(sql).all();
111
+ return (result.results ?? []).map(rowToDocumentType);
112
+ }
113
+ async deactivate(id) {
114
+ const now = Math.floor(Date.now() / 1e3);
115
+ await this.db.prepare("UPDATE document_types SET is_active = 0, updated_at = ? WHERE id = ?").bind(now, id).run();
116
+ this.cache.delete(id);
117
+ }
118
+ clearCache() {
119
+ this.cache.clear();
120
+ }
121
+ };
122
+
123
+ // src/services/document-types-seed.ts
124
+ var anyObject = zod.z.record(zod.z.string(), zod.z.unknown());
125
+ async function bootstrapDocumentTypes(db) {
126
+ const registry = new DocumentTypeRegistry(db);
127
+ await registry.register({
128
+ id: "site_settings",
129
+ name: "site_settings",
130
+ displayName: "Site Settings",
131
+ description: "Global site configuration (internal; managed via admin settings UI)",
132
+ source: "system",
133
+ schema: anyObject,
134
+ settings: {
135
+ internal: true,
136
+ maxVersionsPerRoot: 1,
137
+ baseGrants: { admin: ["read", "create", "update", "delete", "manage"] }
138
+ },
139
+ queryableFields: []
140
+ });
141
+ await registry.register({
142
+ id: "blog_post",
143
+ name: "blog_post",
144
+ displayName: "Blog Post",
145
+ description: "Blog post (document-backed; edited via the content collection UI)",
146
+ source: "system",
147
+ schema: anyObject,
148
+ settings: {
149
+ baseGrants: { public: ["read"], admin: ["read", "create", "update", "delete", "publish", "manage"], editor: ["read", "create", "update", "publish"], viewer: ["read"] },
150
+ maxVersionsPerRoot: 50
151
+ },
152
+ queryableFields: [
153
+ { name: "difficulty", kind: "scalar", type: "text", column: "q_blog_difficulty" },
154
+ { name: "author", kind: "scalar", type: "text", column: "q_blog_author" }
155
+ ]
156
+ });
157
+ await registry.register({
158
+ id: "plugin",
159
+ name: "plugin",
160
+ displayName: "Plugin",
161
+ description: "System plugin record (managed by the plugin bootstrap service)",
162
+ source: "system",
163
+ schema: anyObject,
164
+ settings: {
165
+ baseGrants: { admin: ["read", "create", "update", "delete", "publish", "manage"] },
166
+ maxVersionsPerRoot: 1,
167
+ internal: true
168
+ },
169
+ queryableFields: [
170
+ { name: "status", kind: "scalar", type: "text", column: "q_plugin_status" },
171
+ { name: "category", kind: "scalar", type: "text", column: "q_plugin_category" },
172
+ { name: "isCore", kind: "scalar", type: "integer", column: "q_plugin_is_core" }
173
+ ]
174
+ });
175
+ await registry.register({
176
+ id: "tenant",
177
+ name: "tenant",
178
+ displayName: "Tenant",
179
+ description: "Tenant record (managed by the multi-tenant plugin; slug = tenant id)",
180
+ source: "system",
181
+ schema: anyObject,
182
+ settings: {
183
+ baseGrants: { admin: ["read", "create", "update", "delete", "manage"] },
184
+ maxVersionsPerRoot: 1,
185
+ internal: true
186
+ },
187
+ queryableFields: [
188
+ { name: "status", kind: "scalar", type: "text", column: "q_tenant_status" },
189
+ { name: "domain", kind: "scalar", type: "text", column: "q_tenant_domain" }
190
+ ]
191
+ });
192
+ await registry.register({
193
+ id: "user_profile",
194
+ name: "user_profile",
195
+ displayName: "User Profile",
196
+ description: "Per-user profile record (auth-owned; one document per user, slug = userId)",
197
+ source: "system",
198
+ isAuth: true,
199
+ schema: anyObject,
200
+ settings: {
201
+ // Hidden from the content admin surfaces; a single mutable record (no version history).
202
+ internal: true,
203
+ maxVersionsPerRoot: 1,
204
+ pii: true,
205
+ baseGrants: { admin: ["read", "create", "update", "delete", "manage"] }
206
+ },
207
+ queryableFields: []
208
+ });
209
+ await registry.register({
210
+ id: "media_asset",
211
+ name: "media_asset",
212
+ displayName: "Media Asset",
213
+ description: "Uploaded media file metadata (managed via the media library; backs an R2 object)",
214
+ source: "system",
215
+ schema: anyObject,
216
+ settings: {
217
+ internal: true,
218
+ maxVersionsPerRoot: 5,
219
+ baseGrants: {
220
+ admin: ["read", "create", "update", "delete", "manage"],
221
+ editor: ["read", "create", "update"],
222
+ author: ["read", "create"],
223
+ viewer: ["read"]
224
+ }
225
+ },
226
+ queryableFields: [
227
+ { name: "mimeType", kind: "scalar", type: "text", column: "q_media_mime" },
228
+ { name: "folder", kind: "scalar", type: "text", column: "q_media_folder" },
229
+ { name: "size", kind: "scalar", type: "integer", column: "q_media_size" },
230
+ { name: "tags", kind: "facet", type: "text" }
231
+ ]
232
+ });
233
+ await registry.register({
234
+ id: "plugin_activity",
235
+ name: "plugin_activity",
236
+ displayName: "Plugin Activity",
237
+ description: "Plugin lifecycle event log (installed/activated/deactivated/settings_updated/error)",
238
+ source: "system",
239
+ schema: anyObject,
240
+ settings: {
241
+ internal: true,
242
+ maxVersionsPerRoot: 1,
243
+ baseGrants: { admin: ["read", "create", "manage"] }
244
+ },
245
+ queryableFields: [
246
+ { name: "pluginId", kind: "scalar", type: "text", column: "q_plugin_activity_plugin_id" },
247
+ { name: "action", kind: "scalar", type: "text", column: "q_plugin_activity_action" }
248
+ ]
249
+ });
250
+ await registry.register({
251
+ id: "security_event",
252
+ name: "security_event",
253
+ displayName: "Security Event",
254
+ description: "Security audit event (login attempts, lockouts, suspicious activity)",
255
+ source: "system",
256
+ schema: anyObject,
257
+ settings: {
258
+ internal: true,
259
+ maxVersionsPerRoot: 1,
260
+ baseGrants: { admin: ["read", "create", "manage"] }
261
+ },
262
+ queryableFields: [
263
+ { name: "eventType", kind: "scalar", type: "text", column: "q_sa_event_type" },
264
+ { name: "severity", kind: "scalar", type: "text", column: "q_sa_severity" },
265
+ { name: "userId", kind: "scalar", type: "text", column: "q_sa_user_id" },
266
+ { name: "email", kind: "scalar", type: "text", column: "q_sa_email" },
267
+ { name: "ipAddress", kind: "scalar", type: "text", column: "q_sa_ip_address" },
268
+ { name: "blocked", kind: "scalar", type: "integer", column: "q_sa_blocked" }
269
+ ]
270
+ });
271
+ await registry.register({
272
+ id: "analytics_event",
273
+ name: "analytics_event",
274
+ displayName: "Analytics Event",
275
+ description: "Tracked analytics event (page view, user action, custom event)",
276
+ source: "system",
277
+ schema: anyObject,
278
+ settings: {
279
+ internal: true,
280
+ maxVersionsPerRoot: 1,
281
+ baseGrants: { admin: ["read", "create", "manage"] }
282
+ },
283
+ queryableFields: [
284
+ { name: "event", kind: "scalar", type: "text", column: "q_evt_event" },
285
+ { name: "category", kind: "scalar", type: "text", column: "q_evt_category" },
286
+ { name: "userId", kind: "scalar", type: "text", column: "q_evt_user_id" },
287
+ { name: "sessionId", kind: "scalar", type: "text", column: "q_evt_session_id" },
288
+ { name: "path", kind: "scalar", type: "text", column: "q_evt_path" }
289
+ ]
290
+ });
291
+ await registry.register({
292
+ id: "media_asset",
293
+ name: "media_asset",
294
+ displayName: "Media Asset",
295
+ description: "Media file metadata (R2 object key + intrinsic properties; URL derived at read time)",
296
+ source: "system",
297
+ schema: anyObject,
298
+ settings: {
299
+ baseGrants: { public: ["read"], admin: ["read", "create", "update", "delete", "publish", "manage"], editor: ["read", "create", "update"] },
300
+ maxVersionsPerRoot: 5
301
+ },
302
+ queryableFields: [
303
+ { name: "mimeType", kind: "scalar", type: "text", column: "q_media_mime" },
304
+ { name: "folder", kind: "scalar", type: "text", column: "q_media_folder" },
305
+ { name: "size", kind: "scalar", type: "integer", column: "q_media_size" },
306
+ { name: "tags", kind: "facet", type: "text" }
307
+ ]
308
+ });
309
+ for (const [id, displayName, description] of [
310
+ ["rbac_role", "RBAC Role", "Role record with embedded grants (auth-owned)"],
311
+ ["rbac_verb", "RBAC Verb", "Permission verb (auth-owned)"],
312
+ ["rbac_user_roles", "RBAC User Roles", "Per-user role assignments (auth-owned; slug = userId)"]
313
+ ]) {
314
+ await registry.register({
315
+ id,
316
+ name: id,
317
+ displayName,
318
+ description,
319
+ source: "system",
320
+ isAuth: true,
321
+ schema: anyObject,
322
+ settings: {
323
+ internal: true,
324
+ maxVersionsPerRoot: 1,
325
+ baseGrants: { admin: ["read", "create", "update", "delete", "manage"] }
326
+ },
327
+ queryableFields: []
328
+ });
329
+ }
330
+ }
331
+ async function autoRegisterCollectionDocumentTypes(db) {
332
+ const registry = new DocumentTypeRegistry(db);
333
+ const collections = chunkQJNKSFDJ_cjs.getCollectionRegistry().listActive();
334
+ const registered = [];
335
+ for (const collection of collections) {
336
+ if (collection.internal) continue;
337
+ if (collection.name === "blog_post") continue;
338
+ try {
339
+ await registry.register({
340
+ id: collection.name,
341
+ name: collection.name,
342
+ displayName: collection.displayName,
343
+ description: collection.description,
344
+ source: "system",
345
+ schema: anyObject,
346
+ settings: {
347
+ baseGrants: {
348
+ public: ["read"],
349
+ admin: ["read", "create", "update", "delete", "publish", "manage"],
350
+ editor: ["read", "create", "update", "publish"],
351
+ viewer: ["read"]
352
+ },
353
+ maxVersionsPerRoot: 50,
354
+ ...collection.versioning ? { versioning: true } : {}
355
+ },
356
+ queryableFields: []
357
+ });
358
+ registered.push(collection.name);
359
+ } catch (error) {
360
+ console.error(`[document-types-seed] Failed to register collection "${collection.name}":`, error);
361
+ }
362
+ }
363
+ return registered;
364
+ }
365
+
9
366
  // src/middleware/bootstrap.ts
367
+ chunkK623Q6WD_cjs.init_admin_layout_catalyst_template();
10
368
  var bootstrapComplete = false;
11
369
  function verifySecurityConfig(env) {
12
370
  const warnings = [];
@@ -47,6 +405,9 @@ function verifySecurityConfig(env) {
47
405
  }
48
406
  function bootstrapMiddleware(config = {}) {
49
407
  return async (c, next) => {
408
+ if (chunkJ6JTWD2A_cjs.hasHookSystem()) {
409
+ c.set("hookSystem", chunkJ6JTWD2A_cjs.getHookSystem());
410
+ }
50
411
  if (bootstrapComplete) {
51
412
  return next();
52
413
  }
@@ -54,26 +415,58 @@ function bootstrapMiddleware(config = {}) {
54
415
  if (path.startsWith("/images/") || path.startsWith("/assets/") || path === "/health" || path.endsWith(".js") || path.endsWith(".css") || path.endsWith(".png") || path.endsWith(".jpg") || path.endsWith(".ico")) {
55
416
  return next();
56
417
  }
418
+ const host = c.req.header("host") || "";
419
+ const isLocalhost = host.includes("localhost") || host.includes("127.0.0.1");
420
+ const gitBranch = c.env.GIT_BRANCH;
421
+ chunkK623Q6WD_cjs.setBranchLabel(isLocalhost && gitBranch ? gitBranch : void 0);
57
422
  try {
58
423
  console.log("[Bootstrap] Starting system initialization...");
59
- console.log("[Bootstrap] Running database migrations...");
60
- const migrationService = new chunkRLMUFFUD_cjs.MigrationService(c.env.DB);
61
- await migrationService.runPendingMigrations();
62
- console.log("[Bootstrap] Syncing collection configurations...");
424
+ console.log("[Bootstrap] Checking schema compatibility...");
425
+ const migrationService = new chunkORF4CT74_cjs.MigrationService(c.env.DB);
426
+ await migrationService.ensureSchemaCompatibility();
63
427
  try {
64
- await chunkE4YFJBM2_cjs.syncCollections(c.env.DB);
428
+ const kv = c.env.CACHE_KV;
429
+ if (kv) {
430
+ const { setGlobalKVNamespace } = await import('./cache-LVYS4BPL.cjs');
431
+ setGlobalKVNamespace(kv);
432
+ }
65
433
  } catch (error) {
66
- console.error("[Bootstrap] Error syncing collections:", error);
434
+ console.error("[Bootstrap] Error wiring CACHE_KV namespace:", error);
67
435
  }
68
- console.log("[Bootstrap] Syncing form collections...");
436
+ console.log("[Bootstrap] Populating collection registry...");
69
437
  try {
70
- await chunkE4YFJBM2_cjs.syncAllFormCollections(c.env.DB);
438
+ const configs = await chunkQJNKSFDJ_cjs.loadCollectionConfigs();
439
+ chunkQJNKSFDJ_cjs.getCollectionRegistry().register(configs);
440
+ console.log(`[Bootstrap] Registry populated with ${configs.length} collection(s)`);
71
441
  } catch (error) {
72
- console.error("[Bootstrap] Error syncing form collections:", error);
442
+ console.error("[Bootstrap] Error populating collection registry:", error);
443
+ }
444
+ console.log("[Bootstrap] Registering document types...");
445
+ try {
446
+ await bootstrapDocumentTypes(c.env.DB);
447
+ } catch (error) {
448
+ console.error("[Bootstrap] Error registering document types:", error);
449
+ }
450
+ try {
451
+ await repairMissingCredentialAccounts(c.env.DB);
452
+ } catch (error) {
453
+ console.error("[Bootstrap] Error repairing credential accounts:", error);
454
+ }
455
+ try {
456
+ const { RbacService: RbacService2 } = await import('./rbac-VONLJJKB.cjs');
457
+ await new RbacService2(c.env.DB, c.env.CACHE_KV).ensureSystemRbacSeed();
458
+ } catch (error) {
459
+ console.error("[Bootstrap] Error seeding RBAC documents:", error);
460
+ }
461
+ try {
462
+ const auto = await autoRegisterCollectionDocumentTypes(c.env.DB);
463
+ if (auto.length) console.log(`[Bootstrap] Document-backed collections registered: ${auto.join(", ")}`);
464
+ } catch (error) {
465
+ console.error("[Bootstrap] Error auto-registering collection document types:", error);
73
466
  }
74
467
  if (!config.plugins?.disableAll) {
75
468
  console.log("[Bootstrap] Bootstrapping core plugins...");
76
- const bootstrapService = new chunkE4YFJBM2_cjs.PluginBootstrapService(c.env.DB);
469
+ const bootstrapService = new chunkQJNKSFDJ_cjs.PluginBootstrapService(c.env.DB);
77
470
  const needsBootstrap = await bootstrapService.isBootstrapNeeded();
78
471
  if (needsBootstrap) {
79
472
  await bootstrapService.bootstrapCorePlugins();
@@ -83,6 +476,52 @@ function bootstrapMiddleware(config = {}) {
83
476
  }
84
477
  bootstrapComplete = true;
85
478
  console.log("[Bootstrap] System initialization completed");
479
+ try {
480
+ const registry = chunkQJNKSFDJ_cjs.getCollectionRegistry();
481
+ const collections = registry.listActive();
482
+ const countResult = await c.env.DB.prepare(
483
+ `SELECT type_id, COUNT(*) AS cnt FROM documents
484
+ WHERE is_current_draft = 1 AND deleted_at IS NULL GROUP BY type_id`
485
+ ).all();
486
+ const countMap = {};
487
+ let docTotal = 0;
488
+ for (const row of countResult.results ?? []) {
489
+ countMap[row.type_id] = row.cnt;
490
+ docTotal += row.cnt;
491
+ }
492
+ const fieldTypeHistogram = {};
493
+ for (const col of collections) {
494
+ const props = col.schema?.properties ?? {};
495
+ for (const field of Object.values(props)) {
496
+ const ft = field?.type ?? "unknown";
497
+ fieldTypeHistogram[ft] = (fieldTypeHistogram[ft] ?? 0) + 1;
498
+ }
499
+ }
500
+ const activePlugins = (config.plugins?.register ?? []).map((p) => p.name ?? "unknown");
501
+ let installationId = "unknown";
502
+ try {
503
+ const kv = c.env.KV;
504
+ if (kv) {
505
+ installationId = await kv.get("_sonicjs_installation_id") ?? "";
506
+ if (!installationId) {
507
+ installationId = crypto.randomUUID();
508
+ await kv.put("_sonicjs_installation_id", installationId);
509
+ }
510
+ }
511
+ } catch {
512
+ }
513
+ const telemetry = chunkQJNKSFDJ_cjs.getTelemetryService();
514
+ await telemetry.trackProjectSnapshot({
515
+ installation_id: installationId,
516
+ collection_names: collections.map((c2) => c2.name),
517
+ collection_counts: countMap,
518
+ active_plugins: activePlugins,
519
+ field_type_histogram: fieldTypeHistogram,
520
+ doc_total: docTotal,
521
+ sonicjs_version: c.env.SONICJS_VERSION ?? "unknown"
522
+ });
523
+ } catch {
524
+ }
86
525
  } catch (error) {
87
526
  console.error("[Bootstrap] Error during system initialization:", error);
88
527
  }
@@ -90,6 +529,27 @@ function bootstrapMiddleware(config = {}) {
90
529
  return next();
91
530
  };
92
531
  }
532
+ async function repairMissingCredentialAccounts(db) {
533
+ const { results } = await db.prepare(`
534
+ SELECT u.id, u.password_hash
535
+ FROM auth_user u
536
+ WHERE u.password_hash IS NOT NULL AND u.password_hash != ''
537
+ AND NOT EXISTS (
538
+ SELECT 1 FROM auth_account a
539
+ WHERE a.user_id = u.id AND a.provider_id = 'credential'
540
+ )
541
+ `).all();
542
+ if (!results.length) return;
543
+ console.log(`[Bootstrap] Repairing ${results.length} user(s) missing credential auth_account rows`);
544
+ const nowSec = Math.floor(Date.now() / 1e3);
545
+ for (const user of results) {
546
+ await db.prepare(`
547
+ INSERT OR IGNORE INTO auth_account (id, user_id, account_id, provider_id, password, created_at, updated_at)
548
+ VALUES (?, ?, ?, 'credential', ?, ?, ?)
549
+ `).bind(`cred-${user.id}`, user.id, user.id, user.password_hash, nowSec, nowSec).run();
550
+ }
551
+ console.log(`[Bootstrap] Credential account repair complete (${results.length} repaired)`);
552
+ }
93
553
  var JWT_SECRET_FALLBACK = "your-super-secret-jwt-key-change-in-production";
94
554
  var DEFAULT_JWT_EXPIRES_IN_SECONDS = 60 * 60 * 24 * 30;
95
555
  function parseDuration(input) {
@@ -121,14 +581,10 @@ async function getJwtExpirySecondsFromDb(db, env) {
121
581
  if (envParsed) return envParsed;
122
582
  if (db) {
123
583
  try {
124
- const row = await db.prepare("SELECT value FROM settings WHERE category = 'security' AND key = 'jwtExpiresIn'").first();
125
- if (row?.value) {
126
- let stored = row.value;
127
- try {
128
- stored = JSON.parse(row.value);
129
- } catch {
130
- }
131
- const parsed = parseDuration(stored);
584
+ const row = await db.prepare("SELECT data FROM documents WHERE type_id = 'site_settings' AND slug = 'security' AND tenant_id = 'default' AND is_current_draft = 1 AND deleted_at IS NULL").first();
585
+ if (row?.data) {
586
+ const data = JSON.parse(row.data);
587
+ const parsed = parseDuration(data.jwtExpiresIn);
132
588
  if (parsed) return parsed;
133
589
  }
134
590
  } catch (err) {
@@ -143,14 +599,10 @@ async function getJwtRefreshGraceSecondsFromDb(db, env) {
143
599
  if (envParsed) return envParsed;
144
600
  if (db) {
145
601
  try {
146
- const row = await db.prepare("SELECT value FROM settings WHERE category = 'security' AND key = 'jwtRefreshGraceSeconds'").first();
147
- if (row?.value) {
148
- let stored = row.value;
149
- try {
150
- stored = JSON.parse(row.value);
151
- } catch {
152
- }
153
- const parsed = parseDuration(stored);
602
+ const row = await db.prepare("SELECT data FROM documents WHERE type_id = 'site_settings' AND slug = 'security' AND tenant_id = 'default' AND is_current_draft = 1 AND deleted_at IS NULL").first();
603
+ if (row?.data) {
604
+ const data = JSON.parse(row.data);
605
+ const parsed = parseDuration(data.jwtRefreshGraceSeconds?.toString());
154
606
  if (parsed) return parsed;
155
607
  }
156
608
  } catch (err) {
@@ -376,52 +828,15 @@ var AuthManager = class _AuthManager {
376
828
  };
377
829
  var requireAuth = () => {
378
830
  return async (c, next) => {
379
- try {
380
- let token = c.req.header("Authorization")?.replace("Bearer ", "");
381
- if (!token) {
382
- token = cookie.getCookie(c, "auth_token");
383
- }
384
- if (!token) {
385
- const acceptHeader = c.req.header("Accept") || "";
386
- if (acceptHeader.includes("text/html")) {
387
- return c.redirect("/auth/login?error=Please login to access the admin area");
388
- }
389
- return c.json({ error: "Authentication required" }, 401);
390
- }
391
- const kv = c.env?.KV;
392
- let payload = null;
393
- if (kv) {
394
- const cacheKey = `auth:${token.substring(0, 20)}`;
395
- const cached = await kv.get(cacheKey, "json");
396
- if (cached) {
397
- payload = cached;
398
- }
399
- }
400
- if (!payload) {
401
- const jwtSecret = c.env?.JWT_SECRET;
402
- payload = await AuthManager.verifyToken(token, jwtSecret);
403
- if (payload && kv) {
404
- const cacheKey = `auth:${token.substring(0, 20)}`;
405
- await kv.put(cacheKey, JSON.stringify(payload), { expirationTtl: 300 });
406
- }
407
- }
408
- if (!payload) {
409
- const acceptHeader = c.req.header("Accept") || "";
410
- if (acceptHeader.includes("text/html")) {
411
- return c.redirect("/auth/login?error=Your session has expired, please login again");
412
- }
413
- return c.json({ error: "Invalid or expired token" }, 401);
414
- }
415
- c.set("user", payload);
416
- return await next();
417
- } catch (error) {
418
- console.error("Auth middleware error:", error);
831
+ const user = c.get("user");
832
+ if (!user) {
419
833
  const acceptHeader = c.req.header("Accept") || "";
420
834
  if (acceptHeader.includes("text/html")) {
421
- return c.redirect("/auth/login?error=Authentication failed, please login again");
835
+ return c.redirect("/auth/login?error=Please login to access the admin area");
422
836
  }
423
- return c.json({ error: "Authentication failed" }, 401);
837
+ return c.json({ error: "Authentication required" }, 401);
424
838
  }
839
+ return await next();
425
840
  };
426
841
  };
427
842
  var requireRole = (requiredRole) => {
@@ -445,25 +860,36 @@ var requireRole = (requiredRole) => {
445
860
  return await next();
446
861
  };
447
862
  };
448
- var optionalAuth = () => {
863
+ var requireRbac = (resource, verb) => {
449
864
  return async (c, next) => {
450
- try {
451
- let token = c.req.header("Authorization")?.replace("Bearer ", "");
452
- if (!token) {
453
- token = cookie.getCookie(c, "auth_token");
865
+ const user = c.get("user");
866
+ if (!user) {
867
+ const acceptHeader = c.req.header("Accept") || "";
868
+ if (acceptHeader.includes("text/html")) {
869
+ return c.redirect("/auth/login?error=Please login to access the admin area");
454
870
  }
455
- if (token) {
456
- const jwtSecret = c.env?.JWT_SECRET;
457
- const payload = await AuthManager.verifyToken(token, jwtSecret);
458
- if (payload) {
459
- c.set("user", payload);
460
- }
871
+ return c.json({ error: "Authentication required" }, 401);
872
+ }
873
+ const cachedPerms = c.get("rbacPerms");
874
+ let allowed;
875
+ if (cachedPerms !== void 0) {
876
+ allowed = cachedPerms.includes(`${resource}:${verb}`);
877
+ } else {
878
+ allowed = await new chunk2CB4KY7I_cjs.RbacService(c.env.DB).can(user.userId, resource, verb);
879
+ }
880
+ if (!allowed) {
881
+ const acceptHeader = c.req.header("Accept") || "";
882
+ if (acceptHeader.includes("text/html")) {
883
+ return c.redirect("/auth/login?error=You do not have permission to access this area");
461
884
  }
462
- return await next();
463
- } catch (error) {
464
- console.error("Optional auth error:", error);
465
- return await next();
885
+ return c.json({ error: "Insufficient permissions" }, 403);
466
886
  }
887
+ return await next();
888
+ };
889
+ };
890
+ var optionalAuth = () => {
891
+ return async (_c, next) => {
892
+ return await next();
467
893
  };
468
894
  };
469
895
 
@@ -531,11 +957,17 @@ var DEFAULT_EXEMPT_PATHS = [
531
957
  "/auth/login",
532
958
  "/auth/register",
533
959
  "/auth/seed-admin",
960
+ "/test-seed-defaults",
961
+ "/test-cleanup",
534
962
  "/auth/accept-invitation",
535
963
  "/auth/reset-password",
536
964
  "/auth/request-password-reset",
537
965
  "/auth/otp",
538
966
  "/auth/magic-link",
967
+ "/auth/sign-out",
968
+ "/auth/sign-in",
969
+ "/auth/sign-up",
970
+ "/auth/get-session",
539
971
  "/auth/verify",
540
972
  "/api/stripe/webhook",
541
973
  "/api/events"
@@ -699,6 +1131,45 @@ var securityHeadersMiddleware = () => {
699
1131
  };
700
1132
  };
701
1133
 
1134
+ // src/middleware/plugin-middleware.ts
1135
+ async function isPluginActive(db, pluginId) {
1136
+ try {
1137
+ const docResult = await db.prepare(
1138
+ `SELECT json_extract(data, '$.status') as status FROM documents
1139
+ WHERE slug = ? AND type_id = 'plugin' AND tenant_id = 'default'
1140
+ AND is_current_draft = 1 AND deleted_at IS NULL`
1141
+ ).bind(pluginId).first();
1142
+ return docResult?.status === "active";
1143
+ } catch (error) {
1144
+ console.error(`[isPluginActive] Error checking plugin status for ${pluginId}:`, error);
1145
+ return false;
1146
+ }
1147
+ }
1148
+ async function requireActivePlugin(db, pluginId) {
1149
+ const isActive = await isPluginActive(db, pluginId);
1150
+ if (!isActive) {
1151
+ throw new Error(`Plugin '${pluginId}' is required but is not active`);
1152
+ }
1153
+ }
1154
+ async function requireActivePlugins(db, pluginIds) {
1155
+ for (const pluginId of pluginIds) {
1156
+ await requireActivePlugin(db, pluginId);
1157
+ }
1158
+ }
1159
+ async function getActivePlugins(db) {
1160
+ try {
1161
+ const { results } = await db.prepare(
1162
+ `SELECT slug as id, json_extract(data, '$.status') as status, data FROM documents
1163
+ WHERE type_id = 'plugin' AND tenant_id = 'default'
1164
+ AND q_plugin_status = 'active' AND is_current_draft = 1 AND deleted_at IS NULL`
1165
+ ).all();
1166
+ return results || [];
1167
+ } catch (error) {
1168
+ console.error("[getActivePlugins] Error fetching active plugins:", error);
1169
+ return [];
1170
+ }
1171
+ }
1172
+
702
1173
  // src/middleware/index.ts
703
1174
  var loggingMiddleware = () => async (_c, next) => await next();
704
1175
  var detailedLoggingMiddleware = () => async (_c, next) => await next();
@@ -711,13 +1182,11 @@ var requirePermission = () => async (_c, next) => await next();
711
1182
  var requireAnyPermission = () => async (_c, next) => await next();
712
1183
  var logActivity = () => {
713
1184
  };
714
- var requireActivePlugin = () => async (_c, next) => await next();
715
- var requireActivePlugins = () => async (_c, next) => await next();
716
- var getActivePlugins = () => [];
717
- var isPluginActive = () => false;
718
1185
 
719
1186
  exports.AuthManager = AuthManager;
1187
+ exports.DocumentTypeRegistry = DocumentTypeRegistry;
720
1188
  exports.PermissionManager = PermissionManager;
1189
+ exports.bootstrapDocumentTypes = bootstrapDocumentTypes;
721
1190
  exports.bootstrapMiddleware = bootstrapMiddleware;
722
1191
  exports.cacheHeaders = cacheHeaders;
723
1192
  exports.compressionMiddleware = compressionMiddleware;
@@ -740,10 +1209,11 @@ exports.requireActivePlugins = requireActivePlugins;
740
1209
  exports.requireAnyPermission = requireAnyPermission;
741
1210
  exports.requireAuth = requireAuth;
742
1211
  exports.requirePermission = requirePermission;
1212
+ exports.requireRbac = requireRbac;
743
1213
  exports.requireRole = requireRole;
744
1214
  exports.securityHeadersMiddleware = securityHeadersMiddleware;
745
1215
  exports.securityLoggingMiddleware = securityLoggingMiddleware;
746
1216
  exports.validateCsrfToken = validateCsrfToken;
747
1217
  exports.verifySecurityConfig = verifySecurityConfig;
748
- //# sourceMappingURL=chunk-7A4CB7T3.cjs.map
749
- //# sourceMappingURL=chunk-7A4CB7T3.cjs.map
1218
+ //# sourceMappingURL=chunk-YJEBDJDV.cjs.map
1219
+ //# sourceMappingURL=chunk-YJEBDJDV.cjs.map