@teamvelix/velix 5.2.5 → 5.2.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/build/index.js +3 -3
- package/dist/chunk-BQ4HFLRL.js +16 -0
- package/dist/chunk-BQ4HFLRL.js.map +1 -0
- package/dist/{chunk-HGP4TUJS.js → chunk-MAAAP4QR.js} +358 -549
- package/dist/chunk-MAAAP4QR.js.map +1 -0
- package/dist/{chunk-MLLSS7Y5.js → chunk-SNWXKPXR.js} +143 -8
- package/dist/chunk-SNWXKPXR.js.map +1 -0
- package/dist/{chunk-3LWUS6AC.js → chunk-VK4EZACN.js} +7 -3
- package/dist/chunk-VK4EZACN.js.map +1 -0
- package/dist/client/index.js +1 -1
- package/dist/config.d.ts +2 -2
- package/dist/config.js +1 -1
- package/dist/{image-optimizer-KPRXE5VI.js → image-optimizer-QDXS3LHQ.js} +3 -3
- package/dist/{image-optimizer-KPRXE5VI.js.map → image-optimizer-QDXS3LHQ.js.map} +1 -1
- package/dist/index.js +4 -4
- package/dist/islands/index.js +1 -1
- package/dist/runtime/start-build.js +164 -21
- package/dist/runtime/start-build.js.map +1 -1
- package/dist/runtime/start-dev.js +311 -360
- package/dist/runtime/start-dev.js.map +1 -1
- package/dist/runtime/start-prod.js +311 -360
- package/dist/runtime/start-prod.js.map +1 -1
- package/dist/server/index.js +3 -3
- package/package.json +3 -3
- package/dist/chunk-3LWUS6AC.js.map +0 -1
- package/dist/chunk-4S5YQJHB.js +0 -11
- package/dist/chunk-4S5YQJHB.js.map +0 -1
- package/dist/chunk-HGP4TUJS.js.map +0 -1
- package/dist/chunk-MLLSS7Y5.js.map +0 -1
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import fs from 'fs';
|
|
2
2
|
import path2 from 'path';
|
|
3
3
|
import crypto from 'crypto';
|
|
4
|
+
import { pathToFileURL } from 'url';
|
|
4
5
|
|
|
5
6
|
// utils.ts
|
|
6
7
|
function generateHash(content) {
|
|
@@ -289,9 +290,143 @@ function buildTree(routes) {
|
|
|
289
290
|
}
|
|
290
291
|
return tree;
|
|
291
292
|
}
|
|
293
|
+
var PluginHooks = {
|
|
294
|
+
CONFIG: "config",
|
|
295
|
+
SERVER_START: "server:start",
|
|
296
|
+
REQUEST: "request",
|
|
297
|
+
RESPONSE: "response",
|
|
298
|
+
ROUTES_LOADED: "routes:loaded",
|
|
299
|
+
BEFORE_RENDER: "render:before",
|
|
300
|
+
AFTER_RENDER: "render:after",
|
|
301
|
+
BUILD_START: "build:start",
|
|
302
|
+
BUILD_END: "build:end"
|
|
303
|
+
};
|
|
304
|
+
var PluginManager = class {
|
|
305
|
+
plugins = [];
|
|
306
|
+
hooks = /* @__PURE__ */ new Map();
|
|
307
|
+
/**
|
|
308
|
+
* Register a plugin
|
|
309
|
+
*/
|
|
310
|
+
register(plugin) {
|
|
311
|
+
this.plugins.push(plugin);
|
|
312
|
+
if (plugin.hooks) {
|
|
313
|
+
for (const [hookName, handler] of Object.entries(plugin.hooks)) {
|
|
314
|
+
if (handler) {
|
|
315
|
+
const existing = this.hooks.get(hookName) || [];
|
|
316
|
+
existing.push(handler);
|
|
317
|
+
this.hooks.set(hookName, existing);
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
/**
|
|
323
|
+
* Run a hook with arguments
|
|
324
|
+
*/
|
|
325
|
+
async runHook(hookName, ...args) {
|
|
326
|
+
const handlers = this.hooks.get(hookName) || [];
|
|
327
|
+
for (const handler of handlers) {
|
|
328
|
+
await handler(...args);
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
/**
|
|
332
|
+
* Run a waterfall hook — each handler transforms the first argument
|
|
333
|
+
*/
|
|
334
|
+
async runWaterfallHook(hookName, value, ...args) {
|
|
335
|
+
const handlers = this.hooks.get(hookName) || [];
|
|
336
|
+
let result = value;
|
|
337
|
+
for (const handler of handlers) {
|
|
338
|
+
const transformed = await handler(result, ...args);
|
|
339
|
+
if (transformed !== void 0) result = transformed;
|
|
340
|
+
}
|
|
341
|
+
return result;
|
|
342
|
+
}
|
|
343
|
+
/**
|
|
344
|
+
* Get all registered plugins
|
|
345
|
+
*/
|
|
346
|
+
getPlugins() {
|
|
347
|
+
return [...this.plugins];
|
|
348
|
+
}
|
|
349
|
+
/**
|
|
350
|
+
* Check if a plugin is registered
|
|
351
|
+
*/
|
|
352
|
+
hasPlugin(name) {
|
|
353
|
+
return this.plugins.some((p) => p.name === name);
|
|
354
|
+
}
|
|
355
|
+
};
|
|
356
|
+
var pluginManager = new PluginManager();
|
|
357
|
+
async function loadPlugins(projectRoot, config) {
|
|
358
|
+
const pluginEntries = config.plugins || [];
|
|
359
|
+
for (const entry of pluginEntries) {
|
|
360
|
+
try {
|
|
361
|
+
if (typeof entry === "string") {
|
|
362
|
+
const localPath = path2.join(projectRoot, "plugins", entry + ".ts");
|
|
363
|
+
const localPathJs = path2.join(projectRoot, "plugins", entry + ".js");
|
|
364
|
+
const localPathDir = path2.join(projectRoot, "plugins", entry, "index.ts");
|
|
365
|
+
let pluginPath = null;
|
|
366
|
+
if (fs.existsSync(localPath)) pluginPath = localPath;
|
|
367
|
+
else if (fs.existsSync(localPathJs)) pluginPath = localPathJs;
|
|
368
|
+
else if (fs.existsSync(localPathDir)) pluginPath = localPathDir;
|
|
369
|
+
if (pluginPath) {
|
|
370
|
+
const url = pathToFileURL(pluginPath).href;
|
|
371
|
+
const mod = await import(`${url}?t=${Date.now()}`);
|
|
372
|
+
const plugin = mod.default || mod;
|
|
373
|
+
if (plugin.name) {
|
|
374
|
+
pluginManager.register(plugin);
|
|
375
|
+
}
|
|
376
|
+
} else {
|
|
377
|
+
try {
|
|
378
|
+
const mod = await import(entry);
|
|
379
|
+
const plugin = mod.default || mod;
|
|
380
|
+
if (plugin.name) pluginManager.register(plugin);
|
|
381
|
+
} catch {
|
|
382
|
+
console.warn(`\u26A0 Plugin not found: ${entry}`);
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
} else if (typeof entry === "object" && entry !== null && "name" in entry) {
|
|
386
|
+
pluginManager.register(entry);
|
|
387
|
+
}
|
|
388
|
+
} catch (err) {
|
|
389
|
+
const error = err;
|
|
390
|
+
console.warn(`\u26A0 Failed to load plugin: ${error?.message || String(error)}`);
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
function definePlugin(definition) {
|
|
395
|
+
return definition;
|
|
396
|
+
}
|
|
397
|
+
({
|
|
398
|
+
/**
|
|
399
|
+
* Security headers plugin
|
|
400
|
+
*/
|
|
401
|
+
security: definePlugin({
|
|
402
|
+
name: "velix:security",
|
|
403
|
+
hooks: {
|
|
404
|
+
[PluginHooks.RESPONSE]: (_req, res) => {
|
|
405
|
+
const response = res;
|
|
406
|
+
if (!response.headersSent) {
|
|
407
|
+
response.setHeader("X-Content-Type-Options", "nosniff");
|
|
408
|
+
response.setHeader("X-Frame-Options", "DENY");
|
|
409
|
+
response.setHeader("X-XSS-Protection", "1; mode=block");
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
}),
|
|
414
|
+
/**
|
|
415
|
+
* Request logging plugin
|
|
416
|
+
*/
|
|
417
|
+
logger: definePlugin({
|
|
418
|
+
name: "velix:logger",
|
|
419
|
+
hooks: {
|
|
420
|
+
[PluginHooks.RESPONSE]: (req, _res, duration) => {
|
|
421
|
+
const request = req;
|
|
422
|
+
console.log(` ${request.method} ${request.url} ${duration}ms`);
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
})
|
|
426
|
+
});
|
|
292
427
|
|
|
293
428
|
// version.ts
|
|
294
|
-
var VERSION = "5.2.
|
|
429
|
+
var VERSION = "5.2.7";
|
|
295
430
|
|
|
296
431
|
// logger.ts
|
|
297
432
|
var colors = {
|
|
@@ -339,14 +474,14 @@ var logger = {
|
|
|
339
474
|
if (pagesDir) console.log(` ${c.bold}App:${c.reset} ${c.dim}${pagesDir}${c.reset}`);
|
|
340
475
|
console.log("");
|
|
341
476
|
},
|
|
342
|
-
request(method,
|
|
477
|
+
request(method, path4, status, time, extra = {}) {
|
|
343
478
|
const statusColor = getStatusColor(status);
|
|
344
479
|
const timeStr = fmtTime(time);
|
|
345
480
|
let badge = `${c.dim}\u25CB${c.reset}`;
|
|
346
481
|
if (extra.type === "dynamic" || extra.type === "ssr") badge = `${c.white}\u0192${c.reset}`;
|
|
347
482
|
else if (extra.type === "api") badge = `${c.cyan}\u03BB${c.reset}`;
|
|
348
483
|
const statusStr = `${statusColor}${status}${c.reset}`;
|
|
349
|
-
console.log(` ${badge} ${c.white}${method}${c.reset} ${
|
|
484
|
+
console.log(` ${badge} ${c.white}${method}${c.reset} ${path4} ${statusStr} ${c.dim}${timeStr}${c.reset}`);
|
|
350
485
|
},
|
|
351
486
|
info(msg) {
|
|
352
487
|
console.log(` ${c.cyan}\u2139${c.reset} ${msg}`);
|
|
@@ -374,10 +509,10 @@ var logger = {
|
|
|
374
509
|
plugin(name) {
|
|
375
510
|
console.log(` ${c.cyan}\u25C6${c.reset} Plugin ${c.dim}${name}${c.reset}`);
|
|
376
511
|
},
|
|
377
|
-
route(
|
|
512
|
+
route(path4, type) {
|
|
378
513
|
const typeLabel = type === "api" ? "\u03BB" : type === "dynamic" ? "\u0192" : "\u25CB";
|
|
379
514
|
const color = type === "api" ? c.cyan : type === "dynamic" ? c.white : c.dim;
|
|
380
|
-
console.log(` ${color}${typeLabel}${c.reset} ${
|
|
515
|
+
console.log(` ${color}${typeLabel}${c.reset} ${path4}`);
|
|
381
516
|
},
|
|
382
517
|
divider() {
|
|
383
518
|
console.log(`${c.dim} \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500${c.reset}`);
|
|
@@ -403,6 +538,6 @@ var logger = {
|
|
|
403
538
|
};
|
|
404
539
|
var logger_default = logger;
|
|
405
540
|
|
|
406
|
-
export { VERSION, buildRouteTree, cleanDir, copyDir, debounce, ensureDir, escapeHtml, findFiles, findRouteLayouts, formatBytes, formatTime, generateHash, isClientComponent, isIsland, isServerComponent, logger, logger_default, matchRoute, sleep };
|
|
407
|
-
//# sourceMappingURL=chunk-
|
|
408
|
-
//# sourceMappingURL=chunk-
|
|
541
|
+
export { PluginHooks, PluginManager, VERSION, buildRouteTree, cleanDir, copyDir, debounce, definePlugin, ensureDir, escapeHtml, findFiles, findRouteLayouts, formatBytes, formatTime, generateHash, isClientComponent, isIsland, isServerComponent, loadPlugins, logger, logger_default, matchRoute, pluginManager, sleep };
|
|
542
|
+
//# sourceMappingURL=chunk-SNWXKPXR.js.map
|
|
543
|
+
//# sourceMappingURL=chunk-SNWXKPXR.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../utils.ts","../router/index.ts","../plugins/index.ts","../version.ts","../logger.ts"],"names":["path","fs"],"mappings":"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","file":"chunk-SNWXKPXR.js","sourcesContent":["/**\n * Velix v5 Utility Functions\n */\n\nimport fs from 'fs';\nimport path from 'path';\nimport crypto from 'crypto';\n\n/**\n * Generates a unique hash for cache busting\n */\nexport function generateHash(content: string): string {\n return crypto.createHash('md5').update(content).digest('hex').slice(0, 8);\n}\n\n/**\n * Escapes HTML special characters\n */\nexport function escapeHtml(str: string): string {\n const htmlEntities: Record<string, string> = {\n '&': '&', '<': '<', '>': '>',\n '\"': '"', \"'\": '''\n };\n return String(str).replace(/[&<>\"']/g, char => htmlEntities[char]);\n}\n\n/**\n * Recursively finds all files matching a pattern\n */\nexport function findFiles(dir: string, pattern: RegExp, files: string[] = []): string[] {\n if (!fs.existsSync(dir)) return files;\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n if (entry.isDirectory()) findFiles(fullPath, pattern, files);\n else if (pattern.test(entry.name)) files.push(fullPath);\n }\n return files;\n}\n\n/**\n * Ensures a directory exists\n */\nexport function ensureDir(dir: string): void {\n if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });\n}\n\n/**\n * Cleans a directory\n */\nexport function cleanDir(dir: string): void {\n if (fs.existsSync(dir)) fs.rmSync(dir, { recursive: true, force: true });\n fs.mkdirSync(dir, { recursive: true });\n}\n\n/**\n * Copies a directory recursively\n */\nexport function copyDir(src: string, dest: string): void {\n ensureDir(dest);\n const entries = fs.readdirSync(src, { withFileTypes: true });\n for (const entry of entries) {\n const srcPath = path.join(src, entry.name);\n const destPath = path.join(dest, entry.name);\n if (entry.isDirectory()) copyDir(srcPath, destPath);\n else fs.copyFileSync(srcPath, destPath);\n }\n}\n\n/**\n * Debounce function for file watching\n */\nexport function debounce<T extends (...args: unknown[]) => unknown>(fn: T, delay: number): (...args: Parameters<T>) => void {\n let timeout: ReturnType<typeof setTimeout> | undefined;\n return (...args: Parameters<T>) => {\n clearTimeout(timeout);\n timeout = setTimeout(() => fn(...args), delay);\n };\n}\n\n/**\n * Formats bytes to human-readable string\n */\nexport function formatBytes(bytes: number): string {\n if (bytes === 0) return '0 B';\n const k = 1024;\n const sizes = ['B', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];\n}\n\n/**\n * Formats milliseconds to human-readable string\n */\nexport function formatTime(ms: number): string {\n if (ms < 1000) return `${ms}ms`;\n return `${(ms / 1000).toFixed(2)}s`;\n}\n\n/**\n * Creates a deferred promise\n */\nexport function createDeferred<T>() {\n let resolve: (value: T | PromiseLike<T>) => void;\n let reject: (reason?: unknown) => void;\n const promise = new Promise<T>((res, rej) => {\n resolve = res;\n reject = rej;\n });\n return { promise, resolve: resolve!, reject: reject! };\n}\n\n/**\n * Sleep utility\n */\nexport function sleep(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n}\n\n/**\n * Check if a file is a server component (has 'use server' directive)\n */\nexport function isServerComponent(filePath: string): boolean {\n try {\n const content = fs.readFileSync(filePath, 'utf-8');\n const firstLine = content.split('\\n')[0].trim();\n return firstLine === \"'use server'\" || firstLine === '\"use server\"';\n } catch { return false; }\n}\n\n/**\n * Check if a file is a client component (has 'use client' directive)\n */\nexport function isClientComponent(filePath: string): boolean {\n try {\n const content = fs.readFileSync(filePath, 'utf-8');\n const firstLine = content.split('\\n')[0].trim();\n return firstLine === \"'use client'\" || firstLine === '\"use client\"';\n } catch { return false; }\n}\n\n/**\n * Check if a component is an island (has 'use island' directive)\n */\nexport function isIsland(filePath: string): boolean {\n try {\n const content = fs.readFileSync(filePath, 'utf-8');\n const firstLine = content.split('\\n')[0].trim();\n return firstLine === \"'use island'\" || firstLine === '\"use island\"';\n } catch { return false; }\n}\n","/**\n * Velix v5 Router\n * File-based routing using the app/ directory convention\n *\n * Supports:\n * - app/page.tsx → /\n * - app/dashboard/page.tsx → /dashboard\n * - app/blog/[slug]/page.tsx → /blog/:slug\n * - app/(group)/page.tsx → / (route groups)\n * - app/[...slug]/page.tsx → catch-all routes\n * - layout.tsx, loading.tsx, error.tsx, not-found.tsx\n */\n\nimport fs from 'fs';\nimport path from 'path';\nimport { isServerComponent, isClientComponent, isIsland } from '../utils.js';\nimport type { Route, RouteTree as TypedRouteTree, RouteTreeNode } from '../types.js';\n\n// ============================================================================\n// Route Types\n// ============================================================================\n\nexport const RouteType = {\n PAGE: 'page',\n API: 'api',\n LAYOUT: 'layout',\n LOADING: 'loading',\n ERROR: 'error',\n NOT_FOUND: 'not-found'\n} as const;\n\n// ============================================================================\n// Build Route Tree\n// ============================================================================\n\n/**\n * Builds the complete route tree from the app/ directory\n */\nexport function buildRouteTree(appDir: string) {\n const projectRoot = path.dirname(appDir);\n\n const routes: {\n pages: Route[];\n api: Route[];\n layouts: Map<string, string>;\n tree: RouteTreeNode;\n appRoutes: Route[];\n rootLayout?: string;\n } = {\n pages: [],\n api: [],\n layouts: new Map(),\n tree: { children: {}, routes: [] },\n appRoutes: [],\n };\n\n // Scan app/ directory\n if (fs.existsSync(appDir)) {\n scanAppDirectory(appDir, appDir, routes);\n }\n\n // Scan server/api/ for API routes\n const serverApiDir = path.join(projectRoot, 'server', 'api');\n if (fs.existsSync(serverApiDir)) {\n scanApiDirectory(serverApiDir, serverApiDir, routes);\n }\n\n // Check for root layout\n const rootLayoutTsx = path.join(appDir, 'layout.tsx');\n const rootLayoutJsx = path.join(appDir, 'layout.jsx');\n if (fs.existsSync(rootLayoutTsx)) routes.rootLayout = rootLayoutTsx;\n else if (fs.existsSync(rootLayoutJsx)) routes.rootLayout = rootLayoutJsx;\n\n // Build route tree for nested routes\n routes.tree = buildTree(routes.appRoutes);\n\n return routes;\n}\n\n// ============================================================================\n// App Directory Scanner\n// ============================================================================\n\n/**\n * Scans app/ directory for file-based routing\n * Supports: page.tsx, layout.tsx, loading.tsx, error.tsx, not-found.tsx, [param].tsx\n */\nfunction scanAppDirectory(\n baseDir: string,\n currentDir: string,\n routes: { appRoutes: Route[] },\n parentSegments: string[] = [],\n parentLayout: string | null = null,\n parentMiddleware: string | null = null\n) {\n const entries = fs.readdirSync(currentDir, { withFileTypes: true });\n\n // Find special files in current directory\n const specialFiles: Record<string, string | null> = {\n page: null,\n layout: null,\n loading: null,\n error: null,\n notFound: null,\n template: null,\n middleware: null\n };\n\n for (const entry of entries) {\n if (entry.isFile()) {\n const name = entry.name.replace(/\\.(jsx|js|tsx|ts)$/, '');\n const fullPath = path.join(currentDir, entry.name);\n const ext = path.extname(entry.name);\n\n // Only process relevant extensions\n if (!['.tsx', '.jsx', '.ts', '.js'].includes(ext)) continue;\n\n if (name === 'page') specialFiles.page = fullPath;\n if (name === 'layout') specialFiles.layout = fullPath;\n if (name === 'loading') specialFiles.loading = fullPath;\n if (name === 'error') specialFiles.error = fullPath;\n if (name === 'not-found') specialFiles.notFound = fullPath;\n if (name === 'template') specialFiles.template = fullPath;\n if (name === 'middleware' || name === '_middleware') specialFiles.middleware = fullPath;\n\n // Handle [param].tsx files directly in app/ (alternative to [param]/page.tsx)\n if (name.startsWith('[') && name.endsWith(']') && ['.tsx', '.jsx'].includes(ext)) {\n const paramName = name.slice(1, -1);\n let segmentName: string;\n\n if (paramName.startsWith('...')) {\n segmentName = '*' + paramName.slice(3);\n } else {\n segmentName = ':' + paramName;\n }\n\n const routePath = '/' + [...parentSegments, segmentName].join('/');\n\n routes.appRoutes.push({\n type: RouteType.PAGE,\n path: routePath.replace(/\\/+/g, '/'),\n filePath: fullPath,\n pattern: createRoutePattern(routePath),\n segments: [...parentSegments, segmentName],\n layout: specialFiles.layout || parentLayout,\n loading: specialFiles.loading,\n error: specialFiles.error,\n notFound: specialFiles.notFound,\n template: specialFiles.template,\n middleware: specialFiles.middleware || parentMiddleware,\n isServerComponent: isServerComponent(fullPath),\n isClientComponent: isClientComponent(fullPath),\n isIsland: isIsland(fullPath),\n });\n }\n }\n }\n\n // If there's a page.tsx, create a route for this directory\n if (specialFiles.page) {\n const routePath = '/' + parentSegments.join('/') || '/';\n\n routes.appRoutes.push({\n type: RouteType.PAGE,\n path: routePath.replace(/\\/+/g, '/') || '/',\n filePath: specialFiles.page,\n pattern: createRoutePattern(routePath || '/'),\n segments: parentSegments,\n layout: specialFiles.layout || parentLayout,\n loading: specialFiles.loading,\n error: specialFiles.error,\n notFound: specialFiles.notFound,\n template: specialFiles.template,\n middleware: specialFiles.middleware || parentMiddleware,\n isServerComponent: isServerComponent(specialFiles.page),\n isClientComponent: isClientComponent(specialFiles.page),\n isIsland: isIsland(specialFiles.page),\n });\n }\n\n // Recursively scan subdirectories\n for (const entry of entries) {\n if (entry.isDirectory()) {\n const fullPath = path.join(currentDir, entry.name);\n\n // Skip special directories\n if (entry.name.startsWith('_') || entry.name.startsWith('.')) continue;\n\n // Handle route groups (parentheses) — don't add to URL\n const isGroup = entry.name.startsWith('(') && entry.name.endsWith(')');\n\n // Handle dynamic segments [param]\n let segmentName = entry.name;\n if (entry.name.startsWith('[') && entry.name.endsWith(']')) {\n segmentName = ':' + entry.name.slice(1, -1);\n if (entry.name.startsWith('[...')) {\n segmentName = '*' + entry.name.slice(4, -1);\n }\n if (entry.name.startsWith('[[...')) {\n segmentName = '*' + entry.name.slice(5, -2);\n }\n }\n\n const newSegments = isGroup ? parentSegments : [...parentSegments, segmentName];\n const newLayout = specialFiles.layout || parentLayout;\n const newMiddleware = specialFiles.middleware || parentMiddleware;\n\n scanAppDirectory(baseDir, fullPath, routes, newSegments, newLayout, newMiddleware);\n }\n }\n}\n\n// ============================================================================\n// API Directory Scanner (server/api/)\n// ============================================================================\n\nfunction scanApiDirectory(baseDir: string, currentDir: string, routes: { api: Route[] }, parentSegments: string[] = []) {\n const entries = fs.readdirSync(currentDir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = path.join(currentDir, entry.name);\n\n if (entry.isDirectory()) {\n scanApiDirectory(baseDir, fullPath, routes, [...parentSegments, entry.name]);\n } else if (entry.isFile()) {\n const ext = path.extname(entry.name);\n if (!['.ts', '.js'].includes(ext)) continue;\n\n const baseName = path.basename(entry.name, ext);\n // route.ts maps to the parent path, other names become segments\n const apiSegments = baseName === 'route' || baseName === 'index'\n ? parentSegments\n : [...parentSegments, baseName];\n\n const apiPath = '/api/' + apiSegments.join('/');\n\n routes.api.push({\n type: RouteType.API,\n path: apiPath.replace(/\\/+/g, '/') || '/api',\n filePath: fullPath,\n pattern: createRoutePattern(apiPath),\n segments: ['api', ...apiSegments].filter(Boolean),\n });\n }\n }\n}\n\n// ============================================================================\n// Route Matching\n// ============================================================================\n\n/**\n * Creates regex pattern for route matching\n */\nfunction createRoutePattern(routePath: string): RegExp {\n let pattern = routePath\n .replace(/\\*[^/]*/g, '(.*)') // Catch-all\n .replace(/:[^/]+/g, '([^/]+)') // Dynamic segments\n .replace(/\\//g, '\\\\/');\n\n return new RegExp(`^${pattern}$`);\n}\n\n/**\n * Matches URL path against routes\n */\nexport function matchRoute(urlPath: string, routes: Route[]) {\n const normalizedPath = urlPath === '' ? '/' : urlPath.split('?')[0];\n\n for (const route of routes) {\n const match = normalizedPath.match(route.pattern);\n if (match) {\n const params = extractParams(route.path, match);\n return { ...route, params };\n }\n }\n\n return null;\n}\n\n/**\n * Extracts parameters from route match\n */\nfunction extractParams(routePath: string, match: RegExpMatchArray): Record<string, string> {\n const params: Record<string, string> = {};\n const paramNames: string[] = [];\n\n const paramRegex = /:([^/]+)|\\*([^/]*)/g;\n let paramMatch;\n while ((paramMatch = paramRegex.exec(routePath)) !== null) {\n paramNames.push(paramMatch[1] || paramMatch[2] || 'splat');\n }\n\n paramNames.forEach((name, index) => {\n params[name] = match[index + 1];\n });\n\n return params;\n}\n\n// ============================================================================\n// Layout Resolution\n// ============================================================================\n\n/**\n * Finds all layouts that apply to a route\n */\nexport function findRouteLayouts(route: Route, layoutsMap: Map<string, string>): Array<{ name: string; filePath: string | undefined }> {\n const layouts: Array<{ name: string; filePath: string | undefined }> = [];\n\n // Check for segment-based layouts\n for (const segment of route.segments) {\n if (layoutsMap.has(segment)) {\n layouts.push({ name: segment, filePath: layoutsMap.get(segment) });\n }\n }\n\n // Check for route-specific layout\n if (route.layout) {\n layouts.push({ name: 'route', filePath: route.layout });\n }\n\n // Check for root layout\n if (layoutsMap.has('root')) {\n layouts.unshift({ name: 'root', filePath: layoutsMap.get('root') });\n }\n\n return layouts;\n}\n\n// ============================================================================\n// Tree Building\n// ============================================================================\n\nfunction buildTree(routes: Route[]): RouteTreeNode {\n const tree: RouteTreeNode = { children: {}, routes: [] };\n\n for (const route of routes) {\n let current = tree;\n for (const segment of route.segments) {\n if (!current.children[segment]) {\n current.children[segment] = { children: {}, routes: [] };\n }\n current = current.children[segment];\n }\n current.routes.push(route);\n }\n\n return tree;\n}\n\n// ============================================================================\n// Default Export\n// ============================================================================\n\nexport default {\n buildRouteTree,\n matchRoute,\n findRouteLayouts,\n RouteType\n};\n","/**\n * Velix v5 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","/**\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.2.7';\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"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { logger_default, cleanDir, buildRouteTree, findFiles, ensureDir, VERSION, formatBytes } from './chunk-
|
|
1
|
+
import { loadPlugins, pluginManager, PluginHooks, logger_default, cleanDir, buildRouteTree, findFiles, ensureDir, VERSION, formatBytes } from './chunk-SNWXKPXR.js';
|
|
2
2
|
import { loadConfig, resolvePaths } from './chunk-F24Q2MX3.js';
|
|
3
3
|
import esbuild from 'esbuild';
|
|
4
4
|
import fs from 'fs';
|
|
@@ -8,11 +8,14 @@ async function build(options = {}) {
|
|
|
8
8
|
const projectRoot = options.projectRoot || process.cwd();
|
|
9
9
|
const config = await loadConfig(projectRoot);
|
|
10
10
|
const resolved = resolvePaths(config, projectRoot);
|
|
11
|
+
await loadPlugins(projectRoot, config);
|
|
12
|
+
await pluginManager.runHook(PluginHooks.CONFIG, config);
|
|
11
13
|
const outDir = options.outDir || resolved.resolvedOutDir;
|
|
12
14
|
const startTime = Date.now();
|
|
13
15
|
logger_default.logo();
|
|
14
16
|
logger_default.info("Building for production...");
|
|
15
17
|
logger_default.blank();
|
|
18
|
+
await pluginManager.runHook(PluginHooks.BUILD_START);
|
|
16
19
|
cleanDir(outDir);
|
|
17
20
|
const appDir = resolved.resolvedAppDir;
|
|
18
21
|
const routes = buildRouteTree(appDir);
|
|
@@ -107,6 +110,7 @@ async function build(options = {}) {
|
|
|
107
110
|
logger_default.build({ time: elapsed });
|
|
108
111
|
logger_default.info(`Output: ${outDir} (${formatBytes(totalSize)})`);
|
|
109
112
|
logger_default.blank();
|
|
113
|
+
await pluginManager.runHook(PluginHooks.BUILD_END, { time: elapsed });
|
|
110
114
|
}
|
|
111
115
|
function copyDirRecursive(src, dest) {
|
|
112
116
|
ensureDir(dest);
|
|
@@ -132,5 +136,5 @@ function getDirSize(dir) {
|
|
|
132
136
|
var build_default = { build };
|
|
133
137
|
|
|
134
138
|
export { build, build_default };
|
|
135
|
-
//# sourceMappingURL=chunk-
|
|
136
|
-
//# sourceMappingURL=chunk-
|
|
139
|
+
//# sourceMappingURL=chunk-VK4EZACN.js.map
|
|
140
|
+
//# sourceMappingURL=chunk-VK4EZACN.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../build/index.ts"],"names":[],"mappings":"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","file":"chunk-VK4EZACN.js","sourcesContent":["/**\n * Velix v5 Build System\n * Production build using esbuild\n */\n\nimport esbuild from 'esbuild';\nimport fs from 'fs';\nimport path from 'path';\nimport { loadConfig, resolvePaths } from '../config.js';\nimport { buildRouteTree } from '../router/index.js';\nimport { ensureDir, cleanDir, findFiles, formatBytes, formatTime } from '../utils.js';\nimport logger from '../logger.js';\nimport { VERSION } from '../version.js';\nimport { pluginManager, loadPlugins, PluginHooks } from '../plugins/index.js';\n\nexport interface BuildOptions {\n projectRoot?: string;\n outDir?: string;\n minify?: boolean;\n sourcemap?: boolean;\n}\n\n/**\n * Build the Velix application for production\n */\nexport async function build(options: BuildOptions = {}) {\n const projectRoot = options.projectRoot || process.cwd();\n const config = await loadConfig(projectRoot);\n const resolved = resolvePaths(config, projectRoot);\n\n // Load plugins and run config hook\n await loadPlugins(projectRoot, config);\n await pluginManager.runHook(PluginHooks.CONFIG, config);\n\n const outDir = options.outDir || resolved.resolvedOutDir;\n const startTime = Date.now();\n\n logger.logo();\n logger.info('Building for production...');\n logger.blank();\n\n // Run build:start hook (e.g., Tailwind CSS build)\n await pluginManager.runHook(PluginHooks.BUILD_START);\n\n // Clean output directory\n cleanDir(outDir);\n\n const appDir = resolved.resolvedAppDir;\n const routes = buildRouteTree(appDir);\n\n // Collect all source files\n const sourceFiles = findFiles(appDir, /\\.(tsx?|jsx?)$/);\n\n if (sourceFiles.length === 0) {\n logger.warn('No source files found in app/ directory');\n return;\n }\n\n // Build server bundle\n try {\n const serverOutDir = path.join(outDir, 'server');\n ensureDir(serverOutDir);\n\n await esbuild.build({\n entryPoints: sourceFiles,\n outdir: serverOutDir,\n bundle: false,\n format: 'esm',\n platform: 'node',\n target: config.build.target,\n minify: options.minify ?? config.build.minify,\n sourcemap: options.sourcemap ?? config.build.sourcemap,\n jsx: 'automatic',\n logLevel: 'silent',\n treeShaking: true,\n legalComments: 'none',\n });\n\n logger.success('Server bundle built');\n } catch (err: any) {\n logger.error('Server build failed', err);\n process.exit(1);\n }\n\n // Build client bundle (client components and islands)\n try {\n const clientOutDir = path.join(outDir, 'client');\n ensureDir(clientOutDir);\n\n const clientFiles = sourceFiles.filter(f => {\n const content = fs.readFileSync(f, 'utf-8');\n const firstLine = content.split('\\n')[0]?.trim();\n return firstLine === \"'use client'\" || firstLine === '\"use client\"' ||\n firstLine === \"'use island'\" || firstLine === '\"use island\"';\n });\n\n if (clientFiles.length > 0) {\n await esbuild.build({\n entryPoints: clientFiles,\n outdir: clientOutDir,\n bundle: true,\n format: 'esm',\n platform: 'browser',\n target: ['es2022'],\n minify: options.minify ?? config.build.minify,\n sourcemap: options.sourcemap ?? config.build.sourcemap,\n splitting: config.build.splitting,\n jsx: 'automatic',\n logLevel: 'silent',\n external: ['react', 'react-dom'],\n treeShaking: true,\n legalComments: 'none',\n drop: options.minify ?? config.build.minify ? ['console', 'debugger'] : [],\n chunkNames: 'chunks/[name]-[hash]',\n });\n\n logger.success(`Client bundle built (${clientFiles.length} components)`);\n }\n } catch (err: any) {\n logger.error('Client build failed', err);\n process.exit(1);\n }\n\n // Copy public directory\n const publicDir = resolved.resolvedPublicDir;\n if (fs.existsSync(publicDir)) {\n const publicOutDir = path.join(outDir, 'public');\n ensureDir(publicOutDir);\n copyDirRecursive(publicDir, publicOutDir);\n logger.success('Static assets copied');\n }\n\n // Generate build manifest\n const manifest = {\n version: VERSION,\n buildTime: new Date().toISOString(),\n routes: routes.appRoutes.map(r => ({\n path: r.path,\n type: r.path.includes(':') ? 'dynamic' : 'static',\n })),\n api: routes.api.map(r => ({ path: r.path })),\n };\n\n fs.writeFileSync(path.join(outDir, 'manifest.json'), JSON.stringify(manifest, null, 2));\n\n const elapsed = Date.now() - startTime;\n const totalSize = getDirSize(outDir);\n\n logger.blank();\n logger.divider();\n logger.blank();\n\n // Log routes\n routes.appRoutes.forEach(r => {\n const type = r.path.includes(':') || r.path.includes('*') ? 'dynamic' : 'static';\n logger.route(r.path, type);\n });\n routes.api.forEach(r => logger.route(r.path, 'api'));\n\n logger.blank();\n logger.build({ time: elapsed });\n logger.info(`Output: ${outDir} (${formatBytes(totalSize)})`);\n logger.blank();\n\n // Run build:end hook\n await pluginManager.runHook(PluginHooks.BUILD_END, { time: elapsed });\n}\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\nfunction copyDirRecursive(src: string, dest: string) {\n ensureDir(dest);\n const entries = fs.readdirSync(src, { withFileTypes: true });\n for (const entry of entries) {\n const srcPath = path.join(src, entry.name);\n const destPath = path.join(dest, entry.name);\n if (entry.isDirectory()) copyDirRecursive(srcPath, destPath);\n else fs.copyFileSync(srcPath, destPath);\n }\n}\n\nfunction getDirSize(dir: string): number {\n let size = 0;\n if (!fs.existsSync(dir)) return size;\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n if (entry.isDirectory()) size += getDirSize(fullPath);\n else size += fs.statSync(fullPath).size;\n }\n return size;\n}\n\nexport default { build };\n"]}
|
package/dist/client/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
export { Link, client_default as default, hydrate, router, useAction, useParams, usePathname, useQuery, useRouter } from '../chunk-QLFG6PW3.js';
|
|
2
|
-
import '../chunk-
|
|
2
|
+
import '../chunk-BQ4HFLRL.js';
|
|
3
3
|
//# sourceMappingURL=index.js.map
|
|
4
4
|
//# sourceMappingURL=index.js.map
|
package/dist/config.d.ts
CHANGED
|
@@ -13,8 +13,8 @@ declare const VelixConfigSchema: z.ZodObject<{
|
|
|
13
13
|
name: string;
|
|
14
14
|
url?: string | undefined;
|
|
15
15
|
}, {
|
|
16
|
-
name?: string | undefined;
|
|
17
16
|
url?: string | undefined;
|
|
17
|
+
name?: string | undefined;
|
|
18
18
|
}>>;
|
|
19
19
|
devtools: z.ZodDefault<z.ZodBoolean>;
|
|
20
20
|
server: z.ZodDefault<z.ZodObject<{
|
|
@@ -125,8 +125,8 @@ declare const VelixConfigSchema: z.ZodObject<{
|
|
|
125
125
|
favicon: string | null;
|
|
126
126
|
}, {
|
|
127
127
|
app?: {
|
|
128
|
-
name?: string | undefined;
|
|
129
128
|
url?: string | undefined;
|
|
129
|
+
name?: string | undefined;
|
|
130
130
|
} | undefined;
|
|
131
131
|
devtools?: boolean | undefined;
|
|
132
132
|
server?: {
|
package/dist/config.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import './chunk-
|
|
1
|
+
import './chunk-BQ4HFLRL.js';
|
|
2
2
|
import fs from 'fs';
|
|
3
3
|
import path from 'path';
|
|
4
4
|
|
|
@@ -62,5 +62,5 @@ async function handleImageOptimization(req, res, projectRoot) {
|
|
|
62
62
|
}
|
|
63
63
|
|
|
64
64
|
export { handleImageOptimization };
|
|
65
|
-
//# sourceMappingURL=image-optimizer-
|
|
66
|
-
//# sourceMappingURL=image-optimizer-
|
|
65
|
+
//# sourceMappingURL=image-optimizer-QDXS3LHQ.js.map
|
|
66
|
+
//# sourceMappingURL=image-optimizer-QDXS3LHQ.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../server/image-optimizer.ts"],"names":[],"mappings":";;;;AAKA,eAAsB,uBAAA,CAAwB,GAAA,EAA2B,GAAA,EAA0B,WAAA,EAAqB;AAEtH,EAAA,IAAI,KAAA;AACJ,EAAA,IAAI;AAEF,IAAA,KAAA,GAAQ,MAAM,OAAO,OAAO,CAAA,CAAE,KAAK,CAAA,CAAA,KAAK,CAAA,CAAE,WAAW,CAAC,CAAA;AAAA,EACxD,SAAS,CAAA,EAAG;AAAA,EAEZ;AACA,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,GAAA,CAAI,GAAA,EAAM,UAAU,GAAA,CAAI,OAAA,CAAQ,IAAA,IAAQ,WAAW,CAAA,CAAE,CAAA;AACzE,IAAA,MAAM,QAAA,GAAW,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,KAAK,CAAA;AAC3C,IAAA,MAAM,QAAA,GAAW,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,GAAG,CAAA;AACzC,IAAA,MAAM,UAAA,GAAa,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,GAAG,CAAA;AAE3C,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,GAAA,CAAI,UAAU,GAAG,CAAA;AACjB,MAAA,GAAA,CAAI,IAAI,uBAAuB,CAAA;AAC/B,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,KAAA,GAAQ,QAAA,GAAW,QAAA,CAAS,QAAA,EAAU,EAAE,CAAA,GAAI,KAAA,CAAA;AAClD,IAAA,MAAM,OAAA,GAAU,UAAA,GAAa,QAAA,CAAS,UAAA,EAAY,EAAE,CAAA,GAAI,EAAA;AAGxD,IAAA,IAAI,WAAA,GAA6B,IAAA;AAEjC,IAAA,IAAI,QAAA,CAAS,UAAA,CAAW,MAAM,CAAA,EAAG;AAC/B,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,QAAQ,CAAA;AACrC,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI,MAAM,IAAI,KAAA,CAAM,CAAA,gBAAA,EAAmB,QAAQ,CAAA,CAAE,CAAA;AAC/D,MAAA,WAAA,GAAc,MAAA,CAAO,IAAA,CAAK,MAAM,QAAA,CAAS,aAAa,CAAA;AAAA,IACxD,CAAA,MAAO;AACL,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,IAAA,CAAK,WAAA,EAAa,QAAQ,CAAA;AAEjD,MAAA,MAAM,YAAA,GAAe,IAAA,CAAK,IAAA,CAAK,SAAA,EAAW,QAAA,CAAS,UAAA,CAAW,GAAG,CAAA,GAAI,QAAA,CAAS,KAAA,CAAM,CAAC,CAAA,GAAI,QAAQ,CAAA;AACjG,MAAA,IAAI,CAAC,aAAa,UAAA,CAAW,SAAS,KAAK,CAAC,EAAA,CAAG,UAAA,CAAW,YAAY,CAAA,EAAG;AACvE,QAAA,GAAA,CAAI,UAAU,GAAG,CAAA;AACjB,QAAA,GAAA,CAAI,IAAI,iBAAiB,CAAA;AACzB,QAAA;AAAA,MACF;AACA,MAAA,WAAA,GAAc,EAAA,CAAG,aAAa,YAAY,CAAA;AAAA,IAC5C;AAEA,IAAA,IAAI,CAAC,KAAA,EAAO;AAEV,MAAA,GAAA,CAAI,UAAU,GAAA,EAAK;AAAA,QACjB,cAAA,EAAgB,YAAA;AAAA,QAChB,eAAA,EAAiB;AAAA,OAClB,CAAA;AACD,MAAA,GAAA,CAAI,IAAI,WAAW,CAAA;AACnB,MAAA;AAAA,IACF;AAIA,IAAA,IAAI,SAAA,GAAiB,MAAM,WAAW,CAAA;AAEtC,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,SAAA,GAAY,SAAA,CAAU,OAAO,KAAK,CAAA;AAAA,IACpC;AAGA,IAAA,SAAA,GAAY,SAAA,CAAU,IAAA,CAAK,EAAE,OAAA,EAAS,CAAA;AAEtC,IAAA,MAAM,eAAA,GAAkB,MAAM,SAAA,CAAU,QAAA,EAAS;AAEjD,IAAA,GAAA,CAAI,UAAU,GAAA,EAAK;AAAA,MACjB,cAAA,EAAgB,YAAA;AAAA,MAChB,eAAA,EAAiB;AAAA,KAClB,CAAA;AACD,IAAA,GAAA,CAAI,IAAI,eAAe,CAAA;AAAA,EACzB,SAAS,KAAA,EAAgB;AACvB,IAAA,OAAA,CAAQ,KAAA,CAAM,6BAA6B,KAAK,CAAA;AAChD,IAAA,GAAA,CAAI,UAAU,GAAG,CAAA;AACjB,IAAA,GAAA,CAAI,IAAI,wBAAwB,CAAA;AAAA,EAClC;AACF","file":"image-optimizer-
|
|
1
|
+
{"version":3,"sources":["../server/image-optimizer.ts"],"names":[],"mappings":"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","file":"image-optimizer-QDXS3LHQ.js","sourcesContent":["import http from 'http';\nimport fs from 'fs';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\n\nexport async function handleImageOptimization(req: http.IncomingMessage, res: http.ServerResponse, projectRoot: string) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let sharp: ((input: Buffer) => Record<string, unknown>) | undefined;\n try {\n // @ts-ignore: sharp is an optional dependency\n sharp = await import('sharp').then(m => m.default || m);\n } catch (e) {\n // sharp is optional\n }\n try {\n const url = new URL(req.url!, `http://${req.headers.host || 'localhost'}`);\n const imageUrl = url.searchParams.get('url');\n const widthStr = url.searchParams.get('w');\n const qualityStr = url.searchParams.get('q');\n\n if (!imageUrl) {\n res.writeHead(400);\n res.end('Missing url parameter');\n return;\n }\n\n const width = widthStr ? parseInt(widthStr, 10) : undefined;\n const quality = qualityStr ? parseInt(qualityStr, 10) : 75;\n\n // Resolve image path (assuming it's a local public asset if it doesn't start with http)\n let imageBuffer: Buffer | null = null;\n\n if (imageUrl.startsWith('http')) {\n const response = await fetch(imageUrl);\n if (!response.ok) throw new Error(`Failed to fetch ${imageUrl}`);\n imageBuffer = Buffer.from(await response.arrayBuffer());\n } else {\n const publicDir = path.join(projectRoot, 'public');\n // Prevent directory traversal\n const resolvedPath = path.join(publicDir, imageUrl.startsWith('/') ? imageUrl.slice(1) : imageUrl);\n if (!resolvedPath.startsWith(publicDir) || !fs.existsSync(resolvedPath)) {\n res.writeHead(404);\n res.end('Image not found');\n return;\n }\n imageBuffer = fs.readFileSync(resolvedPath);\n }\n\n if (!sharp) {\n // Fallback: just return the original image if sharp is not installed\n res.writeHead(200, {\n 'Content-Type': 'image/jpeg',\n 'Cache-Control': 'public, max-age=31536000, immutable'\n });\n res.end(imageBuffer);\n return;\n }\n\n // Process with sharp — typed minimally since it's an optional dependency\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let processor: any = sharp(imageBuffer);\n \n if (width) {\n processor = processor.resize(width);\n }\n\n // Default to webp for optimized delivery\n processor = processor.webp({ quality });\n\n const optimizedBuffer = await processor.toBuffer();\n\n res.writeHead(200, {\n 'Content-Type': 'image/webp',\n 'Cache-Control': 'public, max-age=31536000, immutable'\n });\n res.end(optimizedBuffer);\n } catch (error: unknown) {\n console.error('Image optimization error:', error);\n res.writeHead(500);\n res.end('Error processing image');\n }\n}\n"]}
|
package/dist/index.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
export { build } from './chunk-3LWUS6AC.js';
|
|
2
1
|
export { LayoutContext, Link, RequestContext, RouteContext, createRequestContext, hydrate, router, useParams, usePathname, useQuery, useRequest, useRouter } from './chunk-QLFG6PW3.js';
|
|
3
|
-
export {
|
|
4
|
-
export {
|
|
2
|
+
export { build } from './chunk-VK4EZACN.js';
|
|
3
|
+
export { NotFoundError, RedirectError, bindArgs, callServerAction, composeMiddleware, cookies, createServer, deserializeArgs, executeAction, formAction, generateJsonLd, generateMetadataTags, generateRobotsTxt, generateSitemap, getAction, getMethod, getPathname, headers, html, isMethod, json, jsonLd, loadMiddleware, mergeMetadata, middlewares, notFound, parseFormData, parseJson, parseSearchParams, redirect, registerAction, runMiddleware, serverAction, tailwindPlugin, text, useActionContext, useActionState, useFormStatus, useOptimistic, useVelixAction } from './chunk-MAAAP4QR.js';
|
|
4
|
+
export { PluginHooks, PluginManager, buildRouteTree, cleanDir, copyDir, debounce, definePlugin, ensureDir, escapeHtml, findFiles, findRouteLayouts, formatBytes, formatTime, generateHash, isClientComponent, isIsland as isIslandComponent, isServerComponent, loadPlugins, logger, matchRoute, pluginManager, sleep } from './chunk-SNWXKPXR.js';
|
|
5
5
|
export { VelixConfigSchema, defaultConfig, defineConfig, loadConfig, resolvePaths } from './chunk-F24Q2MX3.js';
|
|
6
6
|
export { Island, LoadStrategy, createIsland, createLazyIsland, generateAdvancedHydrationScript, generateHydrationScript, getRegisteredIslands } from './chunk-JI2HJFUT.js';
|
|
7
|
-
import './chunk-
|
|
7
|
+
import './chunk-BQ4HFLRL.js';
|
|
8
8
|
export { ForbiddenError, UnauthorizedError, VelixHttpError, defineError, defineNotFound } from '@teamvelix/velix-core';
|
|
9
9
|
import React, { forwardRef, useState, use, useOptimistic } from 'react';
|
|
10
10
|
export { use } from 'react';
|
package/dist/islands/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
export { Island, LoadStrategy, createIsland, createLazyIsland, islands_default as default, generateAdvancedHydrationScript, generateHydrationScript, getRegisteredIslands } from '../chunk-JI2HJFUT.js';
|
|
2
|
-
import '../chunk-
|
|
2
|
+
import '../chunk-BQ4HFLRL.js';
|
|
3
3
|
//# sourceMappingURL=index.js.map
|
|
4
4
|
//# sourceMappingURL=index.js.map
|