@teamvelix/velix 5.1.6 → 5.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/README.md +1 -1
  2. package/dist/build/index.js +3 -2
  3. package/dist/chunk-4S5YQJHB.js +11 -0
  4. package/dist/chunk-4S5YQJHB.js.map +1 -0
  5. package/dist/{chunk-TGNK4MY5.js → chunk-DTF3KTLR.js} +116 -53
  6. package/dist/chunk-DTF3KTLR.js.map +1 -0
  7. package/dist/{chunk-OIZNYND3.js → chunk-JI2HJFUT.js} +2 -2
  8. package/dist/chunk-JI2HJFUT.js.map +1 -0
  9. package/dist/{chunk-RFWV4CDG.js → chunk-QIPVMOXL.js} +4 -4
  10. package/dist/chunk-QIPVMOXL.js.map +1 -0
  11. package/dist/{chunk-INOZP2VD.js → chunk-QLFG6PW3.js} +3 -2
  12. package/dist/chunk-QLFG6PW3.js.map +1 -0
  13. package/dist/{chunk-BXDKUP2L.js → chunk-XXPHGRLC.js} +3 -3
  14. package/dist/{chunk-BXDKUP2L.js.map → chunk-XXPHGRLC.js.map} +1 -1
  15. package/dist/client/index.d.ts +2 -1
  16. package/dist/client/index.js +2 -1
  17. package/dist/config.d.ts +2 -2
  18. package/dist/config.js +1 -0
  19. package/dist/{image-optimizer-I6TWWH6W.js → image-optimizer-KPRXE5VI.js} +3 -3
  20. package/dist/image-optimizer-KPRXE5VI.js.map +1 -0
  21. package/dist/index-8CqitL9K.d.ts +300 -0
  22. package/dist/{index-C4udNtpZ.d.ts → index-ChyKLf1W.d.ts} +18 -3
  23. package/dist/index.d.ts +104 -226
  24. package/dist/index.js +12 -6
  25. package/dist/index.js.map +1 -1
  26. package/dist/islands/index.d.ts +22 -10
  27. package/dist/islands/index.js +2 -1
  28. package/dist/runtime/start-build.js +2 -2
  29. package/dist/runtime/start-build.js.map +1 -1
  30. package/dist/runtime/start-dev.js +117 -46
  31. package/dist/runtime/start-dev.js.map +1 -1
  32. package/dist/runtime/start-prod.js +117 -46
  33. package/dist/runtime/start-prod.js.map +1 -1
  34. package/dist/server/index.d.ts +3 -1
  35. package/dist/server/index.js +4 -3
  36. package/package.json +60 -58
  37. package/dist/chunk-INOZP2VD.js.map +0 -1
  38. package/dist/chunk-OIZNYND3.js.map +0 -1
  39. package/dist/chunk-RFWV4CDG.js.map +0 -1
  40. package/dist/chunk-TGNK4MY5.js.map +0 -1
  41. package/dist/image-optimizer-I6TWWH6W.js.map +0 -1
  42. package/dist/index-DYgxL3mE.d.ts +0 -107
@@ -1,4 +1,6 @@
1
1
  import 'http';
2
2
  import '../config.js';
3
- export { V as VelixServer, c as createServer, _ as default } from '../index-DYgxL3mE.js';
3
+ export { s as VelixServer, r as createServer, _ as default } from '../index-8CqitL9K.js';
4
+ export { VelixHttpError, buildApiManifest, defineLoader, defineRoute, handleApiRequest, serverAction } from '@teamvelix/velix-core';
4
5
  import 'zod';
6
+ import 'react';
@@ -1,6 +1,7 @@
1
- export { createServer, server_default as default } from '../chunk-TGNK4MY5.js';
2
- import '../chunk-RFWV4CDG.js';
1
+ export { VelixHttpError, buildApiManifest, createServer, server_default as default, defineLoader, defineRoute, handleApiRequest, serverAction2 as serverAction } from '../chunk-DTF3KTLR.js';
2
+ import '../chunk-QIPVMOXL.js';
3
3
  import '../chunk-F24Q2MX3.js';
4
- import '../chunk-OIZNYND3.js';
4
+ import '../chunk-JI2HJFUT.js';
5
+ import '../chunk-4S5YQJHB.js';
5
6
  //# sourceMappingURL=index.js.map
6
7
  //# sourceMappingURL=index.js.map
package/package.json CHANGED
@@ -1,59 +1,61 @@
1
- {
2
- "name": "@teamvelix/velix",
3
- "version": "5.1.6",
4
- "description": "Velix v5 — A modern full-stack React framework",
5
- "main": "dist/index.js",
6
- "types": "dist/index.d.ts",
7
- "type": "module",
8
- "exports": {
9
- ".": "./dist/index.js",
10
- "./client": "./dist/client/index.js",
11
- "./server": "./dist/server/index.js",
12
- "./render": "./dist/render/index.js",
13
- "./config": "./dist/config.js",
14
- "./islands": "./dist/islands/index.js",
15
- "./types": "./dist/types.js"
16
- },
17
- "files": [
18
- "dist",
19
- "assets",
20
- "README.md",
21
- "LICENSE",
22
- "assets/*.webp"
23
- ],
24
- "scripts": {
25
- "build": "tsup",
26
- "dev": "tsup --watch",
27
- "typecheck": "tsc --noEmit"
28
- },
29
- "keywords": [
30
- "velix",
31
- "react",
32
- "framework",
33
- "ssr",
34
- "ssg",
35
- "islands",
36
- "seo",
37
- "fullstack"
38
- ],
39
- "author": "velixteam",
40
- "publisher": "velixteam",
41
- "license": "MIT",
42
- "peerDependencies": {
43
- "react": ">=19.0.1",
44
- "react-dom": ">=19.0.1"
45
- },
46
- "dependencies": {
47
- "esbuild": "0.25.0",
48
- "picocolors": "^1.1.1",
49
- "zod": "^3.24.1",
50
- "lru-cache": "^11.0.2",
51
- "chokidar": "^3.6.0"
52
- },
53
- "engines": {
54
- "node": ">=18.0.0"
55
- },
56
- "publishConfig": {
57
- "access": "public"
58
- }
1
+ {
2
+ "name": "@teamvelix/velix",
3
+ "version": "5.2.0",
4
+ "description": "Velix v5 — A modern full-stack React framework",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "type": "module",
8
+ "exports": {
9
+ ".": "./dist/index.js",
10
+ "./client": "./dist/client/index.js",
11
+ "./server": "./dist/server/index.js",
12
+ "./render": "./dist/render/index.js",
13
+ "./config": "./dist/config.js",
14
+ "./islands": "./dist/islands/index.js",
15
+ "./types": "./dist/types.js"
16
+ },
17
+ "files": [
18
+ "dist",
19
+ "assets",
20
+ "README.md",
21
+ "LICENSE",
22
+ "assets/*.webp"
23
+ ],
24
+ "keywords": [
25
+ "velix",
26
+ "react",
27
+ "framework",
28
+ "ssr",
29
+ "ssg",
30
+ "islands",
31
+ "seo",
32
+ "fullstack"
33
+ ],
34
+ "author": "velixteam",
35
+ "publisher": "velixteam",
36
+ "license": "MIT",
37
+ "peerDependencies": {
38
+ "react": ">=19.0.1",
39
+ "react-dom": ">=19.0.1"
40
+ },
41
+ "dependencies": {
42
+ "esbuild": "0.25.0",
43
+ "picocolors": "^1.1.1",
44
+ "zod": "^3.24.1",
45
+ "lru-cache": "^11.0.2",
46
+ "chokidar": "^3.6.0",
47
+ "@teamvelix/velix-core": "5.2.0",
48
+ "@teamvelix/velix-react": "5.2.0"
49
+ },
50
+ "engines": {
51
+ "node": ">=18.0.0"
52
+ },
53
+ "publishConfig": {
54
+ "access": "public"
55
+ },
56
+ "scripts": {
57
+ "build": "tsup",
58
+ "dev": "tsup --watch",
59
+ "typecheck": "tsc --noEmit"
60
+ }
59
61
  }
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../context.ts","../client/index.ts"],"names":["React"],"mappings":";;;AAeO,IAAM,cAAA,GAAiB,KAAA,CAAM,aAAA,CAAmB,IAAI;AAGpD,IAAM,YAAA,GAAe,KAAA,CAAM,aAAA,CAAuC,IAAI;AAGtE,IAAM,aAAA,GAAgB,KAAA,CAAM,aAAA,CAAmB,IAAI;AAKnD,SAAS,oBAAA,CACd,KACA,GAAA,EACA,MAAA,GAAiC,EAAC,EAClC,KAAA,GAAgC,EAAC,EACjC;AACA,EAAA,OAAO;AAAA,IACL,GAAA;AAAA,IACA,GAAA;AAAA,IACA,MAAA;AAAA,IACA,KAAA;AAAA,IACA,KAAK,GAAA,CAAI,GAAA;AAAA,IACT,QAAQ,GAAA,CAAI,MAAA;AAAA,IACZ,SAAS,GAAA,CAAI,OAAA;AAAA,IACb,OAAA,EAAS,YAAA,CAAa,GAAA,CAAI,OAAA,CAAQ,UAAU,EAAE;AAAA,GAChD;AACF;AAKA,SAAS,aAAa,YAAA,EAA8C;AAClE,EAAA,MAAM,UAAkC,EAAC;AACzC,EAAA,IAAI,CAAC,cAAc,OAAO,OAAA;AAC1B,EAAA,YAAA,CAAa,KAAA,CAAM,GAAG,CAAA,CAAE,OAAA,CAAQ,CAAC,MAAA,KAAmB;AAClD,IAAA,MAAM,CAAC,IAAA,EAAM,GAAG,IAAI,CAAA,GAAI,MAAA,CAAO,MAAM,GAAG,CAAA;AACxC,IAAA,IAAI,IAAA,EAAM,OAAA,CAAQ,IAAA,CAAK,IAAA,EAAM,IAAI,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA,CAAE,IAAA,EAAK;AAAA,EACvD,CAAC,CAAA;AACD,EAAA,OAAO,OAAA;AACT;AAKO,SAAS,UAAA,GAAa;AAC3B,EAAA,MAAM,OAAA,GAAU,KAAA,CAAM,UAAA,CAAW,cAAc,CAAA;AAC/C,EAAA,IAAI,CAAC,OAAA,EAAS,MAAM,IAAI,MAAM,0DAA0D,CAAA;AACxF,EAAA,OAAO,OAAA;AACT;AAKO,SAAS,SAAA,GAAY;AAC1B,EAAA,MAAM,OAAA,GAAU,KAAA,CAAM,UAAA,CAAW,YAAY,CAAA;AAC7C,EAAA,OAAO,OAAA,EAAS,UAAU,EAAC;AAC7B;AAKO,SAAS,QAAA,GAAW;AACzB,EAAA,MAAM,OAAA,GAAU,KAAA,CAAM,UAAA,CAAW,YAAY,CAAA;AAC7C,EAAA,OAAO,OAAA,EAAS,SAAS,EAAC;AAC5B;AAKO,SAAS,WAAA,GAAc;AAC5B,EAAA,MAAM,OAAA,GAAU,KAAA,CAAM,UAAA,CAAW,YAAY,CAAA;AAC7C,EAAA,OAAO,SAAS,QAAA,IAAY,GAAA;AAC9B;ACvEA,IAAM,SAAA,uBAAgB,GAAA,EAAgB;AACtC,IAAI,YAAA,GAA4B;AAAA,EAC9B,UAAU,OAAO,MAAA,KAAW,WAAA,GAAc,MAAA,CAAO,SAAS,QAAA,GAAW,GAAA;AAAA,EACrE,OAAO,EAAC;AAAA,EACR,QAAQ;AACV,CAAA;AAEA,SAAS,MAAA,GAAS;AAChB,EAAA,SAAA,CAAU,OAAA,CAAQ,CAAA,EAAA,KAAM,EAAA,EAAI,CAAA;AAC9B;AAEO,IAAM,MAAA,GAAS;AAAA,EACpB,KAAK,GAAA,EAAa;AAChB,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACnC,IAAA,MAAA,CAAO,OAAA,CAAQ,SAAA,CAAU,EAAC,EAAG,IAAI,GAAG,CAAA;AACpC,IAAA,YAAA,GAAe,EAAE,GAAG,YAAA,EAAc,QAAA,EAAU,IAAI,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,EAAE;AAC9D,IAAA,MAAA,EAAO;AAAA,EACT,CAAA;AAAA,EAEA,QAAQ,GAAA,EAAa;AACnB,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACnC,IAAA,MAAA,CAAO,OAAA,CAAQ,YAAA,CAAa,EAAC,EAAG,IAAI,GAAG,CAAA;AACvC,IAAA,YAAA,GAAe,EAAE,GAAG,YAAA,EAAc,QAAA,EAAU,IAAI,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,EAAE;AAC9D,IAAA,MAAA,EAAO;AAAA,EACT,CAAA;AAAA,EAEA,IAAA,GAAO;AACL,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACnC,IAAA,MAAA,CAAO,QAAQ,IAAA,EAAK;AAAA,EACtB,CAAA;AAAA,EAEA,OAAA,GAAU;AACR,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACnC,IAAA,MAAA,CAAO,QAAQ,OAAA,EAAQ;AAAA,EACzB,CAAA;AAAA,EAEA,OAAA,GAAU;AACR,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACnC,IAAA,MAAA,CAAO,SAAS,MAAA,EAAO;AAAA,EACzB,CAAA;AAAA,EAEA,SAAS,IAAA,EAAc;AAAA,EAEvB,CAAA;AAAA,EAEA,UAAU,QAAA,EAAsB;AAC9B,IAAA,SAAA,CAAU,IAAI,QAAQ,CAAA;AACtB,IAAA,OAAO,MAAM,SAAA,CAAU,MAAA,CAAO,QAAQ,CAAA;AAAA,EACxC,CAAA;AAAA,EAEA,QAAA,GAAwB;AACtB,IAAA,OAAO,YAAA;AAAA,EACT;AACF;AAKO,SAAS,SAAA,GAAY;AAC1B,EAAA,OAAO,MAAA;AACT;AAGA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,EAAA,MAAA,CAAO,gBAAA,CAAiB,YAAY,MAAM;AACxC,IAAA,YAAA,GAAe,EAAE,GAAG,YAAA,EAAc,QAAA,EAAU,MAAA,CAAO,SAAS,QAAA,EAAS;AACrE,IAAA,MAAA,EAAO;AAAA,EACT,CAAC,CAAA;AACH;AA4BO,SAAS,KAAK,EAAE,IAAA,EAAM,QAAA,GAAW,KAAA,EAAO,SAAS,aAAA,GAAgB,KAAA,EAAO,MAAA,GAAS,IAAA,EAAM,UAAU,KAAA,EAAO,QAAA,EAAU,SAAS,YAAA,EAAc,GAAG,MAAK,EAAc;AACpK,EAAA,MAAM,OAAA,GAAUA,KAAAA,CAAM,MAAA,CAA0B,IAAI,CAAA;AACpD,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,KAAAA,CAAM,SAAS,KAAK,CAAA;AAG5D,EAAA,MAAM,gBAAA,GAAmB,CAAC,CAAA,KAA2C;AACnE,IAAA,IAAI,QAAA,KAAa,OAAA,IAAW,CAAC,YAAA,EAAc;AACzC,MAAA,MAAA,CAAO,SAAS,IAAI,CAAA;AACpB,MAAA,eAAA,CAAgB,IAAI,CAAA;AAAA,IACtB;AACA,IAAA,YAAA,GAAe,CAAC,CAAA;AAAA,EAClB,CAAA;AAGA,EAAAA,KAAAA,CAAM,UAAU,MAAM;AACpB,IAAA,IAAI,QAAA,KAAa,SAAA,IAAa,OAAA,CAAQ,OAAA,IAAW,CAAC,YAAA,EAAc;AAC9D,MAAA,MAAM,WAAW,IAAI,oBAAA;AAAA,QACnB,CAAC,OAAA,KAAY;AACX,UAAA,IAAI,OAAA,CAAQ,CAAC,CAAA,CAAE,cAAA,EAAgB;AAC7B,YAAA,MAAA,CAAO,SAAS,IAAI,CAAA;AACpB,YAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,YAAA,QAAA,CAAS,UAAA,EAAW;AAAA,UACtB;AAAA,QACF,CAAA;AAAA,QACA,EAAE,YAAY,OAAA;AAAQ,OACxB;AACA,MAAA,QAAA,CAAS,OAAA,CAAQ,QAAQ,OAAO,CAAA;AAChC,MAAA,OAAO,MAAM,SAAS,UAAA,EAAW;AAAA,IACnC;AAAA,EACF,CAAA,EAAG,CAAC,IAAA,EAAM,QAAA,EAAU,YAAY,CAAC,CAAA;AAGjC,EAAAA,KAAAA,CAAM,UAAU,MAAM;AACpB,IAAA,IAAI,QAAA,KAAa,IAAA,IAAQ,CAAC,YAAA,EAAc;AACtC,MAAA,MAAA,CAAO,SAAS,IAAI,CAAA;AACpB,MAAA,eAAA,CAAgB,IAAI,CAAA;AAAA,IACtB;AAAA,EACF,CAAA,EAAG,CAAC,IAAA,EAAM,QAAA,EAAU,YAAY,CAAC,CAAA;AAEjC,EAAA,MAAM,WAAA,GAAc,CAAC,CAAA,KAA2C;AAE9D,IAAA,IACE,KAAK,UAAA,CAAW,MAAM,KAAK,IAAA,CAAK,UAAA,CAAW,IAAI,CAAA,IAC/C,CAAA,CAAE,OAAA,IAAW,CAAA,CAAE,WAAW,CAAA,CAAE,QAAA,IAAY,EAAE,MAAA,IAC1C,CAAA,CAAE,WAAW,CAAA,EACb;AACA,MAAA,OAAA,GAAU,CAAC,CAAA;AACX,MAAA;AAAA,IACF;AAEA,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,OAAA,GAAU,CAAC,CAAA;AAGX,IAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAgB,MAAA,CAAe,mBAAA,EAAqB;AACxE,MAAC,MAAA,CAAe,mBAAA,CAAoB,SAAA,CAAU,YAAY,CAAA;AAAA,IAC5D;AAEA,IAAA,IAAI,aAAA,EAAe;AACjB,MAAA,MAAA,CAAO,QAAQ,IAAI,CAAA;AAAA,IACrB,CAAA,MAAO;AACL,MAAA,MAAA,CAAO,KAAK,IAAI,CAAA;AAAA,IAClB;AAEA,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,MAAA,CAAO,SAAS,EAAE,GAAA,EAAK,CAAA,EAAG,QAAA,EAAU,UAAU,CAAA;AAAA,IAChD;AAAA,EACF,CAAA;AAEA,EAAA,OAAOA,KAAAA,CAAM,aAAA,CAAc,GAAA,EAAK,EAAE,KAAK,OAAA,EAAS,IAAA,EAAM,OAAA,EAAS,WAAA,EAAa,YAAA,EAAc,gBAAA,EAAkB,GAAG,IAAA,IAAQ,QAAQ,CAAA;AACjI;AASA,eAAsB,OAAA,GAAU;AAC9B,EAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AAEnC,EAAA,MAAM,EAAE,WAAA,EAAY,GAAI,MAAM,OAAO,kBAAkB,CAAA;AACvD,EAAA,MAAM,WAAA,GAAc,QAAA,CAAS,cAAA,CAAe,SAAS,CAAA;AAErD,EAAA,IAAI,CAAC,WAAA,EAAa;AAChB,IAAA,OAAA,CAAQ,KAAK,iDAAiD,CAAA;AAC9D,IAAA;AAAA,EACF;AAGA,EAAA,OAAA,CAAQ,IAAI,4BAA4B,CAAA;AAC1C;AAEA,IAAO,cAAA,GAAQ,EAAE,IAAA,EAAM,SAAA,EAAW,QAAQ,OAAA","file":"chunk-INOZP2VD.js","sourcesContent":["/**\n * Velix v5 Context System\n * Provides request context and shared state for SSR\n */\n\nimport React from 'react';\n\n// Route context type\ninterface RouteContextType {\n params: Record<string, string>;\n query: Record<string, string>;\n pathname: string;\n}\n\n// Server-side request context\nexport const RequestContext = React.createContext<any>(null);\n\n// Route context for nested routes\nexport const RouteContext = React.createContext<RouteContextType | null>(null);\n\n// Layout context\nexport const LayoutContext = React.createContext<any>(null);\n\n/**\n * Creates a request context value\n */\nexport function createRequestContext(\n req: import('http').IncomingMessage,\n res: import('http').ServerResponse,\n params: Record<string, string> = {},\n query: Record<string, string> = {}\n) {\n return {\n req,\n res,\n params,\n query,\n url: req.url,\n method: req.method,\n headers: req.headers,\n cookies: parseCookies(req.headers.cookie || '')\n };\n}\n\n/**\n * Parse cookies from header string\n */\nfunction parseCookies(cookieHeader: string): Record<string, string> {\n const cookies: Record<string, string> = {};\n if (!cookieHeader) return cookies;\n cookieHeader.split(';').forEach((cookie: string) => {\n const [name, ...rest] = cookie.split('=');\n if (name) cookies[name.trim()] = rest.join('=').trim();\n });\n return cookies;\n}\n\n/**\n * Hook to access request context (server-side only)\n */\nexport function useRequest() {\n const context = React.useContext(RequestContext);\n if (!context) throw new Error('useRequest must be used within a RequestContext provider');\n return context;\n}\n\n/**\n * Hook to access route params\n */\nexport function useParams() {\n const context = React.useContext(RouteContext);\n return context?.params || {};\n}\n\n/**\n * Hook to access query parameters\n */\nexport function useQuery() {\n const context = React.useContext(RouteContext);\n return context?.query || {};\n}\n\n/**\n * Hook to access current pathname\n */\nexport function usePathname() {\n const context = React.useContext(RouteContext);\n return context?.pathname || '/';\n}\n","/**\n * Velix v5 Client Module\n * Client-side navigation, hydration, and the Link component.\n */\n\nexport { useParams, useQuery, usePathname } from '../context.js';\n\n// ============================================================================\n// Client-side Router\n// ============================================================================\n\ninterface RouterState {\n pathname: string;\n query: Record<string, string>;\n params: Record<string, string>;\n}\n\nconst listeners = new Set<() => void>();\nlet currentState: RouterState = {\n pathname: typeof window !== 'undefined' ? window.location.pathname : '/',\n query: {},\n params: {},\n};\n\nfunction notify() {\n listeners.forEach(fn => fn());\n}\n\nexport const router = {\n push(url: string) {\n if (typeof window === 'undefined') return;\n window.history.pushState({}, '', url);\n currentState = { ...currentState, pathname: url.split('?')[0] };\n notify();\n },\n\n replace(url: string) {\n if (typeof window === 'undefined') return;\n window.history.replaceState({}, '', url);\n currentState = { ...currentState, pathname: url.split('?')[0] };\n notify();\n },\n\n back() {\n if (typeof window === 'undefined') return;\n window.history.back();\n },\n\n forward() {\n if (typeof window === 'undefined') return;\n window.history.forward();\n },\n\n refresh() {\n if (typeof window === 'undefined') return;\n window.location.reload();\n },\n\n prefetch(_url: string) {\n // Future: implement prefetching\n },\n\n subscribe(listener: () => void) {\n listeners.add(listener);\n return () => listeners.delete(listener);\n },\n\n getState(): RouterState {\n return currentState;\n },\n};\n\n/**\n * Hook to access the Velix client router\n */\nexport function useRouter() {\n return router;\n}\n\n// Listen for popstate (browser back/forward)\nif (typeof window !== 'undefined') {\n window.addEventListener('popstate', () => {\n currentState = { ...currentState, pathname: window.location.pathname };\n notify();\n });\n}\n\n// ============================================================================\n// Link Component\n// ============================================================================\n\nimport React from 'react';\n\ninterface LinkProps extends React.AnchorHTMLAttributes<HTMLAnchorElement> {\n href: string;\n prefetch?: boolean | 'hover' | 'visible';\n replace?: boolean;\n scroll?: boolean;\n shallow?: boolean;\n children: React.ReactNode;\n}\n\n/**\n * Client-side navigation link component\n *\n * @example\n * ```tsx\n * import { Link } from 'velix/client';\n *\n * <Link href=\"/dashboard\">Dashboard</Link>\n * <Link href=\"/blog\" prefetch>Blog</Link>\n * ```\n */\nexport function Link({ href, prefetch = false, replace: shouldReplace = false, scroll = true, shallow = false, children, onClick, onMouseEnter, ...rest }: LinkProps) {\n const linkRef = React.useRef<HTMLAnchorElement>(null);\n const [isPrefetched, setIsPrefetched] = React.useState(false);\n\n // Prefetch on hover\n const handleMouseEnter = (e: React.MouseEvent<HTMLAnchorElement>) => {\n if (prefetch === 'hover' && !isPrefetched) {\n router.prefetch(href);\n setIsPrefetched(true);\n }\n onMouseEnter?.(e);\n };\n\n // Prefetch when visible\n React.useEffect(() => {\n if (prefetch === 'visible' && linkRef.current && !isPrefetched) {\n const observer = new IntersectionObserver(\n (entries) => {\n if (entries[0].isIntersecting) {\n router.prefetch(href);\n setIsPrefetched(true);\n observer.disconnect();\n }\n },\n { rootMargin: '100px' }\n );\n observer.observe(linkRef.current);\n return () => observer.disconnect();\n }\n }, [href, prefetch, isPrefetched]);\n\n // Prefetch immediately\n React.useEffect(() => {\n if (prefetch === true && !isPrefetched) {\n router.prefetch(href);\n setIsPrefetched(true);\n }\n }, [href, prefetch, isPrefetched]);\n\n const handleClick = (e: React.MouseEvent<HTMLAnchorElement>) => {\n // Allow default behavior for external links, ctrl/meta clicks, etc.\n if (\n href.startsWith('http') || href.startsWith('//') ||\n e.ctrlKey || e.metaKey || e.shiftKey || e.altKey ||\n e.button !== 0\n ) {\n onClick?.(e);\n return;\n }\n\n e.preventDefault();\n onClick?.(e);\n\n // Notify DevTools of navigation start\n if (typeof window !== 'undefined' && (window as any).__VELIX_DEV_TOOLS__) {\n (window as any).__VELIX_DEV_TOOLS__.setStatus('navigating');\n }\n\n if (shouldReplace) {\n router.replace(href);\n } else {\n router.push(href);\n }\n\n if (scroll) {\n window.scrollTo({ top: 0, behavior: 'smooth' });\n }\n };\n\n return React.createElement('a', { ref: linkRef, href, onClick: handleClick, onMouseEnter: handleMouseEnter, ...rest }, children);\n}\n\n// ============================================================================\n// Hydration\n// ============================================================================\n\n/**\n * Client entry point for hydrating the app\n */\nexport async function hydrate() {\n if (typeof window === 'undefined') return;\n\n const { hydrateRoot } = await import('react-dom/client');\n const rootElement = document.getElementById('__velix');\n\n if (!rootElement) {\n console.warn('[Velix] No #__velix element found for hydration');\n return;\n }\n\n // Minimal hydration — full implementation is done per-island\n console.log('[Velix] Hydration complete');\n}\n\nexport default { Link, useRouter, router, hydrate };\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../islands/index.ts"],"names":[],"mappings":"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","file":"chunk-OIZNYND3.js","sourcesContent":["/**\n * Velix v5 Islands Architecture\n *\n * Islands allow partial hydration — only interactive components are hydrated\n * on the client, while static content remains as HTML.\n *\n * Usage: Add 'use island' at the top of a component file.\n */\n\nimport React from 'react';\nimport crypto from 'crypto';\n\n// Island registry for tracking all islands in a render\nconst islandRegistry = new Map();\n\nfunction generateIslandId(componentName: string): string {\n const hash = crypto.randomBytes(4).toString('hex');\n return `island-${componentName}-${hash}`;\n}\n\n/**\n * Island wrapper component for server-side rendering\n */\nexport function Island({ component: Component, props = {}, name, clientPath }: {\n component: React.ComponentType<any>;\n props?: any;\n name: string;\n clientPath: string;\n}) {\n const islandId = generateIslandId(name);\n\n islandRegistry.set(islandId, { id: islandId, name, clientPath, props });\n\n return React.createElement('div', {\n 'data-island': islandId,\n 'data-island-name': name,\n 'data-island-props': JSON.stringify(props),\n }, React.createElement(Component, props));\n}\n\n/**\n * Gets all registered islands and clears the registry\n */\nexport function getRegisteredIslands() {\n const islands = Array.from(islandRegistry.values());\n islandRegistry.clear();\n return islands;\n}\n\n/**\n * Creates an island component wrapper\n */\nexport function createIsland(Component: React.ComponentType<any>, options: { name?: string; clientPath?: string } = {}) {\n const { name = (Component as any).name || 'Island', clientPath } = options;\n\n function IslandWrapper(props: any) {\n return Island({\n component: Component, props, name,\n clientPath: clientPath || `/__velix/islands/${name}.js`\n });\n }\n\n IslandWrapper.displayName = `Island(${name})`;\n IslandWrapper.isIsland = true;\n IslandWrapper.originalComponent = Component;\n return IslandWrapper;\n}\n\n/**\n * Island loading strategies\n */\nexport const LoadStrategy = {\n IMMEDIATE: 'immediate',\n VISIBLE: 'visible',\n IDLE: 'idle',\n MEDIA: 'media'\n} as const;\n\n/**\n * Creates a lazy island that hydrates based on strategy\n */\nexport function createLazyIsland(Component: React.ComponentType<any>, options: {\n name?: string; clientPath?: string; strategy?: string; media?: string | null;\n} = {}) {\n const {\n name = (Component as any).name || 'LazyIsland',\n clientPath,\n strategy = LoadStrategy.VISIBLE,\n media = null\n } = options;\n\n function LazyIslandWrapper(props: any) {\n const islandId = generateIslandId(name);\n\n islandRegistry.set(islandId, {\n id: islandId, name,\n clientPath: clientPath || `/__velix/islands/${name}.js`,\n props, strategy, media\n });\n\n return React.createElement('div', {\n 'data-island': islandId,\n 'data-island-name': name,\n 'data-island-strategy': strategy,\n 'data-island-media': media,\n 'data-island-props': JSON.stringify(props),\n });\n }\n\n LazyIslandWrapper.displayName = `LazyIsland(${name})`;\n LazyIslandWrapper.isIsland = true;\n LazyIslandWrapper.isLazy = true;\n return LazyIslandWrapper;\n}\n\n/**\n * Generates the client-side hydration script for islands\n */\nexport function generateHydrationScript(islands: any[]): string {\n if (!islands.length) return '';\n\n const islandData = islands.map((island: any) => ({\n id: island.id, name: island.name,\n path: island.clientPath, props: island.props\n }));\n\n return `\n<script type=\"module\">\n const islands = ${JSON.stringify(islandData)};\n\n async function hydrateIslands() {\n const { hydrateRoot } = await import('/__velix/react-dom-client.js');\n const React = await import('/__velix/react.js');\n\n for (const island of islands) {\n try {\n const el = document.querySelector(\\`[data-island=\"\\${island.id}\"]\\`);\n if (!el) continue;\n const mod = await import(island.path);\n hydrateRoot(el, React.createElement(mod.default, island.props));\n el.setAttribute('data-hydrated', 'true');\n } catch (error) {\n console.error(\\`Failed to hydrate island \\${island.name}:\\`, error);\n }\n }\n }\n\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', hydrateIslands);\n } else {\n hydrateIslands();\n }\n</script>`;\n}\n\n/**\n * Generates advanced hydration script with loading strategies\n */\nexport function generateAdvancedHydrationScript(islands: any[]): string {\n if (!islands.length) return '';\n\n const islandData = islands.map((island: any) => ({\n id: island.id, name: island.name, path: island.clientPath,\n props: island.props, strategy: island.strategy || LoadStrategy.IMMEDIATE,\n media: island.media\n }));\n\n return `\n<script type=\"module\">\n const islands = ${JSON.stringify(islandData)};\n\n async function hydrateIsland(island) {\n const el = document.querySelector(\\`[data-island=\"\\${island.id}\"]\\`);\n if (!el || el.hasAttribute('data-hydrated')) return;\n\n try {\n const { hydrateRoot } = await import('/__velix/react-dom-client.js');\n const React = await import('/__velix/react.js');\n const mod = await import(island.path);\n hydrateRoot(el, React.createElement(mod.default, island.props));\n el.setAttribute('data-hydrated', 'true');\n } catch (error) {\n console.error(\\`Failed to hydrate island \\${island.name}:\\`, error);\n }\n }\n\n const visibleObserver = new IntersectionObserver((entries) => {\n entries.forEach(entry => {\n if (entry.isIntersecting) {\n const id = entry.target.getAttribute('data-island');\n const island = islands.find(i => i.id === id);\n if (island) { hydrateIsland(island); visibleObserver.unobserve(entry.target); }\n }\n });\n }, { rootMargin: '50px' });\n\n function processIslands() {\n for (const island of islands) {\n const el = document.querySelector(\\`[data-island=\"\\${island.id}\"]\\`);\n if (!el) continue;\n switch (island.strategy) {\n case 'immediate': hydrateIsland(island); break;\n case 'visible': visibleObserver.observe(el); break;\n case 'idle': requestIdleCallback(() => hydrateIsland(island)); break;\n case 'media':\n if (island.media && window.matchMedia(island.media).matches) hydrateIsland(island);\n break;\n }\n }\n }\n\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', processIslands);\n } else {\n processIslands();\n }\n</script>`;\n}\n\nexport default { Island, createIsland, createLazyIsland, getRegisteredIslands, generateHydrationScript, generateAdvancedHydrationScript, LoadStrategy };\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../utils.ts","../router/index.ts","../version.ts","../logger.ts"],"names":["path","fs"],"mappings":"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","file":"chunk-RFWV4CDG.js","sourcesContent":["/**\n * Velix v5 Utility Functions\n */\n\nimport fs from 'fs';\nimport path from 'path';\nimport crypto from 'crypto';\n\n/**\n * Generates a unique hash for cache busting\n */\nexport function generateHash(content: string): string {\n return crypto.createHash('md5').update(content).digest('hex').slice(0, 8);\n}\n\n/**\n * Escapes HTML special characters\n */\nexport function escapeHtml(str: string): string {\n const htmlEntities: Record<string, string> = {\n '&': '&amp;', '<': '&lt;', '>': '&gt;',\n '\"': '&quot;', \"'\": '&#39;'\n };\n return String(str).replace(/[&<>\"']/g, char => htmlEntities[char]);\n}\n\n/**\n * Recursively finds all files matching a pattern\n */\nexport function findFiles(dir: string, pattern: RegExp, files: string[] = []): string[] {\n if (!fs.existsSync(dir)) return files;\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n if (entry.isDirectory()) findFiles(fullPath, pattern, files);\n else if (pattern.test(entry.name)) files.push(fullPath);\n }\n return files;\n}\n\n/**\n * Ensures a directory exists\n */\nexport function ensureDir(dir: string): void {\n if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });\n}\n\n/**\n * Cleans a directory\n */\nexport function cleanDir(dir: string): void {\n if (fs.existsSync(dir)) fs.rmSync(dir, { recursive: true, force: true });\n fs.mkdirSync(dir, { recursive: true });\n}\n\n/**\n * Copies a directory recursively\n */\nexport function copyDir(src: string, dest: string): void {\n ensureDir(dest);\n const entries = fs.readdirSync(src, { withFileTypes: true });\n for (const entry of entries) {\n const srcPath = path.join(src, entry.name);\n const destPath = path.join(dest, entry.name);\n if (entry.isDirectory()) copyDir(srcPath, destPath);\n else fs.copyFileSync(srcPath, destPath);\n }\n}\n\n/**\n * Debounce function for file watching\n */\nexport function debounce<T extends (...args: any[]) => any>(fn: T, delay: number): (...args: Parameters<T>) => void {\n let timeout: ReturnType<typeof setTimeout> | undefined;\n return (...args: Parameters<T>) => {\n clearTimeout(timeout);\n timeout = setTimeout(() => fn(...args), delay);\n };\n}\n\n/**\n * Formats bytes to human-readable string\n */\nexport function formatBytes(bytes: number): string {\n if (bytes === 0) return '0 B';\n const k = 1024;\n const sizes = ['B', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];\n}\n\n/**\n * Formats milliseconds to human-readable string\n */\nexport function formatTime(ms: number): string {\n if (ms < 1000) return `${ms}ms`;\n return `${(ms / 1000).toFixed(2)}s`;\n}\n\n/**\n * Creates a deferred promise\n */\nexport function createDeferred() {\n let resolve: any, reject: any;\n const promise = new Promise((res, rej) => { resolve = res; reject = rej; });\n return { promise, resolve, reject };\n}\n\n/**\n * Sleep utility\n */\nexport function sleep(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n}\n\n/**\n * Check if a file is a server component (has 'use server' directive)\n */\nexport function isServerComponent(filePath: string): boolean {\n try {\n const content = fs.readFileSync(filePath, 'utf-8');\n const firstLine = content.split('\\n')[0].trim();\n return firstLine === \"'use server'\" || firstLine === '\"use server\"';\n } catch { return false; }\n}\n\n/**\n * Check if a file is a client component (has 'use client' directive)\n */\nexport function isClientComponent(filePath: string): boolean {\n try {\n const content = fs.readFileSync(filePath, 'utf-8');\n const firstLine = content.split('\\n')[0].trim();\n return firstLine === \"'use client'\" || firstLine === '\"use client\"';\n } catch { return false; }\n}\n\n/**\n * Check if a component is an island (has 'use island' directive)\n */\nexport function isIsland(filePath: string): boolean {\n try {\n const content = fs.readFileSync(filePath, 'utf-8');\n const firstLine = content.split('\\n')[0].trim();\n return firstLine === \"'use island'\" || firstLine === '\"use island\"';\n } catch { return false; }\n}\n","/**\n * Velix v5 Router\n * File-based routing using the app/ directory convention\n *\n * Supports:\n * - app/page.tsx → /\n * - app/dashboard/page.tsx → /dashboard\n * - app/blog/[slug]/page.tsx → /blog/:slug\n * - app/(group)/page.tsx → / (route groups)\n * - app/[...slug]/page.tsx → catch-all routes\n * - layout.tsx, loading.tsx, error.tsx, not-found.tsx\n */\n\nimport fs from 'fs';\nimport path from 'path';\nimport { isServerComponent, isClientComponent, isIsland } from '../utils.js';\n\n// ============================================================================\n// Route Types\n// ============================================================================\n\nexport const RouteType = {\n PAGE: 'page',\n API: 'api',\n LAYOUT: 'layout',\n LOADING: 'loading',\n ERROR: 'error',\n NOT_FOUND: 'not-found'\n} as const;\n\n// ============================================================================\n// Build Route Tree\n// ============================================================================\n\n/**\n * Builds the complete route tree from the app/ directory\n */\nexport function buildRouteTree(appDir: string) {\n const projectRoot = path.dirname(appDir);\n\n const routes: {\n pages: any[];\n api: any[];\n layouts: Map<string, string>;\n tree: Record<string, any>;\n appRoutes: any[];\n rootLayout?: string;\n } = {\n pages: [],\n api: [],\n layouts: new Map(),\n tree: {},\n appRoutes: [],\n };\n\n // Scan app/ directory\n if (fs.existsSync(appDir)) {\n scanAppDirectory(appDir, appDir, routes);\n }\n\n // Scan server/api/ for API routes\n const serverApiDir = path.join(projectRoot, 'server', 'api');\n if (fs.existsSync(serverApiDir)) {\n scanApiDirectory(serverApiDir, serverApiDir, routes);\n }\n\n // Check for root layout\n const rootLayoutTsx = path.join(appDir, 'layout.tsx');\n const rootLayoutJsx = path.join(appDir, 'layout.jsx');\n if (fs.existsSync(rootLayoutTsx)) routes.rootLayout = rootLayoutTsx;\n else if (fs.existsSync(rootLayoutJsx)) routes.rootLayout = rootLayoutJsx;\n\n // Build route tree for nested routes\n routes.tree = buildTree(routes.appRoutes);\n\n return routes;\n}\n\n// ============================================================================\n// App Directory Scanner\n// ============================================================================\n\n/**\n * Scans app/ directory for file-based routing\n * Supports: page.tsx, layout.tsx, loading.tsx, error.tsx, not-found.tsx, [param].tsx\n */\nfunction scanAppDirectory(\n baseDir: string,\n currentDir: string,\n routes: any,\n parentSegments: string[] = [],\n parentLayout: string | null = null,\n parentMiddleware: string | null = null\n) {\n const entries = fs.readdirSync(currentDir, { withFileTypes: true });\n\n // Find special files in current directory\n const specialFiles: Record<string, string | null> = {\n page: null,\n layout: null,\n loading: null,\n error: null,\n notFound: null,\n template: null,\n middleware: null\n };\n\n for (const entry of entries) {\n if (entry.isFile()) {\n const name = entry.name.replace(/\\.(jsx|js|tsx|ts)$/, '');\n const fullPath = path.join(currentDir, entry.name);\n const ext = path.extname(entry.name);\n\n // Only process relevant extensions\n if (!['.tsx', '.jsx', '.ts', '.js'].includes(ext)) continue;\n\n if (name === 'page') specialFiles.page = fullPath;\n if (name === 'layout') specialFiles.layout = fullPath;\n if (name === 'loading') specialFiles.loading = fullPath;\n if (name === 'error') specialFiles.error = fullPath;\n if (name === 'not-found') specialFiles.notFound = fullPath;\n if (name === 'template') specialFiles.template = fullPath;\n if (name === 'middleware' || name === '_middleware') specialFiles.middleware = fullPath;\n\n // Handle [param].tsx files directly in app/ (alternative to [param]/page.tsx)\n if (name.startsWith('[') && name.endsWith(']') && ['.tsx', '.jsx'].includes(ext)) {\n const paramName = name.slice(1, -1);\n let segmentName: string;\n\n if (paramName.startsWith('...')) {\n segmentName = '*' + paramName.slice(3);\n } else {\n segmentName = ':' + paramName;\n }\n\n const routePath = '/' + [...parentSegments, segmentName].join('/');\n\n routes.appRoutes.push({\n type: RouteType.PAGE,\n path: routePath.replace(/\\/+/g, '/'),\n filePath: fullPath,\n pattern: createRoutePattern(routePath),\n segments: [...parentSegments, segmentName],\n layout: specialFiles.layout || parentLayout,\n loading: specialFiles.loading,\n error: specialFiles.error,\n notFound: specialFiles.notFound,\n template: specialFiles.template,\n middleware: specialFiles.middleware || parentMiddleware,\n isServerComponent: isServerComponent(fullPath),\n isClientComponent: isClientComponent(fullPath),\n isIsland: isIsland(fullPath),\n });\n }\n }\n }\n\n // If there's a page.tsx, create a route for this directory\n if (specialFiles.page) {\n const routePath = '/' + parentSegments.join('/') || '/';\n\n routes.appRoutes.push({\n type: RouteType.PAGE,\n path: routePath.replace(/\\/+/g, '/') || '/',\n filePath: specialFiles.page,\n pattern: createRoutePattern(routePath || '/'),\n segments: parentSegments,\n layout: specialFiles.layout || parentLayout,\n loading: specialFiles.loading,\n error: specialFiles.error,\n notFound: specialFiles.notFound,\n template: specialFiles.template,\n middleware: specialFiles.middleware || parentMiddleware,\n isServerComponent: isServerComponent(specialFiles.page),\n isClientComponent: isClientComponent(specialFiles.page),\n isIsland: isIsland(specialFiles.page),\n });\n }\n\n // Recursively scan subdirectories\n for (const entry of entries) {\n if (entry.isDirectory()) {\n const fullPath = path.join(currentDir, entry.name);\n\n // Skip special directories\n if (entry.name.startsWith('_') || entry.name.startsWith('.')) continue;\n\n // Handle route groups (parentheses) — don't add to URL\n const isGroup = entry.name.startsWith('(') && entry.name.endsWith(')');\n\n // Handle dynamic segments [param]\n let segmentName = entry.name;\n if (entry.name.startsWith('[') && entry.name.endsWith(']')) {\n segmentName = ':' + entry.name.slice(1, -1);\n if (entry.name.startsWith('[...')) {\n segmentName = '*' + entry.name.slice(4, -1);\n }\n if (entry.name.startsWith('[[...')) {\n segmentName = '*' + entry.name.slice(5, -2);\n }\n }\n\n const newSegments = isGroup ? parentSegments : [...parentSegments, segmentName];\n const newLayout = specialFiles.layout || parentLayout;\n const newMiddleware = specialFiles.middleware || parentMiddleware;\n\n scanAppDirectory(baseDir, fullPath, routes, newSegments, newLayout, newMiddleware);\n }\n }\n}\n\n// ============================================================================\n// API Directory Scanner (server/api/)\n// ============================================================================\n\nfunction scanApiDirectory(baseDir: string, currentDir: string, routes: any, parentSegments: string[] = []) {\n const entries = fs.readdirSync(currentDir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = path.join(currentDir, entry.name);\n\n if (entry.isDirectory()) {\n scanApiDirectory(baseDir, fullPath, routes, [...parentSegments, entry.name]);\n } else if (entry.isFile()) {\n const ext = path.extname(entry.name);\n if (!['.ts', '.js'].includes(ext)) continue;\n\n const baseName = path.basename(entry.name, ext);\n // route.ts maps to the parent path, other names become segments\n const apiSegments = baseName === 'route' || baseName === 'index'\n ? parentSegments\n : [...parentSegments, baseName];\n\n const apiPath = '/api/' + apiSegments.join('/');\n\n routes.api.push({\n type: RouteType.API,\n path: apiPath.replace(/\\/+/g, '/') || '/api',\n filePath: fullPath,\n pattern: createRoutePattern(apiPath),\n segments: ['api', ...apiSegments].filter(Boolean),\n });\n }\n }\n}\n\n// ============================================================================\n// Route Matching\n// ============================================================================\n\n/**\n * Creates regex pattern for route matching\n */\nfunction createRoutePattern(routePath: string): RegExp {\n let pattern = routePath\n .replace(/\\*[^/]*/g, '(.*)') // Catch-all\n .replace(/:[^/]+/g, '([^/]+)') // Dynamic segments\n .replace(/\\//g, '\\\\/');\n\n return new RegExp(`^${pattern}$`);\n}\n\n/**\n * Matches URL path against routes\n */\nexport function matchRoute(urlPath: string, routes: any[]) {\n const normalizedPath = urlPath === '' ? '/' : urlPath.split('?')[0];\n\n for (const route of routes) {\n const match = normalizedPath.match(route.pattern);\n if (match) {\n const params = extractParams(route.path, match);\n return { ...route, params };\n }\n }\n\n return null;\n}\n\n/**\n * Extracts parameters from route match\n */\nfunction extractParams(routePath: string, match: RegExpMatchArray): Record<string, string> {\n const params: Record<string, string> = {};\n const paramNames: string[] = [];\n\n const paramRegex = /:([^/]+)|\\*([^/]*)/g;\n let paramMatch;\n while ((paramMatch = paramRegex.exec(routePath)) !== null) {\n paramNames.push(paramMatch[1] || paramMatch[2] || 'splat');\n }\n\n paramNames.forEach((name, index) => {\n params[name] = match[index + 1];\n });\n\n return params;\n}\n\n// ============================================================================\n// Layout Resolution\n// ============================================================================\n\n/**\n * Finds all layouts that apply to a route\n */\nexport function findRouteLayouts(route: any, layoutsMap: Map<string, string>): Array<{ name: string; filePath: string | undefined }> {\n const layouts: Array<{ name: string; filePath: string | undefined }> = [];\n\n // Check for segment-based layouts\n for (const segment of route.segments) {\n if (layoutsMap.has(segment)) {\n layouts.push({ name: segment, filePath: layoutsMap.get(segment) });\n }\n }\n\n // Check for route-specific layout\n if (route.layout) {\n layouts.push({ name: 'route', filePath: route.layout });\n }\n\n // Check for root layout\n if (layoutsMap.has('root')) {\n layouts.unshift({ name: 'root', filePath: layoutsMap.get('root') });\n }\n\n return layouts;\n}\n\n// ============================================================================\n// Tree Building\n// ============================================================================\n\nfunction buildTree(routes: any[]): any {\n const tree: any = { children: {}, routes: [] };\n\n for (const route of routes) {\n let current = tree;\n for (const segment of route.segments) {\n if (!current.children[segment]) {\n current.children[segment] = { children: {}, routes: [] };\n }\n current = current.children[segment];\n }\n current.routes.push(route);\n }\n\n return tree;\n}\n\n// ============================================================================\n// Default Export\n// ============================================================================\n\nexport default {\n buildRouteTree,\n matchRoute,\n findRouteLayouts,\n RouteType\n};\n","/**\n * Velix version — single source of truth.\n * Update this file only when releasing a new version.\n */\nexport const VERSION = '5.1.4';\n","/**\n * Velix v5 Logger\n * Minimalist, professional output inspired by modern CLIs\n */\n\nimport { VERSION } from './version.js';\n\nconst colors = {\n reset: '\\x1b[0m',\n bold: '\\x1b[1m',\n dim: '\\x1b[2m',\n red: '\\x1b[31m',\n green: '\\x1b[32m',\n yellow: '\\x1b[33m',\n blue: '\\x1b[34m',\n magenta: '\\x1b[35m',\n cyan: '\\x1b[36m',\n white: '\\x1b[37m',\n gray: '\\x1b[90m',\n};\n\nconst c = colors;\n\nfunction getTime() {\n const now = new Date();\n const hours = String(now.getHours()).padStart(2, '0');\n const minutes = String(now.getMinutes()).padStart(2, '0');\n const seconds = String(now.getSeconds()).padStart(2, '0');\n return `${c.dim}${hours}:${minutes}:${seconds}${c.reset}`;\n}\n\nfunction getStatusColor(status: number) {\n if (status >= 500) return c.red;\n if (status >= 400) return c.yellow;\n if (status >= 300) return c.cyan;\n if (status >= 200) return c.green;\n return c.white;\n}\n\nfunction fmtTime(ms: number) {\n if (ms < 1) return `${c.gray}<1ms${c.reset}`;\n if (ms < 100) return `${c.green}${ms}ms${c.reset}`;\n if (ms < 500) return `${c.yellow}${ms}ms${c.reset}`;\n return `${c.red}${ms}ms${c.reset}`;\n}\n\nconst LOGO = `\n ${c.cyan}▲${c.reset} ${c.bold}Velix${c.reset} ${c.dim}v${VERSION}${c.reset}\n`;\n\nexport const logger = {\n logo() {\n console.log(LOGO);\n console.log(`${c.dim} ──────────────────────────────────────────────${c.reset}`);\n console.log('');\n },\n\n serverStart(config: any, startTime = Date.now()) {\n const { port, host, mode, pagesDir } = config;\n const elapsed = Date.now() - startTime;\n\n console.log(LOGO);\n console.log(` ${c.green}✔${c.reset} ${c.bold}Ready${c.reset} in ${elapsed}ms`);\n console.log('');\n console.log(` ${c.bold}Local:${c.reset} ${c.cyan}http://${host}:${port}${c.reset}`);\n console.log(` ${c.bold}Mode:${c.reset} ${mode === 'development' ? c.yellow : c.green}${mode}${c.reset}`);\n if (pagesDir) console.log(` ${c.bold}App:${c.reset} ${c.dim}${pagesDir}${c.reset}`);\n console.log('');\n },\n\n request(method: string, path: string, status: number, time: number, extra: { type?: string } = {}) {\n const statusColor = getStatusColor(status);\n const timeStr = fmtTime(time);\n\n let badge = `${c.dim}○${c.reset}`;\n if (extra.type === 'dynamic' || extra.type === 'ssr') badge = `${c.white}ƒ${c.reset}`;\n else if (extra.type === 'api') badge = `${c.cyan}λ${c.reset}`;\n\n const statusStr = `${statusColor}${status}${c.reset}`;\n console.log(` ${badge} ${c.white}${method}${c.reset} ${path} ${statusStr} ${c.dim}${timeStr}${c.reset}`);\n },\n\n info(msg: string) { console.log(` ${c.cyan}ℹ${c.reset} ${msg}`); },\n success(msg: string) { console.log(` ${c.green}✔${c.reset} ${msg}`); },\n warn(msg: string) { console.log(` ${c.yellow}⚠${c.reset} ${c.yellow}${msg}${c.reset}`); },\n\n error(msg: string, err: Error | null = null) {\n console.log(` ${c.red}✖${c.reset} ${c.red}${msg}${c.reset}`);\n if (err?.stack) {\n console.log('');\n console.log(`${c.dim}${err.stack.split('\\n').slice(1, 4).join('\\n')}${c.reset}`);\n console.log('');\n }\n },\n\n compile(file: string, time: number) {\n console.log(` ${c.white}●${c.reset} Compiling ${c.dim}${file}${c.reset} ${c.dim}(${time}ms)${c.reset}`);\n },\n\n hmr(file: string) {\n console.log(` ${c.green}↻${c.reset} Fast Refresh ${c.dim}${file}${c.reset}`);\n },\n\n plugin(name: string) {\n console.log(` ${c.cyan}◆${c.reset} Plugin ${c.dim}${name}${c.reset}`);\n },\n\n route(path: string, type: string) {\n const typeLabel = type === 'api' ? 'λ' : type === 'dynamic' ? 'ƒ' : '○';\n const color = type === 'api' ? c.cyan : type === 'dynamic' ? c.white : c.dim;\n console.log(` ${color}${typeLabel}${c.reset} ${path}`);\n },\n\n divider() { console.log(`${c.dim} ──────────────────────────────────────────────${c.reset}`); },\n blank() { console.log(''); },\n\n portInUse(port: number | string) {\n this.error(`Port ${port} is already in use.`);\n this.blank();\n console.log(` ${c.dim}Try:${c.reset}`);\n console.log(` 1. Kill the process on port ${port}`);\n console.log(` 2. Use a different port via PORT env var`);\n this.blank();\n },\n\n build(stats: { time: number }) {\n this.blank();\n console.log(` ${c.green}✔${c.reset} Build completed`);\n this.blank();\n console.log(` ${c.dim}Total time:${c.reset} ${c.white}${stats.time}ms${c.reset}`);\n this.blank();\n },\n};\n\nexport default logger;\n"]}