@@ -19,7 +19,7 @@ type RouteObject = {
19
19
pattern : RegExp ;
20
20
params : ( match : RegExpMatchArray ) => Record < string , string > ;
21
21
module : {
22
- render : ( data : any ) => {
22
+ render : ( data : any , opts : { store : Store } ) => {
23
23
head : string ;
24
24
css : { code : string , map : any } ;
25
25
html : string
@@ -31,15 +31,22 @@ type RouteObject = {
31
31
32
32
type Handler = ( req : Req , res : ServerResponse , next : ( ) => void ) => void ;
33
33
34
+ type Store = {
35
+ get : ( ) => any
36
+ } ;
37
+
34
38
interface Req extends ClientRequest {
35
39
url : string ;
40
+ baseUrl : string ;
41
+ originalUrl : string ;
36
42
method : string ;
37
- pathname : string ;
43
+ path : string ;
38
44
params : Record < string , string > ;
39
45
}
40
46
41
- export default function middleware ( { routes } : {
42
- routes : RouteObject [ ]
47
+ export default function middleware ( { routes, store } : {
48
+ routes : RouteObject [ ] ,
49
+ store : ( req : Req ) => Store
43
50
} ) {
44
51
const output = locations . dest ( ) ;
45
52
@@ -75,7 +82,7 @@ export default function middleware({ routes }: {
75
82
cache_control : 'max-age=31536000'
76
83
} ) ,
77
84
78
- get_route_handler ( client_info . assetsByChunkName , routes )
85
+ get_route_handler ( client_info . assetsByChunkName , routes , store )
79
86
] . filter ( Boolean ) ) ;
80
87
81
88
return middleware ;
@@ -120,7 +127,7 @@ function serve({ prefix, pathname, cache_control }: {
120
127
121
128
const resolved = Promise . resolve ( ) ;
122
129
123
- function get_route_handler ( chunks : Record < string , string > , routes : RouteObject [ ] ) {
130
+ function get_route_handler ( chunks : Record < string , string > , routes : RouteObject [ ] , store_getter : ( req : Req ) => Store ) {
124
131
const template = dev ( )
125
132
? ( ) => fs . readFileSync ( `${ locations . app ( ) } /template.html` , 'utf-8' )
126
133
: ( str => ( ) => str ) ( fs . readFileSync ( `${ locations . dest ( ) } /template.html` , 'utf-8' ) ) ;
@@ -142,6 +149,7 @@ function get_route_handler(chunks: Record<string, string>, routes: RouteObject[]
142
149
143
150
res . setHeader ( 'Link' , link ) ;
144
151
152
+ const store = store_getter ? store_getter ( req ) : null ;
145
153
const data = { params : req . params , query : req . query } ;
146
154
147
155
let redirect : { statusCode : number , location : string } ;
@@ -154,7 +162,8 @@ function get_route_handler(chunks: Record<string, string>, routes: RouteObject[]
154
162
} ,
155
163
error : ( statusCode : number , message : Error | string ) => {
156
164
error = { statusCode, message } ;
157
- }
165
+ } ,
166
+ store
158
167
} , req ) : { }
159
168
) . catch ( err => {
160
169
error = { statusCode : 500 , message : err } ;
@@ -172,10 +181,15 @@ function get_route_handler(chunks: Record<string, string>, routes: RouteObject[]
172
181
return ;
173
182
}
174
183
175
- const serialized = try_serialize ( preloaded ) ; // TODO bail on non-POJOs
184
+ const serialized = {
185
+ preloaded : mod . preload && try_serialize ( preloaded ) ,
186
+ store : store && try_serialize ( store . get ( ) )
187
+ } ;
176
188
Object . assign ( data , preloaded ) ;
177
189
178
- const { html, head, css } = mod . render ( data ) ;
190
+ const { html, head, css } = mod . render ( data , {
191
+ store
192
+ } ) ;
179
193
180
194
let scripts = [ ]
181
195
. concat ( chunks . main ) // chunks main might be an array. it might not! thanks, webpack
@@ -184,7 +198,8 @@ function get_route_handler(chunks: Record<string, string>, routes: RouteObject[]
184
198
185
199
let inline_script = `__SAPPER__={${ [
186
200
`baseUrl: "${ req . baseUrl } "` ,
187
- mod . preload && serialized && `preloaded: ${ serialized } ` ,
201
+ serialized . preloaded && `preloaded: ${ serialized . preloaded } ` ,
202
+ serialized . store && `store: ${ serialized . store } `
188
203
] . filter ( Boolean ) . join ( ',' ) } }`
189
204
190
205
const has_service_worker = fs . existsSync ( path . join ( locations . dest ( ) , 'service-worker.js' ) ) ;
0 commit comments