nexa-router 0.7.1 → 0.7.2

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,23 +1,39 @@
1
1
  import { type RouteDef, type Guard } from './route';
2
+ import { type Component } from 'nexa-runtime';
2
3
  export type { RouteDef, Guard } from './route';
3
4
  export { matchPath } from './route';
4
5
  export { Link } from './link';
5
6
  export { createGuards } from './guards';
6
7
  export { RouterView } from './view';
8
+ type LazyComponent = () => Promise<{
9
+ default: Component;
10
+ }>;
11
+ type RouteComponent = Component | LazyComponent;
12
+ export declare function lazy(middleware: () => Promise<{
13
+ default: Component;
14
+ }>): LazyComponent;
7
15
  type RouterConfig = {
8
- routes: RouteDef[];
16
+ routes: (Omit<RouteDef, 'component'> & {
17
+ component?: RouteComponent;
18
+ })[];
9
19
  mode?: 'hash' | 'history';
10
20
  guards?: {
11
21
  beforeEach: Guard[];
12
22
  };
13
23
  };
24
+ type ResolvedRoute = Omit<RouteDef, 'component'> & {
25
+ component: Component;
26
+ loaded: boolean;
27
+ };
14
28
  export declare function createRouter(config: RouterConfig): {
15
29
  navigate: (path: string) => Promise<void>;
16
30
  beforeEach: (guard: Guard) => void;
17
- currentRoute: import("nexa-reactivity").Signal<RouteDef | null>;
31
+ currentRoute: import("nexa-reactivity").Signal<ResolvedRoute | null>;
18
32
  currentPath: import("nexa-reactivity").Signal<string>;
19
33
  params: import("nexa-reactivity").Signal<Record<string, string>>;
20
34
  query: import("nexa-reactivity").Signal<Record<string, string>>;
35
+ loading: import("nexa-reactivity").Signal<boolean>;
36
+ loadComponent: (route: ResolvedRoute) => Promise<Component | null>;
21
37
  scrollPositions: Map<string, number>;
22
38
  };
23
39
  //# 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;AAE1E,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,YAAY,GAAG;IAClB,MAAM,EAAE,QAAQ,EAAE,CAAA;IAClB,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IACzB,MAAM,CAAC,EAAE;QAAE,UAAU,EAAE,KAAK,EAAE,CAAA;KAAE,CAAA;CACjC,CAAA;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,YAAY;qBA4BjB,MAAM;wBAJT,KAAK;;;;;;EA4CjC"}
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,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,CAAA;AAE5F,wBAAgB,YAAY,CAAC,MAAM,EAAE,YAAY;qBAiEjB,MAAM;wBAJT,KAAK;;;;;;2BAjBI,aAAa,KAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;;EA+D9E"}
package/dist/index.js CHANGED
@@ -4,11 +4,17 @@ export { matchPath } from './route';
4
4
  export { Link } from './link';
5
5
  export { createGuards } from './guards';
6
6
  export { RouterView } from './view';
7
+ export function lazy(middleware) {
8
+ return middleware;
9
+ }
7
10
  export function createRouter(config) {
8
11
  const currentPath = signal(window.location.pathname + window.location.search);
9
12
  const params = signal({});
10
13
  const query = signal({});
11
14
  const guards = config.guards?.beforeEach ?? [];
15
+ const loading = signal(false);
16
+ const loadedComponents = new Map();
17
+ const pendingPromises = new Map();
12
18
  const currentRoute = computed(() => {
13
19
  const [path, search] = currentPath.value.split('?');
14
20
  query.value = parseQuery(search || '');
@@ -16,14 +22,48 @@ export function createRouter(config) {
16
22
  const match = matchPath(route.path, path);
17
23
  if (match) {
18
24
  params.value = match;
19
- return route;
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: null, loaded: false };
33
+ }
34
+ loadedComponents.set(route.path, component);
35
+ return { ...route, component, loaded: true };
20
36
  }
21
37
  }
22
38
  const fallback = config.routes.find(r => r.path === '*');
23
- if (fallback)
24
- return fallback;
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: null, loaded: false };
45
+ }
46
+ return { ...fallback, component: fallback.component, loaded: true };
47
+ }
25
48
  return null;
26
49
  });
50
+ async function loadComponent(route) {
51
+ if (route.loaded || !route.component)
52
+ return route.component;
53
+ if (loadedComponents.has(route.path)) {
54
+ return loadedComponents.get(route.path);
55
+ }
56
+ if (pendingPromises.has(route.path)) {
57
+ return pendingPromises.get(route.path);
58
+ }
59
+ const promise = route.component().then(mod => {
60
+ loadedComponents.set(route.path, mod.default);
61
+ pendingPromises.delete(route.path);
62
+ return mod.default;
63
+ });
64
+ pendingPromises.set(route.path, promise);
65
+ return promise;
66
+ }
27
67
  function beforeEach(guard) {
28
68
  guards.push(guard);
29
69
  }
@@ -62,6 +102,8 @@ export function createRouter(config) {
62
102
  currentPath,
63
103
  params,
64
104
  query,
105
+ loading,
106
+ loadComponent,
65
107
  scrollPositions
66
108
  };
67
109
  }
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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"}
@@ -1 +1 @@
1
- {"version":3,"file":"view.d.ts","sourceRoot":"","sources":["../src/view.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,UAAU,kCAuCrB,CAAA"}
1
+ {"version":3,"file":"view.d.ts","sourceRoot":"","sources":["../src/view.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,UAAU,kCA6DrB,CAAA"}
package/dist/view.js CHANGED
@@ -1,4 +1,5 @@
1
1
  import { defineComponent, h } from 'nexa-runtime';
2
+ import { signal, effect } from 'nexa-reactivity';
2
3
  export const RouterView = defineComponent({
3
4
  name: 'RouterView',
4
5
  props: {
@@ -8,27 +9,45 @@ export const RouterView = defineComponent({
8
9
  },
9
10
  setup(props) {
10
11
  const cache = new Map();
12
+ const resolvedComponent = signal(null);
13
+ effect(() => {
14
+ const route = props.router.currentRoute.value;
15
+ if (!route) {
16
+ resolvedComponent.value = null;
17
+ return;
18
+ }
19
+ if (route.loaded) {
20
+ resolvedComponent.value = route.component;
21
+ return;
22
+ }
23
+ if (route.component) {
24
+ props.router.loadComponent(route).then((comp) => {
25
+ resolvedComponent.value = comp;
26
+ });
27
+ }
28
+ });
11
29
  return () => {
12
30
  const route = props.router.currentRoute.value;
13
- if (!route || !route.component)
31
+ if (!route)
14
32
  return h('div', { class: 'n-router-empty' }, '404 Not Found');
15
- const vnode = h(route.component, {
33
+ const component = resolvedComponent.value;
34
+ if (!component) {
35
+ return h('div', { class: 'n-router-loading' }, 'Loading...');
36
+ }
37
+ const vnode = h(component, {
16
38
  params: props.router.params.value,
17
39
  query: props.router.query.value
18
40
  });
19
- // Simple keep-alive cache implementation at the router level
20
41
  let rendered = vnode;
21
42
  if (props.keepAlive) {
22
43
  const path = props.router.currentPath.value;
23
44
  if (cache.has(path)) {
24
45
  const cached = cache.get(path);
25
- // Restore element
26
46
  if (cached.el)
27
47
  vnode.el = cached.el;
28
48
  }
29
49
  cache.set(path, vnode);
30
50
  }
31
- // Transition wrapper
32
51
  if (props.transition) {
33
52
  return h('transition', { name: props.transition, mode: 'out-in' }, [rendered]);
34
53
  }
package/dist/view.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"view.js","sourceRoot":"","sources":["../src/view.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,CAAC,EAAE,MAAM,cAAc,CAAA;AAEjD,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,KAAK,GAAG,IAAI,GAAG,EAAe,CAAA;QAEpC,OAAO,GAAG,EAAE;YACV,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,KAAK,CAAA;YAC7C,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,SAAS;gBAAE,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,gBAAgB,EAAE,EAAE,eAAe,CAAC,CAAA;YAE7F,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,SAAS,EAAE;gBAC/B,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK;gBACjC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK;aAChC,CAAC,CAAA;YAEF,6DAA6D;YAC7D,IAAI,QAAQ,GAAG,KAAK,CAAA;YACpB,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;gBACpB,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAA;gBAC3C,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;oBACpB,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;oBAC9B,kBAAkB;oBAClB,IAAI,MAAM,CAAC,EAAE;wBAAE,KAAK,CAAC,EAAE,GAAG,MAAM,CAAC,EAAE,CAAA;gBACrC,CAAC;gBACD,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;YACxB,CAAC;YAED,qBAAqB;YACrB,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"}
1
+ {"version":3,"file":"view.js","sourceRoot":"","sources":["../src/view.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nexa-router",
3
- "version": "0.7.1",
3
+ "version": "0.7.2",
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.7.1"
16
+ "nexa-runtime": "0.7.2"
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.7.1"
25
+ "nexa-reactivity": "0.7.2"
26
26
  },
27
27
  "scripts": {
28
28
  "build": "tsc",