juxscript 1.1.364 → 1.1.366

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.
@@ -3,44 +3,13 @@ export interface RouteInfo {
3
3
  name: string;
4
4
  file: string;
5
5
  }
6
- declare class Router {
7
- private _srcDir;
8
- private _routes;
9
- constructor();
10
- /**
11
- * Try juxconfig.js for srcDir, default to 'jux'
12
- */
13
- private _resolveSrcDir;
14
- /**
15
- * Recursively scan srcDir for .jux files
16
- */
17
- private _scan;
18
- /**
19
- * Convert file path to route path
20
- * index.jux -> /
21
- * about.jux -> /about
22
- * blog/post.jux -> /blog/post
23
- * settings/index.jux -> /settings
24
- */
25
- private _fileToRoute;
26
- /**
27
- * Derive display name from route path
28
- */
29
- private _nameFromRoute;
30
- /**
31
- * Get ALL .jux file routes from the source directory
32
- */
6
+ export declare const routes: {
33
7
  all(): RouteInfo[];
34
- /**
35
- * Get just the route paths
36
- */
37
8
  paths(): string[];
38
- /**
39
- * Force rescan (e.g. after files change)
40
- */
41
- refresh(): this;
42
- }
43
- export declare function routes(): Router;
44
- export { Router };
9
+ current(): string;
10
+ isActive(path: string): boolean;
11
+ navigate(path: string): void;
12
+ onNavigate(callback: (path: string) => void): () => void;
13
+ };
45
14
  export default routes;
46
15
  //# sourceMappingURL=routes.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../lib/components/routes.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,SAAS;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CAChB;AAED,cAAM,MAAM;IACR,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,OAAO,CAA4B;;IAM3C;;OAEG;IACH,OAAO,CAAC,cAAc;IAiBtB;;OAEG;IACH,OAAO,CAAC,KAAK;IAsBb;;;;;;OAMG;IACH,OAAO,CAAC,YAAY;IAqBpB;;OAEG;IACH,OAAO,CAAC,cAAc;IAStB;;OAEG;IACH,GAAG,IAAI,SAAS,EAAE;IAOlB;;OAEG;IACH,KAAK,IAAI,MAAM,EAAE;IAIjB;;OAEG;IACH,OAAO,IAAI,IAAI;CAIlB;AAKD,wBAAgB,MAAM,WAErB;AAED,OAAO,EAAE,MAAM,EAAE,CAAC;AAClB,eAAe,MAAM,CAAC"}
1
+ {"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../lib/components/routes.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,SAAS;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CAChB;AAQD,eAAO,MAAM,MAAM;WACR,SAAS,EAAE;aAGT,MAAM,EAAE;eAGN,MAAM;mBAGF,MAAM,GAAG,OAAO;mBAGhB,MAAM,GAAG,IAAI;yBAIP,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,MAAM,IAAI;CAM3D,CAAC;AAEF,eAAe,MAAM,CAAC"}
@@ -1,113 +1,34 @@
1
- import fs from 'fs';
2
- import path from 'path';
3
- class Router {
4
- constructor() {
5
- this._routes = null;
6
- this._srcDir = this._resolveSrcDir();
7
- }
8
- /**
9
- * Try juxconfig.js for srcDir, default to 'jux'
10
- */
11
- _resolveSrcDir() {
12
- const projectRoot = process.cwd();
13
- const configPath = path.resolve(projectRoot, 'juxconfig.js');
14
- if (fs.existsSync(configPath)) {
15
- try {
16
- const configContent = fs.readFileSync(configPath, 'utf8');
17
- const srcDirMatch = configContent.match(/srcDir\s*:\s*['"]([^'"]+)['"]/);
18
- if (srcDirMatch) {
19
- return path.resolve(projectRoot, srcDirMatch[1]);
20
- }
21
- }
22
- catch (_) { }
23
- }
24
- return path.resolve(projectRoot, 'jux');
25
- }
26
- /**
27
- * Recursively scan srcDir for .jux files
28
- */
29
- _scan(dir, routes = []) {
30
- if (!fs.existsSync(dir))
31
- return routes;
32
- const entries = fs.readdirSync(dir, { withFileTypes: true });
33
- for (const entry of entries) {
34
- const fullPath = path.join(dir, entry.name);
35
- if (entry.isDirectory()) {
36
- this._scan(fullPath, routes);
37
- }
38
- else if (entry.isFile() && entry.name.endsWith('.jux')) {
39
- const relativePath = path.relative(this._srcDir, fullPath).replace(/\\/g, '/');
40
- const routePath = this._fileToRoute(relativePath);
41
- const name = this._nameFromRoute(routePath);
42
- routes.push({ path: routePath, name, file: relativePath });
43
- }
44
- }
45
- return routes;
46
- }
47
- /**
48
- * Convert file path to route path
49
- * index.jux -> /
50
- * about.jux -> /about
51
- * blog/post.jux -> /blog/post
52
- * settings/index.jux -> /settings
53
- */
54
- _fileToRoute(filePath) {
55
- let route = filePath
56
- .replace(/\.jux$/, '')
57
- .toLowerCase()
58
- .replace(/\s+/g, '-')
59
- .replace(/[^a-z0-9\/_-]/g, '')
60
- .replace(/-+/g, '-')
61
- .replace(/^-|-$/g, '');
62
- // folder/index -> /folder
63
- if (route.endsWith('/index')) {
64
- route = route.slice(0, -6);
65
- }
66
- if (route === 'index' || route === '') {
67
- return '/';
68
- }
69
- return '/' + route;
70
- }
71
- /**
72
- * Derive display name from route path
73
- */
74
- _nameFromRoute(routePath) {
75
- if (routePath === '/')
76
- return 'Home';
77
- const seg = routePath.split('/').filter(Boolean).pop() || 'Home';
78
- return seg
79
- .split('-')
80
- .map(s => s.charAt(0).toUpperCase() + s.slice(1))
81
- .join(' ');
82
- }
83
- /**
84
- * Get ALL .jux file routes from the source directory
85
- */
1
+ function _getData() {
2
+ const w = typeof window !== 'undefined' ? window : null;
3
+ if (!w?.__juxRouteIndex)
4
+ return [];
5
+ return w.__juxRouteIndex;
6
+ }
7
+ export const routes = {
86
8
  all() {
87
- if (!this._routes) {
88
- this._routes = this._scan(this._srcDir);
89
- }
90
- return this._routes;
91
- }
92
- /**
93
- * Get just the route paths
94
- */
9
+ return _getData();
10
+ },
95
11
  paths() {
96
- return this.all().map(r => r.path);
97
- }
98
- /**
99
- * Force rescan (e.g. after files change)
100
- */
101
- refresh() {
102
- this._routes = null;
103
- return this;
104
- }
105
- }
106
- // Singleton
107
- const router = new Router();
108
- export function routes() {
109
- return router;
110
- }
111
- export { Router };
12
+ return _getData().map(r => r.path);
13
+ },
14
+ current() {
15
+ return typeof window !== 'undefined' ? window.location.pathname : '/';
16
+ },
17
+ isActive(path) {
18
+ return routes.current() === path;
19
+ },
20
+ navigate(path) {
21
+ const w = typeof window !== 'undefined' ? window : null;
22
+ if (w?.navigateTo)
23
+ w.navigateTo(path);
24
+ },
25
+ onNavigate(callback) {
26
+ if (typeof window === 'undefined')
27
+ return () => { };
28
+ const handler = () => callback(window.location.pathname);
29
+ window.addEventListener('popstate', handler);
30
+ return () => window.removeEventListener('popstate', handler);
31
+ }
32
+ };
112
33
  export default routes;
113
34
  //# sourceMappingURL=routes.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"routes.js","sourceRoot":"","sources":["../../lib/components/routes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AAQxB,MAAM,MAAM;IAIR;QAFQ,YAAO,GAAuB,IAAI,CAAC;QAGvC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;IACzC,CAAC;IAED;;OAEG;IACK,cAAc;QAClB,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QAClC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;QAE7D,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC5B,IAAI,CAAC;gBACD,MAAM,aAAa,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;gBAC1D,MAAM,WAAW,GAAG,aAAa,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;gBACzE,IAAI,WAAW,EAAE,CAAC;oBACd,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;gBACrD,CAAC;YACL,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC,CAAA,CAAC;QAClB,CAAC;QAED,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IAC5C,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,GAAW,EAAE,SAAsB,EAAE;QAC/C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,OAAO,MAAM,CAAC;QAEvC,MAAM,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAE7D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC1B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YAE5C,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACtB,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YACjC,CAAC;iBAAM,IAAI,KAAK,CAAC,MAAM,EAAE,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBACvD,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;gBAC/E,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;gBAClD,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;gBAE5C,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC;YAC/D,CAAC;QACL,CAAC;QAED,OAAO,MAAM,CAAC;IAClB,CAAC;IAED;;;;;;OAMG;IACK,YAAY,CAAC,QAAgB;QACjC,IAAI,KAAK,GAAG,QAAQ;aACf,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;aACrB,WAAW,EAAE;aACb,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;aACpB,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC;aAC7B,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;aACnB,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QAE3B,0BAA0B;QAC1B,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC3B,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC/B,CAAC;QAED,IAAI,KAAK,KAAK,OAAO,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;YACpC,OAAO,GAAG,CAAC;QACf,CAAC;QAED,OAAO,GAAG,GAAG,KAAK,CAAC;IACvB,CAAC;IAED;;OAEG;IACK,cAAc,CAAC,SAAiB;QACpC,IAAI,SAAS,KAAK,GAAG;YAAE,OAAO,MAAM,CAAC;QACrC,MAAM,GAAG,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,IAAI,MAAM,CAAC;QACjE,OAAO,GAAG;aACL,KAAK,CAAC,GAAG,CAAC;aACV,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;aAChD,IAAI,CAAC,GAAG,CAAC,CAAC;IACnB,CAAC;IAED;;OAEG;IACH,GAAG;QACC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAChB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC5C,CAAC;QACD,OAAO,IAAI,CAAC,OAAO,CAAC;IACxB,CAAC;IAED;;OAEG;IACH,KAAK;QACD,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACvC,CAAC;IAED;;OAEG;IACH,OAAO;QACH,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,OAAO,IAAI,CAAC;IAChB,CAAC;CACJ;AAED,YAAY;AACZ,MAAM,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;AAE5B,MAAM,UAAU,MAAM;IAClB,OAAO,MAAM,CAAC;AAClB,CAAC;AAED,OAAO,EAAE,MAAM,EAAE,CAAC;AAClB,eAAe,MAAM,CAAC"}
1
+ {"version":3,"file":"routes.js","sourceRoot":"","sources":["../../lib/components/routes.ts"],"names":[],"mappings":"AAMA,SAAS,QAAQ;IACb,MAAM,CAAC,GAAG,OAAO,MAAM,KAAK,WAAW,CAAC,CAAC,CAAE,MAAc,CAAC,CAAC,CAAC,IAAI,CAAC;IACjE,IAAI,CAAC,CAAC,EAAE,eAAe;QAAE,OAAO,EAAE,CAAC;IACnC,OAAO,CAAC,CAAC,eAAe,CAAC;AAC7B,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAG;IAClB,GAAG;QACC,OAAO,QAAQ,EAAE,CAAC;IACtB,CAAC;IACD,KAAK;QACD,OAAO,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACvC,CAAC;IACD,OAAO;QACH,OAAO,OAAO,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC;IAC1E,CAAC;IACD,QAAQ,CAAC,IAAY;QACjB,OAAO,MAAM,CAAC,OAAO,EAAE,KAAK,IAAI,CAAC;IACrC,CAAC;IACD,QAAQ,CAAC,IAAY;QACjB,MAAM,CAAC,GAAG,OAAO,MAAM,KAAK,WAAW,CAAC,CAAC,CAAE,MAAc,CAAC,CAAC,CAAC,IAAI,CAAC;QACjE,IAAI,CAAC,EAAE,UAAU;YAAE,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IAC1C,CAAC;IACD,UAAU,CAAC,QAAgC;QACvC,IAAI,OAAO,MAAM,KAAK,WAAW;YAAE,OAAO,GAAG,EAAE,GAAG,CAAC,CAAC;QACpD,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACzD,MAAM,CAAC,gBAAgB,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAC7C,OAAO,GAAG,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IACjE,CAAC;CACJ,CAAC;AAEF,eAAe,MAAM,CAAC"}
package/dist/index.d.ts CHANGED
@@ -64,7 +64,14 @@ export declare const jux: {
64
64
  a: typeof a;
65
65
  container: typeof container;
66
66
  grid: typeof grid;
67
- routes: typeof routes;
67
+ routes: {
68
+ all(): import("./components/routes.js").RouteInfo[];
69
+ paths(): string[];
70
+ current(): string;
71
+ isActive(path: string): boolean;
72
+ navigate(path: string): void;
73
+ onNavigate(callback: (path: string) => void): () => void;
74
+ };
68
75
  };
69
76
  export { pageState };
70
77
  export { routes };
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../lib/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAC3F,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAClD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC3I,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClD,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAC9C,OAAO,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAC;AAC1C,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,sBAAsB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAEhD,eAAO,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0Cf,CAAC;AAEF,OAAO,EAAE,SAAS,EAAE,CAAC;AACrB,OAAO,EAAE,MAAM,EAAE,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../lib/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAC3F,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAClD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC3I,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClD,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAC9C,OAAO,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAC;AAC1C,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,sBAAsB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAEhD,eAAO,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0Cf,CAAC;AAEF,OAAO,EAAE,SAAS,EAAE,CAAC;AACrB,OAAO,EAAE,MAAM,EAAE,CAAC"}
@@ -644,6 +644,21 @@ export class JuxCompiler {
644
644
 
645
645
  router += `};\n\n`;
646
646
 
647
+ // Build route index for jux.routes.all()
648
+ const routeIndex = [];
649
+ routeToFunctionMap.forEach((functionName, routePath) => {
650
+ const name = routePath === '/'
651
+ ? 'Home'
652
+ : routePath.split('/').filter(Boolean).pop()
653
+ .split('-').map(s => s.charAt(0).toUpperCase() + s.slice(1)).join(' ');
654
+ // Find matching source file from snapshot
655
+ const sourceFile = this._sourceSnapshot
656
+ ? Object.values(this._sourceSnapshot).find(s => s.functionName === functionName)
657
+ : null;
658
+ routeIndex.push({ path: routePath, name, file: sourceFile?.file || '' });
659
+ });
660
+ router += `window.__juxRouteIndex = ${JSON.stringify(routeIndex)};\n\n`;
661
+
647
662
  router += `function route(path) {
648
663
  const renderFn = routes[path] || routes['/'];
649
664
  if (renderFn) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "juxscript",
3
- "version": "1.1.364",
3
+ "version": "1.1.366",
4
4
  "type": "module",
5
5
  "description": "A JavaScript UX authorship platform",
6
6
  "main": "./dist/lib/index.js",