@@ -3,6 +3,7 @@ import { Component, ComponentConstructor, Params, Query, Route, RouteData, Scrol
3
3
4
4
const manifest = typeof window !== 'undefined' && window . __SAPPER__ ;
5
5
6
+ export let App : ComponentConstructor ;
6
7
export let component : Component ;
7
8
let target : Node ;
8
9
let store : Store ;
@@ -27,10 +28,10 @@ function select_route(url: URL): Target {
27
28
if ( url . origin !== window . location . origin ) return null ;
28
29
if ( ! url . pathname . startsWith ( manifest . baseUrl ) ) return null ;
29
30
30
- const pathname = url . pathname . slice ( manifest . baseUrl . length ) ;
31
+ const path = url . pathname . slice ( manifest . baseUrl . length ) ;
31
32
32
33
for ( const route of routes ) {
33
- const match = route . pattern . exec ( pathname ) ;
34
+ const match = route . pattern . exec ( path ) ;
34
35
if ( match ) {
35
36
if ( route . ignore ) return null ;
36
37
@@ -43,18 +44,24 @@ function select_route(url: URL): Target {
43
44
query [ key ] = value || true ;
44
45
} )
45
46
}
46
- return { url, route, data : { params, query } } ;
47
+ return { url, route, props : { params, query, path } } ;
47
48
}
48
49
}
49
50
}
50
51
51
52
let current_token : { } ;
52
53
53
- function render ( Component : ComponentConstructor , data : any , scroll : ScrollPosition , token : { } ) {
54
+ function render ( Page : ComponentConstructor , props : any , scroll : ScrollPosition , token : { } ) {
54
55
if ( current_token !== token ) return ;
55
56
57
+ const data = {
58
+ Page,
59
+ props,
60
+ preloading : false
61
+ } ;
62
+
56
63
if ( component ) {
57
- component . destroy ( ) ;
64
+ component . set ( data ) ;
58
65
} else {
59
66
// first load — remove SSR'd <head> contents
60
67
const start = document . querySelector ( '#sapper-head-start' ) ;
@@ -65,33 +72,39 @@ function render(Component: ComponentConstructor, data: any, scroll: ScrollPositi
65
72
detach ( start ) ;
66
73
detach ( end ) ;
67
74
}
68
- }
69
75
70
- component = new Component ( {
71
- target,
72
- data,
73
- store,
74
- hydrate : ! component
75
- } ) ;
76
+ component = new App ( {
77
+ target,
78
+ data,
79
+ store,
80
+ hydrate : true
81
+ } ) ;
82
+ }
76
83
77
84
if ( scroll ) {
78
85
window . scrollTo ( scroll . x , scroll . y ) ;
79
86
}
80
87
}
81
88
82
- function prepare_route ( Component : ComponentConstructor , data : RouteData ) {
89
+ function prepare_route ( Page : ComponentConstructor , props : RouteData ) {
83
90
let redirect : { statusCode : number , location : string } = null ;
84
91
let error : { statusCode : number , message : Error | string } = null ;
85
92
86
- if ( ! Component . preload ) {
87
- return { Component , data , redirect, error } ;
93
+ if ( ! Page . preload ) {
94
+ return { Page , props , redirect, error } ;
88
95
}
89
96
90
97
if ( ! component && manifest . preloaded ) {
91
- return { Component , data : Object . assign ( data , manifest . preloaded ) , redirect, error } ;
98
+ return { Page , props : Object . assign ( props , manifest . preloaded ) , redirect, error } ;
92
99
}
93
100
94
- return Promise . resolve ( Component . preload . call ( {
101
+ if ( component ) {
102
+ component . set ( {
103
+ preloading : true
104
+ } ) ;
105
+ }
106
+
107
+ return Promise . resolve ( Page . preload . call ( {
95
108
store,
96
109
fetch : ( url : string , opts ?: any ) => window . fetch ( url , opts ) ,
97
110
redirect : ( statusCode : number , location : string ) => {
@@ -100,23 +113,23 @@ function prepare_route(Component: ComponentConstructor, data: RouteData) {
100
113
error : ( statusCode : number , message : Error | string ) => {
101
114
error = { statusCode, message } ;
102
115
}
103
- } , data ) ) . catch ( err => {
116
+ } , props ) ) . catch ( err => {
104
117
error = { statusCode : 500 , message : err } ;
105
118
} ) . then ( preloaded => {
106
119
if ( error ) {
107
120
const route = error . statusCode >= 400 && error . statusCode < 500
108
121
? errors [ '4xx' ]
109
122
: errors [ '5xx' ] ;
110
123
111
- return route . load ( ) . then ( ( { default : Component } : { default : ComponentConstructor } ) => {
124
+ return route . load ( ) . then ( ( { default : Page } : { default : ComponentConstructor } ) => {
112
125
const err = error . message instanceof Error ? error . message : new Error ( error . message ) ;
113
- Object . assign ( data , { status : error . statusCode , error : err } ) ;
114
- return { Component , data , redirect : null } ;
126
+ Object . assign ( props , { status : error . statusCode , error : err } ) ;
127
+ return { Page , props , redirect : null } ;
115
128
} ) ;
116
129
}
117
130
118
- Object . assign ( data , preloaded )
119
- return { Component , data , redirect } ;
131
+ Object . assign ( props , preloaded )
132
+ return { Page , props , redirect } ;
120
133
} ) ;
121
134
}
122
135
@@ -136,18 +149,18 @@ function navigate(target: Target, id: number) {
136
149
137
150
const loaded = prefetching && prefetching . href === target . url . href ?
138
151
prefetching . promise :
139
- target . route . load ( ) . then ( mod => prepare_route ( mod . default , target . data ) ) ;
152
+ target . route . load ( ) . then ( mod => prepare_route ( mod . default , target . props ) ) ;
140
153
141
154
prefetching = null ;
142
155
143
156
const token = current_token = { } ;
144
157
145
- return loaded . then ( ( { Component , data , redirect } ) => {
158
+ return loaded . then ( ( { Page , props , redirect } ) => {
146
159
if ( redirect ) {
147
160
return goto ( redirect . location , { replaceState : true } ) ;
148
161
}
149
162
150
- render ( Component , data , scroll_history [ id ] , token ) ;
163
+ render ( Page , props , scroll_history [ id ] , token ) ;
151
164
} ) ;
152
165
}
153
166
@@ -208,7 +221,7 @@ function handle_popstate(event: PopStateEvent) {
208
221
209
222
let prefetching : {
210
223
href : string ;
211
- promise : Promise < { Component : ComponentConstructor , data : any } > ;
224
+ promise : Promise < { Page : ComponentConstructor , props : any } > ;
212
225
} = null ;
213
226
214
227
export function prefetch ( href : string ) {
@@ -217,7 +230,7 @@ export function prefetch(href: string) {
217
230
if ( selected && ( ! prefetching || href !== prefetching . href ) ) {
218
231
prefetching = {
219
232
href,
220
- promise : selected . route . load ( ) . then ( mod => prepare_route ( mod . default , selected . data ) )
233
+ promise : selected . route . load ( ) . then ( mod => prepare_route ( mod . default , selected . props ) )
221
234
} ;
222
235
}
223
236
}
@@ -240,12 +253,17 @@ function trigger_prefetch(event: MouseEvent | TouchEvent) {
240
253
241
254
let inited : boolean ;
242
255
243
- export function init ( _target : Node , _routes : Route [ ] , opts ?: { store ?: ( data : any ) => Store } ) {
244
- target = _target ;
245
- routes = _routes . filter ( r => ! r . error ) ;
256
+ export function init ( opts : { App : ComponentConstructor , target : Node , routes : Route [ ] , store ?: ( data : any ) => Store } ) {
257
+ if ( opts instanceof HTMLElement ) {
258
+ throw new Error ( `The signature of init(...) has changed — see https://sapper.svelte.technology/guide#0-11-to-0-12 for more information` ) ;
259
+ }
260
+
261
+ App = opts . App ;
262
+ target = opts . target ;
263
+ routes = opts . routes . filter ( r => ! r . error ) ;
246
264
errors = {
247
- '4xx' : _routes . find ( r => r . error === '4xx' ) ,
248
- '5xx' : _routes . find ( r => r . error === '5xx' )
265
+ '4xx' : opts . routes . find ( r => r . error === '4xx' ) ,
266
+ '5xx' : opts . routes . find ( r => r . error === '5xx' )
249
267
} ;
250
268
251
269
if ( opts && opts . store ) {
0 commit comments