nexa-router 0.9.0 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import { type RouteDef, type Guard } from './route';
2
2
  import { type Component } from 'nexa-runtime';
3
- export type { RouteDef, Guard } from './route';
4
- export { matchPath } from './route';
3
+ export type { RouteDef, MatchedRoute, Guard } from './route';
4
+ export { matchPath, matchRoutes, ROUTER_DEPTH_KEY } from './route';
5
5
  export { Link } from './link';
6
6
  export { createGuards } from './guards';
7
7
  export { RouterView } from './view';
@@ -21,7 +21,10 @@ type RouterConfig = {
21
21
  beforeEach: Guard[];
22
22
  };
23
23
  };
24
- type ResolvedRoute = Omit<RouteDef, 'component'> & {
24
+ export type ResolvedRoute = {
25
+ route: RouteDef;
26
+ path: string;
27
+ params: Record<string, string>;
25
28
  component: Component | LazyComponent;
26
29
  loaded: boolean;
27
30
  };
@@ -29,11 +32,16 @@ export declare function createRouter(config: RouterConfig): {
29
32
  navigate: (path: string) => Promise<void>;
30
33
  beforeEach: (guard: Guard) => void;
31
34
  currentRoute: import("nexa-reactivity").Signal<ResolvedRoute | null>;
35
+ currentRouteChain: import("nexa-reactivity").Signal<ResolvedRoute[] | null>;
32
36
  currentPath: import("nexa-reactivity").Signal<string>;
33
37
  params: import("nexa-reactivity").Signal<Record<string, string>>;
34
38
  query: import("nexa-reactivity").Signal<Record<string, string>>;
35
39
  loading: import("nexa-reactivity").Signal<boolean>;
36
- loadComponent: (route: ResolvedRoute) => Promise<Component | null>;
40
+ loadComponent: (route: {
41
+ path: string;
42
+ component?: RouteComponent | null;
43
+ loaded: boolean;
44
+ }) => Promise<Component | null>;
37
45
  scrollPositions: Map<string, number>;
38
46
  };
39
47
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAyB,KAAK,QAAQ,EAAE,KAAK,KAAK,EAAE,MAAM,SAAS,CAAA;AAC1E,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,cAAc,CAAA;AAE7C,YAAY,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AACnC,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AAC7B,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAA;AAEnC,KAAK,aAAa,GAAG,MAAM,OAAO,CAAC;IAAE,OAAO,EAAE,SAAS,CAAA;CAAE,CAAC,CAAA;AAC1D,KAAK,cAAc,GAAG,SAAS,GAAG,aAAa,CAAA;AAE/C,wBAAgB,IAAI,CAAC,UAAU,EAAE,MAAM,OAAO,CAAC;IAAE,OAAO,EAAE,SAAS,CAAA;CAAE,CAAC,GAAG,aAAa,CAErF;AAED,KAAK,YAAY,GAAG;IAClB,MAAM,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG;QAAE,SAAS,CAAC,EAAE,cAAc,CAAA;KAAE,CAAC,EAAE,CAAA;IACxE,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IACzB,MAAM,CAAC,EAAE;QAAE,UAAU,EAAE,KAAK,EAAE,CAAA;KAAE,CAAA;CACjC,CAAA;AAED,KAAK,aAAa,GAAG,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG;IAAE,SAAS,EAAE,SAAS,GAAG,aAAa,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,CAAA;AAE5G,wBAAgB,YAAY,CAAC,MAAM,EAAE,YAAY;qBAiEjB,MAAM;wBAJT,KAAK;;;;;;2BAjBI,aAAa,KAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;;EA+D9E"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAA2B,KAAK,QAAQ,EAAqB,KAAK,KAAK,EAAE,MAAM,SAAS,CAAA;AAC/F,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,cAAc,CAAA;AAE7C,YAAY,EAAE,QAAQ,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAC5D,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAClE,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AAC7B,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAA;AAEnC,KAAK,aAAa,GAAG,MAAM,OAAO,CAAC;IAAE,OAAO,EAAE,SAAS,CAAA;CAAE,CAAC,CAAA;AAC1D,KAAK,cAAc,GAAG,SAAS,GAAG,aAAa,CAAA;AAE/C,wBAAgB,IAAI,CAAC,UAAU,EAAE,MAAM,OAAO,CAAC;IAAE,OAAO,EAAE,SAAS,CAAA;CAAE,CAAC,GAAG,aAAa,CAErF;AAED,KAAK,YAAY,GAAG;IAClB,MAAM,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG;QAAE,SAAS,CAAC,EAAE,cAAc,CAAA;KAAE,CAAC,EAAE,CAAA;IACxE,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IACzB,MAAM,CAAC,EAAE;QAAE,UAAU,EAAE,KAAK,EAAE,CAAA;KAAE,CAAA;CACjC,CAAA;AAED,MAAM,MAAM,aAAa,GAAG;IAC1B,KAAK,EAAE,QAAQ,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC9B,SAAS,EAAE,SAAS,GAAG,aAAa,CAAA;IACpC,MAAM,EAAE,OAAO,CAAA;CAChB,CAAA;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,YAAY;qBAyEjB,MAAM;wBAJT,KAAK;;;;;;;2BAbI;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,cAAc,GAAG,IAAI,CAAC;QAAC,MAAM,EAAE,OAAO,CAAA;KAAE,KAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;;EA4DrI"}
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { signal, computed } from 'nexa-reactivity';
2
- import { matchPath, parseQuery } from './route';
3
- export { matchPath } from './route';
2
+ import { matchRoutes, parseQuery } from './route';
3
+ export { matchPath, matchRoutes, ROUTER_DEPTH_KEY } from './route';
4
4
  export { Link } from './link';
5
5
  export { createGuards } from './guards';
6
6
  export { RouterView } from './view';
@@ -9,53 +9,64 @@ export function lazy(middleware) {
9
9
  }
10
10
  export function createRouter(config) {
11
11
  const currentPath = signal(window.location.pathname + window.location.search);
12
- const params = signal({});
13
- const query = signal({});
12
+ const rawQuery = computed(() => {
13
+ return currentPath.value.includes('?') ? currentPath.value.split('?')[1] || '' : '';
14
+ });
15
+ const query = computed(() => parseQuery(rawQuery.value));
14
16
  const guards = config.guards?.beforeEach ?? [];
15
17
  const loading = signal(false);
16
18
  const loadedComponents = new Map();
17
19
  const pendingPromises = new Map();
18
- const currentRoute = computed(() => {
19
- const [path, search] = currentPath.value.split('?');
20
- query.value = parseQuery(search || '');
21
- for (const route of config.routes) {
22
- const match = matchPath(route.path, path);
23
- if (match) {
24
- params.value = match;
25
- let component = route.component;
26
- if (!component)
27
- return { ...route, component: null, loaded: true };
28
- if (typeof component === 'function') {
29
- if (loadedComponents.has(route.path)) {
30
- return { ...route, component: loadedComponents.get(route.path), loaded: true };
31
- }
32
- return { ...route, component, loaded: false };
33
- }
34
- loadedComponents.set(route.path, component);
35
- return { ...route, component, loaded: true };
36
- }
37
- }
38
- const fallback = config.routes.find(r => r.path === '*');
39
- if (fallback && fallback.component) {
40
- if (typeof fallback.component === 'function') {
41
- if (loadedComponents.has(fallback.path)) {
42
- return { ...fallback, component: loadedComponents.get(fallback.path), loaded: true };
43
- }
44
- return { ...fallback, component: fallback.component, loaded: false };
20
+ function resolveComponent(seg) {
21
+ const comp = seg.route.component;
22
+ if (!comp)
23
+ return { component: null, loaded: true };
24
+ if (typeof comp === 'function') {
25
+ if (loadedComponents.has(seg.path)) {
26
+ return { component: loadedComponents.get(seg.path), loaded: true };
45
27
  }
46
- return { ...fallback, component: fallback.component, loaded: true };
28
+ return { component: comp, loaded: false };
47
29
  }
30
+ loadedComponents.set(seg.path, comp);
31
+ return { component: comp, loaded: true };
32
+ }
33
+ function buildChain(chain) {
34
+ return chain.map(seg => ({
35
+ route: seg.route,
36
+ path: seg.path,
37
+ params: seg.params,
38
+ ...resolveComponent(seg),
39
+ }));
40
+ }
41
+ const currentRouteChain = computed(() => {
42
+ const [pathname] = currentPath.value.split('?');
43
+ const result = matchRoutes(config.routes, pathname);
44
+ if (result)
45
+ return buildChain(result.chain);
46
+ const wildcard = config.routes.find(r => r.path === '*');
47
+ if (wildcard)
48
+ return buildChain([{ route: wildcard, params: {}, path: pathname }]);
48
49
  return null;
49
50
  });
51
+ const params = computed(() => {
52
+ const chain = currentRouteChain.value;
53
+ if (!chain || chain.length === 0)
54
+ return {};
55
+ return chain.reduce((acc, seg) => ({ ...acc, ...seg.params }), {});
56
+ });
57
+ const currentRoute = computed(() => {
58
+ const chain = currentRouteChain.value;
59
+ if (!chain || chain.length === 0)
60
+ return null;
61
+ return chain[chain.length - 1];
62
+ });
50
63
  async function loadComponent(route) {
51
64
  if (route.loaded || !route.component)
52
65
  return route.component;
53
- if (loadedComponents.has(route.path)) {
66
+ if (loadedComponents.has(route.path))
54
67
  return loadedComponents.get(route.path);
55
- }
56
- if (pendingPromises.has(route.path)) {
68
+ if (pendingPromises.has(route.path))
57
69
  return pendingPromises.get(route.path);
58
- }
59
70
  const promise = route.component().then(mod => {
60
71
  loadedComponents.set(route.path, mod.default);
61
72
  pendingPromises.delete(route.path);
@@ -99,6 +110,7 @@ export function createRouter(config) {
99
110
  navigate,
100
111
  beforeEach,
101
112
  currentRoute,
113
+ currentRouteChain,
102
114
  currentPath,
103
115
  params,
104
116
  query,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/route.d.ts CHANGED
@@ -1,9 +1,22 @@
1
1
  import type { Component } from 'nexa-runtime';
2
2
  export type RouteDef = {
3
3
  path: string;
4
- component: Component;
4
+ component?: Component | (() => Promise<{
5
+ default: Component;
6
+ }>);
7
+ children?: RouteDef[];
8
+ };
9
+ export type MatchedRoute = {
10
+ route: RouteDef;
11
+ params: Record<string, string>;
12
+ path: string;
5
13
  };
6
14
  export type Guard = (to: string, from: string) => boolean | Promise<boolean>;
15
+ export declare const ROUTER_DEPTH_KEY = "__routerDepth__";
7
16
  export declare function matchPath(pattern: string, path: string): Record<string, string> | null;
17
+ export declare function matchRoutes(routes: RouteDef[], pathname: string): {
18
+ chain: MatchedRoute[];
19
+ params: Record<string, string>;
20
+ } | null;
8
21
  export declare function parseQuery(search: string): Record<string, string>;
9
22
  //# sourceMappingURL=route.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../src/route.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAE7C,MAAM,MAAM,QAAQ,GAAG;IACrB,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,SAAS,CAAA;CACrB,CAAA;AAED,MAAM,MAAM,KAAK,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;AAE5E,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAsBtF;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAGjE"}
1
+ {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../src/route.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAE7C,MAAM,MAAM,QAAQ,GAAG;IACrB,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,CAAC,EAAE,SAAS,GAAG,CAAC,MAAM,OAAO,CAAC;QAAE,OAAO,EAAE,SAAS,CAAA;KAAE,CAAC,CAAC,CAAA;IAC/D,QAAQ,CAAC,EAAE,QAAQ,EAAE,CAAA;CACtB,CAAA;AAED,MAAM,MAAM,YAAY,GAAG;IACzB,KAAK,EAAE,QAAQ,CAAA;IACf,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC9B,IAAI,EAAE,MAAM,CAAA;CACb,CAAA;AAED,MAAM,MAAM,KAAK,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;AAE5E,eAAO,MAAM,gBAAgB,oBAAoB,CAAA;AA4BjD,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAMtF;AAED,wBAAgB,WAAW,CACzB,MAAM,EAAE,QAAQ,EAAE,EAClB,QAAQ,EAAE,MAAM,GACf;IAAE,KAAK,EAAE,YAAY,EAAE,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,GAAG,IAAI,CAElE;AAiCD,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAGjE"}
package/dist/route.js CHANGED
@@ -1,23 +1,63 @@
1
- export function matchPath(pattern, path) {
2
- const [pathname] = path.split('?');
1
+ export const ROUTER_DEPTH_KEY = '__routerDepth__';
2
+ function joinPaths(parent, child) {
3
+ if (!child)
4
+ return parent;
5
+ if (child.startsWith('/'))
6
+ return child;
7
+ const base = parent.endsWith('/') ? parent : parent + '/';
8
+ return base + child;
9
+ }
10
+ function matchSegment(pattern, pathname) {
3
11
  const patternParts = pattern.split('/').filter(Boolean);
4
12
  const pathParts = pathname.split('/').filter(Boolean);
5
- if (patternParts.length !== pathParts.length) {
6
- if (pattern === '*')
7
- return {};
13
+ if (pattern === '*')
14
+ return { params: {}, consumed: pathParts.length };
15
+ if (patternParts.length > pathParts.length)
8
16
  return null;
9
- }
10
17
  const params = {};
11
18
  for (let i = 0; i < patternParts.length; i++) {
12
19
  if (patternParts[i].startsWith(':')) {
13
- const name = patternParts[i].slice(1);
14
- params[name] = pathParts[i];
20
+ params[patternParts[i].slice(1)] = pathParts[i];
15
21
  }
16
22
  else if (patternParts[i] !== pathParts[i]) {
17
23
  return null;
18
24
  }
19
25
  }
20
- return params;
26
+ return { params, consumed: patternParts.length };
27
+ }
28
+ export function matchPath(pattern, path) {
29
+ const [pathname] = path.split('?');
30
+ const result = matchSegment(pattern, pathname);
31
+ if (!result)
32
+ return null;
33
+ const len = pathname.split('/').filter(Boolean).length;
34
+ return result.consumed === len ? result.params : null;
35
+ }
36
+ export function matchRoutes(routes, pathname) {
37
+ return tryMatchLevel(routes, pathname, '');
38
+ }
39
+ function tryMatchLevel(routes, pathname, parentPath) {
40
+ for (const route of routes) {
41
+ const fullPath = joinPaths(parentPath, route.path);
42
+ const match = matchSegment(fullPath, pathname);
43
+ if (!match)
44
+ continue;
45
+ const entry = { route, params: match.params, path: fullPath };
46
+ const remaining = pathname.split('/').filter(Boolean).slice(match.consumed);
47
+ if (route.children) {
48
+ const deeper = tryMatchLevel(route.children, pathname, fullPath);
49
+ if (deeper) {
50
+ return {
51
+ chain: [entry, ...deeper.chain],
52
+ params: { ...match.params, ...deeper.params },
53
+ };
54
+ }
55
+ }
56
+ if (remaining.length === 0) {
57
+ return { chain: [entry], params: match.params };
58
+ }
59
+ }
60
+ return null;
21
61
  }
22
62
  export function parseQuery(search) {
23
63
  const params = new URLSearchParams(search);
package/dist/route.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"route.js","sourceRoot":"","sources":["../src/route.ts"],"names":[],"mappings":"AASA,MAAM,UAAU,SAAS,CAAC,OAAe,EAAE,IAAY;IACrD,MAAM,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IAClC,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IACvD,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IAErD,IAAI,YAAY,CAAC,MAAM,KAAK,SAAS,CAAC,MAAM,EAAE,CAAC;QAC7C,IAAI,OAAO,KAAK,GAAG;YAAG,OAAO,EAAE,CAAA;QAC/B,OAAO,IAAI,CAAA;IACb,CAAC;IAED,MAAM,MAAM,GAA2B,EAAE,CAAA;IAEzC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7C,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACpC,MAAM,IAAI,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;YACrC,MAAM,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAA;QAC7B,CAAC;aAAM,IAAI,YAAY,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5C,OAAO,IAAI,CAAA;QACb,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,MAAc;IACvC,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,MAAM,CAAC,CAAA;IAC1C,OAAO,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAA;AAC7C,CAAC"}
1
+ {"version":3,"file":"route.js","sourceRoot":"","sources":["../src/route.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"view.d.ts","sourceRoot":"","sources":["../src/view.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,UAAU,kCA6DrB,CAAA"}
1
+ {"version":3,"file":"view.d.ts","sourceRoot":"","sources":["../src/view.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,UAAU,kCAsErB,CAAA"}
package/dist/view.js CHANGED
@@ -1,5 +1,6 @@
1
- import { defineComponent, h } from 'nexa-runtime';
1
+ import { defineComponent, h, provide, inject } from 'nexa-runtime';
2
2
  import { signal, effect } from 'nexa-reactivity';
3
+ import { ROUTER_DEPTH_KEY } from './route';
3
4
  export const RouterView = defineComponent({
4
5
  name: 'RouterView',
5
6
  props: {
@@ -8,14 +9,17 @@ export const RouterView = defineComponent({
8
9
  keepAlive: { type: Boolean, default: false }
9
10
  },
10
11
  setup(props) {
12
+ const parentDepth = inject(ROUTER_DEPTH_KEY, 0) ?? 0;
13
+ provide(ROUTER_DEPTH_KEY, parentDepth + 1);
11
14
  const cache = new Map();
12
15
  const resolvedComponent = signal(null);
13
16
  effect(() => {
14
- const route = props.router.currentRoute.value;
15
- if (!route) {
17
+ const chain = props.router.currentRouteChain?.value;
18
+ if (!chain || parentDepth >= chain.length) {
16
19
  resolvedComponent.value = null;
17
20
  return;
18
21
  }
22
+ const route = chain[parentDepth];
19
23
  if (route.loaded) {
20
24
  resolvedComponent.value = route.component;
21
25
  return;
@@ -27,26 +31,30 @@ export const RouterView = defineComponent({
27
31
  }
28
32
  });
29
33
  return () => {
30
- const route = props.router.currentRoute.value;
31
- if (!route)
32
- return h('div', { class: 'n-router-empty' }, '404 Not Found');
34
+ const chain = props.router.currentRouteChain?.value;
35
+ if (!chain || parentDepth >= chain.length) {
36
+ return parentDepth === 0
37
+ ? h('div', { class: 'n-router-empty' }, '404 Not Found')
38
+ : null;
39
+ }
40
+ const route = chain[parentDepth];
33
41
  const component = resolvedComponent.value;
34
42
  if (!component) {
35
43
  return h('div', { class: 'n-router-loading' }, 'Loading...');
36
44
  }
37
45
  const vnode = h(component, {
38
- params: props.router.params.value,
46
+ params: route.params,
39
47
  query: props.router.query.value
40
48
  });
41
49
  let rendered = vnode;
42
50
  if (props.keepAlive) {
43
- const path = props.router.currentPath.value;
44
- if (cache.has(path)) {
45
- const cached = cache.get(path);
51
+ const key = props.router.currentPath.value + ':' + parentDepth;
52
+ if (cache.has(key)) {
53
+ const cached = cache.get(key);
46
54
  if (cached.el)
47
55
  vnode.el = cached.el;
48
56
  }
49
- cache.set(path, vnode);
57
+ cache.set(key, vnode);
50
58
  }
51
59
  if (props.transition) {
52
60
  return h('transition', { name: props.transition, mode: 'out-in' }, [rendered]);
package/dist/view.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"view.js","sourceRoot":"","sources":["../src/view.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"view.js","sourceRoot":"","sources":["../src/view.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAClE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAE1C,MAAM,CAAC,MAAM,UAAU,GAAG,eAAe,CAAC;IACxC,IAAI,EAAE,YAAY;IAClB,KAAK,EAAE;QACL,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE;QACxC,UAAU,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE;QAC3C,SAAS,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE;KAC7C;IACD,KAAK,CAAC,KAAK;QACT,MAAM,WAAW,GAAG,MAAM,CAAS,gBAAgB,EAAE,CAAC,CAAC,IAAI,CAAC,CAAA;QAC5D,OAAO,CAAC,gBAAgB,EAAE,WAAW,GAAG,CAAC,CAAC,CAAA;QAE1C,MAAM,KAAK,GAAG,IAAI,GAAG,EAAe,CAAA;QACpC,MAAM,iBAAiB,GAAG,MAAM,CAAM,IAAI,CAAC,CAAA;QAE3C,MAAM,CAAC,GAAG,EAAE;YACV,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,iBAAiB,EAAE,KAAK,CAAA;YACnD,IAAI,CAAC,KAAK,IAAI,WAAW,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;gBAC1C,iBAAiB,CAAC,KAAK,GAAG,IAAI,CAAA;gBAC9B,OAAM;YACR,CAAC;YAED,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,CAAC,CAAA;YAChC,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;gBACjB,iBAAiB,CAAC,KAAK,GAAG,KAAK,CAAC,SAAS,CAAA;gBACzC,OAAM;YACR,CAAC;YAED,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;gBACpB,KAAK,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,IAAS,EAAE,EAAE;oBACnD,iBAAiB,CAAC,KAAK,GAAG,IAAI,CAAA;gBAChC,CAAC,CAAC,CAAA;YACJ,CAAC;QACH,CAAC,CAAC,CAAA;QAEF,OAAO,GAAG,EAAE;YACV,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,iBAAiB,EAAE,KAAK,CAAA;YACnD,IAAI,CAAC,KAAK,IAAI,WAAW,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;gBAC1C,OAAO,WAAW,KAAK,CAAC;oBACtB,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,gBAAgB,EAAE,EAAE,eAAe,CAAC;oBACxD,CAAC,CAAC,IAAI,CAAA;YACV,CAAC;YAED,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,CAAC,CAAA;YAChC,MAAM,SAAS,GAAG,iBAAiB,CAAC,KAAK,CAAA;YACzC,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,kBAAkB,EAAE,EAAE,YAAY,CAAC,CAAA;YAC9D,CAAC;YAED,MAAM,KAAK,GAAG,CAAC,CAAC,SAAS,EAAE;gBACzB,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK;aAChC,CAAC,CAAA;YAEF,IAAI,QAAQ,GAAG,KAAK,CAAA;YACpB,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;gBACpB,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,GAAG,GAAG,GAAG,WAAW,CAAA;gBAC9D,IAAI,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;oBACnB,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;oBAC7B,IAAI,MAAM,CAAC,EAAE;wBAAE,KAAK,CAAC,EAAE,GAAG,MAAM,CAAC,EAAE,CAAA;gBACrC,CAAC;gBACD,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;YACvB,CAAC;YAED,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;gBACrB,OAAO,CAAC,CAAC,YAAY,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAA;YAChF,CAAC;YAED,OAAO,QAAQ,CAAA;QACjB,CAAC,CAAA;IACH,CAAC;CACF,CAAC,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nexa-router",
3
- "version": "0.9.0",
3
+ "version": "0.11.0",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.js",
@@ -13,7 +13,7 @@
13
13
  }
14
14
  },
15
15
  "dependencies": {
16
- "nexa-runtime": "0.9.0"
16
+ "nexa-runtime": "0.11.0"
17
17
  },
18
18
  "files": [
19
19
  "dist"
@@ -22,7 +22,7 @@
22
22
  "access": "public"
23
23
  },
24
24
  "peerDependencies": {
25
- "nexa-reactivity": "0.9.0"
25
+ "nexa-reactivity": "0.11.0"
26
26
  },
27
27
  "scripts": {
28
28
  "build": "tsc",