@sonicjs-cms/core 2.0.1 → 2.0.3

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 (65) hide show
  1. package/dist/{chunk-O46XKBFM.js → chunk-3LZ6TLPC.js} +14 -24
  2. package/dist/chunk-3LZ6TLPC.js.map +1 -0
  3. package/dist/{chunk-SRCY43RN.cjs → chunk-3NVJ6W27.cjs} +2 -2
  4. package/dist/chunk-3NVJ6W27.cjs.map +1 -0
  5. package/dist/{chunk-ALOS2CBJ.cjs → chunk-3SPQ3J4N.cjs} +14 -24
  6. package/dist/chunk-3SPQ3J4N.cjs.map +1 -0
  7. package/dist/chunk-4BJGEGX5.cjs +236 -0
  8. package/dist/chunk-4BJGEGX5.cjs.map +1 -0
  9. package/dist/{chunk-EGFHFM4N.cjs → chunk-5APKEYFK.cjs} +5 -5
  10. package/dist/{chunk-EGFHFM4N.cjs.map → chunk-5APKEYFK.cjs.map} +1 -1
  11. package/dist/{chunk-5FDDDD4J.cjs → chunk-5B3VMVEX.cjs} +559 -390
  12. package/dist/chunk-5B3VMVEX.cjs.map +1 -0
  13. package/dist/chunk-CDBVZEWR.js.map +1 -1
  14. package/dist/{chunk-BITQ4MFX.js → chunk-EAELJXRV.js} +93 -115
  15. package/dist/chunk-EAELJXRV.js.map +1 -0
  16. package/dist/chunk-FICTAGD4.js +59 -0
  17. package/dist/chunk-FICTAGD4.js.map +1 -0
  18. package/dist/{chunk-FVMV5DKA.cjs → chunk-HJZOA2O5.cjs} +93 -115
  19. package/dist/chunk-HJZOA2O5.cjs.map +1 -0
  20. package/dist/chunk-LEG4KNFP.cjs.map +1 -1
  21. package/dist/{chunk-5XTB4FE5.js → chunk-LH4Z7QID.js} +2 -2
  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-QSF34IYQ.js → chunk-PPUKPNTP.js} +401 -232
  26. package/dist/chunk-PPUKPNTP.js.map +1 -0
  27. package/dist/chunk-RCQ2HIQD.cjs +61 -0
  28. package/dist/chunk-RCQ2HIQD.cjs.map +1 -0
  29. package/dist/{chunk-P2PTTBO5.js → chunk-RYQCT2IV.js} +3 -3
  30. package/dist/{chunk-P2PTTBO5.js.map → chunk-RYQCT2IV.js.map} +1 -1
  31. package/dist/{chunk-NK6FN5R5.cjs → chunk-UL32L2KV.cjs} +3 -60
  32. package/dist/chunk-UL32L2KV.cjs.map +1 -0
  33. package/dist/{chunk-OL2OE3VJ.js → chunk-XJETEIRU.js} +4 -60
  34. package/dist/chunk-XJETEIRU.js.map +1 -0
  35. package/dist/index.cjs +145 -130
  36. package/dist/index.cjs.map +1 -1
  37. package/dist/index.js +19 -15
  38. package/dist/index.js.map +1 -1
  39. package/dist/middleware.cjs +26 -21
  40. package/dist/middleware.js +2 -1
  41. package/dist/plugins.cjs +7 -7
  42. package/dist/plugins.js +1 -1
  43. package/dist/routes.cjs +26 -25
  44. package/dist/routes.js +6 -5
  45. package/dist/services.cjs +7 -7
  46. package/dist/services.js +1 -1
  47. package/dist/templates.cjs +18 -18
  48. package/dist/templates.js +2 -2
  49. package/dist/utils.cjs +16 -15
  50. package/dist/utils.js +2 -1
  51. package/package.json +1 -1
  52. package/dist/chunk-5FDDDD4J.cjs.map +0 -1
  53. package/dist/chunk-5XTB4FE5.js.map +0 -1
  54. package/dist/chunk-ALOS2CBJ.cjs.map +0 -1
  55. package/dist/chunk-BITQ4MFX.js.map +0 -1
  56. package/dist/chunk-FVMV5DKA.cjs.map +0 -1
  57. package/dist/chunk-KM4AJFXI.cjs +0 -101
  58. package/dist/chunk-KM4AJFXI.cjs.map +0 -1
  59. package/dist/chunk-NK6FN5R5.cjs.map +0 -1
  60. package/dist/chunk-O46XKBFM.js.map +0 -1
  61. package/dist/chunk-OL2OE3VJ.js.map +0 -1
  62. package/dist/chunk-QSF34IYQ.js.map +0 -1
  63. package/dist/chunk-SRCY43RN.cjs.map +0 -1
  64. package/dist/chunk-TY3NHEBN.js +0 -80
  65. package/dist/chunk-TY3NHEBN.js.map +0 -1
@@ -0,0 +1,236 @@
1
+ 'use strict';
2
+
3
+ var chunkLEG4KNFP_cjs = require('./chunk-LEG4KNFP.cjs');
4
+ var chunkRCQ2HIQD_cjs = require('./chunk-RCQ2HIQD.cjs');
5
+ var jwt = require('hono/jwt');
6
+ var cookie = require('hono/cookie');
7
+
8
+ // src/middleware/bootstrap.ts
9
+ var bootstrapComplete = false;
10
+ function bootstrapMiddleware() {
11
+ return async (c, next) => {
12
+ if (bootstrapComplete) {
13
+ return next();
14
+ }
15
+ const path = c.req.path;
16
+ if (path.startsWith("/images/") || path.startsWith("/assets/") || path === "/health" || path.endsWith(".js") || path.endsWith(".css") || path.endsWith(".png") || path.endsWith(".jpg") || path.endsWith(".ico")) {
17
+ return next();
18
+ }
19
+ try {
20
+ console.log("[Bootstrap] Starting system initialization...");
21
+ console.log("[Bootstrap] Running database migrations...");
22
+ const migrationService = new chunkLEG4KNFP_cjs.MigrationService(c.env.DB);
23
+ await migrationService.runPendingMigrations();
24
+ console.log("[Bootstrap] Syncing collection configurations...");
25
+ try {
26
+ await chunkLEG4KNFP_cjs.syncCollections(c.env.DB);
27
+ } catch (error) {
28
+ console.error("[Bootstrap] Error syncing collections:", error);
29
+ }
30
+ console.log("[Bootstrap] Bootstrapping core plugins...");
31
+ const bootstrapService = new chunkLEG4KNFP_cjs.PluginBootstrapService(c.env.DB);
32
+ const needsBootstrap = await bootstrapService.isBootstrapNeeded();
33
+ if (needsBootstrap) {
34
+ await bootstrapService.bootstrapCorePlugins();
35
+ }
36
+ bootstrapComplete = true;
37
+ console.log("[Bootstrap] System initialization completed");
38
+ } catch (error) {
39
+ console.error("[Bootstrap] Error during system initialization:", error);
40
+ }
41
+ return next();
42
+ };
43
+ }
44
+ var JWT_SECRET = "your-super-secret-jwt-key-change-in-production";
45
+ var AuthManager = class {
46
+ static async generateToken(userId, email, role) {
47
+ const payload = {
48
+ userId,
49
+ email,
50
+ role,
51
+ exp: Math.floor(Date.now() / 1e3) + 60 * 60 * 24,
52
+ // 24 hours
53
+ iat: Math.floor(Date.now() / 1e3)
54
+ };
55
+ return await jwt.sign(payload, JWT_SECRET);
56
+ }
57
+ static async verifyToken(token) {
58
+ try {
59
+ const payload = await jwt.verify(token, JWT_SECRET);
60
+ if (payload.exp < Math.floor(Date.now() / 1e3)) {
61
+ return null;
62
+ }
63
+ return payload;
64
+ } catch (error) {
65
+ console.error("Token verification failed:", error);
66
+ return null;
67
+ }
68
+ }
69
+ static async hashPassword(password) {
70
+ const encoder = new TextEncoder();
71
+ const data = encoder.encode(password + "salt-change-in-production");
72
+ const hashBuffer = await crypto.subtle.digest("SHA-256", data);
73
+ const hashArray = Array.from(new Uint8Array(hashBuffer));
74
+ return hashArray.map((b) => b.toString(16).padStart(2, "0")).join("");
75
+ }
76
+ static async verifyPassword(password, hash) {
77
+ const passwordHash = await this.hashPassword(password);
78
+ return passwordHash === hash;
79
+ }
80
+ };
81
+ var requireAuth = () => {
82
+ return async (c, next) => {
83
+ try {
84
+ let token = c.req.header("Authorization")?.replace("Bearer ", "");
85
+ if (!token) {
86
+ token = cookie.getCookie(c, "auth_token");
87
+ }
88
+ if (!token) {
89
+ const acceptHeader = c.req.header("Accept") || "";
90
+ if (acceptHeader.includes("text/html")) {
91
+ return c.redirect("/auth/login?error=Please login to access the admin area");
92
+ }
93
+ return c.json({ error: "Authentication required" }, 401);
94
+ }
95
+ const kv = c.env?.KV;
96
+ let payload = null;
97
+ if (kv) {
98
+ const cacheKey = `auth:${token.substring(0, 20)}`;
99
+ const cached = await kv.get(cacheKey, "json");
100
+ if (cached) {
101
+ payload = cached;
102
+ }
103
+ }
104
+ if (!payload) {
105
+ payload = await AuthManager.verifyToken(token);
106
+ if (payload && kv) {
107
+ const cacheKey = `auth:${token.substring(0, 20)}`;
108
+ await kv.put(cacheKey, JSON.stringify(payload), { expirationTtl: 300 });
109
+ }
110
+ }
111
+ if (!payload) {
112
+ const acceptHeader = c.req.header("Accept") || "";
113
+ if (acceptHeader.includes("text/html")) {
114
+ return c.redirect("/auth/login?error=Your session has expired, please login again");
115
+ }
116
+ return c.json({ error: "Invalid or expired token" }, 401);
117
+ }
118
+ c.set("user", payload);
119
+ return await next();
120
+ } catch (error) {
121
+ console.error("Auth middleware error:", error);
122
+ const acceptHeader = c.req.header("Accept") || "";
123
+ if (acceptHeader.includes("text/html")) {
124
+ return c.redirect("/auth/login?error=Authentication failed, please login again");
125
+ }
126
+ return c.json({ error: "Authentication failed" }, 401);
127
+ }
128
+ };
129
+ };
130
+ var requireRole = (requiredRole) => {
131
+ return async (c, next) => {
132
+ const user = c.get("user");
133
+ if (!user) {
134
+ const acceptHeader = c.req.header("Accept") || "";
135
+ if (acceptHeader.includes("text/html")) {
136
+ return c.redirect("/auth/login?error=Please login to access the admin area");
137
+ }
138
+ return c.json({ error: "Authentication required" }, 401);
139
+ }
140
+ const roles = Array.isArray(requiredRole) ? requiredRole : [requiredRole];
141
+ if (!roles.includes(user.role)) {
142
+ const acceptHeader = c.req.header("Accept") || "";
143
+ if (acceptHeader.includes("text/html")) {
144
+ return c.redirect("/auth/login?error=You do not have permission to access this area");
145
+ }
146
+ return c.json({ error: "Insufficient permissions" }, 403);
147
+ }
148
+ return await next();
149
+ };
150
+ };
151
+ var optionalAuth = () => {
152
+ return async (c, next) => {
153
+ try {
154
+ let token = c.req.header("Authorization")?.replace("Bearer ", "");
155
+ if (!token) {
156
+ token = cookie.getCookie(c, "auth_token");
157
+ }
158
+ if (token) {
159
+ const payload = await AuthManager.verifyToken(token);
160
+ if (payload) {
161
+ c.set("user", payload);
162
+ }
163
+ }
164
+ return await next();
165
+ } catch (error) {
166
+ console.error("Optional auth error:", error);
167
+ return await next();
168
+ }
169
+ };
170
+ };
171
+
172
+ // src/middleware/metrics.ts
173
+ var metricsMiddleware = () => {
174
+ return async (c, next) => {
175
+ const path = new URL(c.req.url).pathname;
176
+ if (path !== "/admin/dashboard/api/metrics") {
177
+ chunkRCQ2HIQD_cjs.metricsTracker.recordRequest();
178
+ }
179
+ await next();
180
+ };
181
+ };
182
+
183
+ // src/middleware/index.ts
184
+ var loggingMiddleware = () => {
185
+ };
186
+ var detailedLoggingMiddleware = () => {
187
+ };
188
+ var securityLoggingMiddleware = () => {
189
+ };
190
+ var performanceLoggingMiddleware = () => {
191
+ };
192
+ var cacheHeaders = () => {
193
+ };
194
+ var compressionMiddleware = () => {
195
+ };
196
+ var securityHeaders = () => {
197
+ };
198
+ var PermissionManager = {};
199
+ var requirePermission = () => {
200
+ };
201
+ var requireAnyPermission = () => {
202
+ };
203
+ var logActivity = () => {
204
+ };
205
+ var requireActivePlugin = () => {
206
+ };
207
+ var requireActivePlugins = () => {
208
+ };
209
+ var getActivePlugins = () => {
210
+ };
211
+ var isPluginActive = () => {
212
+ };
213
+
214
+ exports.AuthManager = AuthManager;
215
+ exports.PermissionManager = PermissionManager;
216
+ exports.bootstrapMiddleware = bootstrapMiddleware;
217
+ exports.cacheHeaders = cacheHeaders;
218
+ exports.compressionMiddleware = compressionMiddleware;
219
+ exports.detailedLoggingMiddleware = detailedLoggingMiddleware;
220
+ exports.getActivePlugins = getActivePlugins;
221
+ exports.isPluginActive = isPluginActive;
222
+ exports.logActivity = logActivity;
223
+ exports.loggingMiddleware = loggingMiddleware;
224
+ exports.metricsMiddleware = metricsMiddleware;
225
+ exports.optionalAuth = optionalAuth;
226
+ exports.performanceLoggingMiddleware = performanceLoggingMiddleware;
227
+ exports.requireActivePlugin = requireActivePlugin;
228
+ exports.requireActivePlugins = requireActivePlugins;
229
+ exports.requireAnyPermission = requireAnyPermission;
230
+ exports.requireAuth = requireAuth;
231
+ exports.requirePermission = requirePermission;
232
+ exports.requireRole = requireRole;
233
+ exports.securityHeaders = securityHeaders;
234
+ exports.securityLoggingMiddleware = securityLoggingMiddleware;
235
+ //# sourceMappingURL=chunk-4BJGEGX5.cjs.map
236
+ //# sourceMappingURL=chunk-4BJGEGX5.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/middleware/bootstrap.ts","../src/middleware/auth.ts","../src/middleware/metrics.ts","../src/middleware/index.ts"],"names":["MigrationService","syncCollections","PluginBootstrapService","sign","verify","getCookie","metricsTracker"],"mappings":"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","file":"chunk-4BJGEGX5.cjs","sourcesContent":["import { Context, Next } from \"hono\";\nimport { syncCollections } from \"../services/collection-sync\";\nimport { MigrationService } from \"../services/migrations\";\nimport { PluginBootstrapService } from \"../services/plugin-bootstrap\";\n\ntype Bindings = {\n DB: D1Database;\n KV: KVNamespace;\n};\n\n// Track if bootstrap has been run in this worker instance\nlet bootstrapComplete = false;\n\n/**\n * Bootstrap middleware that ensures system initialization\n * Runs once per worker instance\n */\nexport function bootstrapMiddleware() {\n return async (c: Context<{ Bindings: Bindings }>, next: Next) => {\n // Skip if already bootstrapped in this worker instance\n if (bootstrapComplete) {\n return next();\n }\n\n // Skip bootstrap for static assets and health checks\n const path = c.req.path;\n if (\n path.startsWith(\"/images/\") ||\n path.startsWith(\"/assets/\") ||\n path === \"/health\" ||\n path.endsWith(\".js\") ||\n path.endsWith(\".css\") ||\n path.endsWith(\".png\") ||\n path.endsWith(\".jpg\") ||\n path.endsWith(\".ico\")\n ) {\n return next();\n }\n\n try {\n console.log(\"[Bootstrap] Starting system initialization...\");\n\n // 1. Run database migrations first\n console.log(\"[Bootstrap] Running database migrations...\");\n const migrationService = new MigrationService(c.env.DB);\n await migrationService.runPendingMigrations();\n\n // 2. Sync collection configurations\n console.log(\"[Bootstrap] Syncing collection configurations...\");\n try {\n await syncCollections(c.env.DB);\n } catch (error) {\n console.error(\"[Bootstrap] Error syncing collections:\", error);\n // Continue bootstrap even if collection sync fails\n }\n\n // 3. Bootstrap core plugins\n console.log(\"[Bootstrap] Bootstrapping core plugins...\");\n const bootstrapService = new PluginBootstrapService(c.env.DB);\n\n // Check if bootstrap is needed\n const needsBootstrap = await bootstrapService.isBootstrapNeeded();\n if (needsBootstrap) {\n await bootstrapService.bootstrapCorePlugins();\n }\n\n // Mark bootstrap as complete for this worker instance\n bootstrapComplete = true;\n console.log(\"[Bootstrap] System initialization completed\");\n } catch (error) {\n console.error(\"[Bootstrap] Error during system initialization:\", error);\n // Don't prevent the app from starting, but log the error\n }\n\n return next();\n };\n}\n\n/**\n * Reset bootstrap flag (useful for testing)\n */\nexport function resetBootstrap() {\n bootstrapComplete = false;\n}\n","import { sign, verify } from 'hono/jwt'\nimport { Context, Next } from 'hono'\nimport { getCookie } from 'hono/cookie'\n\ntype JWTPayload = {\n userId: string\n email: string\n role: string\n exp: number\n iat: number\n}\n\n// JWT secret - in production this should come from environment variables\nconst JWT_SECRET = 'your-super-secret-jwt-key-change-in-production'\n\nexport class AuthManager {\n static async generateToken(userId: string, email: string, role: string): Promise<string> {\n const payload: JWTPayload = {\n userId,\n email,\n role,\n exp: Math.floor(Date.now() / 1000) + (60 * 60 * 24), // 24 hours\n iat: Math.floor(Date.now() / 1000)\n }\n \n return await sign(payload, JWT_SECRET)\n }\n\n static async verifyToken(token: string): Promise<JWTPayload | null> {\n try {\n const payload = await verify(token, JWT_SECRET) as JWTPayload\n \n // Check if token is expired\n if (payload.exp < Math.floor(Date.now() / 1000)) {\n return null\n }\n \n return payload\n } catch (error) {\n console.error('Token verification failed:', error)\n return null\n }\n }\n\n static async hashPassword(password: string): Promise<string> {\n // In Cloudflare Workers, we'll use Web Crypto API\n const encoder = new TextEncoder()\n const data = encoder.encode(password + 'salt-change-in-production')\n const hashBuffer = await crypto.subtle.digest('SHA-256', data)\n const hashArray = Array.from(new Uint8Array(hashBuffer))\n return hashArray.map(b => b.toString(16).padStart(2, '0')).join('')\n }\n\n static async verifyPassword(password: string, hash: string): Promise<boolean> {\n const passwordHash = await this.hashPassword(password)\n return passwordHash === hash\n }\n}\n\n// Middleware to require authentication\nexport const requireAuth = () => {\n return async (c: Context, next: Next) => {\n try {\n // Try to get token from Authorization header\n let token = c.req.header('Authorization')?.replace('Bearer ', '')\n\n // If no header token, try cookie\n if (!token) {\n token = getCookie(c, 'auth_token')\n }\n\n if (!token) {\n // Check if this is a browser request (HTML accept header)\n const acceptHeader = c.req.header('Accept') || ''\n if (acceptHeader.includes('text/html')) {\n return c.redirect('/auth/login?error=Please login to access the admin area')\n }\n return c.json({ error: 'Authentication required' }, 401)\n }\n\n // Try to get cached token verification from KV\n const kv = c.env?.KV\n let payload: JWTPayload | null = null\n\n if (kv) {\n const cacheKey = `auth:${token.substring(0, 20)}` // Use token prefix as key\n const cached = await kv.get(cacheKey, 'json')\n if (cached) {\n payload = cached as JWTPayload\n }\n }\n\n // If not cached, verify token\n if (!payload) {\n payload = await AuthManager.verifyToken(token)\n\n // Cache the verified payload for 5 minutes\n if (payload && kv) {\n const cacheKey = `auth:${token.substring(0, 20)}`\n await kv.put(cacheKey, JSON.stringify(payload), { expirationTtl: 300 })\n }\n }\n\n if (!payload) {\n // Check if this is a browser request (HTML accept header)\n const acceptHeader = c.req.header('Accept') || ''\n if (acceptHeader.includes('text/html')) {\n return c.redirect('/auth/login?error=Your session has expired, please login again')\n }\n return c.json({ error: 'Invalid or expired token' }, 401)\n }\n\n // Add user info to context\n c.set('user', payload)\n\n return await next()\n } catch (error) {\n console.error('Auth middleware error:', error)\n // Check if this is a browser request (HTML accept header)\n const acceptHeader = c.req.header('Accept') || ''\n if (acceptHeader.includes('text/html')) {\n return c.redirect('/auth/login?error=Authentication failed, please login again')\n }\n return c.json({ error: 'Authentication failed' }, 401)\n }\n }\n}\n\n// Middleware to require specific role\nexport const requireRole = (requiredRole: string | string[]) => {\n return async (c: Context, next: Next) => {\n const user = c.get('user') as JWTPayload\n \n if (!user) {\n // Check if this is a browser request (HTML accept header)\n const acceptHeader = c.req.header('Accept') || ''\n if (acceptHeader.includes('text/html')) {\n return c.redirect('/auth/login?error=Please login to access the admin area')\n }\n return c.json({ error: 'Authentication required' }, 401)\n }\n \n const roles = Array.isArray(requiredRole) ? requiredRole : [requiredRole]\n \n if (!roles.includes(user.role)) {\n // Check if this is a browser request (HTML accept header)\n const acceptHeader = c.req.header('Accept') || ''\n if (acceptHeader.includes('text/html')) {\n return c.redirect('/auth/login?error=You do not have permission to access this area')\n }\n return c.json({ error: 'Insufficient permissions' }, 403)\n }\n \n return await next()\n }\n}\n\n// Optional auth middleware (doesn't block if no token)\nexport const optionalAuth = () => {\n return async (c: Context, next: Next) => {\n try {\n let token = c.req.header('Authorization')?.replace('Bearer ', '')\n \n if (!token) {\n token = getCookie(c, 'auth_token')\n }\n \n if (token) {\n const payload = await AuthManager.verifyToken(token)\n if (payload) {\n c.set('user', payload)\n }\n }\n \n return await next()\n } catch (error) {\n // Don't block on auth errors in optional auth\n console.error('Optional auth error:', error)\n return await next()\n }\n }\n}","import { MiddlewareHandler } from 'hono'\nimport { metricsTracker } from '../utils/metrics'\n\n/**\n * Middleware to track all HTTP requests for real-time analytics\n * Excludes the metrics endpoint itself to avoid inflating the count\n */\nexport const metricsMiddleware = (): MiddlewareHandler => {\n return async (c, next) => {\n const path = new URL(c.req.url).pathname\n\n // Don't track the metrics endpoint itself to avoid self-inflating counts\n if (path !== '/admin/dashboard/api/metrics') {\n metricsTracker.recordRequest()\n }\n\n // Continue with the request\n await next()\n }\n}\n","/**\n * Middleware Module Exports\n *\n * Request processing middleware for SonicJS\n *\n * Note: Most middleware is currently in the monolith and will be migrated later.\n * For now, we only export the bootstrap middleware which is used for system initialization.\n */\n\n// Bootstrap middleware\nexport { bootstrapMiddleware } from './bootstrap'\n\n// Auth middleware\nexport { AuthManager, requireAuth, requireRole, optionalAuth } from './auth'\n\n// Metrics middleware\nexport { metricsMiddleware } from './metrics'\n\n// Re-export types and functions that are referenced but implemented in monolith\n// These are placeholder exports to maintain API compatibility\nexport type Permission = string\nexport type UserPermissions = {\n userId: string\n permissions: Permission[]\n}\nexport const loggingMiddleware: any = () => {}\nexport const detailedLoggingMiddleware: any = () => {}\nexport const securityLoggingMiddleware: any = () => {}\nexport const performanceLoggingMiddleware: any = () => {}\nexport const cacheHeaders: any = () => {}\nexport const compressionMiddleware: any = () => {}\nexport const securityHeaders: any = () => {}\nexport const PermissionManager: any = {}\nexport const requirePermission: any = () => {}\nexport const requireAnyPermission: any = () => {}\nexport const logActivity: any = () => {}\nexport const requireActivePlugin: any = () => {}\nexport const requireActivePlugins: any = () => {}\nexport const getActivePlugins: any = () => {}\nexport const isPluginActive: any = () => {}\n"]}
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunkALOS2CBJ_cjs = require('./chunk-ALOS2CBJ.cjs');
3
+ var chunk3SPQ3J4N_cjs = require('./chunk-3SPQ3J4N.cjs');
4
4
 
5
5
  // src/templates/filter-bar.template.ts
6
6
  function renderFilterBar(data) {
@@ -68,9 +68,9 @@ function renderFilterBar(data) {
68
68
  }
69
69
 
70
70
  // src/templates/index.ts
71
- chunkALOS2CBJ_cjs.init_admin_layout_catalyst_template();
72
- chunkALOS2CBJ_cjs.init_logo_template();
71
+ chunk3SPQ3J4N_cjs.init_admin_layout_catalyst_template();
72
+ chunk3SPQ3J4N_cjs.init_logo_template();
73
73
 
74
74
  exports.renderFilterBar = renderFilterBar;
75
- //# sourceMappingURL=chunk-EGFHFM4N.cjs.map
76
- //# sourceMappingURL=chunk-EGFHFM4N.cjs.map
75
+ //# sourceMappingURL=chunk-5APKEYFK.cjs.map
76
+ //# sourceMappingURL=chunk-5APKEYFK.cjs.map
@@ -1 +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"]}
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-5APKEYFK.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"]}