@teamvelix/velix 5.1.1 → 5.1.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/README.md CHANGED
@@ -1,9 +1,7 @@
1
1
  # Velix v5
2
-
3
2
  <p align="center">
4
- <img src="./assets/velix cover.webp" width="100%" alt="Velix Cover" />
3
+ <img src="https://raw.githubusercontent.com/Velixteam/velix/main/assets/velix%20cover.webp" width="100%" alt="Velix Cover" />
5
4
  </p>
6
-
7
5
  > **A modern full-stack React framework** optimized for performance, SEO, simplicity, and developer experience.
8
6
 
9
7
  Velix is a lightweight but powerful React 19 framework featuring file-based routing, SSR, SSG, Islands architecture, built-in SEO optimization, and an intuitive CLI.
@@ -1,5 +1,5 @@
1
- export { build, build_default as default } from '../chunk-AW2KZSZ4.js';
2
- import '../chunk-XNOATMNJ.js';
1
+ export { build, build_default as default } from '../chunk-HPJYZZUY.js';
2
+ import '../chunk-MU7FPEFV.js';
3
3
  import '../chunk-F24Q2MX3.js';
4
4
  //# sourceMappingURL=index.js.map
5
5
  //# sourceMappingURL=index.js.map
@@ -1,4 +1,4 @@
1
- import { logger_default, cleanDir, buildRouteTree, findFiles, ensureDir, VERSION, formatBytes } from './chunk-XNOATMNJ.js';
1
+ import { logger_default, cleanDir, buildRouteTree, findFiles, ensureDir, VERSION, formatBytes } from './chunk-MU7FPEFV.js';
2
2
  import { loadConfig, resolvePaths } from './chunk-F24Q2MX3.js';
3
3
  import esbuild from 'esbuild';
4
4
  import fs from 'fs';
@@ -132,5 +132,5 @@ function getDirSize(dir) {
132
132
  var build_default = { build };
133
133
 
134
134
  export { build, build_default };
135
- //# sourceMappingURL=chunk-AW2KZSZ4.js.map
136
- //# sourceMappingURL=chunk-AW2KZSZ4.js.map
135
+ //# sourceMappingURL=chunk-HPJYZZUY.js.map
136
+ //# sourceMappingURL=chunk-HPJYZZUY.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../build/index.ts"],"names":[],"mappings":"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","file":"chunk-AW2KZSZ4.js","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"]}
1
+ {"version":3,"sources":["../build/index.ts"],"names":[],"mappings":"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","file":"chunk-HPJYZZUY.js","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"]}
@@ -291,7 +291,7 @@ function buildTree(routes) {
291
291
  }
292
292
 
293
293
  // version.ts
294
- var VERSION = "5.1.1";
294
+ var VERSION = "5.1.2";
295
295
 
296
296
  // logger.ts
297
297
  var colors = {
@@ -404,5 +404,5 @@ var logger = {
404
404
  var logger_default = logger;
405
405
 
406
406
  export { VERSION, buildRouteTree, cleanDir, copyDir, debounce, ensureDir, escapeHtml, findFiles, findRouteLayouts, formatBytes, formatTime, generateHash, isClientComponent, isIsland, isServerComponent, logger, logger_default, matchRoute, sleep };
407
- //# sourceMappingURL=chunk-XNOATMNJ.js.map
408
- //# sourceMappingURL=chunk-XNOATMNJ.js.map
407
+ //# sourceMappingURL=chunk-MU7FPEFV.js.map
408
+ //# sourceMappingURL=chunk-MU7FPEFV.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../utils.ts","../router/index.ts","../version.ts","../logger.ts"],"names":["path","fs"],"mappings":"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","file":"chunk-XNOATMNJ.js","sourcesContent":["/**\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 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 version — single source of truth.\n * Update this file only when releasing a new version.\n */\nexport const VERSION = '5.1.1';\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"]}
1
+ {"version":3,"sources":["../utils.ts","../router/index.ts","../version.ts","../logger.ts"],"names":["path","fs"],"mappings":"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","file":"chunk-MU7FPEFV.js","sourcesContent":["/**\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 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 version — single source of truth.\n * Update this file only when releasing a new version.\n */\nexport const VERSION = '5.1.2';\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"]}
@@ -1,4 +1,4 @@
1
- import { logger_default, buildRouteTree, matchRoute, VERSION } from './chunk-XNOATMNJ.js';
1
+ import { logger_default, buildRouteTree, matchRoute, VERSION } from './chunk-MU7FPEFV.js';
2
2
  import { loadConfig, resolvePaths } from './chunk-F24Q2MX3.js';
3
3
  import { getRegisteredIslands, generateAdvancedHydrationScript } from './chunk-OIZNYND3.js';
4
4
  import http from 'http';
@@ -303,8 +303,9 @@ function definePlugin(definition) {
303
303
  }
304
304
  })
305
305
  });
306
+ var NPX = process.platform === "win32" ? "npx.cmd" : "npx";
306
307
  function detectTailwindCli() {
307
- const v4 = spawnSync("npx", ["@tailwindcss/cli", "--help"], {
308
+ const v4 = spawnSync(NPX, ["@tailwindcss/cli", "--help"], {
308
309
  stdio: "pipe",
309
310
  timeout: 15e3
310
311
  });
@@ -337,7 +338,7 @@ function tailwindPlugin(options = {}) {
337
338
  const cli = getCli();
338
339
  const args = [cli, "-i", input, "-o", output];
339
340
  if (options.minify !== false) args.push("--minify");
340
- spawnSync("npx", args, {
341
+ spawnSync(NPX, args, {
341
342
  stdio: "inherit",
342
343
  cwd: process.cwd()
343
344
  });
@@ -359,17 +360,17 @@ function tailwindPlugin(options = {}) {
359
360
  logger_default.info("Building initial Tailwind CSS...");
360
361
  try {
361
362
  const cli2 = getCli();
362
- const buildResult = spawnSync("npx", [cli2, "-i", input, "-o", output], {
363
+ const buildResult = spawnSync(NPX, [cli2, "-i", input, "-o", output], {
363
364
  cwd: process.cwd(),
364
365
  stdio: "pipe"
365
366
  });
366
- if (buildResult.error) {
367
- logger_default.error("Tailwind CSS not installed. Run: npm install -D tailwindcss @tailwindcss/postcss");
368
- return;
369
- }
370
367
  if (buildResult.status !== 0) {
371
- const errorMsg = buildResult.stderr?.toString() || "Unknown error";
372
- logger_default.error(`Tailwind build failed: ${errorMsg}`);
368
+ const stderr = buildResult.stderr?.toString() || "";
369
+ if (buildResult.error || stderr.includes("not found") || stderr.includes("ENOENT")) {
370
+ logger_default.warn("Tailwind CSS CLI not found \u2014 skipping. CSS will still be served if pre-built.");
371
+ } else if (stderr.trim()) {
372
+ logger_default.warn(`Tailwind build warning: ${stderr.trim().split("\n")[0]}`);
373
+ }
373
374
  return;
374
375
  }
375
376
  logger_default.success("Tailwind CSS built successfully");
@@ -379,7 +380,7 @@ function tailwindPlugin(options = {}) {
379
380
  }
380
381
  logger_default.info("Starting Tailwind CSS watcher...");
381
382
  const cli = getCli();
382
- const watcher = spawn("npx", [cli, "-i", input, "-o", output, "--watch"], {
383
+ const watcher = spawn(NPX, [cli, "-i", input, "-o", output, "--watch"], {
383
384
  stdio: "pipe",
384
385
  cwd: process.cwd()
385
386
  });
@@ -1162,12 +1163,12 @@ function generateDevToolsHtml(isDev, ctx = {}) {
1162
1163
  var btn = document.getElementById('__vtab-btn-' + t);
1163
1164
  if(!body || !btn) return;
1164
1165
  var active = t === name;
1165
- body.style.display = active ? '' : 'none';
1166
+ body.style.display = active ? 'block' : 'none';
1166
1167
  btn.classList.toggle('active', active);
1167
1168
  });
1168
1169
  };
1169
1170
 
1170
- window.__vdtOpen = function(){ document.getElementById('__vdt').style.display = ''; };
1171
+ window.__vdtOpen = function(){ document.getElementById('__vdt').style.display = 'block'; };
1171
1172
  window.__vdtClose = function(){ document.getElementById('__vdt').style.display = 'none'; };
1172
1173
 
1173
1174
  /* \u2500\u2500 Route info \u2500\u2500 */
@@ -2212,7 +2213,9 @@ async function serveVelixInternal(pathname, req, res, projectRoot) {
2212
2213
  const __dirname2 = path4.dirname(__filename2);
2213
2214
  const candidates = [
2214
2215
  path4.join(__dirname2, "..", "assets", "logo.webp"),
2216
+ path4.join(__dirname2, "..", "..", "assets", "logo.webp"),
2215
2217
  path4.join(process.cwd(), "node_modules", "@teamvelix", "velix", "assets", "logo.webp"),
2218
+ path4.join(process.cwd(), "packages", "velix", "assets", "logo.webp"),
2216
2219
  path4.join(process.cwd(), "node_modules", "velix", "assets", "logo.webp"),
2217
2220
  path4.join(process.cwd(), "public", "favicon.webp")
2218
2221
  ];
@@ -2317,5 +2320,5 @@ function parseRequestBody(req) {
2317
2320
  var server_default = { createServer, tailwindPlugin };
2318
2321
 
2319
2322
  export { NotFoundError, PluginHooks, PluginManager, RedirectError, bindArgs, callServerAction, composeMiddleware, cookies, createServer, definePlugin, deserializeArgs, executeAction, formAction, generateJsonLd, generateMetadataTags, generateRobotsTxt, generateSitemap, getAction, getMethod, getPathname, headers, html, isMethod, json, jsonLd, loadMiddleware, loadPlugins, mergeMetadata, middlewares, notFound, parseFormData, parseJson, parseSearchParams, pluginManager, redirect, registerAction, runMiddleware, serverAction, server_default, tailwindPlugin, text, useActionContext, useVelixAction };
2320
- //# sourceMappingURL=chunk-NQENBRTZ.js.map
2321
- //# sourceMappingURL=chunk-NQENBRTZ.js.map
2323
+ //# sourceMappingURL=chunk-YB6W3YKP.js.map
2324
+ //# sourceMappingURL=chunk-YB6W3YKP.js.map