@teamvelix/velix-core 5.3.5 → 5.3.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -18,8 +18,8 @@ declare const VelixConfigSchema: z.ZodObject<{
18
18
  name: string;
19
19
  url?: string | undefined;
20
20
  }, {
21
- url?: string | undefined;
22
21
  name?: string | undefined;
22
+ url?: string | undefined;
23
23
  }>>;
24
24
  devtools: z.ZodDefault<z.ZodBoolean>;
25
25
  server: z.ZodDefault<z.ZodObject<{
@@ -130,8 +130,8 @@ declare const VelixConfigSchema: z.ZodObject<{
130
130
  favicon: string | null;
131
131
  }, {
132
132
  app?: {
133
- url?: string | undefined;
134
133
  name?: string | undefined;
134
+ url?: string | undefined;
135
135
  } | undefined;
136
136
  devtools?: boolean | undefined;
137
137
  server?: {
@@ -1209,6 +1209,11 @@ declare class VelixCache {
1209
1209
  private adapter;
1210
1210
  private deduplicator;
1211
1211
  constructor(adapter?: ICacheAdapter);
1212
+ get<T = unknown>(key: string): Promise<T | null>;
1213
+ set<T = unknown>(key: string, value: T, options?: CacheSetOptions): Promise<void>;
1214
+ has(key: string): Promise<boolean>;
1215
+ delete(key: string): Promise<void>;
1216
+ clear(): Promise<void>;
1212
1217
  revalidatePath(path: string): Promise<void>;
1213
1218
  revalidateTag(tag: string): Promise<void>;
1214
1219
  unstable_cache<T>(fn: () => Promise<T>, keys: string[], options?: {
@@ -1306,14 +1311,21 @@ type LoaderContext = {
1306
1311
  searchParams: URLSearchParams;
1307
1312
  req: Request;
1308
1313
  };
1314
+ type LoaderOptions = {
1315
+ tags?: string[];
1316
+ maxAge?: number;
1317
+ revalidate?: number;
1318
+ noStore?: boolean;
1319
+ };
1309
1320
  type LoaderResult<T> = {
1310
1321
  data: T;
1311
1322
  headers?: Record<string, string>;
1312
1323
  cache?: {
1313
- maxAge: number;
1324
+ maxAge?: number;
1325
+ tags?: string[];
1314
1326
  } | 'no-store';
1315
1327
  };
1316
- declare function defineLoader<T>(fn: (ctx: LoaderContext) => Promise<T>): (ctx: LoaderContext) => Promise<LoaderResult<T>>;
1328
+ declare function defineLoader<T>(fn: (ctx: LoaderContext) => Promise<T | LoaderResult<T>>, options?: LoaderOptions): (ctx: LoaderContext) => Promise<LoaderResult<T>>;
1317
1329
 
1318
1330
  /**
1319
1331
  * Backplane Redis Pub/Sub pour la synchronisation HMR multi-instances.
@@ -1410,4 +1422,4 @@ declare function resolveErrorBoundary(routeFilePath: string, appDir: string, typ
1410
1422
  declare function defineError(component: ErrorComponent): ErrorComponent;
1411
1423
  declare function defineNotFound(component: NotFoundComponent): NotFoundComponent;
1412
1424
 
1413
- export { type AIClient, type AIInput, type AIPluginConfig, type AIProvider, type AIProviderType, type AIResponse, type AIStreamChunk, type ActionAIConfig, type ActionContext, type ActionOptions, type ActionResult, type ActionState, type Alternates, type ApiHandler, type ApiRoute, type Author, type BuildOptions, type BuildResult, type ChatInput, type ChatMessage, type EmbedInput, type EmbedResponse, type ErrorBoundaryType, type ErrorComponent, type ErrorProps, ForbiddenError, type FormatDetection, type HMREvent, type HMRServerOptions, type HttpMethod, type IconDescriptor, type Icons, type InferActionInput, type InferActionOutput, type InferLoaderData, type IslandConfig, type IslandManifest, type LayoutComponent, type LayoutProps, type LoaderContext, type LoaderResult, type LoadingComponent, type LoadingProps, type Metadata, type Middleware, type MiddlewareFunction, type MiddlewareRequest, type MiddlewareResponse, type MiddlewareResult, type NextFunction, type NotFoundComponent, NotFoundError, type NotFoundProps, type OGImage, type OGVideo, OllamaProvider, OpenAIProvider, type OpenGraph, type PageComponent, type PageProps, type PluginHook, type PluginHookArgs, PluginHooks, PluginManager, type ResolvedBoundary, type RevalidationType, type Robots, type Route, type RouteContext, type RouteHandler, type RouteMatch$1 as RouteMatch, type RouteTree, RouteType, type ServerAction, type StaticPath, type StaticProps, type TailwindPluginOptions, type ThemeColor, type Twitter, type TwitterImage, type TypedActionResult, UnauthorizedError, VelixCache, type VelixConfig, VelixConfigSchema, VelixHttpError, type VelixPlugin, type VelixPluginDefinition, type Verification, type Viewport, buildApiManifest, buildPrompt, buildRouteTree, builtinPlugins, cacheManager, cleanDir, composeMiddleware, copyDir, createAIAction, createAIClient, createDeferred, createHMRServer, createRoutePattern, createStreamDecoder, debounce, defaultConfig, defineConfig, defineError, defineLoader, defineNotFound, definePlugin, defineRoute, ensureDir, escapeHtml, estimateTokens, filePathToRoute, findFiles, findRouteLayouts, formatBytes, formatTime, generateHash, generateJsonLd, generateMetadataTags, generateRobotsTxt, generateSitemap, getErrorBoundaryType, handleApiRequest, isClientComponent, isIsland, isServerComponent, jsonLd, loadConfig, loadMiddleware, loadPlugins, logger, matchRoute, mergeMetadata, middlewares, parseSSE, pluginManager, resolveErrorBoundary, resolvePaths, retry, revalidatePath, revalidateTag, runMiddleware, safeJsonParse, sanitizeInput, serverAction, sleep, truncateToTokens, unstable_cache, useAI, validateApiKey, validateInput };
1425
+ export { type AIClient, type AIInput, type AIPluginConfig, type AIProvider, type AIProviderType, type AIResponse, type AIStreamChunk, type ActionAIConfig, type ActionContext, type ActionOptions, type ActionResult, type ActionState, type Alternates, type ApiHandler, type ApiRoute, type Author, type BuildOptions, type BuildResult, type ChatInput, type ChatMessage, type EmbedInput, type EmbedResponse, type ErrorBoundaryType, type ErrorComponent, type ErrorProps, ForbiddenError, type FormatDetection, type HMREvent, type HMRServerOptions, type HttpMethod, type IconDescriptor, type Icons, type InferActionInput, type InferActionOutput, type InferLoaderData, type IslandConfig, type IslandManifest, type LayoutComponent, type LayoutProps, type LoaderContext, type LoaderOptions, type LoaderResult, type LoadingComponent, type LoadingProps, type Metadata, type Middleware, type MiddlewareFunction, type MiddlewareRequest, type MiddlewareResponse, type MiddlewareResult, type NextFunction, type NotFoundComponent, NotFoundError, type NotFoundProps, type OGImage, type OGVideo, OllamaProvider, OpenAIProvider, type OpenGraph, type PageComponent, type PageProps, type PluginHook, type PluginHookArgs, PluginHooks, PluginManager, type ResolvedBoundary, type RevalidationType, type Robots, type Route, type RouteContext, type RouteHandler, type RouteMatch$1 as RouteMatch, type RouteTree, RouteType, type ServerAction, type StaticPath, type StaticProps, type TailwindPluginOptions, type ThemeColor, type Twitter, type TwitterImage, type TypedActionResult, UnauthorizedError, VelixCache, type VelixConfig, VelixConfigSchema, VelixHttpError, type VelixPlugin, type VelixPluginDefinition, type Verification, type Viewport, buildApiManifest, buildPrompt, buildRouteTree, builtinPlugins, cacheManager, cleanDir, composeMiddleware, copyDir, createAIAction, createAIClient, createDeferred, createHMRServer, createRoutePattern, createStreamDecoder, debounce, defaultConfig, defineConfig, defineError, defineLoader, defineNotFound, definePlugin, defineRoute, ensureDir, escapeHtml, estimateTokens, filePathToRoute, findFiles, findRouteLayouts, formatBytes, formatTime, generateHash, generateJsonLd, generateMetadataTags, generateRobotsTxt, generateSitemap, getErrorBoundaryType, handleApiRequest, isClientComponent, isIsland, isServerComponent, jsonLd, loadConfig, loadMiddleware, loadPlugins, logger, matchRoute, mergeMetadata, middlewares, parseSSE, pluginManager, resolveErrorBoundary, resolvePaths, retry, revalidatePath, revalidateTag, runMiddleware, safeJsonParse, sanitizeInput, serverAction, sleep, truncateToTokens, unstable_cache, useAI, validateApiKey, validateInput };
package/dist/index.js CHANGED
@@ -446,7 +446,7 @@ function deepMerge(target, source) {
446
446
  }
447
447
 
448
448
  // src/version.ts
449
- var VERSION = "5.3.5";
449
+ var VERSION = "5.3.6";
450
450
 
451
451
  // src/logger.ts
452
452
  var colors = {
@@ -1545,7 +1545,20 @@ var MemoryCacheAdapter = class {
1545
1545
  lru;
1546
1546
  tagIndex = /* @__PURE__ */ new Map();
1547
1547
  constructor(options = {}) {
1548
- this.lru = new LRUCache({ max: options.maxSize ?? 500 });
1548
+ this.lru = new LRUCache({
1549
+ max: options.maxSize ?? 500,
1550
+ dispose: (entry, key) => {
1551
+ if (entry && entry.tags) {
1552
+ entry.tags.forEach((tag) => {
1553
+ const set = this.tagIndex.get(tag);
1554
+ if (set) {
1555
+ set.delete(key);
1556
+ if (set.size === 0) this.tagIndex.delete(tag);
1557
+ }
1558
+ });
1559
+ }
1560
+ }
1561
+ });
1549
1562
  }
1550
1563
  async get(key) {
1551
1564
  const entry = this.lru.get(key);
@@ -1614,6 +1627,21 @@ var VelixCache = class {
1614
1627
  this.adapter = adapter;
1615
1628
  this.deduplicator = new RequestDeduplicator();
1616
1629
  }
1630
+ async get(key) {
1631
+ return await this.adapter.get(key);
1632
+ }
1633
+ async set(key, value, options) {
1634
+ await this.adapter.set(key, value, options);
1635
+ }
1636
+ async has(key) {
1637
+ return await this.adapter.has(key);
1638
+ }
1639
+ async delete(key) {
1640
+ await this.adapter.delete(key);
1641
+ }
1642
+ async clear() {
1643
+ await this.adapter.clear();
1644
+ }
1617
1645
  async revalidatePath(path9) {
1618
1646
  await this.adapter.deleteByPrefix(`route:${path9}`);
1619
1647
  }
@@ -1777,10 +1805,29 @@ async function handleApiRequest(req, manifest) {
1777
1805
  }
1778
1806
 
1779
1807
  // src/server/define-loader.ts
1780
- function defineLoader(fn) {
1808
+ function defineLoader(fn, options) {
1781
1809
  return async (ctx) => {
1782
- const data = await fn(ctx);
1783
- return { data };
1810
+ const url = new URL(ctx.req.url || "http://localhost");
1811
+ const cacheKey = `loader:${url.pathname}:${url.searchParams.toString()}`;
1812
+ const maxAge = options?.maxAge ?? options?.revalidate;
1813
+ const isNoStore = options?.noStore === true;
1814
+ if (!isNoStore && maxAge && maxAge > 0) {
1815
+ const cached = await cacheManager.get(cacheKey);
1816
+ if (cached !== null) {
1817
+ return cached;
1818
+ }
1819
+ }
1820
+ const rawResult = await fn(ctx);
1821
+ const result = rawResult && typeof rawResult === "object" && "data" in rawResult ? rawResult : { data: rawResult };
1822
+ const effectiveMaxAge = maxAge ?? (typeof result.cache === "object" ? result.cache.maxAge : void 0);
1823
+ const tags = options?.tags ?? (typeof result.cache === "object" ? result.cache.tags : void 0);
1824
+ if (!isNoStore && result.cache !== "no-store" && effectiveMaxAge && effectiveMaxAge > 0) {
1825
+ await cacheManager.set(cacheKey, result, {
1826
+ ttl: effectiveMaxAge * 1e3,
1827
+ tags
1828
+ });
1829
+ }
1830
+ return result;
1784
1831
  };
1785
1832
  }
1786
1833
 
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/router/types.ts","../src/utils.ts","../src/router/parser.ts","../src/router/scanner.ts","../src/router/tree-builder.ts","../src/router/matcher.ts","../src/router/index.ts","../src/config.ts","../src/version.ts","../src/logger.ts","../src/metadata/index.ts","../src/middleware/index.ts","../src/plugins/index.ts","../src/plugins/ai/utils.ts","../src/plugins/ai/providers/openai.ts","../src/plugins/ai/providers/ollama.ts","../src/plugins/ai/client.ts","../src/plugins/ai/index.ts","../src/cache/adapters/memory.adapter.ts","../src/cache/deduplicator.ts","../src/cache/index.ts","../src/server/errors.ts","../src/api/define-route.ts","../src/api/manifest.ts","../src/server/define-loader.ts","../src/server/server-action.ts","../src/dev/hmr-server.ts","../src/server/error-cascade.ts","../src/server/define-error.ts"],"names":["path","fs","escapeHtml","c","pathToFileURL","url","crypto","params"],"mappings":"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","file":"index.js","sourcesContent":["import type { Route, RouteTree as TypedRouteTree, RouteTreeNode } from '../types.js';\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\nexport type RouteMatch = Route & {\n params: Record<string, string>;\n};\n\nexport interface RouteBuilderContext {\n pages: Route[];\n api: Route[];\n layouts: Map<string, string>;\n tree: RouteTreeNode;\n appRoutes: Route[];\n rootLayout?: string;\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 * Creates regex pattern for route matching\n */\nexport function 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 * Extracts parameters from route match\n */\nexport function 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","import fs from 'fs';\nimport path from 'path';\nimport { isServerComponent, isClientComponent, isIsland } from '../utils.js';\nimport type { Route } from '../types.js';\nimport { RouteType } from './types.js';\nimport { createRoutePattern } from './parser.js';\n\n/**\n * Scans app/ directory for file-based routing asynchronously\n * Supports: page.tsx, layout.tsx, loading.tsx, error.tsx, not-found.tsx, [param].tsx\n */\nexport async function scanAppDirectory(\n baseDir: string,\n currentDir: string,\n parentSegments: string[] = [],\n parentLayout: string | null = null,\n parentMiddleware: string | null = null\n): Promise<Route[]> {\n const routes: Route[] = [];\n const entries = await fs.promises.readdir(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.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.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 in parallel\n const ignoredDirs = ['node_modules', '.velix', 'dist'];\n const dirPromises = entries\n .filter(entry => \n entry.isDirectory() && \n !entry.name.startsWith('_') && \n !entry.name.startsWith('.') &&\n !ignoredDirs.includes(entry.name)\n )\n .map(async entry => {\n const fullPath = path.join(currentDir, entry.name);\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 return scanAppDirectory(baseDir, fullPath, newSegments, newLayout, newMiddleware);\n });\n\n const subRoutes = await Promise.all(dirPromises);\n return routes.concat(...subRoutes);\n}\n\n// ============================================================================\n// API Directory Scanner (server/api/)\n// ============================================================================\n\nexport async function scanApiDirectory(\n baseDir: string, \n currentDir: string, \n parentSegments: string[] = []\n): Promise<Route[]> {\n const entries = await fs.promises.readdir(currentDir, { withFileTypes: true });\n const routes: Route[] = [];\n\n const promises = entries.map(async entry => {\n const fullPath = path.join(currentDir, entry.name);\n\n if (entry.isDirectory()) {\n return scanApiDirectory(baseDir, fullPath, [...parentSegments, entry.name]);\n } else if (entry.isFile()) {\n const ext = path.extname(entry.name);\n if (!['.ts', '.js'].includes(ext)) return [];\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 return [{\n type: RouteType.API,\n path: apiPath.replace(/\\/+/g, '/') || '/api',\n filePath: fullPath,\n pattern: createRoutePattern(apiPath),\n segments: ['api', ...apiSegments].filter(Boolean),\n } as Route];\n }\n return [];\n });\n\n const subRoutes = await Promise.all(promises);\n return routes.concat(...subRoutes);\n}\n","import type { Route, RouteTreeNode } from '../types.js';\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 * Builds route tree for nested routes\n */\nexport function 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","import type { Route } from '../types.js';\nimport { extractParams } from './parser.js';\nimport type { RouteMatch } from './types.js';\n\n/**\n * Matches URL path against routes\n */\nexport function matchRoute(urlPath: string, routes: Route[]): RouteMatch | null {\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","import fs from 'fs';\nimport path from 'path';\nimport type { Route, RouteTree, RouteTreeNode } from '../types.js';\nimport { RouteType } from './types.js';\nimport { scanAppDirectory, scanApiDirectory } from './scanner.js';\nimport { buildTree, findRouteLayouts } from './tree-builder.js';\nimport { matchRoute } from './matcher.js';\nimport { createRoutePattern } from './parser.js';\n\n/**\n * Velix v5 Router\n * File-based routing using the app/ directory convention\n */\n\n/**\n * Builds the complete route tree from the app/ directory asynchronously\n */\nexport async 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 routes.appRoutes = await scanAppDirectory(appDir, appDir);\n }\n\n // Scan server/api/ for API routes\n const serverApiDir = path.join(projectRoot, 'server', 'api');\n if (fs.existsSync(serverApiDir)) {\n routes.api = await scanApiDirectory(serverApiDir, serverApiDir);\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\nexport { RouteType, matchRoute, findRouteLayouts, createRoutePattern };\n\nexport default {\n buildRouteTree,\n matchRoute,\n findRouteLayouts,\n RouteType,\n createRoutePattern\n};\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","/**\r\n * Velix version — single source of truth.\r\n * Update this file only when releasing a new version.\r\n */\r\nexport const VERSION = '5.3.5';\r\n\r\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 Metadata & SEO System\n *\n * First-class SEO with automatic:\n * - Meta tags, Open Graph, Twitter Cards\n * - Canonical URLs, robots, sitemaps\n * - JSON-LD structured data\n * - Viewport, theme color, icons\n */\n\nimport fs from 'fs';\nimport path from 'path';\n\n// ============================================================================\n// Types (comprehensive metadata interface)\n// ============================================================================\n\nexport interface Metadata {\n title?: string | { default: string; template?: string; absolute?: string };\n description?: string;\n keywords?: string | string[];\n authors?: Author | Author[];\n creator?: string;\n publisher?: string;\n robots?: Robots | string;\n icons?: Icons;\n manifest?: string;\n openGraph?: OpenGraph;\n twitter?: Twitter;\n verification?: Verification;\n alternates?: Alternates;\n viewport?: Viewport | string;\n themeColor?: ThemeColor | ThemeColor[];\n colorScheme?: 'normal' | 'light' | 'dark' | 'light dark' | 'dark light';\n formatDetection?: FormatDetection;\n metadataBase?: URL | string;\n generator?: string;\n applicationName?: string;\n referrer?: string;\n other?: Record<string, string | string[]>;\n}\n\nexport interface Author { name?: string; url?: string; }\nexport interface Robots { index?: boolean; follow?: boolean; noarchive?: boolean; nosnippet?: boolean; noimageindex?: boolean; nocache?: boolean; googleBot?: Robots | string; }\nexport interface Icons { icon?: IconDescriptor | IconDescriptor[]; shortcut?: IconDescriptor | IconDescriptor[]; apple?: IconDescriptor | IconDescriptor[]; other?: IconDescriptor[]; }\nexport interface IconDescriptor { url: string; type?: string; sizes?: string; color?: string; rel?: string; media?: string; }\nexport interface OpenGraph {\n type?: string; url?: string; title?: string; description?: string; siteName?: string;\n locale?: string; images?: OGImage | OGImage[]; videos?: OGVideo | OGVideo[];\n determiner?: string; publishedTime?: string; modifiedTime?: string;\n expirationTime?: string; authors?: string | string[]; section?: string; tags?: string[];\n}\nexport interface OGImage { url: string; secureUrl?: string; type?: string; width?: number; height?: number; alt?: string; }\nexport interface OGVideo { url: string; secureUrl?: string; type?: string; width?: number; height?: number; }\nexport interface Twitter {\n card?: 'summary' | 'summary_large_image' | 'app' | 'player';\n site?: string; siteId?: string; creator?: string; creatorId?: string;\n title?: string; description?: string; images?: string | TwitterImage | (string | TwitterImage)[];\n}\nexport interface TwitterImage { url: string; alt?: string; }\nexport interface Verification { google?: string | string[]; yahoo?: string | string[]; yandex?: string | string[]; other?: Record<string, string | string[]>; }\nexport interface Alternates { canonical?: string; languages?: Record<string, string>; media?: Record<string, string>; }\nexport interface Viewport { width?: number | 'device-width'; height?: number | 'device-height'; initialScale?: number; minimumScale?: number; maximumScale?: number; userScalable?: boolean; viewportFit?: 'auto' | 'cover' | 'contain'; }\nexport interface ThemeColor { color: string; media?: string; }\nexport interface FormatDetection { telephone?: boolean; date?: boolean; address?: boolean; email?: boolean; }\n\n// ============================================================================\n// Metadata Tag Generation\n// ============================================================================\n\nexport function generateMetadataTags(metadata: Metadata, baseUrl?: string): string {\n const tags: string[] = [];\n const base = baseUrl || metadata.metadataBase?.toString() || '';\n\n // Title\n if (metadata.title) {\n const title = typeof metadata.title === 'string'\n ? metadata.title\n : metadata.title.absolute || (metadata.title.template\n ? metadata.title.template.replace('%s', metadata.title.default)\n : metadata.title.default);\n tags.push(`<title>${escapeHtml(title)}</title>`);\n }\n\n if (metadata.description) tags.push(`<meta name=\"description\" content=\"${escapeHtml(metadata.description)}\">`);\n\n if (metadata.keywords) {\n const kw = Array.isArray(metadata.keywords) ? metadata.keywords.join(', ') : metadata.keywords;\n tags.push(`<meta name=\"keywords\" content=\"${escapeHtml(kw)}\">`);\n }\n\n if (metadata.authors) {\n const authors = Array.isArray(metadata.authors) ? metadata.authors : [metadata.authors];\n authors.forEach(a => {\n if (a.name) tags.push(`<meta name=\"author\" content=\"${escapeHtml(a.name)}\">`);\n if (a.url) tags.push(`<link rel=\"author\" href=\"${a.url}\">`);\n });\n }\n\n if (metadata.generator) tags.push(`<meta name=\"generator\" content=\"${escapeHtml(metadata.generator)}\">`);\n if (metadata.applicationName) tags.push(`<meta name=\"application-name\" content=\"${escapeHtml(metadata.applicationName)}\">`);\n if (metadata.referrer) tags.push(`<meta name=\"referrer\" content=\"${metadata.referrer}\">`);\n\n // Robots\n if (metadata.robots) {\n if (typeof metadata.robots === 'string') {\n tags.push(`<meta name=\"robots\" content=\"${metadata.robots}\">`);\n } else {\n tags.push(`<meta name=\"robots\" content=\"${generateRobotsContent(metadata.robots)}\">`);\n if (metadata.robots.googleBot) {\n const gbc = typeof metadata.robots.googleBot === 'string' ? metadata.robots.googleBot : generateRobotsContent(metadata.robots.googleBot);\n tags.push(`<meta name=\"googlebot\" content=\"${gbc}\">`);\n }\n }\n }\n\n // Viewport\n if (metadata.viewport) {\n const vc = typeof metadata.viewport === 'string' ? metadata.viewport : generateViewportContent(metadata.viewport);\n tags.push(`<meta name=\"viewport\" content=\"${vc}\">`);\n }\n\n // Theme Color\n if (metadata.themeColor) {\n const tcs = Array.isArray(metadata.themeColor) ? metadata.themeColor : [metadata.themeColor];\n tcs.forEach(tc => {\n const media = typeof tc !== 'string' && tc.media ? ` media=\"${tc.media}\"` : '';\n const color = typeof tc === 'string' ? tc : tc.color;\n tags.push(`<meta name=\"theme-color\" content=\"${color}\"${media}>`);\n });\n }\n\n if (metadata.colorScheme) tags.push(`<meta name=\"color-scheme\" content=\"${metadata.colorScheme}\">`);\n\n // Icons\n if (metadata.icons) {\n const addIcon = (icon: IconDescriptor, defaultRel: string) => {\n const rel = icon.rel || defaultRel;\n const attrs = [\n icon.type ? ` type=\"${icon.type}\"` : '',\n icon.sizes ? ` sizes=\"${icon.sizes}\"` : '',\n icon.color ? ` color=\"${icon.color}\"` : '',\n ].join('');\n tags.push(`<link rel=\"${rel}\" href=\"${resolveUrl(icon.url, base)}\"${attrs}>`);\n };\n if (metadata.icons.icon) { (Array.isArray(metadata.icons.icon) ? metadata.icons.icon : [metadata.icons.icon]).forEach(i => addIcon(i, 'icon')); }\n if (metadata.icons.apple) { (Array.isArray(metadata.icons.apple) ? metadata.icons.apple : [metadata.icons.apple]).forEach(i => addIcon(i, 'apple-touch-icon')); }\n }\n\n if (metadata.manifest) tags.push(`<link rel=\"manifest\" href=\"${resolveUrl(metadata.manifest, base)}\">`);\n\n // Open Graph\n if (metadata.openGraph) {\n const og = metadata.openGraph;\n if (og.type) tags.push(`<meta property=\"og:type\" content=\"${og.type}\">`);\n if (og.title) tags.push(`<meta property=\"og:title\" content=\"${escapeHtml(og.title)}\">`);\n if (og.description) tags.push(`<meta property=\"og:description\" content=\"${escapeHtml(og.description)}\">`);\n if (og.url) tags.push(`<meta property=\"og:url\" content=\"${resolveUrl(og.url, base)}\">`);\n if (og.siteName) tags.push(`<meta property=\"og:site_name\" content=\"${escapeHtml(og.siteName)}\">`);\n if (og.locale) tags.push(`<meta property=\"og:locale\" content=\"${og.locale}\">`);\n if (og.images) {\n (Array.isArray(og.images) ? og.images : [og.images]).forEach(img => {\n tags.push(`<meta property=\"og:image\" content=\"${resolveUrl(img.url, base)}\">`);\n if (img.width) tags.push(`<meta property=\"og:image:width\" content=\"${img.width}\">`);\n if (img.height) tags.push(`<meta property=\"og:image:height\" content=\"${img.height}\">`);\n if (img.alt) tags.push(`<meta property=\"og:image:alt\" content=\"${escapeHtml(img.alt)}\">`);\n });\n }\n if (og.type === 'article') {\n if (og.publishedTime) tags.push(`<meta property=\"article:published_time\" content=\"${og.publishedTime}\">`);\n if (og.modifiedTime) tags.push(`<meta property=\"article:modified_time\" content=\"${og.modifiedTime}\">`);\n if (og.tags) og.tags.forEach(t => tags.push(`<meta property=\"article:tag\" content=\"${escapeHtml(t)}\">`));\n }\n }\n\n // Twitter\n if (metadata.twitter) {\n const tw = metadata.twitter;\n if (tw.card) tags.push(`<meta name=\"twitter:card\" content=\"${tw.card}\">`);\n if (tw.site) tags.push(`<meta name=\"twitter:site\" content=\"${tw.site}\">`);\n if (tw.creator) tags.push(`<meta name=\"twitter:creator\" content=\"${tw.creator}\">`);\n if (tw.title) tags.push(`<meta name=\"twitter:title\" content=\"${escapeHtml(tw.title)}\">`);\n if (tw.description) tags.push(`<meta name=\"twitter:description\" content=\"${escapeHtml(tw.description)}\">`);\n if (tw.images) {\n (Array.isArray(tw.images) ? tw.images : [tw.images]).forEach(img => {\n const url = typeof img === 'string' ? img : img.url;\n tags.push(`<meta name=\"twitter:image\" content=\"${resolveUrl(url, base)}\">`);\n });\n }\n }\n\n // Verification\n if (metadata.verification) {\n if (metadata.verification.google) {\n (Array.isArray(metadata.verification.google) ? metadata.verification.google : [metadata.verification.google])\n .forEach(v => tags.push(`<meta name=\"google-site-verification\" content=\"${v}\">`));\n }\n }\n\n // Alternates\n if (metadata.alternates) {\n if (metadata.alternates.canonical) tags.push(`<link rel=\"canonical\" href=\"${resolveUrl(metadata.alternates.canonical, base)}\">`);\n if (metadata.alternates.languages) {\n Object.entries(metadata.alternates.languages).forEach(([lang, url]) => {\n tags.push(`<link rel=\"alternate\" hreflang=\"${lang}\" href=\"${resolveUrl(url, base)}\">`);\n });\n }\n }\n\n return tags.join('\\n ');\n}\n\n// ============================================================================\n// Merge & JSON-LD\n// ============================================================================\n\nexport function mergeMetadata(parent: Metadata, child: Metadata): Metadata {\n return {\n ...parent, ...child,\n openGraph: child.openGraph ? { ...parent.openGraph, ...child.openGraph } : parent.openGraph,\n twitter: child.twitter ? { ...parent.twitter, ...child.twitter } : parent.twitter,\n icons: child.icons ? { ...parent.icons, ...child.icons } : parent.icons,\n alternates: child.alternates ? { ...parent.alternates, ...child.alternates } : parent.alternates,\n };\n}\n\nexport function generateJsonLd(data: Record<string, unknown>): string {\n return `<script type=\"application/ld+json\">${JSON.stringify(data)}</script>`;\n}\n\nexport const jsonLd = {\n website: (c: { name: string; url: string; description?: string }) => ({\n '@context': 'https://schema.org', '@type': 'WebSite', name: c.name, url: c.url, description: c.description\n }),\n article: (c: { headline: string; description?: string; image?: string | string[]; datePublished: string; dateModified?: string; author: { name: string; url?: string } | { name: string; url?: string }[] }) => ({\n '@context': 'https://schema.org', '@type': 'Article', headline: c.headline, description: c.description,\n image: c.image, datePublished: c.datePublished, dateModified: c.dateModified || c.datePublished,\n author: Array.isArray(c.author) ? c.author.map(a => ({ '@type': 'Person', ...a })) : { '@type': 'Person', ...c.author }\n }),\n organization: (c: { name: string; url: string; logo?: string; sameAs?: string[] }) => ({\n '@context': 'https://schema.org', '@type': 'Organization', name: c.name, url: c.url, logo: c.logo, sameAs: c.sameAs\n }),\n breadcrumb: (items: { name: string; url: string }[]) => ({\n '@context': 'https://schema.org', '@type': 'BreadcrumbList',\n itemListElement: items.map((item, i) => ({ '@type': 'ListItem', position: i + 1, name: item.name, item: item.url }))\n }),\n};\n\n// ============================================================================\n// Automatic SEO Generation\n// ============================================================================\n\n/**\n * Generate sitemap.xml content from routes\n */\nexport function generateSitemap(routes: Array<{ type: string; path: string }>, baseUrl: string): string {\n const urls = routes\n .filter(r => r.type === 'page' && !r.path.includes(':') && !r.path.includes('*'))\n .map(r => {\n const loc = `${baseUrl.replace(/\\/$/, '')}${r.path}`;\n return ` <url>\\n <loc>${loc}</loc>\\n <lastmod>${new Date().toISOString().split('T')[0]}</lastmod>\\n <changefreq>weekly</changefreq>\\n <priority>${r.path === '/' ? '1.0' : '0.8'}</priority>\\n </url>`;\n });\n\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">\\n${urls.join('\\n')}\\n</urlset>`;\n}\n\n/**\n * Generate robots.txt content\n */\nexport function generateRobotsTxt(baseUrl: string, options: { disallow?: string[]; allow?: string[] } = {}): string {\n const lines = ['User-agent: *'];\n if (options.allow) options.allow.forEach(p => lines.push(`Allow: ${p}`));\n if (options.disallow) options.disallow.forEach(p => lines.push(`Disallow: ${p}`));\n else lines.push('Allow: /');\n lines.push('', `Sitemap: ${baseUrl.replace(/\\/$/, '')}/sitemap.xml`);\n return lines.join('\\n');\n}\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\nfunction escapeHtml(str: string): string {\n return str.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;').replace(/'/g, '&#039;');\n}\n\nfunction resolveUrl(url: string, base: string): string {\n if (url.startsWith('http://') || url.startsWith('https://') || url.startsWith('//')) return url;\n return base ? `${base.replace(/\\/$/, '')}${url.startsWith('/') ? '' : '/'}${url}` : url;\n}\n\nfunction generateRobotsContent(robots: Robots): string {\n const parts: string[] = [];\n if (robots.index !== undefined) parts.push(robots.index ? 'index' : 'noindex');\n if (robots.follow !== undefined) parts.push(robots.follow ? 'follow' : 'nofollow');\n if (robots.noarchive) parts.push('noarchive');\n if (robots.nosnippet) parts.push('nosnippet');\n if (robots.noimageindex) parts.push('noimageindex');\n return parts.join(', ') || 'index, follow';\n}\n\nfunction generateViewportContent(viewport: Viewport): string {\n const parts: string[] = [];\n if (viewport.width) parts.push(`width=${viewport.width}`);\n if (viewport.height) parts.push(`height=${viewport.height}`);\n if (viewport.initialScale !== undefined) parts.push(`initial-scale=${viewport.initialScale}`);\n if (viewport.maximumScale !== undefined) parts.push(`maximum-scale=${viewport.maximumScale}`);\n if (viewport.userScalable !== undefined) parts.push(`user-scalable=${viewport.userScalable ? 'yes' : 'no'}`);\n return parts.join(', ') || 'width=device-width, initial-scale=1';\n}\n\nexport default { generateMetadataTags, mergeMetadata, generateJsonLd, jsonLd, generateSitemap, generateRobotsTxt };\n","/**\n * Velix v5 Middleware System\n * Request processing pipeline with composable middleware\n */\n\nimport fs from 'fs';\nimport path from 'path';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface MiddlewareRequest {\n url: string;\n method: string;\n headers: Record<string, string | string[] | undefined>;\n cookies: Record<string, string>;\n params: Record<string, string>;\n query: Record<string, string>;\n body?: unknown;\n raw: import('http').IncomingMessage;\n}\n\nexport interface MiddlewareResponse {\n status: (code: number) => MiddlewareResponse;\n header: (name: string, value: string) => MiddlewareResponse;\n json: (data: unknown) => void;\n redirect: (url: string, status?: number) => void;\n rewrite: (url: string) => void;\n next: () => Promise<void>;\n _statusCode: number;\n _headers: Record<string, string>;\n _redirectUrl: string | null;\n _rewriteUrl: string | null;\n _ended: boolean;\n}\n\nexport type MiddlewareFunction = (\n req: MiddlewareRequest,\n res: MiddlewareResponse,\n next: () => Promise<void>\n) => void | Promise<void>;\n\nexport type MiddlewareResult = {\n continue: boolean;\n rewritten: boolean;\n};\n\n// ============================================================================\n// Built-in Middleware Registry\n// ============================================================================\n\nexport const middlewares = {\n cors(options: {\n origin?: string | string[];\n methods?: string[];\n headers?: string[];\n credentials?: boolean;\n maxAge?: number;\n } = {}): MiddlewareFunction {\n const {\n origin = '*',\n methods = ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'OPTIONS'],\n headers: allowHeaders = ['Content-Type', 'Authorization'],\n credentials = false,\n maxAge = 86400\n } = options;\n\n return async (req, res, next) => {\n const originHeader = typeof origin === 'string' ? origin : origin.includes(req.headers.origin as string) ? req.headers.origin as string : '';\n\n res.header('Access-Control-Allow-Origin', originHeader);\n res.header('Access-Control-Allow-Methods', methods.join(', '));\n res.header('Access-Control-Allow-Headers', allowHeaders.join(', '));\n res.header('Access-Control-Max-Age', String(maxAge));\n\n if (credentials) {\n res.header('Access-Control-Allow-Credentials', 'true');\n }\n\n if (req.method === 'OPTIONS') {\n res.status(204);\n return;\n }\n\n await next();\n };\n },\n\n rateLimit(options: {\n windowMs?: number;\n max?: number;\n message?: string;\n } = {}): MiddlewareFunction {\n const { windowMs = 60000, max = 100, message = 'Too many requests' } = options;\n const store = new Map<string, { count: number; resetTime: number }>();\n\n return async (req, res, next) => {\n const ip = req.headers['x-forwarded-for'] as string || 'unknown';\n const now = Date.now();\n const record = store.get(ip);\n\n if (!record || now > record.resetTime) {\n store.set(ip, { count: 1, resetTime: now + windowMs });\n } else if (record.count >= max) {\n res.status(429).json({ error: message });\n return;\n } else {\n record.count++;\n }\n\n await next();\n };\n },\n\n security(): MiddlewareFunction {\n return async (_req, res, next) => {\n res.header('X-Content-Type-Options', 'nosniff');\n res.header('X-Frame-Options', 'DENY');\n res.header('X-XSS-Protection', '1; mode=block');\n res.header('Referrer-Policy', 'strict-origin-when-cross-origin');\n await next();\n };\n },\n};\n\n// ============================================================================\n// Middleware Loader\n// ============================================================================\n\n/**\n * Loads proxy middleware from the project root (proxy.ts or proxy.js)\n */\nexport async function loadMiddleware(projectRoot: string): Promise<MiddlewareFunction[]> {\n const fns: MiddlewareFunction[] = [];\n const possibleFiles = ['proxy.ts', 'proxy.js'];\n\n for (const file of possibleFiles) {\n const filePath = path.join(projectRoot, file);\n if (!fs.existsSync(filePath)) continue;\n\n try {\n const { pathToFileURL } = await import('url');\n const url = pathToFileURL(filePath).href;\n const mod = await import(`${url}?t=${Date.now()}`);\n const fn = mod.default || mod.proxy || mod.middleware;\n if (typeof fn === 'function') {\n fns.push(fn);\n break; // Only load the first found proxy file\n }\n } catch (err: unknown) {\n const error = err as Error;\n console.warn(`⚠ Failed to load proxy ${file}: ${error.message}`);\n }\n }\n\n return fns;\n}\n\n// ============================================================================\n// Middleware Runner\n// ============================================================================\n\n/**\n * Runs middleware chain for a request\n */\nexport async function runMiddleware(\n req: import('http').IncomingMessage,\n res: import('http').ServerResponse,\n fns: MiddlewareFunction[]\n): Promise<MiddlewareResult> {\n const result: MiddlewareResult = { continue: true, rewritten: false };\n if (fns.length === 0) return result;\n\n const url = new URL(req.url || '/', `http://${req.headers.host || 'localhost'}`);\n const cookies: Record<string, string> = {};\n const cookieHeader = req.headers.cookie;\n if (cookieHeader) {\n cookieHeader.split(';').forEach(c => {\n const [k, ...v] = c.split('=');\n if (k) cookies[k.trim()] = v.join('=').trim();\n });\n }\n\n const mReq: MiddlewareRequest = {\n url: req.url || '/',\n method: req.method || 'GET',\n headers: req.headers as Record<string, string>,\n cookies,\n params: {},\n query: Object.fromEntries(url.searchParams),\n raw: req,\n };\n\n let ended = false;\n const mRes: MiddlewareResponse = {\n _statusCode: 200,\n _headers: {},\n _redirectUrl: null,\n _rewriteUrl: null,\n _ended: false,\n status(code) { this._statusCode = code; return this; },\n header(name, value) { this._headers[name] = value; return this; },\n json(data) {\n this._headers['Content-Type'] = 'application/json';\n res.writeHead(this._statusCode, this._headers);\n res.end(JSON.stringify(data));\n this._ended = true;\n ended = true;\n },\n redirect(url, status = 307) {\n this._redirectUrl = url;\n this._statusCode = status;\n res.writeHead(status, { Location: url, ...this._headers });\n res.end();\n this._ended = true;\n ended = true;\n },\n rewrite(url) {\n this._rewriteUrl = url;\n req.url = url;\n result.rewritten = true;\n },\n async next() { /* handled by chain */ },\n };\n\n // Run middleware chain\n let index = 0;\n const next = async () => {\n if (ended || index >= fns.length) return;\n const fn = fns[index++];\n await fn(mReq, mRes, next);\n };\n\n await next();\n\n // Apply headers that were set\n if (!ended) {\n for (const [key, value] of Object.entries(mRes._headers)) {\n res.setHeader(key, value);\n }\n }\n\n result.continue = !ended;\n return result;\n}\n\n/**\n * Compose multiple middleware into one\n */\nexport function composeMiddleware(...fns: MiddlewareFunction[]): MiddlewareFunction {\n return async (req, res, next) => {\n let index = 0;\n const run = async () => {\n if (index >= fns.length) { await next(); return; }\n const fn = fns[index++];\n await fn(req, res, run);\n };\n await run();\n };\n}\n","/**\n * Velix v5 Plugin System\n * Extensible hook-based plugin architecture\n */\n\nimport fs from 'fs';\nimport path from 'path';\nimport { pathToFileURL } from 'url';\n\n// ============================================================================\n// Plugin Hooks\n// ============================================================================\n\nexport const PluginHooks = {\n CONFIG: 'config',\n SERVER_START: 'server:start',\n REQUEST: 'request',\n RESPONSE: 'response',\n ROUTES_LOADED: 'routes:loaded',\n BEFORE_RENDER: 'render:before',\n AFTER_RENDER: 'render:after',\n BUILD_START: 'build:start',\n BUILD_END: 'build:end',\n} as const;\n\nexport type PluginHook = typeof PluginHooks[keyof typeof PluginHooks];\n\n// ============================================================================\n// Plugin Interface\n// ============================================================================\n\nexport interface PluginHookArgs {\n [PluginHooks.CONFIG]: [config: import('../config.js').VelixConfig];\n [PluginHooks.SERVER_START]: [context: { config: import('../config.js').VelixConfig; isDev: boolean; projectRoot: string }, isDev: boolean];\n [PluginHooks.REQUEST]: [req: import('http').IncomingMessage, res: import('http').ServerResponse];\n [PluginHooks.RESPONSE]: [req: import('http').IncomingMessage, res: import('http').ServerResponse, duration: number];\n [PluginHooks.ROUTES_LOADED]: [routes: import('../types.js').RouteTree];\n [PluginHooks.BEFORE_RENDER]: [html: string, context: { route: import('../types.js').Route; config: import('../config.js').VelixConfig; isDev: boolean }];\n [PluginHooks.AFTER_RENDER]: [html: string, context: { route: import('../types.js').Route; config: import('../config.js').VelixConfig; isDev: boolean }];\n [PluginHooks.BUILD_START]: [];\n [PluginHooks.BUILD_END]: [stats: { time: number }];\n}\n\nexport interface VelixPluginDefinition {\n name: string;\n version?: string;\n setup?: (config: import('../config.js').VelixConfig) => void | Promise<void>;\n hooks?: { [K in PluginHook]?: (...args: PluginHookArgs[K]) => unknown };\n [key: string]: unknown; // Allow for Zod passthrough and extra properties\n}\n\n// ============================================================================\n// Plugin Manager\n// ============================================================================\n\nexport class PluginManager {\n private plugins: VelixPluginDefinition[] = [];\n private hooks: Map<string, Array<(...args: any[]) => any>> = new Map();\n\n /**\n * Register a plugin\n */\n register(plugin: VelixPluginDefinition) {\n this.plugins.push(plugin);\n\n // Register hooks\n if (plugin.hooks) {\n for (const [hookName, handler] of Object.entries(plugin.hooks)) {\n if (handler) {\n const existing = this.hooks.get(hookName) || [];\n existing.push(handler);\n this.hooks.set(hookName, existing);\n }\n }\n }\n }\n\n /**\n * Run a hook with arguments\n */\n async runHook<K extends PluginHook>(hookName: K, ...args: PluginHookArgs[K]): Promise<void> {\n const handlers = this.hooks.get(hookName) || [];\n for (const handler of handlers) {\n await handler(...args);\n }\n }\n\n /**\n * Run a waterfall hook — each handler transforms the first argument\n */\n async runWaterfallHook<K extends PluginHook>(hookName: K, value: PluginHookArgs[K][0], ...args: PluginHookArgs[K] extends [unknown, ...infer Rest] ? Rest : []): Promise<PluginHookArgs[K][0]> {\n const handlers = this.hooks.get(hookName) || [];\n let result = value;\n for (const handler of handlers) {\n const transformed = await handler(result, ...args);\n if (transformed !== undefined) result = transformed;\n }\n return result;\n }\n\n /**\n * Get all registered plugins\n */\n getPlugins(): VelixPluginDefinition[] {\n return [...this.plugins];\n }\n\n /**\n * Check if a plugin is registered\n */\n hasPlugin(name: string): boolean {\n return this.plugins.some(p => p.name === name);\n }\n}\n\n// ============================================================================\n// Global Instance\n// ============================================================================\n\nexport const pluginManager = new PluginManager();\n\n// ============================================================================\n// Plugin Loader\n// ============================================================================\n\n/**\n * Load plugins from project configuration\n */\nexport async function loadPlugins(projectRoot: string, config: { plugins?: unknown[] }): Promise<void> {\n const pluginEntries = config.plugins || [];\n\n for (const entry of pluginEntries) {\n try {\n if (typeof entry === 'string') {\n // Load plugin by name (from plugins/ dir or node_modules)\n const localPath = path.join(projectRoot, 'plugins', entry + '.ts');\n const localPathJs = path.join(projectRoot, 'plugins', entry + '.js');\n const localPathDir = path.join(projectRoot, 'plugins', entry, 'index.ts');\n\n let pluginPath: string | null = null;\n if (fs.existsSync(localPath)) pluginPath = localPath;\n else if (fs.existsSync(localPathJs)) pluginPath = localPathJs;\n else if (fs.existsSync(localPathDir)) pluginPath = localPathDir;\n\n if (pluginPath) {\n const url = pathToFileURL(pluginPath).href;\n const mod = await import(`${url}?t=${Date.now()}`);\n const plugin = mod.default || mod;\n if (plugin.name) {\n pluginManager.register(plugin);\n }\n } else {\n // Try node_modules\n try {\n const mod = await import(entry);\n const plugin = mod.default || mod;\n if (plugin.name) pluginManager.register(plugin);\n } catch {\n console.warn(`⚠ Plugin not found: ${entry}`);\n }\n }\n } else if (typeof entry === 'object' && entry !== null && 'name' in entry) {\n // Inline plugin definition\n pluginManager.register(entry as VelixPluginDefinition);\n }\n } catch (err: unknown) {\n const error = err as Error;\n console.warn(`⚠ Failed to load plugin: ${error?.message || String(error)}`);\n }\n }\n}\n\n// ============================================================================\n// Plugin Definition Helper\n// ============================================================================\n\n/**\n * Helper to define a Velix plugin with type safety.\n *\n * @example\n * ```ts\n * export default definePlugin({\n * name: 'my-plugin',\n * hooks: {\n * 'server:start': (server) => {\n * console.log('Server started!');\n * }\n * }\n * });\n * ```\n */\nexport function definePlugin(definition: VelixPluginDefinition): VelixPluginDefinition {\n return definition;\n}\n\n// ============================================================================\n// Built-in Plugins\n// ============================================================================\n\nexport const builtinPlugins = {\n /**\n * Security headers plugin\n */\n security: definePlugin({\n name: 'velix:security',\n hooks: {\n [PluginHooks.RESPONSE]: (_req: unknown, res: unknown) => {\n const response = res as import('http').ServerResponse;\n if (!response.headersSent) {\n response.setHeader('X-Content-Type-Options', 'nosniff');\n response.setHeader('X-Frame-Options', 'DENY');\n response.setHeader('X-XSS-Protection', '1; mode=block');\n }\n }\n }\n }),\n\n /**\n * Request logging plugin\n */\n logger: definePlugin({\n name: 'velix:logger',\n hooks: {\n [PluginHooks.RESPONSE]: (req: unknown, _res: unknown, duration: unknown) => {\n const request = req as import('http').IncomingMessage;\n console.log(` ${request.method} ${request.url} ${duration}ms`);\n }\n }\n }),\n};\n","/**\n * Velix AI Plugin - Utilities\n * @module velix-plugin-ai/utils\n */\n\n/**\n * Retry a function with exponential backoff\n */\nexport async function retry<T>(\n fn: () => Promise<T>,\n options: { maxRetries: number; retryDelay: number } = { maxRetries: 3, retryDelay: 1000 }\n): Promise<T> {\n let lastError: Error | undefined;\n \n for (let i = 0; i < options.maxRetries; i++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error as Error;\n \n if (i < options.maxRetries - 1) {\n const delay = options.retryDelay * Math.pow(2, i);\n await new Promise(resolve => setTimeout(resolve, delay));\n }\n }\n }\n \n throw lastError || new Error('Retry failed');\n}\n\n/**\n * Safe JSON parsing with fallback\n */\nexport function safeJsonParse<T = unknown>(text: string, fallback?: T): T | null {\n try {\n // Try to extract JSON from markdown code blocks\n const jsonMatch = text.match(/```json\\n([\\s\\S]*?)\\n```/);\n if (jsonMatch) {\n return JSON.parse(jsonMatch[1]);\n }\n \n // Try to parse the whole text\n return JSON.parse(text);\n } catch {\n return fallback ?? null;\n }\n}\n\n/**\n * Build a prompt from a template\n */\nexport function buildPrompt(template: string, variables: Record<string, unknown>): string {\n return template.replace(/\\{\\{(\\w+)\\}\\}/g, (_, key) => {\n const val = variables[key];\n return val != null ? String(val) : '';\n });\n}\n\n/**\n * Validate API key\n */\nexport function validateApiKey(apiKey: string | undefined, provider: string): void {\n if (!apiKey || apiKey.trim() === '') {\n throw new Error(`API key is required for ${provider} provider`);\n }\n}\n\n/**\n * Validate input\n */\nexport function validateInput(input: Record<string, unknown>, requiredFields: string[]): void {\n for (const field of requiredFields) {\n if (!(field in input) || input[field] === undefined || input[field] === null) {\n throw new Error(`Missing required field: ${field}`);\n }\n }\n}\n\n/**\n * Create a streaming text decoder\n */\nexport function createStreamDecoder() {\n const decoder = new TextDecoder();\n \n return (chunk: Uint8Array): string => {\n return decoder.decode(chunk, { stream: true });\n };\n}\n\n/**\n * Parse SSE (Server-Sent Events) data\n */\nexport function parseSSE(line: string): unknown {\n if (!line.startsWith('data: ')) {\n return null;\n }\n \n const data = line.slice(6);\n \n if (data === '[DONE]') {\n return { done: true };\n }\n \n try {\n return JSON.parse(data);\n } catch {\n return null;\n }\n}\n\n/**\n * Sanitize input text\n */\nexport function sanitizeInput(text: string): string {\n return text.trim().replace(/\\0/g, '');\n}\n\n/**\n * Count tokens (rough estimation)\n */\nexport function estimateTokens(text: string): number {\n // Rough estimation: ~4 characters per token\n return Math.ceil(text.length / 4);\n}\n\n/**\n * Truncate text to max tokens\n */\nexport function truncateToTokens(text: string, maxTokens: number): string {\n const estimatedTokens = estimateTokens(text);\n \n if (estimatedTokens <= maxTokens) {\n return text;\n }\n \n const maxChars = maxTokens * 4;\n return text.slice(0, maxChars) + '...';\n}\n","/**\n * Velix AI Plugin - OpenAI Provider\n * @module velix-plugin-ai/providers/openai\n */\n\nimport type {\n AIProvider,\n AIInput,\n AIResponse,\n ChatInput,\n AIStreamChunk,\n EmbedInput,\n EmbedResponse\n} from '../types';\nimport { validateApiKey, retry, parseSSE } from '../utils';\n\nexport interface OpenAIConfig {\n apiKey: string;\n baseUrl?: string;\n defaultModel?: string;\n organization?: string;\n retry?: {\n maxRetries: number;\n retryDelay: number;\n };\n}\n\nexport class OpenAIProvider implements AIProvider {\n name = 'openai' as const;\n private apiKey: string;\n private baseUrl: string;\n private defaultModel: string;\n private organization?: string;\n private retryConfig: { maxRetries: number; retryDelay: number };\n\n constructor(config: OpenAIConfig) {\n validateApiKey(config.apiKey, 'OpenAI');\n \n this.apiKey = config.apiKey;\n this.baseUrl = config.baseUrl || 'https://api.openai.com/v1';\n this.defaultModel = config.defaultModel || 'gpt-4o-mini';\n this.organization = config.organization;\n this.retryConfig = config.retry || { maxRetries: 3, retryDelay: 1000 };\n }\n\n async generate(input: AIInput): Promise<AIResponse> {\n return retry(async () => {\n const response = await fetch(`${this.baseUrl}/chat/completions`, {\n method: 'POST',\n headers: this.getHeaders(),\n body: JSON.stringify({\n model: input.model || this.defaultModel,\n messages: [\n ...(input.system ? [{ role: 'system', content: input.system }] : []),\n { role: 'user', content: input.prompt }\n ],\n temperature: input.temperature ?? 0.7,\n max_tokens: input.maxTokens,\n stop: input.stop,\n ...input.options\n })\n });\n\n if (!response.ok) {\n const error = await response.json();\n throw new Error(`OpenAI API error: ${error.error?.message || response.statusText}`);\n }\n\n const data = await response.json();\n \n return {\n text: data.choices[0].message.content,\n provider: 'openai',\n model: data.model,\n usage: {\n promptTokens: data.usage.prompt_tokens,\n completionTokens: data.usage.completion_tokens,\n totalTokens: data.usage.total_tokens\n },\n raw: data\n };\n }, this.retryConfig);\n }\n\n async chat(input: ChatInput): Promise<AIResponse> {\n return retry(async () => {\n const response = await fetch(`${this.baseUrl}/chat/completions`, {\n method: 'POST',\n headers: this.getHeaders(),\n body: JSON.stringify({\n model: input.model || this.defaultModel,\n messages: input.messages,\n temperature: input.temperature ?? 0.7,\n max_tokens: input.maxTokens,\n stop: input.stop,\n ...input.options\n })\n });\n\n if (!response.ok) {\n const error = await response.json();\n throw new Error(`OpenAI API error: ${error.error?.message || response.statusText}`);\n }\n\n const data = await response.json();\n \n return {\n text: data.choices[0].message.content,\n provider: 'openai',\n model: data.model,\n usage: {\n promptTokens: data.usage.prompt_tokens,\n completionTokens: data.usage.completion_tokens,\n totalTokens: data.usage.total_tokens\n },\n raw: data\n };\n }, this.retryConfig);\n }\n\n async *stream(input: AIInput): AsyncIterable<AIStreamChunk> {\n const response = await fetch(`${this.baseUrl}/chat/completions`, {\n method: 'POST',\n headers: this.getHeaders(),\n body: JSON.stringify({\n model: input.model || this.defaultModel,\n messages: [\n ...(input.system ? [{ role: 'system', content: input.system }] : []),\n { role: 'user', content: input.prompt }\n ],\n temperature: input.temperature ?? 0.7,\n max_tokens: input.maxTokens,\n stop: input.stop,\n stream: true,\n ...input.options\n })\n });\n\n if (!response.ok) {\n const error = await response.json();\n throw new Error(`OpenAI API error: ${error.error?.message || response.statusText}`);\n }\n\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error('Response body is not readable');\n }\n\n const decoder = new TextDecoder();\n let buffer = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n \n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed || trimmed === 'data: [DONE]') continue;\n\n const parsed = parseSSE(trimmed) as { choices?: Array<{ delta?: { content?: string } }>; model?: string } | null;\n if (!parsed) continue;\n\n const delta = parsed.choices?.[0]?.delta?.content;\n if (delta) {\n yield {\n text: delta,\n done: false,\n provider: 'openai',\n model: parsed.model\n };\n }\n }\n }\n\n yield { text: '', done: true, provider: 'openai' };\n } finally {\n reader.releaseLock();\n }\n }\n\n async embed(input: EmbedInput): Promise<EmbedResponse> {\n return retry(async () => {\n const response = await fetch(`${this.baseUrl}/embeddings`, {\n method: 'POST',\n headers: this.getHeaders(),\n body: JSON.stringify({\n model: input.model || 'text-embedding-3-small',\n input: input.text\n })\n });\n\n if (!response.ok) {\n const error = await response.json();\n throw new Error(`OpenAI API error: ${error.error?.message || response.statusText}`);\n }\n\n const data = await response.json();\n \n return {\n embedding: data.data[0].embedding,\n provider: 'openai',\n model: data.model\n };\n }, this.retryConfig);\n }\n\n private getHeaders(): Record<string, string> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${this.apiKey}`\n };\n\n if (this.organization) {\n headers['OpenAI-Organization'] = this.organization;\n }\n\n return headers;\n }\n}\n","/**\n * Velix AI Plugin - Ollama Provider\n * @module velix-plugin-ai/providers/ollama\n */\n\nimport type {\n AIProvider,\n AIInput,\n AIResponse,\n ChatInput,\n AIStreamChunk,\n EmbedInput,\n EmbedResponse\n} from '../types';\nimport { retry } from '../utils';\n\nexport interface OllamaConfig {\n baseUrl?: string;\n defaultModel?: string;\n retry?: {\n maxRetries: number;\n retryDelay: number;\n };\n}\n\nexport class OllamaProvider implements AIProvider {\n name = 'ollama' as const;\n private baseUrl: string;\n private defaultModel: string;\n private retryConfig: { maxRetries: number; retryDelay: number };\n\n constructor(config: OllamaConfig = {}) {\n this.baseUrl = config.baseUrl || 'http://localhost:11434';\n this.defaultModel = config.defaultModel || 'llama3.2';\n this.retryConfig = config.retry || { maxRetries: 3, retryDelay: 1000 };\n }\n\n async generate(input: AIInput): Promise<AIResponse> {\n return retry(async () => {\n const response = await fetch(`${this.baseUrl}/api/generate`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n model: input.model || this.defaultModel,\n prompt: input.prompt,\n system: input.system,\n options: {\n temperature: input.temperature ?? 0.7,\n num_predict: input.maxTokens,\n stop: input.stop,\n ...input.options\n },\n stream: false\n })\n });\n\n if (!response.ok) {\n throw new Error(`Ollama API error: ${response.statusText}`);\n }\n\n const data = await response.json();\n \n return {\n text: data.response,\n provider: 'ollama',\n model: data.model,\n usage: {\n promptTokens: data.prompt_eval_count || 0,\n completionTokens: data.eval_count || 0,\n totalTokens: (data.prompt_eval_count || 0) + (data.eval_count || 0)\n },\n raw: data\n };\n }, this.retryConfig);\n }\n\n async chat(input: ChatInput): Promise<AIResponse> {\n return retry(async () => {\n const response = await fetch(`${this.baseUrl}/api/chat`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n model: input.model || this.defaultModel,\n messages: input.messages,\n options: {\n temperature: input.temperature ?? 0.7,\n num_predict: input.maxTokens,\n stop: input.stop,\n ...input.options\n },\n stream: false\n })\n });\n\n if (!response.ok) {\n throw new Error(`Ollama API error: ${response.statusText}`);\n }\n\n const data = await response.json();\n \n return {\n text: data.message.content,\n provider: 'ollama',\n model: data.model,\n usage: {\n promptTokens: data.prompt_eval_count || 0,\n completionTokens: data.eval_count || 0,\n totalTokens: (data.prompt_eval_count || 0) + (data.eval_count || 0)\n },\n raw: data\n };\n }, this.retryConfig);\n }\n\n async *stream(input: AIInput): AsyncIterable<AIStreamChunk> {\n const response = await fetch(`${this.baseUrl}/api/generate`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n model: input.model || this.defaultModel,\n prompt: input.prompt,\n system: input.system,\n options: {\n temperature: input.temperature ?? 0.7,\n num_predict: input.maxTokens,\n stop: input.stop,\n ...input.options\n },\n stream: true\n })\n });\n\n if (!response.ok) {\n throw new Error(`Ollama API error: ${response.statusText}`);\n }\n\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error('Response body is not readable');\n }\n\n const decoder = new TextDecoder();\n let buffer = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n \n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n\n try {\n const data = JSON.parse(trimmed);\n \n if (data.response) {\n yield {\n text: data.response,\n done: data.done || false,\n provider: 'ollama',\n model: data.model\n };\n }\n\n if (data.done) {\n return;\n }\n } catch {\n // Skip invalid JSON\n }\n }\n }\n\n yield { text: '', done: true, provider: 'ollama' };\n } finally {\n reader.releaseLock();\n }\n }\n\n async embed(input: EmbedInput): Promise<EmbedResponse> {\n return retry(async () => {\n const response = await fetch(`${this.baseUrl}/api/embeddings`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n model: input.model || this.defaultModel,\n prompt: input.text\n })\n });\n\n if (!response.ok) {\n throw new Error(`Ollama API error: ${response.statusText}`);\n }\n\n const data = await response.json();\n \n return {\n embedding: data.embedding,\n provider: 'ollama',\n model: data.model || input.model || this.defaultModel\n };\n }, this.retryConfig);\n }\n}\n","/**\n * Velix AI Plugin - AI Client\n * @module velix-plugin-ai/client\n */\n\nimport type {\n AIClient,\n AIProvider,\n AIInput,\n AIResponse,\n ChatInput,\n AIStreamChunk,\n EmbedInput,\n EmbedResponse,\n AIPluginConfig\n} from './types';\nimport { OpenAIProvider } from './providers/openai';\nimport { OllamaProvider } from './providers/ollama';\n\n/**\n * Create an AI client\n */\nexport function createAIClient(config: AIPluginConfig): AIClient {\n const provider = createProvider(config);\n\n return {\n async generate(input: AIInput): Promise<AIResponse> {\n return provider.generate(input);\n },\n\n async chat(input: ChatInput): Promise<AIResponse> {\n return provider.chat(input);\n },\n\n stream(input: AIInput): AsyncIterable<AIStreamChunk> {\n return provider.stream(input);\n },\n\n async embed(input: EmbedInput): Promise<EmbedResponse> {\n return provider.embed(input);\n },\n\n getProvider(): AIProvider {\n return provider;\n }\n };\n}\n\n/**\n * Create a provider instance\n */\nfunction createProvider(config: AIPluginConfig): AIProvider {\n switch (config.provider) {\n case 'openai':\n return new OpenAIProvider({\n apiKey: config.apiKey!,\n baseUrl: config.baseUrl,\n defaultModel: config.defaultModel,\n retry: config.retry\n });\n\n case 'ollama':\n return new OllamaProvider({\n baseUrl: config.baseUrl,\n defaultModel: config.defaultModel,\n retry: config.retry\n });\n\n default:\n throw new Error(`Unsupported AI provider: ${config.provider}`);\n }\n}\n","/**\n * Velix AI Plugin v1\n * @module velix-plugin-ai\n */\n\nimport { createAIClient } from './client';\nimport type { AIPluginConfig, AIClient } from './types';\n\n// Export types\nexport * from './types';\nexport * from './utils';\nexport { OpenAIProvider } from './providers/openai';\nexport { OllamaProvider } from './providers/ollama';\nexport { createAIClient } from './client';\n\n/**\n * Velix AI Plugin\n * \n * @example\n * ```ts\n * import aiPlugin from 'velix/plugins/ai';\n * \n * export default defineConfig({\n * plugins: [\n * aiPlugin({\n * provider: 'openai',\n * apiKey: process.env.OPENAI_API_KEY\n * })\n * ]\n * });\n * ```\n */\nexport default function aiPlugin(config: AIPluginConfig) {\n return {\n name: 'velix-ai',\n \n setup(ctx: Record<string, unknown>) {\n // Create AI client\n const client = createAIClient(config);\n \n // Attach to context\n ctx.ai = client;\n \n // Make available globally for server actions\n if (typeof globalThis !== 'undefined') {\n (globalThis as unknown as { __VELIX_AI__: AIClient }).__VELIX_AI__ = client;\n }\n }\n };\n}\n\n/**\n * Get AI client in server actions\n */\nexport function useAI(): AIClient {\n if (typeof globalThis === 'undefined' || !(globalThis as unknown as { __VELIX_AI__?: AIClient }).__VELIX_AI__) {\n throw new Error('AI client not initialized. Make sure aiPlugin is configured.');\n }\n \n return (globalThis as unknown as { __VELIX_AI__: AIClient }).__VELIX_AI__;\n}\n\n/**\n * Create an AI-powered server action\n * \n * @example\n * ```ts\n * export const summarize = createAIAction({\n * input: { text: 'string' },\n * prompt: ({ text }) => `Summarize this text: ${text}`,\n * system: 'You are a helpful assistant that summarizes text concisely.'\n * });\n * ```\n */\nexport function createAIAction<TInput = unknown, TOutput = string>(config: {\n input: TInput;\n prompt: (input: TInput) => string;\n system?: string;\n model?: string;\n temperature?: number;\n transform?: (response: string) => TOutput;\n}) {\n return async (input: TInput): Promise<TOutput> => {\n const ai = useAI();\n \n const prompt = config.prompt(input);\n \n const response = await ai.generate({\n prompt,\n system: config.system,\n model: config.model,\n temperature: config.temperature\n });\n \n if (config.transform) {\n return config.transform(response.text);\n }\n \n return response.text as TOutput;\n };\n}\n","import { LRUCache } from 'lru-cache';\nimport type { ICacheAdapter, CacheSetOptions } from '../adapter.js';\n\ntype CacheEntry<T> = {\n value: T;\n tags: string[];\n expiresAt: number | null;\n}\n\nexport class MemoryCacheAdapter implements ICacheAdapter {\n private lru: LRUCache<string, CacheEntry<unknown>>;\n private tagIndex: Map<string, Set<string>> = new Map();\n\n constructor(options: { maxSize?: number } = {}) {\n this.lru = new LRUCache({ max: options.maxSize ?? 500 });\n }\n\n async get<T>(key: string): Promise<T | null> {\n const entry = this.lru.get(key) as CacheEntry<T> | undefined;\n if (!entry) return null;\n if (entry.expiresAt && Date.now() > entry.expiresAt) {\n this.lru.delete(key);\n return null;\n }\n return entry.value;\n }\n\n async set<T>(key: string, value: T, options: CacheSetOptions = {}): Promise<void> {\n const entry: CacheEntry<T> = {\n value,\n tags: options.tags ?? [],\n expiresAt: options.ttl ? Date.now() + options.ttl : null,\n };\n this.lru.set(key, entry as CacheEntry<unknown>);\n // Index par tag pour invalidation rapide\n options.tags?.forEach(tag => {\n if (!this.tagIndex.has(tag)) this.tagIndex.set(tag, new Set());\n this.tagIndex.get(tag)!.add(key);\n });\n }\n\n async delete(key: string): Promise<void> {\n this.lru.delete(key);\n }\n\n async deleteByTag(tag: string): Promise<void> {\n const keys = this.tagIndex.get(tag);\n if (!keys) return;\n keys.forEach(key => this.lru.delete(key));\n this.tagIndex.delete(tag);\n }\n\n async deleteByPrefix(prefix: string): Promise<void> {\n for (const key of this.lru.keys()) {\n if (key.startsWith(prefix)) this.lru.delete(key);\n }\n }\n\n async clear(): Promise<void> {\n this.lru.clear();\n this.tagIndex.clear();\n }\n\n async has(key: string): Promise<boolean> {\n return this.lru.has(key);\n }\n}\n","export class RequestDeduplicator {\n private inFlight: Map<string, Promise<unknown>> = new Map();\n\n async dedupe<T>(key: string, fn: () => Promise<T>): Promise<T> {\n if (this.inFlight.has(key)) {\n return this.inFlight.get(key) as Promise<T>;\n }\n\n const promise = fn().finally(() => {\n this.inFlight.delete(key);\n });\n\n this.inFlight.set(key, promise);\n return promise;\n }\n}\n","import type { ICacheAdapter, CacheSetOptions } from './adapter.js';\nimport { MemoryCacheAdapter } from './adapters/memory.adapter.js';\nimport { RequestDeduplicator } from './deduplicator.js';\n\nexport type RevalidationType = 'path' | 'tag' | 'layout';\n\nexport class VelixCache {\n private adapter: ICacheAdapter;\n private deduplicator: RequestDeduplicator;\n\n constructor(adapter: ICacheAdapter = new MemoryCacheAdapter()) {\n this.adapter = adapter;\n this.deduplicator = new RequestDeduplicator();\n }\n\n async revalidatePath(path: string): Promise<void> {\n await this.adapter.deleteByPrefix(`route:${path}`);\n }\n\n async revalidateTag(tag: string): Promise<void> {\n await this.adapter.deleteByTag(tag);\n }\n\n // unstable_cache — avec déduplication\n unstable_cache<T>(\n fn: () => Promise<T>,\n keys: string[],\n options?: { tags?: string[]; revalidate?: number }\n ): () => Promise<T> {\n const key = keys.join(':');\n return async () => {\n const cached = await this.adapter.get<T>(key);\n if (cached !== null) return cached;\n\n const value = await this.deduplicator.dedupe(key, fn);\n await this.adapter.set(key, value, {\n ttl: options?.revalidate ? options.revalidate * 1000 : undefined,\n tags: options?.tags,\n });\n return value;\n };\n }\n}\n\n// ── Singleton instance for the framework ──\n\nexport const cacheManager = new VelixCache();\n\n/**\n * Revalidate a specific path\n */\nexport async function revalidatePath(path: string, _type: RevalidationType = 'path'): Promise<void> {\n await cacheManager.revalidatePath(path);\n\n // Notify connected clients via HMR\n if (typeof global !== 'undefined' && (global as any).__VELIX_HMR_SERVER__) {\n (global as any).__VELIX_HMR_SERVER__.broadcast(JSON.stringify({\n type: 'revalidate',\n path,\n revalidationType: _type,\n }));\n }\n}\n\n/**\n * Revalidate all paths with a specific cache tag\n */\nexport async function revalidateTag(tag: string): Promise<void> {\n await cacheManager.revalidateTag(tag);\n\n // Notify connected clients\n if (typeof global !== 'undefined' && (global as any).__VELIX_HMR_SERVER__) {\n (global as any).__VELIX_HMR_SERVER__.broadcast(JSON.stringify({\n type: 'revalidate',\n tag,\n }));\n }\n}\n\n/**\n * Unstable cache wrapper (experimental)\n */\nexport function unstable_cache<T>(\n fn: () => Promise<T>,\n keys: string[],\n options?: { tags?: string[]; revalidate?: number }\n): () => Promise<T> {\n return cacheManager.unstable_cache(fn, keys, options);\n}\n","import crypto from 'crypto';\n\nexport class VelixHttpError extends Error {\n public status: number;\n public digest?: string;\n\n constructor(status: number, message: string) {\n super(message);\n this.name = this.constructor.name;\n this.status = status;\n \n // Generate actual cryptographic hash\n const hash = crypto.createHash('sha256');\n hash.update(`${Date.now()}-${message}-${status}-${Math.random()}`);\n this.digest = hash.digest('hex').substring(0, 16);\n }\n\n toClientError(isDev: boolean) {\n return {\n message: this.message,\n status: this.status,\n digest: this.digest,\n stack: isDev ? this.stack : undefined,\n };\n }\n}\n\nexport class NotFoundError extends VelixHttpError {\n constructor(message: string = 'Not Found') {\n super(404, message);\n }\n}\n\nexport class ForbiddenError extends VelixHttpError {\n constructor(message: string = 'Forbidden') {\n super(403, message);\n }\n}\n\nexport class UnauthorizedError extends VelixHttpError {\n constructor(message: string = 'Unauthorized') {\n super(401, message);\n }\n}\n","export type HttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'HEAD' | 'OPTIONS';\n\nexport type RouteContext = {\n params: Record<string, string>;\n searchParams: URLSearchParams;\n};\n\nexport type RouteHandler = (\n req: Request,\n ctx: RouteContext\n) => Response | Promise<Response>;\n\nimport { VelixHttpError } from '../server/errors.js';\nexport { VelixHttpError };\n\nexport function defineRoute(handler: RouteHandler): RouteHandler {\n return async (req, ctx) => {\n try {\n return await handler(req, ctx);\n } catch (err) {\n if (err instanceof VelixHttpError) {\n return Response.json({ error: err.message }, { status: err.status });\n }\n console.error('[Velix API]', err);\n return Response.json({ error: 'Internal Server Error' }, { status: 500 });\n }\n };\n}\n","import { glob } from 'glob';\nimport path from 'path';\nimport { pathToFileURL } from 'url';\nimport type { HttpMethod } from './define-route.js';\n\nexport type ApiRoute = {\n pattern: string; // ex: /api/users/:id\n filePath: string; // chemin absolu vers le fichier\n params: string[]; // noms des paramètres dynamiques\n isCatchAll: boolean;\n};\n\nexport async function buildApiManifest(serverDir: string): Promise<ApiRoute[]> {\n const files = await glob('api/**/*.ts', { cwd: serverDir, absolute: true });\n return files.map(file => filePathToRoute(file, serverDir));\n}\n\n/** Exported for testing */\nexport function filePathToRoute(filePath: string, serverDir: string): ApiRoute {\n const relative = path.relative(path.join(serverDir, 'api'), filePath);\n // Ensure we replace Windows backslashes with forward slashes for the pattern\n const normalizedRelative = relative.replace(/\\\\/g, '/');\n const withoutExt = normalizedRelative.replace(/\\.ts$/, '');\n \n // users.[id] → /api/users/:id\n // auth/[...slug] → /api/auth/*\n const params: string[] = [];\n let isCatchAll = false;\n\n const pattern = '/api/' + withoutExt\n .replace(/\\[\\.\\.\\.(\\w+)\\]/g, (_, name) => { isCatchAll = true; params.push(name); return '*'; })\n .replace(/\\[(\\w+)\\]/g, (_, name) => { params.push(name); return `:${name}`; })\n .replace(/\\.\\[/g, '/[') // users.[id] → users/[id]\n .replace(/\\./g, '/'); // nested avec dots → slashes\n\n return { pattern, filePath, params, isCatchAll };\n}\n\nfunction matchPattern(pathname: string, route: ApiRoute): { params: Record<string, string> } | null {\n if (route.isCatchAll) {\n const base = route.pattern.replace('/*', '');\n if (pathname.startsWith(base)) {\n const rest = pathname.slice(base.length);\n const params: Record<string, string> = {};\n if (route.params[0]) {\n params[route.params[0]] = rest.startsWith('/') ? rest.slice(1) : rest;\n }\n return { params };\n }\n return null;\n }\n\n const pathParts = pathname.split('/').filter(Boolean);\n const patternParts = route.pattern.split('/').filter(Boolean);\n\n if (pathParts.length !== patternParts.length) return null;\n\n const params: Record<string, string> = {};\n\n for (let i = 0; i < patternParts.length; i++) {\n const part = patternParts[i];\n if (part.startsWith(':')) {\n params[part.slice(1)] = pathParts[i];\n } else if (part !== pathParts[i]) {\n return null;\n }\n }\n\n return { params };\n}\n\nexport async function handleApiRequest(\n req: Request,\n manifest: ApiRoute[]\n): Promise<Response | null> {\n const url = new URL(req.url);\n const pathname = url.pathname;\n\n for (const route of manifest) {\n const match = matchPattern(pathname, route);\n if (!match) continue;\n\n const fileUrl = pathToFileURL(route.filePath).href;\n const handlers = await import(`${fileUrl}?t=${Date.now()}`);\n const method = req.method.toUpperCase() as HttpMethod;\n const handler = handlers[method] || handlers.default;\n\n if (!handler) {\n return Response.json({ error: 'Method Not Allowed' }, { status: 405 });\n }\n\n return handler(req, {\n params: match.params,\n searchParams: url.searchParams,\n });\n }\n\n return null; // pas de route API → fallback SSR\n}\n","export type LoaderContext = {\n params: Record<string, string>;\n searchParams: URLSearchParams;\n req: Request;\n};\n\nexport type LoaderResult<T> = {\n data: T;\n headers?: Record<string, string>;\n cache?: { maxAge: number } | 'no-store';\n};\n\nexport function defineLoader<T>(\n fn: (ctx: LoaderContext) => Promise<T>\n): (ctx: LoaderContext) => Promise<LoaderResult<T>> {\n return async (ctx) => {\n const data = await fn(ctx);\n return { data };\n };\n}\n","import { z } from 'zod';\n\nexport type ActionContext = {\n req: Request;\n headers: Headers;\n};\n\nexport type ActionOptions<TInput extends z.ZodTypeAny, TOutput> = {\n input: TInput;\n handler: (ctx: { input: z.infer<TInput>; ctx: ActionContext }) => Promise<TOutput>;\n};\n\nexport type ActionResult<T> =\n | { success: true; data: T }\n | { success: false; error: string; fieldErrors?: Record<string, string[]> };\n\nexport function serverAction<TInput extends z.ZodTypeAny, TOutput>(\n options: ActionOptions<TInput, TOutput>\n) {\n return async (rawInput: unknown, ctx: ActionContext): Promise<ActionResult<TOutput>> => {\n const parsed = options.input.safeParse(rawInput);\n if (!parsed.success) {\n return {\n success: false,\n error: 'Validation failed',\n fieldErrors: parsed.error.flatten().fieldErrors as Record<string, string[]>,\n };\n }\n try {\n const data = await options.handler({ input: parsed.data, ctx });\n return { success: true, data };\n } catch (err) {\n return { success: false, error: err instanceof Error ? err.message : 'Unknown error' };\n }\n };\n}\n","import { WebSocketServer, WebSocket } from 'ws';\nimport chokidar from 'chokidar';\nimport type { Server as HttpServer } from 'http';\nimport type { HMRPubSubBackplane } from './hmr-pubsub.js';\n\nexport type HMREvent =\n | { type: 'file-changed'; file: string; timestamp: number }\n | { type: 'file-added'; file: string; timestamp: number }\n | { type: 'compile-start'; timestamp: number }\n | { type: 'compile-done'; duration: number; timestamp: number }\n | { type: 'compile-error'; message: string; file?: string; line?: number; col?: number; timestamp: number }\n | { type: 'full-reload'; timestamp: number };\n\nexport interface HMRServerOptions {\n /**\n * Backplane Redis Pub/Sub pour la synchronisation HMR multi-instances.\n * Optionnel — si absent, le HMR est local à cette instance uniquement.\n */\n pubsub?: HMRPubSubBackplane;\n}\n\nexport function createHMRServer(\n httpServer: HttpServer,\n projectRoot: string,\n options?: HMRServerOptions\n) {\n const wss = new WebSocketServer({ server: httpServer, path: '/__velix_hmr' });\n const clients = new Set<WebSocket>();\n\n wss.on('connection', (ws) => {\n clients.add(ws);\n ws.send(JSON.stringify({ type: 'connected' }));\n ws.on('close', () => clients.delete(ws));\n });\n\n const watcher = chokidar.watch(projectRoot, {\n ignored: /node_modules|\\.velix|dist|\\.git/,\n persistent: true,\n ignoreInitial: true,\n });\n\n /**\n * Broadcast local : envoie l'event aux clients WebSocket de cette instance.\n */\n function broadcastLocal(event: HMREvent) {\n const msg = JSON.stringify(event);\n clients.forEach(ws => {\n if (ws.readyState === ws.OPEN) ws.send(msg);\n });\n }\n\n /**\n * Broadcast complet :\n * 1. Notifie les clients locaux (WebSocket de cette instance)\n * 2. Publie sur le backplane Redis si configuré (pour les autres pods)\n */\n function broadcast(event: HMREvent) {\n broadcastLocal(event);\n // Cross-instance via Redis Pub/Sub si configuré\n options?.pubsub?.publish(event);\n }\n\n // Écouter les events des autres instances via le backplane\n options?.pubsub?.onEvent(event => {\n // Uniquement rebroadcast local — ne pas re-publier sur Redis (évite les boucles)\n broadcastLocal(event);\n });\n\n watcher.on('change', (file) => {\n broadcast({ type: 'file-changed', file, timestamp: Date.now() });\n });\n watcher.on('add', (file) => {\n broadcast({ type: 'file-added', file, timestamp: Date.now() });\n });\n\n return { broadcast, broadcastLocal, watcher, wss, clients };\n}\n","import path from 'path';\nimport fs from 'fs';\nimport { NotFoundError, VelixHttpError } from './errors.js';\n\nexport type ErrorBoundaryType = 'error' | 'not-found';\n\nexport interface ResolvedBoundary {\n filePath: string;\n type: ErrorBoundaryType;\n scope: string;\n}\n\nexport function getErrorBoundaryType(error: unknown): ErrorBoundaryType {\n if (error instanceof NotFoundError) return 'not-found';\n if (error instanceof VelixHttpError && error.status === 404) return 'not-found';\n return 'error';\n}\n\nexport function resolveErrorBoundary(routeFilePath: string, appDir: string, type: ErrorBoundaryType): ResolvedBoundary | null {\n let currentDir = path.dirname(routeFilePath);\n \n // Ensure we don't go outside appDir\n while (currentDir.length >= appDir.length && currentDir.startsWith(appDir)) {\n const boundaryPath = path.join(currentDir, `${type}.tsx`);\n if (fs.existsSync(boundaryPath)) {\n const scope = currentDir === appDir ? 'root' : path.basename(currentDir);\n return {\n filePath: boundaryPath,\n type,\n scope\n };\n }\n \n const parentDir = path.dirname(currentDir);\n if (parentDir === currentDir) break;\n currentDir = parentDir;\n }\n \n return null;\n}\n","import type { ErrorComponent, NotFoundComponent } from '../types.js';\n\nexport function defineError(component: ErrorComponent): ErrorComponent {\n return component;\n}\n\nexport function defineNotFound(component: NotFoundComponent): NotFoundComponent {\n return component;\n}\n"]}
1
+ {"version":3,"sources":["../src/router/types.ts","../src/utils.ts","../src/router/parser.ts","../src/router/scanner.ts","../src/router/tree-builder.ts","../src/router/matcher.ts","../src/router/index.ts","../src/config.ts","../src/version.ts","../src/logger.ts","../src/metadata/index.ts","../src/middleware/index.ts","../src/plugins/index.ts","../src/plugins/ai/utils.ts","../src/plugins/ai/providers/openai.ts","../src/plugins/ai/providers/ollama.ts","../src/plugins/ai/client.ts","../src/plugins/ai/index.ts","../src/cache/adapters/memory.adapter.ts","../src/cache/deduplicator.ts","../src/cache/index.ts","../src/server/errors.ts","../src/api/define-route.ts","../src/api/manifest.ts","../src/server/define-loader.ts","../src/server/server-action.ts","../src/dev/hmr-server.ts","../src/server/error-cascade.ts","../src/server/define-error.ts"],"names":["path","fs","escapeHtml","c","pathToFileURL","url","crypto","params"],"mappings":"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","file":"index.js","sourcesContent":["import type { Route, RouteTree as TypedRouteTree, RouteTreeNode } from '../types.js';\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\nexport type RouteMatch = Route & {\n params: Record<string, string>;\n};\n\nexport interface RouteBuilderContext {\n pages: Route[];\n api: Route[];\n layouts: Map<string, string>;\n tree: RouteTreeNode;\n appRoutes: Route[];\n rootLayout?: string;\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 * Creates regex pattern for route matching\n */\nexport function 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 * Extracts parameters from route match\n */\nexport function 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","import fs from 'fs';\nimport path from 'path';\nimport { isServerComponent, isClientComponent, isIsland } from '../utils.js';\nimport type { Route } from '../types.js';\nimport { RouteType } from './types.js';\nimport { createRoutePattern } from './parser.js';\n\n/**\n * Scans app/ directory for file-based routing asynchronously\n * Supports: page.tsx, layout.tsx, loading.tsx, error.tsx, not-found.tsx, [param].tsx\n */\nexport async function scanAppDirectory(\n baseDir: string,\n currentDir: string,\n parentSegments: string[] = [],\n parentLayout: string | null = null,\n parentMiddleware: string | null = null\n): Promise<Route[]> {\n const routes: Route[] = [];\n const entries = await fs.promises.readdir(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.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.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 in parallel\n const ignoredDirs = ['node_modules', '.velix', 'dist'];\n const dirPromises = entries\n .filter(entry => \n entry.isDirectory() && \n !entry.name.startsWith('_') && \n !entry.name.startsWith('.') &&\n !ignoredDirs.includes(entry.name)\n )\n .map(async entry => {\n const fullPath = path.join(currentDir, entry.name);\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 return scanAppDirectory(baseDir, fullPath, newSegments, newLayout, newMiddleware);\n });\n\n const subRoutes = await Promise.all(dirPromises);\n return routes.concat(...subRoutes);\n}\n\n// ============================================================================\n// API Directory Scanner (server/api/)\n// ============================================================================\n\nexport async function scanApiDirectory(\n baseDir: string, \n currentDir: string, \n parentSegments: string[] = []\n): Promise<Route[]> {\n const entries = await fs.promises.readdir(currentDir, { withFileTypes: true });\n const routes: Route[] = [];\n\n const promises = entries.map(async entry => {\n const fullPath = path.join(currentDir, entry.name);\n\n if (entry.isDirectory()) {\n return scanApiDirectory(baseDir, fullPath, [...parentSegments, entry.name]);\n } else if (entry.isFile()) {\n const ext = path.extname(entry.name);\n if (!['.ts', '.js'].includes(ext)) return [];\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 return [{\n type: RouteType.API,\n path: apiPath.replace(/\\/+/g, '/') || '/api',\n filePath: fullPath,\n pattern: createRoutePattern(apiPath),\n segments: ['api', ...apiSegments].filter(Boolean),\n } as Route];\n }\n return [];\n });\n\n const subRoutes = await Promise.all(promises);\n return routes.concat(...subRoutes);\n}\n","import type { Route, RouteTreeNode } from '../types.js';\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 * Builds route tree for nested routes\n */\nexport function 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","import type { Route } from '../types.js';\nimport { extractParams } from './parser.js';\nimport type { RouteMatch } from './types.js';\n\n/**\n * Matches URL path against routes\n */\nexport function matchRoute(urlPath: string, routes: Route[]): RouteMatch | null {\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","import fs from 'fs';\nimport path from 'path';\nimport type { Route, RouteTree, RouteTreeNode } from '../types.js';\nimport { RouteType } from './types.js';\nimport { scanAppDirectory, scanApiDirectory } from './scanner.js';\nimport { buildTree, findRouteLayouts } from './tree-builder.js';\nimport { matchRoute } from './matcher.js';\nimport { createRoutePattern } from './parser.js';\n\n/**\n * Velix v5 Router\n * File-based routing using the app/ directory convention\n */\n\n/**\n * Builds the complete route tree from the app/ directory asynchronously\n */\nexport async 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 routes.appRoutes = await scanAppDirectory(appDir, appDir);\n }\n\n // Scan server/api/ for API routes\n const serverApiDir = path.join(projectRoot, 'server', 'api');\n if (fs.existsSync(serverApiDir)) {\n routes.api = await scanApiDirectory(serverApiDir, serverApiDir);\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\nexport { RouteType, matchRoute, findRouteLayouts, createRoutePattern };\n\nexport default {\n buildRouteTree,\n matchRoute,\n findRouteLayouts,\n RouteType,\n createRoutePattern\n};\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","/**\r\n * Velix version — single source of truth.\r\n * Update this file only when releasing a new version.\r\n */\r\nexport const VERSION = '5.3.6';\r\n\r\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 Metadata & SEO System\n *\n * First-class SEO with automatic:\n * - Meta tags, Open Graph, Twitter Cards\n * - Canonical URLs, robots, sitemaps\n * - JSON-LD structured data\n * - Viewport, theme color, icons\n */\n\nimport fs from 'fs';\nimport path from 'path';\n\n// ============================================================================\n// Types (comprehensive metadata interface)\n// ============================================================================\n\nexport interface Metadata {\n title?: string | { default: string; template?: string; absolute?: string };\n description?: string;\n keywords?: string | string[];\n authors?: Author | Author[];\n creator?: string;\n publisher?: string;\n robots?: Robots | string;\n icons?: Icons;\n manifest?: string;\n openGraph?: OpenGraph;\n twitter?: Twitter;\n verification?: Verification;\n alternates?: Alternates;\n viewport?: Viewport | string;\n themeColor?: ThemeColor | ThemeColor[];\n colorScheme?: 'normal' | 'light' | 'dark' | 'light dark' | 'dark light';\n formatDetection?: FormatDetection;\n metadataBase?: URL | string;\n generator?: string;\n applicationName?: string;\n referrer?: string;\n other?: Record<string, string | string[]>;\n}\n\nexport interface Author { name?: string; url?: string; }\nexport interface Robots { index?: boolean; follow?: boolean; noarchive?: boolean; nosnippet?: boolean; noimageindex?: boolean; nocache?: boolean; googleBot?: Robots | string; }\nexport interface Icons { icon?: IconDescriptor | IconDescriptor[]; shortcut?: IconDescriptor | IconDescriptor[]; apple?: IconDescriptor | IconDescriptor[]; other?: IconDescriptor[]; }\nexport interface IconDescriptor { url: string; type?: string; sizes?: string; color?: string; rel?: string; media?: string; }\nexport interface OpenGraph {\n type?: string; url?: string; title?: string; description?: string; siteName?: string;\n locale?: string; images?: OGImage | OGImage[]; videos?: OGVideo | OGVideo[];\n determiner?: string; publishedTime?: string; modifiedTime?: string;\n expirationTime?: string; authors?: string | string[]; section?: string; tags?: string[];\n}\nexport interface OGImage { url: string; secureUrl?: string; type?: string; width?: number; height?: number; alt?: string; }\nexport interface OGVideo { url: string; secureUrl?: string; type?: string; width?: number; height?: number; }\nexport interface Twitter {\n card?: 'summary' | 'summary_large_image' | 'app' | 'player';\n site?: string; siteId?: string; creator?: string; creatorId?: string;\n title?: string; description?: string; images?: string | TwitterImage | (string | TwitterImage)[];\n}\nexport interface TwitterImage { url: string; alt?: string; }\nexport interface Verification { google?: string | string[]; yahoo?: string | string[]; yandex?: string | string[]; other?: Record<string, string | string[]>; }\nexport interface Alternates { canonical?: string; languages?: Record<string, string>; media?: Record<string, string>; }\nexport interface Viewport { width?: number | 'device-width'; height?: number | 'device-height'; initialScale?: number; minimumScale?: number; maximumScale?: number; userScalable?: boolean; viewportFit?: 'auto' | 'cover' | 'contain'; }\nexport interface ThemeColor { color: string; media?: string; }\nexport interface FormatDetection { telephone?: boolean; date?: boolean; address?: boolean; email?: boolean; }\n\n// ============================================================================\n// Metadata Tag Generation\n// ============================================================================\n\nexport function generateMetadataTags(metadata: Metadata, baseUrl?: string): string {\n const tags: string[] = [];\n const base = baseUrl || metadata.metadataBase?.toString() || '';\n\n // Title\n if (metadata.title) {\n const title = typeof metadata.title === 'string'\n ? metadata.title\n : metadata.title.absolute || (metadata.title.template\n ? metadata.title.template.replace('%s', metadata.title.default)\n : metadata.title.default);\n tags.push(`<title>${escapeHtml(title)}</title>`);\n }\n\n if (metadata.description) tags.push(`<meta name=\"description\" content=\"${escapeHtml(metadata.description)}\">`);\n\n if (metadata.keywords) {\n const kw = Array.isArray(metadata.keywords) ? metadata.keywords.join(', ') : metadata.keywords;\n tags.push(`<meta name=\"keywords\" content=\"${escapeHtml(kw)}\">`);\n }\n\n if (metadata.authors) {\n const authors = Array.isArray(metadata.authors) ? metadata.authors : [metadata.authors];\n authors.forEach(a => {\n if (a.name) tags.push(`<meta name=\"author\" content=\"${escapeHtml(a.name)}\">`);\n if (a.url) tags.push(`<link rel=\"author\" href=\"${a.url}\">`);\n });\n }\n\n if (metadata.generator) tags.push(`<meta name=\"generator\" content=\"${escapeHtml(metadata.generator)}\">`);\n if (metadata.applicationName) tags.push(`<meta name=\"application-name\" content=\"${escapeHtml(metadata.applicationName)}\">`);\n if (metadata.referrer) tags.push(`<meta name=\"referrer\" content=\"${metadata.referrer}\">`);\n\n // Robots\n if (metadata.robots) {\n if (typeof metadata.robots === 'string') {\n tags.push(`<meta name=\"robots\" content=\"${metadata.robots}\">`);\n } else {\n tags.push(`<meta name=\"robots\" content=\"${generateRobotsContent(metadata.robots)}\">`);\n if (metadata.robots.googleBot) {\n const gbc = typeof metadata.robots.googleBot === 'string' ? metadata.robots.googleBot : generateRobotsContent(metadata.robots.googleBot);\n tags.push(`<meta name=\"googlebot\" content=\"${gbc}\">`);\n }\n }\n }\n\n // Viewport\n if (metadata.viewport) {\n const vc = typeof metadata.viewport === 'string' ? metadata.viewport : generateViewportContent(metadata.viewport);\n tags.push(`<meta name=\"viewport\" content=\"${vc}\">`);\n }\n\n // Theme Color\n if (metadata.themeColor) {\n const tcs = Array.isArray(metadata.themeColor) ? metadata.themeColor : [metadata.themeColor];\n tcs.forEach(tc => {\n const media = typeof tc !== 'string' && tc.media ? ` media=\"${tc.media}\"` : '';\n const color = typeof tc === 'string' ? tc : tc.color;\n tags.push(`<meta name=\"theme-color\" content=\"${color}\"${media}>`);\n });\n }\n\n if (metadata.colorScheme) tags.push(`<meta name=\"color-scheme\" content=\"${metadata.colorScheme}\">`);\n\n // Icons\n if (metadata.icons) {\n const addIcon = (icon: IconDescriptor, defaultRel: string) => {\n const rel = icon.rel || defaultRel;\n const attrs = [\n icon.type ? ` type=\"${icon.type}\"` : '',\n icon.sizes ? ` sizes=\"${icon.sizes}\"` : '',\n icon.color ? ` color=\"${icon.color}\"` : '',\n ].join('');\n tags.push(`<link rel=\"${rel}\" href=\"${resolveUrl(icon.url, base)}\"${attrs}>`);\n };\n if (metadata.icons.icon) { (Array.isArray(metadata.icons.icon) ? metadata.icons.icon : [metadata.icons.icon]).forEach(i => addIcon(i, 'icon')); }\n if (metadata.icons.apple) { (Array.isArray(metadata.icons.apple) ? metadata.icons.apple : [metadata.icons.apple]).forEach(i => addIcon(i, 'apple-touch-icon')); }\n }\n\n if (metadata.manifest) tags.push(`<link rel=\"manifest\" href=\"${resolveUrl(metadata.manifest, base)}\">`);\n\n // Open Graph\n if (metadata.openGraph) {\n const og = metadata.openGraph;\n if (og.type) tags.push(`<meta property=\"og:type\" content=\"${og.type}\">`);\n if (og.title) tags.push(`<meta property=\"og:title\" content=\"${escapeHtml(og.title)}\">`);\n if (og.description) tags.push(`<meta property=\"og:description\" content=\"${escapeHtml(og.description)}\">`);\n if (og.url) tags.push(`<meta property=\"og:url\" content=\"${resolveUrl(og.url, base)}\">`);\n if (og.siteName) tags.push(`<meta property=\"og:site_name\" content=\"${escapeHtml(og.siteName)}\">`);\n if (og.locale) tags.push(`<meta property=\"og:locale\" content=\"${og.locale}\">`);\n if (og.images) {\n (Array.isArray(og.images) ? og.images : [og.images]).forEach(img => {\n tags.push(`<meta property=\"og:image\" content=\"${resolveUrl(img.url, base)}\">`);\n if (img.width) tags.push(`<meta property=\"og:image:width\" content=\"${img.width}\">`);\n if (img.height) tags.push(`<meta property=\"og:image:height\" content=\"${img.height}\">`);\n if (img.alt) tags.push(`<meta property=\"og:image:alt\" content=\"${escapeHtml(img.alt)}\">`);\n });\n }\n if (og.type === 'article') {\n if (og.publishedTime) tags.push(`<meta property=\"article:published_time\" content=\"${og.publishedTime}\">`);\n if (og.modifiedTime) tags.push(`<meta property=\"article:modified_time\" content=\"${og.modifiedTime}\">`);\n if (og.tags) og.tags.forEach(t => tags.push(`<meta property=\"article:tag\" content=\"${escapeHtml(t)}\">`));\n }\n }\n\n // Twitter\n if (metadata.twitter) {\n const tw = metadata.twitter;\n if (tw.card) tags.push(`<meta name=\"twitter:card\" content=\"${tw.card}\">`);\n if (tw.site) tags.push(`<meta name=\"twitter:site\" content=\"${tw.site}\">`);\n if (tw.creator) tags.push(`<meta name=\"twitter:creator\" content=\"${tw.creator}\">`);\n if (tw.title) tags.push(`<meta name=\"twitter:title\" content=\"${escapeHtml(tw.title)}\">`);\n if (tw.description) tags.push(`<meta name=\"twitter:description\" content=\"${escapeHtml(tw.description)}\">`);\n if (tw.images) {\n (Array.isArray(tw.images) ? tw.images : [tw.images]).forEach(img => {\n const url = typeof img === 'string' ? img : img.url;\n tags.push(`<meta name=\"twitter:image\" content=\"${resolveUrl(url, base)}\">`);\n });\n }\n }\n\n // Verification\n if (metadata.verification) {\n if (metadata.verification.google) {\n (Array.isArray(metadata.verification.google) ? metadata.verification.google : [metadata.verification.google])\n .forEach(v => tags.push(`<meta name=\"google-site-verification\" content=\"${v}\">`));\n }\n }\n\n // Alternates\n if (metadata.alternates) {\n if (metadata.alternates.canonical) tags.push(`<link rel=\"canonical\" href=\"${resolveUrl(metadata.alternates.canonical, base)}\">`);\n if (metadata.alternates.languages) {\n Object.entries(metadata.alternates.languages).forEach(([lang, url]) => {\n tags.push(`<link rel=\"alternate\" hreflang=\"${lang}\" href=\"${resolveUrl(url, base)}\">`);\n });\n }\n }\n\n return tags.join('\\n ');\n}\n\n// ============================================================================\n// Merge & JSON-LD\n// ============================================================================\n\nexport function mergeMetadata(parent: Metadata, child: Metadata): Metadata {\n return {\n ...parent, ...child,\n openGraph: child.openGraph ? { ...parent.openGraph, ...child.openGraph } : parent.openGraph,\n twitter: child.twitter ? { ...parent.twitter, ...child.twitter } : parent.twitter,\n icons: child.icons ? { ...parent.icons, ...child.icons } : parent.icons,\n alternates: child.alternates ? { ...parent.alternates, ...child.alternates } : parent.alternates,\n };\n}\n\nexport function generateJsonLd(data: Record<string, unknown>): string {\n return `<script type=\"application/ld+json\">${JSON.stringify(data)}</script>`;\n}\n\nexport const jsonLd = {\n website: (c: { name: string; url: string; description?: string }) => ({\n '@context': 'https://schema.org', '@type': 'WebSite', name: c.name, url: c.url, description: c.description\n }),\n article: (c: { headline: string; description?: string; image?: string | string[]; datePublished: string; dateModified?: string; author: { name: string; url?: string } | { name: string; url?: string }[] }) => ({\n '@context': 'https://schema.org', '@type': 'Article', headline: c.headline, description: c.description,\n image: c.image, datePublished: c.datePublished, dateModified: c.dateModified || c.datePublished,\n author: Array.isArray(c.author) ? c.author.map(a => ({ '@type': 'Person', ...a })) : { '@type': 'Person', ...c.author }\n }),\n organization: (c: { name: string; url: string; logo?: string; sameAs?: string[] }) => ({\n '@context': 'https://schema.org', '@type': 'Organization', name: c.name, url: c.url, logo: c.logo, sameAs: c.sameAs\n }),\n breadcrumb: (items: { name: string; url: string }[]) => ({\n '@context': 'https://schema.org', '@type': 'BreadcrumbList',\n itemListElement: items.map((item, i) => ({ '@type': 'ListItem', position: i + 1, name: item.name, item: item.url }))\n }),\n};\n\n// ============================================================================\n// Automatic SEO Generation\n// ============================================================================\n\n/**\n * Generate sitemap.xml content from routes\n */\nexport function generateSitemap(routes: Array<{ type: string; path: string }>, baseUrl: string): string {\n const urls = routes\n .filter(r => r.type === 'page' && !r.path.includes(':') && !r.path.includes('*'))\n .map(r => {\n const loc = `${baseUrl.replace(/\\/$/, '')}${r.path}`;\n return ` <url>\\n <loc>${loc}</loc>\\n <lastmod>${new Date().toISOString().split('T')[0]}</lastmod>\\n <changefreq>weekly</changefreq>\\n <priority>${r.path === '/' ? '1.0' : '0.8'}</priority>\\n </url>`;\n });\n\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">\\n${urls.join('\\n')}\\n</urlset>`;\n}\n\n/**\n * Generate robots.txt content\n */\nexport function generateRobotsTxt(baseUrl: string, options: { disallow?: string[]; allow?: string[] } = {}): string {\n const lines = ['User-agent: *'];\n if (options.allow) options.allow.forEach(p => lines.push(`Allow: ${p}`));\n if (options.disallow) options.disallow.forEach(p => lines.push(`Disallow: ${p}`));\n else lines.push('Allow: /');\n lines.push('', `Sitemap: ${baseUrl.replace(/\\/$/, '')}/sitemap.xml`);\n return lines.join('\\n');\n}\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\nfunction escapeHtml(str: string): string {\n return str.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;').replace(/'/g, '&#039;');\n}\n\nfunction resolveUrl(url: string, base: string): string {\n if (url.startsWith('http://') || url.startsWith('https://') || url.startsWith('//')) return url;\n return base ? `${base.replace(/\\/$/, '')}${url.startsWith('/') ? '' : '/'}${url}` : url;\n}\n\nfunction generateRobotsContent(robots: Robots): string {\n const parts: string[] = [];\n if (robots.index !== undefined) parts.push(robots.index ? 'index' : 'noindex');\n if (robots.follow !== undefined) parts.push(robots.follow ? 'follow' : 'nofollow');\n if (robots.noarchive) parts.push('noarchive');\n if (robots.nosnippet) parts.push('nosnippet');\n if (robots.noimageindex) parts.push('noimageindex');\n return parts.join(', ') || 'index, follow';\n}\n\nfunction generateViewportContent(viewport: Viewport): string {\n const parts: string[] = [];\n if (viewport.width) parts.push(`width=${viewport.width}`);\n if (viewport.height) parts.push(`height=${viewport.height}`);\n if (viewport.initialScale !== undefined) parts.push(`initial-scale=${viewport.initialScale}`);\n if (viewport.maximumScale !== undefined) parts.push(`maximum-scale=${viewport.maximumScale}`);\n if (viewport.userScalable !== undefined) parts.push(`user-scalable=${viewport.userScalable ? 'yes' : 'no'}`);\n return parts.join(', ') || 'width=device-width, initial-scale=1';\n}\n\nexport default { generateMetadataTags, mergeMetadata, generateJsonLd, jsonLd, generateSitemap, generateRobotsTxt };\n","/**\n * Velix v5 Middleware System\n * Request processing pipeline with composable middleware\n */\n\nimport fs from 'fs';\nimport path from 'path';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface MiddlewareRequest {\n url: string;\n method: string;\n headers: Record<string, string | string[] | undefined>;\n cookies: Record<string, string>;\n params: Record<string, string>;\n query: Record<string, string>;\n body?: unknown;\n raw: import('http').IncomingMessage;\n}\n\nexport interface MiddlewareResponse {\n status: (code: number) => MiddlewareResponse;\n header: (name: string, value: string) => MiddlewareResponse;\n json: (data: unknown) => void;\n redirect: (url: string, status?: number) => void;\n rewrite: (url: string) => void;\n next: () => Promise<void>;\n _statusCode: number;\n _headers: Record<string, string>;\n _redirectUrl: string | null;\n _rewriteUrl: string | null;\n _ended: boolean;\n}\n\nexport type MiddlewareFunction = (\n req: MiddlewareRequest,\n res: MiddlewareResponse,\n next: () => Promise<void>\n) => void | Promise<void>;\n\nexport type MiddlewareResult = {\n continue: boolean;\n rewritten: boolean;\n};\n\n// ============================================================================\n// Built-in Middleware Registry\n// ============================================================================\n\nexport const middlewares = {\n cors(options: {\n origin?: string | string[];\n methods?: string[];\n headers?: string[];\n credentials?: boolean;\n maxAge?: number;\n } = {}): MiddlewareFunction {\n const {\n origin = '*',\n methods = ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'OPTIONS'],\n headers: allowHeaders = ['Content-Type', 'Authorization'],\n credentials = false,\n maxAge = 86400\n } = options;\n\n return async (req, res, next) => {\n const originHeader = typeof origin === 'string' ? origin : origin.includes(req.headers.origin as string) ? req.headers.origin as string : '';\n\n res.header('Access-Control-Allow-Origin', originHeader);\n res.header('Access-Control-Allow-Methods', methods.join(', '));\n res.header('Access-Control-Allow-Headers', allowHeaders.join(', '));\n res.header('Access-Control-Max-Age', String(maxAge));\n\n if (credentials) {\n res.header('Access-Control-Allow-Credentials', 'true');\n }\n\n if (req.method === 'OPTIONS') {\n res.status(204);\n return;\n }\n\n await next();\n };\n },\n\n rateLimit(options: {\n windowMs?: number;\n max?: number;\n message?: string;\n } = {}): MiddlewareFunction {\n const { windowMs = 60000, max = 100, message = 'Too many requests' } = options;\n const store = new Map<string, { count: number; resetTime: number }>();\n\n return async (req, res, next) => {\n const ip = req.headers['x-forwarded-for'] as string || 'unknown';\n const now = Date.now();\n const record = store.get(ip);\n\n if (!record || now > record.resetTime) {\n store.set(ip, { count: 1, resetTime: now + windowMs });\n } else if (record.count >= max) {\n res.status(429).json({ error: message });\n return;\n } else {\n record.count++;\n }\n\n await next();\n };\n },\n\n security(): MiddlewareFunction {\n return async (_req, res, next) => {\n res.header('X-Content-Type-Options', 'nosniff');\n res.header('X-Frame-Options', 'DENY');\n res.header('X-XSS-Protection', '1; mode=block');\n res.header('Referrer-Policy', 'strict-origin-when-cross-origin');\n await next();\n };\n },\n};\n\n// ============================================================================\n// Middleware Loader\n// ============================================================================\n\n/**\n * Loads proxy middleware from the project root (proxy.ts or proxy.js)\n */\nexport async function loadMiddleware(projectRoot: string): Promise<MiddlewareFunction[]> {\n const fns: MiddlewareFunction[] = [];\n const possibleFiles = ['proxy.ts', 'proxy.js'];\n\n for (const file of possibleFiles) {\n const filePath = path.join(projectRoot, file);\n if (!fs.existsSync(filePath)) continue;\n\n try {\n const { pathToFileURL } = await import('url');\n const url = pathToFileURL(filePath).href;\n const mod = await import(`${url}?t=${Date.now()}`);\n const fn = mod.default || mod.proxy || mod.middleware;\n if (typeof fn === 'function') {\n fns.push(fn);\n break; // Only load the first found proxy file\n }\n } catch (err: unknown) {\n const error = err as Error;\n console.warn(`⚠ Failed to load proxy ${file}: ${error.message}`);\n }\n }\n\n return fns;\n}\n\n// ============================================================================\n// Middleware Runner\n// ============================================================================\n\n/**\n * Runs middleware chain for a request\n */\nexport async function runMiddleware(\n req: import('http').IncomingMessage,\n res: import('http').ServerResponse,\n fns: MiddlewareFunction[]\n): Promise<MiddlewareResult> {\n const result: MiddlewareResult = { continue: true, rewritten: false };\n if (fns.length === 0) return result;\n\n const url = new URL(req.url || '/', `http://${req.headers.host || 'localhost'}`);\n const cookies: Record<string, string> = {};\n const cookieHeader = req.headers.cookie;\n if (cookieHeader) {\n cookieHeader.split(';').forEach(c => {\n const [k, ...v] = c.split('=');\n if (k) cookies[k.trim()] = v.join('=').trim();\n });\n }\n\n const mReq: MiddlewareRequest = {\n url: req.url || '/',\n method: req.method || 'GET',\n headers: req.headers as Record<string, string>,\n cookies,\n params: {},\n query: Object.fromEntries(url.searchParams),\n raw: req,\n };\n\n let ended = false;\n const mRes: MiddlewareResponse = {\n _statusCode: 200,\n _headers: {},\n _redirectUrl: null,\n _rewriteUrl: null,\n _ended: false,\n status(code) { this._statusCode = code; return this; },\n header(name, value) { this._headers[name] = value; return this; },\n json(data) {\n this._headers['Content-Type'] = 'application/json';\n res.writeHead(this._statusCode, this._headers);\n res.end(JSON.stringify(data));\n this._ended = true;\n ended = true;\n },\n redirect(url, status = 307) {\n this._redirectUrl = url;\n this._statusCode = status;\n res.writeHead(status, { Location: url, ...this._headers });\n res.end();\n this._ended = true;\n ended = true;\n },\n rewrite(url) {\n this._rewriteUrl = url;\n req.url = url;\n result.rewritten = true;\n },\n async next() { /* handled by chain */ },\n };\n\n // Run middleware chain\n let index = 0;\n const next = async () => {\n if (ended || index >= fns.length) return;\n const fn = fns[index++];\n await fn(mReq, mRes, next);\n };\n\n await next();\n\n // Apply headers that were set\n if (!ended) {\n for (const [key, value] of Object.entries(mRes._headers)) {\n res.setHeader(key, value);\n }\n }\n\n result.continue = !ended;\n return result;\n}\n\n/**\n * Compose multiple middleware into one\n */\nexport function composeMiddleware(...fns: MiddlewareFunction[]): MiddlewareFunction {\n return async (req, res, next) => {\n let index = 0;\n const run = async () => {\n if (index >= fns.length) { await next(); return; }\n const fn = fns[index++];\n await fn(req, res, run);\n };\n await run();\n };\n}\n","/**\n * Velix v5 Plugin System\n * Extensible hook-based plugin architecture\n */\n\nimport fs from 'fs';\nimport path from 'path';\nimport { pathToFileURL } from 'url';\n\n// ============================================================================\n// Plugin Hooks\n// ============================================================================\n\nexport const PluginHooks = {\n CONFIG: 'config',\n SERVER_START: 'server:start',\n REQUEST: 'request',\n RESPONSE: 'response',\n ROUTES_LOADED: 'routes:loaded',\n BEFORE_RENDER: 'render:before',\n AFTER_RENDER: 'render:after',\n BUILD_START: 'build:start',\n BUILD_END: 'build:end',\n} as const;\n\nexport type PluginHook = typeof PluginHooks[keyof typeof PluginHooks];\n\n// ============================================================================\n// Plugin Interface\n// ============================================================================\n\nexport interface PluginHookArgs {\n [PluginHooks.CONFIG]: [config: import('../config.js').VelixConfig];\n [PluginHooks.SERVER_START]: [context: { config: import('../config.js').VelixConfig; isDev: boolean; projectRoot: string }, isDev: boolean];\n [PluginHooks.REQUEST]: [req: import('http').IncomingMessage, res: import('http').ServerResponse];\n [PluginHooks.RESPONSE]: [req: import('http').IncomingMessage, res: import('http').ServerResponse, duration: number];\n [PluginHooks.ROUTES_LOADED]: [routes: import('../types.js').RouteTree];\n [PluginHooks.BEFORE_RENDER]: [html: string, context: { route: import('../types.js').Route; config: import('../config.js').VelixConfig; isDev: boolean }];\n [PluginHooks.AFTER_RENDER]: [html: string, context: { route: import('../types.js').Route; config: import('../config.js').VelixConfig; isDev: boolean }];\n [PluginHooks.BUILD_START]: [];\n [PluginHooks.BUILD_END]: [stats: { time: number }];\n}\n\nexport interface VelixPluginDefinition {\n name: string;\n version?: string;\n setup?: (config: import('../config.js').VelixConfig) => void | Promise<void>;\n hooks?: { [K in PluginHook]?: (...args: PluginHookArgs[K]) => unknown };\n [key: string]: unknown; // Allow for Zod passthrough and extra properties\n}\n\n// ============================================================================\n// Plugin Manager\n// ============================================================================\n\nexport class PluginManager {\n private plugins: VelixPluginDefinition[] = [];\n private hooks: Map<string, Array<(...args: any[]) => any>> = new Map();\n\n /**\n * Register a plugin\n */\n register(plugin: VelixPluginDefinition) {\n this.plugins.push(plugin);\n\n // Register hooks\n if (plugin.hooks) {\n for (const [hookName, handler] of Object.entries(plugin.hooks)) {\n if (handler) {\n const existing = this.hooks.get(hookName) || [];\n existing.push(handler);\n this.hooks.set(hookName, existing);\n }\n }\n }\n }\n\n /**\n * Run a hook with arguments\n */\n async runHook<K extends PluginHook>(hookName: K, ...args: PluginHookArgs[K]): Promise<void> {\n const handlers = this.hooks.get(hookName) || [];\n for (const handler of handlers) {\n await handler(...args);\n }\n }\n\n /**\n * Run a waterfall hook — each handler transforms the first argument\n */\n async runWaterfallHook<K extends PluginHook>(hookName: K, value: PluginHookArgs[K][0], ...args: PluginHookArgs[K] extends [unknown, ...infer Rest] ? Rest : []): Promise<PluginHookArgs[K][0]> {\n const handlers = this.hooks.get(hookName) || [];\n let result = value;\n for (const handler of handlers) {\n const transformed = await handler(result, ...args);\n if (transformed !== undefined) result = transformed;\n }\n return result;\n }\n\n /**\n * Get all registered plugins\n */\n getPlugins(): VelixPluginDefinition[] {\n return [...this.plugins];\n }\n\n /**\n * Check if a plugin is registered\n */\n hasPlugin(name: string): boolean {\n return this.plugins.some(p => p.name === name);\n }\n}\n\n// ============================================================================\n// Global Instance\n// ============================================================================\n\nexport const pluginManager = new PluginManager();\n\n// ============================================================================\n// Plugin Loader\n// ============================================================================\n\n/**\n * Load plugins from project configuration\n */\nexport async function loadPlugins(projectRoot: string, config: { plugins?: unknown[] }): Promise<void> {\n const pluginEntries = config.plugins || [];\n\n for (const entry of pluginEntries) {\n try {\n if (typeof entry === 'string') {\n // Load plugin by name (from plugins/ dir or node_modules)\n const localPath = path.join(projectRoot, 'plugins', entry + '.ts');\n const localPathJs = path.join(projectRoot, 'plugins', entry + '.js');\n const localPathDir = path.join(projectRoot, 'plugins', entry, 'index.ts');\n\n let pluginPath: string | null = null;\n if (fs.existsSync(localPath)) pluginPath = localPath;\n else if (fs.existsSync(localPathJs)) pluginPath = localPathJs;\n else if (fs.existsSync(localPathDir)) pluginPath = localPathDir;\n\n if (pluginPath) {\n const url = pathToFileURL(pluginPath).href;\n const mod = await import(`${url}?t=${Date.now()}`);\n const plugin = mod.default || mod;\n if (plugin.name) {\n pluginManager.register(plugin);\n }\n } else {\n // Try node_modules\n try {\n const mod = await import(entry);\n const plugin = mod.default || mod;\n if (plugin.name) pluginManager.register(plugin);\n } catch {\n console.warn(`⚠ Plugin not found: ${entry}`);\n }\n }\n } else if (typeof entry === 'object' && entry !== null && 'name' in entry) {\n // Inline plugin definition\n pluginManager.register(entry as VelixPluginDefinition);\n }\n } catch (err: unknown) {\n const error = err as Error;\n console.warn(`⚠ Failed to load plugin: ${error?.message || String(error)}`);\n }\n }\n}\n\n// ============================================================================\n// Plugin Definition Helper\n// ============================================================================\n\n/**\n * Helper to define a Velix plugin with type safety.\n *\n * @example\n * ```ts\n * export default definePlugin({\n * name: 'my-plugin',\n * hooks: {\n * 'server:start': (server) => {\n * console.log('Server started!');\n * }\n * }\n * });\n * ```\n */\nexport function definePlugin(definition: VelixPluginDefinition): VelixPluginDefinition {\n return definition;\n}\n\n// ============================================================================\n// Built-in Plugins\n// ============================================================================\n\nexport const builtinPlugins = {\n /**\n * Security headers plugin\n */\n security: definePlugin({\n name: 'velix:security',\n hooks: {\n [PluginHooks.RESPONSE]: (_req: unknown, res: unknown) => {\n const response = res as import('http').ServerResponse;\n if (!response.headersSent) {\n response.setHeader('X-Content-Type-Options', 'nosniff');\n response.setHeader('X-Frame-Options', 'DENY');\n response.setHeader('X-XSS-Protection', '1; mode=block');\n }\n }\n }\n }),\n\n /**\n * Request logging plugin\n */\n logger: definePlugin({\n name: 'velix:logger',\n hooks: {\n [PluginHooks.RESPONSE]: (req: unknown, _res: unknown, duration: unknown) => {\n const request = req as import('http').IncomingMessage;\n console.log(` ${request.method} ${request.url} ${duration}ms`);\n }\n }\n }),\n};\n","/**\n * Velix AI Plugin - Utilities\n * @module velix-plugin-ai/utils\n */\n\n/**\n * Retry a function with exponential backoff\n */\nexport async function retry<T>(\n fn: () => Promise<T>,\n options: { maxRetries: number; retryDelay: number } = { maxRetries: 3, retryDelay: 1000 }\n): Promise<T> {\n let lastError: Error | undefined;\n \n for (let i = 0; i < options.maxRetries; i++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error as Error;\n \n if (i < options.maxRetries - 1) {\n const delay = options.retryDelay * Math.pow(2, i);\n await new Promise(resolve => setTimeout(resolve, delay));\n }\n }\n }\n \n throw lastError || new Error('Retry failed');\n}\n\n/**\n * Safe JSON parsing with fallback\n */\nexport function safeJsonParse<T = unknown>(text: string, fallback?: T): T | null {\n try {\n // Try to extract JSON from markdown code blocks\n const jsonMatch = text.match(/```json\\n([\\s\\S]*?)\\n```/);\n if (jsonMatch) {\n return JSON.parse(jsonMatch[1]);\n }\n \n // Try to parse the whole text\n return JSON.parse(text);\n } catch {\n return fallback ?? null;\n }\n}\n\n/**\n * Build a prompt from a template\n */\nexport function buildPrompt(template: string, variables: Record<string, unknown>): string {\n return template.replace(/\\{\\{(\\w+)\\}\\}/g, (_, key) => {\n const val = variables[key];\n return val != null ? String(val) : '';\n });\n}\n\n/**\n * Validate API key\n */\nexport function validateApiKey(apiKey: string | undefined, provider: string): void {\n if (!apiKey || apiKey.trim() === '') {\n throw new Error(`API key is required for ${provider} provider`);\n }\n}\n\n/**\n * Validate input\n */\nexport function validateInput(input: Record<string, unknown>, requiredFields: string[]): void {\n for (const field of requiredFields) {\n if (!(field in input) || input[field] === undefined || input[field] === null) {\n throw new Error(`Missing required field: ${field}`);\n }\n }\n}\n\n/**\n * Create a streaming text decoder\n */\nexport function createStreamDecoder() {\n const decoder = new TextDecoder();\n \n return (chunk: Uint8Array): string => {\n return decoder.decode(chunk, { stream: true });\n };\n}\n\n/**\n * Parse SSE (Server-Sent Events) data\n */\nexport function parseSSE(line: string): unknown {\n if (!line.startsWith('data: ')) {\n return null;\n }\n \n const data = line.slice(6);\n \n if (data === '[DONE]') {\n return { done: true };\n }\n \n try {\n return JSON.parse(data);\n } catch {\n return null;\n }\n}\n\n/**\n * Sanitize input text\n */\nexport function sanitizeInput(text: string): string {\n return text.trim().replace(/\\0/g, '');\n}\n\n/**\n * Count tokens (rough estimation)\n */\nexport function estimateTokens(text: string): number {\n // Rough estimation: ~4 characters per token\n return Math.ceil(text.length / 4);\n}\n\n/**\n * Truncate text to max tokens\n */\nexport function truncateToTokens(text: string, maxTokens: number): string {\n const estimatedTokens = estimateTokens(text);\n \n if (estimatedTokens <= maxTokens) {\n return text;\n }\n \n const maxChars = maxTokens * 4;\n return text.slice(0, maxChars) + '...';\n}\n","/**\n * Velix AI Plugin - OpenAI Provider\n * @module velix-plugin-ai/providers/openai\n */\n\nimport type {\n AIProvider,\n AIInput,\n AIResponse,\n ChatInput,\n AIStreamChunk,\n EmbedInput,\n EmbedResponse\n} from '../types';\nimport { validateApiKey, retry, parseSSE } from '../utils';\n\nexport interface OpenAIConfig {\n apiKey: string;\n baseUrl?: string;\n defaultModel?: string;\n organization?: string;\n retry?: {\n maxRetries: number;\n retryDelay: number;\n };\n}\n\nexport class OpenAIProvider implements AIProvider {\n name = 'openai' as const;\n private apiKey: string;\n private baseUrl: string;\n private defaultModel: string;\n private organization?: string;\n private retryConfig: { maxRetries: number; retryDelay: number };\n\n constructor(config: OpenAIConfig) {\n validateApiKey(config.apiKey, 'OpenAI');\n \n this.apiKey = config.apiKey;\n this.baseUrl = config.baseUrl || 'https://api.openai.com/v1';\n this.defaultModel = config.defaultModel || 'gpt-4o-mini';\n this.organization = config.organization;\n this.retryConfig = config.retry || { maxRetries: 3, retryDelay: 1000 };\n }\n\n async generate(input: AIInput): Promise<AIResponse> {\n return retry(async () => {\n const response = await fetch(`${this.baseUrl}/chat/completions`, {\n method: 'POST',\n headers: this.getHeaders(),\n body: JSON.stringify({\n model: input.model || this.defaultModel,\n messages: [\n ...(input.system ? [{ role: 'system', content: input.system }] : []),\n { role: 'user', content: input.prompt }\n ],\n temperature: input.temperature ?? 0.7,\n max_tokens: input.maxTokens,\n stop: input.stop,\n ...input.options\n })\n });\n\n if (!response.ok) {\n const error = await response.json();\n throw new Error(`OpenAI API error: ${error.error?.message || response.statusText}`);\n }\n\n const data = await response.json();\n \n return {\n text: data.choices[0].message.content,\n provider: 'openai',\n model: data.model,\n usage: {\n promptTokens: data.usage.prompt_tokens,\n completionTokens: data.usage.completion_tokens,\n totalTokens: data.usage.total_tokens\n },\n raw: data\n };\n }, this.retryConfig);\n }\n\n async chat(input: ChatInput): Promise<AIResponse> {\n return retry(async () => {\n const response = await fetch(`${this.baseUrl}/chat/completions`, {\n method: 'POST',\n headers: this.getHeaders(),\n body: JSON.stringify({\n model: input.model || this.defaultModel,\n messages: input.messages,\n temperature: input.temperature ?? 0.7,\n max_tokens: input.maxTokens,\n stop: input.stop,\n ...input.options\n })\n });\n\n if (!response.ok) {\n const error = await response.json();\n throw new Error(`OpenAI API error: ${error.error?.message || response.statusText}`);\n }\n\n const data = await response.json();\n \n return {\n text: data.choices[0].message.content,\n provider: 'openai',\n model: data.model,\n usage: {\n promptTokens: data.usage.prompt_tokens,\n completionTokens: data.usage.completion_tokens,\n totalTokens: data.usage.total_tokens\n },\n raw: data\n };\n }, this.retryConfig);\n }\n\n async *stream(input: AIInput): AsyncIterable<AIStreamChunk> {\n const response = await fetch(`${this.baseUrl}/chat/completions`, {\n method: 'POST',\n headers: this.getHeaders(),\n body: JSON.stringify({\n model: input.model || this.defaultModel,\n messages: [\n ...(input.system ? [{ role: 'system', content: input.system }] : []),\n { role: 'user', content: input.prompt }\n ],\n temperature: input.temperature ?? 0.7,\n max_tokens: input.maxTokens,\n stop: input.stop,\n stream: true,\n ...input.options\n })\n });\n\n if (!response.ok) {\n const error = await response.json();\n throw new Error(`OpenAI API error: ${error.error?.message || response.statusText}`);\n }\n\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error('Response body is not readable');\n }\n\n const decoder = new TextDecoder();\n let buffer = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n \n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed || trimmed === 'data: [DONE]') continue;\n\n const parsed = parseSSE(trimmed) as { choices?: Array<{ delta?: { content?: string } }>; model?: string } | null;\n if (!parsed) continue;\n\n const delta = parsed.choices?.[0]?.delta?.content;\n if (delta) {\n yield {\n text: delta,\n done: false,\n provider: 'openai',\n model: parsed.model\n };\n }\n }\n }\n\n yield { text: '', done: true, provider: 'openai' };\n } finally {\n reader.releaseLock();\n }\n }\n\n async embed(input: EmbedInput): Promise<EmbedResponse> {\n return retry(async () => {\n const response = await fetch(`${this.baseUrl}/embeddings`, {\n method: 'POST',\n headers: this.getHeaders(),\n body: JSON.stringify({\n model: input.model || 'text-embedding-3-small',\n input: input.text\n })\n });\n\n if (!response.ok) {\n const error = await response.json();\n throw new Error(`OpenAI API error: ${error.error?.message || response.statusText}`);\n }\n\n const data = await response.json();\n \n return {\n embedding: data.data[0].embedding,\n provider: 'openai',\n model: data.model\n };\n }, this.retryConfig);\n }\n\n private getHeaders(): Record<string, string> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${this.apiKey}`\n };\n\n if (this.organization) {\n headers['OpenAI-Organization'] = this.organization;\n }\n\n return headers;\n }\n}\n","/**\n * Velix AI Plugin - Ollama Provider\n * @module velix-plugin-ai/providers/ollama\n */\n\nimport type {\n AIProvider,\n AIInput,\n AIResponse,\n ChatInput,\n AIStreamChunk,\n EmbedInput,\n EmbedResponse\n} from '../types';\nimport { retry } from '../utils';\n\nexport interface OllamaConfig {\n baseUrl?: string;\n defaultModel?: string;\n retry?: {\n maxRetries: number;\n retryDelay: number;\n };\n}\n\nexport class OllamaProvider implements AIProvider {\n name = 'ollama' as const;\n private baseUrl: string;\n private defaultModel: string;\n private retryConfig: { maxRetries: number; retryDelay: number };\n\n constructor(config: OllamaConfig = {}) {\n this.baseUrl = config.baseUrl || 'http://localhost:11434';\n this.defaultModel = config.defaultModel || 'llama3.2';\n this.retryConfig = config.retry || { maxRetries: 3, retryDelay: 1000 };\n }\n\n async generate(input: AIInput): Promise<AIResponse> {\n return retry(async () => {\n const response = await fetch(`${this.baseUrl}/api/generate`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n model: input.model || this.defaultModel,\n prompt: input.prompt,\n system: input.system,\n options: {\n temperature: input.temperature ?? 0.7,\n num_predict: input.maxTokens,\n stop: input.stop,\n ...input.options\n },\n stream: false\n })\n });\n\n if (!response.ok) {\n throw new Error(`Ollama API error: ${response.statusText}`);\n }\n\n const data = await response.json();\n \n return {\n text: data.response,\n provider: 'ollama',\n model: data.model,\n usage: {\n promptTokens: data.prompt_eval_count || 0,\n completionTokens: data.eval_count || 0,\n totalTokens: (data.prompt_eval_count || 0) + (data.eval_count || 0)\n },\n raw: data\n };\n }, this.retryConfig);\n }\n\n async chat(input: ChatInput): Promise<AIResponse> {\n return retry(async () => {\n const response = await fetch(`${this.baseUrl}/api/chat`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n model: input.model || this.defaultModel,\n messages: input.messages,\n options: {\n temperature: input.temperature ?? 0.7,\n num_predict: input.maxTokens,\n stop: input.stop,\n ...input.options\n },\n stream: false\n })\n });\n\n if (!response.ok) {\n throw new Error(`Ollama API error: ${response.statusText}`);\n }\n\n const data = await response.json();\n \n return {\n text: data.message.content,\n provider: 'ollama',\n model: data.model,\n usage: {\n promptTokens: data.prompt_eval_count || 0,\n completionTokens: data.eval_count || 0,\n totalTokens: (data.prompt_eval_count || 0) + (data.eval_count || 0)\n },\n raw: data\n };\n }, this.retryConfig);\n }\n\n async *stream(input: AIInput): AsyncIterable<AIStreamChunk> {\n const response = await fetch(`${this.baseUrl}/api/generate`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n model: input.model || this.defaultModel,\n prompt: input.prompt,\n system: input.system,\n options: {\n temperature: input.temperature ?? 0.7,\n num_predict: input.maxTokens,\n stop: input.stop,\n ...input.options\n },\n stream: true\n })\n });\n\n if (!response.ok) {\n throw new Error(`Ollama API error: ${response.statusText}`);\n }\n\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error('Response body is not readable');\n }\n\n const decoder = new TextDecoder();\n let buffer = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n \n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n\n try {\n const data = JSON.parse(trimmed);\n \n if (data.response) {\n yield {\n text: data.response,\n done: data.done || false,\n provider: 'ollama',\n model: data.model\n };\n }\n\n if (data.done) {\n return;\n }\n } catch {\n // Skip invalid JSON\n }\n }\n }\n\n yield { text: '', done: true, provider: 'ollama' };\n } finally {\n reader.releaseLock();\n }\n }\n\n async embed(input: EmbedInput): Promise<EmbedResponse> {\n return retry(async () => {\n const response = await fetch(`${this.baseUrl}/api/embeddings`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n model: input.model || this.defaultModel,\n prompt: input.text\n })\n });\n\n if (!response.ok) {\n throw new Error(`Ollama API error: ${response.statusText}`);\n }\n\n const data = await response.json();\n \n return {\n embedding: data.embedding,\n provider: 'ollama',\n model: data.model || input.model || this.defaultModel\n };\n }, this.retryConfig);\n }\n}\n","/**\n * Velix AI Plugin - AI Client\n * @module velix-plugin-ai/client\n */\n\nimport type {\n AIClient,\n AIProvider,\n AIInput,\n AIResponse,\n ChatInput,\n AIStreamChunk,\n EmbedInput,\n EmbedResponse,\n AIPluginConfig\n} from './types';\nimport { OpenAIProvider } from './providers/openai';\nimport { OllamaProvider } from './providers/ollama';\n\n/**\n * Create an AI client\n */\nexport function createAIClient(config: AIPluginConfig): AIClient {\n const provider = createProvider(config);\n\n return {\n async generate(input: AIInput): Promise<AIResponse> {\n return provider.generate(input);\n },\n\n async chat(input: ChatInput): Promise<AIResponse> {\n return provider.chat(input);\n },\n\n stream(input: AIInput): AsyncIterable<AIStreamChunk> {\n return provider.stream(input);\n },\n\n async embed(input: EmbedInput): Promise<EmbedResponse> {\n return provider.embed(input);\n },\n\n getProvider(): AIProvider {\n return provider;\n }\n };\n}\n\n/**\n * Create a provider instance\n */\nfunction createProvider(config: AIPluginConfig): AIProvider {\n switch (config.provider) {\n case 'openai':\n return new OpenAIProvider({\n apiKey: config.apiKey!,\n baseUrl: config.baseUrl,\n defaultModel: config.defaultModel,\n retry: config.retry\n });\n\n case 'ollama':\n return new OllamaProvider({\n baseUrl: config.baseUrl,\n defaultModel: config.defaultModel,\n retry: config.retry\n });\n\n default:\n throw new Error(`Unsupported AI provider: ${config.provider}`);\n }\n}\n","/**\n * Velix AI Plugin v1\n * @module velix-plugin-ai\n */\n\nimport { createAIClient } from './client';\nimport type { AIPluginConfig, AIClient } from './types';\n\n// Export types\nexport * from './types';\nexport * from './utils';\nexport { OpenAIProvider } from './providers/openai';\nexport { OllamaProvider } from './providers/ollama';\nexport { createAIClient } from './client';\n\n/**\n * Velix AI Plugin\n * \n * @example\n * ```ts\n * import aiPlugin from 'velix/plugins/ai';\n * \n * export default defineConfig({\n * plugins: [\n * aiPlugin({\n * provider: 'openai',\n * apiKey: process.env.OPENAI_API_KEY\n * })\n * ]\n * });\n * ```\n */\nexport default function aiPlugin(config: AIPluginConfig) {\n return {\n name: 'velix-ai',\n \n setup(ctx: Record<string, unknown>) {\n // Create AI client\n const client = createAIClient(config);\n \n // Attach to context\n ctx.ai = client;\n \n // Make available globally for server actions\n if (typeof globalThis !== 'undefined') {\n (globalThis as unknown as { __VELIX_AI__: AIClient }).__VELIX_AI__ = client;\n }\n }\n };\n}\n\n/**\n * Get AI client in server actions\n */\nexport function useAI(): AIClient {\n if (typeof globalThis === 'undefined' || !(globalThis as unknown as { __VELIX_AI__?: AIClient }).__VELIX_AI__) {\n throw new Error('AI client not initialized. Make sure aiPlugin is configured.');\n }\n \n return (globalThis as unknown as { __VELIX_AI__: AIClient }).__VELIX_AI__;\n}\n\n/**\n * Create an AI-powered server action\n * \n * @example\n * ```ts\n * export const summarize = createAIAction({\n * input: { text: 'string' },\n * prompt: ({ text }) => `Summarize this text: ${text}`,\n * system: 'You are a helpful assistant that summarizes text concisely.'\n * });\n * ```\n */\nexport function createAIAction<TInput = unknown, TOutput = string>(config: {\n input: TInput;\n prompt: (input: TInput) => string;\n system?: string;\n model?: string;\n temperature?: number;\n transform?: (response: string) => TOutput;\n}) {\n return async (input: TInput): Promise<TOutput> => {\n const ai = useAI();\n \n const prompt = config.prompt(input);\n \n const response = await ai.generate({\n prompt,\n system: config.system,\n model: config.model,\n temperature: config.temperature\n });\n \n if (config.transform) {\n return config.transform(response.text);\n }\n \n return response.text as TOutput;\n };\n}\n","import { LRUCache } from 'lru-cache';\nimport type { ICacheAdapter, CacheSetOptions } from '../adapter.js';\n\ntype CacheEntry<T> = {\n value: T;\n tags: string[];\n expiresAt: number | null;\n}\n\nexport class MemoryCacheAdapter implements ICacheAdapter {\n private lru: LRUCache<string, CacheEntry<unknown>>;\n private tagIndex: Map<string, Set<string>> = new Map();\n\n constructor(options: { maxSize?: number } = {}) {\n this.lru = new LRUCache({\n max: options.maxSize ?? 500,\n dispose: (entry, key) => {\n if (entry && entry.tags) {\n entry.tags.forEach(tag => {\n const set = this.tagIndex.get(tag);\n if (set) {\n set.delete(key);\n if (set.size === 0) this.tagIndex.delete(tag);\n }\n });\n }\n },\n });\n }\n\n async get<T>(key: string): Promise<T | null> {\n const entry = this.lru.get(key) as CacheEntry<T> | undefined;\n if (!entry) return null;\n if (entry.expiresAt && Date.now() > entry.expiresAt) {\n this.lru.delete(key);\n return null;\n }\n return entry.value;\n }\n\n async set<T>(key: string, value: T, options: CacheSetOptions = {}): Promise<void> {\n const entry: CacheEntry<T> = {\n value,\n tags: options.tags ?? [],\n expiresAt: options.ttl ? Date.now() + options.ttl : null,\n };\n this.lru.set(key, entry as CacheEntry<unknown>);\n // Index par tag pour invalidation rapide\n options.tags?.forEach(tag => {\n if (!this.tagIndex.has(tag)) this.tagIndex.set(tag, new Set());\n this.tagIndex.get(tag)!.add(key);\n });\n }\n\n async delete(key: string): Promise<void> {\n this.lru.delete(key);\n }\n\n async deleteByTag(tag: string): Promise<void> {\n const keys = this.tagIndex.get(tag);\n if (!keys) return;\n keys.forEach(key => this.lru.delete(key));\n this.tagIndex.delete(tag);\n }\n\n async deleteByPrefix(prefix: string): Promise<void> {\n for (const key of this.lru.keys()) {\n if (key.startsWith(prefix)) this.lru.delete(key);\n }\n }\n\n async clear(): Promise<void> {\n this.lru.clear();\n this.tagIndex.clear();\n }\n\n async has(key: string): Promise<boolean> {\n return this.lru.has(key);\n }\n}\n","export class RequestDeduplicator {\n private inFlight: Map<string, Promise<unknown>> = new Map();\n\n async dedupe<T>(key: string, fn: () => Promise<T>): Promise<T> {\n if (this.inFlight.has(key)) {\n return this.inFlight.get(key) as Promise<T>;\n }\n\n const promise = fn().finally(() => {\n this.inFlight.delete(key);\n });\n\n this.inFlight.set(key, promise);\n return promise;\n }\n}\n","import type { ICacheAdapter, CacheSetOptions } from './adapter.js';\nimport { MemoryCacheAdapter } from './adapters/memory.adapter.js';\nimport { RequestDeduplicator } from './deduplicator.js';\n\nexport type RevalidationType = 'path' | 'tag' | 'layout';\n\nexport class VelixCache {\n private adapter: ICacheAdapter;\n private deduplicator: RequestDeduplicator;\n\n constructor(adapter: ICacheAdapter = new MemoryCacheAdapter()) {\n this.adapter = adapter;\n this.deduplicator = new RequestDeduplicator();\n }\n\n async get<T = unknown>(key: string): Promise<T | null> {\n return await this.adapter.get<T>(key);\n }\n\n async set<T = unknown>(key: string, value: T, options?: CacheSetOptions): Promise<void> {\n await this.adapter.set(key, value, options);\n }\n\n async has(key: string): Promise<boolean> {\n return await this.adapter.has(key);\n }\n\n async delete(key: string): Promise<void> {\n await this.adapter.delete(key);\n }\n\n async clear(): Promise<void> {\n await this.adapter.clear();\n }\n\n async revalidatePath(path: string): Promise<void> {\n await this.adapter.deleteByPrefix(`route:${path}`);\n }\n\n async revalidateTag(tag: string): Promise<void> {\n await this.adapter.deleteByTag(tag);\n }\n\n // unstable_cache — avec déduplication\n unstable_cache<T>(\n fn: () => Promise<T>,\n keys: string[],\n options?: { tags?: string[]; revalidate?: number }\n ): () => Promise<T> {\n const key = keys.join(':');\n return async () => {\n const cached = await this.adapter.get<T>(key);\n if (cached !== null) return cached;\n\n const value = await this.deduplicator.dedupe(key, fn);\n await this.adapter.set(key, value, {\n ttl: options?.revalidate ? options.revalidate * 1000 : undefined,\n tags: options?.tags,\n });\n return value;\n };\n }\n}\n\n// ── Singleton instance for the framework ──\n\nexport const cacheManager = new VelixCache();\n\n/**\n * Revalidate a specific path\n */\nexport async function revalidatePath(path: string, _type: RevalidationType = 'path'): Promise<void> {\n await cacheManager.revalidatePath(path);\n\n // Notify connected clients via HMR\n if (typeof global !== 'undefined' && (global as any).__VELIX_HMR_SERVER__) {\n (global as any).__VELIX_HMR_SERVER__.broadcast(JSON.stringify({\n type: 'revalidate',\n path,\n revalidationType: _type,\n }));\n }\n}\n\n/**\n * Revalidate all paths with a specific cache tag\n */\nexport async function revalidateTag(tag: string): Promise<void> {\n await cacheManager.revalidateTag(tag);\n\n // Notify connected clients\n if (typeof global !== 'undefined' && (global as any).__VELIX_HMR_SERVER__) {\n (global as any).__VELIX_HMR_SERVER__.broadcast(JSON.stringify({\n type: 'revalidate',\n tag,\n }));\n }\n}\n\n/**\n * Unstable cache wrapper (experimental)\n */\nexport function unstable_cache<T>(\n fn: () => Promise<T>,\n keys: string[],\n options?: { tags?: string[]; revalidate?: number }\n): () => Promise<T> {\n return cacheManager.unstable_cache(fn, keys, options);\n}\n","import crypto from 'crypto';\n\nexport class VelixHttpError extends Error {\n public status: number;\n public digest?: string;\n\n constructor(status: number, message: string) {\n super(message);\n this.name = this.constructor.name;\n this.status = status;\n \n // Generate actual cryptographic hash\n const hash = crypto.createHash('sha256');\n hash.update(`${Date.now()}-${message}-${status}-${Math.random()}`);\n this.digest = hash.digest('hex').substring(0, 16);\n }\n\n toClientError(isDev: boolean) {\n return {\n message: this.message,\n status: this.status,\n digest: this.digest,\n stack: isDev ? this.stack : undefined,\n };\n }\n}\n\nexport class NotFoundError extends VelixHttpError {\n constructor(message: string = 'Not Found') {\n super(404, message);\n }\n}\n\nexport class ForbiddenError extends VelixHttpError {\n constructor(message: string = 'Forbidden') {\n super(403, message);\n }\n}\n\nexport class UnauthorizedError extends VelixHttpError {\n constructor(message: string = 'Unauthorized') {\n super(401, message);\n }\n}\n","export type HttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'HEAD' | 'OPTIONS';\n\nexport type RouteContext = {\n params: Record<string, string>;\n searchParams: URLSearchParams;\n};\n\nexport type RouteHandler = (\n req: Request,\n ctx: RouteContext\n) => Response | Promise<Response>;\n\nimport { VelixHttpError } from '../server/errors.js';\nexport { VelixHttpError };\n\nexport function defineRoute(handler: RouteHandler): RouteHandler {\n return async (req, ctx) => {\n try {\n return await handler(req, ctx);\n } catch (err) {\n if (err instanceof VelixHttpError) {\n return Response.json({ error: err.message }, { status: err.status });\n }\n console.error('[Velix API]', err);\n return Response.json({ error: 'Internal Server Error' }, { status: 500 });\n }\n };\n}\n","import { glob } from 'glob';\nimport path from 'path';\nimport { pathToFileURL } from 'url';\nimport type { HttpMethod } from './define-route.js';\n\nexport type ApiRoute = {\n pattern: string; // ex: /api/users/:id\n filePath: string; // chemin absolu vers le fichier\n params: string[]; // noms des paramètres dynamiques\n isCatchAll: boolean;\n};\n\nexport async function buildApiManifest(serverDir: string): Promise<ApiRoute[]> {\n const files = await glob('api/**/*.ts', { cwd: serverDir, absolute: true });\n return files.map(file => filePathToRoute(file, serverDir));\n}\n\n/** Exported for testing */\nexport function filePathToRoute(filePath: string, serverDir: string): ApiRoute {\n const relative = path.relative(path.join(serverDir, 'api'), filePath);\n // Ensure we replace Windows backslashes with forward slashes for the pattern\n const normalizedRelative = relative.replace(/\\\\/g, '/');\n const withoutExt = normalizedRelative.replace(/\\.ts$/, '');\n \n // users.[id] → /api/users/:id\n // auth/[...slug] → /api/auth/*\n const params: string[] = [];\n let isCatchAll = false;\n\n const pattern = '/api/' + withoutExt\n .replace(/\\[\\.\\.\\.(\\w+)\\]/g, (_, name) => { isCatchAll = true; params.push(name); return '*'; })\n .replace(/\\[(\\w+)\\]/g, (_, name) => { params.push(name); return `:${name}`; })\n .replace(/\\.\\[/g, '/[') // users.[id] → users/[id]\n .replace(/\\./g, '/'); // nested avec dots → slashes\n\n return { pattern, filePath, params, isCatchAll };\n}\n\nfunction matchPattern(pathname: string, route: ApiRoute): { params: Record<string, string> } | null {\n if (route.isCatchAll) {\n const base = route.pattern.replace('/*', '');\n if (pathname.startsWith(base)) {\n const rest = pathname.slice(base.length);\n const params: Record<string, string> = {};\n if (route.params[0]) {\n params[route.params[0]] = rest.startsWith('/') ? rest.slice(1) : rest;\n }\n return { params };\n }\n return null;\n }\n\n const pathParts = pathname.split('/').filter(Boolean);\n const patternParts = route.pattern.split('/').filter(Boolean);\n\n if (pathParts.length !== patternParts.length) return null;\n\n const params: Record<string, string> = {};\n\n for (let i = 0; i < patternParts.length; i++) {\n const part = patternParts[i];\n if (part.startsWith(':')) {\n params[part.slice(1)] = pathParts[i];\n } else if (part !== pathParts[i]) {\n return null;\n }\n }\n\n return { params };\n}\n\nexport async function handleApiRequest(\n req: Request,\n manifest: ApiRoute[]\n): Promise<Response | null> {\n const url = new URL(req.url);\n const pathname = url.pathname;\n\n for (const route of manifest) {\n const match = matchPattern(pathname, route);\n if (!match) continue;\n\n const fileUrl = pathToFileURL(route.filePath).href;\n const handlers = await import(`${fileUrl}?t=${Date.now()}`);\n const method = req.method.toUpperCase() as HttpMethod;\n const handler = handlers[method] || handlers.default;\n\n if (!handler) {\n return Response.json({ error: 'Method Not Allowed' }, { status: 405 });\n }\n\n return handler(req, {\n params: match.params,\n searchParams: url.searchParams,\n });\n }\n\n return null; // pas de route API → fallback SSR\n}\n","import { cacheManager } from '../cache/index.js';\n\nexport type LoaderContext = {\n params: Record<string, string>;\n searchParams: URLSearchParams;\n req: Request;\n};\n\nexport type LoaderOptions = {\n tags?: string[];\n maxAge?: number;\n revalidate?: number;\n noStore?: boolean;\n};\n\nexport type LoaderResult<T> = {\n data: T;\n headers?: Record<string, string>;\n cache?: { maxAge?: number; tags?: string[] } | 'no-store';\n};\n\nexport function defineLoader<T>(\n fn: (ctx: LoaderContext) => Promise<T | LoaderResult<T>>,\n options?: LoaderOptions\n): (ctx: LoaderContext) => Promise<LoaderResult<T>> {\n return async (ctx) => {\n const url = new URL(ctx.req.url || 'http://localhost');\n const cacheKey = `loader:${url.pathname}:${url.searchParams.toString()}`;\n\n const maxAge = options?.maxAge ?? options?.revalidate;\n const isNoStore = options?.noStore === true;\n\n if (!isNoStore && maxAge && maxAge > 0) {\n const cached = await cacheManager.get<LoaderResult<T>>(cacheKey);\n if (cached !== null) {\n return cached;\n }\n }\n\n const rawResult = await fn(ctx);\n const result: LoaderResult<T> = (\n rawResult && typeof rawResult === 'object' && 'data' in rawResult\n ? (rawResult as LoaderResult<T>)\n : { data: rawResult as T }\n );\n\n const effectiveMaxAge = maxAge ?? (typeof result.cache === 'object' ? result.cache.maxAge : undefined);\n const tags = options?.tags ?? (typeof result.cache === 'object' ? result.cache.tags : undefined);\n\n if (!isNoStore && result.cache !== 'no-store' && effectiveMaxAge && effectiveMaxAge > 0) {\n await cacheManager.set(cacheKey, result, {\n ttl: effectiveMaxAge * 1000,\n tags,\n });\n }\n\n return result;\n };\n}\n","import { z } from 'zod';\n\nexport type ActionContext = {\n req: Request;\n headers: Headers;\n};\n\nexport type ActionOptions<TInput extends z.ZodTypeAny, TOutput> = {\n input: TInput;\n handler: (ctx: { input: z.infer<TInput>; ctx: ActionContext }) => Promise<TOutput>;\n};\n\nexport type ActionResult<T> =\n | { success: true; data: T }\n | { success: false; error: string; fieldErrors?: Record<string, string[]> };\n\nexport function serverAction<TInput extends z.ZodTypeAny, TOutput>(\n options: ActionOptions<TInput, TOutput>\n) {\n return async (rawInput: unknown, ctx: ActionContext): Promise<ActionResult<TOutput>> => {\n const parsed = options.input.safeParse(rawInput);\n if (!parsed.success) {\n return {\n success: false,\n error: 'Validation failed',\n fieldErrors: parsed.error.flatten().fieldErrors as Record<string, string[]>,\n };\n }\n try {\n const data = await options.handler({ input: parsed.data, ctx });\n return { success: true, data };\n } catch (err) {\n return { success: false, error: err instanceof Error ? err.message : 'Unknown error' };\n }\n };\n}\n","import { WebSocketServer, WebSocket } from 'ws';\nimport chokidar from 'chokidar';\nimport type { Server as HttpServer } from 'http';\nimport type { HMRPubSubBackplane } from './hmr-pubsub.js';\n\nexport type HMREvent =\n | { type: 'file-changed'; file: string; timestamp: number }\n | { type: 'file-added'; file: string; timestamp: number }\n | { type: 'compile-start'; timestamp: number }\n | { type: 'compile-done'; duration: number; timestamp: number }\n | { type: 'compile-error'; message: string; file?: string; line?: number; col?: number; timestamp: number }\n | { type: 'full-reload'; timestamp: number };\n\nexport interface HMRServerOptions {\n /**\n * Backplane Redis Pub/Sub pour la synchronisation HMR multi-instances.\n * Optionnel — si absent, le HMR est local à cette instance uniquement.\n */\n pubsub?: HMRPubSubBackplane;\n}\n\nexport function createHMRServer(\n httpServer: HttpServer,\n projectRoot: string,\n options?: HMRServerOptions\n) {\n const wss = new WebSocketServer({ server: httpServer, path: '/__velix_hmr' });\n const clients = new Set<WebSocket>();\n\n wss.on('connection', (ws) => {\n clients.add(ws);\n ws.send(JSON.stringify({ type: 'connected' }));\n ws.on('close', () => clients.delete(ws));\n });\n\n const watcher = chokidar.watch(projectRoot, {\n ignored: /node_modules|\\.velix|dist|\\.git/,\n persistent: true,\n ignoreInitial: true,\n });\n\n /**\n * Broadcast local : envoie l'event aux clients WebSocket de cette instance.\n */\n function broadcastLocal(event: HMREvent) {\n const msg = JSON.stringify(event);\n clients.forEach(ws => {\n if (ws.readyState === ws.OPEN) ws.send(msg);\n });\n }\n\n /**\n * Broadcast complet :\n * 1. Notifie les clients locaux (WebSocket de cette instance)\n * 2. Publie sur le backplane Redis si configuré (pour les autres pods)\n */\n function broadcast(event: HMREvent) {\n broadcastLocal(event);\n // Cross-instance via Redis Pub/Sub si configuré\n options?.pubsub?.publish(event);\n }\n\n // Écouter les events des autres instances via le backplane\n options?.pubsub?.onEvent(event => {\n // Uniquement rebroadcast local — ne pas re-publier sur Redis (évite les boucles)\n broadcastLocal(event);\n });\n\n watcher.on('change', (file) => {\n broadcast({ type: 'file-changed', file, timestamp: Date.now() });\n });\n watcher.on('add', (file) => {\n broadcast({ type: 'file-added', file, timestamp: Date.now() });\n });\n\n return { broadcast, broadcastLocal, watcher, wss, clients };\n}\n","import path from 'path';\nimport fs from 'fs';\nimport { NotFoundError, VelixHttpError } from './errors.js';\n\nexport type ErrorBoundaryType = 'error' | 'not-found';\n\nexport interface ResolvedBoundary {\n filePath: string;\n type: ErrorBoundaryType;\n scope: string;\n}\n\nexport function getErrorBoundaryType(error: unknown): ErrorBoundaryType {\n if (error instanceof NotFoundError) return 'not-found';\n if (error instanceof VelixHttpError && error.status === 404) return 'not-found';\n return 'error';\n}\n\nexport function resolveErrorBoundary(routeFilePath: string, appDir: string, type: ErrorBoundaryType): ResolvedBoundary | null {\n let currentDir = path.dirname(routeFilePath);\n \n // Ensure we don't go outside appDir\n while (currentDir.length >= appDir.length && currentDir.startsWith(appDir)) {\n const boundaryPath = path.join(currentDir, `${type}.tsx`);\n if (fs.existsSync(boundaryPath)) {\n const scope = currentDir === appDir ? 'root' : path.basename(currentDir);\n return {\n filePath: boundaryPath,\n type,\n scope\n };\n }\n \n const parentDir = path.dirname(currentDir);\n if (parentDir === currentDir) break;\n currentDir = parentDir;\n }\n \n return null;\n}\n","import type { ErrorComponent, NotFoundComponent } from '../types.js';\n\nexport function defineError(component: ErrorComponent): ErrorComponent {\n return component;\n}\n\nexport function defineNotFound(component: NotFoundComponent): NotFoundComponent {\n return component;\n}\n"]}
package/package.json CHANGED
@@ -1,12 +1,13 @@
1
1
  {
2
2
  "name": "@teamvelix/velix-core",
3
- "version": "5.3.5",
3
+ "version": "5.3.6",
4
4
  "description": "Core routing, caching, and agnostic logic for Velix",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
7
7
  "type": "module",
8
8
  "exports": {
9
- ".": "./dist/index.js"
9
+ ".": "./dist/index.js",
10
+ "./cache": "./dist/cache/index.js"
10
11
  },
11
12
  "files": [
12
13
  "dist",