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

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 (116) hide show
  1. package/dist/{app-01M0dIwt.d.ts → app-BP5IlK94.d.ts} +7 -7
  2. package/dist/{app-aj39TGHB.d.cts → app-fdq4K3vw.d.cts} +7 -7
  3. package/dist/catalog-56DR6OXI.cjs +41 -0
  4. package/dist/catalog-56DR6OXI.cjs.map +1 -0
  5. package/dist/catalog-6MB37KY7.js +4 -0
  6. package/dist/catalog-6MB37KY7.js.map +1 -0
  7. package/dist/{chunk-YAURVGUK.cjs → chunk-4DHPR7KR.cjs} +77 -17
  8. package/dist/chunk-4DHPR7KR.cjs.map +1 -0
  9. package/dist/{chunk-D7RLBBHE.js → chunk-5YSFQO7X.js} +40 -13
  10. package/dist/chunk-5YSFQO7X.js.map +1 -0
  11. package/dist/{chunk-RSBZITK3.cjs → chunk-6UAI4SGN.cjs} +3 -3
  12. package/dist/{chunk-RSBZITK3.cjs.map → chunk-6UAI4SGN.cjs.map} +1 -1
  13. package/dist/{chunk-2XAQTPAE.js → chunk-6X22VFEV.js} +8 -2
  14. package/dist/chunk-6X22VFEV.js.map +1 -0
  15. package/dist/{chunk-I7MIRRFJ.cjs → chunk-A22RBHO7.cjs} +11 -11
  16. package/dist/{chunk-I7MIRRFJ.cjs.map → chunk-A22RBHO7.cjs.map} +1 -1
  17. package/dist/{chunk-FVAK4C6L.js → chunk-AMP4BSJE.js} +3 -3
  18. package/dist/{chunk-FVAK4C6L.js.map → chunk-AMP4BSJE.js.map} +1 -1
  19. package/dist/{chunk-E7E3NL3Y.cjs → chunk-BRKXMRMB.cjs} +93 -93
  20. package/dist/chunk-BRKXMRMB.cjs.map +1 -0
  21. package/dist/{chunk-36Z3AKX3.cjs → chunk-C5LDQ3SH.cjs} +8 -2
  22. package/dist/chunk-C5LDQ3SH.cjs.map +1 -0
  23. package/dist/{chunk-2OXFMMA3.js → chunk-EEA476CJ.js} +84 -80
  24. package/dist/chunk-EEA476CJ.js.map +1 -0
  25. package/dist/chunk-F6BTBE4S.js +119 -0
  26. package/dist/chunk-F6BTBE4S.js.map +1 -0
  27. package/dist/chunk-FZGIU5AZ.cjs +128 -0
  28. package/dist/chunk-FZGIU5AZ.cjs.map +1 -0
  29. package/dist/{chunk-C54MH5UI.js → chunk-JD7BZU3A.js} +3 -3
  30. package/dist/{chunk-C54MH5UI.js.map → chunk-JD7BZU3A.js.map} +1 -1
  31. package/dist/{chunk-3KGY4IBW.js → chunk-JG5J434C.js} +3 -3
  32. package/dist/{chunk-3KGY4IBW.js.map → chunk-JG5J434C.js.map} +1 -1
  33. package/dist/{chunk-D6FWEYQE.cjs → chunk-KWQNB6UM.cjs} +4 -4
  34. package/dist/{chunk-D6FWEYQE.cjs.map → chunk-KWQNB6UM.cjs.map} +1 -1
  35. package/dist/{chunk-7P5OCUPS.js → chunk-OJFIQGZB.js} +107 -29
  36. package/dist/chunk-OJFIQGZB.js.map +1 -0
  37. package/dist/{chunk-JCBDXEY2.cjs → chunk-OLEOKHDX.cjs} +9 -2
  38. package/dist/chunk-OLEOKHDX.cjs.map +1 -0
  39. package/dist/{chunk-MOGK3U4A.cjs → chunk-PAS7GZBS.cjs} +40 -13
  40. package/dist/chunk-PAS7GZBS.cjs.map +1 -0
  41. package/dist/{chunk-2D3A4X52.js → chunk-RVOX2WH2.js} +74 -18
  42. package/dist/chunk-RVOX2WH2.js.map +1 -0
  43. package/dist/{chunk-BDQ55MWV.js → chunk-RXLI3ADU.js} +9 -2
  44. package/dist/chunk-RXLI3ADU.js.map +1 -0
  45. package/dist/{chunk-6OA77UM7.cjs → chunk-S2QN4LFD.cjs} +386 -306
  46. package/dist/chunk-S2QN4LFD.cjs.map +1 -0
  47. package/dist/{chunk-DLTT7QZU.cjs → chunk-SFGYZUWU.cjs} +3 -3
  48. package/dist/{chunk-DLTT7QZU.cjs.map → chunk-SFGYZUWU.cjs.map} +1 -1
  49. package/dist/{chunk-CWIGQYRR.js → chunk-UB5QSRO7.js} +5 -5
  50. package/dist/chunk-UB5QSRO7.js.map +1 -0
  51. package/dist/{chunk-F26HP3B6.js → chunk-UKIDWRA3.js} +4 -4
  52. package/dist/{chunk-F26HP3B6.js.map → chunk-UKIDWRA3.js.map} +1 -1
  53. package/dist/{chunk-BJ6NJL2E.cjs → chunk-XZUEGFXE.cjs} +5 -5
  54. package/dist/chunk-XZUEGFXE.cjs.map +1 -0
  55. package/dist/{collection-config-BTzAvKt2.d.cts → collection-config-U2dydD_O.d.cts} +14 -0
  56. package/dist/{collection-config-BTzAvKt2.d.ts → collection-config-U2dydD_O.d.ts} +14 -0
  57. package/dist/config-DOAWXZBG.js +6 -0
  58. package/dist/{config-4TIHSNW6.js.map → config-DOAWXZBG.js.map} +1 -1
  59. package/dist/{config-XN2ETAJ3.cjs → config-VLU73ZW7.cjs} +5 -5
  60. package/dist/{config-XN2ETAJ3.cjs.map → config-VLU73ZW7.cjs.map} +1 -1
  61. package/dist/index.cjs +600 -332
  62. package/dist/index.cjs.map +1 -1
  63. package/dist/index.d.cts +17 -10
  64. package/dist/index.d.ts +17 -10
  65. package/dist/index.js +292 -25
  66. package/dist/index.js.map +1 -1
  67. package/dist/middleware.cjs +46 -46
  68. package/dist/middleware.d.cts +6 -9
  69. package/dist/middleware.d.ts +6 -9
  70. package/dist/middleware.js +5 -5
  71. package/dist/migrations-6M6772UC.cjs +13 -0
  72. package/dist/{migrations-KU4V6T73.cjs.map → migrations-6M6772UC.cjs.map} +1 -1
  73. package/dist/migrations-GZ2HIB4I.js +4 -0
  74. package/dist/{migrations-JAHMI5MK.js.map → migrations-GZ2HIB4I.js.map} +1 -1
  75. package/dist/{plugin-bootstrap-BHWQ2df8.d.cts → plugin-bootstrap-CfVILQeP.d.ts} +1 -1
  76. package/dist/{plugin-bootstrap-Bj4fxX1q.d.ts → plugin-bootstrap-RY5pkoOT.d.cts} +1 -1
  77. package/dist/plugins.cjs +40 -40
  78. package/dist/plugins.js +3 -3
  79. package/dist/rbac-TFUOYIVN.cjs +14 -0
  80. package/dist/{rbac-AORZ6O3N.cjs.map → rbac-TFUOYIVN.cjs.map} +1 -1
  81. package/dist/rbac-XSNP76CV.js +5 -0
  82. package/dist/{rbac-P44772FP.js.map → rbac-XSNP76CV.js.map} +1 -1
  83. package/dist/routes.cjs +31 -30
  84. package/dist/routes.d.cts +3 -5
  85. package/dist/routes.d.ts +3 -5
  86. package/dist/routes.js +11 -10
  87. package/dist/services.cjs +30 -30
  88. package/dist/services.d.cts +9 -2
  89. package/dist/services.d.ts +9 -2
  90. package/dist/services.js +3 -3
  91. package/dist/types.d.cts +1 -1
  92. package/dist/types.d.ts +1 -1
  93. package/dist/utils.cjs +12 -12
  94. package/dist/utils.d.cts +1 -1
  95. package/dist/utils.d.ts +1 -1
  96. package/dist/utils.js +2 -2
  97. package/package.json +3 -3
  98. package/dist/chunk-2D3A4X52.js.map +0 -1
  99. package/dist/chunk-2OXFMMA3.js.map +0 -1
  100. package/dist/chunk-2XAQTPAE.js.map +0 -1
  101. package/dist/chunk-36Z3AKX3.cjs.map +0 -1
  102. package/dist/chunk-6OA77UM7.cjs.map +0 -1
  103. package/dist/chunk-7P5OCUPS.js.map +0 -1
  104. package/dist/chunk-BDQ55MWV.js.map +0 -1
  105. package/dist/chunk-BJ6NJL2E.cjs.map +0 -1
  106. package/dist/chunk-CWIGQYRR.js.map +0 -1
  107. package/dist/chunk-D7RLBBHE.js.map +0 -1
  108. package/dist/chunk-E7E3NL3Y.cjs.map +0 -1
  109. package/dist/chunk-JCBDXEY2.cjs.map +0 -1
  110. package/dist/chunk-MOGK3U4A.cjs.map +0 -1
  111. package/dist/chunk-YAURVGUK.cjs.map +0 -1
  112. package/dist/config-4TIHSNW6.js +0 -6
  113. package/dist/migrations-JAHMI5MK.js +0 -4
  114. package/dist/migrations-KU4V6T73.cjs +0 -13
  115. package/dist/rbac-AORZ6O3N.cjs +0 -14
  116. package/dist/rbac-P44772FP.js +0 -5
package/dist/index.d.cts CHANGED
@@ -1,14 +1,14 @@
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';
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-fdq4K3vw.cjs';
2
2
  import { o as DefinedPlugin } from './define-plugin-rjXmGOgu.cjs';
3
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';
7
7
  export { q as EmailLogRow } from './types-DT7XN5TX.cjs';
8
- import { s as schema } from './plugin-bootstrap-BHWQ2df8.cjs';
9
- export { m as Content, C as CorePlugin, n as DbPlugin, o as DbPluginHook, L as LogCategory, p as LogConfig, a as LogEntry, b as LogFilter, c as LogLevel, d as Logger, q as Media, M as Migration, e as MigrationService, f as MigrationStatus, N as NewContent, t as NewLogConfig, u as NewMedia, w as NewPlugin, x as NewPluginActivityLog, y as NewPluginAsset, z as NewPluginHook, A as NewPluginRoute, B as NewSystemLog, D as NewUser, E as NewWorkflowHistory, F as PluginActivityLog, G as PluginAsset, P as PluginBootstrapService, H as PluginRoute, g as PluginServiceClass, S as SystemLog, U as User, W as WorkflowHistory, I as apiTokens, J as content, K as contentVersions, h as getAvailableCollectionNames, i as getLogger, j as initLogger, O as insertContentSchema, Q as insertLogConfigSchema, R as insertMediaSchema, T as insertPluginActivityLogSchema, V as insertPluginAssetSchema, X as insertPluginHookSchema, Y as insertPluginRouteSchema, Z as insertPluginSchema, _ as insertSystemLogSchema, $ as insertUserSchema, a0 as insertWorkflowHistorySchema, l as loadCollectionConfig, k as loadCollectionConfigs, a1 as logConfig, a2 as media, a3 as pluginActivityLog, a4 as pluginAssets, a5 as pluginHooks, a6 as pluginRoutes, a7 as plugins, r as registerCollections, a8 as selectContentSchema, a9 as selectLogConfigSchema, aa as selectMediaSchema, ab as selectPluginActivityLogSchema, ac as selectPluginAssetSchema, ad as selectPluginHookSchema, ae as selectPluginRouteSchema, af as selectPluginSchema, ag as selectSystemLogSchema, ah as selectUserSchema, ai as selectWorkflowHistorySchema, aj as systemLogs, ak as users, v as validateCollectionConfig, al as workflowHistory } from './plugin-bootstrap-BHWQ2df8.cjs';
10
- import { e as FieldType } from './collection-config-BTzAvKt2.cjs';
11
- export { C as CollectionConfig, b as CollectionConfigModule, c as CollectionSchema, d as CollectionSyncResult, F as FieldConfig } from './collection-config-BTzAvKt2.cjs';
8
+ import { s as schema } from './plugin-bootstrap-RY5pkoOT.cjs';
9
+ export { m as Content, C as CorePlugin, n as DbPlugin, o as DbPluginHook, L as LogCategory, p as LogConfig, a as LogEntry, b as LogFilter, c as LogLevel, d as Logger, q as Media, M as Migration, e as MigrationService, f as MigrationStatus, N as NewContent, t as NewLogConfig, u as NewMedia, w as NewPlugin, x as NewPluginActivityLog, y as NewPluginAsset, z as NewPluginHook, A as NewPluginRoute, B as NewSystemLog, D as NewUser, E as NewWorkflowHistory, F as PluginActivityLog, G as PluginAsset, P as PluginBootstrapService, H as PluginRoute, g as PluginServiceClass, S as SystemLog, U as User, W as WorkflowHistory, I as apiTokens, J as content, K as contentVersions, h as getAvailableCollectionNames, i as getLogger, j as initLogger, O as insertContentSchema, Q as insertLogConfigSchema, R as insertMediaSchema, T as insertPluginActivityLogSchema, V as insertPluginAssetSchema, X as insertPluginHookSchema, Y as insertPluginRouteSchema, Z as insertPluginSchema, _ as insertSystemLogSchema, $ as insertUserSchema, a0 as insertWorkflowHistorySchema, l as loadCollectionConfig, k as loadCollectionConfigs, a1 as logConfig, a2 as media, a3 as pluginActivityLog, a4 as pluginAssets, a5 as pluginHooks, a6 as pluginRoutes, a7 as plugins, r as registerCollections, a8 as selectContentSchema, a9 as selectLogConfigSchema, aa as selectMediaSchema, ab as selectPluginActivityLogSchema, ac as selectPluginAssetSchema, ad as selectPluginHookSchema, ae as selectPluginRouteSchema, af as selectPluginSchema, ag as selectSystemLogSchema, ah as selectUserSchema, ai as selectWorkflowHistorySchema, aj as systemLogs, ak as users, v as validateCollectionConfig, al as workflowHistory } from './plugin-bootstrap-RY5pkoOT.cjs';
10
+ import { e as FieldType } from './collection-config-U2dydD_O.cjs';
11
+ export { C as CollectionConfig, b as CollectionConfigModule, c as CollectionSchema, d as CollectionSyncResult, F as FieldConfig } from './collection-config-U2dydD_O.cjs';
12
12
  export { AuthManager, Permission, PermissionManager, UserPermissions, bootstrapMiddleware, cacheHeaders, compressionMiddleware, detailedLoggingMiddleware, getActivePlugins, isPluginActive, logActivity, loggingMiddleware, optionalAuth, performanceLoggingMiddleware, requireActivePlugin, requireActivePlugins, requireAnyPermission, requireAuth, requirePermission, requireRole, securityHeaders, securityLoggingMiddleware } from './middleware.cjs';
13
13
  export { ROUTES_INFO, adminApiRoutes, adminCheckboxRoutes, adminCollectionsRoutes, adminContentRoutes, adminDashboardRoutes, adminLogsRoutes, adminMediaRoutes, adminPluginRoutes, adminSettingsRoutes, adminUsersRoutes, apiContentCrudRoutes, apiMediaRoutes, apiRoutes, apiSystemRoutes, authRoutes } from './routes.cjs';
14
14
  export { A as AdminLayoutCatalystData, a as AlertData, C as ConfirmationDialogOptions, F as Filter, b as FilterBarData, c as FilterOption, d as FormData, e as FormField, P as PaginationData, T as TableColumn, f as TableData, g as getConfirmationDialogScript, r as renderAdminLayoutCatalyst, h as renderAlert, i as renderConfirmationDialog, j as renderFilterBar, k as renderForm, l as renderFormField, m as renderPagination, n as renderTable } from './admin-layout-catalyst.template-DrwDUfsE.cjs';
@@ -16,12 +16,10 @@ export { A as AuthService, C as ContentService, H as HOOKS, a as HookContext, b
16
16
  export { P as PluginManifest } from './plugin-manifest-Dpy8wxIB.cjs';
17
17
  export { F as FilterCondition, a as FilterGroup, b as FilterOperator, Q as QueryFilter, c as QueryFilterBuilder, d as QueryResult, S as SONICJS_VERSION, T as TemplateRenderer, e as buildQuery, f as escapeHtml, g as getCoreVersion, m as metricsTracker, r as renderTemplate, s as sanitizeInput, h as sanitizeObject, t as templateRenderer } from './version-DFTyGfIH.cjs';
18
18
  import * as drizzle_orm_d1 from 'drizzle-orm/d1';
19
- import 'better-auth/client';
20
- import 'better-auth/plugins/email-otp';
21
19
  import 'better-auth';
22
- import 'better-auth/plugins/magic-link';
23
- import 'better-call';
20
+ import 'better-auth/plugins';
24
21
  import 'zod/v4/core';
22
+ import 'better-call';
25
23
  import 'hono';
26
24
  import 'drizzle-zod';
27
25
  import 'drizzle-orm/sqlite-core';
@@ -459,6 +457,15 @@ declare function createRedirectPlugin(): DefinedPlugin;
459
457
  declare const helloWorldPlugin: DefinedPlugin;
460
458
  declare function createHelloWorldPlugin(): DefinedPlugin;
461
459
 
460
+ /**
461
+ * Demo Login Plugin — Payload-shaped port.
462
+ *
463
+ * Prefills login form with demo credentials. The legacy `template:render` /
464
+ * `page:before-render` hooks aren't in the typed catalog; we subscribe them
465
+ * dynamically in onBoot via the raw hook system so they keep working.
466
+ */
467
+ declare const demoLoginPlugin: DefinedPlugin;
468
+
462
469
  /**
463
470
  * Site Settings Collection
464
471
  *
@@ -764,4 +771,4 @@ declare function createMcpPlugin(options?: McpConfigInput): DefinedPlugin;
764
771
 
765
772
  declare const VERSION: string;
766
773
 
767
- export { BUILT_IN_PROVIDERS, type CFSendEmailBinding, CloudflareEmailProvider, type CloudflareEmailProviderOptions, DocumentRepository, DocumentsService, FieldType, type McpConfig, type McpConfigInput, OAuthService, PluginDependencyCycleError, type ProfileFieldDefinition, RbacService, type SortablePlugin, type TopoSortOptions, type UserProfileConfig, VERSION, bootstrapDocumentTypes, createDb, createHelloWorldPlugin, createMcpPlugin, createOAuthProvidersPlugin, createRedirectPlugin, createUserProfilesPlugin, defineUserProfile, emailReconciliationPlugin, generateTriggersComment, getUserProfileConfig, helloWorldPlugin, mcpPlugin, oauthProvidersPlugin, parseCronTriggers, redirectPlugin, _default as siteSettingsCollection, topoSort, updateWranglerTriggers, userProfilesPlugin };
774
+ export { BUILT_IN_PROVIDERS, type CFSendEmailBinding, CloudflareEmailProvider, type CloudflareEmailProviderOptions, DocumentRepository, DocumentsService, FieldType, type McpConfig, type McpConfigInput, OAuthService, PluginDependencyCycleError, type ProfileFieldDefinition, RbacService, type SortablePlugin, type TopoSortOptions, type UserProfileConfig, VERSION, bootstrapDocumentTypes, createDb, createHelloWorldPlugin, createMcpPlugin, createOAuthProvidersPlugin, createRedirectPlugin, createUserProfilesPlugin, defineUserProfile, demoLoginPlugin, emailReconciliationPlugin, generateTriggersComment, getUserProfileConfig, helloWorldPlugin, mcpPlugin, oauthProvidersPlugin, parseCronTriggers, redirectPlugin, _default as siteSettingsCollection, topoSort, updateWranglerTriggers, userProfilesPlugin };
package/dist/index.d.ts CHANGED
@@ -1,14 +1,14 @@
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';
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-BP5IlK94.js';
2
2
  import { o as DefinedPlugin } from './define-plugin-DDe8a_bh.js';
3
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';
7
7
  export { q as EmailLogRow } from './types-DT7XN5TX.js';
8
- import { s as schema } from './plugin-bootstrap-Bj4fxX1q.js';
9
- export { m as Content, C as CorePlugin, n as DbPlugin, o as DbPluginHook, L as LogCategory, p as LogConfig, a as LogEntry, b as LogFilter, c as LogLevel, d as Logger, q as Media, M as Migration, e as MigrationService, f as MigrationStatus, N as NewContent, t as NewLogConfig, u as NewMedia, w as NewPlugin, x as NewPluginActivityLog, y as NewPluginAsset, z as NewPluginHook, A as NewPluginRoute, B as NewSystemLog, D as NewUser, E as NewWorkflowHistory, F as PluginActivityLog, G as PluginAsset, P as PluginBootstrapService, H as PluginRoute, g as PluginServiceClass, S as SystemLog, U as User, W as WorkflowHistory, I as apiTokens, J as content, K as contentVersions, h as getAvailableCollectionNames, i as getLogger, j as initLogger, O as insertContentSchema, Q as insertLogConfigSchema, R as insertMediaSchema, T as insertPluginActivityLogSchema, V as insertPluginAssetSchema, X as insertPluginHookSchema, Y as insertPluginRouteSchema, Z as insertPluginSchema, _ as insertSystemLogSchema, $ as insertUserSchema, a0 as insertWorkflowHistorySchema, l as loadCollectionConfig, k as loadCollectionConfigs, a1 as logConfig, a2 as media, a3 as pluginActivityLog, a4 as pluginAssets, a5 as pluginHooks, a6 as pluginRoutes, a7 as plugins, r as registerCollections, a8 as selectContentSchema, a9 as selectLogConfigSchema, aa as selectMediaSchema, ab as selectPluginActivityLogSchema, ac as selectPluginAssetSchema, ad as selectPluginHookSchema, ae as selectPluginRouteSchema, af as selectPluginSchema, ag as selectSystemLogSchema, ah as selectUserSchema, ai as selectWorkflowHistorySchema, aj as systemLogs, ak as users, v as validateCollectionConfig, al as workflowHistory } from './plugin-bootstrap-Bj4fxX1q.js';
10
- import { e as FieldType } from './collection-config-BTzAvKt2.js';
11
- export { C as CollectionConfig, b as CollectionConfigModule, c as CollectionSchema, d as CollectionSyncResult, F as FieldConfig } from './collection-config-BTzAvKt2.js';
8
+ import { s as schema } from './plugin-bootstrap-CfVILQeP.js';
9
+ export { m as Content, C as CorePlugin, n as DbPlugin, o as DbPluginHook, L as LogCategory, p as LogConfig, a as LogEntry, b as LogFilter, c as LogLevel, d as Logger, q as Media, M as Migration, e as MigrationService, f as MigrationStatus, N as NewContent, t as NewLogConfig, u as NewMedia, w as NewPlugin, x as NewPluginActivityLog, y as NewPluginAsset, z as NewPluginHook, A as NewPluginRoute, B as NewSystemLog, D as NewUser, E as NewWorkflowHistory, F as PluginActivityLog, G as PluginAsset, P as PluginBootstrapService, H as PluginRoute, g as PluginServiceClass, S as SystemLog, U as User, W as WorkflowHistory, I as apiTokens, J as content, K as contentVersions, h as getAvailableCollectionNames, i as getLogger, j as initLogger, O as insertContentSchema, Q as insertLogConfigSchema, R as insertMediaSchema, T as insertPluginActivityLogSchema, V as insertPluginAssetSchema, X as insertPluginHookSchema, Y as insertPluginRouteSchema, Z as insertPluginSchema, _ as insertSystemLogSchema, $ as insertUserSchema, a0 as insertWorkflowHistorySchema, l as loadCollectionConfig, k as loadCollectionConfigs, a1 as logConfig, a2 as media, a3 as pluginActivityLog, a4 as pluginAssets, a5 as pluginHooks, a6 as pluginRoutes, a7 as plugins, r as registerCollections, a8 as selectContentSchema, a9 as selectLogConfigSchema, aa as selectMediaSchema, ab as selectPluginActivityLogSchema, ac as selectPluginAssetSchema, ad as selectPluginHookSchema, ae as selectPluginRouteSchema, af as selectPluginSchema, ag as selectSystemLogSchema, ah as selectUserSchema, ai as selectWorkflowHistorySchema, aj as systemLogs, ak as users, v as validateCollectionConfig, al as workflowHistory } from './plugin-bootstrap-CfVILQeP.js';
10
+ import { e as FieldType } from './collection-config-U2dydD_O.js';
11
+ export { C as CollectionConfig, b as CollectionConfigModule, c as CollectionSchema, d as CollectionSyncResult, F as FieldConfig } from './collection-config-U2dydD_O.js';
12
12
  export { AuthManager, Permission, PermissionManager, UserPermissions, bootstrapMiddleware, cacheHeaders, compressionMiddleware, detailedLoggingMiddleware, getActivePlugins, isPluginActive, logActivity, loggingMiddleware, optionalAuth, performanceLoggingMiddleware, requireActivePlugin, requireActivePlugins, requireAnyPermission, requireAuth, requirePermission, requireRole, securityHeaders, securityLoggingMiddleware } from './middleware.js';
13
13
  export { ROUTES_INFO, adminApiRoutes, adminCheckboxRoutes, adminCollectionsRoutes, adminContentRoutes, adminDashboardRoutes, adminLogsRoutes, adminMediaRoutes, adminPluginRoutes, adminSettingsRoutes, adminUsersRoutes, apiContentCrudRoutes, apiMediaRoutes, apiRoutes, apiSystemRoutes, authRoutes } from './routes.js';
14
14
  export { A as AdminLayoutCatalystData, a as AlertData, C as ConfirmationDialogOptions, F as Filter, b as FilterBarData, c as FilterOption, d as FormData, e as FormField, P as PaginationData, T as TableColumn, f as TableData, g as getConfirmationDialogScript, r as renderAdminLayoutCatalyst, h as renderAlert, i as renderConfirmationDialog, j as renderFilterBar, k as renderForm, l as renderFormField, m as renderPagination, n as renderTable } from './admin-layout-catalyst.template-DrwDUfsE.js';
@@ -16,12 +16,10 @@ export { A as AuthService, C as ContentService, H as HOOKS, a as HookContext, b
16
16
  export { P as PluginManifest } from './plugin-manifest-Dpy8wxIB.js';
17
17
  export { F as FilterCondition, a as FilterGroup, b as FilterOperator, Q as QueryFilter, c as QueryFilterBuilder, d as QueryResult, S as SONICJS_VERSION, T as TemplateRenderer, e as buildQuery, f as escapeHtml, g as getCoreVersion, m as metricsTracker, r as renderTemplate, s as sanitizeInput, h as sanitizeObject, t as templateRenderer } from './version-DFTyGfIH.js';
18
18
  import * as drizzle_orm_d1 from 'drizzle-orm/d1';
19
- import 'better-auth/client';
20
- import 'better-auth/plugins/email-otp';
21
19
  import 'better-auth';
22
- import 'better-auth/plugins/magic-link';
23
- import 'better-call';
20
+ import 'better-auth/plugins';
24
21
  import 'zod/v4/core';
22
+ import 'better-call';
25
23
  import 'hono';
26
24
  import 'drizzle-zod';
27
25
  import 'drizzle-orm/sqlite-core';
@@ -459,6 +457,15 @@ declare function createRedirectPlugin(): DefinedPlugin;
459
457
  declare const helloWorldPlugin: DefinedPlugin;
460
458
  declare function createHelloWorldPlugin(): DefinedPlugin;
461
459
 
460
+ /**
461
+ * Demo Login Plugin — Payload-shaped port.
462
+ *
463
+ * Prefills login form with demo credentials. The legacy `template:render` /
464
+ * `page:before-render` hooks aren't in the typed catalog; we subscribe them
465
+ * dynamically in onBoot via the raw hook system so they keep working.
466
+ */
467
+ declare const demoLoginPlugin: DefinedPlugin;
468
+
462
469
  /**
463
470
  * Site Settings Collection
464
471
  *
@@ -764,4 +771,4 @@ declare function createMcpPlugin(options?: McpConfigInput): DefinedPlugin;
764
771
 
765
772
  declare const VERSION: string;
766
773
 
767
- export { BUILT_IN_PROVIDERS, type CFSendEmailBinding, CloudflareEmailProvider, type CloudflareEmailProviderOptions, DocumentRepository, DocumentsService, FieldType, type McpConfig, type McpConfigInput, OAuthService, PluginDependencyCycleError, type ProfileFieldDefinition, RbacService, type SortablePlugin, type TopoSortOptions, type UserProfileConfig, VERSION, bootstrapDocumentTypes, createDb, createHelloWorldPlugin, createMcpPlugin, createOAuthProvidersPlugin, createRedirectPlugin, createUserProfilesPlugin, defineUserProfile, emailReconciliationPlugin, generateTriggersComment, getUserProfileConfig, helloWorldPlugin, mcpPlugin, oauthProvidersPlugin, parseCronTriggers, redirectPlugin, _default as siteSettingsCollection, topoSort, updateWranglerTriggers, userProfilesPlugin };
774
+ export { BUILT_IN_PROVIDERS, type CFSendEmailBinding, CloudflareEmailProvider, type CloudflareEmailProviderOptions, DocumentRepository, DocumentsService, FieldType, type McpConfig, type McpConfigInput, OAuthService, PluginDependencyCycleError, type ProfileFieldDefinition, RbacService, type SortablePlugin, type TopoSortOptions, type UserProfileConfig, VERSION, bootstrapDocumentTypes, createDb, createHelloWorldPlugin, createMcpPlugin, createOAuthProvidersPlugin, createRedirectPlugin, createUserProfilesPlugin, defineUserProfile, demoLoginPlugin, emailReconciliationPlugin, generateTriggersComment, getUserProfileConfig, helloWorldPlugin, mcpPlugin, oauthProvidersPlugin, parseCronTriggers, redirectPlugin, _default as siteSettingsCollection, topoSort, updateWranglerTriggers, userProfilesPlugin };
package/dist/index.js CHANGED
@@ -1,37 +1,38 @@
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
- import './chunk-VVYVFCML.js';
1
+ import { createAuth } from './chunk-JG5J434C.js';
2
+ import { getEmailService, hasEmailService, setEmailService, reconcileMenuFromPlugins, invalidateVariablesCache, resolveVariablesInObject, resolveDocScope, denyIfNotAllowed, DocumentRepository, swrStats, setDemoModeActive, 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-OJFIQGZB.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-OJFIQGZB.js';
5
4
  import './chunk-E3TQG7AA.js';
6
- import { SettingsService, setAppInstance } from './chunk-2XAQTPAE.js';
7
- export { Logger, getLogger, initLogger } from './chunk-2XAQTPAE.js';
5
+ import { loadKvCatalog, getCatalog, getCatalogStats, clearCatalog, clearKvCatalog } from './chunk-F6BTBE4S.js';
6
+ import './chunk-VVYVFCML.js';
7
+ import { SettingsService, setAppInstance } from './chunk-6X22VFEV.js';
8
+ export { Logger, getLogger, initLogger } from './chunk-6X22VFEV.js';
8
9
  import { getAllCacheStats, CACHE_CONFIGS, getCacheService, clearAllCaches, parseCacheKey } from './chunk-K25XHMM3.js';
9
10
  import { schema_exports } from './chunk-AI663NBO.js';
10
11
  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-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';
12
+ import { requireAuth, DocumentTypeRegistry, requireRbac, requireRole, getJwtExpirySecondsFromDb, AuthManager, metricsMiddleware, bootstrapMiddleware, securityHeadersMiddleware, csrfProtection } from './chunk-EEA476CJ.js';
13
+ export { AuthManager, PermissionManager, bootstrapDocumentTypes, bootstrapMiddleware, cacheHeaders, compressionMiddleware, detailedLoggingMiddleware, logActivity, loggingMiddleware, optionalAuth, performanceLoggingMiddleware, requireAnyPermission, requireAuth, requirePermission, requireRole, securityHeadersMiddleware as securityHeaders, securityLoggingMiddleware } from './chunk-EEA476CJ.js';
14
+ import { RbacService, DocumentsService } from './chunk-RXLI3ADU.js';
15
+ export { DocumentsService, RbacService } from './chunk-RXLI3ADU.js';
15
16
  import { nanoid } from './chunk-UWUP2VMT.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';
17
+ import { PluginService, PLUGIN_REGISTRY, invalidateTenantCache, getCollectionRegistry, TENANT_COOKIE, MULTI_TENANT_PLUGIN_ID, collectionRecordToRow, tenantMiddleware } from './chunk-RVOX2WH2.js';
18
+ export { PluginBootstrapService, PluginService as PluginServiceClass, getActivePlugins, getAvailableCollectionNames, isPluginActive, loadCollectionConfig, loadCollectionConfigs, registerCollections, requireActivePlugin, requireActivePlugins, validateCollectionConfig } from './chunk-RVOX2WH2.js';
19
+ export { MigrationService } from './chunk-5YSFQO7X.js';
19
20
  export { renderFilterBar } from './chunk-73RTFFMX.js';
20
21
  import { renderAdminLayout } from './chunk-HSDJDWLV.js';
21
22
  export { getConfirmationDialogScript, renderAlert, renderConfirmationDialog, renderForm, renderFormField, renderPagination, renderTable } from './chunk-HSDJDWLV.js';
22
23
  import { init_admin_layout_catalyst_template, renderAdminLayoutCatalyst } from './chunk-SXC4HPK6.js';
23
24
  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';
25
+ import { TurnstileService, HookSystemImpl, createPluginWirer, registerPluginRoutes } from './chunk-UKIDWRA3.js';
26
+ export { HookSystemImpl, HookUtils, PluginDependencyCycleError, PluginManager as PluginManagerClass, PluginRegistryImpl, PluginValidator as PluginValidatorClass, RegisterPluginsError, ScopedHookSystem as ScopedHookSystemClass, collectCronSchedules, collectCrons, createScheduledHandler, dispatchCronTick, registerPlugins, topoSort } from './chunk-UKIDWRA3.js';
27
+ import { definePlugin, setPluginMenu, setPluginDefinitions, resolvePluginMenuItems } from './chunk-JD7BZU3A.js';
28
+ export { applySchemaDefaults, definePlugin, getPluginMenu, isDefinedPlugin, parseConfigSchema, parseFormDataToSettings, renderSchemaFields, resetPluginMenu, resolvePluginMenuItems, setPluginMenu } from './chunk-JD7BZU3A.js';
28
29
  import { setHookSystem } from './chunk-RNZFGN4R.js';
29
30
  export { getHookSystem, getTypedHooks, hasHookSystem, resetHookSystem, setHookSystem } from './chunk-RNZFGN4R.js';
30
- export { QueryFilterBuilder, TemplateRenderer, buildQuery, renderTemplate, templateRenderer } from './chunk-FVAK4C6L.js';
31
+ export { QueryFilterBuilder, TemplateRenderer, buildQuery, renderTemplate, templateRenderer } from './chunk-AMP4BSJE.js';
31
32
  export { metricsTracker } from './chunk-FICTAGD4.js';
32
33
  import './chunk-X7ZAEI5S.js';
33
- import { getCoreVersion, package_default } from './chunk-CWIGQYRR.js';
34
- export { SONICJS_VERSION, getCoreVersion } from './chunk-CWIGQYRR.js';
34
+ import { getCoreVersion, package_default } from './chunk-UB5QSRO7.js';
35
+ export { SONICJS_VERSION, getCoreVersion } from './chunk-UB5QSRO7.js';
35
36
  import { escapeHtml, sanitizeInput } from './chunk-TQABQWOP.js';
36
37
  export { escapeHtml, sanitizeInput, sanitizeObject } from './chunk-TQABQWOP.js';
37
38
  export { HOOKS } from './chunk-QXOZI5Q2.js';
@@ -17208,6 +17209,14 @@ function renderCacheDashboard(data) {
17208
17209
  >
17209
17210
  Collection Settings
17210
17211
  </button>
17212
+ <button
17213
+ onclick="switchTab('url-catalog')"
17214
+ id="tab-url-catalog"
17215
+ class="cache-tab border-b-2 border-transparent py-3 px-1 text-sm font-medium text-zinc-500 dark:text-zinc-400 hover:text-zinc-700 dark:hover:text-zinc-300 hover:border-zinc-300 dark:hover:border-zinc-600 whitespace-nowrap"
17216
+ >
17217
+ URL Catalog
17218
+ ${data.catalog.stats.totalEntries > 0 ? `<span class="ml-1.5 inline-flex items-center rounded-full px-1.5 py-0.5 text-xs font-medium bg-sky-100 dark:bg-sky-500/20 text-sky-700 dark:text-sky-300">${data.catalog.stats.totalEntries}</span>` : ""}
17219
+ </button>
17211
17220
  </nav>
17212
17221
  </div>
17213
17222
 
@@ -17288,10 +17297,18 @@ function renderCacheDashboard(data) {
17288
17297
  <div id="tab-panel-collection-settings" class="hidden space-y-6">
17289
17298
  ${renderCollectionSettingsTab(data.collections)}
17290
17299
  </div>
17300
+
17301
+ <!-- Tab: URL Catalog -->
17302
+ <div id="tab-panel-url-catalog" class="hidden space-y-6">
17303
+ ${renderUrlCatalogTab(data.catalog)}
17304
+ </div>
17291
17305
  </div>
17292
17306
 
17293
17307
  <script>
17294
- function switchTab(tab) {
17308
+ const VALID_TABS = ['overview', 'collection-settings', 'url-catalog']
17309
+
17310
+ function switchTab(tab, pushHash) {
17311
+ if (!VALID_TABS.includes(tab)) tab = 'overview'
17295
17312
  // Update tab button styles
17296
17313
  document.querySelectorAll('.cache-tab').forEach(btn => {
17297
17314
  btn.classList.remove('border-zinc-950', 'dark:border-white', 'text-zinc-950', 'dark:text-white')
@@ -17309,8 +17326,21 @@ function renderCacheDashboard(data) {
17309
17326
  })
17310
17327
  const activePanel = document.getElementById('tab-panel-' + tab)
17311
17328
  if (activePanel) activePanel.classList.remove('hidden')
17329
+
17330
+ // Sync URL hash (pushHash=false when called from hashchange to avoid loop)
17331
+ if (pushHash !== false) location.hash = tab
17312
17332
  }
17313
17333
 
17334
+ document.addEventListener('DOMContentLoaded', function () {
17335
+ const hash = location.hash.slice(1)
17336
+ switchTab(VALID_TABS.includes(hash) ? hash : 'overview', false)
17337
+ })
17338
+
17339
+ window.addEventListener('hashchange', function () {
17340
+ const hash = location.hash.slice(1)
17341
+ switchTab(VALID_TABS.includes(hash) ? hash : 'overview', false)
17342
+ })
17343
+
17314
17344
  async function refreshStats() {
17315
17345
  window.location.reload()
17316
17346
  }
@@ -17334,6 +17364,21 @@ function renderCacheDashboard(data) {
17334
17364
  }
17335
17365
  }
17336
17366
 
17367
+ async function clearUrlCatalog() {
17368
+ try {
17369
+ const response = await fetch('/admin/cache/catalog/clear', { method: 'POST' })
17370
+ const result = await response.json()
17371
+ if (result.success) {
17372
+ alert('URL catalog cleared')
17373
+ window.location.reload()
17374
+ } else {
17375
+ alert('Error: ' + result.error)
17376
+ }
17377
+ } catch (error) {
17378
+ alert('Error: ' + error.message)
17379
+ }
17380
+ }
17381
+
17337
17382
  let namespaceToDelete = null
17338
17383
 
17339
17384
  async function clearNamespaceCache(namespace) {
@@ -17395,6 +17440,130 @@ function renderCacheDashboard(data) {
17395
17440
  };
17396
17441
  return renderAdminLayoutCatalyst(layoutData);
17397
17442
  }
17443
+ function renderUrlCatalogTab(catalog) {
17444
+ const { entries, stats, swrPending } = catalog;
17445
+ const statCards = `
17446
+ <div class="grid grid-cols-2 gap-4 sm:grid-cols-4">
17447
+ ${renderMiniStatCard("Tracked URLs", stats.totalEntries.toLocaleString(), "sky")}
17448
+ ${renderMiniStatCard("Cache Hits", stats.totalHits.toLocaleString(), "lime")}
17449
+ ${renderMiniStatCard("Cache Misses", stats.totalMisses.toLocaleString(), "amber")}
17450
+ ${renderMiniStatCard("Stale Serves", stats.totalStale.toLocaleString(), "purple")}
17451
+ </div>
17452
+ `;
17453
+ const swrBadge = swrPending > 0 ? `<span class="ml-2 inline-flex items-center rounded-full px-2 py-0.5 text-xs font-medium bg-amber-100 dark:bg-amber-500/20 text-amber-700 dark:text-amber-300">${swrPending} stale pending</span>` : "";
17454
+ if (entries.length === 0) {
17455
+ return `
17456
+ ${statCards}
17457
+ <div class="overflow-hidden rounded-xl bg-white dark:bg-zinc-900 ring-1 ring-zinc-950/5 dark:ring-white/10">
17458
+ <div class="p-12 text-center">
17459
+ <svg class="mx-auto h-8 w-8 text-zinc-400 dark:text-zinc-500 mb-3" fill="none" stroke="currentColor" viewBox="0 0 24 24">
17460
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"/>
17461
+ </svg>
17462
+ <p class="text-sm font-medium text-zinc-900 dark:text-zinc-100">No entries yet</p>
17463
+ <p class="mt-1 text-sm text-zinc-500 dark:text-zinc-400">Cache-eligible API requests will appear here after the first page load.</p>
17464
+ </div>
17465
+ </div>
17466
+ `;
17467
+ }
17468
+ const rows = entries.map((entry) => {
17469
+ const totalReqs = entry.hits + entry.misses + entry.staleServes;
17470
+ const hitRate = totalReqs > 0 ? Math.round(entry.hits / totalReqs * 100) : 0;
17471
+ const hitRateColor = hitRate > 70 ? "text-lime-600 dark:text-lime-400" : hitRate > 40 ? "text-amber-600 dark:text-amber-400" : "text-red-600 dark:text-red-400";
17472
+ const pathDisplay = entry.queryString ? `${entry.path}?${entry.queryString}` : entry.path;
17473
+ const truncatedPath = pathDisplay.length > 80 ? pathDisplay.slice(0, 77) + "\u2026" : pathDisplay;
17474
+ const collBadge = entry.collection ? `<span class="inline-flex items-center rounded-md px-1.5 py-0.5 text-xs font-medium bg-sky-50 dark:bg-sky-500/10 text-sky-700 dark:text-sky-400 ring-1 ring-inset ring-sky-600/20">${entry.collection}</span>` : `<span class="text-xs text-zinc-400 dark:text-zinc-600">\u2014</span>`;
17475
+ const timeAgo = formatTimeAgo(entry.lastSeen);
17476
+ return `
17477
+ <tr class="hover:bg-zinc-50 dark:hover:bg-zinc-800/50">
17478
+ <td class="px-4 py-3 max-w-xs">
17479
+ <code class="text-xs text-zinc-700 dark:text-zinc-300 break-all" title="${pathDisplay}">${truncatedPath}</code>
17480
+ </td>
17481
+ <td class="px-4 py-3 whitespace-nowrap">${collBadge}</td>
17482
+ <td class="px-4 py-3 whitespace-nowrap text-sm text-zinc-900 dark:text-zinc-100 text-right">${totalReqs.toLocaleString()}</td>
17483
+ <td class="px-4 py-3 whitespace-nowrap text-right">
17484
+ <span class="text-sm font-medium ${hitRateColor}">${hitRate}%</span>
17485
+ </td>
17486
+ <td class="px-4 py-3 whitespace-nowrap text-sm text-zinc-600 dark:text-zinc-400 text-right">${entry.hits.toLocaleString()}</td>
17487
+ <td class="px-4 py-3 whitespace-nowrap text-sm text-zinc-600 dark:text-zinc-400 text-right">${entry.misses.toLocaleString()}</td>
17488
+ <td class="px-4 py-3 whitespace-nowrap text-sm text-zinc-500 dark:text-zinc-500 text-right">${entry.staleServes > 0 ? entry.staleServes.toLocaleString() : "\u2014"}</td>
17489
+ <td class="px-4 py-3 whitespace-nowrap text-xs text-zinc-400 dark:text-zinc-500 text-right">${timeAgo}</td>
17490
+ </tr>
17491
+ `;
17492
+ }).join("");
17493
+ return `
17494
+ ${statCards}
17495
+
17496
+ <div class="overflow-hidden rounded-xl bg-white dark:bg-zinc-900 ring-1 ring-zinc-950/5 dark:ring-white/10">
17497
+ <div class="px-6 py-4 border-b border-zinc-950/5 dark:border-white/10 flex items-center justify-between">
17498
+ <div>
17499
+ <h2 class="text-lg font-semibold text-zinc-950 dark:text-white">
17500
+ Cache-Eligible API URLs${swrBadge}
17501
+ </h2>
17502
+ <p class="mt-1 text-sm text-zinc-500 dark:text-zinc-400">
17503
+ Ranked by total requests. Resets on isolate eviction. Scoped to public/privileged (non-ACL) requests only.
17504
+ </p>
17505
+ </div>
17506
+ <button
17507
+ onclick="clearUrlCatalog()"
17508
+ class="inline-flex items-center gap-2 rounded-lg bg-white dark:bg-zinc-900 px-3 py-1.5 text-sm font-medium text-zinc-700 dark:text-zinc-300 ring-1 ring-inset ring-zinc-950/10 dark:ring-white/10 hover:bg-zinc-50 dark:hover:bg-zinc-800"
17509
+ >
17510
+ Clear
17511
+ </button>
17512
+ </div>
17513
+ <div class="overflow-x-auto">
17514
+ <table class="min-w-full divide-y divide-zinc-950/5 dark:divide-white/10">
17515
+ <thead class="bg-zinc-50 dark:bg-zinc-800/50">
17516
+ <tr>
17517
+ <th class="px-4 py-3 text-left text-xs font-medium text-zinc-500 dark:text-zinc-400 uppercase tracking-wider">URL</th>
17518
+ <th class="px-4 py-3 text-left text-xs font-medium text-zinc-500 dark:text-zinc-400 uppercase tracking-wider">Collection</th>
17519
+ <th class="px-4 py-3 text-right text-xs font-medium text-zinc-500 dark:text-zinc-400 uppercase tracking-wider">Requests</th>
17520
+ <th class="px-4 py-3 text-right text-xs font-medium text-zinc-500 dark:text-zinc-400 uppercase tracking-wider">Hit Rate</th>
17521
+ <th class="px-4 py-3 text-right text-xs font-medium text-zinc-500 dark:text-zinc-400 uppercase tracking-wider">Hits</th>
17522
+ <th class="px-4 py-3 text-right text-xs font-medium text-zinc-500 dark:text-zinc-400 uppercase tracking-wider">Misses</th>
17523
+ <th class="px-4 py-3 text-right text-xs font-medium text-zinc-500 dark:text-zinc-400 uppercase tracking-wider">Stale</th>
17524
+ <th class="px-4 py-3 text-right text-xs font-medium text-zinc-500 dark:text-zinc-400 uppercase tracking-wider">Last Seen</th>
17525
+ </tr>
17526
+ </thead>
17527
+ <tbody class="divide-y divide-zinc-950/5 dark:divide-white/10">
17528
+ ${rows}
17529
+ </tbody>
17530
+ </table>
17531
+ </div>
17532
+ </div>
17533
+
17534
+ <div class="overflow-hidden rounded-xl bg-white dark:bg-zinc-900 ring-1 ring-zinc-950/5 dark:ring-white/10">
17535
+ <div class="px-6 py-5">
17536
+ <h3 class="text-sm font-semibold text-zinc-950 dark:text-white mb-2">About this catalog</h3>
17537
+ <ul class="text-sm text-zinc-600 dark:text-zinc-400 space-y-1 list-disc list-inside">
17538
+ <li><strong>Phase 1 (done):</strong> Collection-scoped cache invalidation \u2014 content changes only purge the affected collection's keys.</li>
17539
+ <li><strong>Phase 2 (this view):</strong> URL catalog tracks every cache-eligible API request. Use to identify hot URLs for targeted pre-warming.</li>
17540
+ <li><strong>Phase 3 (SWR):</strong> Stale-While-Revalidate \u2014 on invalidation, the previous response is kept for 30 s so the first post-edit request is served from cache instantly. Stale serves are counted above.</li>
17541
+ <li>Catalog is per-isolate and resets on cold start. For persistent tracking, sink data to Analytics Engine.</li>
17542
+ </ul>
17543
+ </div>
17544
+ </div>
17545
+ `;
17546
+ }
17547
+ function renderMiniStatCard(label, value, color) {
17548
+ const colorClasses = {
17549
+ sky: "bg-sky-50 dark:bg-sky-500/10 text-sky-600 dark:text-sky-400",
17550
+ lime: "bg-lime-50 dark:bg-lime-500/10 text-lime-600 dark:text-lime-400",
17551
+ amber: "bg-amber-50 dark:bg-amber-500/10 text-amber-600 dark:text-amber-400",
17552
+ purple: "bg-purple-50 dark:bg-purple-500/10 text-purple-600 dark:text-purple-400"
17553
+ };
17554
+ return `
17555
+ <div class="overflow-hidden rounded-xl bg-white dark:bg-zinc-900 ring-1 ring-zinc-950/5 dark:ring-white/10 p-4">
17556
+ <p class="text-xs text-zinc-500 dark:text-zinc-400">${label}</p>
17557
+ <p class="mt-1 text-xl font-semibold ${colorClasses[color] ?? colorClasses.sky}">${value}</p>
17558
+ </div>
17559
+ `;
17560
+ }
17561
+ function formatTimeAgo(ts) {
17562
+ const secs = Math.floor((Date.now() - ts) / 1e3);
17563
+ if (secs < 60) return `${secs}s ago`;
17564
+ if (secs < 3600) return `${Math.floor(secs / 60)}m ago`;
17565
+ return `${Math.floor(secs / 3600)}h ago`;
17566
+ }
17398
17567
  function renderCollectionSettingsTab(collections) {
17399
17568
  if (collections.length === 0) {
17400
17569
  return `
@@ -17662,6 +17831,9 @@ app.get("/", async (c) => {
17662
17831
  ttlSource: hasCustomTtl ? "collection" : "default"
17663
17832
  };
17664
17833
  });
17834
+ await loadKvCatalog();
17835
+ const catalogEntries = getCatalog({ limit: 100 });
17836
+ const catalogSummary = getCatalogStats();
17665
17837
  const dashboardData = {
17666
17838
  stats,
17667
17839
  totals: {
@@ -17674,6 +17846,11 @@ app.get("/", async (c) => {
17674
17846
  },
17675
17847
  namespaces: Object.keys(stats),
17676
17848
  collections,
17849
+ catalog: {
17850
+ entries: catalogEntries,
17851
+ stats: catalogSummary,
17852
+ swrPending: swrStats().count
17853
+ },
17677
17854
  user: user ? {
17678
17855
  name: user.email,
17679
17856
  email: user.email,
@@ -18020,6 +18197,24 @@ app.post("/warm/:namespace", async (c) => {
18020
18197
  }, 500);
18021
18198
  }
18022
18199
  });
18200
+ app.get("/catalog", async (c) => {
18201
+ const collection = c.req.query("collection") || void 0;
18202
+ const sortBy = c.req.query("sort") || "requests";
18203
+ const limit = parseInt(c.req.query("limit") || "100");
18204
+ await loadKvCatalog();
18205
+ const entries = getCatalog({ collection, sortBy, limit });
18206
+ const stats = getCatalogStats();
18207
+ return c.json({
18208
+ success: true,
18209
+ data: { entries, stats, swrPending: swrStats().count },
18210
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
18211
+ });
18212
+ });
18213
+ app.post("/catalog/clear", async (_c) => {
18214
+ clearCatalog();
18215
+ await clearKvCatalog();
18216
+ return _c.json({ success: true, message: "URL catalog cleared", timestamp: (/* @__PURE__ */ new Date()).toISOString() });
18217
+ });
18023
18218
  var routes_default2 = app;
18024
18219
 
18025
18220
  // src/plugins/cache/index.ts
@@ -18297,10 +18492,19 @@ function createSonicJSApp(config = {}) {
18297
18492
  const allowed = c.env?.CORS_ORIGINS;
18298
18493
  if (!allowed) return null;
18299
18494
  const list = allowed.split(",").map((s) => s.trim());
18300
- return list.includes(origin) ? origin : null;
18495
+ const match = list.some((pattern) => {
18496
+ if (pattern === origin) return true;
18497
+ if (pattern.startsWith("*.")) {
18498
+ const suffix = pattern.slice(1);
18499
+ return origin.endsWith(suffix);
18500
+ }
18501
+ return false;
18502
+ });
18503
+ return match ? origin : null;
18301
18504
  },
18302
18505
  allowMethods: ["GET", "POST", "PUT", "DELETE", "OPTIONS"],
18303
- allowHeaders: ["Content-Type", "Authorization", "X-API-Key"],
18506
+ allowHeaders: ["Content-Type", "Authorization", "X-API-Key", "Cache-Control"],
18507
+ exposeHeaders: ["X-Cache-Status", "X-Cache-Source", "X-Cache-TTL", "X-Response-Time"],
18304
18508
  credentials: true
18305
18509
  }));
18306
18510
  app2.use("*", securityHeadersMiddleware());
@@ -18385,7 +18589,7 @@ function createSonicJSApp(config = {}) {
18385
18589
  if (!user?.userId) return next();
18386
18590
  let perms = [];
18387
18591
  try {
18388
- const { RbacService: RbacService2 } = await import('./rbac-P44772FP.js');
18592
+ const { RbacService: RbacService2 } = await import('./rbac-XSNP76CV.js');
18389
18593
  perms = await new RbacService2(c.env.DB, c.env.CACHE_KV).permissionsForUser(user.userId);
18390
18594
  } catch {
18391
18595
  return next();
@@ -21999,6 +22203,69 @@ function createRedirectPlugin() {
21999
22203
  return redirectPlugin;
22000
22204
  }
22001
22205
 
22206
+ // src/plugins/core-plugins/demo-login/index.ts
22207
+ var demoLoginJs = `
22208
+ // Demo Login Prefill Script
22209
+ (function() {
22210
+ 'use strict';
22211
+
22212
+ function prefillLoginForm() {
22213
+ const emailInput = document.getElementById('email');
22214
+ const passwordInput = document.getElementById('password');
22215
+
22216
+ if (emailInput && passwordInput) {
22217
+ emailInput.value = 'admin@sonicjs.com';
22218
+ passwordInput.value = 'sonicjs!';
22219
+
22220
+ const form = emailInput.closest('form');
22221
+ if (form) {
22222
+ const notice = document.createElement('div');
22223
+ notice.className = 'mb-4 p-3 bg-blue-50 border border-blue-200 rounded-lg text-blue-800 text-sm';
22224
+ notice.innerHTML = '\u{1F3AF} <strong>Demo Mode:</strong> Login form prefilled with demo credentials';
22225
+ form.insertBefore(notice, form.firstChild);
22226
+ }
22227
+ }
22228
+ }
22229
+
22230
+ if (document.readyState === 'loading') {
22231
+ document.addEventListener('DOMContentLoaded', prefillLoginForm);
22232
+ } else {
22233
+ prefillLoginForm();
22234
+ }
22235
+
22236
+ document.addEventListener('htmx:afterSwap', function(event) {
22237
+ if (event.detail.target.id === 'main-content' ||
22238
+ document.getElementById('email')) {
22239
+ setTimeout(prefillLoginForm, 100);
22240
+ }
22241
+ });
22242
+ })();
22243
+ `;
22244
+ var loginPrefillHandler = async (data) => {
22245
+ if (data.pageType === "auth-login" || data.template?.includes("login")) {
22246
+ data.scripts = data.scripts ?? [];
22247
+ data.inlineScripts = data.inlineScripts ?? [];
22248
+ data.inlineScripts.push(demoLoginJs);
22249
+ }
22250
+ return data;
22251
+ };
22252
+ var demoLoginPlugin = definePlugin({
22253
+ id: "demo-login-plugin",
22254
+ version: "1.0.0",
22255
+ name: "Demo Login",
22256
+ description: "Prefills login form with demo credentials (admin@sonicjs.com/sonicjs!) for easy site demonstration.",
22257
+ sonicjsVersionRange: "^3.0.0",
22258
+ author: { name: "SonicJS" },
22259
+ async onBoot(ctx) {
22260
+ setDemoModeActive();
22261
+ const hooks = ctx.raw?.hooks;
22262
+ if (hooks?.register) {
22263
+ hooks.register("template:render", loginPrefillHandler);
22264
+ hooks.register("page:before-render", loginPrefillHandler);
22265
+ }
22266
+ }
22267
+ });
22268
+
22002
22269
  // src/collections/site-settings.collection.ts
22003
22270
  var site_settings_collection_default = {
22004
22271
  name: "site_settings",
@@ -22920,6 +23187,6 @@ function createMcpPlugin(options) {
22920
23187
  // src/index.ts
22921
23188
  var VERSION = package_default.version;
22922
23189
 
22923
- export { BUILT_IN_PROVIDERS, CloudflareEmailProvider2 as CloudflareEmailProvider, OAuthService, VERSION, createDb, createHelloWorldPlugin, createMcpPlugin, createOAuthProvidersPlugin, createRedirectPlugin, createSonicJSApp, emailReconciliationPlugin, generateTriggersComment, helloWorldPlugin, mcpPlugin, oauthProvidersPlugin, parseCronTriggers, redirectPlugin, setupCoreMiddleware, setupCoreRoutes, site_settings_collection_default as siteSettingsCollection, updateWranglerTriggers };
23190
+ export { BUILT_IN_PROVIDERS, CloudflareEmailProvider2 as CloudflareEmailProvider, OAuthService, VERSION, createDb, createHelloWorldPlugin, createMcpPlugin, createOAuthProvidersPlugin, createRedirectPlugin, createSonicJSApp, demoLoginPlugin, emailReconciliationPlugin, generateTriggersComment, helloWorldPlugin, mcpPlugin, oauthProvidersPlugin, parseCronTriggers, redirectPlugin, setupCoreMiddleware, setupCoreRoutes, site_settings_collection_default as siteSettingsCollection, updateWranglerTriggers };
22924
23191
  //# sourceMappingURL=index.js.map
22925
23192
  //# sourceMappingURL=index.js.map