@teamvelix/velix 5.1.6 → 5.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/README.md +1 -1
  2. package/dist/build/index.js +3 -2
  3. package/dist/chunk-4S5YQJHB.js +11 -0
  4. package/dist/chunk-4S5YQJHB.js.map +1 -0
  5. package/dist/{chunk-TGNK4MY5.js → chunk-DTF3KTLR.js} +116 -53
  6. package/dist/chunk-DTF3KTLR.js.map +1 -0
  7. package/dist/{chunk-OIZNYND3.js → chunk-JI2HJFUT.js} +2 -2
  8. package/dist/chunk-JI2HJFUT.js.map +1 -0
  9. package/dist/{chunk-RFWV4CDG.js → chunk-QIPVMOXL.js} +4 -4
  10. package/dist/chunk-QIPVMOXL.js.map +1 -0
  11. package/dist/{chunk-INOZP2VD.js → chunk-QLFG6PW3.js} +3 -2
  12. package/dist/chunk-QLFG6PW3.js.map +1 -0
  13. package/dist/{chunk-BXDKUP2L.js → chunk-XXPHGRLC.js} +3 -3
  14. package/dist/{chunk-BXDKUP2L.js.map → chunk-XXPHGRLC.js.map} +1 -1
  15. package/dist/client/index.d.ts +2 -1
  16. package/dist/client/index.js +2 -1
  17. package/dist/config.d.ts +2 -2
  18. package/dist/config.js +1 -0
  19. package/dist/{image-optimizer-I6TWWH6W.js → image-optimizer-KPRXE5VI.js} +3 -3
  20. package/dist/image-optimizer-KPRXE5VI.js.map +1 -0
  21. package/dist/index-8CqitL9K.d.ts +300 -0
  22. package/dist/{index-C4udNtpZ.d.ts → index-ChyKLf1W.d.ts} +18 -3
  23. package/dist/index.d.ts +104 -226
  24. package/dist/index.js +12 -6
  25. package/dist/index.js.map +1 -1
  26. package/dist/islands/index.d.ts +22 -10
  27. package/dist/islands/index.js +2 -1
  28. package/dist/runtime/start-build.js +2 -2
  29. package/dist/runtime/start-build.js.map +1 -1
  30. package/dist/runtime/start-dev.js +117 -46
  31. package/dist/runtime/start-dev.js.map +1 -1
  32. package/dist/runtime/start-prod.js +117 -46
  33. package/dist/runtime/start-prod.js.map +1 -1
  34. package/dist/server/index.d.ts +3 -1
  35. package/dist/server/index.js +4 -3
  36. package/package.json +60 -58
  37. package/dist/chunk-INOZP2VD.js.map +0 -1
  38. package/dist/chunk-OIZNYND3.js.map +0 -1
  39. package/dist/chunk-RFWV4CDG.js.map +0 -1
  40. package/dist/chunk-TGNK4MY5.js.map +0 -1
  41. package/dist/image-optimizer-I6TWWH6W.js.map +0 -1
  42. package/dist/index-DYgxL3mE.d.ts +0 -107
@@ -1 +1 @@
1
- {"version":3,"sources":["../../build/index.ts","../../config.ts","../../router/index.ts","../../utils.ts","../../version.ts","../../logger.ts","../../runtime/start-build.ts"],"sourcesContent":["/**\n * Velix v5 Build System\n * Production build using esbuild\n */\n\nimport esbuild from 'esbuild';\nimport fs from 'fs';\nimport path from 'path';\nimport { loadConfig, resolvePaths } from '../config.js';\nimport { buildRouteTree } from '../router/index.js';\nimport { ensureDir, cleanDir, findFiles, formatBytes, formatTime } from '../utils.js';\nimport logger from '../logger.js';\nimport { VERSION } from '../version.js';\n\nexport interface BuildOptions {\n projectRoot?: string;\n outDir?: string;\n minify?: boolean;\n sourcemap?: boolean;\n}\n\n/**\n * Build the Velix application for production\n */\nexport async function build(options: BuildOptions = {}) {\n const projectRoot = options.projectRoot || process.cwd();\n const config = await loadConfig(projectRoot);\n const resolved = resolvePaths(config, projectRoot);\n\n const outDir = options.outDir || resolved.resolvedOutDir;\n const startTime = Date.now();\n\n logger.logo();\n logger.info('Building for production...');\n logger.blank();\n\n // Clean output directory\n cleanDir(outDir);\n\n const appDir = resolved.resolvedAppDir;\n const routes = buildRouteTree(appDir);\n\n // Collect all source files\n const sourceFiles = findFiles(appDir, /\\.(tsx?|jsx?)$/);\n\n if (sourceFiles.length === 0) {\n logger.warn('No source files found in app/ directory');\n return;\n }\n\n // Build server bundle\n try {\n const serverOutDir = path.join(outDir, 'server');\n ensureDir(serverOutDir);\n\n await esbuild.build({\n entryPoints: sourceFiles,\n outdir: serverOutDir,\n bundle: false,\n format: 'esm',\n platform: 'node',\n target: config.build.target,\n minify: options.minify ?? config.build.minify,\n sourcemap: options.sourcemap ?? config.build.sourcemap,\n jsx: 'automatic',\n logLevel: 'silent',\n treeShaking: true,\n legalComments: 'none',\n });\n\n logger.success('Server bundle built');\n } catch (err: any) {\n logger.error('Server build failed', err);\n process.exit(1);\n }\n\n // Build client bundle (client components and islands)\n try {\n const clientOutDir = path.join(outDir, 'client');\n ensureDir(clientOutDir);\n\n const clientFiles = sourceFiles.filter(f => {\n const content = fs.readFileSync(f, 'utf-8');\n const firstLine = content.split('\\n')[0]?.trim();\n return firstLine === \"'use client'\" || firstLine === '\"use client\"' ||\n firstLine === \"'use island'\" || firstLine === '\"use island\"';\n });\n\n if (clientFiles.length > 0) {\n await esbuild.build({\n entryPoints: clientFiles,\n outdir: clientOutDir,\n bundle: true,\n format: 'esm',\n platform: 'browser',\n target: ['es2022'],\n minify: options.minify ?? config.build.minify,\n sourcemap: options.sourcemap ?? config.build.sourcemap,\n splitting: config.build.splitting,\n jsx: 'automatic',\n logLevel: 'silent',\n external: ['react', 'react-dom'],\n treeShaking: true,\n legalComments: 'none',\n drop: options.minify ?? config.build.minify ? ['console', 'debugger'] : [],\n chunkNames: 'chunks/[name]-[hash]',\n });\n\n logger.success(`Client bundle built (${clientFiles.length} components)`);\n }\n } catch (err: any) {\n logger.error('Client build failed', err);\n process.exit(1);\n }\n\n // Copy public directory\n const publicDir = resolved.resolvedPublicDir;\n if (fs.existsSync(publicDir)) {\n const publicOutDir = path.join(outDir, 'public');\n ensureDir(publicOutDir);\n copyDirRecursive(publicDir, publicOutDir);\n logger.success('Static assets copied');\n }\n\n // Generate build manifest\n const manifest = {\n version: VERSION,\n buildTime: new Date().toISOString(),\n routes: routes.appRoutes.map(r => ({\n path: r.path,\n type: r.path.includes(':') ? 'dynamic' : 'static',\n })),\n api: routes.api.map(r => ({ path: r.path })),\n };\n\n fs.writeFileSync(path.join(outDir, 'manifest.json'), JSON.stringify(manifest, null, 2));\n\n const elapsed = Date.now() - startTime;\n const totalSize = getDirSize(outDir);\n\n logger.blank();\n logger.divider();\n logger.blank();\n\n // Log routes\n routes.appRoutes.forEach(r => {\n const type = r.path.includes(':') || r.path.includes('*') ? 'dynamic' : 'static';\n logger.route(r.path, type);\n });\n routes.api.forEach(r => logger.route(r.path, 'api'));\n\n logger.blank();\n logger.build({ time: elapsed });\n logger.info(`Output: ${outDir} (${formatBytes(totalSize)})`);\n logger.blank();\n}\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\nfunction copyDirRecursive(src: string, dest: string) {\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()) copyDirRecursive(srcPath, destPath);\n else fs.copyFileSync(srcPath, destPath);\n }\n}\n\nfunction getDirSize(dir: string): number {\n let size = 0;\n if (!fs.existsSync(dir)) return size;\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()) size += getDirSize(fullPath);\n else size += fs.statSync(fullPath).size;\n }\n return size;\n}\n\nexport default { build };\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';\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: any[];\n api: any[];\n layouts: Map<string, string>;\n tree: Record<string, any>;\n appRoutes: any[];\n rootLayout?: string;\n } = {\n pages: [],\n api: [],\n layouts: new Map(),\n tree: {},\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: any,\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: any, 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: any[]) {\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: any, 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: any[]): any {\n const tree: any = { 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 '&': '&amp;', '<': '&lt;', '>': '&gt;',\n '\"': '&quot;', \"'\": '&#39;'\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: any[]) => any>(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() {\n let resolve: any, reject: any;\n const promise = new Promise((res, rej) => { resolve = res; reject = rej; });\n return { promise, resolve, 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 version — single source of truth.\n * Update this file only when releasing a new version.\n */\nexport const VERSION = '5.1.4';\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: any, 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 v5 — Build Script\n * Build the application for production\n */\n\nimport { build } from '../build/index.js';\nimport logger from '../logger.js';\n\nbuild().catch(err => {\n logger.error('Build failed', err);\n process.exit(1);\n});\n"],"mappings":"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","names":["fs","path","fs","path","fs","path","fs","path","fs","path","fs","path","path","fs"]}
1
+ {"version":3,"sources":["../../build/index.ts","../../config.ts","../../router/index.ts","../../utils.ts","../../version.ts","../../logger.ts","../../runtime/start-build.ts"],"sourcesContent":["/**\n * Velix v5 Build System\n * Production build using esbuild\n */\n\nimport esbuild from 'esbuild';\nimport fs from 'fs';\nimport path from 'path';\nimport { loadConfig, resolvePaths } from '../config.js';\nimport { buildRouteTree } from '../router/index.js';\nimport { ensureDir, cleanDir, findFiles, formatBytes, formatTime } from '../utils.js';\nimport logger from '../logger.js';\nimport { VERSION } from '../version.js';\n\nexport interface BuildOptions {\n projectRoot?: string;\n outDir?: string;\n minify?: boolean;\n sourcemap?: boolean;\n}\n\n/**\n * Build the Velix application for production\n */\nexport async function build(options: BuildOptions = {}) {\n const projectRoot = options.projectRoot || process.cwd();\n const config = await loadConfig(projectRoot);\n const resolved = resolvePaths(config, projectRoot);\n\n const outDir = options.outDir || resolved.resolvedOutDir;\n const startTime = Date.now();\n\n logger.logo();\n logger.info('Building for production...');\n logger.blank();\n\n // Clean output directory\n cleanDir(outDir);\n\n const appDir = resolved.resolvedAppDir;\n const routes = buildRouteTree(appDir);\n\n // Collect all source files\n const sourceFiles = findFiles(appDir, /\\.(tsx?|jsx?)$/);\n\n if (sourceFiles.length === 0) {\n logger.warn('No source files found in app/ directory');\n return;\n }\n\n // Build server bundle\n try {\n const serverOutDir = path.join(outDir, 'server');\n ensureDir(serverOutDir);\n\n await esbuild.build({\n entryPoints: sourceFiles,\n outdir: serverOutDir,\n bundle: false,\n format: 'esm',\n platform: 'node',\n target: config.build.target,\n minify: options.minify ?? config.build.minify,\n sourcemap: options.sourcemap ?? config.build.sourcemap,\n jsx: 'automatic',\n logLevel: 'silent',\n treeShaking: true,\n legalComments: 'none',\n });\n\n logger.success('Server bundle built');\n } catch (err: any) {\n logger.error('Server build failed', err);\n process.exit(1);\n }\n\n // Build client bundle (client components and islands)\n try {\n const clientOutDir = path.join(outDir, 'client');\n ensureDir(clientOutDir);\n\n const clientFiles = sourceFiles.filter(f => {\n const content = fs.readFileSync(f, 'utf-8');\n const firstLine = content.split('\\n')[0]?.trim();\n return firstLine === \"'use client'\" || firstLine === '\"use client\"' ||\n firstLine === \"'use island'\" || firstLine === '\"use island\"';\n });\n\n if (clientFiles.length > 0) {\n await esbuild.build({\n entryPoints: clientFiles,\n outdir: clientOutDir,\n bundle: true,\n format: 'esm',\n platform: 'browser',\n target: ['es2022'],\n minify: options.minify ?? config.build.minify,\n sourcemap: options.sourcemap ?? config.build.sourcemap,\n splitting: config.build.splitting,\n jsx: 'automatic',\n logLevel: 'silent',\n external: ['react', 'react-dom'],\n treeShaking: true,\n legalComments: 'none',\n drop: options.minify ?? config.build.minify ? ['console', 'debugger'] : [],\n chunkNames: 'chunks/[name]-[hash]',\n });\n\n logger.success(`Client bundle built (${clientFiles.length} components)`);\n }\n } catch (err: any) {\n logger.error('Client build failed', err);\n process.exit(1);\n }\n\n // Copy public directory\n const publicDir = resolved.resolvedPublicDir;\n if (fs.existsSync(publicDir)) {\n const publicOutDir = path.join(outDir, 'public');\n ensureDir(publicOutDir);\n copyDirRecursive(publicDir, publicOutDir);\n logger.success('Static assets copied');\n }\n\n // Generate build manifest\n const manifest = {\n version: VERSION,\n buildTime: new Date().toISOString(),\n routes: routes.appRoutes.map(r => ({\n path: r.path,\n type: r.path.includes(':') ? 'dynamic' : 'static',\n })),\n api: routes.api.map(r => ({ path: r.path })),\n };\n\n fs.writeFileSync(path.join(outDir, 'manifest.json'), JSON.stringify(manifest, null, 2));\n\n const elapsed = Date.now() - startTime;\n const totalSize = getDirSize(outDir);\n\n logger.blank();\n logger.divider();\n logger.blank();\n\n // Log routes\n routes.appRoutes.forEach(r => {\n const type = r.path.includes(':') || r.path.includes('*') ? 'dynamic' : 'static';\n logger.route(r.path, type);\n });\n routes.api.forEach(r => logger.route(r.path, 'api'));\n\n logger.blank();\n logger.build({ time: elapsed });\n logger.info(`Output: ${outDir} (${formatBytes(totalSize)})`);\n logger.blank();\n}\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\nfunction copyDirRecursive(src: string, dest: string) {\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()) copyDirRecursive(srcPath, destPath);\n else fs.copyFileSync(srcPath, destPath);\n }\n}\n\nfunction getDirSize(dir: string): number {\n let size = 0;\n if (!fs.existsSync(dir)) return size;\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()) size += getDirSize(fullPath);\n else size += fs.statSync(fullPath).size;\n }\n return size;\n}\n\nexport default { build };\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 '&': '&amp;', '<': '&lt;', '>': '&gt;',\n '\"': '&quot;', \"'\": '&#39;'\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 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 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 v5 — Build Script\n * Build the application for production\n */\n\nimport { build } from '../build/index.js';\nimport logger from '../logger.js';\n\nbuild().catch(err => {\n logger.error('Build failed', err);\n process.exit(1);\n});\n"],"mappings":"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","names":["fs","path","fs","path","fs","path","fs","path","fs","path","fs","path","path","fs"]}
@@ -8,12 +8,16 @@ var __export = (target, all) => {
8
8
  __defProp(target, name, { get: all[name], enumerable: true });
9
9
  };
10
10
 
11
- // ../../node_modules/.pnpm/tsup@8.5.1_jiti@1.21.7_post_49c9ba138cf4e7dd637766b727229610/node_modules/tsup/assets/esm_shims.js
11
+ // ../../node_modules/.pnpm/tsup@8.5.1_jiti@2.6.1_postc_36112cdf9ab6125b194fc7941daee874/node_modules/tsup/assets/esm_shims.js
12
12
  import path from "path";
13
13
  import { fileURLToPath } from "url";
14
+ var getFilename, getDirname, __dirname;
14
15
  var init_esm_shims = __esm({
15
- "../../node_modules/.pnpm/tsup@8.5.1_jiti@1.21.7_post_49c9ba138cf4e7dd637766b727229610/node_modules/tsup/assets/esm_shims.js"() {
16
+ "../../node_modules/.pnpm/tsup@8.5.1_jiti@2.6.1_postc_36112cdf9ab6125b194fc7941daee874/node_modules/tsup/assets/esm_shims.js"() {
16
17
  "use strict";
18
+ getFilename = () => fileURLToPath(import.meta.url);
19
+ getDirname = () => path.dirname(getFilename());
20
+ __dirname = /* @__PURE__ */ getDirname();
17
21
  }
18
22
  });
19
23
 
@@ -273,7 +277,7 @@ function buildRouteTree(appDir) {
273
277
  pages: [],
274
278
  api: [],
275
279
  layouts: /* @__PURE__ */ new Map(),
276
- tree: {},
280
+ tree: { children: {}, routes: [] },
277
281
  appRoutes: []
278
282
  };
279
283
  if (fs3.existsSync(appDir)) {
@@ -453,20 +457,23 @@ init_esm_shims();
453
457
  import fs4 from "fs";
454
458
  import path4 from "path";
455
459
  async function loadMiddleware(projectRoot) {
456
- const middlewareDir = path4.join(projectRoot, "middleware");
457
460
  const fns = [];
458
- if (!fs4.existsSync(middlewareDir)) return fns;
459
- const files = fs4.readdirSync(middlewareDir).filter((f) => /\.(ts|js)$/.test(f)).sort();
460
- for (const file of files) {
461
+ const possibleFiles = ["proxy.ts", "proxy.js"];
462
+ for (const file of possibleFiles) {
463
+ const filePath = path4.join(projectRoot, file);
464
+ if (!fs4.existsSync(filePath)) continue;
461
465
  try {
462
- const filePath = path4.join(middlewareDir, file);
463
466
  const { pathToFileURL: pathToFileURL4 } = await import("url");
464
467
  const url = pathToFileURL4(filePath).href;
465
468
  const mod = await import(`${url}?t=${Date.now()}`);
466
- const fn = mod.default || mod.middleware;
467
- if (typeof fn === "function") fns.push(fn);
469
+ const fn = mod.default || mod.proxy || mod.middleware;
470
+ if (typeof fn === "function") {
471
+ fns.push(fn);
472
+ break;
473
+ }
468
474
  } catch (err) {
469
- console.warn(`\u26A0 Failed to load middleware ${file}: ${err.message}`);
475
+ const error = err;
476
+ console.warn(`\u26A0 Failed to load proxy ${file}: ${error.message}`);
470
477
  }
471
478
  }
472
479
  return fns;
@@ -643,11 +650,12 @@ async function loadPlugins(projectRoot, config) {
643
650
  console.warn(`\u26A0 Plugin not found: ${entry}`);
644
651
  }
645
652
  }
646
- } else if (typeof entry === "object" && entry.name) {
653
+ } else if (typeof entry === "object" && entry !== null && "name" in entry) {
647
654
  pluginManager.register(entry);
648
655
  }
649
656
  } catch (err) {
650
- console.warn(`\u26A0 Failed to load plugin: ${err.message}`);
657
+ const error = err;
658
+ console.warn(`\u26A0 Failed to load plugin: ${error?.message || String(error)}`);
651
659
  }
652
660
  }
653
661
  }
@@ -662,10 +670,11 @@ var builtinPlugins = {
662
670
  name: "velix:security",
663
671
  hooks: {
664
672
  [PluginHooks.RESPONSE]: (_req, res) => {
665
- if (!res.headersSent) {
666
- res.setHeader("X-Content-Type-Options", "nosniff");
667
- res.setHeader("X-Frame-Options", "DENY");
668
- res.setHeader("X-XSS-Protection", "1; mode=block");
673
+ const response = res;
674
+ if (!response.headersSent) {
675
+ response.setHeader("X-Content-Type-Options", "nosniff");
676
+ response.setHeader("X-Frame-Options", "DENY");
677
+ response.setHeader("X-XSS-Protection", "1; mode=block");
669
678
  }
670
679
  }
671
680
  }
@@ -677,7 +686,8 @@ var builtinPlugins = {
677
686
  name: "velix:logger",
678
687
  hooks: {
679
688
  [PluginHooks.RESPONSE]: (req, _res, duration) => {
680
- console.log(` ${req.method} ${req.url} ${duration}ms`);
689
+ const request = req;
690
+ console.log(` ${request.method} ${request.url} ${duration}ms`);
681
691
  }
682
692
  }
683
693
  })
@@ -691,7 +701,7 @@ init_esm_shims();
691
701
 
692
702
  // version.ts
693
703
  init_esm_shims();
694
- var VERSION = "5.1.4";
704
+ var VERSION = "5.1.7";
695
705
 
696
706
  // logger.ts
697
707
  var colors = {
@@ -1220,7 +1230,8 @@ async function executeAction(actionId, args, context) {
1220
1230
  try {
1221
1231
  const result = await action(...args);
1222
1232
  return { success: true, data: result };
1223
- } catch (error) {
1233
+ } catch (err) {
1234
+ const error = err;
1224
1235
  if (error instanceof RedirectError) return { success: true, redirect: error.url };
1225
1236
  if (error instanceof NotFoundError) return { success: false, error: "Not found" };
1226
1237
  return { success: false, error: error.message || "Action failed" };
@@ -2116,6 +2127,14 @@ function generate500Page(options) {
2116
2127
  }
2117
2128
 
2118
2129
  // server/index.ts
2130
+ import {
2131
+ defineRoute,
2132
+ VelixHttpError,
2133
+ defineLoader,
2134
+ serverAction,
2135
+ buildApiManifest,
2136
+ handleApiRequest
2137
+ } from "@teamvelix/velix-core";
2119
2138
  function getProjectVersion(dep, projectRoot) {
2120
2139
  try {
2121
2140
  const projectRequire = createRequire(pathToFileURL3(path7.join(projectRoot, "package.json")).href);
@@ -2226,14 +2245,15 @@ async function createServer(options = {}) {
2226
2245
  res.end(generate404Page(pathname));
2227
2246
  if (isDev) logger_default.request(req.method || "GET", pathname, 404, Date.now() - requestStart);
2228
2247
  } catch (error) {
2248
+ const err = error;
2229
2249
  console.error("Server error:", error);
2230
2250
  if (!res.headersSent) {
2231
2251
  res.writeHead(500, { "Content-Type": "text/html; charset=utf-8" });
2232
2252
  res.end(generate500Page({
2233
2253
  statusCode: 500,
2234
2254
  title: "Server Error",
2235
- message: error.message || "An unexpected error occurred",
2236
- stack: isDev ? error.stack : void 0,
2255
+ message: err.message || "An unexpected error occurred",
2256
+ stack: isDev ? err.stack : void 0,
2237
2257
  isDev,
2238
2258
  pathname
2239
2259
  }));
@@ -2360,26 +2380,26 @@ async function handleApiRoute(route, req, res, url) {
2360
2380
  res.end(JSON.stringify({ error: "Method not allowed" }));
2361
2381
  return;
2362
2382
  }
2363
- let body;
2383
+ let rawBody;
2364
2384
  if (["POST", "PUT", "PATCH"].includes(method)) {
2365
- body = await parseRequestBody(req);
2385
+ rawBody = await parseRawBody(req);
2366
2386
  }
2367
- const request = {
2368
- method,
2369
- url: req.url,
2370
- headers: req.headers,
2371
- params: route.params || {},
2372
- query: Object.fromEntries(url.searchParams),
2373
- body,
2374
- json: () => body
2375
- };
2376
- const response = await handler(request);
2387
+ const headers2 = new Headers();
2388
+ for (const [key, val] of Object.entries(req.headers)) {
2389
+ if (Array.isArray(val)) val.forEach((v) => headers2.append(key, v));
2390
+ else if (val) headers2.set(key, val);
2391
+ }
2392
+ const reqInit = { method, headers: headers2 };
2393
+ if (rawBody !== void 0) reqInit.body = rawBody;
2394
+ const request = new Request(url.href, reqInit);
2395
+ request.velixUrl = url;
2396
+ const response = await handler(request, { params: route.params || {} });
2377
2397
  if (response instanceof Response) {
2378
- const headers2 = {};
2398
+ const headers3 = {};
2379
2399
  response.headers.forEach((v, k) => {
2380
- headers2[k] = v;
2400
+ headers3[k] = v;
2381
2401
  });
2382
- res.writeHead(response.status, headers2);
2402
+ res.writeHead(response.status, headers3);
2383
2403
  const text = await response.text();
2384
2404
  res.end(text);
2385
2405
  } else if (typeof response === "object") {
@@ -2390,8 +2410,9 @@ async function handleApiRoute(route, req, res, url) {
2390
2410
  res.end(String(response));
2391
2411
  }
2392
2412
  } catch (err) {
2413
+ const error = err;
2393
2414
  res.writeHead(500, { "Content-Type": "application/json" });
2394
- res.end(JSON.stringify({ error: err.message }));
2415
+ res.end(JSON.stringify({ error: error.message }));
2395
2416
  }
2396
2417
  }
2397
2418
  async function handleServerAction(req, res) {
@@ -2407,8 +2428,9 @@ async function handleServerAction(req, res) {
2407
2428
  res.writeHead(200, { "Content-Type": "application/json" });
2408
2429
  res.end(JSON.stringify(result));
2409
2430
  } catch (err) {
2431
+ const error = err;
2410
2432
  res.writeHead(500, { "Content-Type": "application/json" });
2411
- res.end(JSON.stringify({ success: false, error: err.message }));
2433
+ res.end(JSON.stringify({ success: false, error: error.message }));
2412
2434
  }
2413
2435
  }
2414
2436
  async function handlePageRoute(route, routes, req, res, url, config, isDev, projectRoot) {
@@ -2473,9 +2495,14 @@ async function handlePageRoute(route, routes, req, res, url, config, isDev, proj
2473
2495
  const headInjectionsHtml = `
2474
2496
  ${headInjections}
2475
2497
  `;
2498
+ const hmrScript = isDev ? `
2499
+ <script type="module">
2500
+ import { initHMRClient, VelixDevOverlay } from '/__velix/hmr-client.js';
2501
+ initHMRClient();
2502
+ </script>` : "";
2476
2503
  const bodyInjectionsHtml = `
2477
2504
  <div id="__velix-islands"></div>
2478
- ${hydrationScript}${devToolsHtml}
2505
+ ${hydrationScript}${devToolsHtml}${hmrScript}
2479
2506
  `;
2480
2507
  if (finalHtml.includes("<html")) {
2481
2508
  const headEnd = finalHtml.lastIndexOf("</head>");
@@ -2511,13 +2538,14 @@ async function handlePageRoute(route, routes, req, res, url, config, isDev, proj
2511
2538
  res.writeHead(200, { "Content-Type": "text/html; charset=utf-8" });
2512
2539
  res.end(finalHtml);
2513
2540
  } catch (err) {
2514
- logger_default.error(`Render error: ${route.path}`, err);
2541
+ const error = err;
2542
+ logger_default.error(`Render error: ${route.path}`, error);
2515
2543
  res.writeHead(500, { "Content-Type": "text/html; charset=utf-8" });
2516
2544
  res.end(generate500Page({
2517
2545
  statusCode: 500,
2518
2546
  title: "Render Error",
2519
- message: err.message || "Failed to render page",
2520
- stack: isDev ? err.stack : void 0,
2547
+ message: error.message || "Failed to render page",
2548
+ stack: isDev ? error.stack : void 0,
2521
2549
  isDev,
2522
2550
  pathname: route.path
2523
2551
  }));
@@ -2560,6 +2588,38 @@ async function serveVelixInternal(pathname, req, res, projectRoot) {
2560
2588
  }
2561
2589
  return;
2562
2590
  }
2591
+ if (pathname === "/__velix/hmr-client.js") {
2592
+ try {
2593
+ const candidates = [
2594
+ path7.join(process.cwd(), "packages", "velix-react", "src", "hmr", "hmr-client.ts"),
2595
+ path7.join(process.cwd(), "node_modules", "@teamvelix", "velix-react", "src", "hmr", "hmr-client.ts"),
2596
+ path7.join(__dirname, "..", "..", "velix-react", "src", "hmr", "hmr-client.ts")
2597
+ ];
2598
+ const hmrClientSrc = candidates.find((p) => fs7.existsSync(p));
2599
+ if (!hmrClientSrc) {
2600
+ res.writeHead(404);
2601
+ res.end();
2602
+ return;
2603
+ }
2604
+ const result = await esbuild.build({
2605
+ entryPoints: [hmrClientSrc],
2606
+ bundle: true,
2607
+ format: "esm",
2608
+ platform: "browser",
2609
+ target: ["es2022"],
2610
+ minify: true,
2611
+ write: false
2612
+ });
2613
+ res.writeHead(200, { "Content-Type": "application/javascript", "Cache-Control": "no-cache" });
2614
+ res.end(result.outputFiles[0].text);
2615
+ return;
2616
+ } catch (err) {
2617
+ console.error("HMR Client build failed", err);
2618
+ res.writeHead(500);
2619
+ res.end();
2620
+ return;
2621
+ }
2622
+ }
2563
2623
  if (pathname.startsWith("/__velix/islands/") && pathname.endsWith(".js")) {
2564
2624
  const componentName = pathname.replace("/__velix/islands/", "").replace(".js", "");
2565
2625
  try {
@@ -2600,9 +2660,10 @@ async function serveVelixInternal(pathname, req, res, projectRoot) {
2600
2660
  res.end(result.outputFiles[0].text);
2601
2661
  return;
2602
2662
  } catch (err) {
2603
- logger_default.error(`Island bundling failed: ${componentName}`, err);
2663
+ const error = err;
2664
+ logger_default.error(`Island bundling failed: ${componentName}`, error);
2604
2665
  res.writeHead(500);
2605
- res.end(`console.error("Island bundling failed: ${err.message}");`);
2666
+ res.end(`console.error("Island bundling failed: ${error.message}");`);
2606
2667
  return;
2607
2668
  }
2608
2669
  }
@@ -2627,7 +2688,7 @@ async function serveVelixInternal(pathname, req, res, projectRoot) {
2627
2688
  return;
2628
2689
  }
2629
2690
  }
2630
- res.writeHead(404);
2691
+ res.writeHead(404, { "Content-Type": "text/plain" });
2631
2692
  res.end("Not found");
2632
2693
  }
2633
2694
  function parseRequestBody(req) {
@@ -2648,6 +2709,16 @@ function parseRequestBody(req) {
2648
2709
  req.on("error", reject);
2649
2710
  });
2650
2711
  }
2712
+ function parseRawBody(req) {
2713
+ return new Promise((resolve, reject) => {
2714
+ let body = "";
2715
+ req.on("data", (chunk) => {
2716
+ body += chunk;
2717
+ });
2718
+ req.on("end", () => resolve(body));
2719
+ req.on("error", reject);
2720
+ });
2721
+ }
2651
2722
 
2652
2723
  // runtime/start-dev.ts
2653
2724
  import chokidar from "chokidar";