1
- import { Component , createApp , createSSRApp , defineComponent } from "vue" ;
1
+ import { Component , createSSRApp as VueCreateSSRApp , defineComponent , h } from "vue" ;
2
2
import type { SSRContext } from "../../server/renderer.ts" ;
3
3
import { RouterContext } from "./context.ts" ;
4
4
import { RouteModule } from "../core/route.ts" ;
@@ -19,32 +19,25 @@ type RootProps = {
19
19
ssrContext ?: SSRContext ;
20
20
} ;
21
21
22
- export const App = defineComponent ( {
23
- name : "App" ,
24
- props : {
25
- ssrContext : {
26
- type : String ,
27
- default : "" ,
28
- } ,
29
- } ,
30
- render ( ) {
31
- return this . $slots . default ? this . $slots . default ( ) : [ ] ;
32
- } ,
33
- } ) ;
34
-
35
- const createSSRApp_ = ( _app : Component , props ?: RootProps ) => {
22
+ const createApp = ( props ?: RootProps ) => {
23
+ return createRouter ( props ) ;
24
+ } ;
25
+
26
+ const createRouter = ( props ?: RootProps ) => {
36
27
const { ssrContext } = props || { } ;
37
28
const modules = ssrContext ?. routeModules || loadSSRModulesFromTag ( ) ;
38
29
39
30
if ( modules . length === 0 ) {
40
- return createSSRApp ( Err , { status : 404 , message : "page not found" } ) ;
31
+ return VueCreateSSRApp ( Err , { status : 404 , message : "page not found" } ) ;
41
32
}
42
33
43
34
const url = ssrContext ?. url || new URL ( window . location ?. href ) ;
44
35
const dataUrl = url . pathname + url . search ;
45
36
const params : Record < string , string > = { } ;
46
37
const dataCache = new Map < string , RouteData > ( ) ;
47
38
39
+ RouterContext . value = { url, params } ;
40
+
48
41
modules . forEach ( ( module ) => {
49
42
const { params : _params , data, dataCacheTtl } = module ;
50
43
Object . assign ( params , _params ) ;
@@ -55,34 +48,43 @@ const createSSRApp_ = (_app: Component, props?: RootProps) => {
55
48
} ) ;
56
49
} ) ;
57
50
58
- let routeComponent = undefined ;
59
-
60
51
const defaultRouteModules = modules [ 0 ] ;
61
52
const { defaultExport } = defaultRouteModules ;
62
53
63
54
if ( defaultExport ) {
64
- routeComponent = defaultExport as Component ;
55
+ const router = defineComponent ( {
56
+ name : "Router" ,
57
+ render ( ) {
58
+ return h ( defaultExport as Component ) ;
59
+ } ,
60
+ } ) ;
65
61
66
- if ( routeComponent ) {
67
- const router = createApp ( routeComponent ) ;
62
+ const app = VueCreateSSRApp ( router ) ;
68
63
69
- router . provide ( "modules" , modules ) ;
70
- router . provide ( "dataCache" , dataCache ) ;
71
- router . provide ( "ssrContext" , ssrContext ) ;
72
- router . provide ( "ssrHeadCollection" , ssrContext ?. headCollection ) ;
73
- router . provide ( "dataUrl" , dataUrl ) ;
64
+ app . provide ( "modules" , modules ) ;
65
+ app . provide ( "dataCache" , dataCache ) ;
66
+ app . provide ( "ssrContext" , ssrContext ) ;
67
+ app . provide ( "ssrHeadCollection" , ssrContext ?. headCollection ) ;
68
+ app . provide ( "dataUrl" , dataUrl ) ;
74
69
75
- // registe aleph/vue component
76
- router . component ( "Link" , Link ) ;
77
- router . component ( "Head" , Head ) ;
70
+ // registe aleph/vue component
71
+ app . component ( "Link" , Link ) ;
72
+ app . component ( "Head" , Head ) ;
78
73
79
- return router ;
80
- }
74
+ return app ;
81
75
}
82
76
83
- const ssrApp = createSSRApp ( Err ) ;
77
+ const errApp = VueCreateSSRApp ( Err ) ;
84
78
85
- return ssrApp ;
79
+ return errApp ;
80
+ } ;
81
+
82
+ const createSSRApp = ( createSSRAppApi : ( props ?: RootProps ) => Component , props ?: RootProps ) => {
83
+ if ( createSSRAppApi === undefined ) {
84
+ throw new Error ( "[aleph/vue] createSSRApp without `App` component" ) ;
85
+ }
86
+
87
+ return createSSRAppApi ( props ) ;
86
88
} ;
87
89
88
90
function getRouteModules ( ) : Record < string , { defaultExport ?: unknown ; withData ?: boolean } > {
@@ -126,13 +128,8 @@ function loadSSRModulesFromTag(): RouteModule[] {
126
128
return [ ] ;
127
129
}
128
130
129
- const createApp_ = ( app : Component ) => {
130
- return createApp ( app ) ;
131
- } ;
132
-
133
- export const useRouter = ( ) => {
134
- const { url, params } = RouterContext ;
135
- return { url, params } ;
131
+ const useRouter = ( ) => {
132
+ return RouterContext ;
136
133
} ;
137
134
138
- export { createApp_ as createApp , createSSRApp_ as createSSRApp } ;
135
+ export { createApp as App , createSSRApp , useRouter } ;
0 commit comments