@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 +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/router/decorators.d.ts +36 -0
- package/dist/router/decorators.d.ts.map +1 -1
- package/dist/router/decorators.js +96 -6
- package/dist/router/decorators.js.map +1 -1
- package/dist/router/index.d.ts +5 -4
- package/dist/router/index.d.ts.map +1 -1
- package/dist/router/index.js +3 -2
- package/dist/router/index.js.map +1 -1
- package/dist/router/link.d.ts +6 -0
- package/dist/router/link.d.ts.map +1 -1
- package/dist/router/link.js +27 -3
- package/dist/router/link.js.map +1 -1
- package/dist/router/route.d.ts +21 -0
- package/dist/router/route.d.ts.map +1 -1
- package/dist/router/route.js +23 -0
- package/dist/router/route.js.map +1 -1
- package/dist/router/router.d.ts +13 -4
- package/dist/router/router.d.ts.map +1 -1
- package/dist/router/router.js +18 -7
- package/dist/router/router.js.map +1 -1
- package/package.json +1 -1
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
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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
|
|
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
|
-
|
|
28
|
-
|
|
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:
|
|
119
|
+
guards: allGuards,
|
|
120
|
+
name: opts?.name,
|
|
38
121
|
};
|
|
39
|
-
|
|
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
|
|
1
|
+
{"version":3,"file":"decorators.js","sourceRoot":"","sources":["../../src/router/decorators.ts"],"names":[],"mappings":"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"}
|
package/dist/router/index.d.ts
CHANGED
|
@@ -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 {
|
|
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;
|
|
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"}
|
package/dist/router/index.js
CHANGED
|
@@ -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";
|
package/dist/router/index.js.map
CHANGED
|
@@ -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;
|
|
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"}
|
package/dist/router/link.d.ts
CHANGED
|
@@ -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;
|
|
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"}
|
package/dist/router/link.js
CHANGED
|
@@ -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.
|
|
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
|
-
|
|
59
|
-
|
|
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);
|
package/dist/router/link.js.map
CHANGED
|
@@ -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,
|
|
1
|
+
{"version":3,"file":"link.js","sourceRoot":"","sources":["../../src/router/link.ts"],"names":[],"mappings":"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"}
|
package/dist/router/route.d.ts
CHANGED
|
@@ -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"}
|
package/dist/router/route.js
CHANGED
|
@@ -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
|
package/dist/router/route.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"route.js","sourceRoot":"","sources":["../../src/router/route.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
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"}
|
package/dist/router/router.d.ts
CHANGED
|
@@ -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(
|
|
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(
|
|
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(
|
|
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,
|
|
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"}
|
package/dist/router/router.js
CHANGED
|
@@ -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(
|
|
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(
|
|
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(
|
|
63
|
-
return this.mode.href(
|
|
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":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAC;AAC7B,OAAO,EAAmB,QAAQ,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/router/router.ts"],"names":[],"mappings":"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"}
|