@toyz/loom 0.2.0 → 0.3.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.
package/dist/index.d.ts CHANGED
@@ -24,6 +24,6 @@ export type { VirtualListOptions } from "./element";
24
24
  export { transform, createTransform, typed, typedTransformer, toNumber, toBoolean, toDate, toJSON, toTrimmed, toInt, toFloat, } from "./transform";
25
25
  export type { TransformSchema } from "./transform";
26
26
  export { on, emit, createDecorator } from "./decorators";
27
- export { LoomRouter, RouteChanged, route, guard, matchRoute, routes, LoomOutlet, LoomLink, HashMode, HistoryMode, } from "./router";
28
- export type { RouterMode, RouterOptions, RouteInfo, RouteEntry } from "./router";
27
+ export { LoomRouter, RouteChanged, route, guard, group, matchRoute, routes, LoomOutlet, LoomLink, HashMode, HistoryMode, } from "./router";
28
+ export type { RouterMode, RouterOptions, RouteInfo, RouteEntry, GroupMeta } from "./router";
29
29
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAC5B,YAAY,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAGrC,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAC9C,YAAY,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAGlD,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAC5B,YAAY,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAGtC,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAGhC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAGpD,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,YAAY,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAKhD,OAAO,EACL,QAAQ,EAAE,eAAe,EACzB,aAAa,EAAE,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,aAAa,EACvE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAC5C,KAAK,GACN,MAAM,SAAS,CAAC;AACjB,YAAY,EACV,UAAU,EAAE,OAAO,EAAE,YAAY,EACjC,cAAc,EAAE,aAAa,EAAE,cAAc,GAC9C,MAAM,SAAS,CAAC;AAGjB,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAChD,OAAO,EAAE,KAAK,IAAI,YAAY,EAAE,MAAM,MAAM,CAAC;AAG7C,OAAO,EACL,WAAW,EACX,SAAS,EAAE,KAAK,EAAE,QAAQ,EAC1B,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAC/B,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,cAAc,GACtD,MAAM,WAAW,CAAC;AACnB,YAAY,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAGpD,OAAO,EACL,SAAS,EAAE,eAAe,EAC1B,KAAK,EAAE,gBAAgB,EACvB,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,GAC/D,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAGnD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAGzD,OAAO,EACL,UAAU,EACV,YAAY,EACZ,KAAK,EACL,KAAK,EACL,UAAU,EACV,MAAM,EACN,UAAU,EACV,QAAQ,EACR,QAAQ,EACR,WAAW,GACZ,MAAM,UAAU,CAAC;AAClB,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAC5B,YAAY,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAGrC,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAC9C,YAAY,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAGlD,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAC5B,YAAY,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAGtC,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAGhC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAGpD,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,YAAY,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAKhD,OAAO,EACL,QAAQ,EAAE,eAAe,EACzB,aAAa,EAAE,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,aAAa,EACvE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAC5C,KAAK,GACN,MAAM,SAAS,CAAC;AACjB,YAAY,EACV,UAAU,EAAE,OAAO,EAAE,YAAY,EACjC,cAAc,EAAE,aAAa,EAAE,cAAc,GAC9C,MAAM,SAAS,CAAC;AAGjB,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAChD,OAAO,EAAE,KAAK,IAAI,YAAY,EAAE,MAAM,MAAM,CAAC;AAG7C,OAAO,EACL,WAAW,EACX,SAAS,EAAE,KAAK,EAAE,QAAQ,EAC1B,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAC/B,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,cAAc,GACtD,MAAM,WAAW,CAAC;AACnB,YAAY,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAGpD,OAAO,EACL,SAAS,EAAE,eAAe,EAC1B,KAAK,EAAE,gBAAgB,EACvB,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,GAC/D,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAGnD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAGzD,OAAO,EACL,UAAU,EACV,YAAY,EACZ,KAAK,EACL,KAAK,EACL,KAAK,EACL,UAAU,EACV,MAAM,EACN,UAAU,EACV,QAAQ,EACR,QAAQ,EACR,WAAW,GACZ,MAAM,UAAU,CAAC;AAClB,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC"}
package/dist/index.js CHANGED
@@ -30,5 +30,5 @@ export { transform, createTransform, typed, typedTransformer, toNumber, toBoolea
30
30
  // Decorators: event decorators + factory
31
31
  export { on, emit, createDecorator } from "./decorators";
32
32
  // Router
33
- export { LoomRouter, RouteChanged, route, guard, matchRoute, routes, LoomOutlet, LoomLink, HashMode, HistoryMode, } from "./router";
33
+ export { LoomRouter, RouteChanged, route, guard, group, matchRoute, routes, LoomOutlet, LoomLink, HashMode, HistoryMode, } from "./router";
34
34
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,kBAAkB;AAClB,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAG5B,eAAe;AACf,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAG9C,MAAM;AACN,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAG5B,eAAe;AACf,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAEhC,wDAAwD;AACxD,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEpD,cAAc;AACd,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAG3C,0BAA0B;AAE1B,qCAAqC;AACrC,OAAO,EACL,QAAQ,EAAE,eAAe,EACzB,aAAa,EAAE,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,aAAa,EACvE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAC5C,KAAK,GACN,MAAM,SAAS,CAAC;AAMjB,mCAAmC;AACnC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAChD,OAAO,EAAE,KAAK,IAAI,YAAY,EAAE,MAAM,MAAM,CAAC;AAE7C,0CAA0C;AAC1C,OAAO,EACL,WAAW,EACX,SAAS,EAAE,KAAK,EAAE,QAAQ,EAC1B,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAC/B,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,cAAc,GACtD,MAAM,WAAW,CAAC;AAGnB,8BAA8B;AAC9B,OAAO,EACL,SAAS,EAAE,eAAe,EAC1B,KAAK,EAAE,gBAAgB,EACvB,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,GAC/D,MAAM,aAAa,CAAC;AAGrB,yCAAyC;AACzC,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAEzD,SAAS;AACT,OAAO,EACL,UAAU,EACV,YAAY,EACZ,KAAK,EACL,KAAK,EACL,UAAU,EACV,MAAM,EACN,UAAU,EACV,QAAQ,EACR,QAAQ,EACR,WAAW,GACZ,MAAM,UAAU,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,kBAAkB;AAClB,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAG5B,eAAe;AACf,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAG9C,MAAM;AACN,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAG5B,eAAe;AACf,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAEhC,wDAAwD;AACxD,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEpD,cAAc;AACd,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAG3C,0BAA0B;AAE1B,qCAAqC;AACrC,OAAO,EACL,QAAQ,EAAE,eAAe,EACzB,aAAa,EAAE,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,aAAa,EACvE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAC5C,KAAK,GACN,MAAM,SAAS,CAAC;AAMjB,mCAAmC;AACnC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAChD,OAAO,EAAE,KAAK,IAAI,YAAY,EAAE,MAAM,MAAM,CAAC;AAE7C,0CAA0C;AAC1C,OAAO,EACL,WAAW,EACX,SAAS,EAAE,KAAK,EAAE,QAAQ,EAC1B,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAC/B,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,cAAc,GACtD,MAAM,WAAW,CAAC;AAGnB,8BAA8B;AAC9B,OAAO,EACL,SAAS,EAAE,eAAe,EAC1B,KAAK,EAAE,gBAAgB,EACvB,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,GAC/D,MAAM,aAAa,CAAC;AAGrB,yCAAyC;AACzC,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAEzD,SAAS;AACT,OAAO,EACL,UAAU,EACV,YAAY,EACZ,KAAK,EACL,KAAK,EACL,KAAK,EACL,UAAU,EACV,MAAM,EACN,UAAU,EACV,QAAQ,EACR,QAAQ,EACR,WAAW,GACZ,MAAM,UAAU,CAAC"}
@@ -3,14 +3,46 @@
3
3
  *
4
4
  * @route(path, opts?) — registers a component class as a route handler.
5
5
  * @guard(name?) — marks a method as a named route guard.
6
+ * @group(prefix, opts?) — marks a class as a route group with prefix + guards.
6
7
  *
7
8
  * Both use createDecorator as their foundation.
8
9
  */
9
10
  export declare const ROUTE_PATH: unique symbol;
10
11
  export declare const GUARD_HANDLERS: unique symbol;
12
+ interface GroupOptions {
13
+ /** Named guards to check before rendering any route in this group */
14
+ guards?: string[];
15
+ }
16
+ /**
17
+ * Mark a class as a route group.
18
+ *
19
+ * Groups provide a path prefix and optional guards for child routes.
20
+ * Stacks with @route — the group class can also be a route (layout page).
21
+ *
22
+ * ```ts
23
+ * @group("/user/:profile", { guards: ["auth"] })
24
+ * @route("/")
25
+ * @component("user-layout")
26
+ * class UserLayout extends LoomElement {
27
+ * update() {
28
+ * return <div><loom-outlet /></div>;
29
+ * }
30
+ * }
31
+ *
32
+ * @route("/settings", { group: UserLayout })
33
+ * @component("user-settings")
34
+ * class UserSettings extends LoomElement { }
35
+ * // → resolves to /user/:profile/settings, inherits "auth" guard
36
+ * ```
37
+ */
38
+ export declare const group: (prefix: string, opts?: GroupOptions | undefined) => (ctor: any) => void;
11
39
  interface RouteOptions {
12
40
  /** Named guards to check before this route is rendered */
13
41
  guards?: string[];
42
+ /** Group constructor this route belongs to */
43
+ group?: any;
44
+ /** Named route identifier for programmatic navigation */
45
+ name?: string;
14
46
  }
15
47
  /**
16
48
  * Register a class as a route handler.
@@ -23,6 +55,10 @@ interface RouteOptions {
23
55
  * @route("/admin", { guards: ["auth", "role"] })
24
56
  * @component("page-admin")
25
57
  * class PageAdmin extends LoomElement { ... }
58
+ *
59
+ * @route("/settings", { group: UserLayout })
60
+ * @component("user-settings")
61
+ * class UserSettings extends LoomElement { }
26
62
  * ```
27
63
  */
28
64
  export declare const route: (pattern: string, opts?: RouteOptions | undefined) => (ctor: any) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"decorators.d.ts","sourceRoot":"","sources":["../../src/router/decorators.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,eAAO,MAAM,UAAU,eAA4B,CAAC;AACpD,eAAO,MAAM,cAAc,eAA8B,CAAC;AAI1D,UAAU,YAAY;IACpB,0DAA0D;IAC1D,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,KAAK,2EAyBjB,CAAC;AAWF;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,KAAK,gEAVM,CAAC,6BAiBxB,CAAC"}
1
+ {"version":3,"file":"decorators.d.ts","sourceRoot":"","sources":["../../src/router/decorators.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,eAAO,MAAM,UAAU,eAA4B,CAAC;AACpD,eAAO,MAAM,cAAc,eAA8B,CAAC;AAI1D,UAAU,YAAY;IACpB,qEAAqE;IACrE,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,KAAK,0EAwBjB,CAAC;AA6BF,UAAU,YAAY;IACpB,0DAA0D;IAC1D,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,8CAA8C;IAC9C,KAAK,CAAC,EAAE,GAAG,CAAC;IACZ,yDAAyD;IACzD,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,KAAK,2EAiDjB,CAAC;AAWF;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,KAAK,gEA7IK,CAAA,6BAoJtB,CAAC"}
@@ -3,13 +3,78 @@
3
3
  *
4
4
  * @route(path, opts?) — registers a component class as a route handler.
5
5
  * @guard(name?) — marks a method as a named route guard.
6
+ * @group(prefix, opts?) — marks a class as a route group with prefix + guards.
6
7
  *
7
8
  * Both use createDecorator as their foundation.
8
9
  */
9
10
  import { createDecorator } from "../decorators/create";
10
- import { routes, guardRegistry, compilePattern } from "./route";
11
+ import { routes, routeByName, guardRegistry, compilePattern, GROUP_META, ROUTE_GROUP } from "./route";
11
12
  export const ROUTE_PATH = Symbol("loom:route:path");
12
13
  export const GUARD_HANDLERS = Symbol("loom:route:guards");
14
+ /**
15
+ * Mark a class as a route group.
16
+ *
17
+ * Groups provide a path prefix and optional guards for child routes.
18
+ * Stacks with @route — the group class can also be a route (layout page).
19
+ *
20
+ * ```ts
21
+ * @group("/user/:profile", { guards: ["auth"] })
22
+ * @route("/")
23
+ * @component("user-layout")
24
+ * class UserLayout extends LoomElement {
25
+ * update() {
26
+ * return <div><loom-outlet /></div>;
27
+ * }
28
+ * }
29
+ *
30
+ * @route("/settings", { group: UserLayout })
31
+ * @component("user-settings")
32
+ * class UserSettings extends LoomElement { }
33
+ * // → resolves to /user/:profile/settings, inherits "auth" guard
34
+ * ```
35
+ */
36
+ export const group = createDecorator((ctor, prefix, opts) => {
37
+ const meta = {
38
+ prefix,
39
+ guards: opts?.guards ?? [],
40
+ };
41
+ ctor[GROUP_META] = meta;
42
+ // Class decorators run bottom-up: @route may have already registered
43
+ // a route entry for this ctor. If so, AND the route belongs to a parent
44
+ // group, patch it with our prefix + guards. (Standalone @group + @route
45
+ // doesn't need patching — @route already has the correct pattern.)
46
+ const existing = routes.find((r) => r.ctor === ctor);
47
+ if (existing && ctor[ROUTE_GROUP]) {
48
+ const newPattern = existing.pattern + prefix;
49
+ const { regex, paramNames } = compilePattern(newPattern);
50
+ existing.pattern = newPattern;
51
+ existing.regex = regex;
52
+ existing.paramNames = paramNames;
53
+ existing.guards = [...meta.guards, ...existing.guards];
54
+ ctor[ROUTE_PATH] = newPattern;
55
+ }
56
+ }, { class: true });
57
+ // ── Group chain resolution ──
58
+ /**
59
+ * Walk the group chain from a constructor up through nested groups.
60
+ * Returns the combined prefix and guards in root → leaf order.
61
+ */
62
+ function resolveGroupChain(groupCtor) {
63
+ const chain = [];
64
+ let current = groupCtor;
65
+ while (current?.[GROUP_META]) {
66
+ chain.unshift(current[GROUP_META]);
67
+ // Walk up: if this group itself belongs to another group
68
+ current = current[ROUTE_GROUP];
69
+ }
70
+ let prefix = "";
71
+ let guards = [];
72
+ for (const g of chain) {
73
+ prefix += g.prefix;
74
+ guards = [...guards, ...g.guards];
75
+ }
76
+ return { prefix, guards };
77
+ }
13
78
  /**
14
79
  * Register a class as a route handler.
15
80
  *
@@ -21,22 +86,47 @@ export const GUARD_HANDLERS = Symbol("loom:route:guards");
21
86
  * @route("/admin", { guards: ["auth", "role"] })
22
87
  * @component("page-admin")
23
88
  * class PageAdmin extends LoomElement { ... }
89
+ *
90
+ * @route("/settings", { group: UserLayout })
91
+ * @component("user-settings")
92
+ * class UserSettings extends LoomElement { }
24
93
  * ```
25
94
  */
26
95
  export const route = createDecorator((ctor, pattern, opts) => {
27
- ctor[ROUTE_PATH] = pattern;
28
- const { regex, paramNames } = compilePattern(pattern);
96
+ // Resolve group chain if this route belongs to a group
97
+ let fullPattern = pattern;
98
+ let allGuards = opts?.guards ?? [];
99
+ if (opts?.group) {
100
+ const chain = resolveGroupChain(opts.group);
101
+ // Normalize: avoid double slashes when pattern is "/"
102
+ fullPattern = pattern === "/"
103
+ ? chain.prefix
104
+ : chain.prefix + pattern;
105
+ allGuards = [...chain.guards, ...allGuards];
106
+ // Store group parent ref for nested group resolution
107
+ ctor[ROUTE_GROUP] = opts.group;
108
+ }
109
+ ctor[ROUTE_PATH] = fullPattern;
110
+ const { regex, paramNames } = compilePattern(fullPattern);
29
111
  const entry = {
30
- pattern,
112
+ pattern: fullPattern,
31
113
  regex,
32
114
  paramNames,
33
115
  get tag() {
34
116
  return _tagForCtor(ctor);
35
117
  },
36
118
  ctor,
37
- guards: opts?.guards ?? [],
119
+ guards: allGuards,
120
+ name: opts?.name,
38
121
  };
39
- if (pattern === "*") {
122
+ // Register named route
123
+ if (opts?.name) {
124
+ if (routeByName.has(opts.name)) {
125
+ console.warn(`[Loom] Duplicate route name: "${opts.name}"`);
126
+ }
127
+ routeByName.set(opts.name, entry);
128
+ }
129
+ if (fullPattern === "*") {
40
130
  routes.push(entry);
41
131
  }
42
132
  else {
@@ -1 +1 @@
1
- {"version":3,"file":"decorators.js","sourceRoot":"","sources":["../../src/router/decorators.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,cAAc,EAAmB,MAAM,SAAS,CAAC;AAEjF,MAAM,CAAC,MAAM,UAAU,GAAG,MAAM,CAAC,iBAAiB,CAAC,CAAC;AACpD,MAAM,CAAC,MAAM,cAAc,GAAG,MAAM,CAAC,mBAAmB,CAAC,CAAC;AAS1D;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,KAAK,GAAG,eAAe,CAClC,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE;IACrB,IAAY,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC;IACpC,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IAEtD,MAAM,KAAK,GAAe;QACxB,OAAO;QACP,KAAK;QACL,UAAU;QACV,IAAI,GAAG;YACL,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC;QAC3B,CAAC;QACD,IAAI;QACJ,MAAM,EAAE,IAAI,EAAE,MAAM,IAAI,EAAE;KAC3B,CAAC;IAEF,IAAI,OAAO,KAAK,GAAG,EAAE,CAAC;QACpB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC;SAAM,CAAC;QACN,MAAM,WAAW,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,GAAG,CAAC,CAAC;QAC/D,IAAI,WAAW,KAAK,CAAC,CAAC;YAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;;YACtC,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;IAC5C,CAAC;AACH,CAAC,EACD,EAAE,KAAK,EAAE,IAAI,EAAE,CAChB,CAAC;AAEF,uDAAuD;AACvD,SAAS,WAAW,CAAC,IAAS;IAC5B,MAAM,IAAI,GAAI,cAAsB,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC;IACrD,IAAI,IAAI;QAAE,OAAO,IAAI,CAAC;IACtB,OAAQ,IAAY,CAAC,UAAU,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;AAC7D,CAAC;AAED,kEAAkE;AAElE;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,CAAC,MAAM,KAAK,GAAG,eAAe,CAClC,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;IACnB,MAAM,SAAS,GAAG,IAAI,IAAI,GAAG,CAAC;IAC9B,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC;QAAE,KAAK,CAAC,cAAc,CAAC,GAAG,EAAE,CAAC;IACvD,KAAK,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChC,aAAa,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;AAC/C,CAAC,CACF,CAAC"}
1
+ {"version":3,"file":"decorators.js","sourceRoot":"","sources":["../../src/router/decorators.ts"],"names":[],"mappings":"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"}
@@ -3,13 +3,14 @@
3
3
  */
4
4
  export { type RouterMode, HashMode, HistoryMode } from "./mode";
5
5
  export { RouteChanged } from "./events";
6
- export { matchRoute, routes, guardRegistry } from "./route";
7
- export type { RouteEntry, GuardRegistration } from "./route";
8
- export { route, guard, ROUTE_PATH, GUARD_HANDLERS } from "./decorators";
6
+ export { matchRoute, routes, guardRegistry, routeByName, buildPath } from "./route";
7
+ export type { RouteEntry, GuardRegistration, GroupMeta } from "./route";
8
+ export { GROUP_META, ROUTE_GROUP } from "./route";
9
+ export { route, guard, group, ROUTE_PATH, GUARD_HANDLERS } from "./decorators";
9
10
  export { params, routeQuery } from "../store/decorators";
10
11
  export { transform } from "../transform/transform";
11
12
  export { LoomRouter } from "./router";
12
- export type { RouterOptions, RouteInfo } from "./router";
13
+ export type { RouterOptions, RouteInfo, RouteTarget } from "./router";
13
14
  export { LoomOutlet } from "./outlet";
14
15
  export { LoomLink } from "./link";
15
16
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/router/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,KAAK,UAAU,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAGhE,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAGxC,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC5D,YAAY,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAG7D,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAGxE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAGnD,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAGzD,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/router/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,KAAK,UAAU,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAGhE,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAGxC,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpF,YAAY,EAAE,UAAU,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACxE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAGlD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAG/E,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAGnD,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAGtE,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC"}
@@ -6,9 +6,10 @@ export { HashMode, HistoryMode } from "./mode";
6
6
  // Events
7
7
  export { RouteChanged } from "./events";
8
8
  // Route table & matching
9
- export { matchRoute, routes, guardRegistry } from "./route";
9
+ export { matchRoute, routes, guardRegistry, routeByName, buildPath } from "./route";
10
+ export { GROUP_META, ROUTE_GROUP } from "./route";
10
11
  // Route decorators
11
- export { route, guard, ROUTE_PATH, GUARD_HANDLERS } from "./decorators";
12
+ export { route, guard, group, ROUTE_PATH, GUARD_HANDLERS } from "./decorators";
12
13
  // Route data sentinels (for @prop({params}) and @prop({query: routeQuery}))
13
14
  export { params, routeQuery } from "../store/decorators";
14
15
  export { transform } from "../transform/transform";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/router/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO;AACP,OAAO,EAAmB,QAAQ,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAEhE,SAAS;AACT,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAExC,yBAAyB;AACzB,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAG5D,mBAAmB;AACnB,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAExE,4EAA4E;AAC5E,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAEnD,iBAAiB;AACjB,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAGtC,aAAa;AACb,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/router/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO;AACP,OAAO,EAAmB,QAAQ,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAEhE,SAAS;AACT,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAExC,yBAAyB;AACzB,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEpF,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAElD,mBAAmB;AACnB,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE/E,4EAA4E;AAC5E,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAEnD,iBAAiB;AACjB,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAGtC,aAAa;AACb,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC"}
@@ -8,9 +8,15 @@
8
8
  import { LoomElement } from "../element";
9
9
  declare class LoomLink extends LoomElement {
10
10
  to: string;
11
+ /** Named route — when set, overrides `to` with the resolved path */
12
+ name: string;
13
+ /** Params for named route substitution (JSON string or object via JSX) */
14
+ params: string;
11
15
  private anchor;
12
16
  private get router();
13
17
  connectedCallback(): void;
18
+ /** Build a RouteTarget from current props */
19
+ private _target;
14
20
  private _onRouteChanged;
15
21
  private _sync;
16
22
  }
@@ -1 +1 @@
1
- {"version":3,"file":"link.d.ts","sourceRoot":"","sources":["../../src/router/link.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAMzC,cACM,QAAS,SAAQ,WAAW;IAC1B,EAAE,SAAO;IAEH,OAAO,CAAC,MAAM,CAAqB;IAE/C,OAAO,KAAK,MAAM,GAEjB;IAED,iBAAiB;IAgCjB,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,KAAK;CAMd;AAED,OAAO,EAAE,QAAQ,EAAE,CAAC"}
1
+ {"version":3,"file":"link.d.ts","sourceRoot":"","sources":["../../src/router/link.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAOzC,cACM,QAAS,SAAQ,WAAW;IAC1B,EAAE,SAAO;IACf,oEAAoE;IAC9D,IAAI,SAAM;IAChB,0EAA0E;IACpE,MAAM,SAAM;IAEN,OAAO,CAAC,MAAM,CAAqB;IAE/C,OAAO,KAAK,MAAM,GAEjB;IAED,iBAAiB;IA+BjB,6CAA6C;IAC7C,OAAO,CAAC,OAAO;IAWf,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,KAAK;CASd;AAED,OAAO,EAAE,QAAQ,EAAE,CAAC"}
@@ -16,8 +16,13 @@ import { component, prop, on, query } from "../decorators";
16
16
  import { app } from "../app";
17
17
  import { LoomRouter } from "./router";
18
18
  import { RouteChanged } from "./events";
19
+ import { buildPath } from "./route";
19
20
  let LoomLink = class LoomLink extends LoomElement {
20
21
  to = "/";
22
+ /** Named route — when set, overrides `to` with the resolved path */
23
+ name = "";
24
+ /** Params for named route substitution (JSON string or object via JSX) */
25
+ params = "";
21
26
  anchor;
22
27
  get router() {
23
28
  return app.get(LoomRouter);
@@ -45,9 +50,19 @@ let LoomLink = class LoomLink extends LoomElement {
45
50
  // Intercept clicks — use router.go() instead of native nav
46
51
  this.shadow.addEventListener("click", (e) => {
47
52
  e.preventDefault();
48
- this.router.go(this.to);
53
+ this.router.go(this._target());
49
54
  });
50
55
  }
56
+ /** Build a RouteTarget from current props */
57
+ _target() {
58
+ if (this.name) {
59
+ const p = typeof this.params === "string" && this.params
60
+ ? JSON.parse(this.params)
61
+ : (this.params || {});
62
+ return { name: this.name, params: p };
63
+ }
64
+ return this.to;
65
+ }
51
66
  _onRouteChanged() {
52
67
  this._sync();
53
68
  }
@@ -55,13 +70,22 @@ let LoomLink = class LoomLink extends LoomElement {
55
70
  const a = this.anchor;
56
71
  if (!a)
57
72
  return;
58
- a.href = this.router.href(this.to);
59
- a.className = this.router.current.path === this.to ? "active" : "";
73
+ const resolved = typeof this._target() === "string"
74
+ ? this._target()
75
+ : buildPath(this._target().name, this._target().params);
76
+ a.href = this.router.href(this._target());
77
+ a.className = this.router.current.path === resolved ? "active" : "";
60
78
  }
61
79
  };
62
80
  __decorate([
63
81
  prop
64
82
  ], LoomLink.prototype, "to", void 0);
83
+ __decorate([
84
+ prop
85
+ ], LoomLink.prototype, "name", void 0);
86
+ __decorate([
87
+ prop
88
+ ], LoomLink.prototype, "params", void 0);
65
89
  __decorate([
66
90
  query("a")
67
91
  ], LoomLink.prototype, "anchor", void 0);
@@ -1 +1 @@
1
- {"version":3,"file":"link.js","sourceRoot":"","sources":["../../src/router/link.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;;;;;;;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAC3D,OAAO,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAGxC,IAAM,QAAQ,GAAd,MAAM,QAAS,SAAQ,WAAW;IAC1B,EAAE,GAAG,GAAG,CAAC;IAEK,MAAM,CAAqB;IAE/C,IAAY,MAAM;QAChB,OAAO,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAC7B,CAAC;IAED,iBAAiB;QACf,KAAK,CAAC,iBAAiB,EAAE,CAAC;QAE1B,IAAI,CAAC,GAAG,CAAA;;;;;;;;;;KAUP,CAAC;QAEF,oBAAoB;QACpB,MAAM,CAAC,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;QACtC,CAAC,CAAC,YAAY,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QACjC,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QAC5C,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACpB,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;QAE3B,IAAI,CAAC,KAAK,EAAE,CAAC;QAEb,2DAA2D;QAC3D,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,CAAQ,EAAE,EAAE;YACjD,CAAC,CAAC,cAAc,EAAE,CAAC;YACnB,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC1B,CAAC,CAAC,CAAC;IACL,CAAC;IAGO,eAAe;QACrB,IAAI,CAAC,KAAK,EAAE,CAAC;IACf,CAAC;IAEO,KAAK;QACX,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;QACtB,IAAI,CAAC,CAAC;YAAE,OAAO;QACf,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACnC,CAAC,CAAC,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;IACrE,CAAC;CACF,CAAA;AAlDO;IAAL,IAAI;oCAAU;AAEK;IAAnB,KAAK,CAAC,GAAG,CAAC;wCAAoC;AAsCvC;IADP,EAAE,CAAC,YAAY,CAAC;+CAGhB;AA3CG,QAAQ;IADb,SAAS,CAAC,WAAW,CAAC;GACjB,QAAQ,CAmDb;AAED,OAAO,EAAE,QAAQ,EAAE,CAAC"}
1
+ {"version":3,"file":"link.js","sourceRoot":"","sources":["../../src/router/link.ts"],"names":[],"mappings":"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"}
@@ -12,9 +12,22 @@ export interface RouteEntry {
12
12
  ctor: any;
13
13
  /** Named guards to check before rendering this route */
14
14
  guards: string[];
15
+ /** Optional name for named-route navigation */
16
+ name?: string;
17
+ }
18
+ /** Symbol for @group metadata on a constructor */
19
+ export declare const GROUP_META: unique symbol;
20
+ /** Symbol for storing a route's group parent constructor */
21
+ export declare const ROUTE_GROUP: unique symbol;
22
+ /** Metadata stored by @group on a constructor */
23
+ export interface GroupMeta {
24
+ prefix: string;
25
+ guards: string[];
15
26
  }
16
27
  /** Global route table — populated by @route decorator */
17
28
  export declare const routes: RouteEntry[];
29
+ /** Named route lookup — populated by @route when name is provided */
30
+ export declare const routeByName: Map<string, RouteEntry>;
18
31
  /**
19
32
  * Global guard registry — populated by @guard decorator.
20
33
  * Maps guard name → { proto, key }
@@ -42,4 +55,12 @@ export declare function matchRoute(path: string): {
42
55
  entry: RouteEntry;
43
56
  params: Record<string, string>;
44
57
  } | null;
58
+ /**
59
+ * Build a path from a named route, substituting :param segments.
60
+ *
61
+ * ```ts
62
+ * buildPath("user-detail", { id: "42" }); // → "/user/42"
63
+ * ```
64
+ */
65
+ export declare function buildPath(name: string, params?: Record<string, string>): string;
45
66
  //# sourceMappingURL=route.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../src/router/route.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,GAAG,CAAC;IACV,wDAAwD;IACxD,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,yDAAyD;AACzD,eAAO,MAAM,MAAM,EAAE,UAAU,EAAO,CAAC;AAEvC;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,GAAG,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;CACb;AACD,eAAO,MAAM,aAAa,gCAAuC,CAAC;AAElE;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,EAAE,CAAA;CAAE,CAkBvF;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,UAAU,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,GAAG,IAAI,CAYrG"}
1
+ {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../src/router/route.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,GAAG,CAAC;IACV,wDAAwD;IACxD,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,+CAA+C;IAC/C,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,kDAAkD;AAClD,eAAO,MAAM,UAAU,eAA6B,CAAC;AAErD,4DAA4D;AAC5D,eAAO,MAAM,WAAW,eAAoC,CAAC;AAE7D,iDAAiD;AACjD,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,yDAAyD;AACzD,eAAO,MAAM,MAAM,EAAE,UAAU,EAAO,CAAC;AAEvC,qEAAqE;AACrE,eAAO,MAAM,WAAW,yBAAgC,CAAC;AAEzD;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,GAAG,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;CACb;AACD,eAAO,MAAM,aAAa,gCAAuC,CAAC;AAElE;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,EAAE,CAAA;CAAE,CAkBvF;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,UAAU,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,GAAG,IAAI,CAYrG;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GAAG,MAAM,CAQnF"}
@@ -4,8 +4,14 @@
4
4
  * Pure data: route entries, pattern compilation, and path matching.
5
5
  * Decorators live in ./decorators.ts.
6
6
  */
7
+ /** Symbol for @group metadata on a constructor */
8
+ export const GROUP_META = Symbol("loom:route:group");
9
+ /** Symbol for storing a route's group parent constructor */
10
+ export const ROUTE_GROUP = Symbol("loom:route:group-parent");
7
11
  /** Global route table — populated by @route decorator */
8
12
  export const routes = [];
13
+ /** Named route lookup — populated by @route when name is provided */
14
+ export const routeByName = new Map();
9
15
  export const guardRegistry = new Map();
10
16
  /**
11
17
  * Compile a route pattern into a regex + param name list.
@@ -47,4 +53,21 @@ export function matchRoute(path) {
47
53
  }
48
54
  return null;
49
55
  }
56
+ /**
57
+ * Build a path from a named route, substituting :param segments.
58
+ *
59
+ * ```ts
60
+ * buildPath("user-detail", { id: "42" }); // → "/user/42"
61
+ * ```
62
+ */
63
+ export function buildPath(name, params = {}) {
64
+ const entry = routeByName.get(name);
65
+ if (!entry)
66
+ throw new Error(`[Loom] Unknown route name: "${name}"`);
67
+ return entry.pattern.replace(/:([^/]+)/g, (_, key) => {
68
+ if (!(key in params))
69
+ throw new Error(`[Loom] Missing param "${key}" for route "${name}"`);
70
+ return params[key];
71
+ });
72
+ }
50
73
  //# sourceMappingURL=route.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"route.js","sourceRoot":"","sources":["../../src/router/route.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAYH,yDAAyD;AACzD,MAAM,CAAC,MAAM,MAAM,GAAiB,EAAE,CAAC;AAUvC,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,GAAG,EAA6B,CAAC;AAElE;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,OAAe;IAC5C,IAAI,OAAO,KAAK,GAAG,EAAE,CAAC;QACpB,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;IAC3C,CAAC;IAED,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,MAAM,QAAQ,GAAG,OAAO;SACrB,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QACX,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACxB,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9B,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,OAAO,GAAG,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;IACpD,CAAC,CAAC;SACD,IAAI,CAAC,KAAK,CAAC,CAAC;IAEf,OAAO,EAAE,KAAK,EAAE,IAAI,MAAM,CAAC,IAAI,QAAQ,GAAG,CAAC,EAAE,UAAU,EAAE,CAAC;AAC5D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAClC,IAAI,CAAC,EAAE,CAAC;YACN,MAAM,MAAM,GAA2B,EAAE,CAAC;YAC1C,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;gBACnC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAC1B,CAAC,CAAC,CAAC;YACH,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;QAC3B,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
1
+ {"version":3,"file":"route.js","sourceRoot":"","sources":["../../src/router/route.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAcH,kDAAkD;AAClD,MAAM,CAAC,MAAM,UAAU,GAAG,MAAM,CAAC,kBAAkB,CAAC,CAAC;AAErD,4DAA4D;AAC5D,MAAM,CAAC,MAAM,WAAW,GAAG,MAAM,CAAC,yBAAyB,CAAC,CAAC;AAQ7D,yDAAyD;AACzD,MAAM,CAAC,MAAM,MAAM,GAAiB,EAAE,CAAC;AAEvC,qEAAqE;AACrE,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,GAAG,EAAsB,CAAC;AAUzD,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,GAAG,EAA6B,CAAC;AAElE;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,OAAe;IAC5C,IAAI,OAAO,KAAK,GAAG,EAAE,CAAC;QACpB,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;IAC3C,CAAC;IAED,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,MAAM,QAAQ,GAAG,OAAO;SACrB,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QACX,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACxB,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9B,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,OAAO,GAAG,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;IACpD,CAAC,CAAC;SACD,IAAI,CAAC,KAAK,CAAC,CAAC;IAEf,OAAO,EAAE,KAAK,EAAE,IAAI,MAAM,CAAC,IAAI,QAAQ,GAAG,CAAC,EAAE,UAAU,EAAE,CAAC;AAC5D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAClC,IAAI,CAAC,EAAE,CAAC;YACN,MAAM,MAAM,GAA2B,EAAE,CAAC;YAC1C,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;gBACnC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAC1B,CAAC,CAAC,CAAC;YACH,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;QAC3B,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,SAAS,CAAC,IAAY,EAAE,SAAiC,EAAE;IACzE,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACpC,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,IAAI,GAAG,CAAC,CAAC;IAEpE,OAAO,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE;QACnD,IAAI,CAAC,CAAC,GAAG,IAAI,MAAM,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,GAAG,gBAAgB,IAAI,GAAG,CAAC,CAAC;QAC3F,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;IACrB,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -8,6 +8,11 @@ import { type RouterMode } from "./mode";
8
8
  export interface RouterOptions {
9
9
  mode?: "hash" | "history";
10
10
  }
11
+ /** Target for programmatic navigation — raw path or named route */
12
+ export type RouteTarget = string | {
13
+ name: string;
14
+ params?: Record<string, string>;
15
+ };
11
16
  export interface RouteInfo {
12
17
  path: string;
13
18
  params: Record<string, string>;
@@ -21,16 +26,20 @@ export declare class LoomRouter {
21
26
  get current(): Readonly<RouteInfo>;
22
27
  /** Start listening for URL changes and resolve the initial route */
23
28
  start(): () => void;
24
- /** Navigate to a path */
25
- go(path: string): Promise<void>;
29
+ /** Navigate to a path or named route */
30
+ go(target: RouteTarget): Promise<void>;
31
+ /** Alias for go() */
32
+ navigate(target: RouteTarget): Promise<void>;
26
33
  /** Navigate without creating a history entry */
27
- replace(path: string): Promise<void>;
34
+ replace(target: RouteTarget): Promise<void>;
28
35
  /** Go back in history */
29
36
  back(): void;
30
37
  /** Go forward in history */
31
38
  forward(): void;
32
39
  /** Build an href for the current mode */
33
- href(path: string): string;
40
+ href(target: RouteTarget): string;
41
+ /** Resolve a RouteTarget to a path string */
42
+ private _resolvePath;
34
43
  /** Resolve the current URL against the route table and emit RouteChanged */
35
44
  private _resolve;
36
45
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../src/router/router.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,KAAK,UAAU,EAAyB,MAAM,QAAQ,CAAC;AAOhE,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC3B;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;CACpB;AAED,qBAAa,UAAU;IACrB,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,OAAO,CAAC,QAAQ,CAAmD;gBAEvD,IAAI,GAAE,aAAkB;IAIpC,8CAA8C;IAC9C,IAAI,OAAO,IAAI,QAAQ,CAAC,SAAS,CAAC,CAEjC;IAED,oEAAoE;IACpE,KAAK,IAAI,MAAM,IAAI;IAMnB,yBAAyB;IACnB,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAWrC,gDAAgD;IAC1C,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAU1C,yBAAyB;IACzB,IAAI,IAAI,IAAI;IAIZ,4BAA4B;IAC5B,OAAO,IAAI,IAAI;IAIf,yCAAyC;IACzC,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAI1B,4EAA4E;IAC5E,OAAO,CAAC,QAAQ;IAchB;;;;;;OAMG;YACW,YAAY;IAwC1B;;;OAGG;IACH,OAAO,CAAC,oBAAoB;CAe7B"}
1
+ {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../src/router/router.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,KAAK,UAAU,EAAyB,MAAM,QAAQ,CAAC;AAOhE,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC3B;AAED,mEAAmE;AACnE,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,CAAC;AAErF,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;CACpB;AAED,qBAAa,UAAU;IACrB,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,OAAO,CAAC,QAAQ,CAAmD;gBAEvD,IAAI,GAAE,aAAkB;IAIpC,8CAA8C;IAC9C,IAAI,OAAO,IAAI,QAAQ,CAAC,SAAS,CAAC,CAEjC;IAED,oEAAoE;IACpE,KAAK,IAAI,MAAM,IAAI;IAMnB,wCAAwC;IAClC,EAAE,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAW5C,qBAAqB;IACrB,QAAQ,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAI5C,gDAAgD;IAC1C,OAAO,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAWjD,yBAAyB;IACzB,IAAI,IAAI,IAAI;IAIZ,4BAA4B;IAC5B,OAAO,IAAI,IAAI;IAIf,yCAAyC;IACzC,IAAI,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM;IAIjC,6CAA6C;IAC7C,OAAO,CAAC,YAAY;IAKpB,4EAA4E;IAC5E,OAAO,CAAC,QAAQ;IAchB;;;;;;OAMG;YACW,YAAY;IAwC1B;;;OAGG;IACH,OAAO,CAAC,oBAAoB;CAe7B"}
@@ -6,7 +6,7 @@
6
6
  */
7
7
  import { bus } from "../bus";
8
8
  import { HashMode, HistoryMode } from "./mode";
9
- import { matchRoute, guardRegistry } from "./route";
9
+ import { matchRoute, guardRegistry, buildPath } from "./route";
10
10
  import { GUARD_HANDLERS } from "./decorators";
11
11
  import { RouteChanged } from "./events";
12
12
  import { INJECT_PARAMS } from "../decorators/symbols";
@@ -27,20 +27,25 @@ export class LoomRouter {
27
27
  this._resolve();
28
28
  return cleanup;
29
29
  }
30
- /** Navigate to a path */
31
- async go(path) {
30
+ /** Navigate to a path or named route */
31
+ async go(target) {
32
+ const path = this._resolvePath(target);
32
33
  const allowed = await this._checkGuards(path);
33
34
  if (allowed === false)
34
35
  return;
35
36
  if (typeof allowed === "string") {
36
- // Redirect
37
37
  return this.go(allowed);
38
38
  }
39
39
  this.mode.write(path);
40
40
  this._resolve();
41
41
  }
42
+ /** Alias for go() */
43
+ navigate(target) {
44
+ return this.go(target);
45
+ }
42
46
  /** Navigate without creating a history entry */
43
- async replace(path) {
47
+ async replace(target) {
48
+ const path = this._resolvePath(target);
44
49
  const allowed = await this._checkGuards(path);
45
50
  if (allowed === false)
46
51
  return;
@@ -59,8 +64,14 @@ export class LoomRouter {
59
64
  history.forward();
60
65
  }
61
66
  /** Build an href for the current mode */
62
- href(path) {
63
- return this.mode.href(path);
67
+ href(target) {
68
+ return this.mode.href(this._resolvePath(target));
69
+ }
70
+ /** Resolve a RouteTarget to a path string */
71
+ _resolvePath(target) {
72
+ if (typeof target === "string")
73
+ return target;
74
+ return buildPath(target.name, target.params);
64
75
  }
65
76
  /** Resolve the current URL against the route table and emit RouteChanged */
66
77
  _resolve() {
@@ -1 +1 @@
1
- {"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/router/router.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/router/router.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@toyz/loom",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "type": "module",
5
5
  "description": "Decorator-driven web component framework with reactive state, DOM morphing, DI, and JSX",
6
6
  "license": "MIT",