File tree Expand file tree Collapse file tree 3 files changed +33
-13
lines changed Expand file tree Collapse file tree 3 files changed +33
-13
lines changed Original file line number Diff line number Diff line change 2
2
import type { RouterContextProps } from ' ~/models/component.model.js' ;
3
3
import type { IRouter } from ' ~/models/router.model.js' ;
4
4
5
+ import { onDestroy , onMount } from ' svelte' ;
6
+
5
7
import { getRouter , setRouter } from ' ~/router/context.svelte.js' ;
6
- import { Router } from ' ~/router/router.svelte.js' ;
7
8
import { Logger , LoggerKey } from ' ~/utils/logger.utils.js' ;
8
9
9
10
const { children, router, options }: RouterContextProps = $props ();
17
18
});
18
19
}
19
20
20
- const createInnerRouter = (_router : IRouter = new Router (options )) => {
21
- setRouter (_router );
21
+ const resolveRouter = () => {
22
+ if (outerRouter ) return outerRouter ;
23
+ const _router = setRouter (router , options );
22
24
Logger .debug (` [${LoggerKey } Context] ` , ' Router Context set:' , _router );
23
25
return _router ;
24
26
};
25
27
26
- const innerRouter: IRouter | undefined = outerRouter ? undefined : createInnerRouter (router );
27
- const resolvedRouter: IRouter = (outerRouter ?? innerRouter )! ;
28
-
29
- $effect .pre (() => {
30
- if (! innerRouter || innerRouter .ready ) return ;
31
- innerRouter .init ();
28
+ const resolvedRouter: IRouter = resolveRouter ();
32
29
33
- return () => innerRouter ?.destroy ();
30
+ onMount (() => {
31
+ if (resolvedRouter ?.ready ) return ;
32
+ resolvedRouter ?.init ();
34
33
});
34
+
35
+ onDestroy (() => resolvedRouter ?.destroy ());
35
36
</script >
36
37
37
38
{#if resolvedRouter }
Original file line number Diff line number Diff line change 1
1
import type { RouteName } from '~/models/route.model.js' ;
2
- import type { IRouter } from '~/models/router.model.js' ;
2
+ import type { IRouter , RouterOptions } from '~/models/router.model.js' ;
3
3
import type { IView } from '~/models/view.model.js' ;
4
4
5
5
import { getContext , setContext } from 'svelte' ;
6
6
7
+ import { Router } from '~/router/router.svelte.js' ;
8
+
7
9
export const RouterContextSymbol = Symbol ( 'SvelteSimpleRouterContext' ) ;
8
10
export const RouterViewSymbol = Symbol ( 'SvelteSimpleRouterView' ) ;
9
11
10
12
export function getRouter < Name extends RouteName = any > ( ) : IRouter < Name > | undefined {
11
13
return getContext < IRouter < Name > > ( RouterContextSymbol ) ;
12
14
}
13
15
14
- export function setRouter < Name extends RouteName = any > ( router : IRouter < Name > ) : IRouter < Name > {
15
- return setContext ( RouterContextSymbol , router ) ;
16
+ export function setRouter < Name extends RouteName = any > ( router ? : IRouter < Name > , options ?: RouterOptions < Name > ) : IRouter < Name > {
17
+ return setContext ( RouterContextSymbol , router ?? new Router ( options ) ) ;
16
18
}
17
19
18
20
export function getView < Name extends RouteName = any > ( ) : IView < Name > {
Original file line number Diff line number Diff line change @@ -55,6 +55,23 @@ describe('routerView', () => {
55
55
56
56
describe ( 'routing' , ( ) => {
57
57
const common = ( component : typeof RouteView | typeof RouterContext | typeof RouterViewNested ) => {
58
+ it ( 'should initialize external router on mount and destroy on unmounted' , async ( ) => {
59
+ expect . assertions ( 4 ) ;
60
+ const localRouter = new Router ( { routes } ) ;
61
+ const spyInit = vi . spyOn ( localRouter , 'init' ) ;
62
+ const spyDestroy = vi . spyOn ( localRouter , 'destroy' ) ;
63
+
64
+ const result = render ( component , { router : localRouter } ) ;
65
+
66
+ expect ( spyInit ) . toHaveBeenCalledTimes ( 1 ) ;
67
+ expect ( spyDestroy ) . not . toHaveBeenCalled ( ) ;
68
+
69
+ result . unmount ( ) ;
70
+
71
+ expect ( spyDestroy ) . toHaveBeenCalledTimes ( 1 ) ;
72
+ expect ( spyInit ) . toHaveBeenCalledTimes ( 1 ) ;
73
+ } ) ;
74
+
58
75
it ( 'should render no component' , ( ) => {
59
76
expect . assertions ( 4 ) ;
60
77
render ( component , { router } ) ;
You can’t perform that action at this time.
0 commit comments