@toyz/loom 0.1.3 → 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.
Files changed (155) hide show
  1. package/dist/decorators/create.d.ts +56 -0
  2. package/dist/decorators/create.d.ts.map +1 -0
  3. package/dist/decorators/create.js +72 -0
  4. package/dist/decorators/create.js.map +1 -0
  5. package/dist/decorators/events.d.ts +6 -9
  6. package/dist/decorators/events.d.ts.map +1 -1
  7. package/dist/decorators/events.js +27 -22
  8. package/dist/decorators/events.js.map +1 -1
  9. package/dist/decorators/index.d.ts +13 -13
  10. package/dist/decorators/index.d.ts.map +1 -1
  11. package/dist/decorators/index.js +20 -21
  12. package/dist/decorators/index.js.map +1 -1
  13. package/dist/{decorators/di.d.ts → di/decorators.d.ts} +10 -3
  14. package/dist/di/decorators.d.ts.map +1 -0
  15. package/dist/{decorators/di.js → di/decorators.js} +16 -10
  16. package/dist/di/decorators.js.map +1 -0
  17. package/dist/di/index.d.ts +8 -0
  18. package/dist/di/index.d.ts.map +1 -0
  19. package/dist/di/index.js +10 -0
  20. package/dist/di/index.js.map +1 -0
  21. package/dist/di/watch.d.ts +23 -0
  22. package/dist/di/watch.d.ts.map +1 -0
  23. package/dist/di/watch.js +41 -0
  24. package/dist/di/watch.js.map +1 -0
  25. package/dist/element/decorators.d.ts +32 -0
  26. package/dist/element/decorators.d.ts.map +1 -0
  27. package/dist/element/decorators.js +72 -0
  28. package/dist/element/decorators.js.map +1 -0
  29. package/dist/{element.d.ts → element/element.d.ts} +5 -11
  30. package/dist/element/element.d.ts.map +1 -0
  31. package/dist/{element.js → element/element.js} +8 -34
  32. package/dist/element/element.js.map +1 -0
  33. package/dist/element/icon.d.ts.map +1 -0
  34. package/dist/{icon.js → element/icon.js} +3 -2
  35. package/dist/element/icon.js.map +1 -0
  36. package/dist/element/index.d.ts +11 -0
  37. package/dist/element/index.d.ts.map +1 -0
  38. package/dist/element/index.js +14 -0
  39. package/dist/element/index.js.map +1 -0
  40. package/dist/{decorators → element}/lifecycle.d.ts +9 -1
  41. package/dist/element/lifecycle.d.ts.map +1 -0
  42. package/dist/{decorators → element}/lifecycle.js +50 -35
  43. package/dist/element/lifecycle.js.map +1 -0
  44. package/dist/element/timing.d.ts +65 -0
  45. package/dist/element/timing.d.ts.map +1 -0
  46. package/dist/element/timing.js +116 -0
  47. package/dist/element/timing.js.map +1 -0
  48. package/dist/element/virtual.d.ts.map +1 -0
  49. package/dist/{virtual.js → element/virtual.js} +1 -1
  50. package/dist/element/virtual.js.map +1 -0
  51. package/dist/index.d.ts +13 -13
  52. package/dist/index.d.ts.map +1 -1
  53. package/dist/index.js +15 -15
  54. package/dist/index.js.map +1 -1
  55. package/dist/router/decorators.d.ts +86 -0
  56. package/dist/router/decorators.d.ts.map +1 -0
  57. package/dist/router/decorators.js +174 -0
  58. package/dist/router/decorators.js.map +1 -0
  59. package/dist/router/index.d.ts +7 -5
  60. package/dist/router/index.d.ts.map +1 -1
  61. package/dist/router/index.js +7 -4
  62. package/dist/router/index.js.map +1 -1
  63. package/dist/router/link.d.ts +6 -0
  64. package/dist/router/link.d.ts.map +1 -1
  65. package/dist/router/link.js +27 -3
  66. package/dist/router/link.js.map +1 -1
  67. package/dist/router/outlet.d.ts +1 -1
  68. package/dist/router/outlet.d.ts.map +1 -1
  69. package/dist/router/outlet.js +2 -2
  70. package/dist/router/outlet.js.map +1 -1
  71. package/dist/router/route.d.ts +32 -42
  72. package/dist/router/route.d.ts.map +1 -1
  73. package/dist/router/route.js +22 -96
  74. package/dist/router/route.js.map +1 -1
  75. package/dist/router/router.d.ts +13 -4
  76. package/dist/router/router.d.ts.map +1 -1
  77. package/dist/router/router.js +19 -7
  78. package/dist/router/router.js.map +1 -1
  79. package/dist/{decorators/state.d.ts → store/decorators.d.ts} +8 -1
  80. package/dist/store/decorators.d.ts.map +1 -0
  81. package/dist/{decorators/state.js → store/decorators.js} +13 -4
  82. package/dist/store/decorators.js.map +1 -0
  83. package/dist/store/index.d.ts +12 -0
  84. package/dist/store/index.d.ts.map +1 -0
  85. package/dist/store/index.js +14 -0
  86. package/dist/store/index.js.map +1 -0
  87. package/dist/{reactive.d.ts → store/reactive.d.ts} +7 -5
  88. package/dist/store/reactive.d.ts.map +1 -0
  89. package/dist/{reactive.js → store/reactive.js} +9 -5
  90. package/dist/store/reactive.js.map +1 -0
  91. package/dist/store/storage.d.ts +53 -0
  92. package/dist/store/storage.d.ts.map +1 -0
  93. package/dist/store/storage.js +78 -0
  94. package/dist/store/storage.js.map +1 -0
  95. package/dist/store/watch.d.ts +27 -0
  96. package/dist/store/watch.d.ts.map +1 -0
  97. package/dist/store/watch.js +30 -0
  98. package/dist/store/watch.js.map +1 -0
  99. package/dist/transform/built-in.d.ts +36 -0
  100. package/dist/transform/built-in.d.ts.map +1 -0
  101. package/dist/transform/built-in.js +37 -0
  102. package/dist/transform/built-in.js.map +1 -0
  103. package/dist/transform/create.d.ts +19 -0
  104. package/dist/transform/create.d.ts.map +1 -0
  105. package/dist/transform/create.js +27 -0
  106. package/dist/transform/create.js.map +1 -0
  107. package/dist/transform/index.d.ts +11 -0
  108. package/dist/transform/index.d.ts.map +1 -0
  109. package/dist/transform/index.js +14 -0
  110. package/dist/transform/index.js.map +1 -0
  111. package/dist/transform/transform.d.ts +14 -0
  112. package/dist/transform/transform.d.ts.map +1 -0
  113. package/dist/transform/transform.js +21 -0
  114. package/dist/transform/transform.js.map +1 -0
  115. package/dist/transform/typed.d.ts +40 -0
  116. package/dist/transform/typed.d.ts.map +1 -0
  117. package/dist/transform/typed.js +55 -0
  118. package/dist/transform/typed.js.map +1 -0
  119. package/package.json +35 -3
  120. package/dist/decorators/component.d.ts +0 -11
  121. package/dist/decorators/component.d.ts.map +0 -1
  122. package/dist/decorators/component.js +0 -38
  123. package/dist/decorators/component.js.map +0 -1
  124. package/dist/decorators/di.d.ts.map +0 -1
  125. package/dist/decorators/di.js.map +0 -1
  126. package/dist/decorators/dom.d.ts +0 -15
  127. package/dist/decorators/dom.d.ts.map +0 -1
  128. package/dist/decorators/dom.js +0 -33
  129. package/dist/decorators/dom.js.map +0 -1
  130. package/dist/decorators/lifecycle.d.ts.map +0 -1
  131. package/dist/decorators/lifecycle.js.map +0 -1
  132. package/dist/decorators/state.d.ts.map +0 -1
  133. package/dist/decorators/state.js.map +0 -1
  134. package/dist/decorators/timing.d.ts +0 -35
  135. package/dist/decorators/timing.d.ts.map +0 -1
  136. package/dist/decorators/timing.js +0 -57
  137. package/dist/decorators/timing.js.map +0 -1
  138. package/dist/decorators/transform.d.ts +0 -45
  139. package/dist/decorators/transform.d.ts.map +0 -1
  140. package/dist/decorators/transform.js +0 -48
  141. package/dist/decorators/transform.js.map +0 -1
  142. package/dist/element.d.ts.map +0 -1
  143. package/dist/element.js.map +0 -1
  144. package/dist/icon.d.ts.map +0 -1
  145. package/dist/icon.js.map +0 -1
  146. package/dist/reactive.d.ts.map +0 -1
  147. package/dist/reactive.js.map +0 -1
  148. package/dist/storage.d.ts +0 -55
  149. package/dist/storage.d.ts.map +0 -1
  150. package/dist/storage.js +0 -90
  151. package/dist/storage.js.map +0 -1
  152. package/dist/virtual.d.ts.map +0 -1
  153. package/dist/virtual.js.map +0 -1
  154. /package/dist/{icon.d.ts → element/icon.d.ts} +0 -0
  155. /package/dist/{virtual.d.ts → element/virtual.d.ts} +0 -0
@@ -1,11 +1,9 @@
1
1
  /**
2
- * Loom Router — Route table and decorators
2
+ * Loom Router — Route table and matching
3
3
  *
4
- * @route(path, opts?) registers a component class as a route handler.
5
- * @guard(name?) marks a method as a named route guard.
4
+ * Pure data: route entries, pattern compilation, and path matching.
5
+ * Decorators live in ./decorators.ts.
6
6
  */
7
- export declare const ROUTE_PATH: unique symbol;
8
- export declare const GUARD_HANDLERS: unique symbol;
9
7
  export interface RouteEntry {
10
8
  pattern: string;
11
9
  regex: RegExp;
@@ -14,18 +12,41 @@ export interface RouteEntry {
14
12
  ctor: any;
15
13
  /** Named guards to check before rendering this route */
16
14
  guards: string[];
15
+ /** Optional name for named-route navigation */
16
+ name?: string;
17
17
  }
18
- /** Global route table populated by @route decorators */
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[];
26
+ }
27
+ /** Global route table — populated by @route decorator */
19
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>;
20
31
  /**
21
- * Global guard registry — populated by @guard decorators.
22
- * Maps guard name → { proto, key, injectMeta }
32
+ * Global guard registry — populated by @guard decorator.
33
+ * Maps guard name → { proto, key }
23
34
  */
24
35
  export interface GuardRegistration {
25
36
  proto: any;
26
37
  key: string;
27
38
  }
28
39
  export declare const guardRegistry: Map<string, GuardRegistration>;
40
+ /**
41
+ * Compile a route pattern into a regex + param name list.
42
+ *
43
+ * `/docs/:slug` → { regex: /^\/docs\/([^/]+)$/, paramNames: ["slug"] }
44
+ * `*` → { regex: /^.*$/, paramNames: [] }
45
+ */
46
+ export declare function compilePattern(pattern: string): {
47
+ regex: RegExp;
48
+ paramNames: string[];
49
+ };
29
50
  /**
30
51
  * Match a path against the route table.
31
52
  * Returns the matched entry + extracted params, or null.
@@ -34,43 +55,12 @@ export declare function matchRoute(path: string): {
34
55
  entry: RouteEntry;
35
56
  params: Record<string, string>;
36
57
  } | null;
37
- interface RouteOptions {
38
- /** Named guards to check before this route is rendered */
39
- guards?: string[];
40
- }
41
58
  /**
42
- * Register a class as a route handler.
59
+ * Build a path from a named route, substituting :param segments.
43
60
  *
44
61
  * ```ts
45
- * @route("/docs/:slug")
46
- * @component("page-docs")
47
- * class PageDocs extends LoomElement { ... }
48
- *
49
- * @route("/admin", { guards: ["auth", "role"] })
50
- * @component("page-admin")
51
- * class PageAdmin extends LoomElement { ... }
52
- * ```
53
- */
54
- export declare function route(pattern: string, opts?: RouteOptions): (ctor: any) => void;
55
- /**
56
- * Mark a method as a named route guard.
57
- *
58
- * Return `true` to allow, `false` to block, or a `string` to redirect.
59
- * Async guards are awaited. Supports @inject on parameters.
60
- *
61
- * ```ts
62
- * @guard("auth")
63
- * checkAuth(@inject(AuthService) auth: AuthService) {
64
- * return auth.isLoggedIn ? true : "/login";
65
- * }
66
- *
67
- * // Derived name from method name:
68
- * @guard
69
- * checkRole(@inject(UserStore) users: UserStore) {
70
- * return users.current?.role === "admin" ? true : "/forbidden";
71
- * }
62
+ * buildPath("user-detail", { id: "42" }); // → "/user/42"
72
63
  * ```
73
64
  */
74
- export declare function guard(nameOrTarget: any, key?: string): any;
75
- export {};
65
+ export declare function buildPath(name: string, params?: Record<string, string>): string;
76
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;AAIH,eAAO,MAAM,UAAU,eAA4B,CAAC;AACpD,eAAO,MAAM,cAAc,eAA8B,CAAC;AAE1D,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,0DAA0D;AAC1D,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;AA4BlE;;;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;AAID,UAAU,YAAY;IACpB,0DAA0D;IAC1D,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,YAAY,IAChD,MAAM,GAAG,UA4BlB;AAeD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,KAAK,CAAC,YAAY,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,GAAG,CAa1D"}
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"}
@@ -1,13 +1,17 @@
1
1
  /**
2
- * Loom Router — Route table and decorators
2
+ * Loom Router — Route table and matching
3
3
  *
4
- * @route(path, opts?) registers a component class as a route handler.
5
- * @guard(name?) marks a method as a named route guard.
4
+ * Pure data: route entries, pattern compilation, and path matching.
5
+ * Decorators live in ./decorators.ts.
6
6
  */
7
- export const ROUTE_PATH = Symbol("loom:route:path");
8
- export const GUARD_HANDLERS = Symbol("loom:route:guards");
9
- /** Global route table populated by @route decorators */
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");
11
+ /** Global route table — populated by @route decorator */
10
12
  export const routes = [];
13
+ /** Named route lookup — populated by @route when name is provided */
14
+ export const routeByName = new Map();
11
15
  export const guardRegistry = new Map();
12
16
  /**
13
17
  * Compile a route pattern into a regex + param name list.
@@ -15,7 +19,7 @@ export const guardRegistry = new Map();
15
19
  * `/docs/:slug` → { regex: /^\/docs\/([^/]+)$/, paramNames: ["slug"] }
16
20
  * `*` → { regex: /^.*$/, paramNames: [] }
17
21
  */
18
- function compilePattern(pattern) {
22
+ export function compilePattern(pattern) {
19
23
  if (pattern === "*") {
20
24
  return { regex: /^.*$/, paramNames: [] };
21
25
  }
@@ -50,98 +54,20 @@ export function matchRoute(path) {
50
54
  return null;
51
55
  }
52
56
  /**
53
- * Register a class as a route handler.
57
+ * Build a path from a named route, substituting :param segments.
54
58
  *
55
59
  * ```ts
56
- * @route("/docs/:slug")
57
- * @component("page-docs")
58
- * class PageDocs extends LoomElement { ... }
59
- *
60
- * @route("/admin", { guards: ["auth", "role"] })
61
- * @component("page-admin")
62
- * class PageAdmin extends LoomElement { ... }
60
+ * buildPath("user-detail", { id: "42" }); // → "/user/42"
63
61
  * ```
64
62
  */
65
- export function route(pattern, opts) {
66
- return (ctor) => {
67
- ctor[ROUTE_PATH] = pattern;
68
- const { regex, paramNames } = compilePattern(pattern);
69
- // Defer tag resolution the @component decorator may not have run yet.
70
- // We use a getter to lazily resolve the custom element tag.
71
- const entry = {
72
- pattern,
73
- regex,
74
- paramNames,
75
- get tag() {
76
- // Find the tag registered for this constructor
77
- return _tagForCtor(ctor);
78
- },
79
- ctor,
80
- guards: opts?.guards ?? [],
81
- };
82
- // Wildcard goes last
83
- if (pattern === "*") {
84
- routes.push(entry);
85
- }
86
- else {
87
- // Insert before wildcards
88
- const wildcardIdx = routes.findIndex((r) => r.pattern === "*");
89
- if (wildcardIdx === -1)
90
- routes.push(entry);
91
- else
92
- routes.splice(wildcardIdx, 0, entry);
93
- }
94
- };
95
- }
96
- /** Resolve the custom element tag for a constructor */
97
- function _tagForCtor(ctor) {
98
- // Search customElements registry
99
- const name = customElements.getName?.(ctor);
100
- if (name)
101
- return name;
102
- // Fallback: scan internal app registry (custom elements v1 doesn't have getName everywhere)
103
- // We store the tag on the constructor via @component
104
- return ctor.__loom_tag ?? ctor.name.toLowerCase();
105
- }
106
- // ── @guard decorator ──
107
- /**
108
- * Mark a method as a named route guard.
109
- *
110
- * Return `true` to allow, `false` to block, or a `string` to redirect.
111
- * Async guards are awaited. Supports @inject on parameters.
112
- *
113
- * ```ts
114
- * @guard("auth")
115
- * checkAuth(@inject(AuthService) auth: AuthService) {
116
- * return auth.isLoggedIn ? true : "/login";
117
- * }
118
- *
119
- * // Derived name from method name:
120
- * @guard
121
- * checkRole(@inject(UserStore) users: UserStore) {
122
- * return users.current?.role === "admin" ? true : "/forbidden";
123
- * }
124
- * ```
125
- */
126
- export function guard(nameOrTarget, key) {
127
- if (typeof key === "string") {
128
- // Bare @guard (no name) — derive name from method name
129
- _registerGuard(nameOrTarget, key, key);
130
- return;
131
- }
132
- if (typeof nameOrTarget === "string") {
133
- // @guard("auth") — factory form with explicit name
134
- return (target, methodKey) => {
135
- _registerGuard(target, methodKey, nameOrTarget);
136
- };
137
- }
138
- }
139
- function _registerGuard(proto, key, name) {
140
- // Legacy: store on prototype for backward compat
141
- if (!proto[GUARD_HANDLERS])
142
- proto[GUARD_HANDLERS] = [];
143
- proto[GUARD_HANDLERS].push(key);
144
- // New: register in global registry by name
145
- guardRegistry.set(name, { proto, key });
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
+ });
146
72
  }
147
73
  //# sourceMappingURL=route.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"route.js","sourceRoot":"","sources":["../../src/router/route.ts"],"names":[],"mappings":"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"}
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;AAMhE,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,8 @@
6
6
  */
7
7
  import { bus } from "../bus";
8
8
  import { HashMode, HistoryMode } from "./mode";
9
- import { matchRoute, GUARD_HANDLERS, guardRegistry } from "./route";
9
+ import { matchRoute, guardRegistry, buildPath } from "./route";
10
+ import { GUARD_HANDLERS } from "./decorators";
10
11
  import { RouteChanged } from "./events";
11
12
  import { INJECT_PARAMS } from "../decorators/symbols";
12
13
  import { app } from "../app";
@@ -26,20 +27,25 @@ export class LoomRouter {
26
27
  this._resolve();
27
28
  return cleanup;
28
29
  }
29
- /** Navigate to a path */
30
- async go(path) {
30
+ /** Navigate to a path or named route */
31
+ async go(target) {
32
+ const path = this._resolvePath(target);
31
33
  const allowed = await this._checkGuards(path);
32
34
  if (allowed === false)
33
35
  return;
34
36
  if (typeof allowed === "string") {
35
- // Redirect
36
37
  return this.go(allowed);
37
38
  }
38
39
  this.mode.write(path);
39
40
  this._resolve();
40
41
  }
42
+ /** Alias for go() */
43
+ navigate(target) {
44
+ return this.go(target);
45
+ }
41
46
  /** Navigate without creating a history entry */
42
- async replace(path) {
47
+ async replace(target) {
48
+ const path = this._resolvePath(target);
43
49
  const allowed = await this._checkGuards(path);
44
50
  if (allowed === false)
45
51
  return;
@@ -58,8 +64,14 @@ export class LoomRouter {
58
64
  history.forward();
59
65
  }
60
66
  /** Build an href for the current mode */
61
- href(path) {
62
- 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);
63
75
  }
64
76
  /** Resolve the current URL against the route table and emit RouteChanged */
65
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,cAAc,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAC;AAY7B,MAAM,OAAO,UAAU;IACZ,IAAI,CAAa;IAClB,QAAQ,GAAc,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;IAEnE,YAAY,OAAsB,EAAE;QAClC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,QAAQ,EAAE,CAAC;IAC3E,CAAC;IAED,8CAA8C;IAC9C,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED,oEAAoE;IACpE,KAAK;QACH,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QACxD,IAAI,CAAC,QAAQ,EAAE,CAAC;QAChB,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,yBAAyB;IACzB,KAAK,CAAC,EAAE,CAAC,IAAY;QACnB,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QAC9C,IAAI,OAAO,KAAK,KAAK;YAAE,OAAO;QAC9B,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YAChC,WAAW;YACX,OAAO,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;QAC1B,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACtB,IAAI,CAAC,QAAQ,EAAE,CAAC;IAClB,CAAC;IAED,gDAAgD;IAChD,KAAK,CAAC,OAAO,CAAC,IAAY;QACxB,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QAC9C,IAAI,OAAO,KAAK,KAAK;YAAE,OAAO;QAC9B,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YAChC,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC/B,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACxB,IAAI,CAAC,QAAQ,EAAE,CAAC;IAClB,CAAC;IAED,yBAAyB;IACzB,IAAI;QACF,OAAO,CAAC,IAAI,EAAE,CAAC;IACjB,CAAC;IAED,4BAA4B;IAC5B,OAAO;QACL,OAAO,CAAC,OAAO,EAAE,CAAC;IACpB,CAAC;IAED,yCAAyC;IACzC,IAAI,CAAC,IAAY;QACf,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IAED,4EAA4E;IACpE,QAAQ;QACd,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QAC9B,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;QAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;QAEpC,IAAI,CAAC,QAAQ,GAAG;YACd,IAAI;YACJ,MAAM,EAAE,KAAK,EAAE,MAAM,IAAI,EAAE;YAC3B,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,IAAI,IAAI;SAC9B,CAAC;QAEF,GAAG,CAAC,IAAI,CAAC,IAAI,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;IACnE,CAAC;IAED;;;;;;OAMG;IACK,KAAK,CAAC,YAAY,CAAC,IAAY;QACrC,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;QAC/B,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC,CAAC,uBAAuB;QAEhD,0EAA0E;QAC1E,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC;QAC7C,MAAM,WAAW,GAAa,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;QAEjF,2BAA2B;QAC3B,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QAEtE,+CAA+C;QAC/C,KAAK,MAAM,SAAS,IAAI,WAAW,EAAE,CAAC;YACpC,MAAM,GAAG,GAAG,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YACzC,IAAI,CAAC,GAAG,EAAE,CAAC;gBACT,OAAO,CAAC,IAAI,CAAC,uBAAuB,SAAS,yBAAyB,CAAC,CAAC;gBACxE,SAAS;YACX,CAAC;YAED,MAAM,IAAI,GAAG,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;YAC3D,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YAC/D,IAAI,MAAM,KAAK,KAAK;gBAAE,OAAO,KAAK,CAAC;YACnC,IAAI,OAAO,MAAM,KAAK,QAAQ;gBAAE,OAAO,MAAM,CAAC;QAChD,CAAC;QAED,0DAA0D;QAC1D,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC;QACzC,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;YAC9B,uCAAuC;YACvC,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,GAAG,CAAC;gBAAE,SAAS;YAEzE,MAAM,IAAI,GAAG,IAAI,CAAC,oBAAoB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YACnD,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YACnD,IAAI,MAAM,KAAK,KAAK;gBAAE,OAAO,KAAK,CAAC;YACnC,IAAI,OAAO,MAAM,KAAK,QAAQ;gBAAE,OAAO,MAAM,CAAC;QAChD,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;OAGG;IACK,oBAAoB,CAAC,KAAU,EAAE,MAAc;QACrD,MAAM,UAAU,GACd,KAAK,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;QAC7B,MAAM,YAAY,GAAG,UAAU;aAC5B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC;aAClC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;QAErC,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAEzC,MAAM,IAAI,GAAU,EAAE,CAAC;QACvB,KAAK,MAAM,KAAK,IAAI,YAAY,EAAE,CAAC;YACjC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACzC,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;CACF"}
1
+ {"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/router/router.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,10 @@
1
+ /**
2
+ * Loom — Store decorators
3
+ *
4
+ * @reactive — Internal reactive state backed by Reactive<T>
5
+ * @prop — External attribute with optional route binding
6
+ * @computed — Cached derived getter
7
+ */
1
8
  /** Sentinel for full route-param decompose: `@prop({params}) p!: MyType` */
2
9
  export declare const params: unique symbol;
3
10
  /** Sentinel for full query-param decompose: `@prop({query}) q!: MyType` */
@@ -38,4 +45,4 @@ export declare function prop(targetOrOpts: any, key?: any): any;
38
45
  * ```
39
46
  */
40
47
  export declare function computed(target: any, key: string, desc: PropertyDescriptor): void;
41
- //# sourceMappingURL=state.d.ts.map
48
+ //# sourceMappingURL=decorators.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decorators.d.ts","sourceRoot":"","sources":["../../src/store/decorators.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AASH,4EAA4E;AAC5E,eAAO,MAAM,MAAM,eAAiC,CAAC;AAErD,2EAA2E;AAG3E,eAAO,MAAM,UAAU,eAAgC,CAAC;AAExD;;;;;;;GAOG;AACH,wBAAgB,QAAQ,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAsCvD;AAiBD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,IAAI,CAClB,YAAY,EAAE,GAAG,EACjB,GAAG,CAAC,EAAE,GAAG,GACR,GAAG,CAuBL;AASD;;;;;;;GAOG;AACH,wBAAgB,QAAQ,CACtB,MAAM,EAAE,GAAG,EACX,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,kBAAkB,GACvB,IAAI,CAiBN"}
@@ -1,12 +1,19 @@
1
- import { REACTIVES, PROPS, WATCHERS, EMITTERS, COMPUTED_DIRTY, ROUTE_PROPS } from "./symbols";
2
- import { Reactive } from "../reactive";
1
+ /**
2
+ * Loom Store decorators
3
+ *
4
+ * @reactive — Internal reactive state backed by Reactive<T>
5
+ * @prop — External attribute with optional route binding
6
+ * @computed — Cached derived getter
7
+ */
8
+ import { REACTIVES, PROPS, WATCHERS, EMITTERS, COMPUTED_DIRTY, ROUTE_PROPS } from "../decorators/symbols";
9
+ import { Reactive } from "./reactive";
3
10
  import { bus } from "../bus";
4
11
  // ── Route sentinels ──
5
12
  // Used with @prop shorthand: @prop({params}) or @prop({query})
6
13
  /** Sentinel for full route-param decompose: `@prop({params}) p!: MyType` */
7
14
  export const params = Symbol("loom:sentinel:params");
8
15
  /** Sentinel for full query-param decompose: `@prop({query}) q!: MyType` */
9
- // NOTE: This is NOT the @query(".selector") DOM decorator — that's in dom.ts.
16
+ // NOTE: This is NOT the @query(".selector") DOM decorator — that's in element/decorators.
10
17
  // This sentinel is re-exported from "@toyz/loom/router".
11
18
  export const routeQuery = Symbol("loom:sentinel:query");
12
19
  /**
@@ -18,6 +25,7 @@ export const routeQuery = Symbol("loom:sentinel:query");
18
25
  * ```
19
26
  */
20
27
  export function reactive(target, key) {
28
+ // Define-time: store field name and create getter/setter
21
29
  if (!target[REACTIVES])
22
30
  target[REACTIVES] = [];
23
31
  target[REACTIVES].push(key);
@@ -107,6 +115,7 @@ function _registerProp(target, key) {
107
115
  * ```
108
116
  */
109
117
  export function computed(target, key, desc) {
118
+ // Define-time: wrap getter with caching
110
119
  const getter = desc.get;
111
120
  const cacheKey = Symbol(`computed:${key}`);
112
121
  const dirtyKey = Symbol(`dirty:${key}`);
@@ -122,4 +131,4 @@ export function computed(target, key, desc) {
122
131
  target[COMPUTED_DIRTY] = [];
123
132
  target[COMPUTED_DIRTY].push(dirtyKey);
124
133
  }
125
- //# sourceMappingURL=state.js.map
134
+ //# sourceMappingURL=decorators.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decorators.js","sourceRoot":"","sources":["../../src/store/decorators.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Loom Store — Barrel exports
3
+ *
4
+ * Reactive primitives, storage adapters, and store decorators.
5
+ */
6
+ export { Reactive, CollectionStore } from "./reactive";
7
+ export type { Subscriber, Updater, Identifiable } from "./reactive";
8
+ export { MemoryStorage, LocalAdapter, SessionAdapter, LocalMedium, SessionMedium } from "./storage";
9
+ export type { StorageAdapter, StorageMedium, PersistOptions } from "./storage";
10
+ export { reactive, prop, computed, params, routeQuery } from "./decorators";
11
+ export { watch } from "./watch";
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/store/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AACvD,YAAY,EAAE,UAAU,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAGpE,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AACpG,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAG/E,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAG5E,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Loom Store — Barrel exports
3
+ *
4
+ * Reactive primitives, storage adapters, and store decorators.
5
+ */
6
+ // Reactive primitives
7
+ export { Reactive, CollectionStore } from "./reactive";
8
+ // Storage adapters
9
+ export { MemoryStorage, LocalAdapter, SessionAdapter, LocalMedium, SessionMedium } from "./storage";
10
+ // Decorators
11
+ export { reactive, prop, computed, params, routeQuery } from "./decorators";
12
+ // Watch
13
+ export { watch } from "./watch";
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/store/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,sBAAsB;AACtB,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAGvD,mBAAmB;AACnB,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAGpG,aAAa;AACb,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE5E,QAAQ;AACR,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC"}
@@ -4,21 +4,21 @@
4
4
  * Reactive<T> — Observable value container for any shape
5
5
  * CollectionStore<T> — CRUD over Reactive<T[]> for identifiable items
6
6
  *
7
- * Both support optional persistent storage via StorageMedium.
7
+ * Both support optional persistent storage via StorageAdapter.
8
8
  */
9
9
  import type { PersistOptions } from "./storage";
10
10
  export type Subscriber<T> = (value: T, prev: T) => void;
11
11
  export type Updater<T> = T | ((prev: T) => T);
12
12
  /**
13
13
  * Observable value container. Works with any data shape.
14
- * Optionally backs to a StorageMedium for auto-persistence.
14
+ * Optionally backs to a StorageAdapter for auto-persistence.
15
15
  *
16
16
  * ```ts
17
17
  * // In-memory (default)
18
18
  * const count = new Reactive(0);
19
19
  *
20
20
  * // Auto-persisted to localStorage
21
- * const count = new Reactive(0, { key: "app:count", storage: new LocalMedium() });
21
+ * const count = new Reactive(0, { key: "app:count", storage: new LocalAdapter() });
22
22
  * ```
23
23
  */
24
24
  export declare class Reactive<T> {
@@ -46,7 +46,7 @@ export interface Identifiable {
46
46
  }
47
47
  /**
48
48
  * CRUD collection backed by Reactive<T[]>.
49
- * Supports optional persistent storage via StorageMedium.
49
+ * Supports optional persistent storage via StorageAdapter.
50
50
  *
51
51
  * ```ts
52
52
  * // In-memory
@@ -55,7 +55,7 @@ export interface Identifiable {
55
55
  * // Persisted to localStorage
56
56
  * const items = new CollectionStore<Item>([], {
57
57
  * key: "app:items",
58
- * storage: new LocalMedium(),
58
+ * storage: new LocalAdapter(),
59
59
  * });
60
60
  * ```
61
61
  */
@@ -69,6 +69,8 @@ export declare class CollectionStore<T extends Identifiable> extends Reactive<T[
69
69
  remove(id: string): void;
70
70
  /** Patch an item by id */
71
71
  update(id: string, patch: Partial<T>): T;
72
+ /** Clear all items (and persisted data if any) */
73
+ clear(): void;
72
74
  /** Find an item by id */
73
75
  find(id: string): T | undefined;
74
76
  }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reactive.d.ts","sourceRoot":"","sources":["../../src/store/reactive.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAkB,MAAM,WAAW,CAAC;AAEhE,MAAM,MAAM,UAAU,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,KAAK,IAAI,CAAC;AACxD,MAAM,MAAM,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;AAE9C;;;;;;;;;;;GAWG;AACH,qBAAa,QAAQ,CAAC,CAAC;IACrB,OAAO,CAAC,MAAM,CAAI;IAClB,OAAO,CAAC,IAAI,CAA4B;IACxC,OAAO,CAAC,IAAI,CAAC,CAAS;IACtB,OAAO,CAAC,QAAQ,CAAC,CAAiB;gBAEtB,OAAO,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,cAAc;IAqBhD,IAAI,KAAK,IAAI,CAAC,CAEb;IAED,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI;IAa3B,0DAA0D;IAC1D,SAAS,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI;IAKxC,wDAAwD;IACxD,KAAK,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI;IAKpC,gDAAgD;IAChD,KAAK,CAAC,OAAO,EAAE,CAAC,GAAG,IAAI;IAOvB,6EAA6E;IAC7E,WAAW,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI;CAM3C;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;CACZ;AAED;;;;;;;;;;;;;;GAcG;AACH,qBAAa,eAAe,CAC1B,CAAC,SAAS,YAAY,CACtB,SAAQ,QAAQ,CAAC,CAAC,EAAE,CAAC;gBACT,OAAO,GAAE,CAAC,EAAO,EAAE,OAAO,CAAC,EAAE,cAAc;IAIvD,+DAA+D;IAC/D,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG;QAAE,EAAE,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,CAAC;IAM7C,2BAA2B;IAC3B,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAIxB,0BAA0B;IAC1B,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IAYxC,kDAAkD;IAClD,KAAK,IAAI,IAAI;IAIb,yBAAyB;IACzB,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS;CAGhC"}
@@ -4,18 +4,18 @@
4
4
  * Reactive<T> — Observable value container for any shape
5
5
  * CollectionStore<T> — CRUD over Reactive<T[]> for identifiable items
6
6
  *
7
- * Both support optional persistent storage via StorageMedium.
7
+ * Both support optional persistent storage via StorageAdapter.
8
8
  */
9
9
  /**
10
10
  * Observable value container. Works with any data shape.
11
- * Optionally backs to a StorageMedium for auto-persistence.
11
+ * Optionally backs to a StorageAdapter for auto-persistence.
12
12
  *
13
13
  * ```ts
14
14
  * // In-memory (default)
15
15
  * const count = new Reactive(0);
16
16
  *
17
17
  * // Auto-persisted to localStorage
18
- * const count = new Reactive(0, { key: "app:count", storage: new LocalMedium() });
18
+ * const count = new Reactive(0, { key: "app:count", storage: new LocalAdapter() });
19
19
  * ```
20
20
  */
21
21
  export class Reactive {
@@ -87,7 +87,7 @@ export class Reactive {
87
87
  }
88
88
  /**
89
89
  * CRUD collection backed by Reactive<T[]>.
90
- * Supports optional persistent storage via StorageMedium.
90
+ * Supports optional persistent storage via StorageAdapter.
91
91
  *
92
92
  * ```ts
93
93
  * // In-memory
@@ -96,7 +96,7 @@ export class Reactive {
96
96
  * // Persisted to localStorage
97
97
  * const items = new CollectionStore<Item>([], {
98
98
  * key: "app:items",
99
- * storage: new LocalMedium(),
99
+ * storage: new LocalAdapter(),
100
100
  * });
101
101
  * ```
102
102
  */
@@ -125,6 +125,10 @@ export class CollectionStore extends Reactive {
125
125
  }));
126
126
  return updated;
127
127
  }
128
+ /** Clear all items (and persisted data if any) */
129
+ clear() {
130
+ super.clear([]);
131
+ }
128
132
  /** Find an item by id */
129
133
  find(id) {
130
134
  return this.value.find((i) => i.id === id);
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reactive.js","sourceRoot":"","sources":["../../src/store/reactive.ts"],"names":[],"mappings":"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"}