@sonicjs-cms/core 3.0.0-beta.24 → 3.0.0-beta.25

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 (137) hide show
  1. package/bin/db-reset.js +39 -22
  2. package/dist/admin-documents-form.template-JWV5GITD.js +6 -0
  3. package/dist/{admin-documents-form.template-55V2ZGWT.js.map → admin-documents-form.template-JWV5GITD.js.map} +1 -1
  4. package/dist/admin-documents-form.template-UWKGVAMW.cjs +19 -0
  5. package/dist/{admin-layout-catalyst.template-6UQGLCKI.js.map → admin-documents-form.template-UWKGVAMW.cjs.map} +1 -1
  6. package/dist/admin-layout-catalyst.template-MOQ3BBXA.cjs +21 -0
  7. package/dist/{admin-layout-catalyst.template-3XZXDGF7.cjs.map → admin-layout-catalyst.template-MOQ3BBXA.cjs.map} +1 -1
  8. package/dist/admin-layout-catalyst.template-WCYMQVTZ.js +7 -0
  9. package/dist/{admin-documents-form.template-YNAVMJCV.cjs.map → admin-layout-catalyst.template-WCYMQVTZ.js.map} +1 -1
  10. package/dist/{chunk-RJ2O5IIE.js → chunk-2D3A4X52.js} +2 -2
  11. package/dist/{chunk-RJ2O5IIE.js.map → chunk-2D3A4X52.js.map} +1 -1
  12. package/dist/{chunk-FHPEM77Y.js → chunk-2OXFMMA3.js} +11 -10
  13. package/dist/chunk-2OXFMMA3.js.map +1 -0
  14. package/dist/{chunk-SOZUG52O.js → chunk-3KGY4IBW.js} +3 -3
  15. package/dist/{chunk-SOZUG52O.js.map → chunk-3KGY4IBW.js.map} +1 -1
  16. package/dist/{chunk-I767LVN7.cjs → chunk-6OA77UM7.cjs} +757 -471
  17. package/dist/chunk-6OA77UM7.cjs.map +1 -0
  18. package/dist/{chunk-URIBTX27.js → chunk-73RTFFMX.js} +3 -3
  19. package/dist/{chunk-URIBTX27.js.map → chunk-73RTFFMX.js.map} +1 -1
  20. package/dist/{chunk-VC5XVPLM.js → chunk-7P5OCUPS.js} +424 -138
  21. package/dist/chunk-7P5OCUPS.js.map +1 -0
  22. package/dist/{chunk-3TMTYJAJ.js → chunk-BDQ55MWV.js} +18 -2
  23. package/dist/chunk-BDQ55MWV.js.map +1 -0
  24. package/dist/{chunk-KKNEYIZJ.cjs → chunk-BJ6NJL2E.cjs} +7 -12
  25. package/dist/chunk-BJ6NJL2E.cjs.map +1 -0
  26. package/dist/{chunk-VGEZNFWH.js → chunk-C54MH5UI.js} +5 -4
  27. package/dist/chunk-C54MH5UI.js.map +1 -0
  28. package/dist/{chunk-BBEKHLTW.cjs → chunk-CN3T3TDI.cjs} +9 -9
  29. package/dist/{chunk-BBEKHLTW.cjs.map → chunk-CN3T3TDI.cjs.map} +1 -1
  30. package/dist/{chunk-LNI3FYSI.js → chunk-CWIGQYRR.js} +7 -12
  31. package/dist/chunk-CWIGQYRR.js.map +1 -0
  32. package/dist/{chunk-BP52BFIV.cjs → chunk-D6FWEYQE.cjs} +6 -5
  33. package/dist/chunk-D6FWEYQE.cjs.map +1 -0
  34. package/dist/{chunk-UIHIXTIS.js → chunk-D7RLBBHE.js} +2 -2
  35. package/dist/{chunk-UIHIXTIS.js.map → chunk-D7RLBBHE.js.map} +1 -1
  36. package/dist/{chunk-IXUHXTHW.cjs → chunk-DLTT7QZU.cjs} +17 -6
  37. package/dist/chunk-DLTT7QZU.cjs.map +1 -0
  38. package/dist/{chunk-BHND5PEV.js → chunk-E3TQG7AA.js} +3 -3
  39. package/dist/{chunk-BHND5PEV.js.map → chunk-E3TQG7AA.js.map} +1 -1
  40. package/dist/{chunk-37V3RET3.cjs → chunk-E7E3NL3Y.cjs} +24 -23
  41. package/dist/chunk-E7E3NL3Y.cjs.map +1 -0
  42. package/dist/{chunk-VYQVDL2M.js → chunk-F26HP3B6.js} +36 -5
  43. package/dist/chunk-F26HP3B6.js.map +1 -0
  44. package/dist/{chunk-QZGABF2M.js → chunk-FVAK4C6L.js} +17 -6
  45. package/dist/chunk-FVAK4C6L.js.map +1 -0
  46. package/dist/{chunk-BJROXF4N.js → chunk-HSDJDWLV.js} +19 -4
  47. package/dist/chunk-HSDJDWLV.js.map +1 -0
  48. package/dist/{chunk-QJUJNTIU.cjs → chunk-I7MIRRFJ.cjs} +43 -12
  49. package/dist/chunk-I7MIRRFJ.cjs.map +1 -0
  50. package/dist/{chunk-LTZ5WYOK.cjs → chunk-JCBDXEY2.cjs} +18 -2
  51. package/dist/chunk-JCBDXEY2.cjs.map +1 -0
  52. package/dist/{chunk-UYJQDDEE.cjs → chunk-MI2YXCK4.cjs} +14 -8
  53. package/dist/chunk-MI2YXCK4.cjs.map +1 -0
  54. package/dist/{chunk-A2SN3RVL.cjs → chunk-MOGK3U4A.cjs} +2 -2
  55. package/dist/{chunk-A2SN3RVL.cjs.map → chunk-MOGK3U4A.cjs.map} +1 -1
  56. package/dist/{chunk-E66UVONV.cjs → chunk-OUBUS74I.cjs} +24 -9
  57. package/dist/chunk-OUBUS74I.cjs.map +1 -0
  58. package/dist/{chunk-GMMCCIQO.cjs → chunk-RSBZITK3.cjs} +3 -3
  59. package/dist/{chunk-GMMCCIQO.cjs.map → chunk-RSBZITK3.cjs.map} +1 -1
  60. package/dist/{chunk-THFZSDIU.js → chunk-SXC4HPK6.js} +14 -8
  61. package/dist/chunk-SXC4HPK6.js.map +1 -0
  62. package/dist/{chunk-JMJM7DMM.cjs → chunk-TT3TQSCZ.cjs} +5 -5
  63. package/dist/{chunk-JMJM7DMM.cjs.map → chunk-TT3TQSCZ.cjs.map} +1 -1
  64. package/dist/{chunk-QCJHCSOK.cjs → chunk-YAURVGUK.cjs} +2 -2
  65. package/dist/{chunk-QCJHCSOK.cjs.map → chunk-YAURVGUK.cjs.map} +1 -1
  66. package/dist/config-4TIHSNW6.js +6 -0
  67. package/dist/{config-6FB2BXMP.js.map → config-4TIHSNW6.js.map} +1 -1
  68. package/dist/{config-OCH7S4WK.cjs → config-XN2ETAJ3.cjs} +5 -5
  69. package/dist/{config-OCH7S4WK.cjs.map → config-XN2ETAJ3.cjs.map} +1 -1
  70. package/dist/{define-plugin-D_6D9vVZ.d.ts → define-plugin-DDe8a_bh.d.ts} +3 -0
  71. package/dist/{define-plugin-DMcvEy_C.d.cts → define-plugin-rjXmGOgu.d.cts} +3 -0
  72. package/dist/index.cjs +408 -370
  73. package/dist/index.cjs.map +1 -1
  74. package/dist/index.d.cts +10 -2
  75. package/dist/index.d.ts +10 -2
  76. package/dist/index.js +67 -29
  77. package/dist/index.js.map +1 -1
  78. package/dist/middleware.cjs +35 -35
  79. package/dist/middleware.d.cts +4 -1
  80. package/dist/middleware.d.ts +4 -1
  81. package/dist/middleware.js +6 -6
  82. package/dist/migrations-JAHMI5MK.js +4 -0
  83. package/dist/{migrations-Z6D27NAW.js.map → migrations-JAHMI5MK.js.map} +1 -1
  84. package/dist/migrations-KU4V6T73.cjs +13 -0
  85. package/dist/{migrations-FGXZPKDC.cjs.map → migrations-KU4V6T73.cjs.map} +1 -1
  86. package/dist/plugins.cjs +40 -40
  87. package/dist/plugins.d.cts +1 -1
  88. package/dist/plugins.d.ts +1 -1
  89. package/dist/plugins.js +3 -3
  90. package/dist/rbac-AORZ6O3N.cjs +14 -0
  91. package/dist/{rbac-7QZ4JZ2E.cjs.map → rbac-AORZ6O3N.cjs.map} +1 -1
  92. package/dist/rbac-P44772FP.js +5 -0
  93. package/dist/{rbac-Y43IEQOP.js.map → rbac-P44772FP.js.map} +1 -1
  94. package/dist/routes.cjs +31 -31
  95. package/dist/routes.js +11 -11
  96. package/dist/services.cjs +18 -18
  97. package/dist/services.d.cts +1 -1
  98. package/dist/services.d.ts +1 -1
  99. package/dist/services.js +2 -2
  100. package/dist/{telemetry-Cku1ax74.d.cts → telemetry-QFlTv9f8.d.cts} +1 -1
  101. package/dist/{telemetry-Cku1ax74.d.ts → telemetry-QFlTv9f8.d.ts} +1 -1
  102. package/dist/templates.cjs +17 -17
  103. package/dist/templates.js +3 -3
  104. package/dist/types.d.cts +1 -1
  105. package/dist/types.d.ts +1 -1
  106. package/dist/utils.cjs +12 -12
  107. package/dist/utils.d.cts +1 -1
  108. package/dist/utils.d.ts +1 -1
  109. package/dist/utils.js +2 -2
  110. package/package.json +5 -10
  111. package/dist/admin-documents-form.template-55V2ZGWT.js +0 -6
  112. package/dist/admin-documents-form.template-YNAVMJCV.cjs +0 -19
  113. package/dist/admin-layout-catalyst.template-3XZXDGF7.cjs +0 -21
  114. package/dist/admin-layout-catalyst.template-6UQGLCKI.js +0 -7
  115. package/dist/chunk-37V3RET3.cjs.map +0 -1
  116. package/dist/chunk-3TMTYJAJ.js.map +0 -1
  117. package/dist/chunk-BJROXF4N.js.map +0 -1
  118. package/dist/chunk-BP52BFIV.cjs.map +0 -1
  119. package/dist/chunk-E66UVONV.cjs.map +0 -1
  120. package/dist/chunk-FHPEM77Y.js.map +0 -1
  121. package/dist/chunk-I767LVN7.cjs.map +0 -1
  122. package/dist/chunk-IXUHXTHW.cjs.map +0 -1
  123. package/dist/chunk-KKNEYIZJ.cjs.map +0 -1
  124. package/dist/chunk-LNI3FYSI.js.map +0 -1
  125. package/dist/chunk-LTZ5WYOK.cjs.map +0 -1
  126. package/dist/chunk-QJUJNTIU.cjs.map +0 -1
  127. package/dist/chunk-QZGABF2M.js.map +0 -1
  128. package/dist/chunk-THFZSDIU.js.map +0 -1
  129. package/dist/chunk-UYJQDDEE.cjs.map +0 -1
  130. package/dist/chunk-VC5XVPLM.js.map +0 -1
  131. package/dist/chunk-VGEZNFWH.js.map +0 -1
  132. package/dist/chunk-VYQVDL2M.js.map +0 -1
  133. package/dist/config-6FB2BXMP.js +0 -6
  134. package/dist/migrations-FGXZPKDC.cjs +0 -13
  135. package/dist/migrations-Z6D27NAW.js +0 -4
  136. package/dist/rbac-7QZ4JZ2E.cjs +0 -14
  137. package/dist/rbac-Y43IEQOP.js +0 -5
package/dist/index.d.cts CHANGED
@@ -1,6 +1,6 @@
1
1
  export { B as Bindings, a as BootIsolateFn, b as SonicJSApp, S as SonicJSConfig, V as Variables, c as createSonicJSApp, s as setupCoreMiddleware, d as setupCoreRoutes } from './app-aj39TGHB.cjs';
2
- import { o as DefinedPlugin } from './define-plugin-DMcvEy_C.cjs';
3
- export { B as BooleanField, e as ConfigSchema, f as ConfigSchemaField, h as CronContext, i as CronDeclaration, j as CronDispatchResult, k as CronTickEvent, l as CronablePlugin, H as HookSystemImpl, r as HookUtils, N as NumberField, P as ParsedField, v as PluginManagerClass, an as PluginMenuEntry, x as PluginRegistryImpl, y as PluginValidatorClass, z as PluginsRegistry, A as RegisterPluginsError, G as RegisterPluginsErrorReason, I as RegisterPluginsHostContext, J as RegisterablePlugin, K as RegistryEntry, ao as ResolvedPluginMenuEntry, L as ScopedHookSystemClass, O as SelectField, Q as SettingsFor, U as StringField, Y as applySchemaDefaults, _ as collectCronSchedules, $ as collectCrons, a2 as createScheduledHandler, a3 as definePlugin, a4 as dispatchCronTick, a5 as getHookSystem, ap as getPluginMenu, a6 as getTypedHooks, a8 as hasHookSystem, a9 as isDefinedPlugin, ae as parseConfigSchema, af as parseFormDataToSettings, ah as registerPlugins, ai as renderSchemaFields, aj as resetHookSystem, aq as resetPluginMenu, ar as resolvePluginMenuItems, ak as setHookSystem, as as setPluginMenu } from './define-plugin-DMcvEy_C.cjs';
2
+ import { o as DefinedPlugin } from './define-plugin-rjXmGOgu.cjs';
3
+ export { B as BooleanField, e as ConfigSchema, f as ConfigSchemaField, h as CronContext, i as CronDeclaration, j as CronDispatchResult, k as CronTickEvent, l as CronablePlugin, H as HookSystemImpl, r as HookUtils, N as NumberField, P as ParsedField, v as PluginManagerClass, an as PluginMenuEntry, x as PluginRegistryImpl, y as PluginValidatorClass, z as PluginsRegistry, A as RegisterPluginsError, G as RegisterPluginsErrorReason, I as RegisterPluginsHostContext, J as RegisterablePlugin, K as RegistryEntry, ao as ResolvedPluginMenuEntry, L as ScopedHookSystemClass, O as SelectField, Q as SettingsFor, U as StringField, Y as applySchemaDefaults, _ as collectCronSchedules, $ as collectCrons, a2 as createScheduledHandler, a3 as definePlugin, a4 as dispatchCronTick, a5 as getHookSystem, ap as getPluginMenu, a6 as getTypedHooks, a8 as hasHookSystem, a9 as isDefinedPlugin, ae as parseConfigSchema, af as parseFormDataToSettings, ah as registerPlugins, ai as renderSchemaFields, aj as resetHookSystem, aq as resetPluginMenu, ar as resolvePluginMenuItems, ak as setHookSystem, as as setPluginMenu } from './define-plugin-rjXmGOgu.cjs';
4
4
  import { D1Database as D1Database$1 } from '@cloudflare/workers-types';
5
5
  import { z } from 'zod';
6
6
  import { E as EmailProvider, N as NormalizedEmailMessage, t as SendResult } from './types-DT7XN5TX.cjs';
@@ -159,6 +159,14 @@ declare class RbacService {
159
159
  getRolesForUser(userId: string): Promise<RbacRole[]>;
160
160
  /** Grants attached to a set of role ids (from the embedded role grants). */
161
161
  private grantsForRoleIds;
162
+ /**
163
+ * Does the role (matched by document slug OR data.name) have a grant for resource+verb?
164
+ * Matches the role principal id from the request context, which can be either the RBAC slug
165
+ * (e.g. 'role-public') or the legacy role name (e.g. 'public').
166
+ */
167
+ isGrantedForRole(roleNameOrSlug: string, resource: string, verb: string): Promise<boolean>;
168
+ /** True if a role document exists for this id or name. Use to distinguish "no RBAC role → default allow" from "role exists but no grant → deny". */
169
+ hasRbacRole(idOrName: string): Promise<boolean>;
162
170
  /** Does a single grant row satisfy the requested (resource, verb)? */
163
171
  private grantMatches;
164
172
  private strongestScope;
package/dist/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  export { B as Bindings, a as BootIsolateFn, b as SonicJSApp, S as SonicJSConfig, V as Variables, c as createSonicJSApp, s as setupCoreMiddleware, d as setupCoreRoutes } from './app-01M0dIwt.js';
2
- import { o as DefinedPlugin } from './define-plugin-D_6D9vVZ.js';
3
- export { B as BooleanField, e as ConfigSchema, f as ConfigSchemaField, h as CronContext, i as CronDeclaration, j as CronDispatchResult, k as CronTickEvent, l as CronablePlugin, H as HookSystemImpl, r as HookUtils, N as NumberField, P as ParsedField, v as PluginManagerClass, an as PluginMenuEntry, x as PluginRegistryImpl, y as PluginValidatorClass, z as PluginsRegistry, A as RegisterPluginsError, G as RegisterPluginsErrorReason, I as RegisterPluginsHostContext, J as RegisterablePlugin, K as RegistryEntry, ao as ResolvedPluginMenuEntry, L as ScopedHookSystemClass, O as SelectField, Q as SettingsFor, U as StringField, Y as applySchemaDefaults, _ as collectCronSchedules, $ as collectCrons, a2 as createScheduledHandler, a3 as definePlugin, a4 as dispatchCronTick, a5 as getHookSystem, ap as getPluginMenu, a6 as getTypedHooks, a8 as hasHookSystem, a9 as isDefinedPlugin, ae as parseConfigSchema, af as parseFormDataToSettings, ah as registerPlugins, ai as renderSchemaFields, aj as resetHookSystem, aq as resetPluginMenu, ar as resolvePluginMenuItems, ak as setHookSystem, as as setPluginMenu } from './define-plugin-D_6D9vVZ.js';
2
+ import { o as DefinedPlugin } from './define-plugin-DDe8a_bh.js';
3
+ export { B as BooleanField, e as ConfigSchema, f as ConfigSchemaField, h as CronContext, i as CronDeclaration, j as CronDispatchResult, k as CronTickEvent, l as CronablePlugin, H as HookSystemImpl, r as HookUtils, N as NumberField, P as ParsedField, v as PluginManagerClass, an as PluginMenuEntry, x as PluginRegistryImpl, y as PluginValidatorClass, z as PluginsRegistry, A as RegisterPluginsError, G as RegisterPluginsErrorReason, I as RegisterPluginsHostContext, J as RegisterablePlugin, K as RegistryEntry, ao as ResolvedPluginMenuEntry, L as ScopedHookSystemClass, O as SelectField, Q as SettingsFor, U as StringField, Y as applySchemaDefaults, _ as collectCronSchedules, $ as collectCrons, a2 as createScheduledHandler, a3 as definePlugin, a4 as dispatchCronTick, a5 as getHookSystem, ap as getPluginMenu, a6 as getTypedHooks, a8 as hasHookSystem, a9 as isDefinedPlugin, ae as parseConfigSchema, af as parseFormDataToSettings, ah as registerPlugins, ai as renderSchemaFields, aj as resetHookSystem, aq as resetPluginMenu, ar as resolvePluginMenuItems, ak as setHookSystem, as as setPluginMenu } from './define-plugin-DDe8a_bh.js';
4
4
  import { D1Database as D1Database$1 } from '@cloudflare/workers-types';
5
5
  import { z } from 'zod';
6
6
  import { E as EmailProvider, N as NormalizedEmailMessage, t as SendResult } from './types-DT7XN5TX.js';
@@ -159,6 +159,14 @@ declare class RbacService {
159
159
  getRolesForUser(userId: string): Promise<RbacRole[]>;
160
160
  /** Grants attached to a set of role ids (from the embedded role grants). */
161
161
  private grantsForRoleIds;
162
+ /**
163
+ * Does the role (matched by document slug OR data.name) have a grant for resource+verb?
164
+ * Matches the role principal id from the request context, which can be either the RBAC slug
165
+ * (e.g. 'role-public') or the legacy role name (e.g. 'public').
166
+ */
167
+ isGrantedForRole(roleNameOrSlug: string, resource: string, verb: string): Promise<boolean>;
168
+ /** True if a role document exists for this id or name. Use to distinguish "no RBAC role → default allow" from "role exists but no grant → deny". */
169
+ hasRbacRole(idOrName: string): Promise<boolean>;
162
170
  /** Does a single grant row satisfy the requested (resource, verb)? */
163
171
  private grantMatches;
164
172
  private strongestScope;
package/dist/index.js CHANGED
@@ -1,37 +1,37 @@
1
- import { createAuth } from './chunk-SOZUG52O.js';
2
- import { getEmailService, hasEmailService, setEmailService, reconcileMenuFromPlugins, invalidateVariablesCache, resolveVariablesInObject, resolveDocScope, denyIfNotAllowed, DocumentRepository, dispatchHookEvent, getCustomData, createDocumentSchema, renderTable, getVariablesCached, setVariablesCache, TenantService, isValidMemberRole, renderConfirmationDialog, getConfirmationDialogScript, VALID_MEMBER_ROLES, userProfilesPlugin, lexicalEditorPlugin, api_media_default, api_system_default, apiDocumentsRoutes, api_default, adminDocumentsRoutes, admin_api_default, adminCollectionsRoutes, adminSettingsRoutes, router2, admin_content_default, adminMediaRoutes, router, adminPluginRoutes, adminLogsRoutes, userRoutes, auth_default, test_cleanup_default, getDocumentRequestContext, updateDocumentSchema, effectiveTenantForType } from './chunk-VC5XVPLM.js';
3
- export { DocumentRepository, ROUTES_INFO, admin_api_default as adminApiRoutes, adminCheckboxRoutes, adminCollectionsRoutes, admin_content_default as adminContentRoutes, router as adminDashboardRoutes, adminLogsRoutes, adminMediaRoutes, adminPluginRoutes, adminSettingsRoutes, userRoutes as adminUsersRoutes, api_content_crud_default as apiContentCrudRoutes, api_media_default as apiMediaRoutes, api_default as apiRoutes, api_system_default as apiSystemRoutes, auth_default as authRoutes, createUserProfilesPlugin, defineUserProfile, getUserProfileConfig, userProfilesPlugin } from './chunk-VC5XVPLM.js';
1
+ import { createAuth } from './chunk-3KGY4IBW.js';
2
+ import { getEmailService, hasEmailService, setEmailService, reconcileMenuFromPlugins, invalidateVariablesCache, resolveVariablesInObject, resolveDocScope, denyIfNotAllowed, DocumentRepository, dispatchHookEvent, getCustomData, createDocumentSchema, renderTable, getVariablesCached, setVariablesCache, TenantService, isValidMemberRole, renderConfirmationDialog, getConfirmationDialogScript, VALID_MEMBER_ROLES, userProfilesPlugin, lexicalEditorPlugin, api_media_default, api_system_default, apiDocumentsRoutes, api_default, adminDocumentsRoutes, admin_api_default, adminCollectionsRoutes, adminSettingsRoutes, router2, admin_content_default, adminMediaRoutes, router, adminPluginRoutes, adminLogsRoutes, userRoutes, auth_default, test_cleanup_default, getDocumentRequestContext, updateDocumentSchema, effectiveTenantForType } from './chunk-7P5OCUPS.js';
3
+ export { DocumentRepository, ROUTES_INFO, admin_api_default as adminApiRoutes, adminCheckboxRoutes, adminCollectionsRoutes, admin_content_default as adminContentRoutes, router as adminDashboardRoutes, adminLogsRoutes, adminMediaRoutes, adminPluginRoutes, adminSettingsRoutes, userRoutes as adminUsersRoutes, api_content_crud_default as apiContentCrudRoutes, api_media_default as apiMediaRoutes, api_default as apiRoutes, api_system_default as apiSystemRoutes, auth_default as authRoutes, createUserProfilesPlugin, defineUserProfile, getUserProfileConfig, userProfilesPlugin } from './chunk-7P5OCUPS.js';
4
4
  import './chunk-VVYVFCML.js';
5
- import './chunk-BHND5PEV.js';
5
+ import './chunk-E3TQG7AA.js';
6
6
  import { SettingsService, setAppInstance } from './chunk-2XAQTPAE.js';
7
7
  export { Logger, getLogger, initLogger } from './chunk-2XAQTPAE.js';
8
8
  import { getAllCacheStats, CACHE_CONFIGS, getCacheService, clearAllCaches, parseCacheKey } from './chunk-K25XHMM3.js';
9
9
  import { schema_exports } from './chunk-AI663NBO.js';
10
10
  export { apiTokens, content, contentVersions, insertContentSchema, insertLogConfigSchema, insertMediaSchema, insertPluginActivityLogSchema, insertPluginAssetSchema, insertPluginHookSchema, insertPluginRouteSchema, insertPluginSchema, insertSystemLogSchema, insertUserSchema, insertWorkflowHistorySchema, logConfig, media, pluginActivityLog, pluginAssets, pluginHooks, pluginRoutes, plugins, selectContentSchema, selectLogConfigSchema, selectMediaSchema, selectPluginActivityLogSchema, selectPluginAssetSchema, selectPluginHookSchema, selectPluginRouteSchema, selectPluginSchema, selectSystemLogSchema, selectUserSchema, selectWorkflowHistorySchema, systemLogs, users, workflowHistory } from './chunk-AI663NBO.js';
11
- import { requireAuth, DocumentTypeRegistry, requireRbac, requireRole, getJwtExpirySecondsFromDb, AuthManager, metricsMiddleware, bootstrapMiddleware, securityHeadersMiddleware, csrfProtection } from './chunk-FHPEM77Y.js';
12
- export { AuthManager, PermissionManager, bootstrapDocumentTypes, bootstrapMiddleware, cacheHeaders, compressionMiddleware, detailedLoggingMiddleware, getActivePlugins, isPluginActive, logActivity, loggingMiddleware, optionalAuth, performanceLoggingMiddleware, requireActivePlugin, requireActivePlugins, requireAnyPermission, requireAuth, requirePermission, requireRole, securityHeadersMiddleware as securityHeaders, securityLoggingMiddleware } from './chunk-FHPEM77Y.js';
13
- import { RbacService, DocumentsService } from './chunk-3TMTYJAJ.js';
14
- export { DocumentsService, RbacService } from './chunk-3TMTYJAJ.js';
11
+ import { requireAuth, DocumentTypeRegistry, requireRbac, requireRole, getJwtExpirySecondsFromDb, AuthManager, metricsMiddleware, bootstrapMiddleware, securityHeadersMiddleware, csrfProtection } from './chunk-2OXFMMA3.js';
12
+ export { AuthManager, PermissionManager, bootstrapDocumentTypes, bootstrapMiddleware, cacheHeaders, compressionMiddleware, detailedLoggingMiddleware, getActivePlugins, isPluginActive, logActivity, loggingMiddleware, optionalAuth, performanceLoggingMiddleware, requireActivePlugin, requireActivePlugins, requireAnyPermission, requireAuth, requirePermission, requireRole, securityHeadersMiddleware as securityHeaders, securityLoggingMiddleware } from './chunk-2OXFMMA3.js';
13
+ import { RbacService, DocumentsService } from './chunk-BDQ55MWV.js';
14
+ export { DocumentsService, RbacService } from './chunk-BDQ55MWV.js';
15
15
  import { nanoid } from './chunk-UWUP2VMT.js';
16
- import { PluginService, PLUGIN_REGISTRY, invalidateTenantCache, getCollectionRegistry, TENANT_COOKIE, MULTI_TENANT_PLUGIN_ID, collectionRecordToRow, tenantMiddleware } from './chunk-RJ2O5IIE.js';
17
- export { PluginBootstrapService, PluginService as PluginServiceClass, getAvailableCollectionNames, loadCollectionConfig, loadCollectionConfigs, registerCollections, validateCollectionConfig } from './chunk-RJ2O5IIE.js';
18
- export { MigrationService } from './chunk-UIHIXTIS.js';
19
- export { renderFilterBar } from './chunk-URIBTX27.js';
20
- import { renderAdminLayout } from './chunk-BJROXF4N.js';
21
- export { getConfirmationDialogScript, renderAlert, renderConfirmationDialog, renderForm, renderFormField, renderPagination, renderTable } from './chunk-BJROXF4N.js';
22
- import { init_admin_layout_catalyst_template, renderAdminLayoutCatalyst } from './chunk-THFZSDIU.js';
23
- export { renderAdminLayoutCatalyst } from './chunk-THFZSDIU.js';
24
- import { TurnstileService, HookSystemImpl, createPluginWirer, registerPluginRoutes } from './chunk-VYQVDL2M.js';
25
- export { HookSystemImpl, HookUtils, PluginDependencyCycleError, PluginManager as PluginManagerClass, PluginRegistryImpl, PluginValidator as PluginValidatorClass, RegisterPluginsError, ScopedHookSystem as ScopedHookSystemClass, collectCronSchedules, collectCrons, createScheduledHandler, dispatchCronTick, registerPlugins, topoSort } from './chunk-VYQVDL2M.js';
26
- import { definePlugin, setPluginMenu, setPluginDefinitions, resolvePluginMenuItems } from './chunk-VGEZNFWH.js';
27
- export { applySchemaDefaults, definePlugin, getPluginMenu, isDefinedPlugin, parseConfigSchema, parseFormDataToSettings, renderSchemaFields, resetPluginMenu, resolvePluginMenuItems, setPluginMenu } from './chunk-VGEZNFWH.js';
16
+ import { PluginService, PLUGIN_REGISTRY, invalidateTenantCache, getCollectionRegistry, TENANT_COOKIE, MULTI_TENANT_PLUGIN_ID, collectionRecordToRow, tenantMiddleware } from './chunk-2D3A4X52.js';
17
+ export { PluginBootstrapService, PluginService as PluginServiceClass, getAvailableCollectionNames, loadCollectionConfig, loadCollectionConfigs, registerCollections, validateCollectionConfig } from './chunk-2D3A4X52.js';
18
+ export { MigrationService } from './chunk-D7RLBBHE.js';
19
+ export { renderFilterBar } from './chunk-73RTFFMX.js';
20
+ import { renderAdminLayout } from './chunk-HSDJDWLV.js';
21
+ export { getConfirmationDialogScript, renderAlert, renderConfirmationDialog, renderForm, renderFormField, renderPagination, renderTable } from './chunk-HSDJDWLV.js';
22
+ import { init_admin_layout_catalyst_template, renderAdminLayoutCatalyst } from './chunk-SXC4HPK6.js';
23
+ export { renderAdminLayoutCatalyst } from './chunk-SXC4HPK6.js';
24
+ import { TurnstileService, HookSystemImpl, createPluginWirer, registerPluginRoutes } from './chunk-F26HP3B6.js';
25
+ export { HookSystemImpl, HookUtils, PluginDependencyCycleError, PluginManager as PluginManagerClass, PluginRegistryImpl, PluginValidator as PluginValidatorClass, RegisterPluginsError, ScopedHookSystem as ScopedHookSystemClass, collectCronSchedules, collectCrons, createScheduledHandler, dispatchCronTick, registerPlugins, topoSort } from './chunk-F26HP3B6.js';
26
+ import { definePlugin, setPluginMenu, setPluginDefinitions, resolvePluginMenuItems } from './chunk-C54MH5UI.js';
27
+ export { applySchemaDefaults, definePlugin, getPluginMenu, isDefinedPlugin, parseConfigSchema, parseFormDataToSettings, renderSchemaFields, resetPluginMenu, resolvePluginMenuItems, setPluginMenu } from './chunk-C54MH5UI.js';
28
28
  import { setHookSystem } from './chunk-RNZFGN4R.js';
29
29
  export { getHookSystem, getTypedHooks, hasHookSystem, resetHookSystem, setHookSystem } from './chunk-RNZFGN4R.js';
30
- export { QueryFilterBuilder, TemplateRenderer, buildQuery, renderTemplate, templateRenderer } from './chunk-QZGABF2M.js';
30
+ export { QueryFilterBuilder, TemplateRenderer, buildQuery, renderTemplate, templateRenderer } from './chunk-FVAK4C6L.js';
31
31
  export { metricsTracker } from './chunk-FICTAGD4.js';
32
32
  import './chunk-X7ZAEI5S.js';
33
- import { getCoreVersion, package_default } from './chunk-LNI3FYSI.js';
34
- export { SONICJS_VERSION, getCoreVersion } from './chunk-LNI3FYSI.js';
33
+ import { getCoreVersion, package_default } from './chunk-CWIGQYRR.js';
34
+ export { SONICJS_VERSION, getCoreVersion } from './chunk-CWIGQYRR.js';
35
35
  import { escapeHtml, sanitizeInput } from './chunk-TQABQWOP.js';
36
36
  export { escapeHtml, sanitizeInput, sanitizeObject } from './chunk-TQABQWOP.js';
37
37
  export { HOOKS } from './chunk-QXOZI5Q2.js';
@@ -8112,7 +8112,7 @@ adminRoutes5.get("/settings", async (c) => {
8112
8112
  const db = c.env.DB;
8113
8113
  const user = c.get("user");
8114
8114
  const settings = await getSettings4(db);
8115
- const { renderAdminLayoutCatalyst: renderAdminLayoutCatalyst2 } = await import('./admin-layout-catalyst.template-6UQGLCKI.js');
8115
+ const { renderAdminLayoutCatalyst: renderAdminLayoutCatalyst2 } = await import('./admin-layout-catalyst.template-WCYMQVTZ.js');
8116
8116
  const content2 = `
8117
8117
  <div>
8118
8118
  <div class="mb-6">
@@ -11727,9 +11727,9 @@ function pluginMenuMiddleware() {
11727
11727
  if (!path.startsWith("/admin")) {
11728
11728
  return next();
11729
11729
  }
11730
+ const db = c.env.DB;
11730
11731
  let activeMenuItems = [];
11731
11732
  try {
11732
- const db = c.env.DB;
11733
11733
  const pluginIds = REGISTRY_MENU_PLUGINS.map((p) => p.id);
11734
11734
  if (pluginIds.length > 0) {
11735
11735
  const placeholders = pluginIds.map(() => "?").join(",");
@@ -11753,9 +11753,24 @@ function pluginMenuMiddleware() {
11753
11753
  }
11754
11754
  const user = c.get("user");
11755
11755
  const singletonItems = resolvePluginMenuItems(user ? { role: user.role } : void 0);
11756
+ const singletonPluginIds = [...new Set(
11757
+ singletonItems.map((i) => i.pluginId).filter((id) => !!id)
11758
+ )];
11759
+ let activeSingletonIds = /* @__PURE__ */ new Set();
11760
+ try {
11761
+ if (singletonPluginIds.length > 0) {
11762
+ const ph = singletonPluginIds.map(() => "?").join(",");
11763
+ const result = await db.prepare(
11764
+ `SELECT slug FROM documents WHERE type_id = 'plugin' AND tenant_id = 'default' AND slug IN (${ph}) AND q_plugin_status = 'active' AND is_current_draft = 1 AND deleted_at IS NULL`
11765
+ ).bind(...singletonPluginIds).all();
11766
+ activeSingletonIds = new Set((result.results || []).map((r) => r.slug));
11767
+ }
11768
+ } catch {
11769
+ }
11756
11770
  const existingPaths = new Set(activeMenuItems.map((i) => i.path));
11757
11771
  for (const item of singletonItems) {
11758
- if (!existingPaths.has(item.path)) {
11772
+ const isActive = !item.pluginId || activeSingletonIds.has(item.pluginId);
11773
+ if (isActive && !existingPaths.has(item.path)) {
11759
11774
  activeMenuItems.push({ label: item.label, path: item.path, icon: item.icon, order: item.order });
11760
11775
  }
11761
11776
  }
@@ -18250,7 +18265,7 @@ function createSonicJSApp(config = {}) {
18250
18265
  await next();
18251
18266
  });
18252
18267
  app2.use("*", metricsMiddleware());
18253
- app2.use("*", bootstrapMiddleware(config));
18268
+ app2.use("*", bootstrapMiddleware(config, [...corePluginsBeforeCatchAll, ...corePluginsAfterCatchAll, ...config.plugins?.register ?? []]));
18254
18269
  const boot = async (env) => {
18255
18270
  if (config.plugins?.disableAll) return;
18256
18271
  firstRequestEnv = env;
@@ -18322,6 +18337,29 @@ function createSonicJSApp(config = {}) {
18322
18337
  await next();
18323
18338
  });
18324
18339
  app2.use("*", apiKeyAuthMiddleware());
18340
+ app2.use("*", async (c, next) => {
18341
+ if (!c.get("user")) {
18342
+ const authHeader = c.req.header("Authorization");
18343
+ if (authHeader?.startsWith("Bearer ") && !authHeader.startsWith("Bearer sk_")) {
18344
+ const token = authHeader.slice(7);
18345
+ try {
18346
+ const secret = c.env?.JWT_SECRET;
18347
+ const payload = await AuthManager.verifyToken(token, secret);
18348
+ if (payload) {
18349
+ c.set("user", {
18350
+ userId: payload.userId,
18351
+ email: payload.email,
18352
+ role: payload.role,
18353
+ exp: payload.exp,
18354
+ iat: payload.iat
18355
+ });
18356
+ }
18357
+ } catch {
18358
+ }
18359
+ }
18360
+ }
18361
+ await next();
18362
+ });
18325
18363
  if (config.middleware?.afterAuth) {
18326
18364
  for (const middleware of config.middleware.afterAuth) {
18327
18365
  app2.use("*", middleware);
@@ -18347,7 +18385,7 @@ function createSonicJSApp(config = {}) {
18347
18385
  if (!user?.userId) return next();
18348
18386
  let perms = [];
18349
18387
  try {
18350
- const { RbacService: RbacService2 } = await import('./rbac-Y43IEQOP.js');
18388
+ const { RbacService: RbacService2 } = await import('./rbac-P44772FP.js');
18351
18389
  perms = await new RbacService2(c.env.DB, c.env.CACHE_KV).permissionsForUser(user.userId);
18352
18390
  } catch {
18353
18391
  return next();
@@ -18424,7 +18462,7 @@ function createSonicJSApp(config = {}) {
18424
18462
  const userPlugins = (config.plugins?.register ?? []).filter(
18425
18463
  (p) => !PLUGIN_REGISTRY[p.id]
18426
18464
  );
18427
- setPluginMenu(userPlugins.flatMap((p) => p.menu ?? []));
18465
+ setPluginMenu(userPlugins.flatMap((p) => (p.menu ?? []).map((m) => ({ ...m, pluginId: p.id }))));
18428
18466
  setPluginDefinitions(allMountedPlugins);
18429
18467
  }
18430
18468
  app2.get("/favicon.svg", (c) => {