@sveltejs/kit 3.0.0-next.23 → 3.0.0-next.25
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/package.json +51 -8
- package/src/cli.js +3 -3
- package/src/constants.js +19 -1
- package/src/core/adapt/builder.js +3 -5
- package/src/core/env.js +137 -182
- package/src/core/postbuild/analyse.js +9 -4
- package/src/core/postbuild/prerender.js +5 -6
- package/src/core/sync/create_manifest_data/index.js +29 -33
- package/src/core/sync/sync.js +23 -40
- package/src/core/sync/write_app_manifest.js +83 -0
- package/src/core/sync/write_client_manifest.js +6 -4
- package/src/core/sync/write_server.js +12 -22
- package/src/core/sync/write_types/index.js +2 -2
- package/src/core/utils.js +10 -28
- package/src/exports/adapter.js +22 -0
- package/src/exports/hooks/public.d.ts +9 -1
- package/src/exports/node/index.js +77 -5
- package/src/exports/public.d.ts +1 -1
- package/src/exports/vite/build/build_server.js +3 -3
- package/src/exports/vite/build/service-worker.js +98 -0
- package/src/exports/vite/build/utils.js +48 -4
- package/src/exports/vite/dev/index.js +28 -25
- package/src/exports/vite/index.js +94 -747
- package/src/exports/vite/module_ids.js +1 -11
- package/src/exports/vite/plugins/env-vars.js +159 -0
- package/src/exports/vite/plugins/guard.js +205 -0
- package/src/exports/vite/preview/index.js +6 -4
- package/src/exports/vite/utils.js +99 -4
- package/src/runtime/app/env/{types.d.ts → client.js} +9 -4
- package/src/runtime/app/env/index.js +1 -2
- package/src/runtime/app/env/private/index.js +1 -0
- package/src/runtime/app/env/public/client.js +1 -1
- package/src/runtime/app/env/public/server.js +1 -1
- package/src/runtime/app/env/{internal.js → server.js} +4 -4
- package/src/runtime/app/forms/client.js +263 -0
- package/src/runtime/app/forms/index.js +1 -263
- package/src/runtime/app/forms/public.d.ts +1 -1
- package/src/runtime/app/forms/server.js +6 -0
- package/src/runtime/app/forms/shared.js +34 -0
- package/src/runtime/app/manifest/index.js +1 -1
- package/src/runtime/app/navigation/client.js +15 -0
- package/src/runtime/app/navigation/index.js +1 -15
- package/src/runtime/app/navigation/public.d.ts +1 -1
- package/src/runtime/app/navigation/server.js +15 -0
- package/src/runtime/app/paths/server.js +1 -1
- package/src/runtime/app/server/remote/form.js +11 -1
- package/src/runtime/app/server/remote/prerender.js +1 -2
- package/src/runtime/app/server/remote/query.js +3 -3
- package/src/runtime/app/state/client.svelte.js +207 -0
- package/src/runtime/app/state/index.js +1 -66
- package/src/runtime/app/state/public.d.ts +1 -1
- package/src/runtime/client/bundle.js +1 -1
- package/src/runtime/client/client.js +210 -278
- package/src/runtime/client/fetcher.js +18 -8
- package/src/runtime/client/remote-functions/form.svelte.js +9 -6
- package/src/runtime/client/remote-functions/prerender.svelte.js +1 -1
- package/src/runtime/client/remote-functions/query-live/iterator.js +1 -1
- package/src/runtime/client/remote-functions/shared.svelte.js +2 -2
- package/src/runtime/client/snapshots.js +1 -3
- package/src/runtime/client/stream.js +27 -20
- package/src/runtime/client/utils.js +7 -3
- package/src/runtime/components/root.svelte +5 -5
- package/src/runtime/env/dynamic/private.js +1 -1
- package/src/runtime/env/static/private.js +1 -1
- package/src/runtime/error-chain.js +54 -0
- package/src/runtime/form-utils.js +55 -87
- package/src/runtime/invalid-import.js +1 -0
- package/src/runtime/props.svelte.js +1 -1
- package/src/runtime/server/data/index.js +12 -27
- package/src/runtime/server/endpoint.js +8 -3
- package/src/runtime/server/env_module.js +1 -1
- package/src/runtime/server/errors.js +9 -12
- package/src/runtime/server/fetch.js +14 -16
- package/src/runtime/server/index.js +30 -27
- package/src/runtime/server/internal.js +34 -4
- package/src/runtime/server/page/actions.js +77 -124
- package/src/runtime/server/page/data_serializer.js +6 -10
- package/src/runtime/server/page/index.js +45 -82
- package/src/runtime/server/page/render.js +34 -52
- package/src/runtime/server/page/respond_with_error.js +7 -9
- package/src/runtime/server/remote-functions.js +138 -166
- package/src/runtime/server/respond.js +75 -30
- package/src/runtime/server/state.js +1 -0
- package/src/runtime/server/utils.js +0 -7
- package/src/runtime/utils.js +41 -0
- package/src/telemetry.js +1 -33
- package/src/types/ambient-private.d.ts +9 -17
- package/src/types/global-private.d.ts +8 -0
- package/src/types/internal.d.ts +27 -15
- package/src/types/private.d.ts +1 -1
- package/src/utils/exports.js +1 -0
- package/src/utils/filesystem.js +10 -22
- package/src/utils/functions.js +10 -0
- package/src/utils/routing.js +0 -11
- package/src/utils/streaming.js +5 -15
- package/src/utils/url.js +0 -11
- package/src/version.js +1 -1
- package/types/index.d.ts +54 -29
- package/types/index.d.ts.map +10 -5
- package/src/runtime/app/env/private.js +0 -1
- package/src/runtime/app/env/standard-schema.d.ts +0 -0
- package/src/runtime/app/state/client.js +0 -63
- package/src/runtime/client/state.svelte.js +0 -98
- package/src/runtime/server/ambient.d.ts +0 -4
- package/src/utils/path.js +0 -23
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as devalue from 'devalue';
|
|
2
2
|
import { compact } from '../../../utils/array.js';
|
|
3
3
|
import { create_async_iterator } from '../../../utils/streaming.js';
|
|
4
|
-
import { clarify_devalue_error,
|
|
4
|
+
import { clarify_devalue_error, serialize_uses } from '../utils.js';
|
|
5
5
|
import { handle_error_and_jsonify } from '../errors.js';
|
|
6
6
|
import { encoders } from '#app/internal/transport';
|
|
7
7
|
|
|
@@ -10,15 +10,14 @@ import { encoders } from '#app/internal/transport';
|
|
|
10
10
|
* async iterable containing their resolutions
|
|
11
11
|
* @param {import('@sveltejs/kit').RequestEvent} event
|
|
12
12
|
* @param {import('types').RequestState} state
|
|
13
|
-
* @param {import('types').SSROptions} options
|
|
14
13
|
* @returns {import('./types.js').ServerDataSerializer}
|
|
15
14
|
*/
|
|
16
|
-
export function server_data_serializer(event, state
|
|
15
|
+
export function server_data_serializer(event, state) {
|
|
17
16
|
let promise_id = 1;
|
|
18
17
|
let max_nodes = -1;
|
|
19
18
|
|
|
20
19
|
const iterator = create_async_iterator();
|
|
21
|
-
const global =
|
|
20
|
+
const global = __SVELTEKIT_GLOBAL_NAME__;
|
|
22
21
|
|
|
23
22
|
/** @param {number} index */
|
|
24
23
|
function get_replacer(index) {
|
|
@@ -31,7 +30,7 @@ export function server_data_serializer(event, state, options) {
|
|
|
31
30
|
.then(/** @param {any} data */ (data) => ({ data }))
|
|
32
31
|
.catch(
|
|
33
32
|
/** @param {any} error */ async (error) => ({
|
|
34
|
-
error: await handle_error_and_jsonify(event, state,
|
|
33
|
+
error: await handle_error_and_jsonify(event, state, error)
|
|
35
34
|
})
|
|
36
35
|
)
|
|
37
36
|
.then(
|
|
@@ -46,7 +45,6 @@ export function server_data_serializer(event, state, options) {
|
|
|
46
45
|
error = await handle_error_and_jsonify(
|
|
47
46
|
event,
|
|
48
47
|
state,
|
|
49
|
-
options,
|
|
50
48
|
new Error(`Failed to serialize promise while rendering ${event.route.id}`, {
|
|
51
49
|
cause: e
|
|
52
50
|
})
|
|
@@ -127,10 +125,9 @@ export function server_data_serializer(event, state, options) {
|
|
|
127
125
|
* async iterable containing their resolutions
|
|
128
126
|
* @param {import('@sveltejs/kit').RequestEvent} event
|
|
129
127
|
* @param {import('types').RequestState} state
|
|
130
|
-
* @param {import('types').SSROptions} options
|
|
131
128
|
* @returns {import('./types.js').ServerDataSerializerJson}
|
|
132
129
|
*/
|
|
133
|
-
export function server_data_serializer_json(event, state
|
|
130
|
+
export function server_data_serializer_json(event, state) {
|
|
134
131
|
let promise_id = 1;
|
|
135
132
|
|
|
136
133
|
const iterator = create_async_iterator();
|
|
@@ -152,7 +149,7 @@ export function server_data_serializer_json(event, state, options) {
|
|
|
152
149
|
.catch(
|
|
153
150
|
/** @param {any} e */ async (e) => {
|
|
154
151
|
key = 'error';
|
|
155
|
-
return handle_error_and_jsonify(event, state,
|
|
152
|
+
return handle_error_and_jsonify(event, state, /** @type {any} */ (e));
|
|
156
153
|
}
|
|
157
154
|
)
|
|
158
155
|
.then(
|
|
@@ -165,7 +162,6 @@ export function server_data_serializer_json(event, state, options) {
|
|
|
165
162
|
const error = await handle_error_and_jsonify(
|
|
166
163
|
event,
|
|
167
164
|
state,
|
|
168
|
-
options,
|
|
169
165
|
new Error(`Failed to serialize promise while rendering ${event.route.id}`, {
|
|
170
166
|
cause: e
|
|
171
167
|
})
|
|
@@ -1,13 +1,12 @@
|
|
|
1
|
-
/** @import { Component } from 'svelte' */
|
|
2
1
|
/** @import { RequestEvent, SSRManifest } from '@sveltejs/kit' */
|
|
3
|
-
/** @import {
|
|
4
|
-
/** @import { PageNodeIndexes, RequestState, RequiredResolveOptions, ServerDataNode, SSRNode, SSROptions } from 'types' */
|
|
2
|
+
/** @import { PageNodeIndexes, RequestState, RequiredResolveOptions, ServerDataNode, SSRNode } from 'types' */
|
|
5
3
|
import { text } from '@sveltejs/kit';
|
|
6
4
|
import { Redirect } from '@sveltejs/kit/internal';
|
|
7
5
|
import { compact } from '../../../utils/array.js';
|
|
8
6
|
import { get_status, normalize_error } from '../../../utils/error.js';
|
|
9
7
|
import { noop } from '../../../utils/functions.js';
|
|
10
8
|
import { add_data_suffix } from '../../pathname.js';
|
|
9
|
+
import { build_error_chain, nearest_error_pages } from '../../error-chain.js';
|
|
11
10
|
import { redirect_response } from '../utils.js';
|
|
12
11
|
import { static_error_page, handle_error_and_jsonify } from '../errors.js';
|
|
13
12
|
import {
|
|
@@ -33,13 +32,12 @@ const MAX_DEPTH = 10;
|
|
|
33
32
|
* @param {RequestEvent} event
|
|
34
33
|
* @param {RequestState} state
|
|
35
34
|
* @param {PageNodeIndexes} page
|
|
36
|
-
* @param {SSROptions} options
|
|
37
35
|
* @param {SSRManifest} manifest
|
|
38
36
|
* @param {import('../../../utils/page_nodes.js').PageNodes} nodes
|
|
39
37
|
* @param {RequiredResolveOptions} resolve_opts
|
|
40
38
|
* @returns {Promise<Response>}
|
|
41
39
|
*/
|
|
42
|
-
export async function render_page(event, state, page,
|
|
40
|
+
export async function render_page(event, state, page, manifest, nodes, resolve_opts) {
|
|
43
41
|
if (state.depth > MAX_DEPTH) {
|
|
44
42
|
// infinite request cycle detected
|
|
45
43
|
return text(`Not found: ${event.url.pathname}`, {
|
|
@@ -49,7 +47,7 @@ export async function render_page(event, state, page, options, manifest, nodes,
|
|
|
49
47
|
|
|
50
48
|
if (is_action_json_request(event)) {
|
|
51
49
|
const node = await manifest._.nodes[page.leaf]();
|
|
52
|
-
return handle_action_json_request(event, state,
|
|
50
|
+
return handle_action_json_request(event, state, node?.server);
|
|
53
51
|
}
|
|
54
52
|
|
|
55
53
|
try {
|
|
@@ -57,7 +55,7 @@ export async function render_page(event, state, page, options, manifest, nodes,
|
|
|
57
55
|
|
|
58
56
|
let status = 200;
|
|
59
57
|
|
|
60
|
-
/** @type {
|
|
58
|
+
/** @type {import('types').ServerActionResult | undefined} */
|
|
61
59
|
let action_result = undefined;
|
|
62
60
|
|
|
63
61
|
if (is_action_request(event)) {
|
|
@@ -151,10 +149,9 @@ export async function render_page(event, state, page, options, manifest, nodes,
|
|
|
151
149
|
error: null,
|
|
152
150
|
event,
|
|
153
151
|
state,
|
|
154
|
-
options,
|
|
155
152
|
manifest,
|
|
156
153
|
resolve_opts,
|
|
157
|
-
data_serializer: server_data_serializer(event, state
|
|
154
|
+
data_serializer: server_data_serializer(event, state)
|
|
158
155
|
});
|
|
159
156
|
}
|
|
160
157
|
|
|
@@ -164,10 +161,10 @@ export async function render_page(event, state, page, options, manifest, nodes,
|
|
|
164
161
|
/** @type {Error | null} */
|
|
165
162
|
let load_error = null;
|
|
166
163
|
|
|
167
|
-
const data_serializer = server_data_serializer(event, state
|
|
164
|
+
const data_serializer = server_data_serializer(event, state);
|
|
168
165
|
const data_serializer_json =
|
|
169
166
|
(state.prerendering || state.prerender_default === true) && should_prerender_data
|
|
170
|
-
? server_data_serializer_json(event, state
|
|
167
|
+
? server_data_serializer_json(event, state)
|
|
171
168
|
: null;
|
|
172
169
|
|
|
173
170
|
/** @type {Array<Promise<ServerDataNode | null>>} */
|
|
@@ -275,50 +272,43 @@ export async function render_page(event, state, page, options, manifest, nodes,
|
|
|
275
272
|
return redirect_response(err.status, err.location);
|
|
276
273
|
}
|
|
277
274
|
|
|
278
|
-
const error = await handle_error_and_jsonify(event, state,
|
|
275
|
+
const error = await handle_error_and_jsonify(event, state, err);
|
|
279
276
|
const status = error.status;
|
|
280
277
|
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
error,
|
|
311
|
-
error_components: await load_error_components(ssr, error_branch, page, manifest),
|
|
312
|
-
branch: error_branch,
|
|
313
|
-
fetched,
|
|
314
|
-
data_serializer
|
|
315
|
-
});
|
|
316
|
-
}
|
|
278
|
+
for (const { error: index, idx } of nearest_error_pages(i, branch, page.errors)) {
|
|
279
|
+
const node = await manifest._.nodes[index]();
|
|
280
|
+
|
|
281
|
+
data_serializer.set_max_nodes(idx);
|
|
282
|
+
|
|
283
|
+
const layouts = compact(branch.slice(0, idx));
|
|
284
|
+
const nodes = new PageNodes(layouts.map((layout) => layout.node));
|
|
285
|
+
const error_branch = layouts.concat({
|
|
286
|
+
node,
|
|
287
|
+
data: null,
|
|
288
|
+
server_data: null
|
|
289
|
+
});
|
|
290
|
+
|
|
291
|
+
return await render_response({
|
|
292
|
+
event,
|
|
293
|
+
state,
|
|
294
|
+
manifest,
|
|
295
|
+
resolve_opts,
|
|
296
|
+
page_config: {
|
|
297
|
+
ssr: nodes.ssr(),
|
|
298
|
+
csr: nodes.csr()
|
|
299
|
+
},
|
|
300
|
+
status,
|
|
301
|
+
error,
|
|
302
|
+
error_components: await load_error_components(ssr, error_branch, page, manifest),
|
|
303
|
+
branch: error_branch,
|
|
304
|
+
fetched,
|
|
305
|
+
data_serializer
|
|
306
|
+
});
|
|
317
307
|
}
|
|
318
308
|
|
|
319
309
|
// if we're still here, it means the error happened in the root layout,
|
|
320
310
|
// which means we have to fall back to error.html
|
|
321
|
-
return static_error_page(
|
|
311
|
+
return static_error_page(status, error.message);
|
|
322
312
|
}
|
|
323
313
|
} else {
|
|
324
314
|
// push an empty slot so we can rewind past gaps to the
|
|
@@ -346,7 +336,6 @@ export async function render_page(event, state, page, options, manifest, nodes,
|
|
|
346
336
|
return await render_response({
|
|
347
337
|
event,
|
|
348
338
|
state,
|
|
349
|
-
options,
|
|
350
339
|
manifest,
|
|
351
340
|
resolve_opts,
|
|
352
341
|
page_config: {
|
|
@@ -358,7 +347,7 @@ export async function render_page(event, state, page, options, manifest, nodes,
|
|
|
358
347
|
branch: compact(branch),
|
|
359
348
|
action_result,
|
|
360
349
|
fetched,
|
|
361
|
-
data_serializer: !ssr ? server_data_serializer(event, state
|
|
350
|
+
data_serializer: !ssr ? server_data_serializer(event, state) : data_serializer,
|
|
362
351
|
error_components: await load_error_components(ssr, branch, page, manifest)
|
|
363
352
|
});
|
|
364
353
|
} catch (e) {
|
|
@@ -372,7 +361,6 @@ export async function render_page(event, state, page, options, manifest, nodes,
|
|
|
372
361
|
return await respond_with_error({
|
|
373
362
|
event,
|
|
374
363
|
state,
|
|
375
|
-
options,
|
|
376
364
|
manifest,
|
|
377
365
|
error: e,
|
|
378
366
|
resolve_opts
|
|
@@ -386,35 +374,10 @@ export async function render_page(event, state, page, options, manifest, nodes,
|
|
|
386
374
|
* @param {PageNodeIndexes} page
|
|
387
375
|
* @param {SSRManifest} manifest
|
|
388
376
|
*/
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
let error_components;
|
|
392
|
-
|
|
393
|
-
if (ssr) {
|
|
394
|
-
let last_idx = -1;
|
|
395
|
-
error_components = await Promise.all(
|
|
396
|
-
// eslint-disable-next-line @typescript-eslint/await-thenable
|
|
397
|
-
branch
|
|
398
|
-
.map((b, i) => {
|
|
399
|
-
if (i === 0) return undefined; // root layout wraps root error component, not the other way around
|
|
400
|
-
if (!b) return null;
|
|
401
|
-
|
|
402
|
-
i--;
|
|
403
|
-
// Find the closest error component up to the previous branch
|
|
404
|
-
while (i > last_idx + 1 && page.errors[i] === undefined) i -= 1;
|
|
405
|
-
last_idx = i;
|
|
406
|
-
|
|
407
|
-
const idx = page.errors[i];
|
|
408
|
-
if (idx == null) return undefined;
|
|
409
|
-
|
|
410
|
-
return manifest._.nodes[idx]?.()
|
|
411
|
-
.then((e) => e.component?.())
|
|
412
|
-
.catch(() => undefined);
|
|
413
|
-
})
|
|
414
|
-
// filter out indexes where there was no branch, but keep indexes where there was a branch but no error component
|
|
415
|
-
.filter((e) => e !== null)
|
|
416
|
-
);
|
|
417
|
-
}
|
|
377
|
+
function load_error_components(ssr, branch, page, manifest) {
|
|
378
|
+
if (!ssr) return undefined;
|
|
418
379
|
|
|
419
|
-
return
|
|
380
|
+
return build_error_chain(branch, page.errors, (idx) =>
|
|
381
|
+
manifest._.nodes[idx]?.().then((e) => e.component?.())
|
|
382
|
+
);
|
|
420
383
|
}
|
|
@@ -18,15 +18,16 @@ import {
|
|
|
18
18
|
route_id_resolution_pathname
|
|
19
19
|
} from '../../pathname.js';
|
|
20
20
|
import { try_get_request_store, with_request_store } from '@sveltejs/kit/internal/server';
|
|
21
|
-
import {
|
|
22
|
-
import { count_non_ssi_comments
|
|
21
|
+
import { stream_text } from '../../utils.js';
|
|
22
|
+
import { count_non_ssi_comments } from '../utils.js';
|
|
23
23
|
import { handle_error_and_jsonify } from '../errors.js';
|
|
24
|
-
import * as env from '
|
|
24
|
+
import * as env from '<sveltekit:generated>/env/config.js';
|
|
25
25
|
import { collect_remote_data } from '../remote-functions.js';
|
|
26
26
|
import Root from '../../components/root.svelte';
|
|
27
27
|
import { render } from 'svelte/server';
|
|
28
28
|
import { Props, RenderNode } from '../../props.svelte.js';
|
|
29
29
|
import { has_custom_transporters, uneval } from '#app/internal/transport';
|
|
30
|
+
import { options } from '../internal.js';
|
|
30
31
|
|
|
31
32
|
// TODO rename this function/module
|
|
32
33
|
|
|
@@ -35,7 +36,6 @@ import { has_custom_transporters, uneval } from '#app/internal/transport';
|
|
|
35
36
|
* @param {{
|
|
36
37
|
* branch: Array<import('./types.js').Loaded>;
|
|
37
38
|
* fetched: Array<import('./types.js').Fetched>;
|
|
38
|
-
* options: import('types').SSROptions;
|
|
39
39
|
* manifest: import('@sveltejs/kit').SSRManifest;
|
|
40
40
|
* page_config: { ssr: boolean; csr: boolean };
|
|
41
41
|
* status: number;
|
|
@@ -43,7 +43,7 @@ import { has_custom_transporters, uneval } from '#app/internal/transport';
|
|
|
43
43
|
* event: import('@sveltejs/kit').RequestEvent;
|
|
44
44
|
* state: import('types').RequestState;
|
|
45
45
|
* resolve_opts: import('types').RequiredResolveOptions;
|
|
46
|
-
* action_result?: import('
|
|
46
|
+
* action_result?: import('types').ServerActionResult;
|
|
47
47
|
* data_serializer: import('./types.js').ServerDataSerializer;
|
|
48
48
|
* error_components?: Array<import('svelte').Component | undefined>
|
|
49
49
|
* }} opts
|
|
@@ -51,7 +51,6 @@ import { has_custom_transporters, uneval } from '#app/internal/transport';
|
|
|
51
51
|
export async function render_response({
|
|
52
52
|
branch,
|
|
53
53
|
fetched,
|
|
54
|
-
options,
|
|
55
54
|
manifest,
|
|
56
55
|
page_config,
|
|
57
56
|
status,
|
|
@@ -77,7 +76,9 @@ export async function render_response({
|
|
|
77
76
|
|
|
78
77
|
const modulepreloads = new Set(client?.imports);
|
|
79
78
|
const stylesheets = new Set(client?.stylesheets);
|
|
80
|
-
|
|
79
|
+
|
|
80
|
+
/** @type {Map<string, import('types').FontDependency>} */
|
|
81
|
+
const fonts = new Map(client?.fonts.map((font) => [font.file, font]));
|
|
81
82
|
|
|
82
83
|
/**
|
|
83
84
|
* The value of the Link header that is added to the response when not prerendering
|
|
@@ -90,7 +91,7 @@ export async function render_response({
|
|
|
90
91
|
const inline_styles = new Map();
|
|
91
92
|
|
|
92
93
|
// TODO `svelte/server` should expose `RenderOutput`
|
|
93
|
-
/** @type {
|
|
94
|
+
/** @type {Omit<Awaited<ReturnType<typeof render>>, 'html'>} */
|
|
94
95
|
let rendered;
|
|
95
96
|
|
|
96
97
|
const form_value =
|
|
@@ -132,7 +133,7 @@ export async function render_response({
|
|
|
132
133
|
if (!paths.assets || (paths.assets[0] === '/' && paths.assets !== SVELTE_KIT_ASSETS)) {
|
|
133
134
|
assets = base;
|
|
134
135
|
}
|
|
135
|
-
} else if (
|
|
136
|
+
} else if (__SVELTEKIT_HASH_ROUTING__) {
|
|
136
137
|
// we have to assume that we're in the right place
|
|
137
138
|
base_expression = "new URL('.', location).pathname.slice(0, -1)";
|
|
138
139
|
}
|
|
@@ -156,7 +157,7 @@ export async function render_response({
|
|
|
156
157
|
tree: new RenderNode(
|
|
157
158
|
// TODO tidy up
|
|
158
159
|
/** @type {Component} */ (await branch[0].node.component?.()),
|
|
159
|
-
|
|
160
|
+
undefined
|
|
160
161
|
),
|
|
161
162
|
form: form_value,
|
|
162
163
|
error: error ?? undefined
|
|
@@ -176,7 +177,7 @@ export async function render_response({
|
|
|
176
177
|
current_node = current_node.child = new RenderNode(
|
|
177
178
|
// TODO tidy up
|
|
178
179
|
/** @type {Component} */ (await branch[i + 1].node.component?.()),
|
|
179
|
-
|
|
180
|
+
error_components?.[i + 1]
|
|
180
181
|
);
|
|
181
182
|
}
|
|
182
183
|
}
|
|
@@ -201,7 +202,7 @@ export async function render_response({
|
|
|
201
202
|
throw e;
|
|
202
203
|
}
|
|
203
204
|
|
|
204
|
-
const handled = handle_error_and_jsonify(event, render_state,
|
|
205
|
+
const handled = handle_error_and_jsonify(event, render_state, e);
|
|
205
206
|
|
|
206
207
|
// TODO 4.0 make this an async function and await `handled`
|
|
207
208
|
if (handled instanceof Promise) {
|
|
@@ -244,19 +245,12 @@ export async function render_response({
|
|
|
244
245
|
}
|
|
245
246
|
|
|
246
247
|
rendered = await with_request_store({ event, state: render_state }, async () => {
|
|
247
|
-
|
|
248
|
-
// and `await maybe_promise` would eagerly access the .then property but call its function only after a tick, which is too late
|
|
249
|
-
// for the paths.reset() below and for any eager getRequestEvent() calls during rendering without AsyncLocalStorage available.
|
|
250
|
-
const rendered = render(Root, { ...render_opts, props });
|
|
251
|
-
|
|
252
|
-
const { head, body, hashes } = await rendered;
|
|
253
|
-
|
|
254
|
-
if (hashes) {
|
|
255
|
-
csp.add_script_hashes(hashes.script);
|
|
256
|
-
}
|
|
257
|
-
|
|
258
|
-
return { head, body, hashes };
|
|
248
|
+
return render(Root, { ...render_opts, props });
|
|
259
249
|
});
|
|
250
|
+
|
|
251
|
+
if (rendered.hashes) {
|
|
252
|
+
csp.add_script_hashes(rendered.hashes.script);
|
|
253
|
+
}
|
|
260
254
|
} finally {
|
|
261
255
|
if (DEV) {
|
|
262
256
|
globalThis.fetch = fetch;
|
|
@@ -269,7 +263,7 @@ export async function render_response({
|
|
|
269
263
|
for (const { node } of branch) {
|
|
270
264
|
for (const url of node.imports) modulepreloads.add(url);
|
|
271
265
|
for (const url of node.stylesheets) stylesheets.add(url);
|
|
272
|
-
for (const
|
|
266
|
+
for (const font of node.fonts) fonts.set(font.file, font);
|
|
273
267
|
|
|
274
268
|
if (node.inline_styles && !client?.inline) {
|
|
275
269
|
Object.entries(await node.inline_styles()).forEach(([filename, css]) => {
|
|
@@ -317,7 +311,10 @@ export async function render_response({
|
|
|
317
311
|
* @param {string[]} attributes
|
|
318
312
|
*/
|
|
319
313
|
const add_preload = (path, attributes) => {
|
|
320
|
-
if (
|
|
314
|
+
if (
|
|
315
|
+
__SVELTEKIT_LINK_HEADER_PRELOAD__ &&
|
|
316
|
+
!(state.prerendering || state.prerender_default === true)
|
|
317
|
+
) {
|
|
321
318
|
link_headers.add(`<${encodeURI(path)}>; ${attributes.join('; ')}; nopush`);
|
|
322
319
|
} else {
|
|
323
320
|
head.add_link_tag(path, attributes);
|
|
@@ -334,7 +331,7 @@ export async function render_response({
|
|
|
334
331
|
// include them in disabled state so that Vite can detect them and doesn't try to add them
|
|
335
332
|
attributes.push('disabled', 'media="(max-width: 0)"');
|
|
336
333
|
} else {
|
|
337
|
-
if (
|
|
334
|
+
if (__SVELTEKIT_LINK_HEADER_PRELOAD__ && resolve_opts.preload({ type: 'css', path })) {
|
|
338
335
|
link_headers.add(`<${encodeURI(path)}>; rel="preload"; as="style"; nopush`);
|
|
339
336
|
}
|
|
340
337
|
}
|
|
@@ -342,17 +339,17 @@ export async function render_response({
|
|
|
342
339
|
head.add_stylesheet(path, attributes);
|
|
343
340
|
}
|
|
344
341
|
|
|
345
|
-
for (const
|
|
346
|
-
const path = prefixed(
|
|
342
|
+
for (const { file, filename } of fonts.values()) {
|
|
343
|
+
const path = prefixed(file);
|
|
347
344
|
|
|
348
|
-
if (resolve_opts.preload({ type: 'font', path })) {
|
|
349
|
-
const ext =
|
|
345
|
+
if (resolve_opts.preload({ type: 'font', path, filename })) {
|
|
346
|
+
const ext = file.slice(file.lastIndexOf('.') + 1);
|
|
350
347
|
|
|
351
348
|
add_preload(path, ['rel="preload"', 'as="font"', `type="font/${ext}"`, 'crossorigin']);
|
|
352
349
|
}
|
|
353
350
|
}
|
|
354
351
|
|
|
355
|
-
const global =
|
|
352
|
+
const global = __SVELTEKIT_GLOBAL_NAME__;
|
|
356
353
|
const { data, chunks } = data_serializer.get_data(csp);
|
|
357
354
|
|
|
358
355
|
if (page_config.ssr && page_config.csr) {
|
|
@@ -514,7 +511,7 @@ export async function render_response({
|
|
|
514
511
|
); // make output after it's put together with the rest more readable
|
|
515
512
|
hydrate.push(`params: ${devalue.uneval(event.params)}`, `server_route: ${stringified}`);
|
|
516
513
|
}
|
|
517
|
-
} else if (
|
|
514
|
+
} else if (__SVELTEKIT_EMBEDDED__) {
|
|
518
515
|
hydrate.push(`params: ${devalue.uneval(event.params)}`, `route: ${s(event.route)}`);
|
|
519
516
|
}
|
|
520
517
|
|
|
@@ -522,7 +519,7 @@ export async function render_response({
|
|
|
522
519
|
args.push(`{\n${indent}\t${hydrate.join(`,\n${indent}\t`)}\n${indent}}`);
|
|
523
520
|
}
|
|
524
521
|
|
|
525
|
-
const remote_data = await collect_remote_data({}, event, state
|
|
522
|
+
const remote_data = await collect_remote_data({}, event, state);
|
|
526
523
|
|
|
527
524
|
const serialized_data =
|
|
528
525
|
Object.keys(remote_data).length > 0
|
|
@@ -554,7 +551,7 @@ export async function render_response({
|
|
|
554
551
|
blocks.push(boot);
|
|
555
552
|
}
|
|
556
553
|
|
|
557
|
-
if (
|
|
554
|
+
if (__SVELTEKIT_SERVICE_WORKER__) {
|
|
558
555
|
let opts = ", { type: 'module' }";
|
|
559
556
|
if (options.service_worker_options != null) {
|
|
560
557
|
const service_worker_options = { ...options.service_worker_options, type: 'module' };
|
|
@@ -615,7 +612,7 @@ export async function render_response({
|
|
|
615
612
|
headers.set('content-security-policy-report-only', report_only_header);
|
|
616
613
|
}
|
|
617
614
|
|
|
618
|
-
if (
|
|
615
|
+
if (__SVELTEKIT_LINK_HEADER_PRELOAD__ && link_headers.size) {
|
|
619
616
|
headers.set('link', Array.from(link_headers).join(', '));
|
|
620
617
|
}
|
|
621
618
|
}
|
|
@@ -662,22 +659,7 @@ export async function render_response({
|
|
|
662
659
|
status,
|
|
663
660
|
headers
|
|
664
661
|
})
|
|
665
|
-
: new Response(
|
|
666
|
-
new ReadableStream({
|
|
667
|
-
async start(controller) {
|
|
668
|
-
controller.enqueue(text_encoder.encode(transformed + '\n'));
|
|
669
|
-
for await (const chunk of chunks) {
|
|
670
|
-
if (chunk.length) controller.enqueue(text_encoder.encode(chunk));
|
|
671
|
-
}
|
|
672
|
-
controller.close();
|
|
673
|
-
},
|
|
674
|
-
|
|
675
|
-
type: 'bytes'
|
|
676
|
-
}),
|
|
677
|
-
{
|
|
678
|
-
headers
|
|
679
|
-
}
|
|
680
|
-
);
|
|
662
|
+
: new Response(stream_text(transformed + '\n', chunks), { headers });
|
|
681
663
|
}
|
|
682
664
|
|
|
683
665
|
class Head {
|
|
@@ -14,17 +14,16 @@ import { server_data_serializer } from './data_serializer.js';
|
|
|
14
14
|
* @param {{
|
|
15
15
|
* event: import('@sveltejs/kit').RequestEvent;
|
|
16
16
|
* state: import('types').RequestState;
|
|
17
|
-
* options: import('types').SSROptions;
|
|
18
17
|
* manifest: import('@sveltejs/kit').SSRManifest;
|
|
19
18
|
* error: unknown;
|
|
20
19
|
* resolve_opts: import('types').RequiredResolveOptions;
|
|
21
20
|
* }} opts
|
|
22
21
|
*/
|
|
23
|
-
export async function respond_with_error({ event, state,
|
|
22
|
+
export async function respond_with_error({ event, state, manifest, error, resolve_opts }) {
|
|
24
23
|
// reroute to the fallback page to prevent an infinite chain of requests.
|
|
25
24
|
if (event.request.headers.get('x-sveltekit-error')) {
|
|
26
|
-
const transformed = await handle_error_and_jsonify(event, state,
|
|
27
|
-
return static_error_page(
|
|
25
|
+
const transformed = await handle_error_and_jsonify(event, state, error);
|
|
26
|
+
return static_error_page(transformed.status, transformed.message);
|
|
28
27
|
}
|
|
29
28
|
|
|
30
29
|
/** @type {import('./types.js').Fetched[]} */
|
|
@@ -35,9 +34,9 @@ export async function respond_with_error({ event, state, options, manifest, erro
|
|
|
35
34
|
const nodes = new PageNodes([default_layout]);
|
|
36
35
|
const ssr = nodes.ssr();
|
|
37
36
|
const csr = nodes.csr();
|
|
38
|
-
const data_serializer = server_data_serializer(event, state
|
|
37
|
+
const data_serializer = server_data_serializer(event, state);
|
|
39
38
|
// Do this here first in case the awaits below before rendering themselves error
|
|
40
|
-
const transformed = await handle_error_and_jsonify(event, state,
|
|
39
|
+
const transformed = await handle_error_and_jsonify(event, state, error);
|
|
41
40
|
|
|
42
41
|
if (ssr) {
|
|
43
42
|
state.error = true;
|
|
@@ -80,7 +79,6 @@ export async function respond_with_error({ event, state, options, manifest, erro
|
|
|
80
79
|
}
|
|
81
80
|
|
|
82
81
|
return await render_response({
|
|
83
|
-
options,
|
|
84
82
|
manifest,
|
|
85
83
|
page_config: {
|
|
86
84
|
ssr,
|
|
@@ -103,8 +101,8 @@ export async function respond_with_error({ event, state, options, manifest, erro
|
|
|
103
101
|
return redirect_response(e.status, e.location);
|
|
104
102
|
}
|
|
105
103
|
|
|
106
|
-
const transformed = await handle_error_and_jsonify(event, state,
|
|
104
|
+
const transformed = await handle_error_and_jsonify(event, state, e);
|
|
107
105
|
|
|
108
|
-
return static_error_page(
|
|
106
|
+
return static_error_page(transformed.status, transformed.message);
|
|
109
107
|
}
|
|
110
108
|
}
|