@teamvelix/velix 5.2.1 → 5.2.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.
- package/dist/build/index.js +2 -2
- package/dist/{chunk-XXPHGRLC.js → chunk-3LWUS6AC.js} +3 -3
- package/dist/{chunk-XXPHGRLC.js.map → chunk-3LWUS6AC.js.map} +1 -1
- package/dist/{chunk-DTF3KTLR.js → chunk-65A3SPZE.js} +81 -36
- package/dist/chunk-65A3SPZE.js.map +1 -0
- package/dist/{chunk-QIPVMOXL.js → chunk-MLLSS7Y5.js} +3 -3
- package/dist/{chunk-QIPVMOXL.js.map → chunk-MLLSS7Y5.js.map} +1 -1
- package/dist/index.d.ts +4 -7
- package/dist/index.js +4 -3
- package/dist/index.js.map +1 -1
- package/dist/runtime/start-build.js +1 -1
- package/dist/runtime/start-build.js.map +1 -1
- package/dist/runtime/start-dev.js +80 -32
- package/dist/runtime/start-dev.js.map +1 -1
- package/dist/runtime/start-prod.js +79 -31
- package/dist/runtime/start-prod.js.map +1 -1
- package/dist/server/index.js +2 -2
- package/package.json +3 -3
- package/dist/chunk-DTF3KTLR.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../node_modules/.pnpm/tsup@8.5.1_jiti@2.6.1_postc_36112cdf9ab6125b194fc7941daee874/node_modules/tsup/assets/esm_shims.js","../../server/image-optimizer.ts","../../runtime/start-prod.ts","../../server/index.ts","../../config.ts","../../router/index.ts","../../utils.ts","../../middleware/index.ts","../../plugins/index.ts","../../plugins/tailwind.ts","../../logger.ts","../../version.ts","../../metadata/index.ts","../../islands/index.ts","../../actions/index.ts","../../helpers.ts","../../server/devtools.ts","../../server/error-pages.ts"],"sourcesContent":["// Shim globals in esm bundle\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nconst getFilename = () => fileURLToPath(import.meta.url)\nconst getDirname = () => path.dirname(getFilename())\n\nexport const __dirname = /* @__PURE__ */ getDirname()\nexport const __filename = /* @__PURE__ */ getFilename()\n","import http from 'http';\nimport fs from 'fs';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\n\nexport async function handleImageOptimization(req: http.IncomingMessage, res: http.ServerResponse, projectRoot: string) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let sharp: ((input: Buffer) => Record<string, unknown>) | undefined;\n try {\n // @ts-ignore: sharp is an optional dependency\n sharp = await import('sharp').then(m => m.default || m);\n } catch (e) {\n // sharp is optional\n }\n try {\n const url = new URL(req.url!, `http://${req.headers.host || 'localhost'}`);\n const imageUrl = url.searchParams.get('url');\n const widthStr = url.searchParams.get('w');\n const qualityStr = url.searchParams.get('q');\n\n if (!imageUrl) {\n res.writeHead(400);\n res.end('Missing url parameter');\n return;\n }\n\n const width = widthStr ? parseInt(widthStr, 10) : undefined;\n const quality = qualityStr ? parseInt(qualityStr, 10) : 75;\n\n // Resolve image path (assuming it's a local public asset if it doesn't start with http)\n let imageBuffer: Buffer | null = null;\n\n if (imageUrl.startsWith('http')) {\n const response = await fetch(imageUrl);\n if (!response.ok) throw new Error(`Failed to fetch ${imageUrl}`);\n imageBuffer = Buffer.from(await response.arrayBuffer());\n } else {\n const publicDir = path.join(projectRoot, 'public');\n // Prevent directory traversal\n const resolvedPath = path.join(publicDir, imageUrl.startsWith('/') ? imageUrl.slice(1) : imageUrl);\n if (!resolvedPath.startsWith(publicDir) || !fs.existsSync(resolvedPath)) {\n res.writeHead(404);\n res.end('Image not found');\n return;\n }\n imageBuffer = fs.readFileSync(resolvedPath);\n }\n\n if (!sharp) {\n // Fallback: just return the original image if sharp is not installed\n res.writeHead(200, {\n 'Content-Type': 'image/jpeg',\n 'Cache-Control': 'public, max-age=31536000, immutable'\n });\n res.end(imageBuffer);\n return;\n }\n\n // Process with sharp — typed minimally since it's an optional dependency\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let processor: any = sharp(imageBuffer);\n \n if (width) {\n processor = processor.resize(width);\n }\n\n // Default to webp for optimized delivery\n processor = processor.webp({ quality });\n\n const optimizedBuffer = await processor.toBuffer();\n\n res.writeHead(200, {\n 'Content-Type': 'image/webp',\n 'Cache-Control': 'public, max-age=31536000, immutable'\n });\n res.end(optimizedBuffer);\n } catch (error: unknown) {\n console.error('Image optimization error:', error);\n res.writeHead(500);\n res.end('Error processing image');\n }\n}\n","/**\n * Velix v5 — Production Server\n * Start the production server\n */\n\nimport { createServer } from '../server/index.js';\nimport logger from '../logger.js';\n\nasync function startProd() {\n process.env.NODE_ENV = 'production';\n\n const projectRoot = process.cwd();\n\n await createServer({ projectRoot, mode: 'production' });\n\n // Graceful shutdown\n process.on('SIGINT', () => {\n logger.blank();\n logger.info('Shutting down...');\n process.exit(0);\n });\n\n process.on('SIGTERM', () => {\n logger.info('Received SIGTERM, shutting down gracefully...');\n process.exit(0);\n });\n}\n\nstartProd().catch(err => {\n logger.error('Failed to start production server', err);\n process.exit(1);\n});\n","/**\r\n * Velix v5 Server\r\n *\r\n * Modular HTTP server with SSR, static file serving, API routes,\r\n * server actions, middleware, and plugin hooks.\r\n */\r\n\r\nimport http from 'http';\r\nimport fs from 'fs';\r\nimport path from 'path';\r\nimport { fileURLToPath, pathToFileURL } from 'url';\r\nimport { createRequire } from 'module';\r\nimport React from 'react';\r\nimport { renderToString } from 'react-dom/server';\r\nimport { loadConfig, resolvePaths, type VelixConfig } from '../config.js';\r\nimport { buildRouteTree, matchRoute } from '../router/index.js';\r\nimport { runMiddleware, loadMiddleware, type MiddlewareFunction } from '../middleware/index.js';\r\nimport { pluginManager, loadPlugins, PluginHooks, builtinPlugins } from '../plugins/index.js';\r\nimport tailwindPlugin from '../plugins/tailwind.js';\r\nimport { generateMetadataTags, generateSitemap, generateRobotsTxt } from '../metadata/index.js';\r\nimport { getRegisteredIslands, generateAdvancedHydrationScript } from '../islands/index.js';\r\nimport type { Route } from '../types.js';\r\nimport { executeAction, deserializeArgs } from '../actions/index.js';\r\nimport logger from '../logger.js';\r\nimport esbuild from 'esbuild';\r\nimport { generateDevToolsHtml } from './devtools.js';\r\nimport { VERSION } from '../version.js';\r\nimport { generate404Page, generate500Page } from './error-pages.js';\r\n\r\nexport {\r\n defineRoute,\r\n VelixHttpError,\r\n defineLoader,\r\n serverAction,\r\n buildApiManifest,\r\n handleApiRequest\r\n} from '@teamvelix/velix-core';\r\n\r\nfunction getProjectVersion(dep: string, projectRoot: string): string {\r\n try {\r\n const projectRequire = createRequire(pathToFileURL(path.join(projectRoot, 'package.json')).href);\r\n return projectRequire(`${dep}/package.json`).version;\r\n } catch (e) {\r\n try {\r\n const selfRequire = createRequire(import.meta.url);\r\n return selfRequire(`${dep}/package.json`).version;\r\n } catch (e2) {\r\n return '—';\r\n }\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// MIME Types\r\n// ============================================================================\r\n\r\nconst MIME_TYPES: Record<string, string> = {\r\n '.html': 'text/html; charset=utf-8',\r\n '.css': 'text/css; charset=utf-8',\r\n '.js': 'application/javascript; charset=utf-8',\r\n '.mjs': 'application/javascript; charset=utf-8',\r\n '.json': 'application/json',\r\n '.png': 'image/png',\r\n '.jpg': 'image/jpeg',\r\n '.jpeg': 'image/jpeg',\r\n '.gif': 'image/gif',\r\n '.svg': 'image/svg+xml',\r\n '.ico': 'image/x-icon',\r\n '.webp': 'image/webp',\r\n '.woff': 'font/woff',\r\n '.woff2': 'font/woff2',\r\n '.ttf': 'font/ttf',\r\n '.otf': 'font/otf',\r\n '.txt': 'text/plain; charset=utf-8',\r\n '.xml': 'application/xml',\r\n '.mp4': 'video/mp4',\r\n '.webm': 'video/webm',\r\n '.mp3': 'audio/mpeg',\r\n '.pdf': 'application/pdf',\r\n '.map': 'application/json',\r\n};\r\n\r\n// ============================================================================\r\n// Server\r\n// ============================================================================\r\n\r\nexport interface VelixServer {\r\n server: http.Server;\r\n config: VelixConfig;\r\n close: () => void;\r\n}\r\n\r\nexport async function createServer(options: {\r\n projectRoot?: string;\r\n mode?: 'development' | 'production';\r\n} = {}): Promise<VelixServer> {\r\n const projectRoot = options.projectRoot || process.cwd();\r\n const mode = options.mode || (process.env.NODE_ENV as 'development' | 'production' | undefined) || 'development';\r\n const isDev = mode === 'development';\r\n\r\n // Load configuration\r\n const rawConfig = await loadConfig(projectRoot);\r\n const config = resolvePaths(rawConfig, projectRoot);\r\n\r\n // Load plugins\r\n await loadPlugins(projectRoot, config);\r\n\r\n // Plugin hook: config loaded (allow plugins to modify config)\r\n await pluginManager.runHook(PluginHooks.CONFIG, config);\r\n\r\n // Load middleware\r\n const middlewareFns = await loadMiddleware(projectRoot);\r\n\r\n // Build route tree\r\n const appDir = (config as unknown as { resolvedAppDir?: string }).resolvedAppDir || path.join(projectRoot, 'app');\r\n const routes = buildRouteTree(appDir);\r\n\r\n // Plugin hook: routes loaded\r\n await pluginManager.runHook(PluginHooks.ROUTES_LOADED, routes);\r\n\r\n const startTime = Date.now();\r\n\r\n // Plugin hook: server starting\r\n await pluginManager.runHook(PluginHooks.SERVER_START, { config, isDev, projectRoot }, isDev);\r\n\r\n const server = http.createServer(async (req, res) => {\r\n const requestStart = Date.now();\r\n const url = new URL(req.url || '/', `http://${req.headers.host || 'localhost'}`);\r\n const pathname = url.pathname;\r\n\r\n try {\r\n // Run middleware\r\n if (middlewareFns.length > 0) {\r\n const middlewareResult = await runMiddleware(req, res, middlewareFns);\r\n if (!middlewareResult.continue) return;\r\n }\r\n\r\n // Plugin hook: request\r\n await pluginManager.runHook(PluginHooks.REQUEST, req, res);\r\n\r\n // ── Auto-generated SEO routes ──\r\n if (pathname === '/sitemap.xml' && config.seo.sitemap) {\r\n const baseUrl = config.app.url || `http://${config.server.host}:${config.server.port}`;\r\n const sitemap = generateSitemap(routes.appRoutes, baseUrl);\r\n res.writeHead(200, { 'Content-Type': 'application/xml' });\r\n res.end(sitemap);\r\n return;\r\n }\r\n\r\n if (pathname === '/robots.txt' && config.seo.robots) {\r\n const baseUrl = config.app.url || `http://${config.server.host}:${config.server.port}`;\r\n const robotsTxt = generateRobotsTxt(baseUrl);\r\n res.writeHead(200, { 'Content-Type': 'text/plain' });\r\n res.end(robotsTxt);\r\n return;\r\n }\r\n\r\n // ── Server actions ──\r\n if (pathname === '/__velix/action' && req.method === 'POST') {\r\n await handleServerAction(req, res);\r\n return;\r\n }\r\n\r\n // ── Velix internal assets ──\r\n if (pathname === '/__velix/image') {\r\n const { handleImageOptimization } = await import('./image-optimizer.js');\r\n await handleImageOptimization(req, res, projectRoot);\r\n return;\r\n }\r\n\r\n if (pathname.startsWith('/__velix/')) {\r\n await serveVelixInternal(pathname, req, res, projectRoot);\r\n return;\r\n }\r\n\r\n // ── Static files ──\r\n const publicDir = (config as unknown as { resolvedPublicDir?: string }).resolvedPublicDir || path.join(projectRoot, 'public');\r\n if (await serveStaticFile(pathname, publicDir, res, isDev)) {\r\n if (isDev) logger.request(req.method || 'GET', pathname, 200, Date.now() - requestStart, { type: 'static' });\r\n return;\r\n }\r\n\r\n // ── API routes ──\r\n const apiMatch = matchRoute(pathname, routes.api);\r\n if (apiMatch) {\r\n await handleApiRoute(apiMatch, req, res, url);\r\n if (isDev) logger.request(req.method || 'GET', pathname, res.statusCode, Date.now() - requestStart, { type: 'api' });\r\n return;\r\n }\r\n\r\n // ── Page routes (SSR) ──\r\n const pageMatch = matchRoute(pathname, routes.appRoutes);\r\n if (pageMatch) {\r\n await handlePageRoute(pageMatch, routes, req, res, url, config, isDev, projectRoot);\r\n if (isDev) logger.request(req.method || 'GET', pathname, res.statusCode, Date.now() - requestStart, { type: 'ssr' });\r\n return;\r\n }\r\n\r\n // ── 404 ──\r\n res.writeHead(404, { 'Content-Type': 'text/html; charset=utf-8' });\r\n res.end(generate404Page(pathname));\r\n if (isDev) logger.request(req.method || 'GET', pathname, 404, Date.now() - requestStart);\r\n\r\n } catch (error: unknown) {\r\n const err = error as Error;\r\n console.error('Server error:', error);\r\n if (!res.headersSent) {\r\n res.writeHead(500, { 'Content-Type': 'text/html; charset=utf-8' });\r\n res.end(generate500Page({\r\n statusCode: 500,\r\n title: 'Server Error',\r\n message: err.message || 'An unexpected error occurred',\r\n stack: isDev ? err.stack : undefined,\r\n isDev,\r\n pathname\r\n }));\r\n }\r\n }\r\n });\r\n\r\n const __hmrClients = new Set<http.ServerResponse>();\r\n (server as unknown as { __hmrClients: Set<http.ServerResponse> }).__hmrClients = __hmrClients;\r\n (server as unknown as { broadcastHMR: (msg: string) => void }).broadcastHMR = (msg: string) => {\r\n __hmrClients.forEach(c => c.write(`data: ${msg}\\n\\n`));\r\n };\r\n\r\n // Start listening\r\n const port = config.server.port;\r\n const host = config.server.host;\r\n\r\n server.listen(port, host, () => {\r\n logger.serverStart({ port, host, mode, pagesDir: appDir }, startTime);\r\n\r\n // Log routes in dev mode\r\n if (isDev) {\r\n routes.appRoutes.forEach(r => {\r\n const type = r.path.includes(':') || r.path.includes('*') ? 'dynamic' : 'static';\r\n logger.route(r.path, type);\r\n });\r\n routes.api.forEach(r => logger.route(r.path, 'api'));\r\n logger.blank();\r\n }\r\n });\r\n\r\n server.on('error', (err: NodeJS.ErrnoException) => {\r\n if (err.code === 'EADDRINUSE') {\r\n logger.portInUse(port);\r\n process.exit(1);\r\n }\r\n throw err;\r\n });\r\n\r\n return {\r\n server,\r\n config: rawConfig,\r\n close: () => server.close()\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// SSR Module Import (handles CSS imports gracefully)\r\n// ============================================================================\r\n\r\nasync function importModuleSSR(filePath: string): Promise<unknown> {\r\n const fileUrl = pathToFileURL(filePath).href;\r\n try {\r\n return await import(`${fileUrl}?t=${Date.now()}`);\r\n } catch (err) {\r\n // Check if this might be a CSS import issue\r\n const source = fs.readFileSync(filePath, 'utf-8');\r\n if (source.match(/^import\\s+['\"][^'\"]+\\.(css|scss|less|sass)['\"];?\\s*$/m)) {\r\n const stripped = source.replace(/^import\\s+['\"][^'\"]+\\.(css|scss|less|sass)['\"];?\\s*$/gm, '// [velix:ssr] css import stripped');\r\n const ext = path.extname(filePath);\r\n const tmpPath = filePath.replace(ext, `.__velix_ssr${ext}`);\r\n fs.writeFileSync(tmpPath, stripped);\r\n try {\r\n const mod = await import(`${pathToFileURL(tmpPath).href}?t=${Date.now()}`);\r\n try { fs.unlinkSync(tmpPath); } catch {}\r\n return mod;\r\n } catch (e2) {\r\n try { fs.unlinkSync(tmpPath); } catch {}\r\n throw e2;\r\n }\r\n }\r\n throw err;\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// Layout Resolution (Next.js-style: root layout wraps all pages)\r\n// ============================================================================\r\n\r\nfunction collectLayouts(pageFilePath: string, appDir: string): string[] {\r\n const layouts: string[] = [];\r\n const normalizedAppDir = path.resolve(appDir);\r\n let current = path.dirname(path.resolve(pageFilePath));\r\n\r\n while (true) {\r\n for (const ext of ['.tsx', '.jsx', '.ts', '.js']) {\r\n const layoutPath = path.join(current, `layout${ext}`);\r\n if (fs.existsSync(layoutPath)) {\r\n layouts.unshift(layoutPath); // root-first order\r\n break;\r\n }\r\n }\r\n if (path.resolve(current) === normalizedAppDir) break;\r\n const parent = path.dirname(current);\r\n if (parent === current) break; // filesystem root\r\n current = parent;\r\n }\r\n\r\n return layouts;\r\n}\r\n\r\nasync function renderComponentAsync(Component: unknown, props: Record<string, unknown>): Promise<React.ReactElement> {\r\n let element = React.createElement(Component as React.ComponentType<Record<string, unknown>>, props);\r\n if (typeof Component === 'function') {\r\n try {\r\n const result = (Component as (props: Record<string, unknown>) => React.ReactElement | Promise<React.ReactElement>)(props);\r\n if (result instanceof Promise) {\r\n element = await result as any;\r\n }\r\n } catch (e) {\r\n // Fallback to createElement result\r\n }\r\n }\r\n return element;\r\n}\r\n\r\n// ============================================================================\r\n// Handlers\r\n// ============================================================================\r\n\r\nasync function serveStaticFile(pathname: string, publicDir: string, res: http.ServerResponse, isDev: boolean = false): Promise<boolean> {\r\n const filePath = path.join(publicDir, pathname);\r\n\r\n // Prevent directory traversal\r\n if (!filePath.startsWith(publicDir)) return false;\r\n\r\n if (!fs.existsSync(filePath) || fs.statSync(filePath).isDirectory()) return false;\r\n\r\n const ext = path.extname(filePath);\r\n const contentType = MIME_TYPES[ext] || 'application/octet-stream';\r\n const content = fs.readFileSync(filePath);\r\n\r\n res.writeHead(200, {\r\n 'Content-Type': contentType,\r\n 'Content-Length': content.length,\r\n 'Cache-Control': isDev ? 'no-store, no-cache, must-revalidate' : 'public, max-age=31536000, immutable',\r\n });\r\n res.end(content);\r\n return true;\r\n}\r\n\r\nasync function handleApiRoute(route: { filePath: string, params?: Record<string, string> }, req: http.IncomingMessage, res: http.ServerResponse, url: URL) {\r\n try {\r\n const fileUrl = pathToFileURL(route.filePath).href;\r\n const mod = await import(`${fileUrl}?t=${Date.now()}`);\r\n const method = req.method?.toUpperCase() || 'GET';\r\n const handler = mod[method] || mod.default;\r\n\r\n if (!handler) {\r\n res.writeHead(405, { 'Content-Type': 'application/json' });\r\n res.end(JSON.stringify({ error: 'Method not allowed' }));\r\n return;\r\n }\r\n\r\n let rawBody: string | undefined;\r\n if (['POST', 'PUT', 'PATCH'].includes(method)) {\r\n rawBody = await parseRawBody(req);\r\n }\r\n\r\n const headers = new Headers();\r\n for (const [key, val] of Object.entries(req.headers)) {\r\n if (Array.isArray(val)) val.forEach(v => headers.append(key, v));\r\n else if (val) headers.set(key, val);\r\n }\r\n\r\n const reqInit: RequestInit = { method, headers };\r\n if (rawBody !== undefined) reqInit.body = rawBody;\r\n\r\n const request = new Request(url.href, reqInit) as Request & { velixUrl: URL };\r\n request.velixUrl = url;\r\n\r\n // Call API handler with native Request and Next.js-like context\r\n const response = await handler(request, { params: route.params || {} });\r\n\r\n if (response instanceof Response) {\r\n const headers: Record<string, string> = {};\r\n response.headers.forEach((v: string, k: string) => { headers[k] = v; });\r\n res.writeHead(response.status, headers);\r\n const text = await response.text();\r\n res.end(text);\r\n } else if (typeof response === 'object') {\r\n res.writeHead(200, { 'Content-Type': 'application/json' });\r\n res.end(JSON.stringify(response));\r\n } else {\r\n res.writeHead(200, { 'Content-Type': 'text/plain' });\r\n res.end(String(response));\r\n }\r\n } catch (err: unknown) {\r\n const error = err as Error;\r\n res.writeHead(500, { 'Content-Type': 'application/json' });\r\n res.end(JSON.stringify({ error: error.message }));\r\n }\r\n}\r\n\r\nasync function handleServerAction(req: http.IncomingMessage, res: http.ServerResponse) {\r\n try {\r\n const body = await parseRequestBody(req) as { actionId?: string, args?: string };\r\n if (!body?.actionId || typeof body.actionId !== 'string') {\r\n res.writeHead(400, { 'Content-Type': 'application/json' });\r\n res.end(JSON.stringify({ error: 'Missing actionId' }));\r\n return;\r\n }\r\n\r\n const args = body.args ? deserializeArgs(body.args as any) : [];\r\n const result = await executeAction(body.actionId, args);\r\n\r\n res.writeHead(200, { 'Content-Type': 'application/json' });\r\n res.end(JSON.stringify(result));\r\n } catch (err: unknown) {\r\n const error = err as Error;\r\n res.writeHead(500, { 'Content-Type': 'application/json' });\r\n res.end(JSON.stringify({ success: false, error: error.message }));\r\n }\r\n}\r\n\r\nasync function handlePageRoute(\r\n route: Route, routes: { appRoutes: { path: string }[] },\r\n req: http.IncomingMessage, res: http.ServerResponse,\r\n url: URL, config: VelixConfig, isDev: boolean, projectRoot: string\r\n) {\r\n try {\r\n const fileUrl = pathToFileURL(route.filePath).href;\r\n const mod = await import(`${fileUrl}?t=${Date.now()}`);\r\n const PageComponent = mod.default;\r\n let metadata = mod.metadata || mod.generateMetadata?.(route.params) || {};\r\n\r\n // ── Layout Resolution (Next.js-style: walk up to root) ──\r\n const appDir = (config as unknown as { resolvedAppDir?: string }).resolvedAppDir || path.join(projectRoot, 'app');\r\n const layoutPaths = collectLayouts(route.filePath, appDir);\r\n\r\n // Load all layouts and merge metadata (root-first)\r\n const layoutModules: { default?: React.ComponentType<unknown>; metadata?: Record<string, unknown> }[] = [];\r\n for (const lp of layoutPaths) {\r\n try {\r\n const layoutMod = await importModuleSSR(lp) as { default?: React.ComponentType<unknown>; metadata?: Record<string, unknown> };\r\n layoutModules.push(layoutMod);\r\n if (layoutMod.metadata) {\r\n metadata = { ...layoutMod.metadata, ...metadata };\r\n }\r\n } catch (e) {\r\n // Skip broken layouts gracefully\r\n logger.warn?.(`Failed to load layout: ${lp}`);\r\n }\r\n }\r\n\r\n // Generate metadata tags\r\n const baseUrl = config.app.url || `http://${config.server.host}:${config.server.port}`;\r\n const metaTags = generateMetadataTags({\r\n ...metadata,\r\n generator: `Velix v${VERSION}`,\r\n viewport: metadata.viewport || 'width=device-width, initial-scale=1',\r\n }, baseUrl);\r\n\r\n // Get islands for hydration\r\n const islands = getRegisteredIslands();\r\n const hydrationScript = generateAdvancedHydrationScript(islands);\r\n \r\n const reactVersion = getProjectVersion('react', projectRoot);\r\n const tsVersion = getProjectVersion('typescript', projectRoot);\r\n\r\n // Developer Tools Injection\r\n const devToolsHtml = generateDevToolsHtml(isDev, {\r\n version: VERSION,\r\n port: config.server.port,\r\n host: config.server.host,\r\n nodeVersion: process.version.replace('v', ''),\r\n reactVersion,\r\n tsVersion\r\n });\r\n\r\n const headInjections = `\r\n <meta charset=\"utf-8\">\r\n ${metaTags}\r\n ${config.favicon ? `<link rel=\"icon\" href=\"${config.favicon}\">` : ''}\r\n ${config.styles.map(s => `<link rel=\"stylesheet\" href=\"${s}\">`).join('\\n ')}\r\n `;\r\n // Extract search params for the component\r\n const searchParams = Object.fromEntries(url.searchParams.entries());\r\n\r\n // Render the page component (supports async/server components)\r\n let pageElement = await renderComponentAsync(PageComponent, { params: route.params, searchParams, query: searchParams });\r\n\r\n // Nest layouts around page: innermost first, then wrap outward (root is first in array)\r\n let layoutElement = pageElement;\r\n for (let i = layoutModules.length - 1; i >= 0; i--) {\r\n const layoutMod = layoutModules[i];\r\n if (layoutMod.default) {\r\n layoutElement = await renderComponentAsync(layoutMod.default, {\r\n params: route.params,\r\n searchParams,\r\n children: layoutElement,\r\n });\r\n }\r\n }\r\n\r\n // Render the React Tree (SSR)\r\n const ssrContent = renderToString(layoutElement);\r\n\r\n // Apply native waterfall hook: after render\r\n let finalHtml = await pluginManager.runWaterfallHook(PluginHooks.AFTER_RENDER, ssrContent, { route, config, isDev }) as string;\r\n \r\n // Inject Head & Body (Surgical insertion)\r\n const headInjectionsHtml = `\\n ${headInjections}\\n `;\r\n const hmrScript = isDev ? `\\n <script type=\"module\">\\n import { initHMRClient, VelixDevOverlay } from '/__velix/hmr-client.js';\\n initHMRClient();\\n </script>` : '';\r\n const bodyInjectionsHtml = `\\n <div id=\"__velix-islands\"></div>\\n ${hydrationScript}${devToolsHtml}${hmrScript}\\n `;\r\n if (finalHtml.includes('<html')) {\r\n // 1. Inject Head\r\n const headEnd = finalHtml.lastIndexOf('</head>');\r\n if (headEnd !== -1) {\r\n finalHtml = finalHtml.slice(0, headEnd) + headInjectionsHtml + finalHtml.slice(headEnd);\r\n } else {\r\n // Find body start to insert head before it\r\n const bodyStart = finalHtml.search(/<body[^>]*>/i);\r\n if (bodyStart !== -1) {\r\n finalHtml = finalHtml.slice(0, bodyStart) + `<head>${headInjectionsHtml}</head>` + finalHtml.slice(bodyStart);\r\n }\r\n }\r\n\r\n // 2. Inject Body scripts\r\n const bodyEnd = finalHtml.lastIndexOf('</body>');\r\n if (bodyEnd !== -1) {\r\n finalHtml = finalHtml.slice(0, bodyEnd) + bodyInjectionsHtml + finalHtml.slice(bodyEnd);\r\n } else {\r\n finalHtml += bodyInjectionsHtml;\r\n }\r\n\r\n // 3. Ensure Doctype\r\n if (!finalHtml.trim().startsWith('<!DOCTYPE')) {\r\n finalHtml = '<!DOCTYPE html>\\n' + finalHtml;\r\n }\r\n } else {\r\n // Fallback for partial content\r\n finalHtml = `<!DOCTYPE html>\r\n<html lang=\"en\">\r\n<head>\r\n ${headInjectionsHtml}\r\n</head>\r\n<body>\r\n <div id=\"__velix\">${ssrContent}</div>\r\n ${bodyInjectionsHtml}\r\n</body>\r\n</html>`;\r\n }\r\n\r\n res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });\r\n res.end(finalHtml);\r\n\r\n } catch (err: unknown) {\r\n const error = err as Error;\r\n logger.error(`Render error: ${route.path}`, error);\r\n res.writeHead(500, { 'Content-Type': 'text/html; charset=utf-8' });\r\n res.end(generate500Page({\r\n statusCode: 500,\r\n title: 'Render Error',\r\n message: error.message || 'Failed to render page',\r\n stack: isDev ? error.stack : undefined,\r\n isDev,\r\n pathname: route.path\r\n }));\r\n }\r\n}\r\n\r\nasync function serveVelixInternal(pathname: string, req: http.IncomingMessage, res: http.ServerResponse, projectRoot: string) {\r\n // HMR endpoint for dev mode\r\n if (pathname === '/__velix/hmr') {\r\n res.writeHead(200, {\r\n 'Content-Type': 'text/event-stream',\r\n 'Cache-Control': 'no-cache',\r\n 'Connection': 'keep-alive',\r\n });\r\n res.write('data: connected\\n\\n');\r\n const interval = setInterval(() => res.write(':heartbeat\\n\\n'), 30000);\r\n // @ts-ignore\r\n if (res.req?.socket?.server?.__hmrClients) res.req.socket.server.__hmrClients.add(res);\r\n req.on('close', () => {\r\n clearInterval(interval);\r\n // @ts-ignore\r\n if (res.req?.socket?.server?.__hmrClients) res.req.socket.server.__hmrClients.delete(res);\r\n });\r\n return;\r\n }\r\n\r\n if (pathname === '/__velix/logo.webp') {\r\n const __filename = fileURLToPath(import.meta.url);\r\n const __dirname = path.dirname(__filename);\r\n // Check multiple possible locations for the logo\r\n const candidates = [\r\n path.join(__dirname, '..', 'assets', 'logo.webp'),\r\n path.join(__dirname, '..', '..', 'assets', 'logo.webp'),\r\n path.join(process.cwd(), 'node_modules', '@teamvelix', 'velix', 'assets', 'logo.webp'),\r\n path.join(process.cwd(), 'packages', 'velix', 'assets', 'logo.webp'),\r\n path.join(process.cwd(), 'node_modules', 'velix', 'assets', 'logo.webp'),\r\n path.join(process.cwd(), 'public', 'favicon.webp'),\r\n ];\r\n const logoPath = candidates.find(p => fs.existsSync(p));\r\n if (logoPath) {\r\n res.writeHead(200, { 'Content-Type': 'image/webp', 'Cache-Control': 'public, max-age=31536000, immutable' });\r\n res.end(fs.readFileSync(logoPath));\r\n } else {\r\n res.writeHead(404);\r\n res.end();\r\n }\r\n return;\r\n }\r\n\r\n // HMR Client Serving\r\n if (pathname === '/__velix/hmr-client.js') {\r\n try {\r\n const candidates = [\r\n path.join(process.cwd(), 'packages', 'velix-react', 'src', 'hmr', 'hmr-client.ts'),\r\n path.join(process.cwd(), 'node_modules', '@teamvelix', 'velix-react', 'src', 'hmr', 'hmr-client.ts'),\r\n path.join(__dirname, '..', '..', 'velix-react', 'src', 'hmr', 'hmr-client.ts')\r\n ];\r\n const hmrClientSrc = candidates.find(p => fs.existsSync(p));\r\n if (!hmrClientSrc) {\r\n res.writeHead(404);\r\n res.end();\r\n return;\r\n }\r\n const result = await esbuild.build({\r\n entryPoints: [hmrClientSrc],\r\n bundle: true,\r\n format: 'esm',\r\n platform: 'browser',\r\n target: ['es2022'],\r\n minify: true,\r\n write: false,\r\n });\r\n res.writeHead(200, { 'Content-Type': 'application/javascript', 'Cache-Control': 'no-cache' });\r\n res.end(result.outputFiles[0].text);\r\n return;\r\n } catch (err) {\r\n console.error('HMR Client build failed', err);\r\n res.writeHead(500);\r\n res.end();\r\n return;\r\n }\r\n }\r\n\r\n // Dynamic Island Serving\r\n if (pathname.startsWith('/__velix/islands/') && pathname.endsWith('.js')) {\r\n const componentName = pathname.replace('/__velix/islands/', '').replace('.js', '');\r\n try {\r\n // Find the component file\r\n const searchDirs = [\r\n path.join(projectRoot, 'components'),\r\n path.join(projectRoot, 'app'),\r\n path.join(projectRoot, 'islands')\r\n ];\r\n \r\n let componentPath = '';\r\n for (const dir of searchDirs) {\r\n if (!fs.existsSync(dir)) continue;\r\n const files = fs.readdirSync(dir, { recursive: true }) as string[];\r\n const found = files.find(f => f.replace(/\\\\/g, '/').endsWith(`${componentName}.tsx`) || f.replace(/\\\\/g, '/').endsWith(`${componentName}.jsx`));\r\n if (found) {\r\n componentPath = path.join(dir, found);\r\n break;\r\n }\r\n }\r\n\r\n if (!componentPath) {\r\n logger.error(`Island component not found: ${componentName}`);\r\n res.writeHead(404);\r\n res.end('Island component not found');\r\n return;\r\n }\r\n\r\n // Bundle on the fly\r\n const result = await esbuild.build({\r\n entryPoints: [componentPath],\r\n bundle: true,\r\n format: 'esm',\r\n platform: 'browser',\r\n target: ['es2022'],\r\n minify: false,\r\n sourcemap: 'inline',\r\n jsx: 'automatic',\r\n external: ['react', 'react-dom'],\r\n write: false,\r\n });\r\n\r\n res.writeHead(200, { 'Content-Type': 'application/javascript' });\r\n res.end(result.outputFiles[0].text);\r\n return;\r\n } catch (err: unknown) {\r\n const error = err as Error;\r\n logger.error(`Island bundling failed: ${componentName}`, error);\r\n res.writeHead(500);\r\n res.end(`console.error(\"Island bundling failed: ${error.message}\");`);\r\n return;\r\n }\r\n }\r\n\r\n // React & ReactDOM Client serving\r\n if (pathname === '/__velix/react.js' || pathname === '/__velix/react-dom-client.js') {\r\n const dep = pathname === '/__velix/react.js' ? 'react' : 'react-dom/client';\r\n try {\r\n const result = await esbuild.build({\r\n entryPoints: [dep],\r\n bundle: true,\r\n format: 'esm',\r\n platform: 'browser',\r\n target: ['es2022'],\r\n minify: true,\r\n write: false,\r\n });\r\n res.writeHead(200, { 'Content-Type': 'application/javascript', 'Cache-Control': 'public, max-age=31536000, immutable' });\r\n res.end(result.outputFiles[0].text);\r\n return;\r\n } catch (err: unknown) {\r\n res.writeHead(500);\r\n res.end();\r\n return;\r\n }\r\n }\r\n\r\n res.writeHead(404, { 'Content-Type': 'text/plain' });\r\n res.end('Not found');\r\n}\r\n\r\n// ============================================================================\r\n// Utilities\r\n// ============================================================================\r\n\r\nfunction parseRequestBody(req: http.IncomingMessage): Promise<unknown> {\r\n return new Promise((resolve, reject) => {\r\n let body = '';\r\n req.on('data', chunk => { body += chunk; });\r\n req.on('end', () => {\r\n try {\r\n const ct = req.headers['content-type'] || '';\r\n if (ct.includes('application/json')) resolve(JSON.parse(body));\r\n else resolve(body);\r\n } catch { resolve(body); }\r\n });\r\n req.on('error', reject);\r\n });\r\n}\r\n\r\nfunction parseRawBody(req: http.IncomingMessage): Promise<string> {\r\n return new Promise((resolve, reject) => {\r\n let body = '';\r\n req.on('data', chunk => { body += chunk; });\r\n req.on('end', () => resolve(body));\r\n req.on('error', reject);\r\n });\r\n}\r\n\r\nexport default { createServer, tailwindPlugin };\r\n","/**\n * Velix v5 Configuration System\n * Handles loading, validation, and merging of velix.config.ts\n */\n\nimport fs from 'fs';\nimport path from 'path';\nimport { pathToFileURL } from 'url';\nimport { z } from 'zod';\nimport pc from 'picocolors';\n\n// ============================================================================\n// Configuration Schema (Zod validation)\n// ============================================================================\n\nconst AppConfigSchema = z.object({\n name: z.string().default('Velix App'),\n url: z.string().url().optional(),\n}).default({});\n\nconst ServerConfigSchema = z.object({\n port: z.number().min(1).max(65535).default(3000),\n host: z.string().default('localhost'),\n}).default({});\n\nconst RoutingConfigSchema = z.object({\n trailingSlash: z.boolean().default(false),\n}).default({});\n\nconst SEOConfigSchema = z.object({\n sitemap: z.boolean().default(true),\n robots: z.boolean().default(true),\n openGraph: z.boolean().default(true),\n}).default({});\n\nconst BuildConfigSchema = z.object({\n target: z.string().default('es2022'),\n minify: z.boolean().default(true),\n sourcemap: z.boolean().default(true),\n splitting: z.boolean().default(true),\n outDir: z.string().default('.velix'),\n}).default({});\n\nconst ExperimentalConfigSchema = z.object({\n islands: z.boolean().default(true),\n streaming: z.boolean().default(true),\n}).default({});\n\nconst PluginSchema = z.union([\n z.string(),\n z.object({\n name: z.string()\n }).passthrough(),\n]);\n\nexport const VelixConfigSchema = z.object({\n // App identity\n app: AppConfigSchema,\n\n // DevTools toggle\n devtools: z.boolean().default(true),\n\n // Server options\n server: ServerConfigSchema,\n\n // Routing options\n routing: RoutingConfigSchema,\n\n // SEO configuration\n seo: SEOConfigSchema,\n\n // Build options\n build: BuildConfigSchema,\n\n // Experimental features\n experimental: ExperimentalConfigSchema,\n\n // Plugins\n plugins: z.array(PluginSchema).default([]),\n\n // Directories (resolved automatically)\n appDir: z.string().default('app'),\n publicDir: z.string().default('public'),\n\n // Stylesheets\n styles: z.array(z.string()).default([]),\n\n // Favicon\n favicon: z.string().nullable().default(null),\n});\n\nexport type VelixConfig = z.infer<typeof VelixConfigSchema>;\n\n// ============================================================================\n// Default configuration\n// ============================================================================\n\nexport const defaultConfig: VelixConfig = VelixConfigSchema.parse({});\n\n// ============================================================================\n// defineConfig helper\n// ============================================================================\n\n/**\n * Helper function to define configuration with full type support.\n * Use this in your velix.config.ts file.\n *\n * @example\n * ```ts\n * import { defineConfig } from \"velix\";\n *\n * export default defineConfig({\n * app: { name: \"My App\" },\n * server: { port: 3000 },\n * seo: { sitemap: true }\n * });\n * ```\n */\nexport function defineConfig(config: Partial<VelixConfig>): Partial<VelixConfig> {\n return config;\n}\n\n// ============================================================================\n// Config Loader\n// ============================================================================\n\n/**\n * Loads and validates configuration from velix.config.ts\n */\nexport async function loadConfig(projectRoot: string): Promise<VelixConfig> {\n const configPathTs = path.join(projectRoot, 'velix.config.ts');\n const configPathJs = path.join(projectRoot, 'velix.config.js');\n // Support legacy config for migration\n const configPathLegacyTs = path.join(projectRoot, 'flexireact.config.ts');\n const configPathLegacyJs = path.join(projectRoot, 'flexireact.config.js');\n\n let configPath: string | null = null;\n if (fs.existsSync(configPathTs)) configPath = configPathTs;\n else if (fs.existsSync(configPathJs)) configPath = configPathJs;\n else if (fs.existsSync(configPathLegacyTs)) configPath = configPathLegacyTs;\n else if (fs.existsSync(configPathLegacyJs)) configPath = configPathLegacyJs;\n\n let userConfig: Partial<VelixConfig> = {};\n\n if (configPath) {\n try {\n const configUrl = pathToFileURL(configPath).href;\n const module = await import(`${configUrl}?t=${Date.now()}`);\n userConfig = module.default || module;\n } catch (error: any) {\n console.warn(pc.yellow(`⚠ Failed to load config: ${error.message}`));\n }\n }\n\n // Merge and validate with Zod\n const merged = deepMerge(defaultConfig, userConfig as Record<string, any>);\n\n try {\n return VelixConfigSchema.parse(merged);\n } catch (err: unknown) {\n if (err instanceof z.ZodError) {\n console.error(pc.red('✖ Configuration validation failed:'));\n for (const issue of err.issues) {\n console.error(pc.dim(` - ${issue.path.join('.')}: ${issue.message}`));\n }\n process.exit(1);\n }\n throw err;\n }\n}\n\n// ============================================================================\n// Path Resolution\n// ============================================================================\n\n/**\n * Resolves all paths in config relative to project root\n */\nexport function resolvePaths(config: VelixConfig, projectRoot: string): VelixConfig & { resolvedAppDir: string; resolvedPublicDir: string; resolvedOutDir: string } {\n return {\n ...config,\n resolvedAppDir: path.resolve(projectRoot, config.appDir),\n resolvedPublicDir: path.resolve(projectRoot, config.publicDir),\n resolvedOutDir: path.resolve(projectRoot, config.build.outDir),\n };\n}\n\n// ============================================================================\n// Utility: Deep merge\n// ============================================================================\n\nfunction deepMerge(target: Record<string, any>, source: Record<string, any>): Record<string, any> {\n const result = { ...target };\n\n for (const key in source) {\n if (source[key] && typeof source[key] === 'object' && !Array.isArray(source[key])) {\n result[key] = deepMerge(target[key] || {}, source[key]);\n } else {\n result[key] = source[key];\n }\n }\n\n return result;\n}\n","/**\n * Velix v5 Router\n * File-based routing using the app/ directory convention\n *\n * Supports:\n * - app/page.tsx → /\n * - app/dashboard/page.tsx → /dashboard\n * - app/blog/[slug]/page.tsx → /blog/:slug\n * - app/(group)/page.tsx → / (route groups)\n * - app/[...slug]/page.tsx → catch-all routes\n * - layout.tsx, loading.tsx, error.tsx, not-found.tsx\n */\n\nimport fs from 'fs';\nimport path from 'path';\nimport { isServerComponent, isClientComponent, isIsland } from '../utils.js';\nimport type { Route, RouteTree as TypedRouteTree, RouteTreeNode } from '../types.js';\n\n// ============================================================================\n// Route Types\n// ============================================================================\n\nexport const RouteType = {\n PAGE: 'page',\n API: 'api',\n LAYOUT: 'layout',\n LOADING: 'loading',\n ERROR: 'error',\n NOT_FOUND: 'not-found'\n} as const;\n\n// ============================================================================\n// Build Route Tree\n// ============================================================================\n\n/**\n * Builds the complete route tree from the app/ directory\n */\nexport function buildRouteTree(appDir: string) {\n const projectRoot = path.dirname(appDir);\n\n const routes: {\n pages: Route[];\n api: Route[];\n layouts: Map<string, string>;\n tree: RouteTreeNode;\n appRoutes: Route[];\n rootLayout?: string;\n } = {\n pages: [],\n api: [],\n layouts: new Map(),\n tree: { children: {}, routes: [] },\n appRoutes: [],\n };\n\n // Scan app/ directory\n if (fs.existsSync(appDir)) {\n scanAppDirectory(appDir, appDir, routes);\n }\n\n // Scan server/api/ for API routes\n const serverApiDir = path.join(projectRoot, 'server', 'api');\n if (fs.existsSync(serverApiDir)) {\n scanApiDirectory(serverApiDir, serverApiDir, routes);\n }\n\n // Check for root layout\n const rootLayoutTsx = path.join(appDir, 'layout.tsx');\n const rootLayoutJsx = path.join(appDir, 'layout.jsx');\n if (fs.existsSync(rootLayoutTsx)) routes.rootLayout = rootLayoutTsx;\n else if (fs.existsSync(rootLayoutJsx)) routes.rootLayout = rootLayoutJsx;\n\n // Build route tree for nested routes\n routes.tree = buildTree(routes.appRoutes);\n\n return routes;\n}\n\n// ============================================================================\n// App Directory Scanner\n// ============================================================================\n\n/**\n * Scans app/ directory for file-based routing\n * Supports: page.tsx, layout.tsx, loading.tsx, error.tsx, not-found.tsx, [param].tsx\n */\nfunction scanAppDirectory(\n baseDir: string,\n currentDir: string,\n routes: { appRoutes: Route[] },\n parentSegments: string[] = [],\n parentLayout: string | null = null,\n parentMiddleware: string | null = null\n) {\n const entries = fs.readdirSync(currentDir, { withFileTypes: true });\n\n // Find special files in current directory\n const specialFiles: Record<string, string | null> = {\n page: null,\n layout: null,\n loading: null,\n error: null,\n notFound: null,\n template: null,\n middleware: null\n };\n\n for (const entry of entries) {\n if (entry.isFile()) {\n const name = entry.name.replace(/\\.(jsx|js|tsx|ts)$/, '');\n const fullPath = path.join(currentDir, entry.name);\n const ext = path.extname(entry.name);\n\n // Only process relevant extensions\n if (!['.tsx', '.jsx', '.ts', '.js'].includes(ext)) continue;\n\n if (name === 'page') specialFiles.page = fullPath;\n if (name === 'layout') specialFiles.layout = fullPath;\n if (name === 'loading') specialFiles.loading = fullPath;\n if (name === 'error') specialFiles.error = fullPath;\n if (name === 'not-found') specialFiles.notFound = fullPath;\n if (name === 'template') specialFiles.template = fullPath;\n if (name === 'middleware' || name === '_middleware') specialFiles.middleware = fullPath;\n\n // Handle [param].tsx files directly in app/ (alternative to [param]/page.tsx)\n if (name.startsWith('[') && name.endsWith(']') && ['.tsx', '.jsx'].includes(ext)) {\n const paramName = name.slice(1, -1);\n let segmentName: string;\n\n if (paramName.startsWith('...')) {\n segmentName = '*' + paramName.slice(3);\n } else {\n segmentName = ':' + paramName;\n }\n\n const routePath = '/' + [...parentSegments, segmentName].join('/');\n\n routes.appRoutes.push({\n type: RouteType.PAGE,\n path: routePath.replace(/\\/+/g, '/'),\n filePath: fullPath,\n pattern: createRoutePattern(routePath),\n segments: [...parentSegments, segmentName],\n layout: specialFiles.layout || parentLayout,\n loading: specialFiles.loading,\n error: specialFiles.error,\n notFound: specialFiles.notFound,\n template: specialFiles.template,\n middleware: specialFiles.middleware || parentMiddleware,\n isServerComponent: isServerComponent(fullPath),\n isClientComponent: isClientComponent(fullPath),\n isIsland: isIsland(fullPath),\n });\n }\n }\n }\n\n // If there's a page.tsx, create a route for this directory\n if (specialFiles.page) {\n const routePath = '/' + parentSegments.join('/') || '/';\n\n routes.appRoutes.push({\n type: RouteType.PAGE,\n path: routePath.replace(/\\/+/g, '/') || '/',\n filePath: specialFiles.page,\n pattern: createRoutePattern(routePath || '/'),\n segments: parentSegments,\n layout: specialFiles.layout || parentLayout,\n loading: specialFiles.loading,\n error: specialFiles.error,\n notFound: specialFiles.notFound,\n template: specialFiles.template,\n middleware: specialFiles.middleware || parentMiddleware,\n isServerComponent: isServerComponent(specialFiles.page),\n isClientComponent: isClientComponent(specialFiles.page),\n isIsland: isIsland(specialFiles.page),\n });\n }\n\n // Recursively scan subdirectories\n for (const entry of entries) {\n if (entry.isDirectory()) {\n const fullPath = path.join(currentDir, entry.name);\n\n // Skip special directories\n if (entry.name.startsWith('_') || entry.name.startsWith('.')) continue;\n\n // Handle route groups (parentheses) — don't add to URL\n const isGroup = entry.name.startsWith('(') && entry.name.endsWith(')');\n\n // Handle dynamic segments [param]\n let segmentName = entry.name;\n if (entry.name.startsWith('[') && entry.name.endsWith(']')) {\n segmentName = ':' + entry.name.slice(1, -1);\n if (entry.name.startsWith('[...')) {\n segmentName = '*' + entry.name.slice(4, -1);\n }\n if (entry.name.startsWith('[[...')) {\n segmentName = '*' + entry.name.slice(5, -2);\n }\n }\n\n const newSegments = isGroup ? parentSegments : [...parentSegments, segmentName];\n const newLayout = specialFiles.layout || parentLayout;\n const newMiddleware = specialFiles.middleware || parentMiddleware;\n\n scanAppDirectory(baseDir, fullPath, routes, newSegments, newLayout, newMiddleware);\n }\n }\n}\n\n// ============================================================================\n// API Directory Scanner (server/api/)\n// ============================================================================\n\nfunction scanApiDirectory(baseDir: string, currentDir: string, routes: { api: Route[] }, parentSegments: string[] = []) {\n const entries = fs.readdirSync(currentDir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = path.join(currentDir, entry.name);\n\n if (entry.isDirectory()) {\n scanApiDirectory(baseDir, fullPath, routes, [...parentSegments, entry.name]);\n } else if (entry.isFile()) {\n const ext = path.extname(entry.name);\n if (!['.ts', '.js'].includes(ext)) continue;\n\n const baseName = path.basename(entry.name, ext);\n // route.ts maps to the parent path, other names become segments\n const apiSegments = baseName === 'route' || baseName === 'index'\n ? parentSegments\n : [...parentSegments, baseName];\n\n const apiPath = '/api/' + apiSegments.join('/');\n\n routes.api.push({\n type: RouteType.API,\n path: apiPath.replace(/\\/+/g, '/') || '/api',\n filePath: fullPath,\n pattern: createRoutePattern(apiPath),\n segments: ['api', ...apiSegments].filter(Boolean),\n });\n }\n }\n}\n\n// ============================================================================\n// Route Matching\n// ============================================================================\n\n/**\n * Creates regex pattern for route matching\n */\nfunction createRoutePattern(routePath: string): RegExp {\n let pattern = routePath\n .replace(/\\*[^/]*/g, '(.*)') // Catch-all\n .replace(/:[^/]+/g, '([^/]+)') // Dynamic segments\n .replace(/\\//g, '\\\\/');\n\n return new RegExp(`^${pattern}$`);\n}\n\n/**\n * Matches URL path against routes\n */\nexport function matchRoute(urlPath: string, routes: Route[]) {\n const normalizedPath = urlPath === '' ? '/' : urlPath.split('?')[0];\n\n for (const route of routes) {\n const match = normalizedPath.match(route.pattern);\n if (match) {\n const params = extractParams(route.path, match);\n return { ...route, params };\n }\n }\n\n return null;\n}\n\n/**\n * Extracts parameters from route match\n */\nfunction extractParams(routePath: string, match: RegExpMatchArray): Record<string, string> {\n const params: Record<string, string> = {};\n const paramNames: string[] = [];\n\n const paramRegex = /:([^/]+)|\\*([^/]*)/g;\n let paramMatch;\n while ((paramMatch = paramRegex.exec(routePath)) !== null) {\n paramNames.push(paramMatch[1] || paramMatch[2] || 'splat');\n }\n\n paramNames.forEach((name, index) => {\n params[name] = match[index + 1];\n });\n\n return params;\n}\n\n// ============================================================================\n// Layout Resolution\n// ============================================================================\n\n/**\n * Finds all layouts that apply to a route\n */\nexport function findRouteLayouts(route: Route, layoutsMap: Map<string, string>): Array<{ name: string; filePath: string | undefined }> {\n const layouts: Array<{ name: string; filePath: string | undefined }> = [];\n\n // Check for segment-based layouts\n for (const segment of route.segments) {\n if (layoutsMap.has(segment)) {\n layouts.push({ name: segment, filePath: layoutsMap.get(segment) });\n }\n }\n\n // Check for route-specific layout\n if (route.layout) {\n layouts.push({ name: 'route', filePath: route.layout });\n }\n\n // Check for root layout\n if (layoutsMap.has('root')) {\n layouts.unshift({ name: 'root', filePath: layoutsMap.get('root') });\n }\n\n return layouts;\n}\n\n// ============================================================================\n// Tree Building\n// ============================================================================\n\nfunction buildTree(routes: Route[]): RouteTreeNode {\n const tree: RouteTreeNode = { children: {}, routes: [] };\n\n for (const route of routes) {\n let current = tree;\n for (const segment of route.segments) {\n if (!current.children[segment]) {\n current.children[segment] = { children: {}, routes: [] };\n }\n current = current.children[segment];\n }\n current.routes.push(route);\n }\n\n return tree;\n}\n\n// ============================================================================\n// Default Export\n// ============================================================================\n\nexport default {\n buildRouteTree,\n matchRoute,\n findRouteLayouts,\n RouteType\n};\n","/**\n * Velix v5 Utility Functions\n */\n\nimport fs from 'fs';\nimport path from 'path';\nimport crypto from 'crypto';\n\n/**\n * Generates a unique hash for cache busting\n */\nexport function generateHash(content: string): string {\n return crypto.createHash('md5').update(content).digest('hex').slice(0, 8);\n}\n\n/**\n * Escapes HTML special characters\n */\nexport function escapeHtml(str: string): string {\n const htmlEntities: Record<string, string> = {\n '&': '&', '<': '<', '>': '>',\n '\"': '"', \"'\": '''\n };\n return String(str).replace(/[&<>\"']/g, char => htmlEntities[char]);\n}\n\n/**\n * Recursively finds all files matching a pattern\n */\nexport function findFiles(dir: string, pattern: RegExp, files: string[] = []): string[] {\n if (!fs.existsSync(dir)) return files;\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n if (entry.isDirectory()) findFiles(fullPath, pattern, files);\n else if (pattern.test(entry.name)) files.push(fullPath);\n }\n return files;\n}\n\n/**\n * Ensures a directory exists\n */\nexport function ensureDir(dir: string): void {\n if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });\n}\n\n/**\n * Cleans a directory\n */\nexport function cleanDir(dir: string): void {\n if (fs.existsSync(dir)) fs.rmSync(dir, { recursive: true, force: true });\n fs.mkdirSync(dir, { recursive: true });\n}\n\n/**\n * Copies a directory recursively\n */\nexport function copyDir(src: string, dest: string): void {\n ensureDir(dest);\n const entries = fs.readdirSync(src, { withFileTypes: true });\n for (const entry of entries) {\n const srcPath = path.join(src, entry.name);\n const destPath = path.join(dest, entry.name);\n if (entry.isDirectory()) copyDir(srcPath, destPath);\n else fs.copyFileSync(srcPath, destPath);\n }\n}\n\n/**\n * Debounce function for file watching\n */\nexport function debounce<T extends (...args: unknown[]) => unknown>(fn: T, delay: number): (...args: Parameters<T>) => void {\n let timeout: ReturnType<typeof setTimeout> | undefined;\n return (...args: Parameters<T>) => {\n clearTimeout(timeout);\n timeout = setTimeout(() => fn(...args), delay);\n };\n}\n\n/**\n * Formats bytes to human-readable string\n */\nexport function formatBytes(bytes: number): string {\n if (bytes === 0) return '0 B';\n const k = 1024;\n const sizes = ['B', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];\n}\n\n/**\n * Formats milliseconds to human-readable string\n */\nexport function formatTime(ms: number): string {\n if (ms < 1000) return `${ms}ms`;\n return `${(ms / 1000).toFixed(2)}s`;\n}\n\n/**\n * Creates a deferred promise\n */\nexport function createDeferred<T>() {\n let resolve: (value: T | PromiseLike<T>) => void;\n let reject: (reason?: unknown) => void;\n const promise = new Promise<T>((res, rej) => {\n resolve = res;\n reject = rej;\n });\n return { promise, resolve: resolve!, reject: reject! };\n}\n\n/**\n * Sleep utility\n */\nexport function sleep(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n}\n\n/**\n * Check if a file is a server component (has 'use server' directive)\n */\nexport function isServerComponent(filePath: string): boolean {\n try {\n const content = fs.readFileSync(filePath, 'utf-8');\n const firstLine = content.split('\\n')[0].trim();\n return firstLine === \"'use server'\" || firstLine === '\"use server\"';\n } catch { return false; }\n}\n\n/**\n * Check if a file is a client component (has 'use client' directive)\n */\nexport function isClientComponent(filePath: string): boolean {\n try {\n const content = fs.readFileSync(filePath, 'utf-8');\n const firstLine = content.split('\\n')[0].trim();\n return firstLine === \"'use client'\" || firstLine === '\"use client\"';\n } catch { return false; }\n}\n\n/**\n * Check if a component is an island (has 'use island' directive)\n */\nexport function isIsland(filePath: string): boolean {\n try {\n const content = fs.readFileSync(filePath, 'utf-8');\n const firstLine = content.split('\\n')[0].trim();\n return firstLine === \"'use island'\" || firstLine === '\"use island\"';\n } catch { return false; }\n}\n","/**\n * Velix v5 Middleware System\n * Request processing pipeline with composable middleware\n */\n\nimport fs from 'fs';\nimport path from 'path';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface MiddlewareRequest {\n url: string;\n method: string;\n headers: Record<string, string | string[] | undefined>;\n cookies: Record<string, string>;\n params: Record<string, string>;\n query: Record<string, string>;\n body?: unknown;\n raw: import('http').IncomingMessage;\n}\n\nexport interface MiddlewareResponse {\n status: (code: number) => MiddlewareResponse;\n header: (name: string, value: string) => MiddlewareResponse;\n json: (data: unknown) => void;\n redirect: (url: string, status?: number) => void;\n rewrite: (url: string) => void;\n next: () => Promise<void>;\n _statusCode: number;\n _headers: Record<string, string>;\n _redirectUrl: string | null;\n _rewriteUrl: string | null;\n _ended: boolean;\n}\n\nexport type MiddlewareFunction = (\n req: MiddlewareRequest,\n res: MiddlewareResponse,\n next: () => Promise<void>\n) => void | Promise<void>;\n\nexport type MiddlewareResult = {\n continue: boolean;\n rewritten: boolean;\n};\n\n// ============================================================================\n// Built-in Middleware Registry\n// ============================================================================\n\nexport const middlewares = {\n cors(options: {\n origin?: string | string[];\n methods?: string[];\n headers?: string[];\n credentials?: boolean;\n maxAge?: number;\n } = {}): MiddlewareFunction {\n const {\n origin = '*',\n methods = ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'OPTIONS'],\n headers: allowHeaders = ['Content-Type', 'Authorization'],\n credentials = false,\n maxAge = 86400\n } = options;\n\n return async (req, res, next) => {\n const originHeader = typeof origin === 'string' ? origin : origin.includes(req.headers.origin as string) ? req.headers.origin as string : '';\n\n res.header('Access-Control-Allow-Origin', originHeader);\n res.header('Access-Control-Allow-Methods', methods.join(', '));\n res.header('Access-Control-Allow-Headers', allowHeaders.join(', '));\n res.header('Access-Control-Max-Age', String(maxAge));\n\n if (credentials) {\n res.header('Access-Control-Allow-Credentials', 'true');\n }\n\n if (req.method === 'OPTIONS') {\n res.status(204);\n return;\n }\n\n await next();\n };\n },\n\n rateLimit(options: {\n windowMs?: number;\n max?: number;\n message?: string;\n } = {}): MiddlewareFunction {\n const { windowMs = 60000, max = 100, message = 'Too many requests' } = options;\n const store = new Map<string, { count: number; resetTime: number }>();\n\n return async (req, res, next) => {\n const ip = req.headers['x-forwarded-for'] as string || 'unknown';\n const now = Date.now();\n const record = store.get(ip);\n\n if (!record || now > record.resetTime) {\n store.set(ip, { count: 1, resetTime: now + windowMs });\n } else if (record.count >= max) {\n res.status(429).json({ error: message });\n return;\n } else {\n record.count++;\n }\n\n await next();\n };\n },\n\n security(): MiddlewareFunction {\n return async (_req, res, next) => {\n res.header('X-Content-Type-Options', 'nosniff');\n res.header('X-Frame-Options', 'DENY');\n res.header('X-XSS-Protection', '1; mode=block');\n res.header('Referrer-Policy', 'strict-origin-when-cross-origin');\n await next();\n };\n },\n};\n\n// ============================================================================\n// Middleware Loader\n// ============================================================================\n\n/**\n * Loads proxy middleware from the project root (proxy.ts or proxy.js)\n */\nexport async function loadMiddleware(projectRoot: string): Promise<MiddlewareFunction[]> {\n const fns: MiddlewareFunction[] = [];\n const possibleFiles = ['proxy.ts', 'proxy.js'];\n\n for (const file of possibleFiles) {\n const filePath = path.join(projectRoot, file);\n if (!fs.existsSync(filePath)) continue;\n\n try {\n const { pathToFileURL } = await import('url');\n const url = pathToFileURL(filePath).href;\n const mod = await import(`${url}?t=${Date.now()}`);\n const fn = mod.default || mod.proxy || mod.middleware;\n if (typeof fn === 'function') {\n fns.push(fn);\n break; // Only load the first found proxy file\n }\n } catch (err: unknown) {\n const error = err as Error;\n console.warn(`⚠ Failed to load proxy ${file}: ${error.message}`);\n }\n }\n\n return fns;\n}\n\n// ============================================================================\n// Middleware Runner\n// ============================================================================\n\n/**\n * Runs middleware chain for a request\n */\nexport async function runMiddleware(\n req: import('http').IncomingMessage,\n res: import('http').ServerResponse,\n fns: MiddlewareFunction[]\n): Promise<MiddlewareResult> {\n const result: MiddlewareResult = { continue: true, rewritten: false };\n if (fns.length === 0) return result;\n\n const url = new URL(req.url || '/', `http://${req.headers.host || 'localhost'}`);\n const cookies: Record<string, string> = {};\n const cookieHeader = req.headers.cookie;\n if (cookieHeader) {\n cookieHeader.split(';').forEach(c => {\n const [k, ...v] = c.split('=');\n if (k) cookies[k.trim()] = v.join('=').trim();\n });\n }\n\n const mReq: MiddlewareRequest = {\n url: req.url || '/',\n method: req.method || 'GET',\n headers: req.headers as Record<string, string>,\n cookies,\n params: {},\n query: Object.fromEntries(url.searchParams),\n raw: req,\n };\n\n let ended = false;\n const mRes: MiddlewareResponse = {\n _statusCode: 200,\n _headers: {},\n _redirectUrl: null,\n _rewriteUrl: null,\n _ended: false,\n status(code) { this._statusCode = code; return this; },\n header(name, value) { this._headers[name] = value; return this; },\n json(data) {\n this._headers['Content-Type'] = 'application/json';\n res.writeHead(this._statusCode, this._headers);\n res.end(JSON.stringify(data));\n this._ended = true;\n ended = true;\n },\n redirect(url, status = 307) {\n this._redirectUrl = url;\n this._statusCode = status;\n res.writeHead(status, { Location: url, ...this._headers });\n res.end();\n this._ended = true;\n ended = true;\n },\n rewrite(url) {\n this._rewriteUrl = url;\n req.url = url;\n result.rewritten = true;\n },\n async next() { /* handled by chain */ },\n };\n\n // Run middleware chain\n let index = 0;\n const next = async () => {\n if (ended || index >= fns.length) return;\n const fn = fns[index++];\n await fn(mReq, mRes, next);\n };\n\n await next();\n\n // Apply headers that were set\n if (!ended) {\n for (const [key, value] of Object.entries(mRes._headers)) {\n res.setHeader(key, value);\n }\n }\n\n result.continue = !ended;\n return result;\n}\n\n/**\n * Compose multiple middleware into one\n */\nexport function composeMiddleware(...fns: MiddlewareFunction[]): MiddlewareFunction {\n return async (req, res, next) => {\n let index = 0;\n const run = async () => {\n if (index >= fns.length) { await next(); return; }\n const fn = fns[index++];\n await fn(req, res, run);\n };\n await run();\n };\n}\n","/**\n * Velix v5 Plugin System\n * Extensible hook-based plugin architecture\n */\n\nimport fs from 'fs';\nimport path from 'path';\nimport { pathToFileURL } from 'url';\n\n// ============================================================================\n// Plugin Hooks\n// ============================================================================\n\nexport const PluginHooks = {\n CONFIG: 'config',\n SERVER_START: 'server:start',\n REQUEST: 'request',\n RESPONSE: 'response',\n ROUTES_LOADED: 'routes:loaded',\n BEFORE_RENDER: 'render:before',\n AFTER_RENDER: 'render:after',\n BUILD_START: 'build:start',\n BUILD_END: 'build:end',\n} as const;\n\nexport type PluginHook = typeof PluginHooks[keyof typeof PluginHooks];\n\n// ============================================================================\n// Plugin Interface\n// ============================================================================\n\nexport interface PluginHookArgs {\n [PluginHooks.CONFIG]: [config: import('../config.js').VelixConfig];\n [PluginHooks.SERVER_START]: [context: { config: import('../config.js').VelixConfig; isDev: boolean; projectRoot: string }, isDev: boolean];\n [PluginHooks.REQUEST]: [req: import('http').IncomingMessage, res: import('http').ServerResponse];\n [PluginHooks.RESPONSE]: [req: import('http').IncomingMessage, res: import('http').ServerResponse, duration: number];\n [PluginHooks.ROUTES_LOADED]: [routes: import('../types.js').RouteTree];\n [PluginHooks.BEFORE_RENDER]: [html: string, context: { route: import('../types.js').Route; config: import('../config.js').VelixConfig; isDev: boolean }];\n [PluginHooks.AFTER_RENDER]: [html: string, context: { route: import('../types.js').Route; config: import('../config.js').VelixConfig; isDev: boolean }];\n [PluginHooks.BUILD_START]: [];\n [PluginHooks.BUILD_END]: [stats: { time: number }];\n}\n\nexport interface VelixPluginDefinition {\n name: string;\n version?: string;\n setup?: (config: import('../config.js').VelixConfig) => void | Promise<void>;\n hooks?: { [K in PluginHook]?: (...args: PluginHookArgs[K]) => unknown };\n [key: string]: unknown; // Allow for Zod passthrough and extra properties\n}\n\n// ============================================================================\n// Plugin Manager\n// ============================================================================\n\nexport class PluginManager {\n private plugins: VelixPluginDefinition[] = [];\n private hooks: Map<string, Array<(...args: any[]) => any>> = new Map();\n\n /**\n * Register a plugin\n */\n register(plugin: VelixPluginDefinition) {\n this.plugins.push(plugin);\n\n // Register hooks\n if (plugin.hooks) {\n for (const [hookName, handler] of Object.entries(plugin.hooks)) {\n if (handler) {\n const existing = this.hooks.get(hookName) || [];\n existing.push(handler);\n this.hooks.set(hookName, existing);\n }\n }\n }\n }\n\n /**\n * Run a hook with arguments\n */\n async runHook<K extends PluginHook>(hookName: K, ...args: PluginHookArgs[K]): Promise<void> {\n const handlers = this.hooks.get(hookName) || [];\n for (const handler of handlers) {\n await handler(...args);\n }\n }\n\n /**\n * Run a waterfall hook — each handler transforms the first argument\n */\n async runWaterfallHook<K extends PluginHook>(hookName: K, value: PluginHookArgs[K][0], ...args: PluginHookArgs[K] extends [unknown, ...infer Rest] ? Rest : []): Promise<PluginHookArgs[K][0]> {\n const handlers = this.hooks.get(hookName) || [];\n let result = value;\n for (const handler of handlers) {\n const transformed = await handler(result, ...args);\n if (transformed !== undefined) result = transformed;\n }\n return result;\n }\n\n /**\n * Get all registered plugins\n */\n getPlugins(): VelixPluginDefinition[] {\n return [...this.plugins];\n }\n\n /**\n * Check if a plugin is registered\n */\n hasPlugin(name: string): boolean {\n return this.plugins.some(p => p.name === name);\n }\n}\n\n// ============================================================================\n// Global Instance\n// ============================================================================\n\nexport const pluginManager = new PluginManager();\n\n// ============================================================================\n// Plugin Loader\n// ============================================================================\n\n/**\n * Load plugins from project configuration\n */\nexport async function loadPlugins(projectRoot: string, config: { plugins?: unknown[] }): Promise<void> {\n const pluginEntries = config.plugins || [];\n\n for (const entry of pluginEntries) {\n try {\n if (typeof entry === 'string') {\n // Load plugin by name (from plugins/ dir or node_modules)\n const localPath = path.join(projectRoot, 'plugins', entry + '.ts');\n const localPathJs = path.join(projectRoot, 'plugins', entry + '.js');\n const localPathDir = path.join(projectRoot, 'plugins', entry, 'index.ts');\n\n let pluginPath: string | null = null;\n if (fs.existsSync(localPath)) pluginPath = localPath;\n else if (fs.existsSync(localPathJs)) pluginPath = localPathJs;\n else if (fs.existsSync(localPathDir)) pluginPath = localPathDir;\n\n if (pluginPath) {\n const url = pathToFileURL(pluginPath).href;\n const mod = await import(`${url}?t=${Date.now()}`);\n const plugin = mod.default || mod;\n if (plugin.name) {\n pluginManager.register(plugin);\n }\n } else {\n // Try node_modules\n try {\n const mod = await import(entry);\n const plugin = mod.default || mod;\n if (plugin.name) pluginManager.register(plugin);\n } catch {\n console.warn(`⚠ Plugin not found: ${entry}`);\n }\n }\n } else if (typeof entry === 'object' && entry !== null && 'name' in entry) {\n // Inline plugin definition\n pluginManager.register(entry as VelixPluginDefinition);\n }\n } catch (err: unknown) {\n const error = err as Error;\n console.warn(`⚠ Failed to load plugin: ${error?.message || String(error)}`);\n }\n }\n}\n\n// ============================================================================\n// Plugin Definition Helper\n// ============================================================================\n\n/**\n * Helper to define a Velix plugin with type safety.\n *\n * @example\n * ```ts\n * export default definePlugin({\n * name: 'my-plugin',\n * hooks: {\n * 'server:start': (server) => {\n * console.log('Server started!');\n * }\n * }\n * });\n * ```\n */\nexport function definePlugin(definition: VelixPluginDefinition): VelixPluginDefinition {\n return definition;\n}\n\n// ============================================================================\n// Built-in Plugins\n// ============================================================================\n\nexport const builtinPlugins = {\n /**\n * Security headers plugin\n */\n security: definePlugin({\n name: 'velix:security',\n hooks: {\n [PluginHooks.RESPONSE]: (_req: unknown, res: unknown) => {\n const response = res as import('http').ServerResponse;\n if (!response.headersSent) {\n response.setHeader('X-Content-Type-Options', 'nosniff');\n response.setHeader('X-Frame-Options', 'DENY');\n response.setHeader('X-XSS-Protection', '1; mode=block');\n }\n }\n }\n }),\n\n /**\n * Request logging plugin\n */\n logger: definePlugin({\n name: 'velix:logger',\n hooks: {\n [PluginHooks.RESPONSE]: (req: unknown, _res: unknown, duration: unknown) => {\n const request = req as import('http').IncomingMessage;\n console.log(` ${request.method} ${request.url} ${duration}ms`);\n }\n }\n }),\n};\n","import { spawnSync, spawn } from 'child_process';\nimport fs from 'fs';\nimport path from 'path';\nimport { PluginHooks, definePlugin } from './index.js';\nimport logger from '../logger.js';\n\nexport interface TailwindPluginOptions {\n input?: string;\n output?: string;\n config?: string;\n minify?: boolean;\n}\n\n/**\n * Detect which Tailwind CLI is available (v4: @tailwindcss/cli, v3: tailwindcss)\n */\nfunction detectTailwindCli(): string {\n // Try v4 CLI first\n const v4 = spawnSync('npx @tailwindcss/cli --help', {\n stdio: 'pipe',\n timeout: 15000,\n shell: true,\n });\n if (v4.status === 0) return '@tailwindcss/cli';\n\n // Fallback to v3 CLI\n return 'tailwindcss';\n}\n\n/**\n * Native Velix Tailwind CSS Plugin\n * Automatically handles CSS compilation and injection.\n * Supports both Tailwind CSS v3 and v4.\n */\nexport default function tailwindPlugin(options: TailwindPluginOptions = {}) {\n const input = options.input || './app/globals.css';\n const output = options.output || './public/tailwind.css';\n const configPath = options.config || './tailwind.config.ts';\n let cliCmd: string | null = null;\n\n function getCli(): string {\n if (!cliCmd) cliCmd = detectTailwindCli();\n return cliCmd;\n }\n\n return definePlugin({\n name: 'velix:tailwind',\n hooks: {\n [PluginHooks.CONFIG]: (configArg: unknown) => {\n const config = configArg as import('../config.js').VelixConfig;\n // Automatically ensure the output CSS is in the styles array\n const relativeOutput = output.startsWith('./') ? output.substring(1) : output;\n const stylePath = relativeOutput.startsWith('/public') ? relativeOutput.substring(7) : relativeOutput;\n \n if (!config.styles) config.styles = [];\n if (!config.styles.includes(stylePath)) {\n config.styles.push(stylePath);\n }\n },\n\n [PluginHooks.BUILD_START]: async () => {\n logger.info('Building Tailwind CSS...');\n try {\n const cli = getCli();\n let cmd = `npx ${cli} -i \"${input}\" -o \"${output}\"`;\n if (options.minify !== false) cmd += ' --minify';\n spawnSync(cmd, { \n stdio: 'inherit',\n cwd: process.cwd(),\n shell: true,\n });\n logger.success('Tailwind CSS built successfully');\n } catch (err: unknown) {\n logger.error('Tailwind build failed', err as Error);\n }\n },\n\n [PluginHooks.SERVER_START]: async (server: unknown, isDevArg: unknown) => {\n const isDev = isDevArg as boolean;\n if (!isDev) return;\n\n // Check if input file exists\n if (!fs.existsSync(input)) {\n logger.warn(`Tailwind input file not found: ${input}`);\n return;\n }\n\n // Ensure output directory exists\n const outputDir = path.dirname(output);\n if (!fs.existsSync(outputDir)) {\n fs.mkdirSync(outputDir, { recursive: true });\n }\n\n // Build initial CSS synchronously\n logger.info('Building initial Tailwind CSS...');\n try {\n const cli = getCli();\n const buildResult = spawnSync(`npx ${cli} -i \"${input}\" -o \"${output}\"`, {\n cwd: process.cwd(),\n stdio: 'pipe',\n shell: true,\n });\n\n if (buildResult.status !== 0) {\n const stderr = buildResult.stderr?.toString() || '';\n // Only show 'not installed' if we actually can't find the CLI command\n if (buildResult.error || stderr.includes('not found') || stderr.includes('ENOENT')) {\n logger.warn('Tailwind CSS CLI not found — skipping. CSS will still be served if pre-built.');\n } else if (stderr.trim()) {\n logger.warn(`Tailwind build warning: ${stderr.trim().split('\\n')[0]}`);\n }\n return;\n }\n\n logger.success('Tailwind CSS built successfully');\n } catch (err: unknown) {\n logger.error('Failed to build Tailwind CSS', err as Error);\n return;\n }\n\n // Start watcher\n logger.info('Starting Tailwind CSS watcher...');\n const cli = getCli();\n const watcher = spawn(`npx ${cli} -i \"${input}\" -o \"${output}\" --watch`, {\n stdio: 'pipe',\n cwd: process.cwd(),\n shell: true,\n });\n\n watcher.stdout.on('data', (data) => {\n const msg = data.toString().trim();\n if (msg && !msg.includes('Rebuilding...') && !msg.includes('Done in')) {\n logger.info(`Tailwind: ${msg}`);\n }\n });\n\n watcher.stderr.on('data', (data) => {\n const msg = data.toString().trim();\n if (msg && !msg.includes('warn')) {\n logger.warn(`Tailwind: ${msg}`);\n }\n });\n\n watcher.on('error', (err) => {\n logger.error('Tailwind watcher error', err);\n });\n\n watcher.on('exit', (code) => {\n if (code !== 0 && code !== null) {\n logger.error(`Tailwind watcher exited with code ${code}`);\n }\n });\n\n const cleanup = () => {\n if (watcher && !watcher.killed) {\n watcher.kill();\n }\n };\n\n process.on('exit', cleanup);\n process.on('SIGINT', cleanup);\n process.on('SIGTERM', cleanup);\n }\n }\n });\n}\n","/**\n * Velix v5 Logger\n * Minimalist, professional output inspired by modern CLIs\n */\n\nimport { VERSION } from './version.js';\n\nconst colors = {\n reset: '\\x1b[0m',\n bold: '\\x1b[1m',\n dim: '\\x1b[2m',\n red: '\\x1b[31m',\n green: '\\x1b[32m',\n yellow: '\\x1b[33m',\n blue: '\\x1b[34m',\n magenta: '\\x1b[35m',\n cyan: '\\x1b[36m',\n white: '\\x1b[37m',\n gray: '\\x1b[90m',\n};\n\nconst c = colors;\n\nfunction getTime() {\n const now = new Date();\n const hours = String(now.getHours()).padStart(2, '0');\n const minutes = String(now.getMinutes()).padStart(2, '0');\n const seconds = String(now.getSeconds()).padStart(2, '0');\n return `${c.dim}${hours}:${minutes}:${seconds}${c.reset}`;\n}\n\nfunction getStatusColor(status: number) {\n if (status >= 500) return c.red;\n if (status >= 400) return c.yellow;\n if (status >= 300) return c.cyan;\n if (status >= 200) return c.green;\n return c.white;\n}\n\nfunction fmtTime(ms: number) {\n if (ms < 1) return `${c.gray}<1ms${c.reset}`;\n if (ms < 100) return `${c.green}${ms}ms${c.reset}`;\n if (ms < 500) return `${c.yellow}${ms}ms${c.reset}`;\n return `${c.red}${ms}ms${c.reset}`;\n}\n\nconst LOGO = `\n ${c.cyan}▲${c.reset} ${c.bold}Velix${c.reset} ${c.dim}v${VERSION}${c.reset}\n`;\n\nexport const logger = {\n logo() {\n console.log(LOGO);\n console.log(`${c.dim} ──────────────────────────────────────────────${c.reset}`);\n console.log('');\n },\n\n serverStart(config: { port: number | string; host: string; mode: string; pagesDir?: string }, startTime = Date.now()) {\n const { port, host, mode, pagesDir } = config;\n const elapsed = Date.now() - startTime;\n\n console.log(LOGO);\n console.log(` ${c.green}✔${c.reset} ${c.bold}Ready${c.reset} in ${elapsed}ms`);\n console.log('');\n console.log(` ${c.bold}Local:${c.reset} ${c.cyan}http://${host}:${port}${c.reset}`);\n console.log(` ${c.bold}Mode:${c.reset} ${mode === 'development' ? c.yellow : c.green}${mode}${c.reset}`);\n if (pagesDir) console.log(` ${c.bold}App:${c.reset} ${c.dim}${pagesDir}${c.reset}`);\n console.log('');\n },\n\n request(method: string, path: string, status: number, time: number, extra: { type?: string } = {}) {\n const statusColor = getStatusColor(status);\n const timeStr = fmtTime(time);\n\n let badge = `${c.dim}○${c.reset}`;\n if (extra.type === 'dynamic' || extra.type === 'ssr') badge = `${c.white}ƒ${c.reset}`;\n else if (extra.type === 'api') badge = `${c.cyan}λ${c.reset}`;\n\n const statusStr = `${statusColor}${status}${c.reset}`;\n console.log(` ${badge} ${c.white}${method}${c.reset} ${path} ${statusStr} ${c.dim}${timeStr}${c.reset}`);\n },\n\n info(msg: string) { console.log(` ${c.cyan}ℹ${c.reset} ${msg}`); },\n success(msg: string) { console.log(` ${c.green}✔${c.reset} ${msg}`); },\n warn(msg: string) { console.log(` ${c.yellow}⚠${c.reset} ${c.yellow}${msg}${c.reset}`); },\n\n error(msg: string, err: Error | null = null) {\n console.log(` ${c.red}✖${c.reset} ${c.red}${msg}${c.reset}`);\n if (err?.stack) {\n console.log('');\n console.log(`${c.dim}${err.stack.split('\\n').slice(1, 4).join('\\n')}${c.reset}`);\n console.log('');\n }\n },\n\n compile(file: string, time: number) {\n console.log(` ${c.white}●${c.reset} Compiling ${c.dim}${file}${c.reset} ${c.dim}(${time}ms)${c.reset}`);\n },\n\n hmr(file: string) {\n console.log(` ${c.green}↻${c.reset} Fast Refresh ${c.dim}${file}${c.reset}`);\n },\n\n plugin(name: string) {\n console.log(` ${c.cyan}◆${c.reset} Plugin ${c.dim}${name}${c.reset}`);\n },\n\n route(path: string, type: string) {\n const typeLabel = type === 'api' ? 'λ' : type === 'dynamic' ? 'ƒ' : '○';\n const color = type === 'api' ? c.cyan : type === 'dynamic' ? c.white : c.dim;\n console.log(` ${color}${typeLabel}${c.reset} ${path}`);\n },\n\n divider() { console.log(`${c.dim} ──────────────────────────────────────────────${c.reset}`); },\n blank() { console.log(''); },\n\n portInUse(port: number | string) {\n this.error(`Port ${port} is already in use.`);\n this.blank();\n console.log(` ${c.dim}Try:${c.reset}`);\n console.log(` 1. Kill the process on port ${port}`);\n console.log(` 2. Use a different port via PORT env var`);\n this.blank();\n },\n\n build(stats: { time: number }) {\n this.blank();\n console.log(` ${c.green}✔${c.reset} Build completed`);\n this.blank();\n console.log(` ${c.dim}Total time:${c.reset} ${c.white}${stats.time}ms${c.reset}`);\n this.blank();\n },\n};\n\nexport default logger;\n","/**\n * Velix version — single source of truth.\n * Update this file only when releasing a new version.\n */\nexport const VERSION = '5.1.7';\n","/**\n * Velix v5 Metadata & SEO System\n *\n * First-class SEO with automatic:\n * - Meta tags, Open Graph, Twitter Cards\n * - Canonical URLs, robots, sitemaps\n * - JSON-LD structured data\n * - Viewport, theme color, icons\n */\n\nimport fs from 'fs';\nimport path from 'path';\n\n// ============================================================================\n// Types (comprehensive metadata interface)\n// ============================================================================\n\nexport interface Metadata {\n title?: string | { default: string; template?: string; absolute?: string };\n description?: string;\n keywords?: string | string[];\n authors?: Author | Author[];\n creator?: string;\n publisher?: string;\n robots?: Robots | string;\n icons?: Icons;\n manifest?: string;\n openGraph?: OpenGraph;\n twitter?: Twitter;\n verification?: Verification;\n alternates?: Alternates;\n viewport?: Viewport | string;\n themeColor?: ThemeColor | ThemeColor[];\n colorScheme?: 'normal' | 'light' | 'dark' | 'light dark' | 'dark light';\n formatDetection?: FormatDetection;\n metadataBase?: URL | string;\n generator?: string;\n applicationName?: string;\n referrer?: string;\n other?: Record<string, string | string[]>;\n}\n\nexport interface Author { name?: string; url?: string; }\nexport interface Robots { index?: boolean; follow?: boolean; noarchive?: boolean; nosnippet?: boolean; noimageindex?: boolean; nocache?: boolean; googleBot?: Robots | string; }\nexport interface Icons { icon?: IconDescriptor | IconDescriptor[]; shortcut?: IconDescriptor | IconDescriptor[]; apple?: IconDescriptor | IconDescriptor[]; other?: IconDescriptor[]; }\nexport interface IconDescriptor { url: string; type?: string; sizes?: string; color?: string; rel?: string; media?: string; }\nexport interface OpenGraph {\n type?: string; url?: string; title?: string; description?: string; siteName?: string;\n locale?: string; images?: OGImage | OGImage[]; videos?: OGVideo | OGVideo[];\n determiner?: string; publishedTime?: string; modifiedTime?: string;\n expirationTime?: string; authors?: string | string[]; section?: string; tags?: string[];\n}\nexport interface OGImage { url: string; secureUrl?: string; type?: string; width?: number; height?: number; alt?: string; }\nexport interface OGVideo { url: string; secureUrl?: string; type?: string; width?: number; height?: number; }\nexport interface Twitter {\n card?: 'summary' | 'summary_large_image' | 'app' | 'player';\n site?: string; siteId?: string; creator?: string; creatorId?: string;\n title?: string; description?: string; images?: string | TwitterImage | (string | TwitterImage)[];\n}\nexport interface TwitterImage { url: string; alt?: string; }\nexport interface Verification { google?: string | string[]; yahoo?: string | string[]; yandex?: string | string[]; other?: Record<string, string | string[]>; }\nexport interface Alternates { canonical?: string; languages?: Record<string, string>; media?: Record<string, string>; }\nexport interface Viewport { width?: number | 'device-width'; height?: number | 'device-height'; initialScale?: number; minimumScale?: number; maximumScale?: number; userScalable?: boolean; viewportFit?: 'auto' | 'cover' | 'contain'; }\nexport interface ThemeColor { color: string; media?: string; }\nexport interface FormatDetection { telephone?: boolean; date?: boolean; address?: boolean; email?: boolean; }\n\n// ============================================================================\n// Metadata Tag Generation\n// ============================================================================\n\nexport function generateMetadataTags(metadata: Metadata, baseUrl?: string): string {\n const tags: string[] = [];\n const base = baseUrl || metadata.metadataBase?.toString() || '';\n\n // Title\n if (metadata.title) {\n const title = typeof metadata.title === 'string'\n ? metadata.title\n : metadata.title.absolute || (metadata.title.template\n ? metadata.title.template.replace('%s', metadata.title.default)\n : metadata.title.default);\n tags.push(`<title>${escapeHtml(title)}</title>`);\n }\n\n if (metadata.description) tags.push(`<meta name=\"description\" content=\"${escapeHtml(metadata.description)}\">`);\n\n if (metadata.keywords) {\n const kw = Array.isArray(metadata.keywords) ? metadata.keywords.join(', ') : metadata.keywords;\n tags.push(`<meta name=\"keywords\" content=\"${escapeHtml(kw)}\">`);\n }\n\n if (metadata.authors) {\n const authors = Array.isArray(metadata.authors) ? metadata.authors : [metadata.authors];\n authors.forEach(a => {\n if (a.name) tags.push(`<meta name=\"author\" content=\"${escapeHtml(a.name)}\">`);\n if (a.url) tags.push(`<link rel=\"author\" href=\"${a.url}\">`);\n });\n }\n\n if (metadata.generator) tags.push(`<meta name=\"generator\" content=\"${escapeHtml(metadata.generator)}\">`);\n if (metadata.applicationName) tags.push(`<meta name=\"application-name\" content=\"${escapeHtml(metadata.applicationName)}\">`);\n if (metadata.referrer) tags.push(`<meta name=\"referrer\" content=\"${metadata.referrer}\">`);\n\n // Robots\n if (metadata.robots) {\n if (typeof metadata.robots === 'string') {\n tags.push(`<meta name=\"robots\" content=\"${metadata.robots}\">`);\n } else {\n tags.push(`<meta name=\"robots\" content=\"${generateRobotsContent(metadata.robots)}\">`);\n if (metadata.robots.googleBot) {\n const gbc = typeof metadata.robots.googleBot === 'string' ? metadata.robots.googleBot : generateRobotsContent(metadata.robots.googleBot);\n tags.push(`<meta name=\"googlebot\" content=\"${gbc}\">`);\n }\n }\n }\n\n // Viewport\n if (metadata.viewport) {\n const vc = typeof metadata.viewport === 'string' ? metadata.viewport : generateViewportContent(metadata.viewport);\n tags.push(`<meta name=\"viewport\" content=\"${vc}\">`);\n }\n\n // Theme Color\n if (metadata.themeColor) {\n const tcs = Array.isArray(metadata.themeColor) ? metadata.themeColor : [metadata.themeColor];\n tcs.forEach(tc => {\n const media = typeof tc !== 'string' && tc.media ? ` media=\"${tc.media}\"` : '';\n const color = typeof tc === 'string' ? tc : tc.color;\n tags.push(`<meta name=\"theme-color\" content=\"${color}\"${media}>`);\n });\n }\n\n if (metadata.colorScheme) tags.push(`<meta name=\"color-scheme\" content=\"${metadata.colorScheme}\">`);\n\n // Icons\n if (metadata.icons) {\n const addIcon = (icon: IconDescriptor, defaultRel: string) => {\n const rel = icon.rel || defaultRel;\n const attrs = [\n icon.type ? ` type=\"${icon.type}\"` : '',\n icon.sizes ? ` sizes=\"${icon.sizes}\"` : '',\n icon.color ? ` color=\"${icon.color}\"` : '',\n ].join('');\n tags.push(`<link rel=\"${rel}\" href=\"${resolveUrl(icon.url, base)}\"${attrs}>`);\n };\n if (metadata.icons.icon) { (Array.isArray(metadata.icons.icon) ? metadata.icons.icon : [metadata.icons.icon]).forEach(i => addIcon(i, 'icon')); }\n if (metadata.icons.apple) { (Array.isArray(metadata.icons.apple) ? metadata.icons.apple : [metadata.icons.apple]).forEach(i => addIcon(i, 'apple-touch-icon')); }\n }\n\n if (metadata.manifest) tags.push(`<link rel=\"manifest\" href=\"${resolveUrl(metadata.manifest, base)}\">`);\n\n // Open Graph\n if (metadata.openGraph) {\n const og = metadata.openGraph;\n if (og.type) tags.push(`<meta property=\"og:type\" content=\"${og.type}\">`);\n if (og.title) tags.push(`<meta property=\"og:title\" content=\"${escapeHtml(og.title)}\">`);\n if (og.description) tags.push(`<meta property=\"og:description\" content=\"${escapeHtml(og.description)}\">`);\n if (og.url) tags.push(`<meta property=\"og:url\" content=\"${resolveUrl(og.url, base)}\">`);\n if (og.siteName) tags.push(`<meta property=\"og:site_name\" content=\"${escapeHtml(og.siteName)}\">`);\n if (og.locale) tags.push(`<meta property=\"og:locale\" content=\"${og.locale}\">`);\n if (og.images) {\n (Array.isArray(og.images) ? og.images : [og.images]).forEach(img => {\n tags.push(`<meta property=\"og:image\" content=\"${resolveUrl(img.url, base)}\">`);\n if (img.width) tags.push(`<meta property=\"og:image:width\" content=\"${img.width}\">`);\n if (img.height) tags.push(`<meta property=\"og:image:height\" content=\"${img.height}\">`);\n if (img.alt) tags.push(`<meta property=\"og:image:alt\" content=\"${escapeHtml(img.alt)}\">`);\n });\n }\n if (og.type === 'article') {\n if (og.publishedTime) tags.push(`<meta property=\"article:published_time\" content=\"${og.publishedTime}\">`);\n if (og.modifiedTime) tags.push(`<meta property=\"article:modified_time\" content=\"${og.modifiedTime}\">`);\n if (og.tags) og.tags.forEach(t => tags.push(`<meta property=\"article:tag\" content=\"${escapeHtml(t)}\">`));\n }\n }\n\n // Twitter\n if (metadata.twitter) {\n const tw = metadata.twitter;\n if (tw.card) tags.push(`<meta name=\"twitter:card\" content=\"${tw.card}\">`);\n if (tw.site) tags.push(`<meta name=\"twitter:site\" content=\"${tw.site}\">`);\n if (tw.creator) tags.push(`<meta name=\"twitter:creator\" content=\"${tw.creator}\">`);\n if (tw.title) tags.push(`<meta name=\"twitter:title\" content=\"${escapeHtml(tw.title)}\">`);\n if (tw.description) tags.push(`<meta name=\"twitter:description\" content=\"${escapeHtml(tw.description)}\">`);\n if (tw.images) {\n (Array.isArray(tw.images) ? tw.images : [tw.images]).forEach(img => {\n const url = typeof img === 'string' ? img : img.url;\n tags.push(`<meta name=\"twitter:image\" content=\"${resolveUrl(url, base)}\">`);\n });\n }\n }\n\n // Verification\n if (metadata.verification) {\n if (metadata.verification.google) {\n (Array.isArray(metadata.verification.google) ? metadata.verification.google : [metadata.verification.google])\n .forEach(v => tags.push(`<meta name=\"google-site-verification\" content=\"${v}\">`));\n }\n }\n\n // Alternates\n if (metadata.alternates) {\n if (metadata.alternates.canonical) tags.push(`<link rel=\"canonical\" href=\"${resolveUrl(metadata.alternates.canonical, base)}\">`);\n if (metadata.alternates.languages) {\n Object.entries(metadata.alternates.languages).forEach(([lang, url]) => {\n tags.push(`<link rel=\"alternate\" hreflang=\"${lang}\" href=\"${resolveUrl(url, base)}\">`);\n });\n }\n }\n\n return tags.join('\\n ');\n}\n\n// ============================================================================\n// Merge & JSON-LD\n// ============================================================================\n\nexport function mergeMetadata(parent: Metadata, child: Metadata): Metadata {\n return {\n ...parent, ...child,\n openGraph: child.openGraph ? { ...parent.openGraph, ...child.openGraph } : parent.openGraph,\n twitter: child.twitter ? { ...parent.twitter, ...child.twitter } : parent.twitter,\n icons: child.icons ? { ...parent.icons, ...child.icons } : parent.icons,\n alternates: child.alternates ? { ...parent.alternates, ...child.alternates } : parent.alternates,\n };\n}\n\nexport function generateJsonLd(data: Record<string, unknown>): string {\n return `<script type=\"application/ld+json\">${JSON.stringify(data)}</script>`;\n}\n\nexport const jsonLd = {\n website: (c: { name: string; url: string; description?: string }) => ({\n '@context': 'https://schema.org', '@type': 'WebSite', name: c.name, url: c.url, description: c.description\n }),\n article: (c: { headline: string; description?: string; image?: string | string[]; datePublished: string; dateModified?: string; author: { name: string; url?: string } | { name: string; url?: string }[] }) => ({\n '@context': 'https://schema.org', '@type': 'Article', headline: c.headline, description: c.description,\n image: c.image, datePublished: c.datePublished, dateModified: c.dateModified || c.datePublished,\n author: Array.isArray(c.author) ? c.author.map(a => ({ '@type': 'Person', ...a })) : { '@type': 'Person', ...c.author }\n }),\n organization: (c: { name: string; url: string; logo?: string; sameAs?: string[] }) => ({\n '@context': 'https://schema.org', '@type': 'Organization', name: c.name, url: c.url, logo: c.logo, sameAs: c.sameAs\n }),\n breadcrumb: (items: { name: string; url: string }[]) => ({\n '@context': 'https://schema.org', '@type': 'BreadcrumbList',\n itemListElement: items.map((item, i) => ({ '@type': 'ListItem', position: i + 1, name: item.name, item: item.url }))\n }),\n};\n\n// ============================================================================\n// Automatic SEO Generation\n// ============================================================================\n\n/**\n * Generate sitemap.xml content from routes\n */\nexport function generateSitemap(routes: Array<{ type: string; path: string }>, baseUrl: string): string {\n const urls = routes\n .filter(r => r.type === 'page' && !r.path.includes(':') && !r.path.includes('*'))\n .map(r => {\n const loc = `${baseUrl.replace(/\\/$/, '')}${r.path}`;\n return ` <url>\\n <loc>${loc}</loc>\\n <lastmod>${new Date().toISOString().split('T')[0]}</lastmod>\\n <changefreq>weekly</changefreq>\\n <priority>${r.path === '/' ? '1.0' : '0.8'}</priority>\\n </url>`;\n });\n\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">\\n${urls.join('\\n')}\\n</urlset>`;\n}\n\n/**\n * Generate robots.txt content\n */\nexport function generateRobotsTxt(baseUrl: string, options: { disallow?: string[]; allow?: string[] } = {}): string {\n const lines = ['User-agent: *'];\n if (options.allow) options.allow.forEach(p => lines.push(`Allow: ${p}`));\n if (options.disallow) options.disallow.forEach(p => lines.push(`Disallow: ${p}`));\n else lines.push('Allow: /');\n lines.push('', `Sitemap: ${baseUrl.replace(/\\/$/, '')}/sitemap.xml`);\n return lines.join('\\n');\n}\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\nfunction escapeHtml(str: string): string {\n return str.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/\"/g, '"').replace(/'/g, ''');\n}\n\nfunction resolveUrl(url: string, base: string): string {\n if (url.startsWith('http://') || url.startsWith('https://') || url.startsWith('//')) return url;\n return base ? `${base.replace(/\\/$/, '')}${url.startsWith('/') ? '' : '/'}${url}` : url;\n}\n\nfunction generateRobotsContent(robots: Robots): string {\n const parts: string[] = [];\n if (robots.index !== undefined) parts.push(robots.index ? 'index' : 'noindex');\n if (robots.follow !== undefined) parts.push(robots.follow ? 'follow' : 'nofollow');\n if (robots.noarchive) parts.push('noarchive');\n if (robots.nosnippet) parts.push('nosnippet');\n if (robots.noimageindex) parts.push('noimageindex');\n return parts.join(', ') || 'index, follow';\n}\n\nfunction generateViewportContent(viewport: Viewport): string {\n const parts: string[] = [];\n if (viewport.width) parts.push(`width=${viewport.width}`);\n if (viewport.height) parts.push(`height=${viewport.height}`);\n if (viewport.initialScale !== undefined) parts.push(`initial-scale=${viewport.initialScale}`);\n if (viewport.maximumScale !== undefined) parts.push(`maximum-scale=${viewport.maximumScale}`);\n if (viewport.userScalable !== undefined) parts.push(`user-scalable=${viewport.userScalable ? 'yes' : 'no'}`);\n return parts.join(', ') || 'width=device-width, initial-scale=1';\n}\n\nexport default { generateMetadataTags, mergeMetadata, generateJsonLd, jsonLd, generateSitemap, generateRobotsTxt };\n","/**\n * Velix v5 Islands Architecture\n *\n * Islands allow partial hydration — only interactive components are hydrated\n * on the client, while static content remains as HTML.\n *\n * Usage: Add 'use island' at the top of a component file.\n */\n\nimport React from 'react';\nimport crypto from 'crypto';\n\n// Island registry for tracking all islands in a render\nconst islandRegistry = new Map();\n\nfunction generateIslandId(componentName: string): string {\n const hash = crypto.randomBytes(4).toString('hex');\n return `island-${componentName}-${hash}`;\n}\n\n/**\n * Island wrapper component for server-side rendering\n */\nexport function Island({ component: Component, props = {}, name, clientPath }: {\n component: React.ComponentType<Record<string, unknown>>;\n props?: Record<string, unknown>;\n name: string;\n clientPath: string;\n}) {\n const islandId = generateIslandId(name);\n\n islandRegistry.set(islandId, { id: islandId, name, clientPath, props });\n\n return React.createElement('div', {\n 'data-island': islandId,\n 'data-island-name': name,\n 'data-island-props': JSON.stringify(props),\n }, React.createElement(Component, props));\n}\n\n/**\n * Gets all registered islands and clears the registry\n */\nexport function getRegisteredIslands() {\n const islands = Array.from(islandRegistry.values());\n islandRegistry.clear();\n return islands;\n}\n\n/**\n * Creates an island component wrapper\n */\nexport function createIsland(Component: React.ComponentType<Record<string, unknown>>, options: { name?: string; clientPath?: string } = {}) {\n const { name = (Component as { name?: string }).name || 'Island', clientPath } = options;\n\n function IslandWrapper(props: Record<string, unknown>) {\n return Island({\n component: Component, props, name,\n clientPath: clientPath || `/__velix/islands/${name}.js`\n });\n }\n\n IslandWrapper.displayName = `Island(${name})`;\n IslandWrapper.isIsland = true;\n IslandWrapper.originalComponent = Component;\n return IslandWrapper;\n}\n\n/**\n * Island loading strategies\n */\nexport const LoadStrategy = {\n IMMEDIATE: 'immediate',\n VISIBLE: 'visible',\n IDLE: 'idle',\n MEDIA: 'media'\n} as const;\n\n/**\n * Creates a lazy island that hydrates based on strategy\n */\nexport function createLazyIsland(Component: React.ComponentType<Record<string, unknown>>, options: {\n name?: string; clientPath?: string; strategy?: string; media?: string | null;\n} = {}) {\n const {\n name = (Component as { name?: string }).name || 'LazyIsland',\n clientPath,\n strategy = LoadStrategy.VISIBLE,\n media = null\n } = options;\n\n function LazyIslandWrapper(props: Record<string, unknown>) {\n const islandId = generateIslandId(name);\n\n islandRegistry.set(islandId, {\n id: islandId, name,\n clientPath: clientPath || `/__velix/islands/${name}.js`,\n props, strategy, media\n });\n\n return React.createElement('div', {\n 'data-island': islandId,\n 'data-island-name': name,\n 'data-island-strategy': strategy,\n 'data-island-media': media,\n 'data-island-props': JSON.stringify(props),\n });\n }\n\n LazyIslandWrapper.displayName = `LazyIsland(${name})`;\n LazyIslandWrapper.isIsland = true;\n LazyIslandWrapper.isLazy = true;\n return LazyIslandWrapper;\n}\n\n/**\n * Generates the client-side hydration script for islands\n */\nexport function generateHydrationScript(islands: Array<{ id: string; name: string; clientPath: string; props: Record<string, unknown> }>): string {\n if (!islands.length) return '';\n\n const islandData = islands.map((island) => ({\n id: island.id, name: island.name,\n path: island.clientPath, props: island.props\n }));\n\n return `\n<script type=\"module\">\n const islands = ${JSON.stringify(islandData)};\n\n async function hydrateIslands() {\n const { hydrateRoot } = await import('/__velix/react-dom-client.js');\n const React = await import('/__velix/react.js');\n\n for (const island of islands) {\n try {\n const el = document.querySelector(\\`[data-island=\"\\${island.id}\"]\\`);\n if (!el) continue;\n const mod = await import(island.path);\n hydrateRoot(el, React.createElement(mod.default, island.props));\n el.setAttribute('data-hydrated', 'true');\n } catch (error) {\n console.error(\\`Failed to hydrate island \\${island.name}:\\`, error);\n }\n }\n }\n\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', hydrateIslands);\n } else {\n hydrateIslands();\n }\n</script>`;\n}\n\n/**\n * Generates advanced hydration script with loading strategies\n */\nexport function generateAdvancedHydrationScript(islands: Array<{ id: string; name: string; clientPath: string; props: Record<string, unknown>; strategy?: string; media?: string | null }>): string {\n if (!islands.length) return '';\n\n const islandData = islands.map((island) => ({\n id: island.id, name: island.name, path: island.clientPath,\n props: island.props, strategy: island.strategy || LoadStrategy.IMMEDIATE,\n media: island.media\n }));\n\n return `\n<script type=\"module\">\n const islands = ${JSON.stringify(islandData)};\n\n async function hydrateIsland(island) {\n const el = document.querySelector(\\`[data-island=\"\\${island.id}\"]\\`);\n if (!el || el.hasAttribute('data-hydrated')) return;\n\n try {\n const { hydrateRoot } = await import('/__velix/react-dom-client.js');\n const React = await import('/__velix/react.js');\n const mod = await import(island.path);\n hydrateRoot(el, React.createElement(mod.default, island.props));\n el.setAttribute('data-hydrated', 'true');\n } catch (error) {\n console.error(\\`Failed to hydrate island \\${island.name}:\\`, error);\n }\n }\n\n const visibleObserver = new IntersectionObserver((entries) => {\n entries.forEach(entry => {\n if (entry.isIntersecting) {\n const id = entry.target.getAttribute('data-island');\n const island = islands.find(i => i.id === id);\n if (island) { hydrateIsland(island); visibleObserver.unobserve(entry.target); }\n }\n });\n }, { rootMargin: '50px' });\n\n function processIslands() {\n for (const island of islands) {\n const el = document.querySelector(\\`[data-island=\"\\${island.id}\"]\\`);\n if (!el) continue;\n switch (island.strategy) {\n case 'immediate': hydrateIsland(island); break;\n case 'visible': visibleObserver.observe(el); break;\n case 'idle': requestIdleCallback(() => hydrateIsland(island)); break;\n case 'media':\n if (island.media && window.matchMedia(island.media).matches) hydrateIsland(island);\n break;\n }\n }\n }\n\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', processIslands);\n } else {\n processIslands();\n }\n</script>`;\n}\n\nexport default { Island, createIsland, createLazyIsland, getRegisteredIslands, generateHydrationScript, generateAdvancedHydrationScript, LoadStrategy };\n","/**\n * Velix v5 Server Actions\n *\n * React 19 native actions with Velix enhancements and security.\n */\n\nexport { useActionState, useOptimistic } from 'react';\nexport { useFormStatus } from 'react-dom';\n\nimport { cookies, headers, redirect, notFound, RedirectError, NotFoundError } from '../helpers.js';\n\n// Global action registry\ndeclare global {\n var __VELIX_ACTIONS__: Record<string, ServerActionFunction>;\n var __VELIX_ACTION_CONTEXT__: ActionContext | null;\n}\n\nglobalThis.__VELIX_ACTIONS__ = globalThis.__VELIX_ACTIONS__ || {};\nglobalThis.__VELIX_ACTION_CONTEXT__ = null;\n\nexport interface ActionContext {\n request: Request;\n cookies: typeof cookies;\n headers: typeof headers;\n redirect: typeof redirect;\n notFound: typeof notFound;\n}\n\nexport type ServerActionFunction<TArgs extends unknown[] = unknown[], TReturn = unknown> = (...args: TArgs) => Promise<TReturn>;\n\nexport interface ActionResult<T = unknown> {\n success: boolean;\n data?: T;\n error?: string;\n redirect?: string;\n}\n\n/**\n * Decorator to mark a function as a server action\n */\nexport function serverAction<TArgs extends unknown[], TReturn>(\n fn: (...args: TArgs) => Promise<TReturn>, \n actionId?: string\n): (...args: TArgs) => Promise<ActionResult<TReturn>> {\n const id = actionId || `action_${fn.name}_${generateActionId()}`;\n globalThis.__VELIX_ACTIONS__[id] = fn as ServerActionFunction;\n\n const proxy = (async (...args: TArgs) => {\n if (typeof window === 'undefined') return await executeAction(id, args) as ActionResult<TReturn>;\n return await callServerAction(id, args) as ActionResult<TReturn>;\n });\n\n (proxy as unknown as { $$typeof: symbol }).$$typeof = Symbol.for('react.server.action');\n (proxy as unknown as { $$id: string }).$$id = id;\n (proxy as unknown as { $$bound: unknown }).$$bound = null;\n return proxy;\n}\n\nexport function registerAction(id: string, fn: ServerActionFunction): void {\n globalThis.__VELIX_ACTIONS__[id] = fn;\n}\n\nexport function getAction(id: string): ServerActionFunction | undefined {\n return globalThis.__VELIX_ACTIONS__[id];\n}\n\n/**\n * Execute a server action on the server\n */\nexport async function executeAction(actionId: string, args: unknown[], context?: Partial<ActionContext>): Promise<ActionResult> {\n const action = globalThis.__VELIX_ACTIONS__[actionId];\n if (!action) return { success: false, error: `Server action not found: ${actionId}` };\n\n const actionContext: ActionContext = {\n request: context?.request || new Request('http://localhost'),\n cookies, headers, redirect, notFound\n };\n\n globalThis.__VELIX_ACTION_CONTEXT__ = actionContext;\n\n try {\n const result = await action(...args);\n return { success: true, data: result };\n } catch (err: unknown) {\n const error = err as Error;\n if (error instanceof RedirectError) return { success: true, redirect: error.url };\n if (error instanceof NotFoundError) return { success: false, error: 'Not found' };\n return { success: false, error: error.message || 'Action failed' };\n } finally {\n globalThis.__VELIX_ACTION_CONTEXT__ = null;\n }\n}\n\n/**\n * Call a server action from the client\n */\nexport async function callServerAction(actionId: string, args: unknown[]): Promise<ActionResult> {\n try {\n const response = await fetch('/__velix/action', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', 'X-Velix-Action': actionId },\n body: JSON.stringify({ actionId, args: serializeArgs(args) }),\n credentials: 'same-origin'\n });\n\n if (!response.ok) throw new Error(`Action failed: ${response.statusText}`);\n const result = await response.json();\n if (result.redirect) { window.location.href = result.redirect; }\n return result;\n } catch (err: unknown) {\n const error = err as Error;\n return { success: false, error: error.message || 'Network error' };\n }\n}\n\nfunction serializeArgs(args: unknown[]): unknown[] {\n return args.map(arg => {\n if (arg instanceof FormData) {\n const obj: Record<string, unknown> = {};\n arg.forEach((value, key) => {\n if (obj[key]) {\n obj[key] = Array.isArray(obj[key]) ? [...obj[key], value] : [obj[key], value];\n } else { obj[key] = value; }\n });\n return { $$type: 'FormData', data: obj };\n }\n if (arg instanceof Date) return { $$type: 'Date', value: arg.toISOString() };\n if (typeof arg === 'object' && arg !== null) return JSON.parse(JSON.stringify(arg));\n return arg;\n });\n}\n\n// Security validation\nconst ALLOWED_TYPES = new Set(['FormData', 'Date', 'File']);\nconst MAX_DEPTH = 10;\n\nfunction validateInput(obj: unknown, depth = 0): boolean {\n if (depth > MAX_DEPTH) throw new Error('Payload too deeply nested');\n if (obj === null || obj === undefined || typeof obj !== 'object') return true;\n if ('__proto__' in obj || 'constructor' in obj || 'prototype' in obj) {\n throw new Error('Invalid payload: prototype pollution attempt detected');\n }\n if ('$$type' in (obj as Record<string, unknown>) && !ALLOWED_TYPES.has((obj as { $$type: string }).$$type)) {\n throw new Error(`Invalid serialized type: ${(obj as { $$type: string }).$$type}`);\n }\n if (Array.isArray(obj)) (obj as unknown[]).forEach(item => validateInput(item, depth + 1));\n else Object.values(obj as Record<string, unknown>).forEach(val => validateInput(val, depth + 1));\n return true;\n}\n\nexport function deserializeArgs(args: unknown[]): unknown[] {\n validateInput(args);\n return args.map(arg => {\n if (arg && typeof arg === 'object') {\n if ((arg as { $$type?: string }).$$type === 'FormData') {\n const fd = new FormData();\n for (const [key, value] of Object.entries((arg as { data?: Record<string, unknown> }).data || {})) {\n if (typeof key !== 'string' || key.startsWith('__')) continue;\n if (Array.isArray(value)) value.forEach(v => { if (typeof v === 'string' || typeof v === 'number') fd.append(key, String(v)); });\n else if (typeof value === 'string' || typeof value === 'number') fd.append(key, String(value));\n }\n return fd;\n }\n if ((arg as { $$type?: string }).$$type === 'Date') { const d = new Date((arg as { value: string }).value); if (isNaN(d.getTime())) throw new Error('Invalid date'); return d; }\n if ((arg as { $$type?: string }).$$type === 'File') return { name: String((arg as { name?: string }).name || ''), type: String((arg as { type?: string }).type || ''), size: Number((arg as { size?: number }).size || 0) };\n }\n return arg;\n });\n}\n\nfunction generateActionId(): string { return Math.random().toString(36).substring(2, 10); }\n\nexport function useActionContext(): ActionContext | null { return globalThis.__VELIX_ACTION_CONTEXT__; }\n\nexport function formAction<T>(action: (formData: FormData) => Promise<T>): (formData: FormData) => Promise<ActionResult<T>> {\n return async (formData: FormData) => {\n try {\n const result = await action(formData);\n return { success: true, data: result };\n } catch (err: unknown) {\n const error = err as Error;\n if (error instanceof RedirectError) return { success: true, redirect: error.url };\n return { success: false, error: error.message };\n }\n };\n}\n\nimport { useActionState as useActionStateReact } from 'react';\n\nexport function useVelixAction<State, Payload>(\n action: (state: Awaited<State>, payload: Payload) => State | Promise<State>,\n initialState: Awaited<State>,\n permalink?: string\n): [state: Awaited<State>, dispatch: (payload: Payload) => void, isPending: boolean] {\n return useActionStateReact(action, initialState, permalink);\n}\n\nexport function bindArgs<TArgs extends unknown[], TBound extends unknown[], TReturn>(\n action: (...args: [...TBound, ...TArgs]) => Promise<ActionResult<TReturn>>, \n ...boundArgs: TBound\n): (...args: TArgs) => Promise<ActionResult<TReturn>> {\n const bound = (async (...args: TArgs) => await action(...boundArgs, ...args));\n (bound as unknown as { $$typeof: symbol }).$$typeof = (action as unknown as { $$typeof: symbol }).$$typeof;\n (bound as unknown as { $$id: string }).$$id = (action as unknown as { $$id: string }).$$id;\n (bound as unknown as { $$bound: unknown[] }).$$bound = boundArgs;\n return bound;\n}\n","/**\n * Velix v5 Server Helpers\n * Utility functions for server-side operations\n */\n\n// ============================================================================\n// Response Helpers\n// ============================================================================\n\nexport class RedirectError extends Error {\n public readonly url: string;\n public readonly statusCode: number;\n public readonly type = 'redirect' as const;\n\n constructor(url: string, statusCode: number = 307) {\n super(`Redirect to ${url}`);\n this.name = 'RedirectError';\n this.url = url;\n this.statusCode = statusCode;\n }\n}\n\nexport class NotFoundError extends Error {\n public readonly type = 'notFound' as const;\n\n constructor(message: string = 'Page not found') {\n super(message);\n this.name = 'NotFoundError';\n }\n}\n\n/**\n * Redirect to a different URL\n *\n * @example\n * ```tsx\n * import { redirect } from 'velix';\n *\n * export default function ProtectedPage() {\n * const user = getUser();\n * if (!user) redirect('/login');\n * return <Dashboard user={user} />;\n * }\n * ```\n */\nexport function redirect(url: string, type: 'replace' | 'permanent' = 'replace'): never {\n const statusCode = type === 'permanent' ? 308 : 307;\n throw new RedirectError(url, statusCode);\n}\n\n/**\n * Trigger a 404 Not Found response\n */\nexport function notFound(message?: string): never {\n throw new NotFoundError(message);\n}\n\n/**\n * Create a JSON response\n */\nexport function json<T>(\n data: T,\n options: { status?: number; headers?: Record<string, string> } = {}\n): Response {\n const { status = 200, headers = {} } = options;\n return new Response(JSON.stringify(data), {\n status,\n headers: { 'Content-Type': 'application/json', ...headers }\n });\n}\n\n/**\n * Create an HTML response\n */\nexport function html(\n content: string,\n options: { status?: number; headers?: Record<string, string> } = {}\n): Response {\n const { status = 200, headers = {} } = options;\n return new Response(content, {\n status,\n headers: { 'Content-Type': 'text/html; charset=utf-8', ...headers }\n });\n}\n\n/**\n * Create a text response\n */\nexport function text(\n content: string,\n options: { status?: number; headers?: Record<string, string> } = {}\n): Response {\n const { status = 200, headers = {} } = options;\n return new Response(content, {\n status,\n headers: { 'Content-Type': 'text/plain; charset=utf-8', ...headers }\n });\n}\n\n// ============================================================================\n// Cookies API\n// ============================================================================\n\nexport interface CookieOptions {\n maxAge?: number;\n expires?: Date;\n path?: string;\n domain?: string;\n secure?: boolean;\n httpOnly?: boolean;\n sameSite?: 'strict' | 'lax' | 'none';\n}\n\nexport const cookies = {\n parse(cookieHeader: string): Record<string, string> {\n const cookies: Record<string, string> = {};\n if (!cookieHeader) return cookies;\n cookieHeader.split(';').forEach(cookie => {\n const [name, ...rest] = cookie.split('=');\n if (name) {\n cookies[name.trim()] = decodeURIComponent(rest.join('=').trim());\n }\n });\n return cookies;\n },\n\n get(request: Request, name: string): string | undefined {\n const cookieHeader = request.headers.get('cookie') || '';\n return this.parse(cookieHeader)[name];\n },\n\n getAll(request: Request): Record<string, string> {\n const cookieHeader = request.headers.get('cookie') || '';\n return this.parse(cookieHeader);\n },\n\n serialize(name: string, value: string, options: CookieOptions = {}): string {\n let cookie = `${encodeURIComponent(name)}=${encodeURIComponent(value)}`;\n if (options.maxAge !== undefined) cookie += `; Max-Age=${options.maxAge}`;\n if (options.expires) cookie += `; Expires=${options.expires.toUTCString()}`;\n if (options.path) cookie += `; Path=${options.path}`;\n if (options.domain) cookie += `; Domain=${options.domain}`;\n if (options.secure) cookie += '; Secure';\n if (options.httpOnly) cookie += '; HttpOnly';\n if (options.sameSite) {\n cookie += `; SameSite=${options.sameSite.charAt(0).toUpperCase() + options.sameSite.slice(1)}`;\n }\n return cookie;\n },\n\n set(name: string, value: string, options: CookieOptions = {}): string {\n return this.serialize(name, value, {\n path: '/',\n httpOnly: true,\n secure: process.env.NODE_ENV === 'production',\n sameSite: 'lax',\n ...options\n });\n },\n\n delete(name: string, options: Omit<CookieOptions, 'maxAge' | 'expires'> = {}): string {\n return this.serialize(name, '', { ...options, path: '/', maxAge: 0 });\n }\n};\n\n// ============================================================================\n// Headers API\n// ============================================================================\n\nexport const headers = {\n create(init?: HeadersInit): Headers {\n return new Headers(init);\n },\n\n get(request: Request, name: string): string | null {\n return request.headers.get(name);\n },\n\n getAll(request: Request): Record<string, string> {\n const result: Record<string, string> = {};\n request.headers.forEach((value, key) => { result[key] = value; });\n return result;\n },\n\n has(request: Request, name: string): boolean {\n return request.headers.has(name);\n },\n\n contentType(request: Request): string | null {\n return request.headers.get('content-type');\n },\n\n acceptsJson(request: Request): boolean {\n const accept = request.headers.get('accept') || '';\n return accept.includes('application/json') || accept.includes('*/*');\n },\n\n isAjax(request: Request): boolean {\n return request.headers.get('x-requested-with') === 'XMLHttpRequest' ||\n this.acceptsJson(request);\n },\n\n authorization(request: Request): { type: string; credentials: string } | null {\n const auth = request.headers.get('authorization');\n if (!auth) return null;\n const [type, ...rest] = auth.split(' ');\n return { type: type.toLowerCase(), credentials: rest.join(' ') };\n },\n\n bearerToken(request: Request): string | null {\n const auth = this.authorization(request);\n return auth?.type === 'bearer' ? auth.credentials : null;\n },\n\n security(): Record<string, string> {\n return {\n 'X-Content-Type-Options': 'nosniff',\n 'X-Frame-Options': 'DENY',\n 'X-XSS-Protection': '1; mode=block',\n 'Referrer-Policy': 'strict-origin-when-cross-origin',\n 'Permissions-Policy': 'camera=(), microphone=(), geolocation=()'\n };\n },\n\n cors(options: {\n origin?: string;\n methods?: string[];\n headers?: string[];\n credentials?: boolean;\n maxAge?: number;\n } = {}): Record<string, string> {\n const {\n origin = '*',\n methods = ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'OPTIONS'],\n headers: allowHeaders = ['Content-Type', 'Authorization'],\n credentials = false,\n maxAge = 86400\n } = options;\n\n const corsHeaders: Record<string, string> = {\n 'Access-Control-Allow-Origin': origin,\n 'Access-Control-Allow-Methods': methods.join(', '),\n 'Access-Control-Allow-Headers': allowHeaders.join(', '),\n 'Access-Control-Max-Age': String(maxAge)\n };\n\n if (credentials) corsHeaders['Access-Control-Allow-Credentials'] = 'true';\n return corsHeaders;\n },\n\n cache(options: {\n maxAge?: number;\n sMaxAge?: number;\n staleWhileRevalidate?: number;\n private?: boolean;\n noStore?: boolean;\n } = {}): Record<string, string> {\n if (options.noStore) {\n return { 'Cache-Control': 'no-store, no-cache, must-revalidate' };\n }\n const directives: string[] = [];\n directives.push(options.private ? 'private' : 'public');\n if (options.maxAge !== undefined) directives.push(`max-age=${options.maxAge}`);\n if (options.sMaxAge !== undefined) directives.push(`s-maxage=${options.sMaxAge}`);\n if (options.staleWhileRevalidate !== undefined) directives.push(`stale-while-revalidate=${options.staleWhileRevalidate}`);\n return { 'Cache-Control': directives.join(', ') };\n }\n};\n\n// ============================================================================\n// Request Helpers\n// ============================================================================\n\nexport async function parseJson<T = unknown>(request: Request): Promise<T> {\n try { return await request.json(); }\n catch { throw new Error('Invalid JSON body'); }\n}\n\nexport async function parseFormData(request: Request): Promise<FormData> {\n return await request.formData();\n}\n\nexport function parseSearchParams(request: Request): URLSearchParams {\n return new URL(request.url).searchParams;\n}\n\nexport function getMethod(request: Request): string {\n return request.method.toUpperCase();\n}\n\nexport function getPathname(request: Request): string {\n return new URL(request.url).pathname;\n}\n\nexport function isMethod(request: Request, method: string | string[]): boolean {\n const reqMethod = getMethod(request);\n return Array.isArray(method)\n ? method.map(m => m.toUpperCase()).includes(reqMethod)\n : reqMethod === method.toUpperCase();\n}\n","/**\n * Velix v5.1 DevTools\n * 3-tab panel: Route · Performance · Info\n * Inspired by Next.js DevTools design\n */\n\nexport interface DevToolsContext {\n version?: string;\n port?: number;\n host?: string;\n nodeVersion?: string;\n reactVersion?: string;\n tsVersion?: string;\n}\n\nexport interface DevToolsState {\n status: 'idle' | 'rendering' | 'compiling' | 'navigating' | 'error';\n route?: string;\n timestamp?: number;\n error?: string;\n}\n\n// ─── Inline SVG icons ───────────────────────────────────────────────────────\n\nconst ICON_ROUTE = `<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z\"/><polyline points=\"9 22 9 12 15 12 15 22\"/></svg>`;\nconst ICON_PERF = `<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><polyline points=\"12 6 12 12 16 14\"/></svg>`;\nconst ICON_INFO = `<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\"/><line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\"/></svg>`;\nconst ICON_FILE = `<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"/><polyline points=\"14 2 14 8 20 8\"/></svg>`;\nconst ICON_GEAR = `<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"3\"/><path d=\"M19.07 4.93a10 10 0 0 1 0 14.14M4.93 4.93a10 10 0 0 0 0 14.14\"/></svg>`;\nconst ICON_MON = `<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"2\" y=\"3\" width=\"20\" height=\"14\" rx=\"2\"/><line x1=\"8\" y1=\"21\" x2=\"16\" y2=\"21\"/><line x1=\"12\" y1=\"17\" x2=\"12\" y2=\"21\"/></svg>`;\nconst ICON_TS = `<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"4 7 4 4 20 4 20 7\"/><line x1=\"9\" y1=\"20\" x2=\"15\" y2=\"20\"/><line x1=\"12\" y1=\"4\" x2=\"12\" y2=\"20\"/></svg>`;\nconst ICON_CLOCK = `<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><polyline points=\"12 6 12 12 16 14\"/></svg>`;\nconst ICON_TRI = `<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 2L2 19h20L12 2z\"/></svg>`;\nconst ICON_TERM = `<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"4 17 10 11 4 5\"/><line x1=\"12\" y1=\"19\" x2=\"20\" y2=\"19\"/></svg>`;\nconst ICON_LOGO = `<img src=\"/__velix/logo.webp\" alt=\"Velix Logo\" width=\"14\" height=\"14\" style=\"border-radius:2px; object-fit:cover;\" onerror=\"this.style.display='none'\" />`;\n\n/**\n * Generate enhanced DevTools HTML — 3-tab panel.\n * Only injected in development mode.\n */\nexport function generateDevToolsHtml(isDev: boolean, ctx: DevToolsContext = {}): string {\n if (!isDev) return '';\n\n const version = ctx.version ?? '5.1.0';\n const port = ctx.port ?? 3000;\n const host = ctx.host ?? 'localhost';\n const nodeVersion = ctx.nodeVersion ?? process.version.replace('v', '');\n const reactVersion = ctx.reactVersion ?? '—';\n const tsVersion = ctx.tsVersion ?? '—';\n\n return `\n<style>\n/* ── Velix DevTools v5.1 ────────────────────────────────── */\n#__vdt-btn{position:fixed;bottom:16px;left:16px;z-index:9999;width:40px;height:40px;border-radius:50%;background:#111827;border:2px solid #22D3EE;display:flex;align-items:center;justify-content:center;cursor:pointer;box-shadow:0 4px 16px rgba(0,0,0,.5);transition:transform .2s,box-shadow .2s;outline:none;}\n#__vdt-btn:hover{transform:scale(1.08);box-shadow:0 6px 20px rgba(34,211,238,.25);}\n#__vdt-dot{position:absolute;top:-3px;right:-3px;width:11px;height:11px;border-radius:50%;background:#22D3EE;border:2px solid #111827;transition:background .3s;}\n#__vdt{display:none;position:fixed;bottom:68px;left:16px;width:340px;background:#111827;color:#f3f4f6;border-radius:14px;font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;font-size:13px;box-shadow:0 24px 60px rgba(0,0,0,.6);z-index:10000;border:1px solid #1f2937;overflow:hidden;}\n/* header */\n.__vdt-header{display:flex;align-items:center;justify-content:space-between;padding:12px 16px;border-bottom:1px solid #1f2937;}\n.__vdt-brand{display:flex;align-items:center;gap:8px;font-weight:700;font-size:14px;color:#f9fafb;}\n.__vdt-badge{font-size:11px;font-weight:600;background:#1f2937;color:#9ca3af;border-radius:5px;padding:2px 7px;letter-spacing:.3px;}\n.__vdt-close{background:none;border:none;color:#6b7280;cursor:pointer;font-size:20px;line-height:1;padding:0;transition:color .15s;}\n.__vdt-close:hover{color:#f9fafb;}\n/* tabs */\n.__vdt-tabs{display:flex;border-bottom:1px solid #1f2937;}\n.__vdt-tab{flex:1;padding:10px 0;background:none;border:none;color:#6b7280;font-size:12px;font-weight:500;cursor:pointer;display:flex;align-items:center;justify-content:center;gap:5px;border-bottom:2px solid transparent;transition:color .15s,border-color .15s;font-family:inherit;letter-spacing:.1px;}\n.__vdt-tab:hover{color:#d1d5db;}\n.__vdt-tab.active{color:#10b981;border-bottom-color:#10b981;}\n/* body */\n.__vdt-body{padding:14px 16px;min-height:200px;}\n.__vdt-section{margin-bottom:14px;}\n.__vdt-label{font-size:11px;color:#6b7280;text-transform:uppercase;letter-spacing:.6px;margin-bottom:8px;}\n.__vdt-box{background:#1f2937;border-radius:8px;padding:10px 13px;font-size:13px;color:#e5e7eb;font-family:ui-monospace,'Cascadia Code','Fira Code',monospace;border:1px solid #374151;}\n.__vdt-row{display:flex;align-items:center;justify-content:space-between;padding:9px 13px;background:#1f2937;border-radius:8px;margin-bottom:6px;border:1px solid #374151;}\n.__vdt-row-left{display:flex;align-items:center;gap:8px;color:#d1d5db;}\n.__vdt-row-right{font-family:ui-monospace,'Cascadia Code',monospace;color:#10b981;font-size:12px;font-weight:500;}\n.__vdt-pill{font-size:10px;font-weight:600;padding:2px 7px;border-radius:4px;letter-spacing:.2px;}\n.__vdt-pill-green{background:#052e16;color:#4ade80;border:1px solid #166534;}\n.__vdt-pill-blue{background:#0c1a3a;color:#60a5fa;border:1px solid #1e3a8a;}\n.__vdt-render{display:flex;align-items:center;gap:6px;padding:8px 13px;background:#1f2937;border-radius:8px;border:1px solid #374151;color:#9ca3af;font-size:12px;}\n.__vdt-render svg{color:#6b7280;}\n/* vitals */\n.__vdt-vital{display:flex;align-items:center;justify-content:space-between;padding:9px 13px;background:#1f2937;border-radius:8px;margin-bottom:6px;border:1px solid #374151;}\n.__vdt-vital-left{display:flex;align-items:center;gap:8px;}\n.__vdt-dot-good{width:8px;height:8px;border-radius:50%;background:#10b981;flex-shrink:0;}\n.__vdt-dot-warn{width:8px;height:8px;border-radius:50%;background:#f59e0b;flex-shrink:0;}\n.__vdt-dot-bad{width:8px;height:8px;border-radius:50%;background:#ef4444;flex-shrink:0;}\n.__vdt-vital-name{color:#d1d5db;font-weight:500;}\n.__vdt-vital-val{font-family:ui-monospace,'Cascadia Code',monospace;color:#10b981;font-size:12px;font-weight:600;}\n.__vdt-build{display:flex;align-items:center;justify-content:space-between;padding:9px 13px;color:#9ca3af;font-size:12px;border-top:1px solid #374151;margin-top:8px;padding-top:12px;}\n/* info rows */\n.__vdt-info-row{display:flex;align-items:center;justify-content:space-between;padding:9px 13px;background:#1f2937;border-radius:8px;margin-bottom:6px;border:1px solid #374151;}\n.__vdt-info-left{display:flex;align-items:center;gap:8px;color:#d1d5db;}\n.__vdt-info-val{font-family:ui-monospace,'Cascadia Code',monospace;color:#9ca3af;font-size:12px;}\n.__vdt-dev-badge{display:flex;align-items:center;gap:8px;padding:10px 13px;background:#052e16;border:1px solid #166534;border-radius:8px;color:#4ade80;font-size:12px;font-weight:500;margin-top:10px;}\n/* footer */\n.__vdt-footer{padding:10px 16px;border-top:1px solid #1f2937;display:flex;align-items:center;justify-content:space-between;}\n.__vdt-host{color:#6b7280;font-size:11px;font-family:ui-monospace,'Cascadia Code',monospace;}\n.__vdt-conn{display:flex;align-items:center;gap:5px;font-size:11px;color:#10b981;}\n.__vdt-conn-dot{width:6px;height:6px;border-radius:50%;background:#10b981;}\n\n/* ── Widget state colors ── */\n.vdt-idle{border-color:#22D3EE !important;}\n.vdt-compiling{border-color:#4ade80 !important;}\n.vdt-rendering{border-color:#fb923c !important;}\n.vdt-navigating{border-color:#60a5fa !important;}\n.vdt-error{border-color:#f87171 !important;}\n#__vdt-dot.idle{background:#22D3EE;}\n#__vdt-dot.compiling{background:#4ade80;}\n#__vdt-dot.rendering{background:#fb923c;}\n#__vdt-dot.navigating{background:#60a5fa;}\n#__vdt-dot.error{background:#f87171;}\n@keyframes __vdt-pulse{0%,100%{opacity:1;}50%{opacity:.4;}}\n.vdt-compiling #__vdt-dot,.vdt-rendering #__vdt-dot,.vdt-navigating #__vdt-dot{animation:__vdt-pulse .9s ease-in-out infinite;}\n</style>\n\n<!-- ── Floating button ── -->\n<button id=\"__vdt-btn\" class=\"vdt-idle\" onclick=\"__vdtOpen()\" title=\"Velix DevTools (${version})\">\n ${ICON_LOGO}\n <div id=\"__vdt-dot\" class=\"idle\"></div>\n</button>\n\n<!-- ── Panel ── -->\n<div id=\"__vdt\">\n <!-- Header -->\n <div class=\"__vdt-header\">\n <div class=\"__vdt-brand\">\n ${ICON_LOGO}\n Velix\n <span class=\"__vdt-badge\">${version}</span>\n </div>\n <button class=\"__vdt-close\" onclick=\"__vdtClose()\" title=\"Close\">×</button>\n </div>\n\n <!-- Tabs -->\n <div class=\"__vdt-tabs\">\n <button class=\"__vdt-tab active\" id=\"__vtab-btn-route\" onclick=\"__vdtTab('route')\">${ICON_ROUTE} Route</button>\n <button class=\"__vdt-tab\" id=\"__vtab-btn-perf\" onclick=\"__vdtTab('perf')\">${ICON_PERF} Performance</button>\n <button class=\"__vdt-tab\" id=\"__vtab-btn-info\" onclick=\"__vdtTab('info')\">${ICON_INFO} Info</button>\n </div>\n\n <!-- Tab: Route -->\n <div class=\"__vdt-body\" id=\"__vtab-route\">\n <div class=\"__vdt-section\">\n <div class=\"__vdt-label\">Current Route</div>\n <div class=\"__vdt-box\" id=\"__vdt-route-path\">/</div>\n </div>\n <div class=\"__vdt-section\">\n <div class=\"__vdt-label\">Route Segments</div>\n <div class=\"__vdt-row\">\n <div class=\"__vdt-row-left\">${ICON_FILE} <span>app</span></div>\n <span class=\"__vdt-pill __vdt-pill-blue\">layout</span>\n </div>\n <div class=\"__vdt-row\" id=\"__vdt-page-row\">\n <div class=\"__vdt-row-left\">${ICON_FILE} <span id=\"__vdt-page-name\">page.tsx</span></div>\n <span class=\"__vdt-pill __vdt-pill-green\">page</span>\n </div>\n </div>\n <div class=\"__vdt-render\" id=\"__vdt-rendering\">\n ${ICON_TERM} Rendering: <strong id=\"__vdt-render-type\" style=\"color:#d1d5db;margin-left:4px;\">SSR</strong>\n </div>\n </div>\n\n <!-- Tab: Performance -->\n <div class=\"__vdt-body\" id=\"__vtab-perf\" style=\"display:none;\">\n <div class=\"__vdt-section\">\n <div class=\"__vdt-label\">Vitals</div>\n <div class=\"__vdt-vital\">\n <div class=\"__vdt-vital-left\"><div class=\"__vdt-dot-good\"></div><span class=\"__vdt-vital-name\">FCP</span></div>\n <span class=\"__vdt-vital-val\" id=\"__vdt-fcp\">—</span>\n </div>\n <div class=\"__vdt-vital\">\n <div class=\"__vdt-vital-left\"><div class=\"__vdt-dot-good\"></div><span class=\"__vdt-vital-name\">LCP</span></div>\n <span class=\"__vdt-vital-val\" id=\"__vdt-lcp\">—</span>\n </div>\n <div class=\"__vdt-vital\">\n <div class=\"__vdt-vital-left\"><div class=\"__vdt-dot-good\"></div><span class=\"__vdt-vital-name\">CLS</span></div>\n <span class=\"__vdt-vital-val\" id=\"__vdt-cls\">—</span>\n </div>\n <div class=\"__vdt-vital\">\n <div class=\"__vdt-vital-left\"><div class=\"__vdt-dot-good\"></div><span class=\"__vdt-vital-name\">TTFB</span></div>\n <span class=\"__vdt-vital-val\" id=\"__vdt-ttfb\">—</span>\n </div>\n </div>\n <div class=\"__vdt-build\">\n <div style=\"display:flex;align-items:center;gap:6px;\">${ICON_CLOCK} Build time:</div>\n <span id=\"__vdt-build-time\" style=\"color:#d1d5db;font-family:ui-monospace,monospace;font-size:12px;\">—</span>\n </div>\n </div>\n\n <!-- Tab: Info -->\n <div class=\"__vdt-body\" id=\"__vtab-info\" style=\"display:none;\">\n <div class=\"__vdt-info-row\">\n <div class=\"__vdt-info-left\">${ICON_LOGO} <span>Velix</span></div>\n <span class=\"__vdt-info-val\">${version}</span>\n </div>\n <div class=\"__vdt-info-row\">\n <div class=\"__vdt-info-left\">${ICON_GEAR} <span>React</span></div>\n <span class=\"__vdt-info-val\" id=\"__vdt-react-ver\">${reactVersion}</span>\n </div>\n <div class=\"__vdt-info-row\">\n <div class=\"__vdt-info-left\">${ICON_MON} <span>Node.js</span></div>\n <span class=\"__vdt-info-val\">${nodeVersion}</span>\n </div>\n <div class=\"__vdt-info-row\">\n <div class=\"__vdt-info-left\">${ICON_TS} <span>TypeScript</span></div>\n <span class=\"__vdt-info-val\" id=\"__vdt-ts-ver\">${tsVersion}</span>\n </div>\n <div class=\"__vdt-dev-badge\">\n ${ICON_TERM} Development mode active\n </div>\n </div>\n\n <!-- Footer -->\n <div class=\"__vdt-footer\">\n <span class=\"__vdt-host\">${host}:${port}</span>\n <div class=\"__vdt-conn\">\n <div class=\"__vdt-conn-dot\" id=\"__vdt-conn-dot\"></div>\n <span id=\"__vdt-conn-text\">connected</span>\n </div>\n </div>\n</div>\n\n<script>\n(function(){\n /* ── Tab switching ── */\n window.__vdtTab = function(name){\n ['route','perf','info'].forEach(function(t){\n var body = document.getElementById('__vtab-' + t);\n var btn = document.getElementById('__vtab-btn-' + t);\n if(!body || !btn) return;\n var active = t === name;\n body.style.display = active ? 'block' : 'none';\n btn.classList.toggle('active', active);\n });\n };\n\n window.__vdtOpen = function(){ document.getElementById('__vdt').style.display = 'block'; };\n window.__vdtClose = function(){ document.getElementById('__vdt').style.display = 'none'; };\n\n /* ── Route info ── */\n function updateRoute(){\n var p = window.location.pathname;\n var el = document.getElementById('__vdt-route-path');\n if(el) el.textContent = p;\n var seg = p.split('/').filter(Boolean);\n var pageName = seg.length ? seg[seg.length-1] + '.tsx' : 'page.tsx';\n var pn = document.getElementById('__vdt-page-name');\n if(pn) pn.textContent = pageName;\n /* Detect rendering mode from meta generator or search param */\n var rt = document.getElementById('__vdt-render-type');\n if(rt){\n var sp = new URLSearchParams(window.location.search);\n rt.textContent = sp.get('_render') || (document.querySelector('meta[name=\"generator\"]') ? 'SSR' : 'Static');\n }\n }\n updateRoute();\n window.addEventListener('popstate', updateRoute);\n\n /* ── Web Vitals ── */\n function fmtMs(v){ return v < 1000 ? Math.round(v) + 'ms' : (v/1000).toFixed(2) + 's'; }\n function setVital(id, v, threshGood, threshOk){\n var el = document.getElementById(id);\n if(!el) return;\n el.textContent = typeof v === 'number' ? (id === '__vdt-cls' ? v.toFixed(3) : fmtMs(v)) : v;\n var dot = el.closest('.__vdt-vital')?.querySelector('[class^=\"__vdt-dot\"]');\n if(dot && typeof v === 'number'){\n dot.className = v <= threshGood ? '__vdt-dot-good' : v <= threshOk ? '__vdt-dot-warn' : '__vdt-dot-bad';\n }\n if(el && typeof v === 'number'){\n el.style.color = v <= threshGood ? '#10b981' : v <= threshOk ? '#f59e0b' : '#ef4444';\n }\n }\n\n try {\n /* FCP */\n new PerformanceObserver(function(l){\n var e = l.getEntries()[0]; if(e) setVital('__vdt-fcp', e.startTime, 1800, 3000);\n }).observe({ type:'paint', buffered:true });\n\n /* LCP */\n new PerformanceObserver(function(l){\n var entries = l.getEntries();\n var e = entries[entries.length-1]; if(e) setVital('__vdt-lcp', e.startTime, 2500, 4000);\n }).observe({ type:'largest-contentful-paint', buffered:true });\n\n /* CLS */\n var _cls = 0;\n new PerformanceObserver(function(l){\n l.getEntries().forEach(function(e){ if(!e.hadRecentInput) _cls += e.value; });\n setVital('__vdt-cls', _cls, 0.1, 0.25);\n }).observe({ type:'layout-shift', buffered:true });\n\n /* TTFB */\n new PerformanceObserver(function(l){\n var e = l.getEntries()[0]; if(e) setVital('__vdt-ttfb', e.responseStart - e.requestStart, 800, 1800);\n }).observe({ type:'navigation', buffered:true });\n } catch(e){}\n\n /* Build time from server-injected global */\n var bt = window.__VELIX_BUILD_TIME__;\n var btel = document.getElementById('__vdt-build-time');\n if(btel) btel.textContent = bt ? bt + 'ms' : '—';\n\n /* React version from window.React or server injection */\n var rv = document.getElementById('__vdt-react-ver');\n if(rv && rv.textContent === '—' && window.React) rv.textContent = window.React.version;\n\n /* TypeScript version (injected by server if available) */\n var tsv = document.getElementById('__vdt-ts-ver');\n if(tsv && tsv.textContent === '—') tsv.textContent = window.__VELIX_TS_VERSION__ || '—';\n\n /* ── HMR + Status ── */\n var btn = document.getElementById('__vdt-btn');\n var dot = document.getElementById('__vdt-dot');\n var connDot = document.getElementById('__vdt-conn-dot');\n var connText = document.getElementById('__vdt-conn-text');\n\n function setStatus(s){\n if(btn){ btn.className = 'vdt-' + s; }\n if(dot){ dot.className = s; }\n }\n\n function setConn(ok){\n if(connDot) connDot.style.background = ok ? '#10b981' : '#ef4444';\n if(connText) connText.textContent = ok ? 'connected' : 'disconnected';\n if(connText) connText.style.color = ok ? '#10b981' : '#ef4444';\n }\n\n var es = new EventSource('/__velix/hmr');\n\n es.onopen = function(){ setConn(true); };\n\n es.onmessage = function(e){\n var data = e.data;\n if(data === 'reload'){\n setStatus('navigating');\n setTimeout(function(){ location.reload(); }, 120);\n } else if(data === 'building'){\n setStatus('compiling');\n } else if(data === 'built'){\n setStatus('idle');\n } else if(data.startsWith('rendering:')){\n setStatus('rendering');\n setTimeout(function(){ setStatus('idle'); }, 900);\n } else if(data.startsWith('error:')){\n setStatus('error');\n }\n };\n\n es.onerror = function(){\n if(es.readyState === 2){\n setStatus('error');\n setConn(false);\n }\n };\n\n setStatus('idle');\n})();\n</script>`;\n}\n","/**\n * Velix v5 Error Pages\n * Beautiful error pages inspired by Next.js latest design\n */\n\nimport { VERSION } from '../version.js';\n\nexport interface ErrorPageOptions {\n statusCode: number;\n title: string;\n message: string;\n stack?: string;\n isDev?: boolean;\n pathname?: string;\n}\n\n/**\n * Generate a styled 404 error page\n */\nexport function generate404Page(pathname: string = '/'): string {\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>404 - Page Not Found | Velix v5</title>\n <link rel=\"icon\" href=\"/favicon.webp\">\n <style>\n * { margin: 0; padding: 0; box-sizing: border-box; }\n body { \n margin: 0; \n background: linear-gradient(135deg, #0F172A 0%, #1E293B 100%); \n color: white; \n font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif; \n display: flex; \n align-items: center; \n justify-content: center; \n min-height: 100vh; \n text-align: center;\n overflow: hidden;\n }\n .container { \n max-width: 700px; \n padding: 60px 40px; \n position: relative;\n z-index: 10;\n }\n .bg-pattern {\n position: absolute;\n inset: 0;\n background-image: radial-gradient(circle at 20% 50%, rgba(34, 211, 238, 0.1) 0%, transparent 50%),\n radial-gradient(circle at 80% 80%, rgba(37, 99, 235, 0.1) 0%, transparent 50%);\n z-index: 1;\n }\n h1 { \n font-size: 180px; \n font-weight: 900; \n margin: 0; \n background: linear-gradient(135deg, #22D3EE 0%, #2563EB 100%); \n -webkit-background-clip: text; \n -webkit-text-fill-color: transparent; \n line-height: 1; \n letter-spacing: -0.05em;\n animation: fadeInUp 0.6s ease-out;\n }\n h2 { \n font-size: 36px; \n font-weight: 800; \n margin: 30px 0 15px; \n color: #F8FAFC;\n animation: fadeInUp 0.6s ease-out 0.1s backwards;\n }\n p { \n color: #94A3B8; \n font-size: 18px; \n line-height: 1.7; \n margin-bottom: 40px;\n animation: fadeInUp 0.6s ease-out 0.2s backwards;\n }\n code { \n background: rgba(255,255,255,0.1); \n padding: 4px 10px; \n border-radius: 6px; \n font-family: 'Fira Code', 'Courier New', monospace; \n color: #22D3EE; \n font-size: 16px;\n border: 1px solid rgba(34, 211, 238, 0.2);\n }\n .btn-group {\n display: flex;\n gap: 16px;\n justify-content: center;\n flex-wrap: wrap;\n animation: fadeInUp 0.6s ease-out 0.3s backwards;\n }\n .btn { \n display: inline-block; \n background: linear-gradient(135deg, #2563EB 0%, #1D4ED8 100%); \n color: white; \n text-decoration: none; \n padding: 14px 36px; \n border-radius: 12px; \n font-weight: 600; \n font-size: 16px;\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); \n box-shadow: 0 10px 30px rgba(37, 99, 235, 0.3);\n border: none;\n cursor: pointer;\n }\n .btn:hover { \n transform: translateY(-2px); \n box-shadow: 0 15px 40px rgba(37, 99, 235, 0.4);\n }\n .btn-outline { \n background: transparent; \n color: #22D3EE; \n border: 2px solid #22D3EE; \n box-shadow: none;\n }\n .btn-outline:hover { \n background: rgba(34, 211, 238, 0.1); \n box-shadow: 0 10px 30px rgba(34, 211, 238, 0.2);\n }\n @keyframes fadeInUp {\n from {\n opacity: 0;\n transform: translateY(30px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n }\n </style>\n</head>\n<body>\n <div class=\"bg-pattern\"></div>\n <div class=\"container\">\n <h1>404</h1>\n <h2>Page Not Found</h2>\n <p>The page <code>${pathname}</code> could not be found.<br>It may have been moved or deleted.</p>\n <div class=\"btn-group\">\n <a href=\"/\" class=\"btn\">Return Home</a>\n <a href=\"javascript:history.back()\" class=\"btn btn-outline\">Go Back</a>\n </div>\n </div>\n</body>\n</html>`;\n}\n\n/**\n * Generate a styled 500 error page\n */\nexport function generate500Page(options: ErrorPageOptions): string {\n const { title, message, stack, isDev, pathname } = options;\n\n // Parse stack trace to display as cards like Next.js\n let callStackCards = '';\n let frameCount = 0;\n \n if (isDev && stack) {\n const stackLines = stack.split('\\n').filter(line => line.trim());\n const frames = stackLines.slice(1).filter(line => line.includes('at '));\n frameCount = frames.length;\n \n callStackCards = frames.map((frame, index) => {\n const match = frame.match(/at\\s+(.+?)\\s+\\((.+?)\\)/) || frame.match(/at\\s+(.+)/);\n if (match) {\n const funcName = match[1] || 'anonymous';\n const location = match[2] || match[1];\n return `\n <div class=\"error-card\" data-frame=\"${index}\">\n <div class=\"card-header\">\n <div class=\"card-title\">${funcName.trim()}</div>\n <div class=\"card-number\">${index + 1}</div>\n </div>\n <div class=\"card-location\">${location.trim()}</div>\n </div>\n `;\n }\n return '';\n }).join('');\n }\n\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Error | Velix v5</title>\n <link rel=\"icon\" href=\"/favicon.webp\">\n <style>\n * { margin: 0; padding: 0; box-sizing: border-box; }\n body { \n margin: 0; \n background: linear-gradient(135deg, #0F172A 0%, #1E293B 100%);\n color: #F8FAFC; \n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; \n min-height: 100vh;\n overflow-x: hidden;\n }\n .container {\n max-width: 900px;\n margin: 0 auto;\n padding: 40px 20px;\n }\n .error-header {\n background: linear-gradient(135deg, #EF4444 0%, #DC2626 100%);\n color: white;\n padding: 20px 28px;\n border-radius: 16px;\n display: flex;\n align-items: center;\n gap: 14px;\n margin-bottom: 28px;\n font-size: 18px;\n font-weight: 700;\n box-shadow: 0 10px 40px rgba(239, 68, 68, 0.3);\n }\n .error-header svg {\n width: 24px;\n height: 24px;\n flex-shrink: 0;\n }\n .error-badge {\n display: inline-block;\n background: linear-gradient(135deg, #1E40AF 0%, #1E3A8A 100%);\n color: #60A5FA;\n padding: 6px 16px;\n border-radius: 8px;\n font-size: 13px;\n font-weight: 700;\n margin-bottom: 18px;\n text-transform: uppercase;\n letter-spacing: 0.8px;\n box-shadow: 0 4px 12px rgba(30, 64, 175, 0.3);\n }\n .route-badge {\n background: linear-gradient(135deg, #0C4A6E 0%, #075985 100%);\n color: #22D3EE;\n padding: 10px 18px;\n border-radius: 10px;\n font-size: 14px;\n margin-bottom: 24px;\n font-family: 'Courier New', monospace;\n box-shadow: 0 4px 12px rgba(12, 74, 110, 0.3);\n border: 1px solid rgba(34, 211, 238, 0.2);\n }\n .error-message {\n background: rgba(239, 68, 68, 0.1);\n border-left: 4px solid #EF4444;\n padding: 18px 20px;\n border-radius: 10px;\n margin-bottom: 32px;\n }\n .error-message-text {\n color: #FCA5A5;\n font-size: 16px;\n font-weight: 600;\n line-height: 1.6;\n font-family: 'Courier New', monospace;\n }\n .stack-section {\n margin-top: 32px;\n }\n .stack-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 20px;\n }\n .stack-title {\n font-size: 18px;\n font-weight: 700;\n color: #F1F5F9;\n display: flex;\n align-items: center;\n gap: 10px;\n }\n .frame-counter {\n background: linear-gradient(135deg, #1F2937 0%, #111827 100%);\n color: #22D3EE;\n padding: 6px 14px;\n border-radius: 8px;\n font-size: 13px;\n font-weight: 700;\n border: 1px solid rgba(34, 211, 238, 0.2);\n }\n .error-card {\n background: linear-gradient(135deg, #1E293B 0%, #0F172A 100%);\n border: 1px solid rgba(34, 211, 238, 0.2);\n border-radius: 14px;\n padding: 20px;\n margin-bottom: 12px;\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);\n display: none;\n }\n .error-card.active {\n display: block;\n animation: slideIn 0.3s ease-out;\n }\n .error-card:hover {\n border-color: rgba(34, 211, 238, 0.5);\n box-shadow: 0 8px 24px rgba(34, 211, 238, 0.2);\n transform: translateY(-2px);\n }\n .card-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 12px;\n }\n .card-title {\n color: #22D3EE;\n font-size: 15px;\n font-weight: 700;\n font-family: 'Courier New', monospace;\n }\n .card-number {\n background: rgba(34, 211, 238, 0.2);\n color: #22D3EE;\n padding: 4px 10px;\n border-radius: 6px;\n font-size: 12px;\n font-weight: 700;\n }\n .card-location {\n color: #94A3B8;\n font-size: 13px;\n font-family: 'Courier New', monospace;\n word-break: break-all;\n line-height: 1.6;\n }\n .pagination {\n display: flex;\n justify-content: center;\n align-items: center;\n gap: 12px;\n margin-top: 24px;\n }\n .pagination-btn {\n background: linear-gradient(135deg, #1E293B 0%, #0F172A 100%);\n border: 1px solid rgba(34, 211, 238, 0.3);\n color: #22D3EE;\n padding: 10px 20px;\n border-radius: 10px;\n font-size: 14px;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.2s;\n }\n .pagination-btn:hover:not(:disabled) {\n background: linear-gradient(135deg, #22D3EE 0%, #06B6D4 100%);\n color: #0F172A;\n transform: translateY(-2px);\n box-shadow: 0 6px 20px rgba(34, 211, 238, 0.4);\n }\n .pagination-btn:disabled {\n opacity: 0.3;\n cursor: not-allowed;\n }\n .pagination-info {\n color: #94A3B8;\n font-size: 14px;\n font-weight: 600;\n }\n .footer {\n margin-top: 48px;\n padding-top: 28px;\n border-top: 1px solid rgba(34, 211, 238, 0.2);\n display: flex;\n justify-content: space-between;\n align-items: center;\n flex-wrap: wrap;\n gap: 20px;\n }\n .brand {\n display: flex;\n align-items: center;\n gap: 10px;\n font-weight: 700;\n color: #22D3EE;\n font-size: 15px;\n }\n .brand img {\n width: 20px;\n height: 20px;\n }\n .footer-links {\n display: flex;\n gap: 24px;\n flex-wrap: wrap;\n }\n .footer-links a {\n color: #60A5FA;\n text-decoration: none;\n font-weight: 600;\n transition: all 0.2s;\n font-size: 14px;\n }\n .footer-links a:hover {\n color: #22D3EE;\n transform: translateY(-1px);\n }\n .no-stack {\n background: rgba(239, 68, 68, 0.1);\n border: 1px solid rgba(239, 68, 68, 0.3);\n border-radius: 12px;\n padding: 32px;\n color: #FCA5A5;\n text-align: center;\n font-size: 15px;\n }\n @keyframes slideIn {\n from {\n opacity: 0;\n transform: translateY(10px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n }\n </style>\n</head>\n<body>\n <div class=\"container\">\n <div class=\"error-header\">\n <svg fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z\"></path>\n </svg>\n <span>Unhandled Runtime Error</span>\n </div>\n \n <div class=\"error-badge\">SERVER ERROR 500</div>\n ${pathname ? `<div class=\"route-badge\">Route: ${pathname}</div>` : ''}\n \n <div class=\"error-message\">\n <div class=\"error-message-text\">${message}</div>\n </div>\n \n ${isDev && callStackCards ? `\n <div class=\"stack-section\">\n <div class=\"stack-header\">\n <div class=\"stack-title\">\n <svg width=\"20\" height=\"20\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\"></path>\n </svg>\n Call Stack\n </div>\n <div class=\"frame-counter\">${frameCount}</div>\n </div>\n <div id=\"error-cards\">\n ${callStackCards}\n </div>\n ${frameCount > 1 ? `\n <div class=\"pagination\">\n <button class=\"pagination-btn\" id=\"prev-btn\" onclick=\"changePage(-1)\">\n <svg width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" style=\"display:inline;vertical-align:middle;margin-right:4px;\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M15 19l-7-7 7-7\"></path>\n </svg>\n Previous\n </button>\n <div class=\"pagination-info\">\n <span id=\"current-page\">1</span> / <span id=\"total-pages\">${frameCount}</span>\n </div>\n <button class=\"pagination-btn\" id=\"next-btn\" onclick=\"changePage(1)\">\n Next\n <svg width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" style=\"display:inline;vertical-align:middle;margin-left:4px;\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M9 5l7 7-7 7\"></path>\n </svg>\n </button>\n </div>\n ` : ''}\n </div>\n ` : '<div class=\"no-stack\">An error occurred while processing your request. Please check the server logs for more details.</div>'}\n \n <div class=\"footer\">\n <div class=\"brand\">\n <img src=\"/__velix/logo.webp\" alt=\"Velix\" onerror=\"this.style.display='none'\"/>\n <span>Velix v${VERSION}</span>\n </div>\n <div class=\"footer-links\">\n <a href=\"/\">Home</a>\n <a href=\"javascript:location.reload()\">Reload</a>\n <a href=\"https://github.com/velix/velix/tree/main/docs\" target=\"_blank\">Documentation</a>\n ${isDev ? '<span style=\"color:#94A3B8;\">Development Mode</span>' : ''}\n </div>\n </div>\n </div>\n \n ${isDev && frameCount > 0 ? `\n <script>\n let currentPage = 1;\n const totalPages = ${frameCount};\n const cards = document.querySelectorAll('.error-card');\n const prevBtn = document.getElementById('prev-btn');\n const nextBtn = document.getElementById('next-btn');\n const currentPageSpan = document.getElementById('current-page');\n \n function showPage(page) {\n cards.forEach((card, index) => {\n card.classList.remove('active');\n if (index === page - 1) {\n card.classList.add('active');\n }\n });\n \n currentPage = page;\n currentPageSpan.textContent = page;\n \n if (prevBtn) prevBtn.disabled = page === 1;\n if (nextBtn) nextBtn.disabled = page === totalPages;\n }\n \n function changePage(direction) {\n const newPage = currentPage + direction;\n if (newPage >= 1 && newPage <= totalPages) {\n showPage(newPage);\n }\n }\n \n // Show first page on load\n showPage(1);\n \n // Keyboard navigation\n document.addEventListener('keydown', (e) => {\n if (e.key === 'ArrowLeft') changePage(-1);\n if (e.key === 'ArrowRight') changePage(1);\n });\n </script>\n ` : ''}\n</body>\n</html>`;\n}\n\n/**\n * Generate error page based on status code\n */\nexport function generateErrorPage(statusCode: number, options: Partial<ErrorPageOptions> = {}): string {\n if (statusCode === 404) {\n return generate404Page(options.pathname || '/');\n }\n\n return generate500Page({\n statusCode,\n title: options.title || 'Server Error',\n message: options.message || 'An unexpected error occurred',\n stack: options.stack,\n isDev: options.isDev,\n pathname: options.pathname,\n });\n}\n"],"mappings":"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","names":["fs","path","fs","path","fileURLToPath","pathToFileURL","React","path","path","fs","path","fs","fs","path","fs","fs","path","path","fs","pathToFileURL","cookies","c","url","fs","path","pathToFileURL","path","cookies","pathToFileURL","path","handleImageOptimization","c","fs","React","headers","__filename","fileURLToPath","__dirname"]}
|
|
1
|
+
{"version":3,"sources":["../../../../node_modules/.pnpm/tsup@8.5.1_jiti@2.6.1_postc_36112cdf9ab6125b194fc7941daee874/node_modules/tsup/assets/esm_shims.js","../../server/image-optimizer.ts","../../runtime/start-prod.ts","../../server/index.ts","../../config.ts","../../router/index.ts","../../utils.ts","../../middleware/index.ts","../../plugins/index.ts","../../plugins/tailwind.ts","../../logger.ts","../../version.ts","../../metadata/index.ts","../../islands/index.ts","../../actions/index.ts","../../helpers.ts","../../server/devtools.ts","../../server/error-pages.ts"],"sourcesContent":["// Shim globals in esm bundle\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nconst getFilename = () => fileURLToPath(import.meta.url)\nconst getDirname = () => path.dirname(getFilename())\n\nexport const __dirname = /* @__PURE__ */ getDirname()\nexport const __filename = /* @__PURE__ */ getFilename()\n","import http from 'http';\nimport fs from 'fs';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\n\nexport async function handleImageOptimization(req: http.IncomingMessage, res: http.ServerResponse, projectRoot: string) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let sharp: ((input: Buffer) => Record<string, unknown>) | undefined;\n try {\n // @ts-ignore: sharp is an optional dependency\n sharp = await import('sharp').then(m => m.default || m);\n } catch (e) {\n // sharp is optional\n }\n try {\n const url = new URL(req.url!, `http://${req.headers.host || 'localhost'}`);\n const imageUrl = url.searchParams.get('url');\n const widthStr = url.searchParams.get('w');\n const qualityStr = url.searchParams.get('q');\n\n if (!imageUrl) {\n res.writeHead(400);\n res.end('Missing url parameter');\n return;\n }\n\n const width = widthStr ? parseInt(widthStr, 10) : undefined;\n const quality = qualityStr ? parseInt(qualityStr, 10) : 75;\n\n // Resolve image path (assuming it's a local public asset if it doesn't start with http)\n let imageBuffer: Buffer | null = null;\n\n if (imageUrl.startsWith('http')) {\n const response = await fetch(imageUrl);\n if (!response.ok) throw new Error(`Failed to fetch ${imageUrl}`);\n imageBuffer = Buffer.from(await response.arrayBuffer());\n } else {\n const publicDir = path.join(projectRoot, 'public');\n // Prevent directory traversal\n const resolvedPath = path.join(publicDir, imageUrl.startsWith('/') ? imageUrl.slice(1) : imageUrl);\n if (!resolvedPath.startsWith(publicDir) || !fs.existsSync(resolvedPath)) {\n res.writeHead(404);\n res.end('Image not found');\n return;\n }\n imageBuffer = fs.readFileSync(resolvedPath);\n }\n\n if (!sharp) {\n // Fallback: just return the original image if sharp is not installed\n res.writeHead(200, {\n 'Content-Type': 'image/jpeg',\n 'Cache-Control': 'public, max-age=31536000, immutable'\n });\n res.end(imageBuffer);\n return;\n }\n\n // Process with sharp — typed minimally since it's an optional dependency\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let processor: any = sharp(imageBuffer);\n \n if (width) {\n processor = processor.resize(width);\n }\n\n // Default to webp for optimized delivery\n processor = processor.webp({ quality });\n\n const optimizedBuffer = await processor.toBuffer();\n\n res.writeHead(200, {\n 'Content-Type': 'image/webp',\n 'Cache-Control': 'public, max-age=31536000, immutable'\n });\n res.end(optimizedBuffer);\n } catch (error: unknown) {\n console.error('Image optimization error:', error);\n res.writeHead(500);\n res.end('Error processing image');\n }\n}\n","/**\n * Velix v5 — Production Server\n * Start the production server\n */\n\nimport { createServer } from '../server/index.js';\nimport logger from '../logger.js';\n\nasync function startProd() {\n process.env.NODE_ENV = 'production';\n\n const projectRoot = process.cwd();\n\n await createServer({ projectRoot, mode: 'production' });\n\n // Graceful shutdown\n process.on('SIGINT', () => {\n logger.blank();\n logger.info('Shutting down...');\n process.exit(0);\n });\n\n process.on('SIGTERM', () => {\n logger.info('Received SIGTERM, shutting down gracefully...');\n process.exit(0);\n });\n}\n\nstartProd().catch(err => {\n logger.error('Failed to start production server', err);\n process.exit(1);\n});\n","/**\r\n * Velix v5 Server\r\n *\r\n * Modular HTTP server with SSR, static file serving, API routes,\r\n * server actions, middleware, and plugin hooks.\r\n */\r\n\r\nimport http from 'http';\r\nimport fs from 'fs';\r\nimport path from 'path';\r\nimport { fileURLToPath, pathToFileURL } from 'url';\r\nimport { createRequire } from 'module';\r\nimport React from 'react';\r\nimport { renderToString } from 'react-dom/server';\r\nimport { loadConfig, resolvePaths, type VelixConfig } from '../config.js';\r\nimport { buildRouteTree, matchRoute } from '../router/index.js';\r\nimport { runMiddleware, loadMiddleware, type MiddlewareFunction } from '../middleware/index.js';\r\nimport { pluginManager, loadPlugins, PluginHooks, builtinPlugins } from '../plugins/index.js';\r\nimport tailwindPlugin from '../plugins/tailwind.js';\r\nimport { generateMetadataTags, generateSitemap, generateRobotsTxt } from '../metadata/index.js';\r\nimport { getRegisteredIslands, generateAdvancedHydrationScript } from '../islands/index.js';\r\nimport type { Route } from '../types.js';\r\nimport { executeAction, deserializeArgs } from '../actions/index.js';\r\nimport logger from '../logger.js';\r\nimport esbuild from 'esbuild';\r\nimport { generateDevToolsHtml } from './devtools.js';\r\nimport { VERSION } from '../version.js';\r\nimport { generate404Page, generate500Page } from './error-pages.js';\r\n\r\nexport {\r\n defineRoute,\r\n VelixHttpError,\r\n defineLoader,\r\n serverAction,\r\n buildApiManifest,\r\n handleApiRequest\r\n} from '@teamvelix/velix-core';\r\n\r\nfunction getProjectVersion(dep: string, projectRoot: string): string {\r\n try {\r\n const projectRequire = createRequire(pathToFileURL(path.join(projectRoot, 'package.json')).href);\r\n return projectRequire(`${dep}/package.json`).version;\r\n } catch (e) {\r\n try {\r\n const selfRequire = createRequire(import.meta.url);\r\n return selfRequire(`${dep}/package.json`).version;\r\n } catch (e2) {\r\n return '—';\r\n }\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// MIME Types\r\n// ============================================================================\r\n\r\nconst MIME_TYPES: Record<string, string> = {\r\n '.html': 'text/html; charset=utf-8',\r\n '.css': 'text/css; charset=utf-8',\r\n '.js': 'application/javascript; charset=utf-8',\r\n '.mjs': 'application/javascript; charset=utf-8',\r\n '.json': 'application/json',\r\n '.png': 'image/png',\r\n '.jpg': 'image/jpeg',\r\n '.jpeg': 'image/jpeg',\r\n '.gif': 'image/gif',\r\n '.svg': 'image/svg+xml',\r\n '.ico': 'image/x-icon',\r\n '.webp': 'image/webp',\r\n '.woff': 'font/woff',\r\n '.woff2': 'font/woff2',\r\n '.ttf': 'font/ttf',\r\n '.otf': 'font/otf',\r\n '.txt': 'text/plain; charset=utf-8',\r\n '.xml': 'application/xml',\r\n '.mp4': 'video/mp4',\r\n '.webm': 'video/webm',\r\n '.mp3': 'audio/mpeg',\r\n '.pdf': 'application/pdf',\r\n '.map': 'application/json',\r\n};\r\n\r\n// ============================================================================\r\n// Server\r\n// ============================================================================\r\n\r\nexport interface VelixServer {\r\n server: http.Server;\r\n config: VelixConfig;\r\n close: () => void;\r\n}\r\n\r\nexport async function createServer(options: {\r\n projectRoot?: string;\r\n mode?: 'development' | 'production';\r\n} = {}): Promise<VelixServer> {\r\n const projectRoot = options.projectRoot || process.cwd();\r\n const mode = options.mode || (process.env.NODE_ENV as 'development' | 'production' | undefined) || 'development';\r\n const isDev = mode === 'development';\r\n\r\n // Load configuration\r\n const rawConfig = await loadConfig(projectRoot);\r\n const config = resolvePaths(rawConfig, projectRoot);\r\n\r\n // Load plugins\r\n await loadPlugins(projectRoot, config);\r\n\r\n // Plugin hook: config loaded (allow plugins to modify config)\r\n await pluginManager.runHook(PluginHooks.CONFIG, config);\r\n\r\n // Load middleware\r\n const middlewareFns = await loadMiddleware(projectRoot);\r\n\r\n // Build route tree\r\n const appDir = (config as unknown as { resolvedAppDir?: string }).resolvedAppDir || path.join(projectRoot, 'app');\r\n const routes = buildRouteTree(appDir);\r\n\r\n // Plugin hook: routes loaded\r\n await pluginManager.runHook(PluginHooks.ROUTES_LOADED, routes);\r\n\r\n const startTime = Date.now();\r\n\r\n // Plugin hook: server starting\r\n await pluginManager.runHook(PluginHooks.SERVER_START, { config, isDev, projectRoot }, isDev);\r\n\r\n const server = http.createServer(async (req, res) => {\r\n const requestStart = Date.now();\r\n const url = new URL(req.url || '/', `http://${req.headers.host || 'localhost'}`);\r\n const pathname = url.pathname;\r\n\r\n try {\r\n // Run middleware\r\n if (middlewareFns.length > 0) {\r\n const middlewareResult = await runMiddleware(req, res, middlewareFns);\r\n if (!middlewareResult.continue) return;\r\n }\r\n\r\n // Plugin hook: request\r\n await pluginManager.runHook(PluginHooks.REQUEST, req, res);\r\n\r\n // ── Auto-generated SEO routes ──\r\n if (pathname === '/sitemap.xml' && config.seo.sitemap) {\r\n const baseUrl = config.app.url || `http://${config.server.host}:${config.server.port}`;\r\n const sitemap = generateSitemap(routes.appRoutes, baseUrl);\r\n res.writeHead(200, { 'Content-Type': 'application/xml' });\r\n res.end(sitemap);\r\n return;\r\n }\r\n\r\n if (pathname === '/robots.txt' && config.seo.robots) {\r\n const baseUrl = config.app.url || `http://${config.server.host}:${config.server.port}`;\r\n const robotsTxt = generateRobotsTxt(baseUrl);\r\n res.writeHead(200, { 'Content-Type': 'text/plain' });\r\n res.end(robotsTxt);\r\n return;\r\n }\r\n\r\n // ── Server actions ──\r\n if (pathname === '/__velix/action' && req.method === 'POST') {\r\n await handleServerAction(req, res);\r\n return;\r\n }\r\n\r\n // ── Velix internal assets ──\r\n if (pathname === '/__velix/image') {\r\n const { handleImageOptimization } = await import('./image-optimizer.js');\r\n await handleImageOptimization(req, res, projectRoot);\r\n return;\r\n }\r\n\r\n if (pathname.startsWith('/__velix/')) {\r\n await serveVelixInternal(pathname, req, res, projectRoot);\r\n return;\r\n }\r\n\r\n // ── Static files ──\r\n const publicDir = (config as unknown as { resolvedPublicDir?: string }).resolvedPublicDir || path.join(projectRoot, 'public');\r\n if (await serveStaticFile(pathname, publicDir, res, isDev)) {\r\n if (isDev) logger.request(req.method || 'GET', pathname, 200, Date.now() - requestStart, { type: 'static' });\r\n return;\r\n }\r\n\r\n // ── API routes ──\r\n const apiMatch = matchRoute(pathname, routes.api);\r\n if (apiMatch) {\r\n await handleApiRoute(apiMatch, req, res, url);\r\n if (isDev) logger.request(req.method || 'GET', pathname, res.statusCode, Date.now() - requestStart, { type: 'api' });\r\n return;\r\n }\r\n\r\n // ── Page routes (SSR) ──\r\n const pageMatch = matchRoute(pathname, routes.appRoutes);\r\n if (pageMatch) {\r\n await handlePageRoute(pageMatch, routes, req, res, url, config, isDev, projectRoot);\r\n if (isDev) logger.request(req.method || 'GET', pathname, res.statusCode, Date.now() - requestStart, { type: 'ssr' });\r\n return;\r\n }\r\n\r\n // ── 404 ──\r\n res.writeHead(404, { 'Content-Type': 'text/html; charset=utf-8' });\r\n res.end(generate404Page(pathname));\r\n if (isDev) logger.request(req.method || 'GET', pathname, 404, Date.now() - requestStart);\r\n\r\n } catch (error: unknown) {\r\n const err = error as Error;\r\n console.error('Server error:', error);\r\n if (!res.headersSent) {\r\n res.writeHead(500, { 'Content-Type': 'text/html; charset=utf-8' });\r\n res.end(generate500Page({\r\n statusCode: 500,\r\n title: 'Server Error',\r\n message: err.message || 'An unexpected error occurred',\r\n stack: isDev ? err.stack : undefined,\r\n isDev,\r\n pathname\r\n }));\r\n }\r\n }\r\n });\r\n\r\n if (isDev) {\r\n const { createHMRServer } = await import('@teamvelix/velix-core');\r\n const hmr = createHMRServer(server as any, projectRoot);\r\n (server as unknown as { broadcastHMR: (msg: any) => void }).broadcastHMR = (msg) => {\r\n hmr.broadcast(msg);\r\n };\r\n }\r\n\r\n // Start listening\r\n const port = config.server.port;\r\n const host = config.server.host;\r\n\r\n server.listen(port, host, () => {\r\n logger.serverStart({ port, host, mode, pagesDir: appDir }, startTime);\r\n\r\n // Log routes in dev mode\r\n if (isDev) {\r\n routes.appRoutes.forEach(r => {\r\n const type = r.path.includes(':') || r.path.includes('*') ? 'dynamic' : 'static';\r\n logger.route(r.path, type);\r\n });\r\n routes.api.forEach(r => logger.route(r.path, 'api'));\r\n logger.blank();\r\n }\r\n });\r\n\r\n server.on('error', (err: NodeJS.ErrnoException) => {\r\n if (err.code === 'EADDRINUSE') {\r\n logger.portInUse(port);\r\n process.exit(1);\r\n }\r\n throw err;\r\n });\r\n\r\n return {\r\n server,\r\n config: rawConfig,\r\n close: () => server.close()\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// SSR Module Import (handles CSS imports gracefully)\r\n// ============================================================================\r\n\r\nasync function importModuleSSR(filePath: string): Promise<unknown> {\r\n const fileUrl = pathToFileURL(filePath).href;\r\n try {\r\n return await import(`${fileUrl}?t=${Date.now()}`);\r\n } catch (err) {\r\n // Check if this might be a CSS import issue\r\n const source = fs.readFileSync(filePath, 'utf-8');\r\n if (source.match(/^import\\s+['\"][^'\"]+\\.(css|scss|less|sass)['\"];?\\s*$/m)) {\r\n const stripped = source.replace(/^import\\s+['\"][^'\"]+\\.(css|scss|less|sass)['\"];?\\s*$/gm, '// [velix:ssr] css import stripped');\r\n const ext = path.extname(filePath);\r\n const tmpPath = filePath.replace(ext, `.__velix_ssr${ext}`);\r\n fs.writeFileSync(tmpPath, stripped);\r\n try {\r\n const mod = await import(`${pathToFileURL(tmpPath).href}?t=${Date.now()}`);\r\n try { fs.unlinkSync(tmpPath); } catch {}\r\n return mod;\r\n } catch (e2) {\r\n try { fs.unlinkSync(tmpPath); } catch {}\r\n throw e2;\r\n }\r\n }\r\n throw err;\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// Layout Resolution (Next.js-style: root layout wraps all pages)\r\n// ============================================================================\r\n\r\nfunction collectLayouts(pageFilePath: string, appDir: string): string[] {\r\n const layouts: string[] = [];\r\n const normalizedAppDir = path.resolve(appDir);\r\n let current = path.dirname(path.resolve(pageFilePath));\r\n\r\n while (true) {\r\n for (const ext of ['.tsx', '.jsx', '.ts', '.js']) {\r\n const layoutPath = path.join(current, `layout${ext}`);\r\n if (fs.existsSync(layoutPath)) {\r\n layouts.unshift(layoutPath); // root-first order\r\n break;\r\n }\r\n }\r\n if (path.resolve(current) === normalizedAppDir) break;\r\n const parent = path.dirname(current);\r\n if (parent === current) break; // filesystem root\r\n current = parent;\r\n }\r\n\r\n return layouts;\r\n}\r\n\r\nasync function renderComponentAsync(Component: unknown, props: Record<string, unknown>): Promise<React.ReactElement> {\r\n let element = React.createElement(Component as React.ComponentType<Record<string, unknown>>, props);\r\n if (typeof Component === 'function') {\r\n try {\r\n const result = (Component as (props: Record<string, unknown>) => React.ReactElement | Promise<React.ReactElement>)(props);\r\n if (result instanceof Promise) {\r\n element = await result as any;\r\n }\r\n } catch (e) {\r\n // Fallback to createElement result\r\n }\r\n }\r\n return element;\r\n}\r\n\r\n// ============================================================================\r\n// Handlers\r\n// ============================================================================\r\n\r\nasync function serveStaticFile(pathname: string, publicDir: string, res: http.ServerResponse, isDev: boolean = false): Promise<boolean> {\r\n const filePath = path.join(publicDir, pathname);\r\n\r\n // Prevent directory traversal\r\n if (!filePath.startsWith(publicDir)) return false;\r\n\r\n if (!fs.existsSync(filePath) || fs.statSync(filePath).isDirectory()) return false;\r\n\r\n const ext = path.extname(filePath);\r\n const contentType = MIME_TYPES[ext] || 'application/octet-stream';\r\n const content = fs.readFileSync(filePath);\r\n\r\n res.writeHead(200, {\r\n 'Content-Type': contentType,\r\n 'Content-Length': content.length,\r\n 'Cache-Control': isDev ? 'no-store, no-cache, must-revalidate' : 'public, max-age=31536000, immutable',\r\n });\r\n res.end(content);\r\n return true;\r\n}\r\n\r\nasync function handleApiRoute(route: { filePath: string, params?: Record<string, string> }, req: http.IncomingMessage, res: http.ServerResponse, url: URL) {\r\n try {\r\n const fileUrl = pathToFileURL(route.filePath).href;\r\n const mod = await import(`${fileUrl}?t=${Date.now()}`);\r\n const method = req.method?.toUpperCase() || 'GET';\r\n const handler = mod[method] || mod.default;\r\n\r\n if (!handler) {\r\n res.writeHead(405, { 'Content-Type': 'application/json' });\r\n res.end(JSON.stringify({ error: 'Method not allowed' }));\r\n return;\r\n }\r\n\r\n let rawBody: string | undefined;\r\n if (['POST', 'PUT', 'PATCH'].includes(method)) {\r\n rawBody = await parseRawBody(req);\r\n }\r\n\r\n const headers = new Headers();\r\n for (const [key, val] of Object.entries(req.headers)) {\r\n if (Array.isArray(val)) val.forEach(v => headers.append(key, v));\r\n else if (val) headers.set(key, val);\r\n }\r\n\r\n const reqInit: RequestInit = { method, headers };\r\n if (rawBody !== undefined) reqInit.body = rawBody;\r\n\r\n const request = new Request(url.href, reqInit) as Request & { velixUrl: URL };\r\n request.velixUrl = url;\r\n\r\n // Call API handler with native Request and Next.js-like context\r\n const response = await handler(request, { params: route.params || {} });\r\n\r\n if (response instanceof Response) {\r\n const headers: Record<string, string> = {};\r\n response.headers.forEach((v: string, k: string) => { headers[k] = v; });\r\n res.writeHead(response.status, headers);\r\n const text = await response.text();\r\n res.end(text);\r\n } else if (typeof response === 'object') {\r\n res.writeHead(200, { 'Content-Type': 'application/json' });\r\n res.end(JSON.stringify(response));\r\n } else {\r\n res.writeHead(200, { 'Content-Type': 'text/plain' });\r\n res.end(String(response));\r\n }\r\n } catch (err: unknown) {\r\n const error = err as Error;\r\n res.writeHead(500, { 'Content-Type': 'application/json' });\r\n res.end(JSON.stringify({ error: error.message }));\r\n }\r\n}\r\n\r\nasync function handleServerAction(req: http.IncomingMessage, res: http.ServerResponse) {\r\n try {\r\n const body = await parseRequestBody(req) as { actionId?: string, args?: string };\r\n if (!body?.actionId || typeof body.actionId !== 'string') {\r\n res.writeHead(400, { 'Content-Type': 'application/json' });\r\n res.end(JSON.stringify({ error: 'Missing actionId' }));\r\n return;\r\n }\r\n\r\n const args = body.args ? deserializeArgs(body.args as any) : [];\r\n const result = await executeAction(body.actionId, args);\r\n\r\n res.writeHead(200, { 'Content-Type': 'application/json' });\r\n res.end(JSON.stringify(result));\r\n } catch (err: unknown) {\r\n const error = err as Error;\r\n res.writeHead(500, { 'Content-Type': 'application/json' });\r\n res.end(JSON.stringify({ success: false, error: error.message }));\r\n }\r\n}\r\n\r\nasync function handlePageRoute(\r\n route: Route, routes: { appRoutes: { path: string }[] },\r\n req: http.IncomingMessage, res: http.ServerResponse,\r\n url: URL, config: VelixConfig, isDev: boolean, projectRoot: string\r\n) {\r\n try {\r\n const fileUrl = pathToFileURL(route.filePath).href;\r\n const mod = await import(`${fileUrl}?t=${Date.now()}`);\r\n const PageComponent = mod.default;\r\n let metadata = mod.metadata || mod.generateMetadata?.(route.params) || {};\r\n\r\n // ── Layout Resolution (Next.js-style: walk up to root) ──\r\n const appDir = (config as unknown as { resolvedAppDir?: string }).resolvedAppDir || path.join(projectRoot, 'app');\r\n const layoutPaths = collectLayouts(route.filePath, appDir);\r\n\r\n // Load all layouts and merge metadata (root-first)\r\n const layoutModules: { default?: React.ComponentType<unknown>; metadata?: Record<string, unknown> }[] = [];\r\n for (const lp of layoutPaths) {\r\n try {\r\n const layoutMod = await importModuleSSR(lp) as { default?: React.ComponentType<unknown>; metadata?: Record<string, unknown> };\r\n layoutModules.push(layoutMod);\r\n if (layoutMod.metadata) {\r\n metadata = { ...layoutMod.metadata, ...metadata };\r\n }\r\n } catch (e) {\r\n // Skip broken layouts gracefully\r\n logger.warn?.(`Failed to load layout: ${lp}`);\r\n }\r\n }\r\n\r\n // Generate metadata tags\r\n const baseUrl = config.app.url || `http://${config.server.host}:${config.server.port}`;\r\n const metaTags = generateMetadataTags({\r\n ...metadata,\r\n generator: `Velix v${VERSION}`,\r\n viewport: metadata.viewport || 'width=device-width, initial-scale=1',\r\n }, baseUrl);\r\n\r\n // Get islands for hydration\r\n const islands = getRegisteredIslands();\r\n const hydrationScript = generateAdvancedHydrationScript(islands);\r\n \r\n const reactVersion = getProjectVersion('react', projectRoot);\r\n const tsVersion = getProjectVersion('typescript', projectRoot);\r\n\r\n // Developer Tools Injection\r\n const devToolsHtml = generateDevToolsHtml(isDev, {\r\n version: VERSION,\r\n port: config.server.port,\r\n host: config.server.host,\r\n nodeVersion: process.version.replace('v', ''),\r\n reactVersion,\r\n tsVersion\r\n });\r\n\r\n const headInjections = `\r\n <meta charset=\"utf-8\">\r\n ${metaTags}\r\n ${config.favicon ? `<link rel=\"icon\" href=\"${config.favicon}\">` : ''}\r\n ${config.styles.map(s => `<link rel=\"stylesheet\" href=\"${s}\">`).join('\\n ')}\r\n `;\r\n // ── Resolve Error Boundaries ──\r\n const { resolveErrorBoundary, getErrorBoundaryType } = await import('@teamvelix/velix-core');\r\n const { VelixErrorBoundary, VelixDefaultErrorPage } = await import('@teamvelix/velix-react');\r\n\r\n const errorBoundary = resolveErrorBoundary(route.filePath, appDir, 'error');\r\n const notFoundBoundary = resolveErrorBoundary(route.filePath, appDir, 'not-found');\r\n\r\n let ErrorComponent = null;\r\n let NotFoundComponent = null;\r\n\r\n if (errorBoundary) {\r\n try {\r\n const mod = await import(`${pathToFileURL(errorBoundary.filePath).href}?t=${Date.now()}`);\r\n ErrorComponent = mod.default;\r\n } catch (e) {}\r\n }\r\n if (notFoundBoundary) {\r\n try {\r\n const mod = await import(`${pathToFileURL(notFoundBoundary.filePath).href}?t=${Date.now()}`);\r\n NotFoundComponent = mod.default;\r\n } catch (e) {}\r\n }\r\n\r\n // Extract search params for the component\r\n const searchParams = Object.fromEntries(url.searchParams.entries());\r\n\r\n let pageElement;\r\n try {\r\n // Render the page component (supports async/server components)\r\n pageElement = await renderComponentAsync(PageComponent, { params: route.params, searchParams, query: searchParams });\r\n } catch (ssrError) {\r\n const err = ssrError as Error;\r\n const errorType = getErrorBoundaryType(err);\r\n res.statusCode = (err as any).status || (errorType === 'not-found' ? 404 : 500);\r\n\r\n if (errorType === 'not-found' && NotFoundComponent) {\r\n pageElement = React.createElement(NotFoundComponent as any);\r\n } else if (ErrorComponent) {\r\n pageElement = React.createElement(ErrorComponent as any, { error: err, reset: () => {} });\r\n } else {\r\n pageElement = React.createElement(VelixDefaultErrorPage, { error: err, reset: () => {} });\r\n }\r\n }\r\n\r\n // Wrap with Error Boundary for client-side routing and hydration\r\n pageElement = React.createElement(\r\n VelixErrorBoundary,\r\n {\r\n errorComponent: ErrorComponent as any,\r\n notFoundComponent: NotFoundComponent as any,\r\n routePath: route.filePath,\r\n },\r\n pageElement\r\n );\r\n\r\n // Nest layouts around page: innermost first, then wrap outward (root is first in array)\r\n let layoutElement = pageElement;\r\n for (let i = layoutModules.length - 1; i >= 0; i--) {\r\n const layoutMod = layoutModules[i];\r\n if (layoutMod.default) {\r\n layoutElement = await renderComponentAsync(layoutMod.default, {\r\n params: route.params,\r\n searchParams,\r\n children: layoutElement,\r\n });\r\n }\r\n }\r\n\r\n // Render the React Tree (SSR)\r\n const ssrContent = renderToString(layoutElement);\r\n\r\n // Apply native waterfall hook: after render\r\n let finalHtml = await pluginManager.runWaterfallHook(PluginHooks.AFTER_RENDER, ssrContent, { route, config, isDev }) as string;\r\n \r\n // Inject Head & Body (Surgical insertion)\r\n const headInjectionsHtml = `\\n ${headInjections}\\n `;\r\n const hmrScript = isDev ? `\\n <script type=\"module\">\\n import { initHMRClient, VelixDevOverlay } from '/__velix/hmr-client.js';\\n initHMRClient();\\n </script>` : '';\r\n const bodyInjectionsHtml = `\\n <div id=\"__velix-islands\"></div>\\n ${hydrationScript}${devToolsHtml}${hmrScript}\\n `;\r\n if (finalHtml.includes('<html')) {\r\n // 1. Inject Head\r\n const headEnd = finalHtml.lastIndexOf('</head>');\r\n if (headEnd !== -1) {\r\n finalHtml = finalHtml.slice(0, headEnd) + headInjectionsHtml + finalHtml.slice(headEnd);\r\n } else {\r\n // Find body start to insert head before it\r\n const bodyStart = finalHtml.search(/<body[^>]*>/i);\r\n if (bodyStart !== -1) {\r\n finalHtml = finalHtml.slice(0, bodyStart) + `<head>${headInjectionsHtml}</head>` + finalHtml.slice(bodyStart);\r\n }\r\n }\r\n\r\n // 2. Inject Body scripts\r\n const bodyEnd = finalHtml.lastIndexOf('</body>');\r\n if (bodyEnd !== -1) {\r\n finalHtml = finalHtml.slice(0, bodyEnd) + bodyInjectionsHtml + finalHtml.slice(bodyEnd);\r\n } else {\r\n finalHtml += bodyInjectionsHtml;\r\n }\r\n\r\n // 3. Ensure Doctype\r\n if (!finalHtml.trim().startsWith('<!DOCTYPE')) {\r\n finalHtml = '<!DOCTYPE html>\\n' + finalHtml;\r\n }\r\n } else {\r\n // Fallback for partial content\r\n finalHtml = `<!DOCTYPE html>\r\n<html lang=\"en\">\r\n<head>\r\n ${headInjectionsHtml}\r\n</head>\r\n<body>\r\n <div id=\"__velix\">${ssrContent}</div>\r\n ${bodyInjectionsHtml}\r\n</body>\r\n</html>`;\r\n }\r\n\r\n res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });\r\n res.end(finalHtml);\r\n\r\n } catch (err: unknown) {\r\n const error = err as Error;\r\n logger.error(`Render error: ${route.path}`, error);\r\n res.writeHead(500, { 'Content-Type': 'text/html; charset=utf-8' });\r\n res.end(generate500Page({\r\n statusCode: 500,\r\n title: 'Render Error',\r\n message: error.message || 'Failed to render page',\r\n stack: isDev ? error.stack : undefined,\r\n isDev,\r\n pathname: route.path\r\n }));\r\n }\r\n}\r\n\r\nasync function serveVelixInternal(pathname: string, req: http.IncomingMessage, res: http.ServerResponse, projectRoot: string) {\r\n // HMR endpoint for dev mode\r\n if (pathname === '/__velix/hmr') {\r\n res.writeHead(200, {\r\n 'Content-Type': 'text/event-stream',\r\n 'Cache-Control': 'no-cache',\r\n 'Connection': 'keep-alive',\r\n });\r\n res.write('data: connected\\n\\n');\r\n const interval = setInterval(() => res.write(':heartbeat\\n\\n'), 30000);\r\n // @ts-ignore\r\n if (res.req?.socket?.server?.__hmrClients) res.req.socket.server.__hmrClients.add(res);\r\n req.on('close', () => {\r\n clearInterval(interval);\r\n // @ts-ignore\r\n if (res.req?.socket?.server?.__hmrClients) res.req.socket.server.__hmrClients.delete(res);\r\n });\r\n return;\r\n }\r\n\r\n if (pathname === '/__velix/logo.webp') {\r\n const __filename = fileURLToPath(import.meta.url);\r\n const __dirname = path.dirname(__filename);\r\n // Check multiple possible locations for the logo\r\n const candidates = [\r\n path.join(__dirname, '..', 'assets', 'logo.webp'),\r\n path.join(__dirname, '..', '..', 'assets', 'logo.webp'),\r\n path.join(process.cwd(), 'node_modules', '@teamvelix', 'velix', 'assets', 'logo.webp'),\r\n path.join(process.cwd(), 'packages', 'velix', 'assets', 'logo.webp'),\r\n path.join(process.cwd(), 'node_modules', 'velix', 'assets', 'logo.webp'),\r\n path.join(process.cwd(), 'public', 'favicon.webp'),\r\n ];\r\n const logoPath = candidates.find(p => fs.existsSync(p));\r\n if (logoPath) {\r\n res.writeHead(200, { 'Content-Type': 'image/webp', 'Cache-Control': 'public, max-age=31536000, immutable' });\r\n res.end(fs.readFileSync(logoPath));\r\n } else {\r\n res.writeHead(404);\r\n res.end();\r\n }\r\n return;\r\n }\r\n\r\n // HMR Client Serving\r\n if (pathname === '/__velix/hmr-client.js') {\r\n try {\r\n const candidates = [\r\n path.join(process.cwd(), 'packages', 'velix-react', 'src', 'hmr', 'hmr-client.ts'),\r\n path.join(process.cwd(), 'node_modules', '@teamvelix', 'velix-react', 'src', 'hmr', 'hmr-client.ts'),\r\n path.join(__dirname, '..', '..', 'velix-react', 'src', 'hmr', 'hmr-client.ts')\r\n ];\r\n const hmrClientSrc = candidates.find(p => fs.existsSync(p));\r\n if (!hmrClientSrc) {\r\n res.writeHead(404);\r\n res.end();\r\n return;\r\n }\r\n const result = await esbuild.build({\r\n entryPoints: [hmrClientSrc],\r\n bundle: true,\r\n format: 'esm',\r\n platform: 'browser',\r\n target: ['es2022'],\r\n minify: true,\r\n write: false,\r\n });\r\n res.writeHead(200, { 'Content-Type': 'application/javascript', 'Cache-Control': 'no-cache' });\r\n res.end(result.outputFiles[0].text);\r\n return;\r\n } catch (err) {\r\n console.error('HMR Client build failed', err);\r\n res.writeHead(500);\r\n res.end();\r\n return;\r\n }\r\n }\r\n\r\n // Dynamic Island Serving\r\n if (pathname.startsWith('/__velix/islands/') && pathname.endsWith('.js')) {\r\n const componentName = pathname.replace('/__velix/islands/', '').replace('.js', '');\r\n try {\r\n // Find the component file\r\n const searchDirs = [\r\n path.join(projectRoot, 'components'),\r\n path.join(projectRoot, 'app'),\r\n path.join(projectRoot, 'islands')\r\n ];\r\n \r\n let componentPath = '';\r\n for (const dir of searchDirs) {\r\n if (!fs.existsSync(dir)) continue;\r\n const files = fs.readdirSync(dir, { recursive: true }) as string[];\r\n const found = files.find(f => f.replace(/\\\\/g, '/').endsWith(`${componentName}.tsx`) || f.replace(/\\\\/g, '/').endsWith(`${componentName}.jsx`));\r\n if (found) {\r\n componentPath = path.join(dir, found);\r\n break;\r\n }\r\n }\r\n\r\n if (!componentPath) {\r\n logger.error(`Island component not found: ${componentName}`);\r\n res.writeHead(404);\r\n res.end('Island component not found');\r\n return;\r\n }\r\n\r\n // Bundle on the fly\r\n const result = await esbuild.build({\r\n entryPoints: [componentPath],\r\n bundle: true,\r\n format: 'esm',\r\n platform: 'browser',\r\n target: ['es2022'],\r\n minify: false,\r\n sourcemap: 'inline',\r\n jsx: 'automatic',\r\n external: ['react', 'react-dom'],\r\n write: false,\r\n });\r\n\r\n res.writeHead(200, { 'Content-Type': 'application/javascript' });\r\n res.end(result.outputFiles[0].text);\r\n return;\r\n } catch (err: unknown) {\r\n const error = err as Error;\r\n logger.error(`Island bundling failed: ${componentName}`, error);\r\n res.writeHead(500);\r\n res.end(`console.error(\"Island bundling failed: ${error.message}\");`);\r\n return;\r\n }\r\n }\r\n\r\n // React & ReactDOM Client serving\r\n if (pathname === '/__velix/react.js' || pathname === '/__velix/react-dom-client.js') {\r\n const dep = pathname === '/__velix/react.js' ? 'react' : 'react-dom/client';\r\n try {\r\n const result = await esbuild.build({\r\n entryPoints: [dep],\r\n bundle: true,\r\n format: 'esm',\r\n platform: 'browser',\r\n target: ['es2022'],\r\n minify: true,\r\n write: false,\r\n });\r\n res.writeHead(200, { 'Content-Type': 'application/javascript', 'Cache-Control': 'public, max-age=31536000, immutable' });\r\n res.end(result.outputFiles[0].text);\r\n return;\r\n } catch (err: unknown) {\r\n res.writeHead(500);\r\n res.end();\r\n return;\r\n }\r\n }\r\n\r\n res.writeHead(404, { 'Content-Type': 'text/plain' });\r\n res.end('Not found');\r\n}\r\n\r\n// ============================================================================\r\n// Utilities\r\n// ============================================================================\r\n\r\nfunction parseRequestBody(req: http.IncomingMessage): Promise<unknown> {\r\n return new Promise((resolve, reject) => {\r\n let body = '';\r\n req.on('data', chunk => { body += chunk; });\r\n req.on('end', () => {\r\n try {\r\n const ct = req.headers['content-type'] || '';\r\n if (ct.includes('application/json')) resolve(JSON.parse(body));\r\n else resolve(body);\r\n } catch { resolve(body); }\r\n });\r\n req.on('error', reject);\r\n });\r\n}\r\n\r\nfunction parseRawBody(req: http.IncomingMessage): Promise<string> {\r\n return new Promise((resolve, reject) => {\r\n let body = '';\r\n req.on('data', chunk => { body += chunk; });\r\n req.on('end', () => resolve(body));\r\n req.on('error', reject);\r\n });\r\n}\r\n\r\nexport default { createServer, tailwindPlugin };\r\n","/**\n * Velix v5 Configuration System\n * Handles loading, validation, and merging of velix.config.ts\n */\n\nimport fs from 'fs';\nimport path from 'path';\nimport { pathToFileURL } from 'url';\nimport { z } from 'zod';\nimport pc from 'picocolors';\n\n// ============================================================================\n// Configuration Schema (Zod validation)\n// ============================================================================\n\nconst AppConfigSchema = z.object({\n name: z.string().default('Velix App'),\n url: z.string().url().optional(),\n}).default({});\n\nconst ServerConfigSchema = z.object({\n port: z.number().min(1).max(65535).default(3000),\n host: z.string().default('localhost'),\n}).default({});\n\nconst RoutingConfigSchema = z.object({\n trailingSlash: z.boolean().default(false),\n}).default({});\n\nconst SEOConfigSchema = z.object({\n sitemap: z.boolean().default(true),\n robots: z.boolean().default(true),\n openGraph: z.boolean().default(true),\n}).default({});\n\nconst BuildConfigSchema = z.object({\n target: z.string().default('es2022'),\n minify: z.boolean().default(true),\n sourcemap: z.boolean().default(true),\n splitting: z.boolean().default(true),\n outDir: z.string().default('.velix'),\n}).default({});\n\nconst ExperimentalConfigSchema = z.object({\n islands: z.boolean().default(true),\n streaming: z.boolean().default(true),\n}).default({});\n\nconst PluginSchema = z.union([\n z.string(),\n z.object({\n name: z.string()\n }).passthrough(),\n]);\n\nexport const VelixConfigSchema = z.object({\n // App identity\n app: AppConfigSchema,\n\n // DevTools toggle\n devtools: z.boolean().default(true),\n\n // Server options\n server: ServerConfigSchema,\n\n // Routing options\n routing: RoutingConfigSchema,\n\n // SEO configuration\n seo: SEOConfigSchema,\n\n // Build options\n build: BuildConfigSchema,\n\n // Experimental features\n experimental: ExperimentalConfigSchema,\n\n // Plugins\n plugins: z.array(PluginSchema).default([]),\n\n // Directories (resolved automatically)\n appDir: z.string().default('app'),\n publicDir: z.string().default('public'),\n\n // Stylesheets\n styles: z.array(z.string()).default([]),\n\n // Favicon\n favicon: z.string().nullable().default(null),\n});\n\nexport type VelixConfig = z.infer<typeof VelixConfigSchema>;\n\n// ============================================================================\n// Default configuration\n// ============================================================================\n\nexport const defaultConfig: VelixConfig = VelixConfigSchema.parse({});\n\n// ============================================================================\n// defineConfig helper\n// ============================================================================\n\n/**\n * Helper function to define configuration with full type support.\n * Use this in your velix.config.ts file.\n *\n * @example\n * ```ts\n * import { defineConfig } from \"velix\";\n *\n * export default defineConfig({\n * app: { name: \"My App\" },\n * server: { port: 3000 },\n * seo: { sitemap: true }\n * });\n * ```\n */\nexport function defineConfig(config: Partial<VelixConfig>): Partial<VelixConfig> {\n return config;\n}\n\n// ============================================================================\n// Config Loader\n// ============================================================================\n\n/**\n * Loads and validates configuration from velix.config.ts\n */\nexport async function loadConfig(projectRoot: string): Promise<VelixConfig> {\n const configPathTs = path.join(projectRoot, 'velix.config.ts');\n const configPathJs = path.join(projectRoot, 'velix.config.js');\n // Support legacy config for migration\n const configPathLegacyTs = path.join(projectRoot, 'flexireact.config.ts');\n const configPathLegacyJs = path.join(projectRoot, 'flexireact.config.js');\n\n let configPath: string | null = null;\n if (fs.existsSync(configPathTs)) configPath = configPathTs;\n else if (fs.existsSync(configPathJs)) configPath = configPathJs;\n else if (fs.existsSync(configPathLegacyTs)) configPath = configPathLegacyTs;\n else if (fs.existsSync(configPathLegacyJs)) configPath = configPathLegacyJs;\n\n let userConfig: Partial<VelixConfig> = {};\n\n if (configPath) {\n try {\n const configUrl = pathToFileURL(configPath).href;\n const module = await import(`${configUrl}?t=${Date.now()}`);\n userConfig = module.default || module;\n } catch (error: any) {\n console.warn(pc.yellow(`⚠ Failed to load config: ${error.message}`));\n }\n }\n\n // Merge and validate with Zod\n const merged = deepMerge(defaultConfig, userConfig as Record<string, any>);\n\n try {\n return VelixConfigSchema.parse(merged);\n } catch (err: unknown) {\n if (err instanceof z.ZodError) {\n console.error(pc.red('✖ Configuration validation failed:'));\n for (const issue of err.issues) {\n console.error(pc.dim(` - ${issue.path.join('.')}: ${issue.message}`));\n }\n process.exit(1);\n }\n throw err;\n }\n}\n\n// ============================================================================\n// Path Resolution\n// ============================================================================\n\n/**\n * Resolves all paths in config relative to project root\n */\nexport function resolvePaths(config: VelixConfig, projectRoot: string): VelixConfig & { resolvedAppDir: string; resolvedPublicDir: string; resolvedOutDir: string } {\n return {\n ...config,\n resolvedAppDir: path.resolve(projectRoot, config.appDir),\n resolvedPublicDir: path.resolve(projectRoot, config.publicDir),\n resolvedOutDir: path.resolve(projectRoot, config.build.outDir),\n };\n}\n\n// ============================================================================\n// Utility: Deep merge\n// ============================================================================\n\nfunction deepMerge(target: Record<string, any>, source: Record<string, any>): Record<string, any> {\n const result = { ...target };\n\n for (const key in source) {\n if (source[key] && typeof source[key] === 'object' && !Array.isArray(source[key])) {\n result[key] = deepMerge(target[key] || {}, source[key]);\n } else {\n result[key] = source[key];\n }\n }\n\n return result;\n}\n","/**\n * Velix v5 Router\n * File-based routing using the app/ directory convention\n *\n * Supports:\n * - app/page.tsx → /\n * - app/dashboard/page.tsx → /dashboard\n * - app/blog/[slug]/page.tsx → /blog/:slug\n * - app/(group)/page.tsx → / (route groups)\n * - app/[...slug]/page.tsx → catch-all routes\n * - layout.tsx, loading.tsx, error.tsx, not-found.tsx\n */\n\nimport fs from 'fs';\nimport path from 'path';\nimport { isServerComponent, isClientComponent, isIsland } from '../utils.js';\nimport type { Route, RouteTree as TypedRouteTree, RouteTreeNode } from '../types.js';\n\n// ============================================================================\n// Route Types\n// ============================================================================\n\nexport const RouteType = {\n PAGE: 'page',\n API: 'api',\n LAYOUT: 'layout',\n LOADING: 'loading',\n ERROR: 'error',\n NOT_FOUND: 'not-found'\n} as const;\n\n// ============================================================================\n// Build Route Tree\n// ============================================================================\n\n/**\n * Builds the complete route tree from the app/ directory\n */\nexport function buildRouteTree(appDir: string) {\n const projectRoot = path.dirname(appDir);\n\n const routes: {\n pages: Route[];\n api: Route[];\n layouts: Map<string, string>;\n tree: RouteTreeNode;\n appRoutes: Route[];\n rootLayout?: string;\n } = {\n pages: [],\n api: [],\n layouts: new Map(),\n tree: { children: {}, routes: [] },\n appRoutes: [],\n };\n\n // Scan app/ directory\n if (fs.existsSync(appDir)) {\n scanAppDirectory(appDir, appDir, routes);\n }\n\n // Scan server/api/ for API routes\n const serverApiDir = path.join(projectRoot, 'server', 'api');\n if (fs.existsSync(serverApiDir)) {\n scanApiDirectory(serverApiDir, serverApiDir, routes);\n }\n\n // Check for root layout\n const rootLayoutTsx = path.join(appDir, 'layout.tsx');\n const rootLayoutJsx = path.join(appDir, 'layout.jsx');\n if (fs.existsSync(rootLayoutTsx)) routes.rootLayout = rootLayoutTsx;\n else if (fs.existsSync(rootLayoutJsx)) routes.rootLayout = rootLayoutJsx;\n\n // Build route tree for nested routes\n routes.tree = buildTree(routes.appRoutes);\n\n return routes;\n}\n\n// ============================================================================\n// App Directory Scanner\n// ============================================================================\n\n/**\n * Scans app/ directory for file-based routing\n * Supports: page.tsx, layout.tsx, loading.tsx, error.tsx, not-found.tsx, [param].tsx\n */\nfunction scanAppDirectory(\n baseDir: string,\n currentDir: string,\n routes: { appRoutes: Route[] },\n parentSegments: string[] = [],\n parentLayout: string | null = null,\n parentMiddleware: string | null = null\n) {\n const entries = fs.readdirSync(currentDir, { withFileTypes: true });\n\n // Find special files in current directory\n const specialFiles: Record<string, string | null> = {\n page: null,\n layout: null,\n loading: null,\n error: null,\n notFound: null,\n template: null,\n middleware: null\n };\n\n for (const entry of entries) {\n if (entry.isFile()) {\n const name = entry.name.replace(/\\.(jsx|js|tsx|ts)$/, '');\n const fullPath = path.join(currentDir, entry.name);\n const ext = path.extname(entry.name);\n\n // Only process relevant extensions\n if (!['.tsx', '.jsx', '.ts', '.js'].includes(ext)) continue;\n\n if (name === 'page') specialFiles.page = fullPath;\n if (name === 'layout') specialFiles.layout = fullPath;\n if (name === 'loading') specialFiles.loading = fullPath;\n if (name === 'error') specialFiles.error = fullPath;\n if (name === 'not-found') specialFiles.notFound = fullPath;\n if (name === 'template') specialFiles.template = fullPath;\n if (name === 'middleware' || name === '_middleware') specialFiles.middleware = fullPath;\n\n // Handle [param].tsx files directly in app/ (alternative to [param]/page.tsx)\n if (name.startsWith('[') && name.endsWith(']') && ['.tsx', '.jsx'].includes(ext)) {\n const paramName = name.slice(1, -1);\n let segmentName: string;\n\n if (paramName.startsWith('...')) {\n segmentName = '*' + paramName.slice(3);\n } else {\n segmentName = ':' + paramName;\n }\n\n const routePath = '/' + [...parentSegments, segmentName].join('/');\n\n routes.appRoutes.push({\n type: RouteType.PAGE,\n path: routePath.replace(/\\/+/g, '/'),\n filePath: fullPath,\n pattern: createRoutePattern(routePath),\n segments: [...parentSegments, segmentName],\n layout: specialFiles.layout || parentLayout,\n loading: specialFiles.loading,\n error: specialFiles.error,\n notFound: specialFiles.notFound,\n template: specialFiles.template,\n middleware: specialFiles.middleware || parentMiddleware,\n isServerComponent: isServerComponent(fullPath),\n isClientComponent: isClientComponent(fullPath),\n isIsland: isIsland(fullPath),\n });\n }\n }\n }\n\n // If there's a page.tsx, create a route for this directory\n if (specialFiles.page) {\n const routePath = '/' + parentSegments.join('/') || '/';\n\n routes.appRoutes.push({\n type: RouteType.PAGE,\n path: routePath.replace(/\\/+/g, '/') || '/',\n filePath: specialFiles.page,\n pattern: createRoutePattern(routePath || '/'),\n segments: parentSegments,\n layout: specialFiles.layout || parentLayout,\n loading: specialFiles.loading,\n error: specialFiles.error,\n notFound: specialFiles.notFound,\n template: specialFiles.template,\n middleware: specialFiles.middleware || parentMiddleware,\n isServerComponent: isServerComponent(specialFiles.page),\n isClientComponent: isClientComponent(specialFiles.page),\n isIsland: isIsland(specialFiles.page),\n });\n }\n\n // Recursively scan subdirectories\n for (const entry of entries) {\n if (entry.isDirectory()) {\n const fullPath = path.join(currentDir, entry.name);\n\n // Skip special directories\n if (entry.name.startsWith('_') || entry.name.startsWith('.')) continue;\n\n // Handle route groups (parentheses) — don't add to URL\n const isGroup = entry.name.startsWith('(') && entry.name.endsWith(')');\n\n // Handle dynamic segments [param]\n let segmentName = entry.name;\n if (entry.name.startsWith('[') && entry.name.endsWith(']')) {\n segmentName = ':' + entry.name.slice(1, -1);\n if (entry.name.startsWith('[...')) {\n segmentName = '*' + entry.name.slice(4, -1);\n }\n if (entry.name.startsWith('[[...')) {\n segmentName = '*' + entry.name.slice(5, -2);\n }\n }\n\n const newSegments = isGroup ? parentSegments : [...parentSegments, segmentName];\n const newLayout = specialFiles.layout || parentLayout;\n const newMiddleware = specialFiles.middleware || parentMiddleware;\n\n scanAppDirectory(baseDir, fullPath, routes, newSegments, newLayout, newMiddleware);\n }\n }\n}\n\n// ============================================================================\n// API Directory Scanner (server/api/)\n// ============================================================================\n\nfunction scanApiDirectory(baseDir: string, currentDir: string, routes: { api: Route[] }, parentSegments: string[] = []) {\n const entries = fs.readdirSync(currentDir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = path.join(currentDir, entry.name);\n\n if (entry.isDirectory()) {\n scanApiDirectory(baseDir, fullPath, routes, [...parentSegments, entry.name]);\n } else if (entry.isFile()) {\n const ext = path.extname(entry.name);\n if (!['.ts', '.js'].includes(ext)) continue;\n\n const baseName = path.basename(entry.name, ext);\n // route.ts maps to the parent path, other names become segments\n const apiSegments = baseName === 'route' || baseName === 'index'\n ? parentSegments\n : [...parentSegments, baseName];\n\n const apiPath = '/api/' + apiSegments.join('/');\n\n routes.api.push({\n type: RouteType.API,\n path: apiPath.replace(/\\/+/g, '/') || '/api',\n filePath: fullPath,\n pattern: createRoutePattern(apiPath),\n segments: ['api', ...apiSegments].filter(Boolean),\n });\n }\n }\n}\n\n// ============================================================================\n// Route Matching\n// ============================================================================\n\n/**\n * Creates regex pattern for route matching\n */\nfunction createRoutePattern(routePath: string): RegExp {\n let pattern = routePath\n .replace(/\\*[^/]*/g, '(.*)') // Catch-all\n .replace(/:[^/]+/g, '([^/]+)') // Dynamic segments\n .replace(/\\//g, '\\\\/');\n\n return new RegExp(`^${pattern}$`);\n}\n\n/**\n * Matches URL path against routes\n */\nexport function matchRoute(urlPath: string, routes: Route[]) {\n const normalizedPath = urlPath === '' ? '/' : urlPath.split('?')[0];\n\n for (const route of routes) {\n const match = normalizedPath.match(route.pattern);\n if (match) {\n const params = extractParams(route.path, match);\n return { ...route, params };\n }\n }\n\n return null;\n}\n\n/**\n * Extracts parameters from route match\n */\nfunction extractParams(routePath: string, match: RegExpMatchArray): Record<string, string> {\n const params: Record<string, string> = {};\n const paramNames: string[] = [];\n\n const paramRegex = /:([^/]+)|\\*([^/]*)/g;\n let paramMatch;\n while ((paramMatch = paramRegex.exec(routePath)) !== null) {\n paramNames.push(paramMatch[1] || paramMatch[2] || 'splat');\n }\n\n paramNames.forEach((name, index) => {\n params[name] = match[index + 1];\n });\n\n return params;\n}\n\n// ============================================================================\n// Layout Resolution\n// ============================================================================\n\n/**\n * Finds all layouts that apply to a route\n */\nexport function findRouteLayouts(route: Route, layoutsMap: Map<string, string>): Array<{ name: string; filePath: string | undefined }> {\n const layouts: Array<{ name: string; filePath: string | undefined }> = [];\n\n // Check for segment-based layouts\n for (const segment of route.segments) {\n if (layoutsMap.has(segment)) {\n layouts.push({ name: segment, filePath: layoutsMap.get(segment) });\n }\n }\n\n // Check for route-specific layout\n if (route.layout) {\n layouts.push({ name: 'route', filePath: route.layout });\n }\n\n // Check for root layout\n if (layoutsMap.has('root')) {\n layouts.unshift({ name: 'root', filePath: layoutsMap.get('root') });\n }\n\n return layouts;\n}\n\n// ============================================================================\n// Tree Building\n// ============================================================================\n\nfunction buildTree(routes: Route[]): RouteTreeNode {\n const tree: RouteTreeNode = { children: {}, routes: [] };\n\n for (const route of routes) {\n let current = tree;\n for (const segment of route.segments) {\n if (!current.children[segment]) {\n current.children[segment] = { children: {}, routes: [] };\n }\n current = current.children[segment];\n }\n current.routes.push(route);\n }\n\n return tree;\n}\n\n// ============================================================================\n// Default Export\n// ============================================================================\n\nexport default {\n buildRouteTree,\n matchRoute,\n findRouteLayouts,\n RouteType\n};\n","/**\n * Velix v5 Utility Functions\n */\n\nimport fs from 'fs';\nimport path from 'path';\nimport crypto from 'crypto';\n\n/**\n * Generates a unique hash for cache busting\n */\nexport function generateHash(content: string): string {\n return crypto.createHash('md5').update(content).digest('hex').slice(0, 8);\n}\n\n/**\n * Escapes HTML special characters\n */\nexport function escapeHtml(str: string): string {\n const htmlEntities: Record<string, string> = {\n '&': '&', '<': '<', '>': '>',\n '\"': '"', \"'\": '''\n };\n return String(str).replace(/[&<>\"']/g, char => htmlEntities[char]);\n}\n\n/**\n * Recursively finds all files matching a pattern\n */\nexport function findFiles(dir: string, pattern: RegExp, files: string[] = []): string[] {\n if (!fs.existsSync(dir)) return files;\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n if (entry.isDirectory()) findFiles(fullPath, pattern, files);\n else if (pattern.test(entry.name)) files.push(fullPath);\n }\n return files;\n}\n\n/**\n * Ensures a directory exists\n */\nexport function ensureDir(dir: string): void {\n if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });\n}\n\n/**\n * Cleans a directory\n */\nexport function cleanDir(dir: string): void {\n if (fs.existsSync(dir)) fs.rmSync(dir, { recursive: true, force: true });\n fs.mkdirSync(dir, { recursive: true });\n}\n\n/**\n * Copies a directory recursively\n */\nexport function copyDir(src: string, dest: string): void {\n ensureDir(dest);\n const entries = fs.readdirSync(src, { withFileTypes: true });\n for (const entry of entries) {\n const srcPath = path.join(src, entry.name);\n const destPath = path.join(dest, entry.name);\n if (entry.isDirectory()) copyDir(srcPath, destPath);\n else fs.copyFileSync(srcPath, destPath);\n }\n}\n\n/**\n * Debounce function for file watching\n */\nexport function debounce<T extends (...args: unknown[]) => unknown>(fn: T, delay: number): (...args: Parameters<T>) => void {\n let timeout: ReturnType<typeof setTimeout> | undefined;\n return (...args: Parameters<T>) => {\n clearTimeout(timeout);\n timeout = setTimeout(() => fn(...args), delay);\n };\n}\n\n/**\n * Formats bytes to human-readable string\n */\nexport function formatBytes(bytes: number): string {\n if (bytes === 0) return '0 B';\n const k = 1024;\n const sizes = ['B', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];\n}\n\n/**\n * Formats milliseconds to human-readable string\n */\nexport function formatTime(ms: number): string {\n if (ms < 1000) return `${ms}ms`;\n return `${(ms / 1000).toFixed(2)}s`;\n}\n\n/**\n * Creates a deferred promise\n */\nexport function createDeferred<T>() {\n let resolve: (value: T | PromiseLike<T>) => void;\n let reject: (reason?: unknown) => void;\n const promise = new Promise<T>((res, rej) => {\n resolve = res;\n reject = rej;\n });\n return { promise, resolve: resolve!, reject: reject! };\n}\n\n/**\n * Sleep utility\n */\nexport function sleep(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n}\n\n/**\n * Check if a file is a server component (has 'use server' directive)\n */\nexport function isServerComponent(filePath: string): boolean {\n try {\n const content = fs.readFileSync(filePath, 'utf-8');\n const firstLine = content.split('\\n')[0].trim();\n return firstLine === \"'use server'\" || firstLine === '\"use server\"';\n } catch { return false; }\n}\n\n/**\n * Check if a file is a client component (has 'use client' directive)\n */\nexport function isClientComponent(filePath: string): boolean {\n try {\n const content = fs.readFileSync(filePath, 'utf-8');\n const firstLine = content.split('\\n')[0].trim();\n return firstLine === \"'use client'\" || firstLine === '\"use client\"';\n } catch { return false; }\n}\n\n/**\n * Check if a component is an island (has 'use island' directive)\n */\nexport function isIsland(filePath: string): boolean {\n try {\n const content = fs.readFileSync(filePath, 'utf-8');\n const firstLine = content.split('\\n')[0].trim();\n return firstLine === \"'use island'\" || firstLine === '\"use island\"';\n } catch { return false; }\n}\n","/**\n * Velix v5 Middleware System\n * Request processing pipeline with composable middleware\n */\n\nimport fs from 'fs';\nimport path from 'path';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface MiddlewareRequest {\n url: string;\n method: string;\n headers: Record<string, string | string[] | undefined>;\n cookies: Record<string, string>;\n params: Record<string, string>;\n query: Record<string, string>;\n body?: unknown;\n raw: import('http').IncomingMessage;\n}\n\nexport interface MiddlewareResponse {\n status: (code: number) => MiddlewareResponse;\n header: (name: string, value: string) => MiddlewareResponse;\n json: (data: unknown) => void;\n redirect: (url: string, status?: number) => void;\n rewrite: (url: string) => void;\n next: () => Promise<void>;\n _statusCode: number;\n _headers: Record<string, string>;\n _redirectUrl: string | null;\n _rewriteUrl: string | null;\n _ended: boolean;\n}\n\nexport type MiddlewareFunction = (\n req: MiddlewareRequest,\n res: MiddlewareResponse,\n next: () => Promise<void>\n) => void | Promise<void>;\n\nexport type MiddlewareResult = {\n continue: boolean;\n rewritten: boolean;\n};\n\n// ============================================================================\n// Built-in Middleware Registry\n// ============================================================================\n\nexport const middlewares = {\n cors(options: {\n origin?: string | string[];\n methods?: string[];\n headers?: string[];\n credentials?: boolean;\n maxAge?: number;\n } = {}): MiddlewareFunction {\n const {\n origin = '*',\n methods = ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'OPTIONS'],\n headers: allowHeaders = ['Content-Type', 'Authorization'],\n credentials = false,\n maxAge = 86400\n } = options;\n\n return async (req, res, next) => {\n const originHeader = typeof origin === 'string' ? origin : origin.includes(req.headers.origin as string) ? req.headers.origin as string : '';\n\n res.header('Access-Control-Allow-Origin', originHeader);\n res.header('Access-Control-Allow-Methods', methods.join(', '));\n res.header('Access-Control-Allow-Headers', allowHeaders.join(', '));\n res.header('Access-Control-Max-Age', String(maxAge));\n\n if (credentials) {\n res.header('Access-Control-Allow-Credentials', 'true');\n }\n\n if (req.method === 'OPTIONS') {\n res.status(204);\n return;\n }\n\n await next();\n };\n },\n\n rateLimit(options: {\n windowMs?: number;\n max?: number;\n message?: string;\n } = {}): MiddlewareFunction {\n const { windowMs = 60000, max = 100, message = 'Too many requests' } = options;\n const store = new Map<string, { count: number; resetTime: number }>();\n\n return async (req, res, next) => {\n const ip = req.headers['x-forwarded-for'] as string || 'unknown';\n const now = Date.now();\n const record = store.get(ip);\n\n if (!record || now > record.resetTime) {\n store.set(ip, { count: 1, resetTime: now + windowMs });\n } else if (record.count >= max) {\n res.status(429).json({ error: message });\n return;\n } else {\n record.count++;\n }\n\n await next();\n };\n },\n\n security(): MiddlewareFunction {\n return async (_req, res, next) => {\n res.header('X-Content-Type-Options', 'nosniff');\n res.header('X-Frame-Options', 'DENY');\n res.header('X-XSS-Protection', '1; mode=block');\n res.header('Referrer-Policy', 'strict-origin-when-cross-origin');\n await next();\n };\n },\n};\n\n// ============================================================================\n// Middleware Loader\n// ============================================================================\n\n/**\n * Loads proxy middleware from the project root (proxy.ts or proxy.js)\n */\nexport async function loadMiddleware(projectRoot: string): Promise<MiddlewareFunction[]> {\n const fns: MiddlewareFunction[] = [];\n const possibleFiles = ['proxy.ts', 'proxy.js'];\n\n for (const file of possibleFiles) {\n const filePath = path.join(projectRoot, file);\n if (!fs.existsSync(filePath)) continue;\n\n try {\n const { pathToFileURL } = await import('url');\n const url = pathToFileURL(filePath).href;\n const mod = await import(`${url}?t=${Date.now()}`);\n const fn = mod.default || mod.proxy || mod.middleware;\n if (typeof fn === 'function') {\n fns.push(fn);\n break; // Only load the first found proxy file\n }\n } catch (err: unknown) {\n const error = err as Error;\n console.warn(`⚠ Failed to load proxy ${file}: ${error.message}`);\n }\n }\n\n return fns;\n}\n\n// ============================================================================\n// Middleware Runner\n// ============================================================================\n\n/**\n * Runs middleware chain for a request\n */\nexport async function runMiddleware(\n req: import('http').IncomingMessage,\n res: import('http').ServerResponse,\n fns: MiddlewareFunction[]\n): Promise<MiddlewareResult> {\n const result: MiddlewareResult = { continue: true, rewritten: false };\n if (fns.length === 0) return result;\n\n const url = new URL(req.url || '/', `http://${req.headers.host || 'localhost'}`);\n const cookies: Record<string, string> = {};\n const cookieHeader = req.headers.cookie;\n if (cookieHeader) {\n cookieHeader.split(';').forEach(c => {\n const [k, ...v] = c.split('=');\n if (k) cookies[k.trim()] = v.join('=').trim();\n });\n }\n\n const mReq: MiddlewareRequest = {\n url: req.url || '/',\n method: req.method || 'GET',\n headers: req.headers as Record<string, string>,\n cookies,\n params: {},\n query: Object.fromEntries(url.searchParams),\n raw: req,\n };\n\n let ended = false;\n const mRes: MiddlewareResponse = {\n _statusCode: 200,\n _headers: {},\n _redirectUrl: null,\n _rewriteUrl: null,\n _ended: false,\n status(code) { this._statusCode = code; return this; },\n header(name, value) { this._headers[name] = value; return this; },\n json(data) {\n this._headers['Content-Type'] = 'application/json';\n res.writeHead(this._statusCode, this._headers);\n res.end(JSON.stringify(data));\n this._ended = true;\n ended = true;\n },\n redirect(url, status = 307) {\n this._redirectUrl = url;\n this._statusCode = status;\n res.writeHead(status, { Location: url, ...this._headers });\n res.end();\n this._ended = true;\n ended = true;\n },\n rewrite(url) {\n this._rewriteUrl = url;\n req.url = url;\n result.rewritten = true;\n },\n async next() { /* handled by chain */ },\n };\n\n // Run middleware chain\n let index = 0;\n const next = async () => {\n if (ended || index >= fns.length) return;\n const fn = fns[index++];\n await fn(mReq, mRes, next);\n };\n\n await next();\n\n // Apply headers that were set\n if (!ended) {\n for (const [key, value] of Object.entries(mRes._headers)) {\n res.setHeader(key, value);\n }\n }\n\n result.continue = !ended;\n return result;\n}\n\n/**\n * Compose multiple middleware into one\n */\nexport function composeMiddleware(...fns: MiddlewareFunction[]): MiddlewareFunction {\n return async (req, res, next) => {\n let index = 0;\n const run = async () => {\n if (index >= fns.length) { await next(); return; }\n const fn = fns[index++];\n await fn(req, res, run);\n };\n await run();\n };\n}\n","/**\n * Velix v5 Plugin System\n * Extensible hook-based plugin architecture\n */\n\nimport fs from 'fs';\nimport path from 'path';\nimport { pathToFileURL } from 'url';\n\n// ============================================================================\n// Plugin Hooks\n// ============================================================================\n\nexport const PluginHooks = {\n CONFIG: 'config',\n SERVER_START: 'server:start',\n REQUEST: 'request',\n RESPONSE: 'response',\n ROUTES_LOADED: 'routes:loaded',\n BEFORE_RENDER: 'render:before',\n AFTER_RENDER: 'render:after',\n BUILD_START: 'build:start',\n BUILD_END: 'build:end',\n} as const;\n\nexport type PluginHook = typeof PluginHooks[keyof typeof PluginHooks];\n\n// ============================================================================\n// Plugin Interface\n// ============================================================================\n\nexport interface PluginHookArgs {\n [PluginHooks.CONFIG]: [config: import('../config.js').VelixConfig];\n [PluginHooks.SERVER_START]: [context: { config: import('../config.js').VelixConfig; isDev: boolean; projectRoot: string }, isDev: boolean];\n [PluginHooks.REQUEST]: [req: import('http').IncomingMessage, res: import('http').ServerResponse];\n [PluginHooks.RESPONSE]: [req: import('http').IncomingMessage, res: import('http').ServerResponse, duration: number];\n [PluginHooks.ROUTES_LOADED]: [routes: import('../types.js').RouteTree];\n [PluginHooks.BEFORE_RENDER]: [html: string, context: { route: import('../types.js').Route; config: import('../config.js').VelixConfig; isDev: boolean }];\n [PluginHooks.AFTER_RENDER]: [html: string, context: { route: import('../types.js').Route; config: import('../config.js').VelixConfig; isDev: boolean }];\n [PluginHooks.BUILD_START]: [];\n [PluginHooks.BUILD_END]: [stats: { time: number }];\n}\n\nexport interface VelixPluginDefinition {\n name: string;\n version?: string;\n setup?: (config: import('../config.js').VelixConfig) => void | Promise<void>;\n hooks?: { [K in PluginHook]?: (...args: PluginHookArgs[K]) => unknown };\n [key: string]: unknown; // Allow for Zod passthrough and extra properties\n}\n\n// ============================================================================\n// Plugin Manager\n// ============================================================================\n\nexport class PluginManager {\n private plugins: VelixPluginDefinition[] = [];\n private hooks: Map<string, Array<(...args: any[]) => any>> = new Map();\n\n /**\n * Register a plugin\n */\n register(plugin: VelixPluginDefinition) {\n this.plugins.push(plugin);\n\n // Register hooks\n if (plugin.hooks) {\n for (const [hookName, handler] of Object.entries(plugin.hooks)) {\n if (handler) {\n const existing = this.hooks.get(hookName) || [];\n existing.push(handler);\n this.hooks.set(hookName, existing);\n }\n }\n }\n }\n\n /**\n * Run a hook with arguments\n */\n async runHook<K extends PluginHook>(hookName: K, ...args: PluginHookArgs[K]): Promise<void> {\n const handlers = this.hooks.get(hookName) || [];\n for (const handler of handlers) {\n await handler(...args);\n }\n }\n\n /**\n * Run a waterfall hook — each handler transforms the first argument\n */\n async runWaterfallHook<K extends PluginHook>(hookName: K, value: PluginHookArgs[K][0], ...args: PluginHookArgs[K] extends [unknown, ...infer Rest] ? Rest : []): Promise<PluginHookArgs[K][0]> {\n const handlers = this.hooks.get(hookName) || [];\n let result = value;\n for (const handler of handlers) {\n const transformed = await handler(result, ...args);\n if (transformed !== undefined) result = transformed;\n }\n return result;\n }\n\n /**\n * Get all registered plugins\n */\n getPlugins(): VelixPluginDefinition[] {\n return [...this.plugins];\n }\n\n /**\n * Check if a plugin is registered\n */\n hasPlugin(name: string): boolean {\n return this.plugins.some(p => p.name === name);\n }\n}\n\n// ============================================================================\n// Global Instance\n// ============================================================================\n\nexport const pluginManager = new PluginManager();\n\n// ============================================================================\n// Plugin Loader\n// ============================================================================\n\n/**\n * Load plugins from project configuration\n */\nexport async function loadPlugins(projectRoot: string, config: { plugins?: unknown[] }): Promise<void> {\n const pluginEntries = config.plugins || [];\n\n for (const entry of pluginEntries) {\n try {\n if (typeof entry === 'string') {\n // Load plugin by name (from plugins/ dir or node_modules)\n const localPath = path.join(projectRoot, 'plugins', entry + '.ts');\n const localPathJs = path.join(projectRoot, 'plugins', entry + '.js');\n const localPathDir = path.join(projectRoot, 'plugins', entry, 'index.ts');\n\n let pluginPath: string | null = null;\n if (fs.existsSync(localPath)) pluginPath = localPath;\n else if (fs.existsSync(localPathJs)) pluginPath = localPathJs;\n else if (fs.existsSync(localPathDir)) pluginPath = localPathDir;\n\n if (pluginPath) {\n const url = pathToFileURL(pluginPath).href;\n const mod = await import(`${url}?t=${Date.now()}`);\n const plugin = mod.default || mod;\n if (plugin.name) {\n pluginManager.register(plugin);\n }\n } else {\n // Try node_modules\n try {\n const mod = await import(entry);\n const plugin = mod.default || mod;\n if (plugin.name) pluginManager.register(plugin);\n } catch {\n console.warn(`⚠ Plugin not found: ${entry}`);\n }\n }\n } else if (typeof entry === 'object' && entry !== null && 'name' in entry) {\n // Inline plugin definition\n pluginManager.register(entry as VelixPluginDefinition);\n }\n } catch (err: unknown) {\n const error = err as Error;\n console.warn(`⚠ Failed to load plugin: ${error?.message || String(error)}`);\n }\n }\n}\n\n// ============================================================================\n// Plugin Definition Helper\n// ============================================================================\n\n/**\n * Helper to define a Velix plugin with type safety.\n *\n * @example\n * ```ts\n * export default definePlugin({\n * name: 'my-plugin',\n * hooks: {\n * 'server:start': (server) => {\n * console.log('Server started!');\n * }\n * }\n * });\n * ```\n */\nexport function definePlugin(definition: VelixPluginDefinition): VelixPluginDefinition {\n return definition;\n}\n\n// ============================================================================\n// Built-in Plugins\n// ============================================================================\n\nexport const builtinPlugins = {\n /**\n * Security headers plugin\n */\n security: definePlugin({\n name: 'velix:security',\n hooks: {\n [PluginHooks.RESPONSE]: (_req: unknown, res: unknown) => {\n const response = res as import('http').ServerResponse;\n if (!response.headersSent) {\n response.setHeader('X-Content-Type-Options', 'nosniff');\n response.setHeader('X-Frame-Options', 'DENY');\n response.setHeader('X-XSS-Protection', '1; mode=block');\n }\n }\n }\n }),\n\n /**\n * Request logging plugin\n */\n logger: definePlugin({\n name: 'velix:logger',\n hooks: {\n [PluginHooks.RESPONSE]: (req: unknown, _res: unknown, duration: unknown) => {\n const request = req as import('http').IncomingMessage;\n console.log(` ${request.method} ${request.url} ${duration}ms`);\n }\n }\n }),\n};\n","import { spawnSync, spawn } from 'child_process';\nimport fs from 'fs';\nimport path from 'path';\nimport { PluginHooks, definePlugin } from './index.js';\nimport logger from '../logger.js';\n\nexport interface TailwindPluginOptions {\n input?: string;\n output?: string;\n config?: string;\n minify?: boolean;\n}\n\n/**\n * Detect which Tailwind CLI is available (v4: @tailwindcss/cli, v3: tailwindcss)\n */\nfunction detectTailwindCli(): string {\n // Try v4 CLI first\n const v4 = spawnSync('npx @tailwindcss/cli --help', {\n stdio: 'pipe',\n timeout: 15000,\n shell: true,\n });\n if (v4.status === 0) return '@tailwindcss/cli';\n\n // Fallback to v3 CLI\n return 'tailwindcss';\n}\n\n/**\n * Native Velix Tailwind CSS Plugin\n * Automatically handles CSS compilation and injection.\n * Supports both Tailwind CSS v3 and v4.\n */\nexport default function tailwindPlugin(options: TailwindPluginOptions = {}) {\n const input = options.input || './app/globals.css';\n const output = options.output || './public/tailwind.css';\n const configPath = options.config || './tailwind.config.ts';\n let cliCmd: string | null = null;\n\n function getCli(): string {\n if (!cliCmd) cliCmd = detectTailwindCli();\n return cliCmd;\n }\n\n return definePlugin({\n name: 'velix:tailwind',\n hooks: {\n [PluginHooks.CONFIG]: (configArg: unknown) => {\n const config = configArg as import('../config.js').VelixConfig;\n // Automatically ensure the output CSS is in the styles array\n const relativeOutput = output.startsWith('./') ? output.substring(1) : output;\n const stylePath = relativeOutput.startsWith('/public') ? relativeOutput.substring(7) : relativeOutput;\n \n if (!config.styles) config.styles = [];\n if (!config.styles.includes(stylePath)) {\n config.styles.push(stylePath);\n }\n },\n\n [PluginHooks.BUILD_START]: async () => {\n logger.info('Building Tailwind CSS...');\n try {\n const cli = getCli();\n let cmd = `npx ${cli} -i \"${input}\" -o \"${output}\"`;\n if (options.minify !== false) cmd += ' --minify';\n spawnSync(cmd, { \n stdio: 'inherit',\n cwd: process.cwd(),\n shell: true,\n });\n logger.success('Tailwind CSS built successfully');\n } catch (err: unknown) {\n logger.error('Tailwind build failed', err as Error);\n }\n },\n\n [PluginHooks.SERVER_START]: async (server: unknown, isDevArg: unknown) => {\n const isDev = isDevArg as boolean;\n if (!isDev) return;\n\n // Check if input file exists\n if (!fs.existsSync(input)) {\n logger.warn(`Tailwind input file not found: ${input}`);\n return;\n }\n\n // Ensure output directory exists\n const outputDir = path.dirname(output);\n if (!fs.existsSync(outputDir)) {\n fs.mkdirSync(outputDir, { recursive: true });\n }\n\n // Build initial CSS synchronously\n logger.info('Building initial Tailwind CSS...');\n try {\n const cli = getCli();\n const buildResult = spawnSync(`npx ${cli} -i \"${input}\" -o \"${output}\"`, {\n cwd: process.cwd(),\n stdio: 'pipe',\n shell: true,\n });\n\n if (buildResult.status !== 0) {\n const stderr = buildResult.stderr?.toString() || '';\n // Only show 'not installed' if we actually can't find the CLI command\n if (buildResult.error || stderr.includes('not found') || stderr.includes('ENOENT')) {\n logger.warn('Tailwind CSS CLI not found — skipping. CSS will still be served if pre-built.');\n } else if (stderr.trim()) {\n logger.warn(`Tailwind build warning: ${stderr.trim().split('\\n')[0]}`);\n }\n return;\n }\n\n logger.success('Tailwind CSS built successfully');\n } catch (err: unknown) {\n logger.error('Failed to build Tailwind CSS', err as Error);\n return;\n }\n\n // Start watcher\n logger.info('Starting Tailwind CSS watcher...');\n const cli = getCli();\n const watcher = spawn(`npx ${cli} -i \"${input}\" -o \"${output}\" --watch`, {\n stdio: 'pipe',\n cwd: process.cwd(),\n shell: true,\n });\n\n watcher.stdout.on('data', (data) => {\n const msg = data.toString().trim();\n if (msg && !msg.includes('Rebuilding...') && !msg.includes('Done in')) {\n logger.info(`Tailwind: ${msg}`);\n }\n });\n\n watcher.stderr.on('data', (data) => {\n const msg = data.toString().trim();\n if (msg && !msg.includes('warn')) {\n logger.warn(`Tailwind: ${msg}`);\n }\n });\n\n watcher.on('error', (err) => {\n logger.error('Tailwind watcher error', err);\n });\n\n watcher.on('exit', (code) => {\n if (code !== 0 && code !== null) {\n logger.error(`Tailwind watcher exited with code ${code}`);\n }\n });\n\n const cleanup = () => {\n if (watcher && !watcher.killed) {\n watcher.kill();\n }\n };\n\n process.on('exit', cleanup);\n process.on('SIGINT', cleanup);\n process.on('SIGTERM', cleanup);\n }\n }\n });\n}\n","/**\n * Velix v5 Logger\n * Minimalist, professional output inspired by modern CLIs\n */\n\nimport { VERSION } from './version.js';\n\nconst colors = {\n reset: '\\x1b[0m',\n bold: '\\x1b[1m',\n dim: '\\x1b[2m',\n red: '\\x1b[31m',\n green: '\\x1b[32m',\n yellow: '\\x1b[33m',\n blue: '\\x1b[34m',\n magenta: '\\x1b[35m',\n cyan: '\\x1b[36m',\n white: '\\x1b[37m',\n gray: '\\x1b[90m',\n};\n\nconst c = colors;\n\nfunction getTime() {\n const now = new Date();\n const hours = String(now.getHours()).padStart(2, '0');\n const minutes = String(now.getMinutes()).padStart(2, '0');\n const seconds = String(now.getSeconds()).padStart(2, '0');\n return `${c.dim}${hours}:${minutes}:${seconds}${c.reset}`;\n}\n\nfunction getStatusColor(status: number) {\n if (status >= 500) return c.red;\n if (status >= 400) return c.yellow;\n if (status >= 300) return c.cyan;\n if (status >= 200) return c.green;\n return c.white;\n}\n\nfunction fmtTime(ms: number) {\n if (ms < 1) return `${c.gray}<1ms${c.reset}`;\n if (ms < 100) return `${c.green}${ms}ms${c.reset}`;\n if (ms < 500) return `${c.yellow}${ms}ms${c.reset}`;\n return `${c.red}${ms}ms${c.reset}`;\n}\n\nconst LOGO = `\n ${c.cyan}▲${c.reset} ${c.bold}Velix${c.reset} ${c.dim}v${VERSION}${c.reset}\n`;\n\nexport const logger = {\n logo() {\n console.log(LOGO);\n console.log(`${c.dim} ──────────────────────────────────────────────${c.reset}`);\n console.log('');\n },\n\n serverStart(config: { port: number | string; host: string; mode: string; pagesDir?: string }, startTime = Date.now()) {\n const { port, host, mode, pagesDir } = config;\n const elapsed = Date.now() - startTime;\n\n console.log(LOGO);\n console.log(` ${c.green}✔${c.reset} ${c.bold}Ready${c.reset} in ${elapsed}ms`);\n console.log('');\n console.log(` ${c.bold}Local:${c.reset} ${c.cyan}http://${host}:${port}${c.reset}`);\n console.log(` ${c.bold}Mode:${c.reset} ${mode === 'development' ? c.yellow : c.green}${mode}${c.reset}`);\n if (pagesDir) console.log(` ${c.bold}App:${c.reset} ${c.dim}${pagesDir}${c.reset}`);\n console.log('');\n },\n\n request(method: string, path: string, status: number, time: number, extra: { type?: string } = {}) {\n const statusColor = getStatusColor(status);\n const timeStr = fmtTime(time);\n\n let badge = `${c.dim}○${c.reset}`;\n if (extra.type === 'dynamic' || extra.type === 'ssr') badge = `${c.white}ƒ${c.reset}`;\n else if (extra.type === 'api') badge = `${c.cyan}λ${c.reset}`;\n\n const statusStr = `${statusColor}${status}${c.reset}`;\n console.log(` ${badge} ${c.white}${method}${c.reset} ${path} ${statusStr} ${c.dim}${timeStr}${c.reset}`);\n },\n\n info(msg: string) { console.log(` ${c.cyan}ℹ${c.reset} ${msg}`); },\n success(msg: string) { console.log(` ${c.green}✔${c.reset} ${msg}`); },\n warn(msg: string) { console.log(` ${c.yellow}⚠${c.reset} ${c.yellow}${msg}${c.reset}`); },\n\n error(msg: string, err: Error | null = null) {\n console.log(` ${c.red}✖${c.reset} ${c.red}${msg}${c.reset}`);\n if (err?.stack) {\n console.log('');\n console.log(`${c.dim}${err.stack.split('\\n').slice(1, 4).join('\\n')}${c.reset}`);\n console.log('');\n }\n },\n\n compile(file: string, time: number) {\n console.log(` ${c.white}●${c.reset} Compiling ${c.dim}${file}${c.reset} ${c.dim}(${time}ms)${c.reset}`);\n },\n\n hmr(file: string) {\n console.log(` ${c.green}↻${c.reset} Fast Refresh ${c.dim}${file}${c.reset}`);\n },\n\n plugin(name: string) {\n console.log(` ${c.cyan}◆${c.reset} Plugin ${c.dim}${name}${c.reset}`);\n },\n\n route(path: string, type: string) {\n const typeLabel = type === 'api' ? 'λ' : type === 'dynamic' ? 'ƒ' : '○';\n const color = type === 'api' ? c.cyan : type === 'dynamic' ? c.white : c.dim;\n console.log(` ${color}${typeLabel}${c.reset} ${path}`);\n },\n\n divider() { console.log(`${c.dim} ──────────────────────────────────────────────${c.reset}`); },\n blank() { console.log(''); },\n\n portInUse(port: number | string) {\n this.error(`Port ${port} is already in use.`);\n this.blank();\n console.log(` ${c.dim}Try:${c.reset}`);\n console.log(` 1. Kill the process on port ${port}`);\n console.log(` 2. Use a different port via PORT env var`);\n this.blank();\n },\n\n build(stats: { time: number }) {\n this.blank();\n console.log(` ${c.green}✔${c.reset} Build completed`);\n this.blank();\n console.log(` ${c.dim}Total time:${c.reset} ${c.white}${stats.time}ms${c.reset}`);\n this.blank();\n },\n};\n\nexport default logger;\n","/**\n * Velix version — single source of truth.\n * Update this file only when releasing a new version.\n */\nexport const VERSION = '5.2.3';\n","/**\n * Velix v5 Metadata & SEO System\n *\n * First-class SEO with automatic:\n * - Meta tags, Open Graph, Twitter Cards\n * - Canonical URLs, robots, sitemaps\n * - JSON-LD structured data\n * - Viewport, theme color, icons\n */\n\nimport fs from 'fs';\nimport path from 'path';\n\n// ============================================================================\n// Types (comprehensive metadata interface)\n// ============================================================================\n\nexport interface Metadata {\n title?: string | { default: string; template?: string; absolute?: string };\n description?: string;\n keywords?: string | string[];\n authors?: Author | Author[];\n creator?: string;\n publisher?: string;\n robots?: Robots | string;\n icons?: Icons;\n manifest?: string;\n openGraph?: OpenGraph;\n twitter?: Twitter;\n verification?: Verification;\n alternates?: Alternates;\n viewport?: Viewport | string;\n themeColor?: ThemeColor | ThemeColor[];\n colorScheme?: 'normal' | 'light' | 'dark' | 'light dark' | 'dark light';\n formatDetection?: FormatDetection;\n metadataBase?: URL | string;\n generator?: string;\n applicationName?: string;\n referrer?: string;\n other?: Record<string, string | string[]>;\n}\n\nexport interface Author { name?: string; url?: string; }\nexport interface Robots { index?: boolean; follow?: boolean; noarchive?: boolean; nosnippet?: boolean; noimageindex?: boolean; nocache?: boolean; googleBot?: Robots | string; }\nexport interface Icons { icon?: IconDescriptor | IconDescriptor[]; shortcut?: IconDescriptor | IconDescriptor[]; apple?: IconDescriptor | IconDescriptor[]; other?: IconDescriptor[]; }\nexport interface IconDescriptor { url: string; type?: string; sizes?: string; color?: string; rel?: string; media?: string; }\nexport interface OpenGraph {\n type?: string; url?: string; title?: string; description?: string; siteName?: string;\n locale?: string; images?: OGImage | OGImage[]; videos?: OGVideo | OGVideo[];\n determiner?: string; publishedTime?: string; modifiedTime?: string;\n expirationTime?: string; authors?: string | string[]; section?: string; tags?: string[];\n}\nexport interface OGImage { url: string; secureUrl?: string; type?: string; width?: number; height?: number; alt?: string; }\nexport interface OGVideo { url: string; secureUrl?: string; type?: string; width?: number; height?: number; }\nexport interface Twitter {\n card?: 'summary' | 'summary_large_image' | 'app' | 'player';\n site?: string; siteId?: string; creator?: string; creatorId?: string;\n title?: string; description?: string; images?: string | TwitterImage | (string | TwitterImage)[];\n}\nexport interface TwitterImage { url: string; alt?: string; }\nexport interface Verification { google?: string | string[]; yahoo?: string | string[]; yandex?: string | string[]; other?: Record<string, string | string[]>; }\nexport interface Alternates { canonical?: string; languages?: Record<string, string>; media?: Record<string, string>; }\nexport interface Viewport { width?: number | 'device-width'; height?: number | 'device-height'; initialScale?: number; minimumScale?: number; maximumScale?: number; userScalable?: boolean; viewportFit?: 'auto' | 'cover' | 'contain'; }\nexport interface ThemeColor { color: string; media?: string; }\nexport interface FormatDetection { telephone?: boolean; date?: boolean; address?: boolean; email?: boolean; }\n\n// ============================================================================\n// Metadata Tag Generation\n// ============================================================================\n\nexport function generateMetadataTags(metadata: Metadata, baseUrl?: string): string {\n const tags: string[] = [];\n const base = baseUrl || metadata.metadataBase?.toString() || '';\n\n // Title\n if (metadata.title) {\n const title = typeof metadata.title === 'string'\n ? metadata.title\n : metadata.title.absolute || (metadata.title.template\n ? metadata.title.template.replace('%s', metadata.title.default)\n : metadata.title.default);\n tags.push(`<title>${escapeHtml(title)}</title>`);\n }\n\n if (metadata.description) tags.push(`<meta name=\"description\" content=\"${escapeHtml(metadata.description)}\">`);\n\n if (metadata.keywords) {\n const kw = Array.isArray(metadata.keywords) ? metadata.keywords.join(', ') : metadata.keywords;\n tags.push(`<meta name=\"keywords\" content=\"${escapeHtml(kw)}\">`);\n }\n\n if (metadata.authors) {\n const authors = Array.isArray(metadata.authors) ? metadata.authors : [metadata.authors];\n authors.forEach(a => {\n if (a.name) tags.push(`<meta name=\"author\" content=\"${escapeHtml(a.name)}\">`);\n if (a.url) tags.push(`<link rel=\"author\" href=\"${a.url}\">`);\n });\n }\n\n if (metadata.generator) tags.push(`<meta name=\"generator\" content=\"${escapeHtml(metadata.generator)}\">`);\n if (metadata.applicationName) tags.push(`<meta name=\"application-name\" content=\"${escapeHtml(metadata.applicationName)}\">`);\n if (metadata.referrer) tags.push(`<meta name=\"referrer\" content=\"${metadata.referrer}\">`);\n\n // Robots\n if (metadata.robots) {\n if (typeof metadata.robots === 'string') {\n tags.push(`<meta name=\"robots\" content=\"${metadata.robots}\">`);\n } else {\n tags.push(`<meta name=\"robots\" content=\"${generateRobotsContent(metadata.robots)}\">`);\n if (metadata.robots.googleBot) {\n const gbc = typeof metadata.robots.googleBot === 'string' ? metadata.robots.googleBot : generateRobotsContent(metadata.robots.googleBot);\n tags.push(`<meta name=\"googlebot\" content=\"${gbc}\">`);\n }\n }\n }\n\n // Viewport\n if (metadata.viewport) {\n const vc = typeof metadata.viewport === 'string' ? metadata.viewport : generateViewportContent(metadata.viewport);\n tags.push(`<meta name=\"viewport\" content=\"${vc}\">`);\n }\n\n // Theme Color\n if (metadata.themeColor) {\n const tcs = Array.isArray(metadata.themeColor) ? metadata.themeColor : [metadata.themeColor];\n tcs.forEach(tc => {\n const media = typeof tc !== 'string' && tc.media ? ` media=\"${tc.media}\"` : '';\n const color = typeof tc === 'string' ? tc : tc.color;\n tags.push(`<meta name=\"theme-color\" content=\"${color}\"${media}>`);\n });\n }\n\n if (metadata.colorScheme) tags.push(`<meta name=\"color-scheme\" content=\"${metadata.colorScheme}\">`);\n\n // Icons\n if (metadata.icons) {\n const addIcon = (icon: IconDescriptor, defaultRel: string) => {\n const rel = icon.rel || defaultRel;\n const attrs = [\n icon.type ? ` type=\"${icon.type}\"` : '',\n icon.sizes ? ` sizes=\"${icon.sizes}\"` : '',\n icon.color ? ` color=\"${icon.color}\"` : '',\n ].join('');\n tags.push(`<link rel=\"${rel}\" href=\"${resolveUrl(icon.url, base)}\"${attrs}>`);\n };\n if (metadata.icons.icon) { (Array.isArray(metadata.icons.icon) ? metadata.icons.icon : [metadata.icons.icon]).forEach(i => addIcon(i, 'icon')); }\n if (metadata.icons.apple) { (Array.isArray(metadata.icons.apple) ? metadata.icons.apple : [metadata.icons.apple]).forEach(i => addIcon(i, 'apple-touch-icon')); }\n }\n\n if (metadata.manifest) tags.push(`<link rel=\"manifest\" href=\"${resolveUrl(metadata.manifest, base)}\">`);\n\n // Open Graph\n if (metadata.openGraph) {\n const og = metadata.openGraph;\n if (og.type) tags.push(`<meta property=\"og:type\" content=\"${og.type}\">`);\n if (og.title) tags.push(`<meta property=\"og:title\" content=\"${escapeHtml(og.title)}\">`);\n if (og.description) tags.push(`<meta property=\"og:description\" content=\"${escapeHtml(og.description)}\">`);\n if (og.url) tags.push(`<meta property=\"og:url\" content=\"${resolveUrl(og.url, base)}\">`);\n if (og.siteName) tags.push(`<meta property=\"og:site_name\" content=\"${escapeHtml(og.siteName)}\">`);\n if (og.locale) tags.push(`<meta property=\"og:locale\" content=\"${og.locale}\">`);\n if (og.images) {\n (Array.isArray(og.images) ? og.images : [og.images]).forEach(img => {\n tags.push(`<meta property=\"og:image\" content=\"${resolveUrl(img.url, base)}\">`);\n if (img.width) tags.push(`<meta property=\"og:image:width\" content=\"${img.width}\">`);\n if (img.height) tags.push(`<meta property=\"og:image:height\" content=\"${img.height}\">`);\n if (img.alt) tags.push(`<meta property=\"og:image:alt\" content=\"${escapeHtml(img.alt)}\">`);\n });\n }\n if (og.type === 'article') {\n if (og.publishedTime) tags.push(`<meta property=\"article:published_time\" content=\"${og.publishedTime}\">`);\n if (og.modifiedTime) tags.push(`<meta property=\"article:modified_time\" content=\"${og.modifiedTime}\">`);\n if (og.tags) og.tags.forEach(t => tags.push(`<meta property=\"article:tag\" content=\"${escapeHtml(t)}\">`));\n }\n }\n\n // Twitter\n if (metadata.twitter) {\n const tw = metadata.twitter;\n if (tw.card) tags.push(`<meta name=\"twitter:card\" content=\"${tw.card}\">`);\n if (tw.site) tags.push(`<meta name=\"twitter:site\" content=\"${tw.site}\">`);\n if (tw.creator) tags.push(`<meta name=\"twitter:creator\" content=\"${tw.creator}\">`);\n if (tw.title) tags.push(`<meta name=\"twitter:title\" content=\"${escapeHtml(tw.title)}\">`);\n if (tw.description) tags.push(`<meta name=\"twitter:description\" content=\"${escapeHtml(tw.description)}\">`);\n if (tw.images) {\n (Array.isArray(tw.images) ? tw.images : [tw.images]).forEach(img => {\n const url = typeof img === 'string' ? img : img.url;\n tags.push(`<meta name=\"twitter:image\" content=\"${resolveUrl(url, base)}\">`);\n });\n }\n }\n\n // Verification\n if (metadata.verification) {\n if (metadata.verification.google) {\n (Array.isArray(metadata.verification.google) ? metadata.verification.google : [metadata.verification.google])\n .forEach(v => tags.push(`<meta name=\"google-site-verification\" content=\"${v}\">`));\n }\n }\n\n // Alternates\n if (metadata.alternates) {\n if (metadata.alternates.canonical) tags.push(`<link rel=\"canonical\" href=\"${resolveUrl(metadata.alternates.canonical, base)}\">`);\n if (metadata.alternates.languages) {\n Object.entries(metadata.alternates.languages).forEach(([lang, url]) => {\n tags.push(`<link rel=\"alternate\" hreflang=\"${lang}\" href=\"${resolveUrl(url, base)}\">`);\n });\n }\n }\n\n return tags.join('\\n ');\n}\n\n// ============================================================================\n// Merge & JSON-LD\n// ============================================================================\n\nexport function mergeMetadata(parent: Metadata, child: Metadata): Metadata {\n return {\n ...parent, ...child,\n openGraph: child.openGraph ? { ...parent.openGraph, ...child.openGraph } : parent.openGraph,\n twitter: child.twitter ? { ...parent.twitter, ...child.twitter } : parent.twitter,\n icons: child.icons ? { ...parent.icons, ...child.icons } : parent.icons,\n alternates: child.alternates ? { ...parent.alternates, ...child.alternates } : parent.alternates,\n };\n}\n\nexport function generateJsonLd(data: Record<string, unknown>): string {\n return `<script type=\"application/ld+json\">${JSON.stringify(data)}</script>`;\n}\n\nexport const jsonLd = {\n website: (c: { name: string; url: string; description?: string }) => ({\n '@context': 'https://schema.org', '@type': 'WebSite', name: c.name, url: c.url, description: c.description\n }),\n article: (c: { headline: string; description?: string; image?: string | string[]; datePublished: string; dateModified?: string; author: { name: string; url?: string } | { name: string; url?: string }[] }) => ({\n '@context': 'https://schema.org', '@type': 'Article', headline: c.headline, description: c.description,\n image: c.image, datePublished: c.datePublished, dateModified: c.dateModified || c.datePublished,\n author: Array.isArray(c.author) ? c.author.map(a => ({ '@type': 'Person', ...a })) : { '@type': 'Person', ...c.author }\n }),\n organization: (c: { name: string; url: string; logo?: string; sameAs?: string[] }) => ({\n '@context': 'https://schema.org', '@type': 'Organization', name: c.name, url: c.url, logo: c.logo, sameAs: c.sameAs\n }),\n breadcrumb: (items: { name: string; url: string }[]) => ({\n '@context': 'https://schema.org', '@type': 'BreadcrumbList',\n itemListElement: items.map((item, i) => ({ '@type': 'ListItem', position: i + 1, name: item.name, item: item.url }))\n }),\n};\n\n// ============================================================================\n// Automatic SEO Generation\n// ============================================================================\n\n/**\n * Generate sitemap.xml content from routes\n */\nexport function generateSitemap(routes: Array<{ type: string; path: string }>, baseUrl: string): string {\n const urls = routes\n .filter(r => r.type === 'page' && !r.path.includes(':') && !r.path.includes('*'))\n .map(r => {\n const loc = `${baseUrl.replace(/\\/$/, '')}${r.path}`;\n return ` <url>\\n <loc>${loc}</loc>\\n <lastmod>${new Date().toISOString().split('T')[0]}</lastmod>\\n <changefreq>weekly</changefreq>\\n <priority>${r.path === '/' ? '1.0' : '0.8'}</priority>\\n </url>`;\n });\n\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">\\n${urls.join('\\n')}\\n</urlset>`;\n}\n\n/**\n * Generate robots.txt content\n */\nexport function generateRobotsTxt(baseUrl: string, options: { disallow?: string[]; allow?: string[] } = {}): string {\n const lines = ['User-agent: *'];\n if (options.allow) options.allow.forEach(p => lines.push(`Allow: ${p}`));\n if (options.disallow) options.disallow.forEach(p => lines.push(`Disallow: ${p}`));\n else lines.push('Allow: /');\n lines.push('', `Sitemap: ${baseUrl.replace(/\\/$/, '')}/sitemap.xml`);\n return lines.join('\\n');\n}\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\nfunction escapeHtml(str: string): string {\n return str.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/\"/g, '"').replace(/'/g, ''');\n}\n\nfunction resolveUrl(url: string, base: string): string {\n if (url.startsWith('http://') || url.startsWith('https://') || url.startsWith('//')) return url;\n return base ? `${base.replace(/\\/$/, '')}${url.startsWith('/') ? '' : '/'}${url}` : url;\n}\n\nfunction generateRobotsContent(robots: Robots): string {\n const parts: string[] = [];\n if (robots.index !== undefined) parts.push(robots.index ? 'index' : 'noindex');\n if (robots.follow !== undefined) parts.push(robots.follow ? 'follow' : 'nofollow');\n if (robots.noarchive) parts.push('noarchive');\n if (robots.nosnippet) parts.push('nosnippet');\n if (robots.noimageindex) parts.push('noimageindex');\n return parts.join(', ') || 'index, follow';\n}\n\nfunction generateViewportContent(viewport: Viewport): string {\n const parts: string[] = [];\n if (viewport.width) parts.push(`width=${viewport.width}`);\n if (viewport.height) parts.push(`height=${viewport.height}`);\n if (viewport.initialScale !== undefined) parts.push(`initial-scale=${viewport.initialScale}`);\n if (viewport.maximumScale !== undefined) parts.push(`maximum-scale=${viewport.maximumScale}`);\n if (viewport.userScalable !== undefined) parts.push(`user-scalable=${viewport.userScalable ? 'yes' : 'no'}`);\n return parts.join(', ') || 'width=device-width, initial-scale=1';\n}\n\nexport default { generateMetadataTags, mergeMetadata, generateJsonLd, jsonLd, generateSitemap, generateRobotsTxt };\n","/**\n * Velix v5 Islands Architecture\n *\n * Islands allow partial hydration — only interactive components are hydrated\n * on the client, while static content remains as HTML.\n *\n * Usage: Add 'use island' at the top of a component file.\n */\n\nimport React from 'react';\nimport crypto from 'crypto';\n\n// Island registry for tracking all islands in a render\nconst islandRegistry = new Map();\n\nfunction generateIslandId(componentName: string): string {\n const hash = crypto.randomBytes(4).toString('hex');\n return `island-${componentName}-${hash}`;\n}\n\n/**\n * Island wrapper component for server-side rendering\n */\nexport function Island({ component: Component, props = {}, name, clientPath }: {\n component: React.ComponentType<Record<string, unknown>>;\n props?: Record<string, unknown>;\n name: string;\n clientPath: string;\n}) {\n const islandId = generateIslandId(name);\n\n islandRegistry.set(islandId, { id: islandId, name, clientPath, props });\n\n return React.createElement('div', {\n 'data-island': islandId,\n 'data-island-name': name,\n 'data-island-props': JSON.stringify(props),\n }, React.createElement(Component, props));\n}\n\n/**\n * Gets all registered islands and clears the registry\n */\nexport function getRegisteredIslands() {\n const islands = Array.from(islandRegistry.values());\n islandRegistry.clear();\n return islands;\n}\n\n/**\n * Creates an island component wrapper\n */\nexport function createIsland(Component: React.ComponentType<Record<string, unknown>>, options: { name?: string; clientPath?: string } = {}) {\n const { name = (Component as { name?: string }).name || 'Island', clientPath } = options;\n\n function IslandWrapper(props: Record<string, unknown>) {\n return Island({\n component: Component, props, name,\n clientPath: clientPath || `/__velix/islands/${name}.js`\n });\n }\n\n IslandWrapper.displayName = `Island(${name})`;\n IslandWrapper.isIsland = true;\n IslandWrapper.originalComponent = Component;\n return IslandWrapper;\n}\n\n/**\n * Island loading strategies\n */\nexport const LoadStrategy = {\n IMMEDIATE: 'immediate',\n VISIBLE: 'visible',\n IDLE: 'idle',\n MEDIA: 'media'\n} as const;\n\n/**\n * Creates a lazy island that hydrates based on strategy\n */\nexport function createLazyIsland(Component: React.ComponentType<Record<string, unknown>>, options: {\n name?: string; clientPath?: string; strategy?: string; media?: string | null;\n} = {}) {\n const {\n name = (Component as { name?: string }).name || 'LazyIsland',\n clientPath,\n strategy = LoadStrategy.VISIBLE,\n media = null\n } = options;\n\n function LazyIslandWrapper(props: Record<string, unknown>) {\n const islandId = generateIslandId(name);\n\n islandRegistry.set(islandId, {\n id: islandId, name,\n clientPath: clientPath || `/__velix/islands/${name}.js`,\n props, strategy, media\n });\n\n return React.createElement('div', {\n 'data-island': islandId,\n 'data-island-name': name,\n 'data-island-strategy': strategy,\n 'data-island-media': media,\n 'data-island-props': JSON.stringify(props),\n });\n }\n\n LazyIslandWrapper.displayName = `LazyIsland(${name})`;\n LazyIslandWrapper.isIsland = true;\n LazyIslandWrapper.isLazy = true;\n return LazyIslandWrapper;\n}\n\n/**\n * Generates the client-side hydration script for islands\n */\nexport function generateHydrationScript(islands: Array<{ id: string; name: string; clientPath: string; props: Record<string, unknown> }>): string {\n if (!islands.length) return '';\n\n const islandData = islands.map((island) => ({\n id: island.id, name: island.name,\n path: island.clientPath, props: island.props\n }));\n\n return `\n<script type=\"module\">\n const islands = ${JSON.stringify(islandData)};\n\n async function hydrateIslands() {\n const { hydrateRoot } = await import('/__velix/react-dom-client.js');\n const React = await import('/__velix/react.js');\n\n for (const island of islands) {\n try {\n const el = document.querySelector(\\`[data-island=\"\\${island.id}\"]\\`);\n if (!el) continue;\n const mod = await import(island.path);\n hydrateRoot(el, React.createElement(mod.default, island.props));\n el.setAttribute('data-hydrated', 'true');\n } catch (error) {\n console.error(\\`Failed to hydrate island \\${island.name}:\\`, error);\n }\n }\n }\n\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', hydrateIslands);\n } else {\n hydrateIslands();\n }\n</script>`;\n}\n\n/**\n * Generates advanced hydration script with loading strategies\n */\nexport function generateAdvancedHydrationScript(islands: Array<{ id: string; name: string; clientPath: string; props: Record<string, unknown>; strategy?: string; media?: string | null }>): string {\n if (!islands.length) return '';\n\n const islandData = islands.map((island) => ({\n id: island.id, name: island.name, path: island.clientPath,\n props: island.props, strategy: island.strategy || LoadStrategy.IMMEDIATE,\n media: island.media\n }));\n\n return `\n<script type=\"module\">\n const islands = ${JSON.stringify(islandData)};\n\n async function hydrateIsland(island) {\n const el = document.querySelector(\\`[data-island=\"\\${island.id}\"]\\`);\n if (!el || el.hasAttribute('data-hydrated')) return;\n\n try {\n const { hydrateRoot } = await import('/__velix/react-dom-client.js');\n const React = await import('/__velix/react.js');\n const mod = await import(island.path);\n hydrateRoot(el, React.createElement(mod.default, island.props));\n el.setAttribute('data-hydrated', 'true');\n } catch (error) {\n console.error(\\`Failed to hydrate island \\${island.name}:\\`, error);\n }\n }\n\n const visibleObserver = new IntersectionObserver((entries) => {\n entries.forEach(entry => {\n if (entry.isIntersecting) {\n const id = entry.target.getAttribute('data-island');\n const island = islands.find(i => i.id === id);\n if (island) { hydrateIsland(island); visibleObserver.unobserve(entry.target); }\n }\n });\n }, { rootMargin: '50px' });\n\n function processIslands() {\n for (const island of islands) {\n const el = document.querySelector(\\`[data-island=\"\\${island.id}\"]\\`);\n if (!el) continue;\n switch (island.strategy) {\n case 'immediate': hydrateIsland(island); break;\n case 'visible': visibleObserver.observe(el); break;\n case 'idle': requestIdleCallback(() => hydrateIsland(island)); break;\n case 'media':\n if (island.media && window.matchMedia(island.media).matches) hydrateIsland(island);\n break;\n }\n }\n }\n\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', processIslands);\n } else {\n processIslands();\n }\n</script>`;\n}\n\nexport default { Island, createIsland, createLazyIsland, getRegisteredIslands, generateHydrationScript, generateAdvancedHydrationScript, LoadStrategy };\n","/**\n * Velix v5 Server Actions\n *\n * React 19 native actions with Velix enhancements and security.\n */\n\nexport { useActionState, useOptimistic } from 'react';\nexport { useFormStatus } from 'react-dom';\n\nimport { cookies, headers, redirect, notFound, RedirectError, NotFoundError } from '../helpers.js';\n\n// Global action registry\ndeclare global {\n var __VELIX_ACTIONS__: Record<string, ServerActionFunction>;\n var __VELIX_ACTION_CONTEXT__: ActionContext | null;\n}\n\nglobalThis.__VELIX_ACTIONS__ = globalThis.__VELIX_ACTIONS__ || {};\nglobalThis.__VELIX_ACTION_CONTEXT__ = null;\n\nexport interface ActionContext {\n request: Request;\n cookies: typeof cookies;\n headers: typeof headers;\n redirect: typeof redirect;\n notFound: typeof notFound;\n}\n\nexport type ServerActionFunction<TArgs extends unknown[] = unknown[], TReturn = unknown> = (...args: TArgs) => Promise<TReturn>;\n\nexport interface ActionResult<T = unknown> {\n success: boolean;\n data?: T;\n error?: string;\n redirect?: string;\n}\n\n/**\n * Decorator to mark a function as a server action\n */\nexport function serverAction<TArgs extends unknown[], TReturn>(\n fn: (...args: TArgs) => Promise<TReturn>, \n actionId?: string\n): (...args: TArgs) => Promise<ActionResult<TReturn>> {\n const id = actionId || `action_${fn.name}_${generateActionId()}`;\n globalThis.__VELIX_ACTIONS__[id] = fn as ServerActionFunction;\n\n const proxy = (async (...args: TArgs) => {\n if (typeof window === 'undefined') return await executeAction(id, args) as ActionResult<TReturn>;\n return await callServerAction(id, args) as ActionResult<TReturn>;\n });\n\n (proxy as unknown as { $$typeof: symbol }).$$typeof = Symbol.for('react.server.action');\n (proxy as unknown as { $$id: string }).$$id = id;\n (proxy as unknown as { $$bound: unknown }).$$bound = null;\n return proxy;\n}\n\nexport function registerAction(id: string, fn: ServerActionFunction): void {\n globalThis.__VELIX_ACTIONS__[id] = fn;\n}\n\nexport function getAction(id: string): ServerActionFunction | undefined {\n return globalThis.__VELIX_ACTIONS__[id];\n}\n\n/**\n * Execute a server action on the server\n */\nexport async function executeAction(actionId: string, args: unknown[], context?: Partial<ActionContext>): Promise<ActionResult> {\n const action = globalThis.__VELIX_ACTIONS__[actionId];\n if (!action) return { success: false, error: `Server action not found: ${actionId}` };\n\n const actionContext: ActionContext = {\n request: context?.request || new Request('http://localhost'),\n cookies, headers, redirect, notFound\n };\n\n globalThis.__VELIX_ACTION_CONTEXT__ = actionContext;\n\n try {\n const result = await action(...args);\n return { success: true, data: result };\n } catch (err: unknown) {\n const error = err as Error;\n if (error instanceof RedirectError) return { success: true, redirect: error.url };\n if (error instanceof NotFoundError) return { success: false, error: 'Not found' };\n return { success: false, error: error.message || 'Action failed' };\n } finally {\n globalThis.__VELIX_ACTION_CONTEXT__ = null;\n }\n}\n\n/**\n * Call a server action from the client\n */\nexport async function callServerAction(actionId: string, args: unknown[]): Promise<ActionResult> {\n try {\n const response = await fetch('/__velix/action', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', 'X-Velix-Action': actionId },\n body: JSON.stringify({ actionId, args: serializeArgs(args) }),\n credentials: 'same-origin'\n });\n\n if (!response.ok) throw new Error(`Action failed: ${response.statusText}`);\n const result = await response.json();\n if (result.redirect) { window.location.href = result.redirect; }\n return result;\n } catch (err: unknown) {\n const error = err as Error;\n return { success: false, error: error.message || 'Network error' };\n }\n}\n\nfunction serializeArgs(args: unknown[]): unknown[] {\n return args.map(arg => {\n if (arg instanceof FormData) {\n const obj: Record<string, unknown> = {};\n arg.forEach((value, key) => {\n if (obj[key]) {\n obj[key] = Array.isArray(obj[key]) ? [...obj[key], value] : [obj[key], value];\n } else { obj[key] = value; }\n });\n return { $$type: 'FormData', data: obj };\n }\n if (arg instanceof Date) return { $$type: 'Date', value: arg.toISOString() };\n if (typeof arg === 'object' && arg !== null) return JSON.parse(JSON.stringify(arg));\n return arg;\n });\n}\n\n// Security validation\nconst ALLOWED_TYPES = new Set(['FormData', 'Date', 'File']);\nconst MAX_DEPTH = 10;\n\nfunction validateInput(obj: unknown, depth = 0): boolean {\n if (depth > MAX_DEPTH) throw new Error('Payload too deeply nested');\n if (obj === null || obj === undefined || typeof obj !== 'object') return true;\n if ('__proto__' in obj || 'constructor' in obj || 'prototype' in obj) {\n throw new Error('Invalid payload: prototype pollution attempt detected');\n }\n if ('$$type' in (obj as Record<string, unknown>) && !ALLOWED_TYPES.has((obj as { $$type: string }).$$type)) {\n throw new Error(`Invalid serialized type: ${(obj as { $$type: string }).$$type}`);\n }\n if (Array.isArray(obj)) (obj as unknown[]).forEach(item => validateInput(item, depth + 1));\n else Object.values(obj as Record<string, unknown>).forEach(val => validateInput(val, depth + 1));\n return true;\n}\n\nexport function deserializeArgs(args: unknown[]): unknown[] {\n validateInput(args);\n return args.map(arg => {\n if (arg && typeof arg === 'object') {\n if ((arg as { $$type?: string }).$$type === 'FormData') {\n const fd = new FormData();\n for (const [key, value] of Object.entries((arg as { data?: Record<string, unknown> }).data || {})) {\n if (typeof key !== 'string' || key.startsWith('__')) continue;\n if (Array.isArray(value)) value.forEach(v => { if (typeof v === 'string' || typeof v === 'number') fd.append(key, String(v)); });\n else if (typeof value === 'string' || typeof value === 'number') fd.append(key, String(value));\n }\n return fd;\n }\n if ((arg as { $$type?: string }).$$type === 'Date') { const d = new Date((arg as { value: string }).value); if (isNaN(d.getTime())) throw new Error('Invalid date'); return d; }\n if ((arg as { $$type?: string }).$$type === 'File') return { name: String((arg as { name?: string }).name || ''), type: String((arg as { type?: string }).type || ''), size: Number((arg as { size?: number }).size || 0) };\n }\n return arg;\n });\n}\n\nfunction generateActionId(): string { return Math.random().toString(36).substring(2, 10); }\n\nexport function useActionContext(): ActionContext | null { return globalThis.__VELIX_ACTION_CONTEXT__; }\n\nexport function formAction<T>(action: (formData: FormData) => Promise<T>): (formData: FormData) => Promise<ActionResult<T>> {\n return async (formData: FormData) => {\n try {\n const result = await action(formData);\n return { success: true, data: result };\n } catch (err: unknown) {\n const error = err as Error;\n if (error instanceof RedirectError) return { success: true, redirect: error.url };\n return { success: false, error: error.message };\n }\n };\n}\n\nimport { useActionState as useActionStateReact } from 'react';\n\nexport function useVelixAction<State, Payload>(\n action: (state: Awaited<State>, payload: Payload) => State | Promise<State>,\n initialState: Awaited<State>,\n permalink?: string\n): [state: Awaited<State>, dispatch: (payload: Payload) => void, isPending: boolean] {\n return useActionStateReact(action, initialState, permalink);\n}\n\nexport function bindArgs<TArgs extends unknown[], TBound extends unknown[], TReturn>(\n action: (...args: [...TBound, ...TArgs]) => Promise<ActionResult<TReturn>>, \n ...boundArgs: TBound\n): (...args: TArgs) => Promise<ActionResult<TReturn>> {\n const bound = (async (...args: TArgs) => await action(...boundArgs, ...args));\n (bound as unknown as { $$typeof: symbol }).$$typeof = (action as unknown as { $$typeof: symbol }).$$typeof;\n (bound as unknown as { $$id: string }).$$id = (action as unknown as { $$id: string }).$$id;\n (bound as unknown as { $$bound: unknown[] }).$$bound = boundArgs;\n return bound;\n}\n","/**\n * Velix v5 Server Helpers\n * Utility functions for server-side operations\n */\n\n// ============================================================================\n// Response Helpers\n// ============================================================================\n\nexport class RedirectError extends Error {\n public readonly url: string;\n public readonly statusCode: number;\n public readonly type = 'redirect' as const;\n\n constructor(url: string, statusCode: number = 307) {\n super(`Redirect to ${url}`);\n this.name = 'RedirectError';\n this.url = url;\n this.statusCode = statusCode;\n }\n}\n\nimport { NotFoundError as CoreNotFoundError } from '@teamvelix/velix-core';\nexport { NotFoundError } from '@teamvelix/velix-core';\n\n/**\n * Redirect to a different URL\n *\n * @example\n * ```tsx\n * import { redirect } from 'velix';\n *\n * export default function ProtectedPage() {\n * const user = getUser();\n * if (!user) redirect('/login');\n * return <Dashboard user={user} />;\n * }\n * ```\n */\nexport function redirect(url: string, type: 'replace' | 'permanent' = 'replace'): never {\n const statusCode = type === 'permanent' ? 308 : 307;\n throw new RedirectError(url, statusCode);\n}\n\n/**\n * Trigger a 404 Not Found response\n */\nexport function notFound(message?: string): never {\n throw new CoreNotFoundError(message);\n}\n\n/**\n * Create a JSON response\n */\nexport function json<T>(\n data: T,\n options: { status?: number; headers?: Record<string, string> } = {}\n): Response {\n const { status = 200, headers = {} } = options;\n return new Response(JSON.stringify(data), {\n status,\n headers: { 'Content-Type': 'application/json', ...headers }\n });\n}\n\n/**\n * Create an HTML response\n */\nexport function html(\n content: string,\n options: { status?: number; headers?: Record<string, string> } = {}\n): Response {\n const { status = 200, headers = {} } = options;\n return new Response(content, {\n status,\n headers: { 'Content-Type': 'text/html; charset=utf-8', ...headers }\n });\n}\n\n/**\n * Create a text response\n */\nexport function text(\n content: string,\n options: { status?: number; headers?: Record<string, string> } = {}\n): Response {\n const { status = 200, headers = {} } = options;\n return new Response(content, {\n status,\n headers: { 'Content-Type': 'text/plain; charset=utf-8', ...headers }\n });\n}\n\n// ============================================================================\n// Cookies API\n// ============================================================================\n\nexport interface CookieOptions {\n maxAge?: number;\n expires?: Date;\n path?: string;\n domain?: string;\n secure?: boolean;\n httpOnly?: boolean;\n sameSite?: 'strict' | 'lax' | 'none';\n}\n\nexport const cookies = {\n parse(cookieHeader: string): Record<string, string> {\n const cookies: Record<string, string> = {};\n if (!cookieHeader) return cookies;\n cookieHeader.split(';').forEach(cookie => {\n const [name, ...rest] = cookie.split('=');\n if (name) {\n cookies[name.trim()] = decodeURIComponent(rest.join('=').trim());\n }\n });\n return cookies;\n },\n\n get(request: Request, name: string): string | undefined {\n const cookieHeader = request.headers.get('cookie') || '';\n return this.parse(cookieHeader)[name];\n },\n\n getAll(request: Request): Record<string, string> {\n const cookieHeader = request.headers.get('cookie') || '';\n return this.parse(cookieHeader);\n },\n\n serialize(name: string, value: string, options: CookieOptions = {}): string {\n let cookie = `${encodeURIComponent(name)}=${encodeURIComponent(value)}`;\n if (options.maxAge !== undefined) cookie += `; Max-Age=${options.maxAge}`;\n if (options.expires) cookie += `; Expires=${options.expires.toUTCString()}`;\n if (options.path) cookie += `; Path=${options.path}`;\n if (options.domain) cookie += `; Domain=${options.domain}`;\n if (options.secure) cookie += '; Secure';\n if (options.httpOnly) cookie += '; HttpOnly';\n if (options.sameSite) {\n cookie += `; SameSite=${options.sameSite.charAt(0).toUpperCase() + options.sameSite.slice(1)}`;\n }\n return cookie;\n },\n\n set(name: string, value: string, options: CookieOptions = {}): string {\n return this.serialize(name, value, {\n path: '/',\n httpOnly: true,\n secure: process.env.NODE_ENV === 'production',\n sameSite: 'lax',\n ...options\n });\n },\n\n delete(name: string, options: Omit<CookieOptions, 'maxAge' | 'expires'> = {}): string {\n return this.serialize(name, '', { ...options, path: '/', maxAge: 0 });\n }\n};\n\n// ============================================================================\n// Headers API\n// ============================================================================\n\nexport const headers = {\n create(init?: HeadersInit): Headers {\n return new Headers(init);\n },\n\n get(request: Request, name: string): string | null {\n return request.headers.get(name);\n },\n\n getAll(request: Request): Record<string, string> {\n const result: Record<string, string> = {};\n request.headers.forEach((value, key) => { result[key] = value; });\n return result;\n },\n\n has(request: Request, name: string): boolean {\n return request.headers.has(name);\n },\n\n contentType(request: Request): string | null {\n return request.headers.get('content-type');\n },\n\n acceptsJson(request: Request): boolean {\n const accept = request.headers.get('accept') || '';\n return accept.includes('application/json') || accept.includes('*/*');\n },\n\n isAjax(request: Request): boolean {\n return request.headers.get('x-requested-with') === 'XMLHttpRequest' ||\n this.acceptsJson(request);\n },\n\n authorization(request: Request): { type: string; credentials: string } | null {\n const auth = request.headers.get('authorization');\n if (!auth) return null;\n const [type, ...rest] = auth.split(' ');\n return { type: type.toLowerCase(), credentials: rest.join(' ') };\n },\n\n bearerToken(request: Request): string | null {\n const auth = this.authorization(request);\n return auth?.type === 'bearer' ? auth.credentials : null;\n },\n\n security(): Record<string, string> {\n return {\n 'X-Content-Type-Options': 'nosniff',\n 'X-Frame-Options': 'DENY',\n 'X-XSS-Protection': '1; mode=block',\n 'Referrer-Policy': 'strict-origin-when-cross-origin',\n 'Permissions-Policy': 'camera=(), microphone=(), geolocation=()'\n };\n },\n\n cors(options: {\n origin?: string;\n methods?: string[];\n headers?: string[];\n credentials?: boolean;\n maxAge?: number;\n } = {}): Record<string, string> {\n const {\n origin = '*',\n methods = ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'OPTIONS'],\n headers: allowHeaders = ['Content-Type', 'Authorization'],\n credentials = false,\n maxAge = 86400\n } = options;\n\n const corsHeaders: Record<string, string> = {\n 'Access-Control-Allow-Origin': origin,\n 'Access-Control-Allow-Methods': methods.join(', '),\n 'Access-Control-Allow-Headers': allowHeaders.join(', '),\n 'Access-Control-Max-Age': String(maxAge)\n };\n\n if (credentials) corsHeaders['Access-Control-Allow-Credentials'] = 'true';\n return corsHeaders;\n },\n\n cache(options: {\n maxAge?: number;\n sMaxAge?: number;\n staleWhileRevalidate?: number;\n private?: boolean;\n noStore?: boolean;\n } = {}): Record<string, string> {\n if (options.noStore) {\n return { 'Cache-Control': 'no-store, no-cache, must-revalidate' };\n }\n const directives: string[] = [];\n directives.push(options.private ? 'private' : 'public');\n if (options.maxAge !== undefined) directives.push(`max-age=${options.maxAge}`);\n if (options.sMaxAge !== undefined) directives.push(`s-maxage=${options.sMaxAge}`);\n if (options.staleWhileRevalidate !== undefined) directives.push(`stale-while-revalidate=${options.staleWhileRevalidate}`);\n return { 'Cache-Control': directives.join(', ') };\n }\n};\n\n// ============================================================================\n// Request Helpers\n// ============================================================================\n\nexport async function parseJson<T = unknown>(request: Request): Promise<T> {\n try { return await request.json(); }\n catch { throw new Error('Invalid JSON body'); }\n}\n\nexport async function parseFormData(request: Request): Promise<FormData> {\n return await request.formData();\n}\n\nexport function parseSearchParams(request: Request): URLSearchParams {\n return new URL(request.url).searchParams;\n}\n\nexport function getMethod(request: Request): string {\n return request.method.toUpperCase();\n}\n\nexport function getPathname(request: Request): string {\n return new URL(request.url).pathname;\n}\n\nexport function isMethod(request: Request, method: string | string[]): boolean {\n const reqMethod = getMethod(request);\n return Array.isArray(method)\n ? method.map(m => m.toUpperCase()).includes(reqMethod)\n : reqMethod === method.toUpperCase();\n}\n","/**\n * Velix v5.1 DevTools\n * 3-tab panel: Route · Performance · Info\n * Inspired by Next.js DevTools design\n */\n\nimport { VERSION as VELIX_VERSION } from '../version.js';\n\nexport interface DevToolsContext {\n version?: string;\n port?: number;\n host?: string;\n nodeVersion?: string;\n reactVersion?: string;\n tsVersion?: string;\n}\n\nexport interface DevToolsState {\n status: 'idle' | 'rendering' | 'compiling' | 'navigating' | 'error';\n route?: string;\n timestamp?: number;\n error?: string;\n}\n\n// ─── Inline SVG icons ───────────────────────────────────────────────────────\n\nconst ICON_ROUTE = `<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z\"/><polyline points=\"9 22 9 12 15 12 15 22\"/></svg>`;\nconst ICON_PERF = `<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><polyline points=\"12 6 12 12 16 14\"/></svg>`;\nconst ICON_INFO = `<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\"/><line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\"/></svg>`;\nconst ICON_FILE = `<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"/><polyline points=\"14 2 14 8 20 8\"/></svg>`;\nconst ICON_GEAR = `<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"3\"/><path d=\"M19.07 4.93a10 10 0 0 1 0 14.14M4.93 4.93a10 10 0 0 0 0 14.14\"/></svg>`;\nconst ICON_MON = `<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"2\" y=\"3\" width=\"20\" height=\"14\" rx=\"2\"/><line x1=\"8\" y1=\"21\" x2=\"16\" y2=\"21\"/><line x1=\"12\" y1=\"17\" x2=\"12\" y2=\"21\"/></svg>`;\nconst ICON_TS = `<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"4 7 4 4 20 4 20 7\"/><line x1=\"9\" y1=\"20\" x2=\"15\" y2=\"20\"/><line x1=\"12\" y1=\"4\" x2=\"12\" y2=\"20\"/></svg>`;\nconst ICON_CLOCK = `<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><polyline points=\"12 6 12 12 16 14\"/></svg>`;\nconst ICON_TRI = `<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 2L2 19h20L12 2z\"/></svg>`;\nconst ICON_TERM = `<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"4 17 10 11 4 5\"/><line x1=\"12\" y1=\"19\" x2=\"20\" y2=\"19\"/></svg>`;\nconst ICON_LOGO = `<img src=\"/__velix/logo.webp\" alt=\"Velix Logo\" width=\"14\" height=\"14\" style=\"border-radius:2px; object-fit:cover;\" onerror=\"this.style.display='none'\" />`;\n\n/**\n * Generate enhanced DevTools HTML — 3-tab panel.\n * Only injected in development mode.\n */\nexport function generateDevToolsHtml(isDev: boolean, ctx: DevToolsContext = {}): string {\n if (!isDev) return '';\n\n const version = ctx.version ?? VELIX_VERSION;\n const port = ctx.port ?? 3000;\n const host = ctx.host ?? 'localhost';\n const nodeVersion = ctx.nodeVersion ?? process.version.replace('v', '');\n const reactVersion = ctx.reactVersion ?? '—';\n const tsVersion = ctx.tsVersion ?? '—';\n\n return `\n<style>\n/* ── Velix DevTools v5.1 ────────────────────────────────── */\n#__vdt-btn{position:fixed;bottom:16px;left:16px;z-index:9999;width:40px;height:40px;border-radius:50%;background:#111827;border:2px solid #22D3EE;display:flex;align-items:center;justify-content:center;cursor:pointer;box-shadow:0 4px 16px rgba(0,0,0,.5);transition:transform .2s,box-shadow .2s;outline:none;}\n#__vdt-btn:hover{transform:scale(1.08);box-shadow:0 6px 20px rgba(34,211,238,.25);}\n#__vdt-dot{position:absolute;top:-3px;right:-3px;width:11px;height:11px;border-radius:50%;background:#22D3EE;border:2px solid #111827;transition:background .3s;}\n#__vdt{display:none;position:fixed;bottom:68px;left:16px;width:340px;background:#111827;color:#f3f4f6;border-radius:14px;font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;font-size:13px;box-shadow:0 24px 60px rgba(0,0,0,.6);z-index:10000;border:1px solid #1f2937;overflow:hidden;}\n/* header */\n.__vdt-header{display:flex;align-items:center;justify-content:space-between;padding:12px 16px;border-bottom:1px solid #1f2937;}\n.__vdt-brand{display:flex;align-items:center;gap:8px;font-weight:700;font-size:14px;color:#f9fafb;}\n.__vdt-badge{font-size:11px;font-weight:600;background:#1f2937;color:#9ca3af;border-radius:5px;padding:2px 7px;letter-spacing:.3px;}\n.__vdt-close{background:none;border:none;color:#6b7280;cursor:pointer;font-size:20px;line-height:1;padding:0;transition:color .15s;}\n.__vdt-close:hover{color:#f9fafb;}\n/* tabs */\n.__vdt-tabs{display:flex;border-bottom:1px solid #1f2937;}\n.__vdt-tab{flex:1;padding:10px 0;background:none;border:none;color:#6b7280;font-size:12px;font-weight:500;cursor:pointer;display:flex;align-items:center;justify-content:center;gap:5px;border-bottom:2px solid transparent;transition:color .15s,border-color .15s;font-family:inherit;letter-spacing:.1px;}\n.__vdt-tab:hover{color:#d1d5db;}\n.__vdt-tab.active{color:#10b981;border-bottom-color:#10b981;}\n/* body */\n.__vdt-body{padding:14px 16px;min-height:200px;}\n.__vdt-section{margin-bottom:14px;}\n.__vdt-label{font-size:11px;color:#6b7280;text-transform:uppercase;letter-spacing:.6px;margin-bottom:8px;}\n.__vdt-box{background:#1f2937;border-radius:8px;padding:10px 13px;font-size:13px;color:#e5e7eb;font-family:ui-monospace,'Cascadia Code','Fira Code',monospace;border:1px solid #374151;}\n.__vdt-row{display:flex;align-items:center;justify-content:space-between;padding:9px 13px;background:#1f2937;border-radius:8px;margin-bottom:6px;border:1px solid #374151;}\n.__vdt-row-left{display:flex;align-items:center;gap:8px;color:#d1d5db;}\n.__vdt-row-right{font-family:ui-monospace,'Cascadia Code',monospace;color:#10b981;font-size:12px;font-weight:500;}\n.__vdt-pill{font-size:10px;font-weight:600;padding:2px 7px;border-radius:4px;letter-spacing:.2px;}\n.__vdt-pill-green{background:#052e16;color:#4ade80;border:1px solid #166534;}\n.__vdt-pill-blue{background:#0c1a3a;color:#60a5fa;border:1px solid #1e3a8a;}\n.__vdt-render{display:flex;align-items:center;gap:6px;padding:8px 13px;background:#1f2937;border-radius:8px;border:1px solid #374151;color:#9ca3af;font-size:12px;}\n.__vdt-render svg{color:#6b7280;}\n/* vitals */\n.__vdt-vital{display:flex;align-items:center;justify-content:space-between;padding:9px 13px;background:#1f2937;border-radius:8px;margin-bottom:6px;border:1px solid #374151;}\n.__vdt-vital-left{display:flex;align-items:center;gap:8px;}\n.__vdt-dot-good{width:8px;height:8px;border-radius:50%;background:#10b981;flex-shrink:0;}\n.__vdt-dot-warn{width:8px;height:8px;border-radius:50%;background:#f59e0b;flex-shrink:0;}\n.__vdt-dot-bad{width:8px;height:8px;border-radius:50%;background:#ef4444;flex-shrink:0;}\n.__vdt-vital-name{color:#d1d5db;font-weight:500;}\n.__vdt-vital-val{font-family:ui-monospace,'Cascadia Code',monospace;color:#10b981;font-size:12px;font-weight:600;}\n.__vdt-build{display:flex;align-items:center;justify-content:space-between;padding:9px 13px;color:#9ca3af;font-size:12px;border-top:1px solid #374151;margin-top:8px;padding-top:12px;}\n/* info rows */\n.__vdt-info-row{display:flex;align-items:center;justify-content:space-between;padding:9px 13px;background:#1f2937;border-radius:8px;margin-bottom:6px;border:1px solid #374151;}\n.__vdt-info-left{display:flex;align-items:center;gap:8px;color:#d1d5db;}\n.__vdt-info-val{font-family:ui-monospace,'Cascadia Code',monospace;color:#9ca3af;font-size:12px;}\n.__vdt-dev-badge{display:flex;align-items:center;gap:8px;padding:10px 13px;background:#052e16;border:1px solid #166534;border-radius:8px;color:#4ade80;font-size:12px;font-weight:500;margin-top:10px;}\n/* footer */\n.__vdt-footer{padding:10px 16px;border-top:1px solid #1f2937;display:flex;align-items:center;justify-content:space-between;}\n.__vdt-host{color:#6b7280;font-size:11px;font-family:ui-monospace,'Cascadia Code',monospace;}\n.__vdt-conn{display:flex;align-items:center;gap:5px;font-size:11px;color:#10b981;}\n.__vdt-conn-dot{width:6px;height:6px;border-radius:50%;background:#10b981;}\n\n/* ── Widget state colors ── */\n.vdt-idle{border-color:#22D3EE !important;}\n.vdt-compiling{border-color:#4ade80 !important;}\n.vdt-rendering{border-color:#fb923c !important;}\n.vdt-navigating{border-color:#60a5fa !important;}\n.vdt-error{border-color:#f87171 !important;}\n#__vdt-dot.idle{background:#22D3EE;}\n#__vdt-dot.compiling{background:#4ade80;}\n#__vdt-dot.rendering{background:#fb923c;}\n#__vdt-dot.navigating{background:#60a5fa;}\n#__vdt-dot.error{background:#f87171;}\n@keyframes __vdt-pulse{0%,100%{opacity:1;}50%{opacity:.4;}}\n.vdt-compiling #__vdt-dot,.vdt-rendering #__vdt-dot,.vdt-navigating #__vdt-dot{animation:__vdt-pulse .9s ease-in-out infinite;}\n</style>\n\n<!-- ── Floating button ── -->\n<button id=\"__vdt-btn\" class=\"vdt-idle\" onclick=\"__vdtOpen()\" title=\"Velix DevTools (${version})\">\n ${ICON_LOGO}\n <div id=\"__vdt-dot\" class=\"idle\"></div>\n</button>\n\n<!-- ── Panel ── -->\n<div id=\"__vdt\">\n <!-- Header -->\n <div class=\"__vdt-header\">\n <div class=\"__vdt-brand\">\n ${ICON_LOGO}\n Velix\n <span class=\"__vdt-badge\">${version}</span>\n </div>\n <button class=\"__vdt-close\" onclick=\"__vdtClose()\" title=\"Close\">×</button>\n </div>\n\n <!-- Tabs -->\n <div class=\"__vdt-tabs\">\n <button class=\"__vdt-tab active\" id=\"__vtab-btn-route\" onclick=\"__vdtTab('route')\">${ICON_ROUTE} Route</button>\n <button class=\"__vdt-tab\" id=\"__vtab-btn-perf\" onclick=\"__vdtTab('perf')\">${ICON_PERF} Performance</button>\n <button class=\"__vdt-tab\" id=\"__vtab-btn-info\" onclick=\"__vdtTab('info')\">${ICON_INFO} Info</button>\n </div>\n\n <!-- Tab: Route -->\n <div class=\"__vdt-body\" id=\"__vtab-route\">\n <div class=\"__vdt-section\">\n <div class=\"__vdt-label\">Current Route</div>\n <div class=\"__vdt-box\" id=\"__vdt-route-path\">/</div>\n </div>\n <div class=\"__vdt-section\">\n <div class=\"__vdt-label\">Route Segments</div>\n <div class=\"__vdt-row\">\n <div class=\"__vdt-row-left\">${ICON_FILE} <span>app</span></div>\n <span class=\"__vdt-pill __vdt-pill-blue\">layout</span>\n </div>\n <div class=\"__vdt-row\" id=\"__vdt-page-row\">\n <div class=\"__vdt-row-left\">${ICON_FILE} <span id=\"__vdt-page-name\">page.tsx</span></div>\n <span class=\"__vdt-pill __vdt-pill-green\">page</span>\n </div>\n </div>\n <div class=\"__vdt-render\" id=\"__vdt-rendering\">\n ${ICON_TERM} Rendering: <strong id=\"__vdt-render-type\" style=\"color:#d1d5db;margin-left:4px;\">SSR</strong>\n </div>\n </div>\n\n <!-- Tab: Performance -->\n <div class=\"__vdt-body\" id=\"__vtab-perf\" style=\"display:none;\">\n <div class=\"__vdt-section\">\n <div class=\"__vdt-label\">Vitals</div>\n <div class=\"__vdt-vital\">\n <div class=\"__vdt-vital-left\"><div class=\"__vdt-dot-good\"></div><span class=\"__vdt-vital-name\">FCP</span></div>\n <span class=\"__vdt-vital-val\" id=\"__vdt-fcp\">—</span>\n </div>\n <div class=\"__vdt-vital\">\n <div class=\"__vdt-vital-left\"><div class=\"__vdt-dot-good\"></div><span class=\"__vdt-vital-name\">LCP</span></div>\n <span class=\"__vdt-vital-val\" id=\"__vdt-lcp\">—</span>\n </div>\n <div class=\"__vdt-vital\">\n <div class=\"__vdt-vital-left\"><div class=\"__vdt-dot-good\"></div><span class=\"__vdt-vital-name\">CLS</span></div>\n <span class=\"__vdt-vital-val\" id=\"__vdt-cls\">—</span>\n </div>\n <div class=\"__vdt-vital\">\n <div class=\"__vdt-vital-left\"><div class=\"__vdt-dot-good\"></div><span class=\"__vdt-vital-name\">TTFB</span></div>\n <span class=\"__vdt-vital-val\" id=\"__vdt-ttfb\">—</span>\n </div>\n </div>\n <div class=\"__vdt-build\">\n <div style=\"display:flex;align-items:center;gap:6px;\">${ICON_CLOCK} Build time:</div>\n <span id=\"__vdt-build-time\" style=\"color:#d1d5db;font-family:ui-monospace,monospace;font-size:12px;\">—</span>\n </div>\n </div>\n\n <!-- Tab: Info -->\n <div class=\"__vdt-body\" id=\"__vtab-info\" style=\"display:none;\">\n <div class=\"__vdt-info-row\">\n <div class=\"__vdt-info-left\">${ICON_LOGO} <span>Velix</span></div>\n <span class=\"__vdt-info-val\">${version}</span>\n </div>\n <div class=\"__vdt-info-row\">\n <div class=\"__vdt-info-left\">${ICON_GEAR} <span>React</span></div>\n <span class=\"__vdt-info-val\" id=\"__vdt-react-ver\">${reactVersion}</span>\n </div>\n <div class=\"__vdt-info-row\">\n <div class=\"__vdt-info-left\">${ICON_MON} <span>Node.js</span></div>\n <span class=\"__vdt-info-val\">${nodeVersion}</span>\n </div>\n <div class=\"__vdt-info-row\">\n <div class=\"__vdt-info-left\">${ICON_TS} <span>TypeScript</span></div>\n <span class=\"__vdt-info-val\" id=\"__vdt-ts-ver\">${tsVersion}</span>\n </div>\n <div class=\"__vdt-dev-badge\">\n ${ICON_TERM} Development mode active\n </div>\n </div>\n\n <!-- Footer -->\n <div class=\"__vdt-footer\">\n <span class=\"__vdt-host\">${host}:${port}</span>\n <div class=\"__vdt-conn\">\n <div class=\"__vdt-conn-dot\" id=\"__vdt-conn-dot\"></div>\n <span id=\"__vdt-conn-text\">connected</span>\n </div>\n </div>\n</div>\n\n<script>\n(function(){\n /* ── Tab switching ── */\n window.__vdtTab = function(name){\n ['route','perf','info'].forEach(function(t){\n var body = document.getElementById('__vtab-' + t);\n var btn = document.getElementById('__vtab-btn-' + t);\n if(!body || !btn) return;\n var active = t === name;\n body.style.display = active ? 'block' : 'none';\n btn.classList.toggle('active', active);\n });\n };\n\n window.__vdtOpen = function(){ document.getElementById('__vdt').style.display = 'block'; };\n window.__vdtClose = function(){ document.getElementById('__vdt').style.display = 'none'; };\n\n /* ── Route info ── */\n function updateRoute(){\n var p = window.location.pathname;\n var el = document.getElementById('__vdt-route-path');\n if(el) el.textContent = p;\n var seg = p.split('/').filter(Boolean);\n var pageName = seg.length ? seg[seg.length-1] + '.tsx' : 'page.tsx';\n var pn = document.getElementById('__vdt-page-name');\n if(pn) pn.textContent = pageName;\n /* Detect rendering mode from meta generator or search param */\n var rt = document.getElementById('__vdt-render-type');\n if(rt){\n var sp = new URLSearchParams(window.location.search);\n rt.textContent = sp.get('_render') || (document.querySelector('meta[name=\"generator\"]') ? 'SSR' : 'Static');\n }\n }\n updateRoute();\n window.addEventListener('popstate', updateRoute);\n\n /* ── Web Vitals ── */\n function fmtMs(v){ return v < 1000 ? Math.round(v) + 'ms' : (v/1000).toFixed(2) + 's'; }\n function setVital(id, v, threshGood, threshOk){\n var el = document.getElementById(id);\n if(!el) return;\n el.textContent = typeof v === 'number' ? (id === '__vdt-cls' ? v.toFixed(3) : fmtMs(v)) : v;\n var dot = el.closest('.__vdt-vital')?.querySelector('[class^=\"__vdt-dot\"]');\n if(dot && typeof v === 'number'){\n dot.className = v <= threshGood ? '__vdt-dot-good' : v <= threshOk ? '__vdt-dot-warn' : '__vdt-dot-bad';\n }\n if(el && typeof v === 'number'){\n el.style.color = v <= threshGood ? '#10b981' : v <= threshOk ? '#f59e0b' : '#ef4444';\n }\n }\n\n try {\n /* FCP */\n new PerformanceObserver(function(l){\n var e = l.getEntries()[0]; if(e) setVital('__vdt-fcp', e.startTime, 1800, 3000);\n }).observe({ type:'paint', buffered:true });\n\n /* LCP */\n new PerformanceObserver(function(l){\n var entries = l.getEntries();\n var e = entries[entries.length-1]; if(e) setVital('__vdt-lcp', e.startTime, 2500, 4000);\n }).observe({ type:'largest-contentful-paint', buffered:true });\n\n /* CLS */\n var _cls = 0;\n new PerformanceObserver(function(l){\n l.getEntries().forEach(function(e){ if(!e.hadRecentInput) _cls += e.value; });\n setVital('__vdt-cls', _cls, 0.1, 0.25);\n }).observe({ type:'layout-shift', buffered:true });\n\n /* TTFB */\n new PerformanceObserver(function(l){\n var e = l.getEntries()[0]; if(e) setVital('__vdt-ttfb', e.responseStart - e.requestStart, 800, 1800);\n }).observe({ type:'navigation', buffered:true });\n } catch(e){}\n\n /* Build time from server-injected global */\n var bt = window.__VELIX_BUILD_TIME__;\n var btel = document.getElementById('__vdt-build-time');\n if(btel) btel.textContent = bt ? bt + 'ms' : '—';\n\n /* React version from window.React or server injection */\n var rv = document.getElementById('__vdt-react-ver');\n if(rv && rv.textContent === '—' && window.React) rv.textContent = window.React.version;\n\n /* TypeScript version (injected by server if available) */\n var tsv = document.getElementById('__vdt-ts-ver');\n if(tsv && tsv.textContent === '—') tsv.textContent = window.__VELIX_TS_VERSION__ || '—';\n\n /* ── HMR + Status ── */\n var btn = document.getElementById('__vdt-btn');\n var dot = document.getElementById('__vdt-dot');\n var connDot = document.getElementById('__vdt-conn-dot');\n var connText = document.getElementById('__vdt-conn-text');\n\n function setStatus(s){\n if(btn){ btn.className = 'vdt-' + s; }\n if(dot){ dot.className = s; }\n }\n\n function setConn(ok){\n if(connDot) connDot.style.background = ok ? '#10b981' : '#ef4444';\n if(connText) connText.textContent = ok ? 'connected' : 'disconnected';\n if(connText) connText.style.color = ok ? '#10b981' : '#ef4444';\n }\n\n var ws = new WebSocket('ws://' + window.location.host + '/__velix_hmr');\n\n ws.onopen = function(){ setConn(true); };\n\n ws.onmessage = function(e){\n var data;\n try {\n data = JSON.parse(e.data);\n } catch(err) { return; }\n\n if(data.type === 'full-reload'){\n setStatus('navigating');\n setTimeout(function(){ location.reload(); }, 120);\n } else if(data.type === 'compile-start'){\n setStatus('compiling');\n } else if(data.type === 'compile-done'){\n setStatus('idle');\n var btel = document.getElementById('__vdt-build-time');\n if(btel) btel.textContent = data.duration + 'ms';\n } else if(data.type === 'compile-error'){\n setStatus('error');\n }\n };\n\n ws.onerror = function(){\n if(ws.readyState === 2 || ws.readyState === 3){\n setStatus('error');\n setConn(false);\n }\n };\n \n ws.onclose = function(){\n setStatus('error');\n setConn(false);\n };\n\n setStatus('idle');\n})();\n</script>`;\n}\n","/**\n * Velix v5 Error Pages\n * Beautiful error pages inspired by Next.js latest design\n */\n\nimport { VERSION } from '../version.js';\n\nexport interface ErrorPageOptions {\n statusCode: number;\n title: string;\n message: string;\n stack?: string;\n isDev?: boolean;\n pathname?: string;\n}\n\n/**\n * Generate a styled 404 error page\n */\nexport function generate404Page(pathname: string = '/'): string {\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>404 - Page Not Found | Velix v5</title>\n <link rel=\"icon\" href=\"/favicon.webp\">\n <style>\n * { margin: 0; padding: 0; box-sizing: border-box; }\n body { \n margin: 0; \n background: linear-gradient(135deg, #0F172A 0%, #1E293B 100%); \n color: white; \n font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif; \n display: flex; \n align-items: center; \n justify-content: center; \n min-height: 100vh; \n text-align: center;\n overflow: hidden;\n }\n .container { \n max-width: 700px; \n padding: 60px 40px; \n position: relative;\n z-index: 10;\n }\n .bg-pattern {\n position: absolute;\n inset: 0;\n background-image: radial-gradient(circle at 20% 50%, rgba(34, 211, 238, 0.1) 0%, transparent 50%),\n radial-gradient(circle at 80% 80%, rgba(37, 99, 235, 0.1) 0%, transparent 50%);\n z-index: 1;\n }\n h1 { \n font-size: 180px; \n font-weight: 900; \n margin: 0; \n background: linear-gradient(135deg, #22D3EE 0%, #2563EB 100%); \n -webkit-background-clip: text; \n -webkit-text-fill-color: transparent; \n line-height: 1; \n letter-spacing: -0.05em;\n animation: fadeInUp 0.6s ease-out;\n }\n h2 { \n font-size: 36px; \n font-weight: 800; \n margin: 30px 0 15px; \n color: #F8FAFC;\n animation: fadeInUp 0.6s ease-out 0.1s backwards;\n }\n p { \n color: #94A3B8; \n font-size: 18px; \n line-height: 1.7; \n margin-bottom: 40px;\n animation: fadeInUp 0.6s ease-out 0.2s backwards;\n }\n code { \n background: rgba(255,255,255,0.1); \n padding: 4px 10px; \n border-radius: 6px; \n font-family: 'Fira Code', 'Courier New', monospace; \n color: #22D3EE; \n font-size: 16px;\n border: 1px solid rgba(34, 211, 238, 0.2);\n }\n .btn-group {\n display: flex;\n gap: 16px;\n justify-content: center;\n flex-wrap: wrap;\n animation: fadeInUp 0.6s ease-out 0.3s backwards;\n }\n .btn { \n display: inline-block; \n background: linear-gradient(135deg, #2563EB 0%, #1D4ED8 100%); \n color: white; \n text-decoration: none; \n padding: 14px 36px; \n border-radius: 12px; \n font-weight: 600; \n font-size: 16px;\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); \n box-shadow: 0 10px 30px rgba(37, 99, 235, 0.3);\n border: none;\n cursor: pointer;\n }\n .btn:hover { \n transform: translateY(-2px); \n box-shadow: 0 15px 40px rgba(37, 99, 235, 0.4);\n }\n .btn-outline { \n background: transparent; \n color: #22D3EE; \n border: 2px solid #22D3EE; \n box-shadow: none;\n }\n .btn-outline:hover { \n background: rgba(34, 211, 238, 0.1); \n box-shadow: 0 10px 30px rgba(34, 211, 238, 0.2);\n }\n @keyframes fadeInUp {\n from {\n opacity: 0;\n transform: translateY(30px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n }\n </style>\n</head>\n<body>\n <div class=\"bg-pattern\"></div>\n <div class=\"container\">\n <h1>404</h1>\n <h2>Page Not Found</h2>\n <p>The page <code>${pathname}</code> could not be found.<br>It may have been moved or deleted.</p>\n <div class=\"btn-group\">\n <a href=\"/\" class=\"btn\">Return Home</a>\n <a href=\"javascript:history.back()\" class=\"btn btn-outline\">Go Back</a>\n </div>\n </div>\n</body>\n</html>`;\n}\n\n/**\n * Generate a styled 500 error page\n */\nexport function generate500Page(options: ErrorPageOptions): string {\n const { title, message, stack, isDev, pathname } = options;\n\n // Parse stack trace to display as cards like Next.js\n let callStackCards = '';\n let frameCount = 0;\n \n if (isDev && stack) {\n const stackLines = stack.split('\\n').filter(line => line.trim());\n const frames = stackLines.slice(1).filter(line => line.includes('at '));\n frameCount = frames.length;\n \n callStackCards = frames.map((frame, index) => {\n const match = frame.match(/at\\s+(.+?)\\s+\\((.+?)\\)/) || frame.match(/at\\s+(.+)/);\n if (match) {\n const funcName = match[1] || 'anonymous';\n const location = match[2] || match[1];\n return `\n <div class=\"error-card\" data-frame=\"${index}\">\n <div class=\"card-header\">\n <div class=\"card-title\">${funcName.trim()}</div>\n <div class=\"card-number\">${index + 1}</div>\n </div>\n <div class=\"card-location\">${location.trim()}</div>\n </div>\n `;\n }\n return '';\n }).join('');\n }\n\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Error | Velix v5</title>\n <link rel=\"icon\" href=\"/favicon.webp\">\n <style>\n * { margin: 0; padding: 0; box-sizing: border-box; }\n body { \n margin: 0; \n background: linear-gradient(135deg, #0F172A 0%, #1E293B 100%);\n color: #F8FAFC; \n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; \n min-height: 100vh;\n overflow-x: hidden;\n }\n .container {\n max-width: 900px;\n margin: 0 auto;\n padding: 40px 20px;\n }\n .error-header {\n background: linear-gradient(135deg, #EF4444 0%, #DC2626 100%);\n color: white;\n padding: 20px 28px;\n border-radius: 16px;\n display: flex;\n align-items: center;\n gap: 14px;\n margin-bottom: 28px;\n font-size: 18px;\n font-weight: 700;\n box-shadow: 0 10px 40px rgba(239, 68, 68, 0.3);\n }\n .error-header svg {\n width: 24px;\n height: 24px;\n flex-shrink: 0;\n }\n .error-badge {\n display: inline-block;\n background: linear-gradient(135deg, #1E40AF 0%, #1E3A8A 100%);\n color: #60A5FA;\n padding: 6px 16px;\n border-radius: 8px;\n font-size: 13px;\n font-weight: 700;\n margin-bottom: 18px;\n text-transform: uppercase;\n letter-spacing: 0.8px;\n box-shadow: 0 4px 12px rgba(30, 64, 175, 0.3);\n }\n .route-badge {\n background: linear-gradient(135deg, #0C4A6E 0%, #075985 100%);\n color: #22D3EE;\n padding: 10px 18px;\n border-radius: 10px;\n font-size: 14px;\n margin-bottom: 24px;\n font-family: 'Courier New', monospace;\n box-shadow: 0 4px 12px rgba(12, 74, 110, 0.3);\n border: 1px solid rgba(34, 211, 238, 0.2);\n }\n .error-message {\n background: rgba(239, 68, 68, 0.1);\n border-left: 4px solid #EF4444;\n padding: 18px 20px;\n border-radius: 10px;\n margin-bottom: 32px;\n }\n .error-message-text {\n color: #FCA5A5;\n font-size: 16px;\n font-weight: 600;\n line-height: 1.6;\n font-family: 'Courier New', monospace;\n }\n .stack-section {\n margin-top: 32px;\n }\n .stack-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 20px;\n }\n .stack-title {\n font-size: 18px;\n font-weight: 700;\n color: #F1F5F9;\n display: flex;\n align-items: center;\n gap: 10px;\n }\n .frame-counter {\n background: linear-gradient(135deg, #1F2937 0%, #111827 100%);\n color: #22D3EE;\n padding: 6px 14px;\n border-radius: 8px;\n font-size: 13px;\n font-weight: 700;\n border: 1px solid rgba(34, 211, 238, 0.2);\n }\n .error-card {\n background: linear-gradient(135deg, #1E293B 0%, #0F172A 100%);\n border: 1px solid rgba(34, 211, 238, 0.2);\n border-radius: 14px;\n padding: 20px;\n margin-bottom: 12px;\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);\n display: none;\n }\n .error-card.active {\n display: block;\n animation: slideIn 0.3s ease-out;\n }\n .error-card:hover {\n border-color: rgba(34, 211, 238, 0.5);\n box-shadow: 0 8px 24px rgba(34, 211, 238, 0.2);\n transform: translateY(-2px);\n }\n .card-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 12px;\n }\n .card-title {\n color: #22D3EE;\n font-size: 15px;\n font-weight: 700;\n font-family: 'Courier New', monospace;\n }\n .card-number {\n background: rgba(34, 211, 238, 0.2);\n color: #22D3EE;\n padding: 4px 10px;\n border-radius: 6px;\n font-size: 12px;\n font-weight: 700;\n }\n .card-location {\n color: #94A3B8;\n font-size: 13px;\n font-family: 'Courier New', monospace;\n word-break: break-all;\n line-height: 1.6;\n }\n .pagination {\n display: flex;\n justify-content: center;\n align-items: center;\n gap: 12px;\n margin-top: 24px;\n }\n .pagination-btn {\n background: linear-gradient(135deg, #1E293B 0%, #0F172A 100%);\n border: 1px solid rgba(34, 211, 238, 0.3);\n color: #22D3EE;\n padding: 10px 20px;\n border-radius: 10px;\n font-size: 14px;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.2s;\n }\n .pagination-btn:hover:not(:disabled) {\n background: linear-gradient(135deg, #22D3EE 0%, #06B6D4 100%);\n color: #0F172A;\n transform: translateY(-2px);\n box-shadow: 0 6px 20px rgba(34, 211, 238, 0.4);\n }\n .pagination-btn:disabled {\n opacity: 0.3;\n cursor: not-allowed;\n }\n .pagination-info {\n color: #94A3B8;\n font-size: 14px;\n font-weight: 600;\n }\n .footer {\n margin-top: 48px;\n padding-top: 28px;\n border-top: 1px solid rgba(34, 211, 238, 0.2);\n display: flex;\n justify-content: space-between;\n align-items: center;\n flex-wrap: wrap;\n gap: 20px;\n }\n .brand {\n display: flex;\n align-items: center;\n gap: 10px;\n font-weight: 700;\n color: #22D3EE;\n font-size: 15px;\n }\n .brand img {\n width: 20px;\n height: 20px;\n }\n .footer-links {\n display: flex;\n gap: 24px;\n flex-wrap: wrap;\n }\n .footer-links a {\n color: #60A5FA;\n text-decoration: none;\n font-weight: 600;\n transition: all 0.2s;\n font-size: 14px;\n }\n .footer-links a:hover {\n color: #22D3EE;\n transform: translateY(-1px);\n }\n .no-stack {\n background: rgba(239, 68, 68, 0.1);\n border: 1px solid rgba(239, 68, 68, 0.3);\n border-radius: 12px;\n padding: 32px;\n color: #FCA5A5;\n text-align: center;\n font-size: 15px;\n }\n @keyframes slideIn {\n from {\n opacity: 0;\n transform: translateY(10px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n }\n </style>\n</head>\n<body>\n <div class=\"container\">\n <div class=\"error-header\">\n <svg fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z\"></path>\n </svg>\n <span>Unhandled Runtime Error</span>\n </div>\n \n <div class=\"error-badge\">SERVER ERROR 500</div>\n ${pathname ? `<div class=\"route-badge\">Route: ${pathname}</div>` : ''}\n \n <div class=\"error-message\">\n <div class=\"error-message-text\">${message}</div>\n </div>\n \n ${isDev && callStackCards ? `\n <div class=\"stack-section\">\n <div class=\"stack-header\">\n <div class=\"stack-title\">\n <svg width=\"20\" height=\"20\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\"></path>\n </svg>\n Call Stack\n </div>\n <div class=\"frame-counter\">${frameCount}</div>\n </div>\n <div id=\"error-cards\">\n ${callStackCards}\n </div>\n ${frameCount > 1 ? `\n <div class=\"pagination\">\n <button class=\"pagination-btn\" id=\"prev-btn\" onclick=\"changePage(-1)\">\n <svg width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" style=\"display:inline;vertical-align:middle;margin-right:4px;\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M15 19l-7-7 7-7\"></path>\n </svg>\n Previous\n </button>\n <div class=\"pagination-info\">\n <span id=\"current-page\">1</span> / <span id=\"total-pages\">${frameCount}</span>\n </div>\n <button class=\"pagination-btn\" id=\"next-btn\" onclick=\"changePage(1)\">\n Next\n <svg width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" style=\"display:inline;vertical-align:middle;margin-left:4px;\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M9 5l7 7-7 7\"></path>\n </svg>\n </button>\n </div>\n ` : ''}\n </div>\n ` : '<div class=\"no-stack\">An error occurred while processing your request. Please check the server logs for more details.</div>'}\n \n <div class=\"footer\">\n <div class=\"brand\">\n <img src=\"/__velix/logo.webp\" alt=\"Velix\" onerror=\"this.style.display='none'\"/>\n <span>Velix v${VERSION}</span>\n </div>\n <div class=\"footer-links\">\n <a href=\"/\">Home</a>\n <a href=\"javascript:location.reload()\">Reload</a>\n <a href=\"https://github.com/velix/velix/tree/main/docs\" target=\"_blank\">Documentation</a>\n ${isDev ? '<span style=\"color:#94A3B8;\">Development Mode</span>' : ''}\n </div>\n </div>\n </div>\n \n ${isDev && frameCount > 0 ? `\n <script>\n let currentPage = 1;\n const totalPages = ${frameCount};\n const cards = document.querySelectorAll('.error-card');\n const prevBtn = document.getElementById('prev-btn');\n const nextBtn = document.getElementById('next-btn');\n const currentPageSpan = document.getElementById('current-page');\n \n function showPage(page) {\n cards.forEach((card, index) => {\n card.classList.remove('active');\n if (index === page - 1) {\n card.classList.add('active');\n }\n });\n \n currentPage = page;\n currentPageSpan.textContent = page;\n \n if (prevBtn) prevBtn.disabled = page === 1;\n if (nextBtn) nextBtn.disabled = page === totalPages;\n }\n \n function changePage(direction) {\n const newPage = currentPage + direction;\n if (newPage >= 1 && newPage <= totalPages) {\n showPage(newPage);\n }\n }\n \n // Show first page on load\n showPage(1);\n \n // Keyboard navigation\n document.addEventListener('keydown', (e) => {\n if (e.key === 'ArrowLeft') changePage(-1);\n if (e.key === 'ArrowRight') changePage(1);\n });\n </script>\n ` : ''}\n</body>\n</html>`;\n}\n\n/**\n * Generate error page based on status code\n */\nexport function generateErrorPage(statusCode: number, options: Partial<ErrorPageOptions> = {}): string {\n if (statusCode === 404) {\n return generate404Page(options.pathname || '/');\n }\n\n return generate500Page({\n statusCode,\n title: options.title || 'Server Error',\n message: options.message || 'An unexpected error occurred',\n stack: options.stack,\n isDev: options.isDev,\n pathname: options.pathname,\n });\n}\n"],"mappings":"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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAyJ3C;;;AClXA;AAmBO,SAAS,gBAAgB,WAAmB,KAAa;AAC9D,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA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","names":["fs","path","fs","path","fileURLToPath","pathToFileURL","React","path","path","fs","path","fs","fs","path","fs","fs","path","path","fs","pathToFileURL","cookies","c","url","fs","path","pathToFileURL","path","cookies","pathToFileURL","path","handleImageOptimization","fs","React","headers","mod","__filename","fileURLToPath","__dirname"]}
|