@qwickapps/server 1.0.0 → 1.1.6

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.
@@ -17,56 +17,101 @@
17
17
  import { createControlPanel } from './control-panel.js';
18
18
  import { initializeLogging, getControlPanelLogger } from './logging.js';
19
19
  import { createProxyMiddleware } from 'http-proxy-middleware';
20
- import { randomBytes } from 'crypto';
21
20
  import express from 'express';
22
21
  import { existsSync } from 'fs';
23
22
  import { resolve } from 'path';
24
23
  /**
25
- * Basic auth middleware for gateway protection (control panel only)
26
- * - Skips localhost requests
27
- * - Skips API routes (/api/v1/*) - they have their own service auth
28
- * - Skips health endpoints - these should be public
29
- * - Requires valid credentials for non-localhost control panel access
24
+ * Generate landing page HTML for the frontend app
30
25
  */
31
- function createBasicAuthMiddleware(username, password, apiPaths) {
32
- const expectedAuth = `Basic ${Buffer.from(`${username}:${password}`).toString('base64')}`;
33
- return (req, res, next) => {
34
- const path = req.path;
35
- // Skip auth for API routes - they use their own authentication
36
- for (const apiPath of apiPaths) {
37
- if (path.startsWith(apiPath)) {
38
- return next();
39
- }
40
- }
41
- // Skip auth for health endpoints - these should be publicly accessible
42
- if (path === '/health' || path === '/api/health') {
43
- return next();
44
- }
45
- // Allow localhost without auth
46
- const remoteAddress = req.ip || req.socket?.remoteAddress || '';
47
- const host = req.hostname || req.headers.host || '';
48
- const isLocalhost = host === 'localhost' ||
49
- host === '127.0.0.1' ||
50
- host.startsWith('localhost:') ||
51
- host.startsWith('127.0.0.1:') ||
52
- remoteAddress === '127.0.0.1' ||
53
- remoteAddress === '::1' ||
54
- remoteAddress === '::ffff:127.0.0.1';
55
- if (isLocalhost) {
56
- return next();
57
- }
58
- // Check for valid basic auth
59
- const authHeader = req.headers.authorization;
60
- if (authHeader === expectedAuth) {
61
- return next();
62
- }
63
- // Request authentication
64
- res.setHeader('WWW-Authenticate', 'Basic realm="Control Panel"');
65
- res.status(401).json({
66
- error: 'Unauthorized',
67
- message: 'Authentication required.',
68
- });
69
- };
26
+ function generateLandingPageHtml(config, controlPanelPath) {
27
+ if (!config)
28
+ return '';
29
+ const primaryColor = '#6366f1';
30
+ const links = config.links || [
31
+ { label: 'Control Panel', url: controlPanelPath },
32
+ ];
33
+ const linksHtml = links
34
+ .map((link) => `<a href="${link.url}" class="link">${link.label}</a>`)
35
+ .join('');
36
+ return `<!DOCTYPE html>
37
+ <html lang="en">
38
+ <head>
39
+ <meta charset="UTF-8">
40
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
41
+ <title>${config.title}</title>
42
+ <style>
43
+ * { margin: 0; padding: 0; box-sizing: border-box; }
44
+ body {
45
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
46
+ background: linear-gradient(135deg, #0f172a 0%, #1e293b 100%);
47
+ color: #e2e8f0;
48
+ min-height: 100vh;
49
+ display: flex;
50
+ align-items: center;
51
+ justify-content: center;
52
+ }
53
+ .container {
54
+ text-align: center;
55
+ max-width: 600px;
56
+ padding: 2rem;
57
+ }
58
+ h1 {
59
+ font-size: 2.5rem;
60
+ color: ${primaryColor};
61
+ margin-bottom: 1rem;
62
+ }
63
+ p {
64
+ font-size: 1.125rem;
65
+ color: #94a3b8;
66
+ margin-bottom: 2rem;
67
+ line-height: 1.6;
68
+ }
69
+ .links {
70
+ display: flex;
71
+ flex-wrap: wrap;
72
+ gap: 1rem;
73
+ justify-content: center;
74
+ }
75
+ .link {
76
+ display: inline-block;
77
+ padding: 0.875rem 2rem;
78
+ background: ${primaryColor};
79
+ color: white;
80
+ text-decoration: none;
81
+ border-radius: 0.5rem;
82
+ font-weight: 500;
83
+ transition: all 0.2s;
84
+ }
85
+ .link:hover {
86
+ transform: translateY(-2px);
87
+ box-shadow: 0 10px 20px rgba(0,0,0,0.3);
88
+ }
89
+ .footer {
90
+ position: fixed;
91
+ bottom: 1rem;
92
+ left: 0;
93
+ right: 0;
94
+ text-align: center;
95
+ color: #64748b;
96
+ font-size: 0.875rem;
97
+ }
98
+ .footer a {
99
+ color: ${primaryColor};
100
+ text-decoration: none;
101
+ }
102
+ </style>
103
+ </head>
104
+ <body>
105
+ <div class="container">
106
+ <h1>${config.heading || config.title}</h1>
107
+ ${config.description ? `<p>${config.description}</p>` : ''}
108
+ ${linksHtml ? `<div class="links">${linksHtml}</div>` : ''}
109
+ </div>
110
+ <div class="footer">
111
+ Powered by <a href="https://qwickapps.com" target="_blank">QwickApps</a>
112
+ </div>
113
+ </body>
114
+ </html>`;
70
115
  }
71
116
  /**
72
117
  * Create a gateway that proxies to an internal service
@@ -110,12 +155,10 @@ export function createGateway(config, serviceFactory) {
110
155
  const gatewayPort = config.gatewayPort || parseInt(process.env.GATEWAY_PORT || process.env.PORT || '3101', 10);
111
156
  const servicePort = config.servicePort || parseInt(process.env.SERVICE_PORT || '3100', 10);
112
157
  const nodeEnv = process.env.NODE_ENV || 'development';
113
- // Auth configuration
114
- const authMode = config.authMode || 'auto';
115
- const basicAuthUser = config.basicAuthUser || process.env.BASIC_AUTH_USER || 'admin';
116
- const providedPassword = config.basicAuthPassword || process.env.BASIC_AUTH_PASSWORD;
117
- const basicAuthPassword = providedPassword || (authMode === 'auto' ? randomBytes(16).toString('base64url') : '');
118
- const isPasswordAutoGenerated = !providedPassword && authMode === 'auto';
158
+ // Control panel mount path (defaults to /cpanel)
159
+ const controlPanelPath = config.controlPanelPath || '/cpanel';
160
+ // Guard configuration for control panel
161
+ const guardConfig = config.controlPanelGuard;
119
162
  // API paths to proxy
120
163
  const proxyPaths = config.proxyPaths || ['/api/v1'];
121
164
  let service = null;
@@ -129,17 +172,17 @@ export function createGateway(config, serviceFactory) {
129
172
  cors: config.corsOrigins ? { origins: config.corsOrigins } : undefined,
130
173
  // Skip body parsing for proxied paths
131
174
  skipBodyParserPaths: [...proxyPaths, '/health'],
132
- // Disable built-in dashboard if custom UI is provided
133
- disableDashboard: !!config.customUiPath,
175
+ // Mount path for control panel
176
+ mountPath: controlPanelPath,
177
+ // Route guard
178
+ guard: guardConfig,
179
+ // Custom UI path
180
+ customUiPath: config.customUiPath,
134
181
  links: config.links,
135
182
  },
136
183
  plugins: config.plugins || [],
137
184
  logger,
138
185
  });
139
- // Add basic auth middleware if enabled
140
- if (authMode === 'basic' || authMode === 'auto') {
141
- controlPanel.app.use(createBasicAuthMiddleware(basicAuthUser, basicAuthPassword, proxyPaths));
142
- }
143
186
  // Setup proxy middleware for API paths
144
187
  const setupProxyMiddleware = () => {
145
188
  const target = `http://localhost:${servicePort}`;
@@ -185,17 +228,36 @@ export function createGateway(config, serviceFactory) {
185
228
  };
186
229
  controlPanel.app.use(createProxyMiddleware(healthProxyOptions));
187
230
  };
188
- // Serve custom React UI if provided
189
- const setupCustomUI = () => {
190
- if (config.customUiPath && existsSync(config.customUiPath)) {
191
- logger.info(`Serving custom UI from ${config.customUiPath}`);
192
- controlPanel.app.use(express.static(config.customUiPath));
193
- // SPA fallback
194
- controlPanel.app.get('*', (req, res, next) => {
195
- if (req.path.startsWith('/api/') || req.path === '/api') {
196
- return next();
197
- }
198
- res.sendFile(resolve(config.customUiPath, 'index.html'));
231
+ // Setup frontend app at root path
232
+ const setupFrontendApp = () => {
233
+ if (!config.frontendApp) {
234
+ return;
235
+ }
236
+ const { redirectUrl, staticPath, landingPage } = config.frontendApp;
237
+ // Priority 1: Redirect
238
+ if (redirectUrl) {
239
+ logger.info(`Frontend app: Redirecting / to ${redirectUrl}`);
240
+ controlPanel.app.get('/', (_req, res) => {
241
+ res.redirect(redirectUrl);
242
+ });
243
+ return;
244
+ }
245
+ // Priority 2: Serve static files
246
+ if (staticPath && existsSync(staticPath)) {
247
+ logger.info(`Frontend app: Serving static files from ${staticPath}`);
248
+ controlPanel.app.use('/', express.static(staticPath));
249
+ // SPA fallback for root
250
+ controlPanel.app.get('/', (_req, res) => {
251
+ res.sendFile(resolve(staticPath, 'index.html'));
252
+ });
253
+ return;
254
+ }
255
+ // Priority 3: Landing page
256
+ if (landingPage) {
257
+ logger.info(`Frontend app: Serving landing page`);
258
+ controlPanel.app.get('/', (_req, res) => {
259
+ const html = generateLandingPageHtml(landingPage, controlPanelPath);
260
+ res.type('html').send(html);
199
261
  });
200
262
  }
201
263
  };
@@ -207,10 +269,12 @@ export function createGateway(config, serviceFactory) {
207
269
  logger.info(`Internal service started on port ${servicePort}`);
208
270
  // 2. Setup proxy middleware (after service is started)
209
271
  setupProxyMiddleware();
210
- // 3. Setup custom UI (after proxy middleware)
211
- setupCustomUI();
272
+ // 3. Setup frontend app at root path
273
+ setupFrontendApp();
212
274
  // 4. Start control panel gateway
213
275
  await controlPanel.start();
276
+ // Calculate API base path
277
+ const apiBasePath = controlPanelPath === '/' ? '/api' : `${controlPanelPath}/api`;
214
278
  // Log startup info
215
279
  logger.info('');
216
280
  logger.info('========================================');
@@ -220,26 +284,25 @@ export function createGateway(config, serviceFactory) {
220
284
  logger.info(` Gateway Port: ${gatewayPort} (public)`);
221
285
  logger.info(` Service Port: ${servicePort} (internal)`);
222
286
  logger.info('');
223
- if (authMode === 'basic' || authMode === 'auto') {
287
+ if (guardConfig && guardConfig.type === 'basic') {
224
288
  logger.info(' Control Panel Auth: HTTP Basic Auth');
225
289
  logger.info(' ----------------------------------------');
226
- logger.info(` Username: ${basicAuthUser}`);
227
- if (isPasswordAutoGenerated) {
228
- logger.info(` Password: ${basicAuthPassword}`);
229
- logger.info(' (auto-generated, set BASIC_AUTH_PASSWORD to use a fixed password)');
230
- }
231
- else {
232
- logger.info(' Password: ********** (from environment)');
233
- }
290
+ logger.info(` Username: ${guardConfig.username}`);
234
291
  logger.info(' ----------------------------------------');
235
292
  }
293
+ else if (guardConfig && guardConfig.type !== 'none') {
294
+ logger.info(` Control Panel Auth: ${guardConfig.type}`);
295
+ }
236
296
  else {
237
297
  logger.info(' Control Panel Auth: None (not recommended)');
238
298
  }
239
299
  logger.info('');
240
300
  logger.info(' Endpoints:');
241
- logger.info(` GET / - Control Panel UI`);
242
- logger.info(` GET /api/health - Gateway health`);
301
+ if (config.frontendApp) {
302
+ logger.info(` GET / - Frontend App`);
303
+ }
304
+ logger.info(` GET ${controlPanelPath.padEnd(20)} - Control Panel UI`);
305
+ logger.info(` GET ${apiBasePath}/health - Gateway health`);
243
306
  logger.info(` GET /health - Service health (proxied)`);
244
307
  for (const apiPath of proxyPaths) {
245
308
  logger.info(` * ${apiPath}/* - Service API (proxied)`);
@@ -1 +1 @@
1
- {"version":3,"file":"gateway.js","sourceRoot":"","sources":["../../src/core/gateway.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"gateway.js","sourceRoot":"","sources":["../../src/core/gateway.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Route Guards for @qwickapps/server
3
+ *
4
+ * Provides authentication middleware for protecting routes.
5
+ *
6
+ * Copyright (c) 2025 QwickApps.com. All rights reserved.
7
+ */
8
+ import type { Request, RequestHandler } from 'express';
9
+ import type { RouteGuardConfig } from './types.js';
10
+ /**
11
+ * Create a route guard middleware from configuration
12
+ */
13
+ export declare function createRouteGuard(config: RouteGuardConfig): RequestHandler;
14
+ /**
15
+ * Helper to check if a request is authenticated (for use in handlers)
16
+ */
17
+ export declare function isAuthenticated(req: Request): boolean;
18
+ /**
19
+ * Get the authenticated user from the request
20
+ */
21
+ export declare function getAuthenticatedUser(req: Request): any | null;
22
+ //# sourceMappingURL=guards.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guards.d.ts","sourceRoot":"","sources":["../../src/core/guards.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,OAAO,EAA0B,cAAc,EAAE,MAAM,SAAS,CAAC;AAC/E,OAAO,KAAK,EACV,gBAAgB,EAIjB,MAAM,YAAY,CAAC;AAEpB;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,gBAAgB,GAAG,cAAc,CAazE;AAiID;;GAEG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAUrD;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,GAAG,IAAI,CAU7D"}
@@ -0,0 +1,167 @@
1
+ /**
2
+ * Route Guards for @qwickapps/server
3
+ *
4
+ * Provides authentication middleware for protecting routes.
5
+ *
6
+ * Copyright (c) 2025 QwickApps.com. All rights reserved.
7
+ */
8
+ /**
9
+ * Create a route guard middleware from configuration
10
+ */
11
+ export function createRouteGuard(config) {
12
+ switch (config.type) {
13
+ case 'none':
14
+ return (_req, _res, next) => next();
15
+ case 'basic':
16
+ return createBasicAuthGuard(config);
17
+ case 'supabase':
18
+ return createSupabaseGuard(config);
19
+ case 'auth0':
20
+ return createAuth0Guard(config);
21
+ default:
22
+ throw new Error(`Unknown guard type: ${config.type}`);
23
+ }
24
+ }
25
+ /**
26
+ * Create basic auth guard middleware
27
+ */
28
+ function createBasicAuthGuard(config) {
29
+ const expectedAuth = `Basic ${Buffer.from(`${config.username}:${config.password}`).toString('base64')}`;
30
+ const realm = config.realm || 'Protected';
31
+ const excludePaths = config.excludePaths || [];
32
+ return (req, res, next) => {
33
+ // Check if path is excluded
34
+ if (excludePaths.some(path => req.path.startsWith(path))) {
35
+ return next();
36
+ }
37
+ const authHeader = req.headers.authorization;
38
+ if (authHeader === expectedAuth) {
39
+ return next();
40
+ }
41
+ res.setHeader('WWW-Authenticate', `Basic realm="${realm}"`);
42
+ res.status(401).json({
43
+ error: 'Unauthorized',
44
+ message: 'Authentication required.',
45
+ });
46
+ };
47
+ }
48
+ /**
49
+ * Create Supabase auth guard middleware
50
+ *
51
+ * Validates JWT tokens from Supabase Auth
52
+ */
53
+ function createSupabaseGuard(config) {
54
+ const excludePaths = config.excludePaths || [];
55
+ return async (req, res, next) => {
56
+ // Check if path is excluded
57
+ if (excludePaths.some(path => req.path.startsWith(path))) {
58
+ return next();
59
+ }
60
+ const authHeader = req.headers.authorization;
61
+ if (!authHeader || !authHeader.startsWith('Bearer ')) {
62
+ return res.status(401).json({
63
+ error: 'Unauthorized',
64
+ message: 'Missing or invalid authorization header. Expected: Bearer <token>',
65
+ });
66
+ }
67
+ const token = authHeader.substring(7);
68
+ try {
69
+ // Validate the JWT with Supabase
70
+ const response = await fetch(`${config.supabaseUrl}/auth/v1/user`, {
71
+ headers: {
72
+ Authorization: `Bearer ${token}`,
73
+ apikey: config.supabaseAnonKey,
74
+ },
75
+ });
76
+ if (!response.ok) {
77
+ return res.status(401).json({
78
+ error: 'Unauthorized',
79
+ message: 'Invalid or expired token.',
80
+ });
81
+ }
82
+ const user = await response.json();
83
+ req.user = user;
84
+ next();
85
+ }
86
+ catch (error) {
87
+ return res.status(401).json({
88
+ error: 'Unauthorized',
89
+ message: 'Failed to validate token.',
90
+ });
91
+ }
92
+ };
93
+ }
94
+ /**
95
+ * Create Auth0 guard middleware
96
+ *
97
+ * Uses express-openid-connect for Auth0 authentication
98
+ */
99
+ function createAuth0Guard(config) {
100
+ // Lazy-load express-openid-connect to avoid requiring it when not used
101
+ let authMiddleware = null;
102
+ return async (req, res, next) => {
103
+ // Lazy initialize the middleware
104
+ if (!authMiddleware) {
105
+ try {
106
+ const { auth } = await import('express-openid-connect');
107
+ authMiddleware = auth({
108
+ authRequired: true,
109
+ auth0Logout: true,
110
+ secret: config.secret,
111
+ baseURL: config.baseUrl,
112
+ clientID: config.clientId,
113
+ issuerBaseURL: `https://${config.domain}`,
114
+ clientSecret: config.clientSecret,
115
+ idpLogout: true,
116
+ routes: {
117
+ login: config.routes?.login || '/login',
118
+ logout: config.routes?.logout || '/logout',
119
+ callback: config.routes?.callback || '/callback',
120
+ },
121
+ });
122
+ }
123
+ catch (error) {
124
+ return res.status(500).json({
125
+ error: 'Configuration Error',
126
+ message: 'Auth0 is not properly configured. Install express-openid-connect package.',
127
+ });
128
+ }
129
+ }
130
+ // Check if path is excluded
131
+ const excludePaths = config.excludePaths || [];
132
+ if (excludePaths.some(path => req.path.startsWith(path))) {
133
+ return next();
134
+ }
135
+ // Apply Auth0 middleware
136
+ authMiddleware(req, res, next);
137
+ };
138
+ }
139
+ /**
140
+ * Helper to check if a request is authenticated (for use in handlers)
141
+ */
142
+ export function isAuthenticated(req) {
143
+ // Check for Auth0 session
144
+ if (req.oidc?.isAuthenticated?.()) {
145
+ return true;
146
+ }
147
+ // Check for Supabase user
148
+ if (req.user) {
149
+ return true;
150
+ }
151
+ return false;
152
+ }
153
+ /**
154
+ * Get the authenticated user from the request
155
+ */
156
+ export function getAuthenticatedUser(req) {
157
+ // Check for Auth0 user
158
+ if (req.oidc?.user) {
159
+ return req.oidc.user;
160
+ }
161
+ // Check for Supabase user
162
+ if (req.user) {
163
+ return req.user;
164
+ }
165
+ return null;
166
+ }
167
+ //# sourceMappingURL=guards.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guards.js","sourceRoot":"","sources":["../../src/core/guards.ts"],"names":[],"mappings":"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"}
@@ -4,6 +4,100 @@
4
4
  * Copyright (c) 2025 QwickApps.com. All rights reserved.
5
5
  */
6
6
  import type { Application, RequestHandler, Router } from 'express';
7
+ /**
8
+ * Route guard types for protecting routes
9
+ */
10
+ export type RouteGuardType = 'none' | 'basic' | 'supabase' | 'auth0';
11
+ /**
12
+ * Basic auth guard configuration
13
+ */
14
+ export interface BasicAuthGuardConfig {
15
+ type: 'basic';
16
+ /** Username for basic auth */
17
+ username: string;
18
+ /** Password for basic auth */
19
+ password: string;
20
+ /** Realm name for the WWW-Authenticate header */
21
+ realm?: string;
22
+ /** Paths to exclude from authentication (e.g., ['/health']) */
23
+ excludePaths?: string[];
24
+ }
25
+ /**
26
+ * Supabase auth guard configuration
27
+ */
28
+ export interface SupabaseAuthGuardConfig {
29
+ type: 'supabase';
30
+ /** Supabase project URL */
31
+ supabaseUrl: string;
32
+ /** Supabase anon key */
33
+ supabaseAnonKey: string;
34
+ /** Paths to exclude from authentication */
35
+ excludePaths?: string[];
36
+ }
37
+ /**
38
+ * Auth0 guard configuration
39
+ */
40
+ export interface Auth0GuardConfig {
41
+ type: 'auth0';
42
+ /** Auth0 domain (e.g., 'myapp.auth0.com') */
43
+ domain: string;
44
+ /** Auth0 client ID */
45
+ clientId: string;
46
+ /** Auth0 client secret */
47
+ clientSecret: string;
48
+ /** Base URL of the application */
49
+ baseUrl: string;
50
+ /** Session secret for cookie encryption */
51
+ secret: string;
52
+ /** Auth routes configuration */
53
+ routes?: {
54
+ login?: string;
55
+ logout?: string;
56
+ callback?: string;
57
+ };
58
+ /** Paths to exclude from authentication */
59
+ excludePaths?: string[];
60
+ }
61
+ /**
62
+ * No authentication guard
63
+ */
64
+ export interface NoAuthGuardConfig {
65
+ type: 'none';
66
+ }
67
+ /**
68
+ * Union type for all guard configurations
69
+ */
70
+ export type RouteGuardConfig = NoAuthGuardConfig | BasicAuthGuardConfig | SupabaseAuthGuardConfig | Auth0GuardConfig;
71
+ /**
72
+ * Mount path configuration for applications
73
+ */
74
+ export interface MountConfig {
75
+ /** Path where this app is mounted (e.g., '/', '/cpanel', '/app') */
76
+ path: string;
77
+ /** Route guard configuration for this mount point */
78
+ guard?: RouteGuardConfig;
79
+ }
80
+ /**
81
+ * Frontend app configuration
82
+ */
83
+ export interface FrontendAppConfig {
84
+ /** Mount configuration */
85
+ mount: MountConfig;
86
+ /** Redirect to another URL instead of serving content */
87
+ redirectUrl?: string;
88
+ /** Path to static files to serve */
89
+ staticPath?: string;
90
+ /** Landing page HTML (used if no staticPath or redirectUrl) */
91
+ landingPage?: {
92
+ title: string;
93
+ heading?: string;
94
+ description?: string;
95
+ links?: Array<{
96
+ label: string;
97
+ url: string;
98
+ }>;
99
+ };
100
+ }
7
101
  /**
8
102
  * Control Panel Configuration
9
103
  */
@@ -20,17 +114,16 @@ export interface ControlPanelConfig {
20
114
  primaryColor?: string;
21
115
  favicon?: string;
22
116
  };
23
- /** Optional: Authentication configuration */
24
- auth?: {
25
- enabled: boolean;
26
- provider: 'basic' | 'jwt' | 'custom';
27
- users?: Array<{
28
- username: string;
29
- password: string;
30
- }>;
31
- jwtSecret?: string;
32
- customMiddleware?: RequestHandler;
33
- };
117
+ /**
118
+ * Mount path for the control panel.
119
+ * Defaults to '/cpanel'.
120
+ */
121
+ mountPath?: string;
122
+ /**
123
+ * Route guard for the control panel.
124
+ * Defaults to basic auth in production.
125
+ */
126
+ guard?: RouteGuardConfig;
34
127
  /** Optional: CORS configuration */
35
128
  cors?: {
36
129
  origins: string[];