@sonicjs-cms/core 3.0.0-beta.21 → 3.0.0-beta.22

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 (51) hide show
  1. package/dist/{chunk-5U75XP74.js → chunk-2FCKKOA5.js} +2 -2
  2. package/dist/{chunk-5U75XP74.js.map → chunk-2FCKKOA5.js.map} +1 -1
  3. package/dist/{chunk-OJC4G5JE.cjs → chunk-3CT3SUR4.cjs} +2 -2
  4. package/dist/{chunk-OJC4G5JE.cjs.map → chunk-3CT3SUR4.cjs.map} +1 -1
  5. package/dist/{chunk-ZP77LTN4.js → chunk-6KNTZ67K.js} +106 -11
  6. package/dist/chunk-6KNTZ67K.js.map +1 -0
  7. package/dist/{chunk-JEX3UPZL.js → chunk-73O4GPJ6.js} +3 -3
  8. package/dist/{chunk-JEX3UPZL.js.map → chunk-73O4GPJ6.js.map} +1 -1
  9. package/dist/{chunk-4UYJPHSV.js → chunk-CHWT5KBK.js} +5 -5
  10. package/dist/{chunk-4UYJPHSV.js.map → chunk-CHWT5KBK.js.map} +1 -1
  11. package/dist/{chunk-4LVVMVQI.js → chunk-DOMXI5PM.js} +2 -2
  12. package/dist/{chunk-4LVVMVQI.js.map → chunk-DOMXI5PM.js.map} +1 -1
  13. package/dist/{chunk-A4KUJ3LD.cjs → chunk-EUJAEB6W.cjs} +4 -4
  14. package/dist/{chunk-A4KUJ3LD.cjs.map → chunk-EUJAEB6W.cjs.map} +1 -1
  15. package/dist/{chunk-FCLKX2OS.cjs → chunk-FTXGZ3BF.cjs} +15 -15
  16. package/dist/{chunk-FCLKX2OS.cjs.map → chunk-FTXGZ3BF.cjs.map} +1 -1
  17. package/dist/{chunk-GICS5AIO.js → chunk-GB2Q2DNK.js} +4 -4
  18. package/dist/{chunk-GICS5AIO.js.map → chunk-GB2Q2DNK.js.map} +1 -1
  19. package/dist/{chunk-7OTOXWEB.js → chunk-I2DM27HP.js} +3 -3
  20. package/dist/{chunk-7OTOXWEB.js.map → chunk-I2DM27HP.js.map} +1 -1
  21. package/dist/{chunk-7RUW244J.cjs → chunk-JFLZHOQP.cjs} +299 -204
  22. package/dist/chunk-JFLZHOQP.cjs.map +1 -0
  23. package/dist/{chunk-5UXU3LP4.cjs → chunk-MGHHPNJN.cjs} +10 -10
  24. package/dist/{chunk-5UXU3LP4.cjs.map → chunk-MGHHPNJN.cjs.map} +1 -1
  25. package/dist/{chunk-KVBHB7QP.cjs → chunk-PYZYU7EK.cjs} +2 -2
  26. package/dist/{chunk-KVBHB7QP.cjs.map → chunk-PYZYU7EK.cjs.map} +1 -1
  27. package/dist/{chunk-AOUVUF32.cjs → chunk-QWSR4THH.cjs} +3 -3
  28. package/dist/{chunk-AOUVUF32.cjs.map → chunk-QWSR4THH.cjs.map} +1 -1
  29. package/dist/index.cjs +308 -265
  30. package/dist/index.cjs.map +1 -1
  31. package/dist/index.js +62 -19
  32. package/dist/index.js.map +1 -1
  33. package/dist/middleware.cjs +33 -33
  34. package/dist/middleware.js +4 -4
  35. package/dist/migrations-HLK2QF4T.js +4 -0
  36. package/dist/{migrations-HMX5SPN2.js.map → migrations-HLK2QF4T.js.map} +1 -1
  37. package/dist/migrations-UIMA6ZL6.cjs +13 -0
  38. package/dist/{migrations-V73ARYV5.cjs.map → migrations-UIMA6ZL6.cjs.map} +1 -1
  39. package/dist/plugins.cjs +40 -40
  40. package/dist/plugins.js +3 -3
  41. package/dist/routes.cjs +26 -26
  42. package/dist/routes.js +6 -6
  43. package/dist/services.cjs +18 -18
  44. package/dist/services.js +2 -2
  45. package/dist/utils.cjs +3 -3
  46. package/dist/utils.js +1 -1
  47. package/package.json +1 -1
  48. package/dist/chunk-7RUW244J.cjs.map +0 -1
  49. package/dist/chunk-ZP77LTN4.js.map +0 -1
  50. package/dist/migrations-HMX5SPN2.js +0 -4
  51. package/dist/migrations-V73ARYV5.cjs +0 -13
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { createAuth } from './chunk-SOZUG52O.js';
2
- import { getEmailService, hasEmailService, setEmailService, 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 } from './chunk-ZP77LTN4.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-ZP77LTN4.js';
2
+ import { getEmailService, hasEmailService, setEmailService, 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 } from './chunk-6KNTZ67K.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-6KNTZ67K.js';
4
4
  import './chunk-VVYVFCML.js';
5
5
  import './chunk-RMRJGMDE.js';
6
6
  import { SettingsService, setAppInstance } from './chunk-2XAQTPAE.js';
@@ -8,30 +8,30 @@ 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-4UYJPHSV.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-4UYJPHSV.js';
11
+ import { requireAuth, DocumentTypeRegistry, requireRbac, requireRole, getJwtExpirySecondsFromDb, AuthManager, metricsMiddleware, bootstrapMiddleware, securityHeadersMiddleware, csrfProtection } from './chunk-CHWT5KBK.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-CHWT5KBK.js';
13
13
  import { RbacService, DocumentsService } from './chunk-3TMTYJAJ.js';
14
14
  export { DocumentsService, RbacService } from './chunk-3TMTYJAJ.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-4LVVMVQI.js';
17
- export { PluginBootstrapService, PluginService as PluginServiceClass, getAvailableCollectionNames, loadCollectionConfig, loadCollectionConfigs, registerCollections, validateCollectionConfig } from './chunk-4LVVMVQI.js';
18
- export { MigrationService } from './chunk-5U75XP74.js';
16
+ import { PluginService, PLUGIN_REGISTRY, invalidateTenantCache, getCollectionRegistry, TENANT_COOKIE, MULTI_TENANT_PLUGIN_ID, collectionRecordToRow, tenantMiddleware } from './chunk-DOMXI5PM.js';
17
+ export { PluginBootstrapService, PluginService as PluginServiceClass, getAvailableCollectionNames, loadCollectionConfig, loadCollectionConfigs, registerCollections, validateCollectionConfig } from './chunk-DOMXI5PM.js';
18
+ export { MigrationService } from './chunk-2FCKKOA5.js';
19
19
  export { renderFilterBar } from './chunk-JQISFW6U.js';
20
20
  import { renderAdminLayout } from './chunk-OBA2RYZN.js';
21
21
  export { getConfirmationDialogScript, renderAlert, renderConfirmationDialog, renderForm, renderFormField, renderPagination, renderTable } from './chunk-OBA2RYZN.js';
22
22
  import { init_admin_layout_catalyst_template, renderAdminLayoutCatalyst } from './chunk-5V62WT6M.js';
23
23
  export { renderAdminLayoutCatalyst } from './chunk-5V62WT6M.js';
24
- import { TurnstileService, HookSystemImpl, createPluginWirer, registerPluginRoutes, setPluginMenu, resolvePluginMenuItems } from './chunk-GICS5AIO.js';
25
- export { HookSystemImpl, HookUtils, PluginDependencyCycleError, PluginManager as PluginManagerClass, PluginRegistryImpl, PluginValidator as PluginValidatorClass, RegisterPluginsError, ScopedHookSystem as ScopedHookSystemClass, collectCronSchedules, collectCrons, createScheduledHandler, dispatchCronTick, getPluginMenu, registerPlugins, resetPluginMenu, resolvePluginMenuItems, setPluginMenu, topoSort } from './chunk-GICS5AIO.js';
26
- import { definePlugin, setPluginDefinitions } from './chunk-7OTOXWEB.js';
27
- export { applySchemaDefaults, definePlugin, isDefinedPlugin, parseConfigSchema, parseFormDataToSettings, renderSchemaFields } from './chunk-7OTOXWEB.js';
24
+ import { TurnstileService, HookSystemImpl, createPluginWirer, registerPluginRoutes, setPluginMenu, resolvePluginMenuItems } from './chunk-GB2Q2DNK.js';
25
+ export { HookSystemImpl, HookUtils, PluginDependencyCycleError, PluginManager as PluginManagerClass, PluginRegistryImpl, PluginValidator as PluginValidatorClass, RegisterPluginsError, ScopedHookSystem as ScopedHookSystemClass, collectCronSchedules, collectCrons, createScheduledHandler, dispatchCronTick, getPluginMenu, registerPlugins, resetPluginMenu, resolvePluginMenuItems, setPluginMenu, topoSort } from './chunk-GB2Q2DNK.js';
26
+ import { definePlugin, setPluginDefinitions } from './chunk-I2DM27HP.js';
27
+ export { applySchemaDefaults, definePlugin, isDefinedPlugin, parseConfigSchema, parseFormDataToSettings, renderSchemaFields } from './chunk-I2DM27HP.js';
28
28
  import { setHookSystem } from './chunk-RNZFGN4R.js';
29
29
  export { getHookSystem, getTypedHooks, hasHookSystem, resetHookSystem, setHookSystem } from './chunk-RNZFGN4R.js';
30
30
  export { QueryFilterBuilder, TemplateRenderer, buildQuery, renderTemplate, templateRenderer } from './chunk-QZGABF2M.js';
31
31
  export { metricsTracker } from './chunk-FICTAGD4.js';
32
32
  import './chunk-X7ZAEI5S.js';
33
- import { getCoreVersion, package_default } from './chunk-JEX3UPZL.js';
34
- export { SONICJS_VERSION, getCoreVersion } from './chunk-JEX3UPZL.js';
33
+ import { getCoreVersion, package_default } from './chunk-73O4GPJ6.js';
34
+ export { SONICJS_VERSION, getCoreVersion } from './chunk-73O4GPJ6.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';
@@ -7006,14 +7006,18 @@ function renderApiKeysPage(data) {
7006
7006
 
7007
7007
  <!-- Newly-created secret banner (populated by JS, shown once) -->
7008
7008
  <div id="new-key-banner" class="hidden mb-6 rounded-xl bg-emerald-50 dark:bg-emerald-900/20 p-4 ring-1 ring-emerald-200 dark:ring-emerald-800">
7009
- <p class="text-sm font-medium text-emerald-800 dark:text-emerald-300 mb-2">
7010
- Copy your new key now \u2014 it will not be shown again.
7011
- </p>
7009
+ <div class="flex items-start justify-between mb-2">
7010
+ <p class="text-sm font-medium text-emerald-800 dark:text-emerald-300">
7011
+ Copy your new key now \u2014 it will not be shown again.
7012
+ </p>
7013
+ <button type="button" onclick="document.getElementById('new-key-banner').classList.add('hidden')"
7014
+ class="ml-4 text-emerald-600 dark:text-emerald-400 hover:text-emerald-800 dark:hover:text-emerald-200 text-lg leading-none">&times;</button>
7015
+ </div>
7012
7016
  <div class="flex items-center gap-2">
7013
7017
  <code id="new-key-value" class="flex-1 rounded-lg bg-white dark:bg-zinc-900 px-3 py-2 text-sm font-mono text-zinc-950 dark:text-white ring-1 ring-zinc-950/10 dark:ring-white/10 break-all"></code>
7014
7018
  <button type="button" onclick="copyNewKey()"
7015
7019
  class="rounded-lg bg-emerald-600 px-3 py-2 text-sm font-semibold text-white hover:bg-emerald-500 transition-colors">
7016
- Copy
7020
+ Copy &amp; dismiss
7017
7021
  </button>
7018
7022
  </div>
7019
7023
  </div>
@@ -7085,11 +7089,50 @@ function renderApiKeysPage(data) {
7085
7089
  document.getElementById('create-key-modal').classList.add('hidden')
7086
7090
  document.getElementById('new-key-value').textContent = apiKey.key
7087
7091
  document.getElementById('new-key-banner').classList.remove('hidden')
7088
- setTimeout(() => location.reload(), 1500)
7092
+ // Add new key row to table immediately so user can see it without reloading
7093
+ const tbody = document.getElementById('keys-tbody')
7094
+ const emptyRow = tbody.querySelector('td[colspan]')
7095
+ if (emptyRow) emptyRow.closest('tr').remove()
7096
+ const tr = document.createElement('tr')
7097
+ tr.className = 'border-t border-zinc-950/5 dark:border-white/10'
7098
+ tr.setAttribute('data-key-id', apiKey.id)
7099
+ const prefix = apiKey.prefix
7100
+ const today = new Date().toISOString().slice(0, 10)
7101
+ const expires = apiKey.expiresAt ? new Date(apiKey.expiresAt).toISOString().slice(0, 10) : 'Never'
7102
+ // Build row using DOM methods to avoid nested template-literal escaping issues
7103
+ const nameTd = document.createElement('td')
7104
+ nameTd.className = 'py-3 pr-4 text-sm font-medium text-zinc-950 dark:text-white'
7105
+ nameTd.textContent = apiKey.name
7106
+ const prefixTd = document.createElement('td')
7107
+ prefixTd.className = 'py-3 pr-4 text-sm font-mono text-zinc-500 dark:text-zinc-400'
7108
+ prefixTd.textContent = prefix + '\u2026'
7109
+ const createdTd = document.createElement('td')
7110
+ createdTd.className = 'py-3 pr-4 text-sm text-zinc-500 dark:text-zinc-400'
7111
+ createdTd.textContent = today
7112
+ const lastUsedTd = document.createElement('td')
7113
+ lastUsedTd.className = 'py-3 pr-4 text-sm text-zinc-500 dark:text-zinc-400'
7114
+ lastUsedTd.textContent = 'Never'
7115
+ const expiresTd = document.createElement('td')
7116
+ expiresTd.className = 'py-3 pr-4 text-sm text-zinc-500 dark:text-zinc-400'
7117
+ expiresTd.textContent = expires
7118
+ const actionsTd = document.createElement('td')
7119
+ actionsTd.className = 'py-3 text-right'
7120
+ const revokeBtn = document.createElement('button')
7121
+ revokeBtn.type = 'button'
7122
+ revokeBtn.className = 'rounded-lg bg-red-50 dark:bg-red-900/20 px-3 py-1.5 text-sm font-medium text-red-700 dark:text-red-400 hover:bg-red-100 dark:hover:bg-red-900/40 ring-1 ring-red-200 dark:ring-red-800 transition-colors'
7123
+ revokeBtn.textContent = 'Revoke'
7124
+ revokeBtn.addEventListener('click', () => revokeApiKey(apiKey.id, apiKey.name))
7125
+ actionsTd.appendChild(revokeBtn)
7126
+ tr.appendChild(nameTd); tr.appendChild(prefixTd); tr.appendChild(createdTd)
7127
+ tr.appendChild(lastUsedTd); tr.appendChild(expiresTd); tr.appendChild(actionsTd)
7128
+ tbody.appendChild(tr)
7089
7129
  }
7090
7130
  function copyNewKey() {
7091
7131
  const v = document.getElementById('new-key-value').textContent
7092
- navigator.clipboard.writeText(v).then(() => window.showNotification && window.showNotification('Copied', 'success'))
7132
+ navigator.clipboard.writeText(v).then(() => {
7133
+ window.showNotification && window.showNotification('Copied to clipboard', 'success')
7134
+ document.getElementById('new-key-banner').classList.add('hidden')
7135
+ })
7093
7136
  }
7094
7137
  async function revokeApiKey(id, name) {
7095
7138
  if (!confirm('Revoke "' + name + '"? This cannot be undone and will break any client using it.')) return