@sonicjs-cms/core 2.0.0 → 2.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. package/dist/chunk-3NVJ6W27.cjs +1076 -0
  2. package/dist/chunk-3NVJ6W27.cjs.map +1 -0
  3. package/dist/chunk-4BJGEGX5.cjs +236 -0
  4. package/dist/chunk-4BJGEGX5.cjs.map +1 -0
  5. package/dist/{chunk-QUMBDPNJ.cjs → chunk-7G6XT62S.cjs} +4583 -540
  6. package/dist/chunk-7G6XT62S.cjs.map +1 -0
  7. package/dist/{chunk-ET5I4GBD.cjs → chunk-ALOS2CBJ.cjs} +194 -4
  8. package/dist/chunk-ALOS2CBJ.cjs.map +1 -0
  9. package/dist/{chunk-7N3HK7ZK.js → chunk-CDBVZEWR.js} +7 -904
  10. package/dist/chunk-CDBVZEWR.js.map +1 -0
  11. package/dist/{chunk-BITQ4MFX.js → chunk-EAELJXRV.js} +93 -115
  12. package/dist/chunk-EAELJXRV.js.map +1 -0
  13. package/dist/chunk-EGFHFM4N.cjs +76 -0
  14. package/dist/chunk-EGFHFM4N.cjs.map +1 -0
  15. package/dist/chunk-FICTAGD4.js +59 -0
  16. package/dist/chunk-FICTAGD4.js.map +1 -0
  17. package/dist/{chunk-FVMV5DKA.cjs → chunk-HJZOA2O5.cjs} +93 -115
  18. package/dist/chunk-HJZOA2O5.cjs.map +1 -0
  19. package/dist/{chunk-RNR4HA23.cjs → chunk-LEG4KNFP.cjs} +6 -945
  20. package/dist/chunk-LEG4KNFP.cjs.map +1 -0
  21. package/dist/chunk-LH4Z7QID.js +1030 -0
  22. package/dist/chunk-LH4Z7QID.js.map +1 -0
  23. package/dist/chunk-M6FPVS7E.js +214 -0
  24. package/dist/chunk-M6FPVS7E.js.map +1 -0
  25. package/dist/{chunk-P3VS4DV3.js → chunk-O46XKBFM.js} +193 -5
  26. package/dist/chunk-O46XKBFM.js.map +1 -0
  27. package/dist/chunk-P2PTTBO5.js +74 -0
  28. package/dist/chunk-P2PTTBO5.js.map +1 -0
  29. package/dist/chunk-RCQ2HIQD.cjs +61 -0
  30. package/dist/chunk-RCQ2HIQD.cjs.map +1 -0
  31. package/dist/{chunk-JETM2U2D.js → chunk-SGGHTIWV.js} +4414 -374
  32. package/dist/chunk-SGGHTIWV.js.map +1 -0
  33. package/dist/{chunk-RGCQSFKC.cjs → chunk-UL32L2KV.cjs} +9 -58
  34. package/dist/chunk-UL32L2KV.cjs.map +1 -0
  35. package/dist/{chunk-JIINOD2W.js → chunk-XJETEIRU.js} +8 -58
  36. package/dist/chunk-XJETEIRU.js.map +1 -0
  37. package/dist/index.cjs +241 -218
  38. package/dist/index.cjs.map +1 -1
  39. package/dist/index.js +20 -15
  40. package/dist/index.js.map +1 -1
  41. package/dist/middleware.cjs +27 -22
  42. package/dist/middleware.js +3 -2
  43. package/dist/plugins.cjs +7 -7
  44. package/dist/plugins.js +1 -1
  45. package/dist/routes.cjs +36 -23
  46. package/dist/routes.js +7 -6
  47. package/dist/services.cjs +28 -28
  48. package/dist/services.js +2 -2
  49. package/dist/templates.cjs +24 -24
  50. package/dist/templates.js +2 -2
  51. package/dist/utils.cjs +20 -11
  52. package/dist/utils.js +2 -1
  53. package/package.json +2 -16
  54. package/dist/chunk-3MNMOLSA.js +0 -133
  55. package/dist/chunk-3MNMOLSA.js.map +0 -1
  56. package/dist/chunk-4XI3YBKU.cjs +0 -266
  57. package/dist/chunk-4XI3YBKU.cjs.map +0 -1
  58. package/dist/chunk-7N3HK7ZK.js.map +0 -1
  59. package/dist/chunk-AGOE25LF.cjs +0 -137
  60. package/dist/chunk-AGOE25LF.cjs.map +0 -1
  61. package/dist/chunk-BITQ4MFX.js.map +0 -1
  62. package/dist/chunk-BUKT6HP5.cjs +0 -776
  63. package/dist/chunk-BUKT6HP5.cjs.map +0 -1
  64. package/dist/chunk-ET5I4GBD.cjs.map +0 -1
  65. package/dist/chunk-FVMV5DKA.cjs.map +0 -1
  66. package/dist/chunk-JETM2U2D.js.map +0 -1
  67. package/dist/chunk-JIINOD2W.js.map +0 -1
  68. package/dist/chunk-LU6J53IX.js +0 -262
  69. package/dist/chunk-LU6J53IX.js.map +0 -1
  70. package/dist/chunk-P3VS4DV3.js.map +0 -1
  71. package/dist/chunk-QUMBDPNJ.cjs.map +0 -1
  72. package/dist/chunk-RGCQSFKC.cjs.map +0 -1
  73. package/dist/chunk-RNR4HA23.cjs.map +0 -1
  74. package/dist/chunk-WESS2U3K.js +0 -755
  75. package/dist/chunk-WESS2U3K.js.map +0 -1
@@ -0,0 +1,76 @@
1
+ 'use strict';
2
+
3
+ var chunkALOS2CBJ_cjs = require('./chunk-ALOS2CBJ.cjs');
4
+
5
+ // src/templates/filter-bar.template.ts
6
+ function renderFilterBar(data) {
7
+ return `
8
+ <div class="rounded-xl bg-white dark:bg-zinc-900 shadow-sm ring-1 ring-zinc-950/5 dark:ring-white/10 p-6 mb-6">
9
+ <form id="filter-form" class="flex flex-wrap gap-4 items-center">
10
+ ${data.filters.map((filter) => `
11
+ <div class="flex items-center space-x-2">
12
+ <label class="text-sm font-medium text-zinc-500 dark:text-zinc-400">${filter.label}:</label>
13
+ <select
14
+ name="${filter.name}"
15
+ class="rounded-lg bg-white dark:bg-zinc-800 px-3 py-2 text-sm text-zinc-950 dark:text-white ring-1 ring-inset ring-zinc-950/10 dark:ring-white/10 focus:ring-2 focus:ring-blue-600 dark:focus:ring-blue-500 focus:outline-none transition-colors"
16
+ onchange="updateFilters()"
17
+ >
18
+ ${filter.options.map((option) => `
19
+ <option value="${option.value}" ${option.selected ? "selected" : ""}>
20
+ ${option.label}
21
+ </option>
22
+ `).join("")}
23
+ </select>
24
+ </div>
25
+ `).join("")}
26
+
27
+ ${data.actions && data.actions.length > 0 ? `
28
+ <div class="flex items-center space-x-2 ml-auto">
29
+ ${data.actions.map((action) => `
30
+ <button
31
+ type="button"
32
+ class="inline-flex items-center rounded-lg bg-white dark:bg-zinc-800 px-3 py-2 text-sm font-semibold text-zinc-950 dark:text-white ring-1 ring-inset ring-zinc-950/10 dark:ring-white/10 hover:bg-zinc-50 dark:hover:bg-zinc-700 transition-colors"
33
+ ${action.onclick ? `onclick="${action.onclick}"` : ""}
34
+ ${action.hxGet ? `hx-get="${action.hxGet}"` : ""}
35
+ ${action.hxTarget ? `hx-target="${action.hxTarget}"` : ""}
36
+ >
37
+ ${action.label}
38
+ </button>
39
+ `).join("")}
40
+ </div>
41
+ ` : ""}
42
+ </form>
43
+
44
+ <script>
45
+ function updateFilters() {
46
+ const form = document.getElementById('filter-form');
47
+ const formData = new FormData(form);
48
+ const params = new URLSearchParams(window.location.search);
49
+
50
+ // Update params with form values
51
+ for (const [key, value] of formData.entries()) {
52
+ if (value) {
53
+ params.set(key, value);
54
+ } else {
55
+ params.delete(key);
56
+ }
57
+ }
58
+
59
+ // Reset to page 1 when filters change
60
+ params.set('page', '1');
61
+
62
+ // Update URL and reload
63
+ window.location.href = window.location.pathname + '?' + params.toString();
64
+ }
65
+ </script>
66
+ </div>
67
+ `;
68
+ }
69
+
70
+ // src/templates/index.ts
71
+ chunkALOS2CBJ_cjs.init_admin_layout_catalyst_template();
72
+ chunkALOS2CBJ_cjs.init_logo_template();
73
+
74
+ exports.renderFilterBar = renderFilterBar;
75
+ //# sourceMappingURL=chunk-EGFHFM4N.cjs.map
76
+ //# sourceMappingURL=chunk-EGFHFM4N.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/templates/filter-bar.template.ts","../src/templates/index.ts"],"names":["init_admin_layout_catalyst_template","init_logo_template"],"mappings":";;;;;AA8BO,SAAS,gBAAgB,IAAA,EAA6B;AAC3D,EAAA,OAAO;AAAA;AAAA;AAAA,QAAA,EAGC,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,CAAA,MAAA,KAAU;AAAA;AAAA,gFAAA,EAE6C,OAAO,KAAK,CAAA;AAAA;AAAA,oBAAA,EAExE,OAAO,IAAI,CAAA;AAAA;AAAA;AAAA;AAAA,cAAA,EAIjB,MAAA,CAAO,OAAA,CAAQ,GAAA,CAAI,CAAA,MAAA,KAAU;AAAA,+BAAA,EACZ,OAAO,KAAK,CAAA,EAAA,EAAK,MAAA,CAAO,QAAA,GAAW,aAAa,EAAE,CAAA;AAAA,kBAAA,EAC/D,OAAO,KAAK;AAAA;AAAA,cAAA,CAEjB,CAAA,CAAE,IAAA,CAAK,EAAE,CAAC;AAAA;AAAA;AAAA,QAAA,CAGhB,CAAA,CAAE,IAAA,CAAK,EAAE,CAAC;;AAAA,QAAA,EAET,IAAA,CAAK,OAAA,IAAW,IAAA,CAAK,OAAA,CAAQ,SAAS,CAAA,GAAI;AAAA;AAAA,YAAA,EAEtC,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,CAAA,MAAA,KAAU;AAAA;AAAA;AAAA;AAAA,gBAAA,EAIvB,OAAO,OAAA,GAAU,CAAA,SAAA,EAAY,MAAA,CAAO,OAAO,MAAM,EAAE;AAAA,gBAAA,EACnD,OAAO,KAAA,GAAQ,CAAA,QAAA,EAAW,MAAA,CAAO,KAAK,MAAM,EAAE;AAAA,gBAAA,EAC9C,OAAO,QAAA,GAAW,CAAA,WAAA,EAAc,MAAA,CAAO,QAAQ,MAAM,EAAE;AAAA;AAAA,gBAAA,EAEvD,OAAO,KAAK;AAAA;AAAA,YAAA,CAEjB,CAAA,CAAE,IAAA,CAAK,EAAE,CAAC;AAAA;AAAA,QAAA,CAAA,GAEX,EAAE;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AA2Bd;;;AC5DAA,qDAAA,EAAA;AAKAC,oCAAA,EAAA","file":"chunk-EGFHFM4N.cjs","sourcesContent":["export interface FilterOption {\n value: string\n label: string\n selected?: boolean\n color?: string\n}\n\nexport interface Filter {\n name: string\n label: string\n options: FilterOption[]\n}\n\nexport interface FilterBarData {\n filters: Filter[]\n actions?: Array<{\n label: string\n className?: string\n onclick?: string\n hxGet?: string\n hxTarget?: string\n }>\n bulkActions?: Array<{\n label: string\n value: string\n icon?: string\n className?: string\n }>\n}\n\nexport function renderFilterBar(data: FilterBarData): string {\n return `\n <div class=\"rounded-xl bg-white dark:bg-zinc-900 shadow-sm ring-1 ring-zinc-950/5 dark:ring-white/10 p-6 mb-6\">\n <form id=\"filter-form\" class=\"flex flex-wrap gap-4 items-center\">\n ${data.filters.map(filter => `\n <div class=\"flex items-center space-x-2\">\n <label class=\"text-sm font-medium text-zinc-500 dark:text-zinc-400\">${filter.label}:</label>\n <select\n name=\"${filter.name}\"\n class=\"rounded-lg bg-white dark:bg-zinc-800 px-3 py-2 text-sm text-zinc-950 dark:text-white ring-1 ring-inset ring-zinc-950/10 dark:ring-white/10 focus:ring-2 focus:ring-blue-600 dark:focus:ring-blue-500 focus:outline-none transition-colors\"\n onchange=\"updateFilters()\"\n >\n ${filter.options.map(option => `\n <option value=\"${option.value}\" ${option.selected ? 'selected' : ''}>\n ${option.label}\n </option>\n `).join('')}\n </select>\n </div>\n `).join('')}\n\n ${data.actions && data.actions.length > 0 ? `\n <div class=\"flex items-center space-x-2 ml-auto\">\n ${data.actions.map(action => `\n <button\n type=\"button\"\n class=\"inline-flex items-center rounded-lg bg-white dark:bg-zinc-800 px-3 py-2 text-sm font-semibold text-zinc-950 dark:text-white ring-1 ring-inset ring-zinc-950/10 dark:ring-white/10 hover:bg-zinc-50 dark:hover:bg-zinc-700 transition-colors\"\n ${action.onclick ? `onclick=\"${action.onclick}\"` : ''}\n ${action.hxGet ? `hx-get=\"${action.hxGet}\"` : ''}\n ${action.hxTarget ? `hx-target=\"${action.hxTarget}\"` : ''}\n >\n ${action.label}\n </button>\n `).join('')}\n </div>\n ` : ''}\n </form>\n\n <script>\n function updateFilters() {\n const form = document.getElementById('filter-form');\n const formData = new FormData(form);\n const params = new URLSearchParams(window.location.search);\n\n // Update params with form values\n for (const [key, value] of formData.entries()) {\n if (value) {\n params.set(key, value);\n } else {\n params.delete(key);\n }\n }\n\n // Reset to page 1 when filters change\n params.set('page', '1');\n\n // Update URL and reload\n window.location.href = window.location.pathname + '?' + params.toString();\n }\n </script>\n </div>\n `\n}","/**\n * Templates Module Exports\n *\n * Reusable HTML template components for SonicJS\n */\n\n// Form templates\nexport { renderForm, renderFormField } from './form.template'\nexport type { FormField, FormData } from './form.template'\n\n// Table templates\nexport { renderTable } from './table.template'\nexport type { TableColumn, TableData } from './table.template'\n\n// Pagination templates\nexport { renderPagination } from './pagination.template'\nexport type { PaginationData } from './pagination.template'\n\n// Alert templates\nexport { renderAlert } from './alert.template'\nexport type { AlertData } from './alert.template'\n\n// Confirmation dialog templates\nexport { renderConfirmationDialog, getConfirmationDialogScript } from './confirmation-dialog.template'\nexport type { ConfirmationDialogOptions } from './confirmation-dialog.template'\n\n// Filter bar templates\nexport { renderFilterBar } from './filter-bar.template'\nexport type { FilterBarData, Filter, FilterOption } from './filter-bar.template'\n\n// Layout templates\nexport { renderAdminLayout } from './layouts/admin-layout-v2.template'\nexport { renderAdminLayoutCatalyst } from './layouts/admin-layout-catalyst.template'\nexport type { AdminLayoutData } from './layouts/admin-layout-v2.template'\nexport type { AdminLayoutCatalystData } from './layouts/admin-layout-catalyst.template'\n\n// Component templates\nexport { renderLogo } from './components/logo.template'\n\n// Page templates - Admin\nexport { renderDesignPage } from './pages/admin-design.template'\nexport type { DesignPageData } from './pages/admin-design.template'\nexport { renderCheckboxPage } from './pages/admin-checkboxes.template'\nexport type { CheckboxPageData } from './pages/admin-checkboxes.template'\nexport { renderFAQList } from './pages/admin-faq-list.template'\nexport { renderTestimonialsList } from './pages/admin-testimonials-list.template'\nexport { renderCodeExamplesList } from './pages/admin-code-examples-list.template'\n"]}
@@ -0,0 +1,59 @@
1
+ // src/utils/metrics.ts
2
+ var MetricsTracker = class {
3
+ requests = [];
4
+ windowSize = 1e4;
5
+ // 10 seconds window
6
+ /**
7
+ * Record a new request
8
+ */
9
+ recordRequest() {
10
+ const now = Date.now();
11
+ this.requests.push({ timestamp: now });
12
+ this.cleanup(now);
13
+ }
14
+ /**
15
+ * Clean up old requests outside the window
16
+ */
17
+ cleanup(now) {
18
+ const cutoff = now - this.windowSize;
19
+ this.requests = this.requests.filter((req) => req.timestamp > cutoff);
20
+ }
21
+ /**
22
+ * Get current requests per second
23
+ */
24
+ getRequestsPerSecond() {
25
+ const now = Date.now();
26
+ this.cleanup(now);
27
+ if (this.requests.length === 0) {
28
+ return 0;
29
+ }
30
+ const oneSecondAgo = now - 1e3;
31
+ const recentRequests = this.requests.filter((req) => req.timestamp > oneSecondAgo);
32
+ return recentRequests.length;
33
+ }
34
+ /**
35
+ * Get total requests in the current window
36
+ */
37
+ getTotalRequests() {
38
+ const now = Date.now();
39
+ this.cleanup(now);
40
+ return this.requests.length;
41
+ }
42
+ /**
43
+ * Get average requests per second over the window
44
+ */
45
+ getAverageRPS() {
46
+ const now = Date.now();
47
+ this.cleanup(now);
48
+ if (this.requests.length === 0) {
49
+ return 0;
50
+ }
51
+ const windowSeconds = this.windowSize / 1e3;
52
+ return this.requests.length / windowSeconds;
53
+ }
54
+ };
55
+ var metricsTracker = new MetricsTracker();
56
+
57
+ export { metricsTracker };
58
+ //# sourceMappingURL=chunk-FICTAGD4.js.map
59
+ //# sourceMappingURL=chunk-FICTAGD4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/metrics.ts"],"names":[],"mappings":";AASA,IAAM,iBAAN,MAAqB;AAAA,EACX,WAA6B,EAAC;AAAA,EACrB,UAAA,GAAa,GAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAK9B,aAAA,GAAsB;AACpB,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,EAAE,SAAA,EAAW,KAAK,CAAA;AACrC,IAAA,IAAA,CAAK,QAAQ,GAAG,CAAA;AAAA;AAClB;AAAA;AAAA;AAAA,EAKQ,QAAQ,GAAA,EAAmB;AACjC,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,UAAA;AAC1B,IAAA,IAAA,CAAK,WAAW,IAAA,CAAK,QAAA,CAAS,OAAO,CAAA,GAAA,KAAO,GAAA,CAAI,YAAY,MAAM,CAAA;AAAA;AACpE;AAAA;AAAA;AAAA,EAKA,oBAAA,GAA+B;AAC7B,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,IAAA,CAAK,QAAQ,GAAG,CAAA;AAEhB,IAAA,IAAI,IAAA,CAAK,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG;AAC9B,MAAA,OAAO,CAAA;AAAA;AAIT,IAAA,MAAM,eAAe,GAAA,GAAM,GAAA;AAC3B,IAAA,MAAM,iBAAiB,IAAA,CAAK,QAAA,CAAS,OAAO,CAAA,GAAA,KAAO,GAAA,CAAI,YAAY,YAAY,CAAA;AAE/E,IAAA,OAAO,cAAA,CAAe,MAAA;AAAA;AACxB;AAAA;AAAA;AAAA,EAKA,gBAAA,GAA2B;AACzB,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,IAAA,CAAK,QAAQ,GAAG,CAAA;AAChB,IAAA,OAAO,KAAK,QAAA,CAAS,MAAA;AAAA;AACvB;AAAA;AAAA;AAAA,EAKA,aAAA,GAAwB;AACtB,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,IAAA,CAAK,QAAQ,GAAG,CAAA;AAEhB,IAAA,IAAI,IAAA,CAAK,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG;AAC9B,MAAA,OAAO,CAAA;AAAA;AAGT,IAAA,MAAM,aAAA,GAAgB,KAAK,UAAA,GAAa,GAAA;AACxC,IAAA,OAAO,IAAA,CAAK,SAAS,MAAA,GAAS,aAAA;AAAA;AAElC,CAAA;AAGO,IAAM,cAAA,GAAiB,IAAI,cAAA","file":"chunk-FICTAGD4.js","sourcesContent":["/**\n * Simple in-memory metrics tracker for real-time analytics\n * Tracks requests per second using a sliding window\n */\n\ninterface RequestMetrics {\n timestamp: number\n}\n\nclass MetricsTracker {\n private requests: RequestMetrics[] = []\n private readonly windowSize = 10000 // 10 seconds window\n\n /**\n * Record a new request\n */\n recordRequest(): void {\n const now = Date.now()\n this.requests.push({ timestamp: now })\n this.cleanup(now)\n }\n\n /**\n * Clean up old requests outside the window\n */\n private cleanup(now: number): void {\n const cutoff = now - this.windowSize\n this.requests = this.requests.filter(req => req.timestamp > cutoff)\n }\n\n /**\n * Get current requests per second\n */\n getRequestsPerSecond(): number {\n const now = Date.now()\n this.cleanup(now)\n\n if (this.requests.length === 0) {\n return 0\n }\n\n // Calculate RPS over the last second\n const oneSecondAgo = now - 1000\n const recentRequests = this.requests.filter(req => req.timestamp > oneSecondAgo)\n\n return recentRequests.length\n }\n\n /**\n * Get total requests in the current window\n */\n getTotalRequests(): number {\n const now = Date.now()\n this.cleanup(now)\n return this.requests.length\n }\n\n /**\n * Get average requests per second over the window\n */\n getAverageRPS(): number {\n const now = Date.now()\n this.cleanup(now)\n\n if (this.requests.length === 0) {\n return 0\n }\n\n const windowSeconds = this.windowSize / 1000\n return this.requests.length / windowSeconds\n }\n}\n\n// Global singleton instance\nexport const metricsTracker = new MetricsTracker()\n"]}