@toyz/loom 0.2.0 → 0.4.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/decorators/symbols.d.ts +2 -0
- package/dist/decorators/symbols.d.ts.map +1 -1
- package/dist/decorators/symbols.js +2 -0
- package/dist/decorators/symbols.js.map +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- 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 +6 -4
- package/dist/router/index.d.ts.map +1 -1
- package/dist/router/index.js +5 -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-lifecycle.d.ts +28 -0
- package/dist/router/route-lifecycle.d.ts.map +1 -0
- package/dist/router/route-lifecycle.js +37 -0
- package/dist/router/route-lifecycle.js.map +1 -0
- 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 +18 -4
- package/dist/router/router.d.ts.map +1 -1
- package/dist/router/router.js +57 -9
- package/dist/router/router.js.map +1 -1
- package/dist/store/decorators.d.ts +16 -0
- package/dist/store/decorators.d.ts.map +1 -1
- package/dist/store/decorators.js +107 -0
- package/dist/store/decorators.js.map +1 -1
- package/dist/store/index.d.ts +1 -1
- package/dist/store/index.d.ts.map +1 -1
- package/dist/store/index.js +1 -1
- package/dist/store/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -10,4 +10,6 @@ export declare const UNMOUNT_HANDLERS: unique symbol;
|
|
|
10
10
|
export declare const INJECT_PARAMS: unique symbol;
|
|
11
11
|
export declare const ROUTE_PROPS: unique symbol;
|
|
12
12
|
export declare const TRANSFORMS: unique symbol;
|
|
13
|
+
export declare const ROUTE_ENTER: unique symbol;
|
|
14
|
+
export declare const ROUTE_LEAVE: unique symbol;
|
|
13
15
|
//# sourceMappingURL=symbols.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"symbols.d.ts","sourceRoot":"","sources":["../../src/decorators/symbols.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,SAAS,eAA2B,CAAC;AAClD,eAAO,MAAM,KAAK,eAAuB,CAAC;AAC1C,eAAO,MAAM,WAAW,eAAoB,CAAC;AAC7C,eAAO,MAAM,QAAQ,eAAuB,CAAC;AAC7C,eAAO,MAAM,QAAQ,eAAsB,CAAC;AAC5C,eAAO,MAAM,cAAc,eAAgC,CAAC;AAC5D,eAAO,MAAM,aAAa,eAAuB,CAAC;AAClD,eAAO,MAAM,cAAc,eAAuB,CAAC;AACnD,eAAO,MAAM,gBAAgB,eAAyB,CAAC;AACvD,eAAO,MAAM,aAAa,eAA+B,CAAC;AAC1D,eAAO,MAAM,WAAW,eAA6B,CAAC;AACtD,eAAO,MAAM,UAAU,eAA4B,CAAC"}
|
|
1
|
+
{"version":3,"file":"symbols.d.ts","sourceRoot":"","sources":["../../src/decorators/symbols.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,SAAS,eAA2B,CAAC;AAClD,eAAO,MAAM,KAAK,eAAuB,CAAC;AAC1C,eAAO,MAAM,WAAW,eAAoB,CAAC;AAC7C,eAAO,MAAM,QAAQ,eAAuB,CAAC;AAC7C,eAAO,MAAM,QAAQ,eAAsB,CAAC;AAC5C,eAAO,MAAM,cAAc,eAAgC,CAAC;AAC5D,eAAO,MAAM,aAAa,eAAuB,CAAC;AAClD,eAAO,MAAM,cAAc,eAAuB,CAAC;AACnD,eAAO,MAAM,gBAAgB,eAAyB,CAAC;AACvD,eAAO,MAAM,aAAa,eAA+B,CAAC;AAC1D,eAAO,MAAM,WAAW,eAA6B,CAAC;AACtD,eAAO,MAAM,UAAU,eAA4B,CAAC;AACpD,eAAO,MAAM,WAAW,eAA6B,CAAC;AACtD,eAAO,MAAM,WAAW,eAA6B,CAAC"}
|
|
@@ -12,4 +12,6 @@ export const UNMOUNT_HANDLERS = Symbol("loom:unmount");
|
|
|
12
12
|
export const INJECT_PARAMS = Symbol("loom:inject:params");
|
|
13
13
|
export const ROUTE_PROPS = Symbol("loom:route:props");
|
|
14
14
|
export const TRANSFORMS = Symbol("loom:transforms");
|
|
15
|
+
export const ROUTE_ENTER = Symbol("loom:route:enter");
|
|
16
|
+
export const ROUTE_LEAVE = Symbol("loom:route:leave");
|
|
15
17
|
//# sourceMappingURL=symbols.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"symbols.js","sourceRoot":"","sources":["../../src/decorators/symbols.ts"],"names":[],"mappings":"AAAA,oBAAoB;AACpB,sDAAsD;AAEtD,MAAM,CAAC,MAAM,SAAS,GAAG,MAAM,CAAC,gBAAgB,CAAC,CAAC;AAClD,MAAM,CAAC,MAAM,KAAK,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;AAC1C,MAAM,CAAC,MAAM,WAAW,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;AAC7C,MAAM,CAAC,MAAM,QAAQ,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;AAC7C,MAAM,CAAC,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;AAC5C,MAAM,CAAC,MAAM,cAAc,GAAG,MAAM,CAAC,qBAAqB,CAAC,CAAC;AAC5D,MAAM,CAAC,MAAM,aAAa,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;AAClD,MAAM,CAAC,MAAM,cAAc,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;AACnD,MAAM,CAAC,MAAM,gBAAgB,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC;AACvD,MAAM,CAAC,MAAM,aAAa,GAAG,MAAM,CAAC,oBAAoB,CAAC,CAAC;AAC1D,MAAM,CAAC,MAAM,WAAW,GAAG,MAAM,CAAC,kBAAkB,CAAC,CAAC;AACtD,MAAM,CAAC,MAAM,UAAU,GAAG,MAAM,CAAC,iBAAiB,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"symbols.js","sourceRoot":"","sources":["../../src/decorators/symbols.ts"],"names":[],"mappings":"AAAA,oBAAoB;AACpB,sDAAsD;AAEtD,MAAM,CAAC,MAAM,SAAS,GAAG,MAAM,CAAC,gBAAgB,CAAC,CAAC;AAClD,MAAM,CAAC,MAAM,KAAK,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;AAC1C,MAAM,CAAC,MAAM,WAAW,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;AAC7C,MAAM,CAAC,MAAM,QAAQ,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;AAC7C,MAAM,CAAC,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;AAC5C,MAAM,CAAC,MAAM,cAAc,GAAG,MAAM,CAAC,qBAAqB,CAAC,CAAC;AAC5D,MAAM,CAAC,MAAM,aAAa,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;AAClD,MAAM,CAAC,MAAM,cAAc,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;AACnD,MAAM,CAAC,MAAM,gBAAgB,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC;AACvD,MAAM,CAAC,MAAM,aAAa,GAAG,MAAM,CAAC,oBAAoB,CAAC,CAAC;AAC1D,MAAM,CAAC,MAAM,WAAW,GAAG,MAAM,CAAC,kBAAkB,CAAC,CAAC;AACtD,MAAM,CAAC,MAAM,UAAU,GAAG,MAAM,CAAC,iBAAiB,CAAC,CAAC;AACpD,MAAM,CAAC,MAAM,WAAW,GAAG,MAAM,CAAC,kBAAkB,CAAC,CAAC;AACtD,MAAM,CAAC,MAAM,WAAW,GAAG,MAAM,CAAC,kBAAkB,CAAC,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -15,7 +15,7 @@ export { morph } from "./morph";
|
|
|
15
15
|
export { jsx, jsxs, Fragment } from "./jsx-runtime";
|
|
16
16
|
export { renderLoop } from "./render-loop";
|
|
17
17
|
export type { RenderLoop } from "./render-loop";
|
|
18
|
-
export { Reactive, CollectionStore, MemoryStorage, LocalAdapter, SessionAdapter, LocalMedium, SessionMedium, reactive, prop, computed, params, routeQuery, watch, } from "./store";
|
|
18
|
+
export { Reactive, CollectionStore, MemoryStorage, LocalAdapter, SessionAdapter, LocalMedium, SessionMedium, reactive, prop, computed, params, routeQuery, watch, store, } from "./store";
|
|
19
19
|
export type { Subscriber, Updater, Identifiable, StorageAdapter, StorageMedium, PersistOptions, } from "./store";
|
|
20
20
|
export { service, inject, factory } from "./di";
|
|
21
21
|
export { watch as watchService } from "./di";
|
|
@@ -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, onRouteEnter, onRouteLeave, } 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,
|
|
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,EACL,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,EACX,YAAY,EACZ,YAAY,GACb,MAAM,UAAU,CAAC;AAClB,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -19,7 +19,7 @@ export { jsx, jsxs, Fragment } from "./jsx-runtime";
|
|
|
19
19
|
export { renderLoop } from "./render-loop";
|
|
20
20
|
// ── Domain re-exports ──
|
|
21
21
|
// Store: reactive state, persistence
|
|
22
|
-
export { Reactive, CollectionStore, MemoryStorage, LocalAdapter, SessionAdapter, LocalMedium, SessionMedium, reactive, prop, computed, params, routeQuery, watch, } from "./store";
|
|
22
|
+
export { Reactive, CollectionStore, MemoryStorage, LocalAdapter, SessionAdapter, LocalMedium, SessionMedium, reactive, prop, computed, params, routeQuery, watch, store, } from "./store";
|
|
23
23
|
// DI: service container decorators
|
|
24
24
|
export { service, inject, factory } from "./di";
|
|
25
25
|
export { watch as watchService } from "./di";
|
|
@@ -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, onRouteEnter, onRouteLeave, } 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,
|
|
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,EACL,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,EACX,YAAY,EACZ,YAAY,GACb,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,15 @@
|
|
|
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";
|
|
16
|
+
export { onRouteEnter, onRouteLeave } from "./route-lifecycle";
|
|
15
17
|
//# 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;AAGlC,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,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";
|
|
@@ -17,4 +18,6 @@ export { LoomRouter } from "./router";
|
|
|
17
18
|
// Components
|
|
18
19
|
export { LoomOutlet } from "./outlet";
|
|
19
20
|
export { LoomLink } from "./link";
|
|
21
|
+
// Route lifecycle
|
|
22
|
+
export { onRouteEnter, onRouteLeave } from "./route-lifecycle";
|
|
20
23
|
//# sourceMappingURL=index.js.map
|
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;AAElC,kBAAkB;AAClB,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,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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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Loom — Route lifecycle decorators
|
|
3
|
+
*
|
|
4
|
+
* @onRouteEnter — Fires when the decorated route component becomes active
|
|
5
|
+
* @onRouteLeave — Fires when navigating away from the decorated route component
|
|
6
|
+
*
|
|
7
|
+
* ```ts
|
|
8
|
+
* @route("/dashboard")
|
|
9
|
+
* @component("page-dashboard")
|
|
10
|
+
* class Dashboard extends LoomElement {
|
|
11
|
+
* @onRouteEnter
|
|
12
|
+
* entered(params: Record<string, string>) { }
|
|
13
|
+
*
|
|
14
|
+
* @onRouteLeave
|
|
15
|
+
* left() { }
|
|
16
|
+
* }
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
/**
|
|
20
|
+
* Method decorator. Marks a method to be called when this route is entered.
|
|
21
|
+
* The method receives (params, query) from the matched route.
|
|
22
|
+
*/
|
|
23
|
+
export declare function onRouteEnter(target: any, key: string): void;
|
|
24
|
+
/**
|
|
25
|
+
* Method decorator. Marks a method to be called when navigating away from this route.
|
|
26
|
+
*/
|
|
27
|
+
export declare function onRouteLeave(target: any, key: string): void;
|
|
28
|
+
//# sourceMappingURL=route-lifecycle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"route-lifecycle.d.ts","sourceRoot":"","sources":["../../src/router/route-lifecycle.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAIH;;;GAGG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAG3D;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAG3D"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Loom — Route lifecycle decorators
|
|
3
|
+
*
|
|
4
|
+
* @onRouteEnter — Fires when the decorated route component becomes active
|
|
5
|
+
* @onRouteLeave — Fires when navigating away from the decorated route component
|
|
6
|
+
*
|
|
7
|
+
* ```ts
|
|
8
|
+
* @route("/dashboard")
|
|
9
|
+
* @component("page-dashboard")
|
|
10
|
+
* class Dashboard extends LoomElement {
|
|
11
|
+
* @onRouteEnter
|
|
12
|
+
* entered(params: Record<string, string>) { }
|
|
13
|
+
*
|
|
14
|
+
* @onRouteLeave
|
|
15
|
+
* left() { }
|
|
16
|
+
* }
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
import { ROUTE_ENTER, ROUTE_LEAVE } from "../decorators/symbols";
|
|
20
|
+
/**
|
|
21
|
+
* Method decorator. Marks a method to be called when this route is entered.
|
|
22
|
+
* The method receives (params, query) from the matched route.
|
|
23
|
+
*/
|
|
24
|
+
export function onRouteEnter(target, key) {
|
|
25
|
+
if (!target[ROUTE_ENTER])
|
|
26
|
+
target[ROUTE_ENTER] = [];
|
|
27
|
+
target[ROUTE_ENTER].push(key);
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Method decorator. Marks a method to be called when navigating away from this route.
|
|
31
|
+
*/
|
|
32
|
+
export function onRouteLeave(target, key) {
|
|
33
|
+
if (!target[ROUTE_LEAVE])
|
|
34
|
+
target[ROUTE_LEAVE] = [];
|
|
35
|
+
target[ROUTE_LEAVE].push(key);
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=route-lifecycle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"route-lifecycle.js","sourceRoot":"","sources":["../../src/router/route-lifecycle.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEjE;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,MAAW,EAAE,GAAW;IACnD,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;QAAE,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC;IACnD,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAChC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,MAAW,EAAE,GAAW;IACnD,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;QAAE,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC;IACnD,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAChC,CAAC"}
|
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>;
|
|
@@ -16,21 +21,30 @@ export interface RouteInfo {
|
|
|
16
21
|
export declare class LoomRouter {
|
|
17
22
|
readonly mode: RouterMode;
|
|
18
23
|
private _current;
|
|
24
|
+
private _previousTag;
|
|
25
|
+
/** Optional outlet reference for lifecycle dispatch */
|
|
26
|
+
private _outlet;
|
|
27
|
+
/** Register the outlet so lifecycle hooks can find rendered elements */
|
|
28
|
+
setOutlet(el: HTMLElement): void;
|
|
19
29
|
constructor(opts?: RouterOptions);
|
|
20
30
|
/** Current route info (read-only snapshot) */
|
|
21
31
|
get current(): Readonly<RouteInfo>;
|
|
22
32
|
/** Start listening for URL changes and resolve the initial route */
|
|
23
33
|
start(): () => void;
|
|
24
|
-
/** Navigate to a path */
|
|
25
|
-
go(
|
|
34
|
+
/** Navigate to a path or named route */
|
|
35
|
+
go(target: RouteTarget): Promise<void>;
|
|
36
|
+
/** Alias for go() */
|
|
37
|
+
navigate(target: RouteTarget): Promise<void>;
|
|
26
38
|
/** Navigate without creating a history entry */
|
|
27
|
-
replace(
|
|
39
|
+
replace(target: RouteTarget): Promise<void>;
|
|
28
40
|
/** Go back in history */
|
|
29
41
|
back(): void;
|
|
30
42
|
/** Go forward in history */
|
|
31
43
|
forward(): void;
|
|
32
44
|
/** Build an href for the current mode */
|
|
33
|
-
href(
|
|
45
|
+
href(target: RouteTarget): string;
|
|
46
|
+
/** Resolve a RouteTarget to a path string */
|
|
47
|
+
private _resolvePath;
|
|
34
48
|
/** Resolve the current URL against the route table and emit RouteChanged */
|
|
35
49
|
private _resolve;
|
|
36
50
|
/**
|
|
@@ -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;
|
|
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;IACnE,OAAO,CAAC,YAAY,CAAuB;IAC3C,uDAAuD;IACvD,OAAO,CAAC,OAAO,CAA4B;IAE3C,wEAAwE;IACxE,SAAS,CAAC,EAAE,EAAE,WAAW,GAAG,IAAI;gBAIpB,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;IAgDhB;;;;;;OAMG;YACW,YAAY;IAwC1B;;;OAGG;IACH,OAAO,CAAC,oBAAoB;CAe7B"}
|
package/dist/router/router.js
CHANGED
|
@@ -6,14 +6,21 @@
|
|
|
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
|
-
import { INJECT_PARAMS } from "../decorators/symbols";
|
|
12
|
+
import { INJECT_PARAMS, ROUTE_ENTER, ROUTE_LEAVE } from "../decorators/symbols";
|
|
13
13
|
import { app } from "../app";
|
|
14
14
|
export class LoomRouter {
|
|
15
15
|
mode;
|
|
16
16
|
_current = { path: "/", params: {}, tag: null };
|
|
17
|
+
_previousTag = null;
|
|
18
|
+
/** Optional outlet reference for lifecycle dispatch */
|
|
19
|
+
_outlet = null;
|
|
20
|
+
/** Register the outlet so lifecycle hooks can find rendered elements */
|
|
21
|
+
setOutlet(el) {
|
|
22
|
+
this._outlet = el;
|
|
23
|
+
}
|
|
17
24
|
constructor(opts = {}) {
|
|
18
25
|
this.mode = opts.mode === "history" ? new HistoryMode() : new HashMode();
|
|
19
26
|
}
|
|
@@ -27,20 +34,25 @@ export class LoomRouter {
|
|
|
27
34
|
this._resolve();
|
|
28
35
|
return cleanup;
|
|
29
36
|
}
|
|
30
|
-
/** Navigate to a path */
|
|
31
|
-
async go(
|
|
37
|
+
/** Navigate to a path or named route */
|
|
38
|
+
async go(target) {
|
|
39
|
+
const path = this._resolvePath(target);
|
|
32
40
|
const allowed = await this._checkGuards(path);
|
|
33
41
|
if (allowed === false)
|
|
34
42
|
return;
|
|
35
43
|
if (typeof allowed === "string") {
|
|
36
|
-
// Redirect
|
|
37
44
|
return this.go(allowed);
|
|
38
45
|
}
|
|
39
46
|
this.mode.write(path);
|
|
40
47
|
this._resolve();
|
|
41
48
|
}
|
|
49
|
+
/** Alias for go() */
|
|
50
|
+
navigate(target) {
|
|
51
|
+
return this.go(target);
|
|
52
|
+
}
|
|
42
53
|
/** Navigate without creating a history entry */
|
|
43
|
-
async replace(
|
|
54
|
+
async replace(target) {
|
|
55
|
+
const path = this._resolvePath(target);
|
|
44
56
|
const allowed = await this._checkGuards(path);
|
|
45
57
|
if (allowed === false)
|
|
46
58
|
return;
|
|
@@ -59,20 +71,56 @@ export class LoomRouter {
|
|
|
59
71
|
history.forward();
|
|
60
72
|
}
|
|
61
73
|
/** Build an href for the current mode */
|
|
62
|
-
href(
|
|
63
|
-
return this.mode.href(
|
|
74
|
+
href(target) {
|
|
75
|
+
return this.mode.href(this._resolvePath(target));
|
|
76
|
+
}
|
|
77
|
+
/** Resolve a RouteTarget to a path string */
|
|
78
|
+
_resolvePath(target) {
|
|
79
|
+
if (typeof target === "string")
|
|
80
|
+
return target;
|
|
81
|
+
return buildPath(target.name, target.params);
|
|
64
82
|
}
|
|
65
83
|
/** Resolve the current URL against the route table and emit RouteChanged */
|
|
66
84
|
_resolve() {
|
|
67
85
|
const path = this.mode.read();
|
|
68
86
|
const match = matchRoute(path);
|
|
69
87
|
const previous = this._current.path;
|
|
88
|
+
const newTag = match?.entry.tag ?? null;
|
|
89
|
+
// ── Route lifecycle hooks ──
|
|
90
|
+
const tagChanged = this._previousTag !== newTag;
|
|
91
|
+
// Call @onRouteLeave on the old element
|
|
92
|
+
if (tagChanged && this._previousTag && this._outlet) {
|
|
93
|
+
const oldEl = this._outlet.shadowRoot?.querySelector(this._previousTag)
|
|
94
|
+
?? this._outlet.querySelector(this._previousTag);
|
|
95
|
+
if (oldEl) {
|
|
96
|
+
const handlers = oldEl[ROUTE_LEAVE]
|
|
97
|
+
?? Object.getPrototypeOf(oldEl)?.[ROUTE_LEAVE] ?? [];
|
|
98
|
+
for (const key of handlers) {
|
|
99
|
+
oldEl[key]?.();
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
70
103
|
this._current = {
|
|
71
104
|
path,
|
|
72
105
|
params: match?.params ?? {},
|
|
73
|
-
tag:
|
|
106
|
+
tag: newTag,
|
|
74
107
|
};
|
|
75
108
|
bus.emit(new RouteChanged(path, this._current.params, previous));
|
|
109
|
+
// Call @onRouteEnter on the new element (after DOM update via microtask)
|
|
110
|
+
if (tagChanged && newTag && this._outlet) {
|
|
111
|
+
queueMicrotask(() => {
|
|
112
|
+
const newEl = this._outlet?.shadowRoot?.querySelector(newTag)
|
|
113
|
+
?? this._outlet?.querySelector(newTag);
|
|
114
|
+
if (newEl) {
|
|
115
|
+
const handlers = newEl[ROUTE_ENTER]
|
|
116
|
+
?? Object.getPrototypeOf(newEl)?.[ROUTE_ENTER] ?? [];
|
|
117
|
+
for (const key of handlers) {
|
|
118
|
+
newEl[key]?.(this._current.params);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
this._previousTag = newTag;
|
|
76
124
|
}
|
|
77
125
|
/**
|
|
78
126
|
* Run guards for the target route.
|
|
@@ -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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"}
|
|
@@ -4,7 +4,9 @@
|
|
|
4
4
|
* @reactive — Internal reactive state backed by Reactive<T>
|
|
5
5
|
* @prop — External attribute with optional route binding
|
|
6
6
|
* @computed — Cached derived getter
|
|
7
|
+
* @store — Component-scoped reactive store with optional persistence
|
|
7
8
|
*/
|
|
9
|
+
import type { PersistOptions } from "./storage";
|
|
8
10
|
/** Sentinel for full route-param decompose: `@prop({params}) p!: MyType` */
|
|
9
11
|
export declare const params: unique symbol;
|
|
10
12
|
/** Sentinel for full query-param decompose: `@prop({query}) q!: MyType` */
|
|
@@ -45,4 +47,18 @@ export declare function prop(targetOrOpts: any, key?: any): any;
|
|
|
45
47
|
* ```
|
|
46
48
|
*/
|
|
47
49
|
export declare function computed(target: any, key: string, desc: PropertyDescriptor): void;
|
|
50
|
+
/**
|
|
51
|
+
* Component-scoped reactive store with optional persistence.
|
|
52
|
+
* Creates a deep Proxy so nested mutations trigger re-render.
|
|
53
|
+
*
|
|
54
|
+
* ```ts
|
|
55
|
+
* @store<TodoState>({ items: [], filter: "all" })
|
|
56
|
+
* state!: TodoState;
|
|
57
|
+
*
|
|
58
|
+
* // Persisted
|
|
59
|
+
* @store<TodoState>({ items: [], filter: "all" }, { key: "todos", storage: new LocalAdapter() })
|
|
60
|
+
* state!: TodoState;
|
|
61
|
+
* ```
|
|
62
|
+
*/
|
|
63
|
+
export declare function store<T extends object>(defaults: T, persist?: PersistOptions): (target: any, propertyKey: string) => void;
|
|
48
64
|
//# sourceMappingURL=decorators.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"decorators.d.ts","sourceRoot":"","sources":["../../src/store/decorators.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"decorators.d.ts","sourceRoot":"","sources":["../../src/store/decorators.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAKhD,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;AA+DD;;;;;;;;;;;;GAYG;AACH,wBAAgB,KAAK,CAAC,CAAC,SAAS,MAAM,EACpC,QAAQ,EAAE,CAAC,EACX,OAAO,CAAC,EAAE,cAAc,IAEP,QAAQ,GAAG,EAAE,aAAa,MAAM,KAAG,IAAI,CAgDzD"}
|
package/dist/store/decorators.js
CHANGED
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
* @reactive — Internal reactive state backed by Reactive<T>
|
|
5
5
|
* @prop — External attribute with optional route binding
|
|
6
6
|
* @computed — Cached derived getter
|
|
7
|
+
* @store — Component-scoped reactive store with optional persistence
|
|
7
8
|
*/
|
|
8
9
|
import { REACTIVES, PROPS, WATCHERS, EMITTERS, COMPUTED_DIRTY, ROUTE_PROPS } from "../decorators/symbols";
|
|
9
10
|
import { Reactive } from "./reactive";
|
|
@@ -131,4 +132,110 @@ export function computed(target, key, desc) {
|
|
|
131
132
|
target[COMPUTED_DIRTY] = [];
|
|
132
133
|
target[COMPUTED_DIRTY].push(dirtyKey);
|
|
133
134
|
}
|
|
135
|
+
// ── @store decorator ──
|
|
136
|
+
// Symbol for store metadata on prototype
|
|
137
|
+
const STORE_META = Symbol("loom:store:meta");
|
|
138
|
+
/**
|
|
139
|
+
* Create a deep proxy that intercepts mutations and notifies the Reactive.
|
|
140
|
+
* Handles nested objects and arrays (push, splice, etc.).
|
|
141
|
+
*/
|
|
142
|
+
function createDeepProxy(obj, onChange, persist) {
|
|
143
|
+
const proxyCache = new WeakMap();
|
|
144
|
+
function wrap(target) {
|
|
145
|
+
if (target === null || typeof target !== "object")
|
|
146
|
+
return target;
|
|
147
|
+
if (proxyCache.has(target))
|
|
148
|
+
return proxyCache.get(target);
|
|
149
|
+
const proxy = new Proxy(target, {
|
|
150
|
+
get(t, prop, receiver) {
|
|
151
|
+
const value = Reflect.get(t, prop, receiver);
|
|
152
|
+
// Wrap nested objects/arrays lazily
|
|
153
|
+
if (value !== null && typeof value === "object" && typeof prop !== "symbol") {
|
|
154
|
+
return wrap(value);
|
|
155
|
+
}
|
|
156
|
+
return value;
|
|
157
|
+
},
|
|
158
|
+
set(t, prop, value, receiver) {
|
|
159
|
+
const result = Reflect.set(t, prop, value, receiver);
|
|
160
|
+
// Persist directly — Reactive.set() would skip (same object ref)
|
|
161
|
+
if (persist) {
|
|
162
|
+
persist.storage.set(persist.key, JSON.stringify(obj));
|
|
163
|
+
}
|
|
164
|
+
onChange();
|
|
165
|
+
return result;
|
|
166
|
+
},
|
|
167
|
+
deleteProperty(t, prop) {
|
|
168
|
+
const result = Reflect.deleteProperty(t, prop);
|
|
169
|
+
if (persist) {
|
|
170
|
+
persist.storage.set(persist.key, JSON.stringify(obj));
|
|
171
|
+
}
|
|
172
|
+
onChange();
|
|
173
|
+
return result;
|
|
174
|
+
},
|
|
175
|
+
});
|
|
176
|
+
proxyCache.set(target, proxy);
|
|
177
|
+
return proxy;
|
|
178
|
+
}
|
|
179
|
+
return wrap(obj);
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Component-scoped reactive store with optional persistence.
|
|
183
|
+
* Creates a deep Proxy so nested mutations trigger re-render.
|
|
184
|
+
*
|
|
185
|
+
* ```ts
|
|
186
|
+
* @store<TodoState>({ items: [], filter: "all" })
|
|
187
|
+
* state!: TodoState;
|
|
188
|
+
*
|
|
189
|
+
* // Persisted
|
|
190
|
+
* @store<TodoState>({ items: [], filter: "all" }, { key: "todos", storage: new LocalAdapter() })
|
|
191
|
+
* state!: TodoState;
|
|
192
|
+
* ```
|
|
193
|
+
*/
|
|
194
|
+
export function store(defaults, persist) {
|
|
195
|
+
return function (target, propertyKey) {
|
|
196
|
+
// Accumulate metadata on the prototype
|
|
197
|
+
if (!target[STORE_META])
|
|
198
|
+
target[STORE_META] = [];
|
|
199
|
+
const meta = { key: propertyKey, defaults, persist };
|
|
200
|
+
target[STORE_META].push(meta);
|
|
201
|
+
// Storage symbol for the backing Reactive
|
|
202
|
+
const reactiveKey = Symbol(`store:${propertyKey}`);
|
|
203
|
+
const proxyKey = Symbol(`store:proxy:${propertyKey}`);
|
|
204
|
+
Object.defineProperty(target, propertyKey, {
|
|
205
|
+
get() {
|
|
206
|
+
// Lazy init on first access
|
|
207
|
+
if (!this[reactiveKey]) {
|
|
208
|
+
// Deep clone defaults so each instance is isolated
|
|
209
|
+
const initial = JSON.parse(JSON.stringify(defaults));
|
|
210
|
+
const r = new Reactive(initial, persist);
|
|
211
|
+
this[reactiveKey] = r;
|
|
212
|
+
// Subscribe to trigger re-render
|
|
213
|
+
r.subscribe(() => this.scheduleUpdate?.());
|
|
214
|
+
// Create the proxy over the reactive's value
|
|
215
|
+
const notifyChange = () => this.scheduleUpdate?.();
|
|
216
|
+
this[proxyKey] = createDeepProxy(r.value, notifyChange, persist);
|
|
217
|
+
}
|
|
218
|
+
return this[proxyKey];
|
|
219
|
+
},
|
|
220
|
+
set(val) {
|
|
221
|
+
if (!this[reactiveKey]) {
|
|
222
|
+
// First set — init the reactive
|
|
223
|
+
const r = new Reactive(val, persist);
|
|
224
|
+
this[reactiveKey] = r;
|
|
225
|
+
r.subscribe(() => this.scheduleUpdate?.());
|
|
226
|
+
const notifyChange = () => this.scheduleUpdate?.();
|
|
227
|
+
this[proxyKey] = createDeepProxy(r.value, notifyChange, persist);
|
|
228
|
+
}
|
|
229
|
+
else {
|
|
230
|
+
// Full replacement
|
|
231
|
+
this[reactiveKey].set(val);
|
|
232
|
+
const notifyChange = () => this.scheduleUpdate?.();
|
|
233
|
+
this[proxyKey] = createDeepProxy(this[reactiveKey].value, notifyChange, persist);
|
|
234
|
+
}
|
|
235
|
+
},
|
|
236
|
+
enumerable: true,
|
|
237
|
+
configurable: true,
|
|
238
|
+
});
|
|
239
|
+
};
|
|
240
|
+
}
|
|
134
241
|
//# sourceMappingURL=decorators.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"decorators.js","sourceRoot":"","sources":["../../src/store/decorators.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"decorators.js","sourceRoot":"","sources":["../../src/store/decorators.ts"],"names":[],"mappings":"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"}
|
package/dist/store/index.d.ts
CHANGED
|
@@ -7,6 +7,6 @@ export { Reactive, CollectionStore } from "./reactive";
|
|
|
7
7
|
export type { Subscriber, Updater, Identifiable } from "./reactive";
|
|
8
8
|
export { MemoryStorage, LocalAdapter, SessionAdapter, LocalMedium, SessionMedium } from "./storage";
|
|
9
9
|
export type { StorageAdapter, StorageMedium, PersistOptions } from "./storage";
|
|
10
|
-
export { reactive, prop, computed, params, routeQuery } from "./decorators";
|
|
10
|
+
export { reactive, prop, computed, params, routeQuery, store } from "./decorators";
|
|
11
11
|
export { watch } from "./watch";
|
|
12
12
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +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;
|
|
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,KAAK,EAAE,MAAM,cAAc,CAAC;AAGnF,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC"}
|
package/dist/store/index.js
CHANGED
|
@@ -8,7 +8,7 @@ export { Reactive, CollectionStore } from "./reactive";
|
|
|
8
8
|
// Storage adapters
|
|
9
9
|
export { MemoryStorage, LocalAdapter, SessionAdapter, LocalMedium, SessionMedium } from "./storage";
|
|
10
10
|
// Decorators
|
|
11
|
-
export { reactive, prop, computed, params, routeQuery } from "./decorators";
|
|
11
|
+
export { reactive, prop, computed, params, routeQuery, store } from "./decorators";
|
|
12
12
|
// Watch
|
|
13
13
|
export { watch } from "./watch";
|
|
14
14
|
//# sourceMappingURL=index.js.map
|
package/dist/store/index.js.map
CHANGED
|
@@ -1 +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;
|
|
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,KAAK,EAAE,MAAM,cAAc,CAAC;AAEnF,QAAQ;AACR,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC"}
|