@sonicjs-cms/core 2.18.1 → 3.0.0-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (225) hide show
  1. package/README.md +4 -3
  2. package/dist/admin-documents-form.template-KN7JF66Q.cjs +19 -0
  3. package/dist/{admin-layout-catalyst.template-UMTIN66R.js.map → admin-documents-form.template-KN7JF66Q.cjs.map} +1 -1
  4. package/dist/admin-documents-form.template-NLSI6Z42.js +6 -0
  5. package/dist/{admin-layout-catalyst.template-HFD37TY5.cjs.map → admin-documents-form.template-NLSI6Z42.js.map} +1 -1
  6. package/dist/admin-layout-catalyst.template-WHJGSWWD.js +7 -0
  7. package/dist/admin-layout-catalyst.template-WHJGSWWD.js.map +1 -0
  8. package/dist/admin-layout-catalyst.template-ZK5HD545.cjs +17 -0
  9. package/dist/admin-layout-catalyst.template-ZK5HD545.cjs.map +1 -0
  10. package/dist/app-Bo0X1OWX.d.ts +1268 -0
  11. package/dist/app-Do66yCcV.d.cts +1268 -0
  12. package/dist/cache-DDARE4QE.js +4 -0
  13. package/dist/cache-DDARE4QE.js.map +1 -0
  14. package/dist/cache-LVYS4BPL.cjs +33 -0
  15. package/dist/cache-LVYS4BPL.cjs.map +1 -0
  16. package/dist/chunk-2CB4KY7I.cjs +771 -0
  17. package/dist/chunk-2CB4KY7I.cjs.map +1 -0
  18. package/dist/{chunk-55RDMDOP.js → chunk-3TB6AT6X.js} +148 -55
  19. package/dist/chunk-3TB6AT6X.js.map +1 -0
  20. package/dist/{chunk-ON5ZMSU4.js → chunk-6JQOUUOB.js} +3 -3
  21. package/dist/chunk-6JQOUUOB.js.map +1 -0
  22. package/dist/chunk-6OUHGKFD.js +387 -0
  23. package/dist/chunk-6OUHGKFD.js.map +1 -0
  24. package/dist/{chunk-DSUJ5YQH.cjs → chunk-AAWNRBRB.cjs} +537 -92
  25. package/dist/chunk-AAWNRBRB.cjs.map +1 -0
  26. package/dist/chunk-AI663NBO.js +821 -0
  27. package/dist/chunk-AI663NBO.js.map +1 -0
  28. package/dist/chunk-BDDABDAB.cjs +1149 -0
  29. package/dist/chunk-BDDABDAB.cjs.map +1 -0
  30. package/dist/chunk-BLMTL57B.js +767 -0
  31. package/dist/chunk-BLMTL57B.js.map +1 -0
  32. package/dist/chunk-DNQCEKUK.cjs +327 -0
  33. package/dist/chunk-DNQCEKUK.cjs.map +1 -0
  34. package/dist/chunk-DSA4UX5B.cjs +276 -0
  35. package/dist/chunk-DSA4UX5B.cjs.map +1 -0
  36. package/dist/chunk-EF2NQUIQ.js +323 -0
  37. package/dist/chunk-EF2NQUIQ.js.map +1 -0
  38. package/dist/chunk-GCDZZNIN.js +192 -0
  39. package/dist/chunk-GCDZZNIN.js.map +1 -0
  40. package/dist/{chunk-ABB34XUS.cjs → chunk-H2AXVCLS.cjs} +667 -19
  41. package/dist/chunk-H2AXVCLS.cjs.map +1 -0
  42. package/dist/{chunk-XWIA3HVX.js → chunk-HDWE5FRJ.js} +6 -1249
  43. package/dist/chunk-HDWE5FRJ.js.map +1 -0
  44. package/dist/chunk-HIKBY7MS.cjs +70 -0
  45. package/dist/chunk-HIKBY7MS.cjs.map +1 -0
  46. package/dist/chunk-IESEVHXL.js +66 -0
  47. package/dist/chunk-IESEVHXL.js.map +1 -0
  48. package/dist/chunk-IVPRUGTY.js +242 -0
  49. package/dist/chunk-IVPRUGTY.js.map +1 -0
  50. package/dist/{chunk-SQ6FNXU2.cjs → chunk-IXUHXTHW.cjs} +2 -151
  51. package/dist/chunk-IXUHXTHW.cjs.map +1 -0
  52. package/dist/chunk-J6JTWD2A.cjs +100 -0
  53. package/dist/chunk-J6JTWD2A.cjs.map +1 -0
  54. package/dist/chunk-JEQ7FLOD.cjs +199 -0
  55. package/dist/chunk-JEQ7FLOD.cjs.map +1 -0
  56. package/dist/chunk-K25XHMM3.js +566 -0
  57. package/dist/chunk-K25XHMM3.js.map +1 -0
  58. package/dist/chunk-LRZIAW7U.cjs +158 -0
  59. package/dist/chunk-LRZIAW7U.cjs.map +1 -0
  60. package/dist/{chunk-OHYBNCVL.cjs → chunk-MVIZJOO5.cjs} +10 -1256
  61. package/dist/chunk-MVIZJOO5.cjs.map +1 -0
  62. package/dist/{chunk-UYJ6TJHX.cjs → chunk-NAVPFIG5.cjs} +148 -55
  63. package/dist/chunk-NAVPFIG5.cjs.map +1 -0
  64. package/dist/chunk-NLJVSER2.js +273 -0
  65. package/dist/chunk-NLJVSER2.js.map +1 -0
  66. package/dist/chunk-NMPEMSU4.js +154 -0
  67. package/dist/chunk-NMPEMSU4.js.map +1 -0
  68. package/dist/chunk-NUKJ54GA.cjs +245 -0
  69. package/dist/chunk-NUKJ54GA.cjs.map +1 -0
  70. package/dist/{chunk-T3Q5V33G.cjs → chunk-QAYFOER6.cjs} +621 -829
  71. package/dist/chunk-QAYFOER6.cjs.map +1 -0
  72. package/dist/{chunk-MGFRZO24.js → chunk-QZGABF2M.js} +3 -149
  73. package/dist/chunk-QZGABF2M.js.map +1 -0
  74. package/dist/chunk-RNZFGN4R.js +88 -0
  75. package/dist/chunk-RNZFGN4R.js.map +1 -0
  76. package/dist/chunk-RZ6H7OZK.js +1134 -0
  77. package/dist/chunk-RZ6H7OZK.js.map +1 -0
  78. package/dist/{chunk-XXDFQERJ.js → chunk-VD2EA3WT.js} +7192 -9806
  79. package/dist/chunk-VD2EA3WT.js.map +1 -0
  80. package/dist/{chunk-SXXTQETM.cjs → chunk-VXE42MYF.cjs} +8722 -11323
  81. package/dist/chunk-VXE42MYF.cjs.map +1 -0
  82. package/dist/{chunk-4ZSNJDLS.cjs → chunk-WULONYGB.cjs} +9 -9
  83. package/dist/chunk-WULONYGB.cjs.map +1 -0
  84. package/dist/chunk-XW56B23A.cjs +408 -0
  85. package/dist/chunk-XW56B23A.cjs.map +1 -0
  86. package/dist/chunk-YA3TJ65D.cjs +575 -0
  87. package/dist/chunk-YA3TJ65D.cjs.map +1 -0
  88. package/dist/{chunk-TFNTM3OA.js → chunk-YHSQVQXX.js} +645 -15
  89. package/dist/chunk-YHSQVQXX.js.map +1 -0
  90. package/dist/chunk-YP7GW2G5.cjs +866 -0
  91. package/dist/chunk-YP7GW2G5.cjs.map +1 -0
  92. package/dist/{chunk-QFWHAFEO.js → chunk-ZEZ245PW.js} +148 -858
  93. package/dist/chunk-ZEZ245PW.js.map +1 -0
  94. package/dist/{chunk-EW5NOBVU.js → chunk-ZGGXCFR6.js} +611 -817
  95. package/dist/chunk-ZGGXCFR6.js.map +1 -0
  96. package/dist/{collection-config-B4PG-AaF.d.cts → collection-config-JgHOpFCG.d.cts} +30 -2
  97. package/dist/{collection-config-B4PG-AaF.d.ts → collection-config-JgHOpFCG.d.ts} +30 -2
  98. package/dist/config-HFXANXCC.js +6 -0
  99. package/dist/config-HFXANXCC.js.map +1 -0
  100. package/dist/config-ON6FNMYX.cjs +19 -0
  101. package/dist/config-ON6FNMYX.cjs.map +1 -0
  102. package/dist/define-plugin-BzNHc1ZI.d.ts +1321 -0
  103. package/dist/define-plugin-IWDKYaVm.d.cts +1321 -0
  104. package/dist/document-projection-TDWRJX3Z.cjs +13 -0
  105. package/dist/document-projection-TDWRJX3Z.cjs.map +1 -0
  106. package/dist/document-projection-YYMC6I4U.js +4 -0
  107. package/dist/document-projection-YYMC6I4U.js.map +1 -0
  108. package/dist/index.cjs +13735 -4329
  109. package/dist/index.cjs.map +1 -1
  110. package/dist/index.d.cts +329 -492
  111. package/dist/index.d.ts +329 -492
  112. package/dist/index.js +13386 -3999
  113. package/dist/index.js.map +1 -1
  114. package/dist/middleware.cjs +36 -32
  115. package/dist/middleware.d.cts +69 -7
  116. package/dist/middleware.d.ts +69 -7
  117. package/dist/middleware.js +7 -3
  118. package/dist/migrations-NJJWQUKK.cjs +13 -0
  119. package/dist/{migrations-IYNTWDC6.cjs.map → migrations-NJJWQUKK.cjs.map} +1 -1
  120. package/dist/migrations-WCAVBD7C.js +4 -0
  121. package/dist/{migrations-R337UD46.js.map → migrations-WCAVBD7C.js.map} +1 -1
  122. package/dist/{plugin-bootstrap-DfVerYV4.d.cts → plugin-bootstrap-B8ThJU21.d.cts} +4315 -1661
  123. package/dist/{plugin-bootstrap-P_ciLp_C.d.ts → plugin-bootstrap-qu8hJgUt.d.ts} +4315 -1661
  124. package/dist/plugins.cjs +171 -12
  125. package/dist/plugins.d.cts +36 -2
  126. package/dist/plugins.d.ts +36 -2
  127. package/dist/plugins.js +5 -2
  128. package/dist/rbac-O73MFKDA.js +5 -0
  129. package/dist/rbac-O73MFKDA.js.map +1 -0
  130. package/dist/rbac-VONLJJKB.cjs +14 -0
  131. package/dist/rbac-VONLJJKB.cjs.map +1 -0
  132. package/dist/routes.cjs +41 -45
  133. package/dist/routes.d.cts +56 -146
  134. package/dist/routes.d.ts +56 -146
  135. package/dist/routes.js +17 -9
  136. package/dist/services.cjs +39 -72
  137. package/dist/services.d.cts +79 -54
  138. package/dist/services.d.ts +79 -54
  139. package/dist/services.js +6 -3
  140. package/dist/templates.cjs +17 -29
  141. package/dist/templates.d.cts +1 -66
  142. package/dist/templates.d.ts +1 -66
  143. package/dist/templates.js +3 -3
  144. package/dist/types-Dea1eNxU.d.cts +286 -0
  145. package/dist/types-Dea1eNxU.d.ts +286 -0
  146. package/dist/types.d.cts +1 -1
  147. package/dist/types.d.ts +1 -1
  148. package/dist/utils.cjs +18 -17
  149. package/dist/utils.d.cts +1 -1
  150. package/dist/utils.d.ts +1 -1
  151. package/dist/utils.js +2 -1
  152. package/migrations/0001_core.sql +184 -0
  153. package/migrations/0002_documents.sql +163 -0
  154. package/package.json +12 -7
  155. package/dist/admin-layout-catalyst.template-HFD37TY5.cjs +0 -17
  156. package/dist/admin-layout-catalyst.template-UMTIN66R.js +0 -7
  157. package/dist/app-C9esKLmh.d.cts +0 -112
  158. package/dist/app-C9esKLmh.d.ts +0 -112
  159. package/dist/chunk-4R3NOOL3.js +0 -2217
  160. package/dist/chunk-4R3NOOL3.js.map +0 -1
  161. package/dist/chunk-4ZSNJDLS.cjs.map +0 -1
  162. package/dist/chunk-55RDMDOP.js.map +0 -1
  163. package/dist/chunk-635JAMSE.cjs +0 -653
  164. package/dist/chunk-635JAMSE.cjs.map +0 -1
  165. package/dist/chunk-ABB34XUS.cjs.map +0 -1
  166. package/dist/chunk-C54YUA23.cjs +0 -2219
  167. package/dist/chunk-C54YUA23.cjs.map +0 -1
  168. package/dist/chunk-DSUJ5YQH.cjs.map +0 -1
  169. package/dist/chunk-EW5NOBVU.js.map +0 -1
  170. package/dist/chunk-EXNEW5US.js +0 -648
  171. package/dist/chunk-EXNEW5US.js.map +0 -1
  172. package/dist/chunk-I2H5NGJQ.js +0 -692
  173. package/dist/chunk-I2H5NGJQ.js.map +0 -1
  174. package/dist/chunk-MGFRZO24.js.map +0 -1
  175. package/dist/chunk-OHYBNCVL.cjs.map +0 -1
  176. package/dist/chunk-ON5ZMSU4.js.map +0 -1
  177. package/dist/chunk-QFWHAFEO.js.map +0 -1
  178. package/dist/chunk-SQ6FNXU2.cjs.map +0 -1
  179. package/dist/chunk-SXXTQETM.cjs.map +0 -1
  180. package/dist/chunk-T3Q5V33G.cjs.map +0 -1
  181. package/dist/chunk-TFNTM3OA.js.map +0 -1
  182. package/dist/chunk-UYJ6TJHX.cjs.map +0 -1
  183. package/dist/chunk-WAEQXGCX.cjs +0 -1898
  184. package/dist/chunk-WAEQXGCX.cjs.map +0 -1
  185. package/dist/chunk-XWIA3HVX.js.map +0 -1
  186. package/dist/chunk-XXDFQERJ.js.map +0 -1
  187. package/dist/migrations-IYNTWDC6.cjs +0 -13
  188. package/dist/migrations-R337UD46.js +0 -4
  189. package/dist/plugin-manager-BoM3Q7o7.d.cts +0 -328
  190. package/dist/plugin-manager-Efx9RyDX.d.ts +0 -328
  191. package/migrations/001_initial_schema.sql +0 -170
  192. package/migrations/002_faq_plugin.sql +0 -86
  193. package/migrations/003_stage5_enhancements.sql +0 -121
  194. package/migrations/004_stage6_user_management.sql +0 -183
  195. package/migrations/005_stage7_workflow_automation.sql +0 -294
  196. package/migrations/006_plugin_system.sql +0 -155
  197. package/migrations/007_demo_login_plugin.sql +0 -23
  198. package/migrations/008_fix_slug_validation.sql +0 -22
  199. package/migrations/009_system_logging.sql +0 -57
  200. package/migrations/011_config_managed_collections.sql +0 -15
  201. package/migrations/012_testimonials_plugin.sql +0 -80
  202. package/migrations/013_code_examples_plugin.sql +0 -177
  203. package/migrations/014_fix_plugin_registry.sql +0 -88
  204. package/migrations/015_add_remaining_plugins.sql +0 -89
  205. package/migrations/016_remove_duplicate_cache_plugin.sql +0 -17
  206. package/migrations/017_auth_configurable_fields.sql +0 -49
  207. package/migrations/018_settings_table.sql +0 -23
  208. package/migrations/019_remove_blog_posts_collection.sql +0 -15
  209. package/migrations/020_add_email_plugin.sql +0 -22
  210. package/migrations/021_add_magic_link_auth_plugin.sql +0 -42
  211. package/migrations/022_add_tinymce_plugin.sql +0 -25
  212. package/migrations/023_add_easy_mdx_plugin.sql +0 -25
  213. package/migrations/024_add_quill_editor_plugin.sql +0 -25
  214. package/migrations/025_add_easymde_plugin.sql +0 -25
  215. package/migrations/026_add_otp_login.sql +0 -42
  216. package/migrations/027_fix_slug_field_type.sql +0 -18
  217. package/migrations/028_fix_slug_field_type_in_schemas.sql +0 -30
  218. package/migrations/029_add_forms_system.sql +0 -184
  219. package/migrations/030_add_turnstile_to_forms.sql +0 -14
  220. package/migrations/031_ai_search_plugin.sql +0 -45
  221. package/migrations/032_user_profiles.sql +0 -37
  222. package/migrations/033_form_content_integration.sql +0 -19
  223. package/migrations/034_security_audit_plugin.sql +0 -27
  224. package/migrations/035_user_profiles_data_column.sql +0 -16
  225. package/migrations/036_analytics_events.sql +0 -22
@@ -1,11 +1,367 @@
1
1
  'use strict';
2
2
 
3
- var chunkT3Q5V33G_cjs = require('./chunk-T3Q5V33G.cjs');
4
- var chunkC54YUA23_cjs = require('./chunk-C54YUA23.cjs');
3
+ var chunk2CB4KY7I_cjs = require('./chunk-2CB4KY7I.cjs');
4
+ var chunkQAYFOER6_cjs = require('./chunk-QAYFOER6.cjs');
5
+ var chunkDSA4UX5B_cjs = require('./chunk-DSA4UX5B.cjs');
6
+ var chunkJ6JTWD2A_cjs = require('./chunk-J6JTWD2A.cjs');
5
7
  var chunkRCQ2HIQD_cjs = require('./chunk-RCQ2HIQD.cjs');
8
+ var zod = require('zod');
6
9
  var jwt = require('hono/jwt');
7
10
  var cookie = require('hono/cookie');
8
11
 
12
+ // src/services/document-type-registry.ts
13
+ function rowToDocumentType(row) {
14
+ return {
15
+ id: row.id,
16
+ name: row.name,
17
+ displayName: row.display_name,
18
+ description: row.description,
19
+ schema: JSON.parse(row.schema),
20
+ queryableFields: JSON.parse(row.queryable_fields),
21
+ settings: JSON.parse(row.settings),
22
+ pluginId: row.plugin_id,
23
+ source: row.source,
24
+ schemaVersion: row.schema_version,
25
+ isSystem: row.is_system === 1,
26
+ isActive: row.is_active === 1,
27
+ isAuth: row.is_auth === 1,
28
+ createdAt: row.created_at,
29
+ updatedAt: row.updated_at
30
+ };
31
+ }
32
+ var DocumentTypeRegistry = class {
33
+ constructor(db) {
34
+ this.db = db;
35
+ }
36
+ cache = /* @__PURE__ */ new Map();
37
+ // Register or update a document type. Idempotent: bumps schema_version only when schema changes.
38
+ async register(def) {
39
+ const now = Math.floor(Date.now() / 1e3);
40
+ const existing = await this.findById(def.id);
41
+ const schemaJson = JSON.stringify({ queryableFields: def.queryableFields ?? [], settings: def.settings ?? {} });
42
+ const queryableJson = JSON.stringify(def.queryableFields ?? []);
43
+ const settingsJson = JSON.stringify(def.settings ?? {});
44
+ if (existing) {
45
+ const schemaChanged = schemaJson !== JSON.stringify(existing.schema);
46
+ const newVersion = schemaChanged ? existing.schemaVersion + 1 : existing.schemaVersion;
47
+ await this.db.prepare(
48
+ `UPDATE document_types SET
49
+ display_name = ?,
50
+ description = ?,
51
+ schema = ?,
52
+ queryable_fields = ?,
53
+ settings = ?,
54
+ plugin_id = ?,
55
+ schema_version = ?,
56
+ is_active = 1,
57
+ is_auth = ?,
58
+ updated_at = ?
59
+ WHERE id = ?`
60
+ ).bind(
61
+ def.displayName,
62
+ def.description ?? null,
63
+ schemaJson,
64
+ queryableJson,
65
+ settingsJson,
66
+ def.pluginId ?? null,
67
+ newVersion,
68
+ def.isAuth ? 1 : 0,
69
+ now,
70
+ def.id
71
+ ).run();
72
+ await chunkDSA4UX5B_cjs.ensureScalarSchema(this.db, def.id, def.queryableFields ?? []);
73
+ const updated = await this.findById(def.id);
74
+ this.cache.set(def.id, updated);
75
+ return updated;
76
+ }
77
+ await this.db.prepare(
78
+ `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)
79
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, 1, 0, 1, ?, ?, ?)`
80
+ ).bind(
81
+ def.id,
82
+ def.name ?? def.id,
83
+ def.displayName,
84
+ def.description ?? null,
85
+ schemaJson,
86
+ queryableJson,
87
+ settingsJson,
88
+ def.pluginId ?? null,
89
+ def.source ?? "code",
90
+ def.isAuth ? 1 : 0,
91
+ now,
92
+ now
93
+ ).run();
94
+ await chunkDSA4UX5B_cjs.ensureScalarSchema(this.db, def.id, def.queryableFields ?? []);
95
+ const created = await this.findById(def.id);
96
+ this.cache.set(def.id, created);
97
+ return created;
98
+ }
99
+ async findById(id) {
100
+ if (this.cache.has(id)) return this.cache.get(id);
101
+ const row = await this.db.prepare("SELECT * FROM document_types WHERE id = ?").bind(id).first();
102
+ if (!row) return null;
103
+ const dt = rowToDocumentType(row);
104
+ this.cache.set(id, dt);
105
+ return dt;
106
+ }
107
+ async findAll(activeOnly = true) {
108
+ const sql = activeOnly ? "SELECT * FROM document_types WHERE is_active = 1 ORDER BY name" : "SELECT * FROM document_types ORDER BY name";
109
+ const result = await this.db.prepare(sql).all();
110
+ return (result.results ?? []).map(rowToDocumentType);
111
+ }
112
+ async deactivate(id) {
113
+ const now = Math.floor(Date.now() / 1e3);
114
+ await this.db.prepare("UPDATE document_types SET is_active = 0, updated_at = ? WHERE id = ?").bind(now, id).run();
115
+ this.cache.delete(id);
116
+ }
117
+ clearCache() {
118
+ this.cache.clear();
119
+ }
120
+ };
121
+
122
+ // src/services/document-types-seed.ts
123
+ var anyObject = zod.z.record(zod.z.string(), zod.z.unknown());
124
+ async function bootstrapDocumentTypes(db) {
125
+ const registry = new DocumentTypeRegistry(db);
126
+ await registry.register({
127
+ id: "site_settings",
128
+ name: "site_settings",
129
+ displayName: "Site Settings",
130
+ description: "Global site configuration (internal; managed via admin settings UI)",
131
+ source: "system",
132
+ schema: anyObject,
133
+ settings: {
134
+ internal: true,
135
+ maxVersionsPerRoot: 1,
136
+ baseGrants: { admin: ["read", "create", "update", "delete", "manage"] }
137
+ },
138
+ queryableFields: []
139
+ });
140
+ await registry.register({
141
+ id: "blog_post",
142
+ name: "blog_post",
143
+ displayName: "Blog Post",
144
+ description: "Blog post (document-backed; edited via the content collection UI)",
145
+ source: "system",
146
+ schema: anyObject,
147
+ settings: {
148
+ baseGrants: { public: ["read"], admin: ["read", "create", "update", "delete", "publish", "manage"], editor: ["read", "create", "update", "publish"], viewer: ["read"] },
149
+ maxVersionsPerRoot: 50
150
+ },
151
+ queryableFields: [
152
+ { name: "difficulty", kind: "scalar", type: "text", column: "q_blog_difficulty" },
153
+ { name: "author", kind: "scalar", type: "text", column: "q_blog_author" }
154
+ ]
155
+ });
156
+ await registry.register({
157
+ id: "plugin",
158
+ name: "plugin",
159
+ displayName: "Plugin",
160
+ description: "System plugin record (managed by the plugin bootstrap service)",
161
+ source: "system",
162
+ schema: anyObject,
163
+ settings: {
164
+ baseGrants: { admin: ["read", "create", "update", "delete", "publish", "manage"] },
165
+ maxVersionsPerRoot: 1,
166
+ internal: true
167
+ },
168
+ queryableFields: [
169
+ { name: "status", kind: "scalar", type: "text", column: "q_plugin_status" },
170
+ { name: "category", kind: "scalar", type: "text", column: "q_plugin_category" },
171
+ { name: "isCore", kind: "scalar", type: "integer", column: "q_plugin_is_core" }
172
+ ]
173
+ });
174
+ await registry.register({
175
+ id: "tenant",
176
+ name: "tenant",
177
+ displayName: "Tenant",
178
+ description: "Tenant record (managed by the multi-tenant plugin; slug = tenant id)",
179
+ source: "system",
180
+ schema: anyObject,
181
+ settings: {
182
+ baseGrants: { admin: ["read", "create", "update", "delete", "manage"] },
183
+ maxVersionsPerRoot: 1,
184
+ internal: true
185
+ },
186
+ queryableFields: [
187
+ { name: "status", kind: "scalar", type: "text", column: "q_tenant_status" },
188
+ { name: "domain", kind: "scalar", type: "text", column: "q_tenant_domain" }
189
+ ]
190
+ });
191
+ await registry.register({
192
+ id: "user_profile",
193
+ name: "user_profile",
194
+ displayName: "User Profile",
195
+ description: "Per-user profile record (auth-owned; one document per user, slug = userId)",
196
+ source: "system",
197
+ isAuth: true,
198
+ schema: anyObject,
199
+ settings: {
200
+ // Hidden from the content admin surfaces; a single mutable record (no version history).
201
+ internal: true,
202
+ maxVersionsPerRoot: 1,
203
+ pii: true,
204
+ baseGrants: { admin: ["read", "create", "update", "delete", "manage"] }
205
+ },
206
+ queryableFields: []
207
+ });
208
+ await registry.register({
209
+ id: "media_asset",
210
+ name: "media_asset",
211
+ displayName: "Media Asset",
212
+ description: "Uploaded media file metadata (managed via the media library; backs an R2 object)",
213
+ source: "system",
214
+ schema: anyObject,
215
+ settings: {
216
+ internal: true,
217
+ maxVersionsPerRoot: 5,
218
+ baseGrants: {
219
+ admin: ["read", "create", "update", "delete", "manage"],
220
+ editor: ["read", "create", "update"],
221
+ author: ["read", "create"],
222
+ viewer: ["read"]
223
+ }
224
+ },
225
+ queryableFields: [
226
+ { name: "mimeType", kind: "scalar", type: "text", column: "q_media_mime" },
227
+ { name: "folder", kind: "scalar", type: "text", column: "q_media_folder" },
228
+ { name: "size", kind: "scalar", type: "integer", column: "q_media_size" },
229
+ { name: "tags", kind: "facet", type: "text" }
230
+ ]
231
+ });
232
+ await registry.register({
233
+ id: "plugin_activity",
234
+ name: "plugin_activity",
235
+ displayName: "Plugin Activity",
236
+ description: "Plugin lifecycle event log (installed/activated/deactivated/settings_updated/error)",
237
+ source: "system",
238
+ schema: anyObject,
239
+ settings: {
240
+ internal: true,
241
+ maxVersionsPerRoot: 1,
242
+ baseGrants: { admin: ["read", "create", "manage"] }
243
+ },
244
+ queryableFields: [
245
+ { name: "pluginId", kind: "scalar", type: "text", column: "q_plugin_activity_plugin_id" },
246
+ { name: "action", kind: "scalar", type: "text", column: "q_plugin_activity_action" }
247
+ ]
248
+ });
249
+ await registry.register({
250
+ id: "security_event",
251
+ name: "security_event",
252
+ displayName: "Security Event",
253
+ description: "Security audit event (login attempts, lockouts, suspicious activity)",
254
+ source: "system",
255
+ schema: anyObject,
256
+ settings: {
257
+ internal: true,
258
+ maxVersionsPerRoot: 1,
259
+ baseGrants: { admin: ["read", "create", "manage"] }
260
+ },
261
+ queryableFields: [
262
+ { name: "eventType", kind: "scalar", type: "text", column: "q_sa_event_type" },
263
+ { name: "severity", kind: "scalar", type: "text", column: "q_sa_severity" },
264
+ { name: "userId", kind: "scalar", type: "text", column: "q_sa_user_id" },
265
+ { name: "email", kind: "scalar", type: "text", column: "q_sa_email" },
266
+ { name: "ipAddress", kind: "scalar", type: "text", column: "q_sa_ip_address" },
267
+ { name: "blocked", kind: "scalar", type: "integer", column: "q_sa_blocked" }
268
+ ]
269
+ });
270
+ await registry.register({
271
+ id: "analytics_event",
272
+ name: "analytics_event",
273
+ displayName: "Analytics Event",
274
+ description: "Tracked analytics event (page view, user action, custom event)",
275
+ source: "system",
276
+ schema: anyObject,
277
+ settings: {
278
+ internal: true,
279
+ maxVersionsPerRoot: 1,
280
+ baseGrants: { admin: ["read", "create", "manage"] }
281
+ },
282
+ queryableFields: [
283
+ { name: "event", kind: "scalar", type: "text", column: "q_evt_event" },
284
+ { name: "category", kind: "scalar", type: "text", column: "q_evt_category" },
285
+ { name: "userId", kind: "scalar", type: "text", column: "q_evt_user_id" },
286
+ { name: "sessionId", kind: "scalar", type: "text", column: "q_evt_session_id" },
287
+ { name: "path", kind: "scalar", type: "text", column: "q_evt_path" }
288
+ ]
289
+ });
290
+ await registry.register({
291
+ id: "media_asset",
292
+ name: "media_asset",
293
+ displayName: "Media Asset",
294
+ description: "Media file metadata (R2 object key + intrinsic properties; URL derived at read time)",
295
+ source: "system",
296
+ schema: anyObject,
297
+ settings: {
298
+ baseGrants: { public: ["read"], admin: ["read", "create", "update", "delete", "publish", "manage"], editor: ["read", "create", "update"] },
299
+ maxVersionsPerRoot: 5
300
+ },
301
+ queryableFields: [
302
+ { name: "mimeType", kind: "scalar", type: "text", column: "q_media_mime" },
303
+ { name: "folder", kind: "scalar", type: "text", column: "q_media_folder" },
304
+ { name: "size", kind: "scalar", type: "integer", column: "q_media_size" },
305
+ { name: "tags", kind: "facet", type: "text" }
306
+ ]
307
+ });
308
+ for (const [id, displayName, description] of [
309
+ ["rbac_role", "RBAC Role", "Role record with embedded grants (auth-owned)"],
310
+ ["rbac_verb", "RBAC Verb", "Permission verb (auth-owned)"],
311
+ ["rbac_user_roles", "RBAC User Roles", "Per-user role assignments (auth-owned; slug = userId)"]
312
+ ]) {
313
+ await registry.register({
314
+ id,
315
+ name: id,
316
+ displayName,
317
+ description,
318
+ source: "system",
319
+ isAuth: true,
320
+ schema: anyObject,
321
+ settings: {
322
+ internal: true,
323
+ maxVersionsPerRoot: 1,
324
+ baseGrants: { admin: ["read", "create", "update", "delete", "manage"] }
325
+ },
326
+ queryableFields: []
327
+ });
328
+ }
329
+ }
330
+ async function autoRegisterCollectionDocumentTypes(db) {
331
+ const registry = new DocumentTypeRegistry(db);
332
+ const collections = chunkQAYFOER6_cjs.getCollectionRegistry().listActive();
333
+ const registered = [];
334
+ for (const collection of collections) {
335
+ if (collection.internal) continue;
336
+ if (collection.name === "blog_post") continue;
337
+ try {
338
+ await registry.register({
339
+ id: collection.name,
340
+ name: collection.name,
341
+ displayName: collection.displayName,
342
+ description: collection.description,
343
+ source: "system",
344
+ schema: anyObject,
345
+ settings: {
346
+ baseGrants: {
347
+ public: ["read"],
348
+ admin: ["read", "create", "update", "delete", "publish", "manage"],
349
+ editor: ["read", "create", "update", "publish"],
350
+ viewer: ["read"]
351
+ },
352
+ maxVersionsPerRoot: 50,
353
+ ...collection.versioning ? { versioning: true } : {}
354
+ },
355
+ queryableFields: []
356
+ });
357
+ registered.push(collection.name);
358
+ } catch (error) {
359
+ console.error(`[document-types-seed] Failed to register collection "${collection.name}":`, error);
360
+ }
361
+ }
362
+ return registered;
363
+ }
364
+
9
365
  // src/middleware/bootstrap.ts
10
366
  var bootstrapComplete = false;
11
367
  function verifySecurityConfig(env) {
@@ -47,6 +403,9 @@ function verifySecurityConfig(env) {
47
403
  }
48
404
  function bootstrapMiddleware(config = {}) {
49
405
  return async (c, next) => {
406
+ if (chunkJ6JTWD2A_cjs.hasHookSystem()) {
407
+ c.set("hookSystem", chunkJ6JTWD2A_cjs.getHookSystem());
408
+ }
50
409
  if (bootstrapComplete) {
51
410
  return next();
52
411
  }
@@ -56,24 +415,52 @@ function bootstrapMiddleware(config = {}) {
56
415
  }
57
416
  try {
58
417
  console.log("[Bootstrap] Starting system initialization...");
59
- console.log("[Bootstrap] Running database migrations...");
60
- const migrationService = new chunkC54YUA23_cjs.MigrationService(c.env.DB);
61
- await migrationService.runPendingMigrations();
62
- console.log("[Bootstrap] Syncing collection configurations...");
418
+ console.log("[Bootstrap] Checking schema compatibility...");
419
+ const migrationService = new chunkDSA4UX5B_cjs.MigrationService(c.env.DB);
420
+ await migrationService.ensureSchemaCompatibility();
63
421
  try {
64
- await chunkT3Q5V33G_cjs.syncCollections(c.env.DB);
422
+ const kv = c.env.CACHE_KV;
423
+ if (kv) {
424
+ const { setGlobalKVNamespace } = await import('./cache-LVYS4BPL.cjs');
425
+ setGlobalKVNamespace(kv);
426
+ }
65
427
  } catch (error) {
66
- console.error("[Bootstrap] Error syncing collections:", error);
428
+ console.error("[Bootstrap] Error wiring CACHE_KV namespace:", error);
67
429
  }
68
- console.log("[Bootstrap] Syncing form collections...");
430
+ console.log("[Bootstrap] Populating collection registry...");
69
431
  try {
70
- await chunkT3Q5V33G_cjs.syncAllFormCollections(c.env.DB);
432
+ const configs = await chunkQAYFOER6_cjs.loadCollectionConfigs();
433
+ chunkQAYFOER6_cjs.getCollectionRegistry().register(configs);
434
+ console.log(`[Bootstrap] Registry populated with ${configs.length} collection(s)`);
71
435
  } catch (error) {
72
- console.error("[Bootstrap] Error syncing form collections:", error);
436
+ console.error("[Bootstrap] Error populating collection registry:", error);
437
+ }
438
+ console.log("[Bootstrap] Registering document types...");
439
+ try {
440
+ await bootstrapDocumentTypes(c.env.DB);
441
+ } catch (error) {
442
+ console.error("[Bootstrap] Error registering document types:", error);
443
+ }
444
+ try {
445
+ await repairMissingCredentialAccounts(c.env.DB);
446
+ } catch (error) {
447
+ console.error("[Bootstrap] Error repairing credential accounts:", error);
448
+ }
449
+ try {
450
+ const { RbacService: RbacService2 } = await import('./rbac-VONLJJKB.cjs');
451
+ await new RbacService2(c.env.DB, c.env.CACHE_KV).ensureSystemRbacSeed();
452
+ } catch (error) {
453
+ console.error("[Bootstrap] Error seeding RBAC documents:", error);
454
+ }
455
+ try {
456
+ const auto = await autoRegisterCollectionDocumentTypes(c.env.DB);
457
+ if (auto.length) console.log(`[Bootstrap] Document-backed collections registered: ${auto.join(", ")}`);
458
+ } catch (error) {
459
+ console.error("[Bootstrap] Error auto-registering collection document types:", error);
73
460
  }
74
461
  if (!config.plugins?.disableAll) {
75
462
  console.log("[Bootstrap] Bootstrapping core plugins...");
76
- const bootstrapService = new chunkT3Q5V33G_cjs.PluginBootstrapService(c.env.DB);
463
+ const bootstrapService = new chunkQAYFOER6_cjs.PluginBootstrapService(c.env.DB);
77
464
  const needsBootstrap = await bootstrapService.isBootstrapNeeded();
78
465
  if (needsBootstrap) {
79
466
  await bootstrapService.bootstrapCorePlugins();
@@ -90,6 +477,27 @@ function bootstrapMiddleware(config = {}) {
90
477
  return next();
91
478
  };
92
479
  }
480
+ async function repairMissingCredentialAccounts(db) {
481
+ const { results } = await db.prepare(`
482
+ SELECT u.id, u.password_hash
483
+ FROM auth_user u
484
+ WHERE u.password_hash IS NOT NULL AND u.password_hash != ''
485
+ AND NOT EXISTS (
486
+ SELECT 1 FROM auth_account a
487
+ WHERE a.user_id = u.id AND a.provider_id = 'credential'
488
+ )
489
+ `).all();
490
+ if (!results.length) return;
491
+ console.log(`[Bootstrap] Repairing ${results.length} user(s) missing credential auth_account rows`);
492
+ const nowSec = Math.floor(Date.now() / 1e3);
493
+ for (const user of results) {
494
+ await db.prepare(`
495
+ INSERT OR IGNORE INTO auth_account (id, user_id, account_id, provider_id, password, created_at, updated_at)
496
+ VALUES (?, ?, ?, 'credential', ?, ?, ?)
497
+ `).bind(`cred-${user.id}`, user.id, user.id, user.password_hash, nowSec, nowSec).run();
498
+ }
499
+ console.log(`[Bootstrap] Credential account repair complete (${results.length} repaired)`);
500
+ }
93
501
  var JWT_SECRET_FALLBACK = "your-super-secret-jwt-key-change-in-production";
94
502
  var DEFAULT_JWT_EXPIRES_IN_SECONDS = 60 * 60 * 24 * 30;
95
503
  function parseDuration(input) {
@@ -121,14 +529,10 @@ async function getJwtExpirySecondsFromDb(db, env) {
121
529
  if (envParsed) return envParsed;
122
530
  if (db) {
123
531
  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);
532
+ 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();
533
+ if (row?.data) {
534
+ const data = JSON.parse(row.data);
535
+ const parsed = parseDuration(data.jwtExpiresIn);
132
536
  if (parsed) return parsed;
133
537
  }
134
538
  } catch (err) {
@@ -143,14 +547,10 @@ async function getJwtRefreshGraceSecondsFromDb(db, env) {
143
547
  if (envParsed) return envParsed;
144
548
  if (db) {
145
549
  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);
550
+ 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();
551
+ if (row?.data) {
552
+ const data = JSON.parse(row.data);
553
+ const parsed = parseDuration(data.jwtRefreshGraceSeconds?.toString());
154
554
  if (parsed) return parsed;
155
555
  }
156
556
  } catch (err) {
@@ -200,7 +600,7 @@ async function verifyHs256Signature(token, secret) {
200
600
  return false;
201
601
  }
202
602
  }
203
- var AuthManager = class {
603
+ var AuthManager = class _AuthManager {
204
604
  static async generateToken(userId, email, role, secret, expiresInSeconds) {
205
605
  const ttl = expiresInSeconds && expiresInSeconds > 0 ? Math.floor(expiresInSeconds) : DEFAULT_JWT_EXPIRES_IN_SECONDS;
206
606
  const now = Math.floor(Date.now() / 1e3);
@@ -216,6 +616,13 @@ var AuthManager = class {
216
616
  /**
217
617
  * Verify a token's signature and expiration.
218
618
  *
619
+ * IMPORTANT: pass the `JWT_SECRET` binding (e.g. `c.env.JWT_SECRET`) as the
620
+ * `secret` argument. If omitted, this falls back to a development-only
621
+ * placeholder secret — tokens signed with the real `JWT_SECRET` will then
622
+ * silently fail verification. From inside a Hono handler prefer
623
+ * `AuthManager.verifyAuthRequest(c)`, which handles header/cookie extraction
624
+ * and pulls the secret from `c.env` for you.
625
+ *
219
626
  * If `graceSeconds` > 0, tokens whose `exp` is within the grace window
220
627
  * (i.e. expired by no more than `graceSeconds`) are still returned. This
221
628
  * supports a sliding-session refresh endpoint that accepts recently-expired
@@ -251,6 +658,26 @@ var AuthManager = class {
251
658
  return null;
252
659
  }
253
660
  }
661
+ /**
662
+ * Verify the JWT on an incoming Hono request using the `JWT_SECRET`
663
+ * binding from `c.env`. Reads the token from the `Authorization: Bearer …`
664
+ * header first, then falls back to the `auth_token` cookie. Returns the
665
+ * decoded payload, or null when the token is missing, malformed, expired,
666
+ * or signed with a different secret.
667
+ *
668
+ * Use this from custom Hono routes mounted alongside SonicJS — it
669
+ * resolves the secret the same way `requireAuth()` does, without forcing
670
+ * the caller to plumb it through manually.
671
+ */
672
+ static async verifyAuthRequest(c) {
673
+ let token = c.req.header("Authorization")?.replace("Bearer ", "");
674
+ if (!token) {
675
+ token = cookie.getCookie(c, "auth_token");
676
+ }
677
+ if (!token) return null;
678
+ const secret = c.env?.JWT_SECRET;
679
+ return await _AuthManager.verifyToken(token, secret);
680
+ }
254
681
  static async hashPassword(password) {
255
682
  const iterations = 1e5;
256
683
  const salt = new Uint8Array(16);
@@ -349,52 +776,15 @@ var AuthManager = class {
349
776
  };
350
777
  var requireAuth = () => {
351
778
  return async (c, next) => {
352
- try {
353
- let token = c.req.header("Authorization")?.replace("Bearer ", "");
354
- if (!token) {
355
- token = cookie.getCookie(c, "auth_token");
356
- }
357
- if (!token) {
358
- const acceptHeader = c.req.header("Accept") || "";
359
- if (acceptHeader.includes("text/html")) {
360
- return c.redirect("/auth/login?error=Please login to access the admin area");
361
- }
362
- return c.json({ error: "Authentication required" }, 401);
363
- }
364
- const kv = c.env?.KV;
365
- let payload = null;
366
- if (kv) {
367
- const cacheKey = `auth:${token.substring(0, 20)}`;
368
- const cached = await kv.get(cacheKey, "json");
369
- if (cached) {
370
- payload = cached;
371
- }
372
- }
373
- if (!payload) {
374
- const jwtSecret = c.env?.JWT_SECRET;
375
- payload = await AuthManager.verifyToken(token, jwtSecret);
376
- if (payload && kv) {
377
- const cacheKey = `auth:${token.substring(0, 20)}`;
378
- await kv.put(cacheKey, JSON.stringify(payload), { expirationTtl: 300 });
379
- }
380
- }
381
- if (!payload) {
382
- const acceptHeader = c.req.header("Accept") || "";
383
- if (acceptHeader.includes("text/html")) {
384
- return c.redirect("/auth/login?error=Your session has expired, please login again");
385
- }
386
- return c.json({ error: "Invalid or expired token" }, 401);
387
- }
388
- c.set("user", payload);
389
- return await next();
390
- } catch (error) {
391
- console.error("Auth middleware error:", error);
779
+ const user = c.get("user");
780
+ if (!user) {
392
781
  const acceptHeader = c.req.header("Accept") || "";
393
782
  if (acceptHeader.includes("text/html")) {
394
- return c.redirect("/auth/login?error=Authentication failed, please login again");
783
+ return c.redirect("/auth/login?error=Please login to access the admin area");
395
784
  }
396
- return c.json({ error: "Authentication failed" }, 401);
785
+ return c.json({ error: "Authentication required" }, 401);
397
786
  }
787
+ return await next();
398
788
  };
399
789
  };
400
790
  var requireRole = (requiredRole) => {
@@ -418,25 +808,36 @@ var requireRole = (requiredRole) => {
418
808
  return await next();
419
809
  };
420
810
  };
421
- var optionalAuth = () => {
811
+ var requireRbac = (resource, verb) => {
422
812
  return async (c, next) => {
423
- try {
424
- let token = c.req.header("Authorization")?.replace("Bearer ", "");
425
- if (!token) {
426
- token = cookie.getCookie(c, "auth_token");
813
+ const user = c.get("user");
814
+ if (!user) {
815
+ const acceptHeader = c.req.header("Accept") || "";
816
+ if (acceptHeader.includes("text/html")) {
817
+ return c.redirect("/auth/login?error=Please login to access the admin area");
427
818
  }
428
- if (token) {
429
- const jwtSecret = c.env?.JWT_SECRET;
430
- const payload = await AuthManager.verifyToken(token, jwtSecret);
431
- if (payload) {
432
- c.set("user", payload);
433
- }
819
+ return c.json({ error: "Authentication required" }, 401);
820
+ }
821
+ const cachedPerms = c.get("rbacPerms");
822
+ let allowed;
823
+ if (cachedPerms !== void 0) {
824
+ allowed = cachedPerms.includes(`${resource}:${verb}`);
825
+ } else {
826
+ allowed = await new chunk2CB4KY7I_cjs.RbacService(c.env.DB).can(user.userId, resource, verb);
827
+ }
828
+ if (!allowed) {
829
+ const acceptHeader = c.req.header("Accept") || "";
830
+ if (acceptHeader.includes("text/html")) {
831
+ return c.redirect("/auth/login?error=You do not have permission to access this area");
434
832
  }
435
- return await next();
436
- } catch (error) {
437
- console.error("Optional auth error:", error);
438
- return await next();
833
+ return c.json({ error: "Insufficient permissions" }, 403);
439
834
  }
835
+ return await next();
836
+ };
837
+ };
838
+ var optionalAuth = () => {
839
+ return async (_c, next) => {
840
+ return await next();
440
841
  };
441
842
  };
442
843
 
@@ -504,11 +905,17 @@ var DEFAULT_EXEMPT_PATHS = [
504
905
  "/auth/login",
505
906
  "/auth/register",
506
907
  "/auth/seed-admin",
908
+ "/test-seed-defaults",
909
+ "/test-cleanup",
507
910
  "/auth/accept-invitation",
508
911
  "/auth/reset-password",
509
912
  "/auth/request-password-reset",
510
913
  "/auth/otp",
511
914
  "/auth/magic-link",
915
+ "/auth/sign-out",
916
+ "/auth/sign-in",
917
+ "/auth/sign-up",
918
+ "/auth/get-session",
512
919
  "/auth/verify",
513
920
  "/api/stripe/webhook",
514
921
  "/api/events"
@@ -672,6 +1079,45 @@ var securityHeadersMiddleware = () => {
672
1079
  };
673
1080
  };
674
1081
 
1082
+ // src/middleware/plugin-middleware.ts
1083
+ async function isPluginActive(db, pluginId) {
1084
+ try {
1085
+ const docResult = await db.prepare(
1086
+ `SELECT json_extract(data, '$.status') as status FROM documents
1087
+ WHERE slug = ? AND type_id = 'plugin' AND tenant_id = 'default'
1088
+ AND is_current_draft = 1 AND deleted_at IS NULL`
1089
+ ).bind(pluginId).first();
1090
+ return docResult?.status === "active";
1091
+ } catch (error) {
1092
+ console.error(`[isPluginActive] Error checking plugin status for ${pluginId}:`, error);
1093
+ return false;
1094
+ }
1095
+ }
1096
+ async function requireActivePlugin(db, pluginId) {
1097
+ const isActive = await isPluginActive(db, pluginId);
1098
+ if (!isActive) {
1099
+ throw new Error(`Plugin '${pluginId}' is required but is not active`);
1100
+ }
1101
+ }
1102
+ async function requireActivePlugins(db, pluginIds) {
1103
+ for (const pluginId of pluginIds) {
1104
+ await requireActivePlugin(db, pluginId);
1105
+ }
1106
+ }
1107
+ async function getActivePlugins(db) {
1108
+ try {
1109
+ const { results } = await db.prepare(
1110
+ `SELECT slug as id, json_extract(data, '$.status') as status, data FROM documents
1111
+ WHERE type_id = 'plugin' AND tenant_id = 'default'
1112
+ AND q_plugin_status = 'active' AND is_current_draft = 1 AND deleted_at IS NULL`
1113
+ ).all();
1114
+ return results || [];
1115
+ } catch (error) {
1116
+ console.error("[getActivePlugins] Error fetching active plugins:", error);
1117
+ return [];
1118
+ }
1119
+ }
1120
+
675
1121
  // src/middleware/index.ts
676
1122
  var loggingMiddleware = () => async (_c, next) => await next();
677
1123
  var detailedLoggingMiddleware = () => async (_c, next) => await next();
@@ -684,13 +1130,11 @@ var requirePermission = () => async (_c, next) => await next();
684
1130
  var requireAnyPermission = () => async (_c, next) => await next();
685
1131
  var logActivity = () => {
686
1132
  };
687
- var requireActivePlugin = () => async (_c, next) => await next();
688
- var requireActivePlugins = () => async (_c, next) => await next();
689
- var getActivePlugins = () => [];
690
- var isPluginActive = () => false;
691
1133
 
692
1134
  exports.AuthManager = AuthManager;
1135
+ exports.DocumentTypeRegistry = DocumentTypeRegistry;
693
1136
  exports.PermissionManager = PermissionManager;
1137
+ exports.bootstrapDocumentTypes = bootstrapDocumentTypes;
694
1138
  exports.bootstrapMiddleware = bootstrapMiddleware;
695
1139
  exports.cacheHeaders = cacheHeaders;
696
1140
  exports.compressionMiddleware = compressionMiddleware;
@@ -713,10 +1157,11 @@ exports.requireActivePlugins = requireActivePlugins;
713
1157
  exports.requireAnyPermission = requireAnyPermission;
714
1158
  exports.requireAuth = requireAuth;
715
1159
  exports.requirePermission = requirePermission;
1160
+ exports.requireRbac = requireRbac;
716
1161
  exports.requireRole = requireRole;
717
1162
  exports.securityHeadersMiddleware = securityHeadersMiddleware;
718
1163
  exports.securityLoggingMiddleware = securityLoggingMiddleware;
719
1164
  exports.validateCsrfToken = validateCsrfToken;
720
1165
  exports.verifySecurityConfig = verifySecurityConfig;
721
- //# sourceMappingURL=chunk-DSUJ5YQH.cjs.map
722
- //# sourceMappingURL=chunk-DSUJ5YQH.cjs.map
1166
+ //# sourceMappingURL=chunk-AAWNRBRB.cjs.map
1167
+ //# sourceMappingURL=chunk-AAWNRBRB.cjs.map