@sveltejs/kit 3.0.0-next.2 → 3.0.0-next.21
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 +62 -36
- package/src/cli.js +15 -12
- package/src/constants.js +6 -1
- package/src/core/adapt/builder.js +66 -72
- package/src/core/adapt/index.js +17 -6
- package/src/core/config/index.js +134 -80
- package/src/core/config/options.js +295 -273
- package/src/core/config/types.d.ts +1 -1
- package/src/core/env.js +146 -16
- package/src/core/generate_manifest/index.js +18 -15
- package/src/core/postbuild/analyse.js +8 -20
- package/src/core/postbuild/crawl.js +22 -6
- package/src/core/postbuild/entities.js +8 -2
- package/src/core/postbuild/fallback.js +4 -2
- package/src/core/postbuild/prerender.js +222 -70
- package/src/core/postbuild/queue.js +2 -1
- package/src/core/sync/create_manifest_data/conflict.js +1 -1
- package/src/core/sync/create_manifest_data/index.js +82 -62
- package/src/core/sync/sync.js +40 -31
- package/src/core/sync/ts.js +1 -1
- package/src/core/sync/utils.js +22 -2
- package/src/core/sync/{write_non_ambient.js → write_app_types.js} +107 -58
- package/src/core/sync/write_client_manifest.js +14 -29
- package/src/core/sync/write_env.js +7 -5
- package/src/core/sync/write_server.js +37 -45
- package/src/core/sync/write_tsconfig/index.js +274 -0
- package/src/core/sync/write_tsconfig/test-app/package.json +7 -0
- package/src/core/sync/write_tsconfig/utils.js +77 -0
- package/src/core/sync/write_tsconfig/validate.js +128 -0
- package/src/core/sync/write_types/index.js +127 -123
- package/src/core/utils.js +30 -5
- package/src/exports/env/index.js +77 -0
- package/src/exports/env/public.d.ts +55 -0
- package/src/exports/hooks/index.js +3 -9
- package/src/exports/hooks/public.d.ts +195 -0
- package/src/exports/hooks/sequence.js +9 -6
- package/src/exports/index.js +52 -29
- package/src/exports/internal/client.js +5 -0
- package/src/exports/internal/env.js +8 -5
- package/src/exports/internal/index.js +1 -90
- package/src/exports/internal/{event.js → server/event.js} +2 -3
- package/src/exports/internal/server/index.js +37 -0
- package/src/exports/internal/server/telemetry.js +95 -0
- package/src/exports/internal/shared.js +90 -0
- package/src/exports/node/index.js +64 -22
- package/src/exports/params/index.js +70 -0
- package/src/exports/params/public.d.ts +63 -0
- package/src/exports/public.d.ts +50 -1733
- package/src/exports/remote/index.js +11 -0
- package/src/exports/remote/public.d.ts +519 -0
- package/src/exports/url.js +86 -0
- package/src/exports/vite/build/build_server.js +54 -65
- package/src/exports/vite/build/remote.js +24 -19
- package/src/exports/vite/build/utils.js +0 -8
- package/src/exports/vite/dev/index.js +218 -146
- package/src/exports/vite/index.js +1590 -858
- package/src/exports/vite/module_ids.js +2 -2
- package/src/exports/vite/preview/index.js +40 -32
- package/src/exports/vite/public.d.ts +588 -0
- package/src/exports/vite/utils.js +84 -46
- package/src/pathname.js +55 -0
- package/src/runner.js +15 -0
- package/src/runtime/app/env/internal.js +4 -4
- package/src/runtime/app/env/types.d.ts +1 -1
- package/src/runtime/app/environment/index.js +3 -3
- package/src/runtime/app/{forms.js → forms/index.js} +73 -42
- package/src/runtime/app/forms/public.d.ts +2 -0
- package/src/runtime/app/forms/types.d.ts +56 -0
- package/src/runtime/app/internal/transport.js +53 -0
- package/src/runtime/app/manifest/index.js +1 -0
- package/src/runtime/app/{navigation.js → navigation/index.js} +2 -1
- package/src/runtime/app/navigation/public.d.ts +237 -0
- package/src/runtime/app/paths/client.js +37 -37
- package/src/runtime/app/paths/index.js +1 -1
- package/src/runtime/app/paths/internal/client.js +34 -2
- package/src/runtime/app/paths/internal/server.js +6 -23
- package/src/runtime/app/paths/internal.d.ts +3 -0
- package/src/runtime/app/paths/public.d.ts +1 -29
- package/src/runtime/app/paths/server.js +36 -17
- package/src/runtime/app/paths/types.d.ts +11 -19
- package/src/runtime/app/server/index.js +2 -2
- package/src/runtime/app/server/public.d.ts +201 -0
- package/src/runtime/app/server/remote/command.js +13 -11
- package/src/runtime/app/server/remote/form.js +61 -39
- package/src/runtime/app/server/remote/prerender.js +45 -45
- package/src/runtime/app/server/remote/query.js +106 -108
- package/src/runtime/app/server/remote/requested.js +27 -19
- package/src/runtime/app/server/remote/shared.js +76 -76
- package/src/runtime/app/service-worker/index.js +24 -0
- package/src/runtime/app/state/client.js +4 -2
- package/src/runtime/app/state/index.js +7 -5
- package/src/runtime/app/state/public.d.ts +72 -0
- package/src/runtime/app/state/server.js +3 -0
- package/src/runtime/app/stores.js +15 -78
- package/src/runtime/client/bundle.js +1 -1
- package/src/runtime/client/client-entry.js +3 -0
- package/src/runtime/client/client.js +1336 -648
- package/src/runtime/client/constants.js +3 -6
- package/src/runtime/client/entry.js +24 -3
- package/src/runtime/client/fetcher.js +25 -25
- package/src/runtime/client/ndjson.js +1 -1
- package/src/runtime/client/parse.js +1 -1
- package/src/runtime/client/payload.js +17 -0
- package/src/runtime/client/remote-functions/cache.svelte.js +3 -1
- package/src/runtime/client/remote-functions/command.svelte.js +37 -61
- package/src/runtime/client/remote-functions/form.svelte.js +267 -178
- package/src/runtime/client/remote-functions/prerender.svelte.js +32 -11
- package/src/runtime/client/remote-functions/query/index.js +10 -17
- package/src/runtime/client/remote-functions/query/instance.svelte.js +64 -18
- package/src/runtime/client/remote-functions/query/proxy.js +5 -5
- package/src/runtime/client/remote-functions/query-batch.svelte.js +61 -70
- package/src/runtime/client/remote-functions/query-live/index.js +1 -1
- package/src/runtime/client/remote-functions/query-live/instance.svelte.js +63 -21
- package/src/runtime/client/remote-functions/query-live/iterator.js +15 -12
- package/src/runtime/client/remote-functions/query-live/proxy.js +2 -12
- package/src/runtime/client/remote-functions/shared.svelte.js +90 -65
- package/src/runtime/client/snapshots.js +147 -0
- package/src/runtime/client/state.svelte.js +94 -55
- package/src/runtime/client/stream.js +3 -2
- package/src/runtime/client/types.d.ts +13 -9
- package/src/runtime/client/utils.js +22 -110
- package/src/runtime/components/root.svelte +56 -0
- package/src/runtime/env/dynamic/private.js +7 -0
- package/src/runtime/env/dynamic/public.js +7 -0
- package/src/runtime/env/static/private.js +6 -0
- package/src/runtime/env/static/public.js +6 -0
- package/src/runtime/form-utils.js +172 -61
- package/src/runtime/pathname.js +20 -32
- package/src/runtime/props.svelte.js +72 -0
- package/src/runtime/server/constants.js +0 -3
- package/src/runtime/server/cookie.js +72 -55
- package/src/runtime/server/csrf.js +65 -0
- package/src/runtime/server/data/index.js +49 -53
- package/src/runtime/server/dev.js +22 -0
- package/src/runtime/server/endpoint.js +6 -7
- package/src/runtime/server/env_module.js +0 -5
- package/src/runtime/server/errors.js +160 -0
- package/src/runtime/server/fetch.js +32 -39
- package/src/runtime/server/index.js +90 -64
- package/src/runtime/server/internal.js +71 -0
- package/src/runtime/server/page/actions.js +85 -64
- package/src/runtime/server/page/crypto.js +2 -2
- package/src/runtime/server/page/csp.js +88 -104
- package/src/runtime/server/page/data_serializer.js +24 -25
- package/src/runtime/server/page/index.js +36 -53
- package/src/runtime/server/page/load_data.js +50 -57
- package/src/runtime/server/page/render.js +173 -239
- package/src/runtime/server/page/respond_with_error.js +17 -31
- package/src/runtime/server/page/serialize_data.js +2 -13
- package/src/runtime/server/page/server_routing.js +85 -26
- package/src/runtime/server/remote-functions.js +640 -0
- package/src/runtime/server/respond.js +190 -131
- package/src/runtime/server/sourcemaps.js +183 -0
- package/src/runtime/server/state.js +53 -0
- package/src/runtime/server/utils.js +13 -155
- package/src/runtime/shared.js +20 -40
- package/src/runtime/utils.js +3 -0
- package/src/types/ambient-private.d.ts +11 -1
- package/src/types/ambient.d.ts +87 -36
- package/src/types/global-private.d.ts +25 -25
- package/src/types/internal.d.ts +163 -157
- package/src/types/private.d.ts +41 -1
- package/src/utils/error.js +28 -4
- package/src/utils/escape.js +9 -25
- package/src/utils/features.js +1 -1
- package/src/utils/filesystem.js +1 -23
- package/src/utils/fork.js +7 -2
- package/src/utils/hash.js +21 -0
- package/src/utils/http.js +8 -7
- package/src/utils/import.js +9 -2
- package/src/utils/imports.js +83 -0
- package/src/utils/mime.js +9 -0
- package/src/utils/page_nodes.js +6 -7
- package/src/utils/params.js +67 -0
- package/src/utils/regex.js +9 -0
- package/src/utils/routing.js +145 -73
- package/src/utils/shared-iterator.js +5 -0
- package/src/utils/streaming.js +14 -4
- package/src/utils/url.js +33 -2
- package/src/version.js +1 -1
- package/types/index.d.ts +2616 -2433
- package/types/index.d.ts.map +120 -106
- package/src/core/sync/write_ambient.js +0 -18
- package/src/core/sync/write_root.js +0 -148
- package/src/core/sync/write_tsconfig.js +0 -250
- package/src/exports/internal/server.js +0 -22
- package/src/exports/node/polyfills.js +0 -30
- package/src/runtime/server/app.js +0 -9
- package/src/runtime/server/remote.js +0 -457
- package/src/runtime/shared-server.js +0 -7
- package/src/runtime/telemetry/otel.js +0 -21
- package/src/runtime/telemetry/record_span.js +0 -65
- package/src/types/synthetic/$lib.md +0 -5
- /package/src/exports/internal/{remote-functions.js → server/remote-functions.js} +0 -0
- /package/src/{runtime/telemetry/noop.js → telemetry.js} +0 -0
|
@@ -1,22 +1,19 @@
|
|
|
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 {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
handle_error_and_jsonify,
|
|
8
|
-
serialize_uses
|
|
9
|
-
} from '../utils.js';
|
|
4
|
+
import { clarify_devalue_error, get_global_name, serialize_uses } from '../utils.js';
|
|
5
|
+
import { handle_error_and_jsonify } from '../errors.js';
|
|
6
|
+
import { encoders } from '#app/internal/transport';
|
|
10
7
|
|
|
11
8
|
/**
|
|
12
9
|
* If the serialized data contains promises, `chunks` will be an
|
|
13
10
|
* async iterable containing their resolutions
|
|
14
|
-
* @param {import('
|
|
15
|
-
* @param {import('types').RequestState}
|
|
11
|
+
* @param {import('$app/server').RequestEvent} event
|
|
12
|
+
* @param {import('types').RequestState} state
|
|
16
13
|
* @param {import('types').SSROptions} options
|
|
17
14
|
* @returns {import('./types.js').ServerDataSerializer}
|
|
18
15
|
*/
|
|
19
|
-
export function server_data_serializer(event,
|
|
16
|
+
export function server_data_serializer(event, state, options) {
|
|
20
17
|
let promise_id = 1;
|
|
21
18
|
let max_nodes = -1;
|
|
22
19
|
|
|
@@ -34,7 +31,7 @@ export function server_data_serializer(event, event_state, options) {
|
|
|
34
31
|
.then(/** @param {any} data */ (data) => ({ data }))
|
|
35
32
|
.catch(
|
|
36
33
|
/** @param {any} error */ async (error) => ({
|
|
37
|
-
error: await handle_error_and_jsonify(event,
|
|
34
|
+
error: await handle_error_and_jsonify(event, state, options, error)
|
|
38
35
|
})
|
|
39
36
|
)
|
|
40
37
|
.then(
|
|
@@ -45,12 +42,14 @@ export function server_data_serializer(event, event_state, options) {
|
|
|
45
42
|
let str;
|
|
46
43
|
try {
|
|
47
44
|
str = devalue.uneval(error ? [, error] : [data], replacer);
|
|
48
|
-
} catch {
|
|
45
|
+
} catch (e) {
|
|
49
46
|
error = await handle_error_and_jsonify(
|
|
50
47
|
event,
|
|
51
|
-
|
|
48
|
+
state,
|
|
52
49
|
options,
|
|
53
|
-
new Error(`Failed to serialize promise while rendering ${event.route.id}
|
|
50
|
+
new Error(`Failed to serialize promise while rendering ${event.route.id}`, {
|
|
51
|
+
cause: e
|
|
52
|
+
})
|
|
54
53
|
);
|
|
55
54
|
str = devalue.uneval([, error], replacer);
|
|
56
55
|
}
|
|
@@ -66,8 +65,8 @@ export function server_data_serializer(event, event_state, options) {
|
|
|
66
65
|
|
|
67
66
|
return `${global}.defer(${id})`;
|
|
68
67
|
} else {
|
|
69
|
-
for (const key in
|
|
70
|
-
const encoded =
|
|
68
|
+
for (const key in encoders) {
|
|
69
|
+
const encoded = encoders[key](thing);
|
|
71
70
|
if (encoded) {
|
|
72
71
|
return `app.decode('${key}', ${devalue.uneval(encoded, replacer)})`;
|
|
73
72
|
}
|
|
@@ -126,20 +125,18 @@ export function server_data_serializer(event, event_state, options) {
|
|
|
126
125
|
/**
|
|
127
126
|
* If the serialized data contains promises, `chunks` will be an
|
|
128
127
|
* async iterable containing their resolutions
|
|
129
|
-
* @param {import('
|
|
130
|
-
* @param {import('types').RequestState}
|
|
128
|
+
* @param {import('$app/server').RequestEvent} event
|
|
129
|
+
* @param {import('types').RequestState} state
|
|
131
130
|
* @param {import('types').SSROptions} options
|
|
132
131
|
* @returns {import('./types.js').ServerDataSerializerJson}
|
|
133
132
|
*/
|
|
134
|
-
export function server_data_serializer_json(event,
|
|
133
|
+
export function server_data_serializer_json(event, state, options) {
|
|
135
134
|
let promise_id = 1;
|
|
136
135
|
|
|
137
136
|
const iterator = create_async_iterator();
|
|
138
137
|
|
|
139
138
|
const reducers = {
|
|
140
|
-
...
|
|
141
|
-
Object.entries(options.hooks.transport).map(([key, value]) => [key, value.encode])
|
|
142
|
-
),
|
|
139
|
+
...encoders,
|
|
143
140
|
/** @param {any} thing */
|
|
144
141
|
Promise: (thing) => {
|
|
145
142
|
if (typeof thing?.then !== 'function') {
|
|
@@ -155,7 +152,7 @@ export function server_data_serializer_json(event, event_state, options) {
|
|
|
155
152
|
.catch(
|
|
156
153
|
/** @param {any} e */ async (e) => {
|
|
157
154
|
key = 'error';
|
|
158
|
-
return handle_error_and_jsonify(event,
|
|
155
|
+
return handle_error_and_jsonify(event, state, options, /** @type {any} */ (e));
|
|
159
156
|
}
|
|
160
157
|
)
|
|
161
158
|
.then(
|
|
@@ -164,12 +161,14 @@ export function server_data_serializer_json(event, event_state, options) {
|
|
|
164
161
|
let str;
|
|
165
162
|
try {
|
|
166
163
|
str = devalue.stringify(value, reducers);
|
|
167
|
-
} catch {
|
|
164
|
+
} catch (e) {
|
|
168
165
|
const error = await handle_error_and_jsonify(
|
|
169
166
|
event,
|
|
170
|
-
|
|
167
|
+
state,
|
|
171
168
|
options,
|
|
172
|
-
new Error(`Failed to serialize promise while rendering ${event.route.id}
|
|
169
|
+
new Error(`Failed to serialize promise while rendering ${event.route.id}`, {
|
|
170
|
+
cause: e
|
|
171
|
+
})
|
|
173
172
|
);
|
|
174
173
|
|
|
175
174
|
key = 'error';
|
|
@@ -1,12 +1,16 @@
|
|
|
1
|
-
/** @import {
|
|
2
|
-
/** @import {
|
|
1
|
+
/** @import { Component } from 'svelte' */
|
|
2
|
+
/** @import { SSRManifest } from '@sveltejs/kit' */
|
|
3
|
+
/** @import { RequestEvent } from '$app/server' */
|
|
4
|
+
/** @import { ActionResult } from '$app/forms' */
|
|
5
|
+
/** @import { PageNodeIndexes, RequestState, RequiredResolveOptions, ServerDataNode, SSRNode, SSROptions } from 'types' */
|
|
3
6
|
import { text } from '@sveltejs/kit';
|
|
4
|
-
import {
|
|
7
|
+
import { Redirect } from '@sveltejs/kit/internal';
|
|
5
8
|
import { compact } from '../../../utils/array.js';
|
|
6
9
|
import { get_status, normalize_error } from '../../../utils/error.js';
|
|
7
10
|
import { noop } from '../../../utils/functions.js';
|
|
8
11
|
import { add_data_suffix } from '../../pathname.js';
|
|
9
|
-
import { redirect_response
|
|
12
|
+
import { redirect_response } from '../utils.js';
|
|
13
|
+
import { static_error_page, handle_error_and_jsonify } from '../errors.js';
|
|
10
14
|
import {
|
|
11
15
|
handle_action_json_request,
|
|
12
16
|
handle_action_request,
|
|
@@ -18,7 +22,7 @@ import { load_data, load_server_data } from './load_data.js';
|
|
|
18
22
|
import { render_response } from './render.js';
|
|
19
23
|
import { respond_with_error } from './respond_with_error.js';
|
|
20
24
|
import { DEV } from 'esm-env';
|
|
21
|
-
import { get_remote_action, handle_remote_form_post } from '../remote.js';
|
|
25
|
+
import { get_remote_action, handle_remote_form_post } from '../remote-functions.js';
|
|
22
26
|
import { PageNodes } from '../../../utils/page_nodes.js';
|
|
23
27
|
|
|
24
28
|
/**
|
|
@@ -28,25 +32,15 @@ const MAX_DEPTH = 10;
|
|
|
28
32
|
|
|
29
33
|
/**
|
|
30
34
|
* @param {RequestEvent} event
|
|
31
|
-
* @param {RequestState}
|
|
35
|
+
* @param {RequestState} state
|
|
32
36
|
* @param {PageNodeIndexes} page
|
|
33
37
|
* @param {SSROptions} options
|
|
34
38
|
* @param {SSRManifest} manifest
|
|
35
|
-
* @param {SSRState} state
|
|
36
39
|
* @param {import('../../../utils/page_nodes.js').PageNodes} nodes
|
|
37
40
|
* @param {RequiredResolveOptions} resolve_opts
|
|
38
41
|
* @returns {Promise<Response>}
|
|
39
42
|
*/
|
|
40
|
-
export async function render_page(
|
|
41
|
-
event,
|
|
42
|
-
event_state,
|
|
43
|
-
page,
|
|
44
|
-
options,
|
|
45
|
-
manifest,
|
|
46
|
-
state,
|
|
47
|
-
nodes,
|
|
48
|
-
resolve_opts
|
|
49
|
-
) {
|
|
43
|
+
export async function render_page(event, state, page, options, manifest, nodes, resolve_opts) {
|
|
50
44
|
if (state.depth > MAX_DEPTH) {
|
|
51
45
|
// infinite request cycle detected
|
|
52
46
|
return text(`Not found: ${event.url.pathname}`, {
|
|
@@ -56,7 +50,7 @@ export async function render_page(
|
|
|
56
50
|
|
|
57
51
|
if (is_action_json_request(event)) {
|
|
58
52
|
const node = await manifest._.nodes[page.leaf]();
|
|
59
|
-
return handle_action_json_request(event,
|
|
53
|
+
return handle_action_json_request(event, state, options, node?.server);
|
|
60
54
|
}
|
|
61
55
|
|
|
62
56
|
try {
|
|
@@ -70,11 +64,11 @@ export async function render_page(
|
|
|
70
64
|
if (is_action_request(event)) {
|
|
71
65
|
const remote_id = get_remote_action(event.url);
|
|
72
66
|
if (remote_id) {
|
|
73
|
-
action_result = await handle_remote_form_post(event,
|
|
67
|
+
action_result = await handle_remote_form_post(event, state, manifest, remote_id);
|
|
74
68
|
} else {
|
|
75
69
|
// for action requests, first call handler in +page.server.js
|
|
76
70
|
// (this also determines status code)
|
|
77
|
-
action_result = await handle_action_request(event,
|
|
71
|
+
action_result = await handle_action_request(event, state, leaf_node.server);
|
|
78
72
|
}
|
|
79
73
|
|
|
80
74
|
if (action_result?.type === 'redirect') {
|
|
@@ -120,7 +114,10 @@ export async function render_page(
|
|
|
120
114
|
// renders an empty 'shell' page if SSR is turned off and if there is
|
|
121
115
|
// no server data to prerender. As a result, the load functions and rendering
|
|
122
116
|
// only occur client-side.
|
|
123
|
-
if (
|
|
117
|
+
if (
|
|
118
|
+
ssr === false &&
|
|
119
|
+
!((state.prerendering || state.prerender_default === true) && should_prerender_data)
|
|
120
|
+
) {
|
|
124
121
|
// if the user makes a request through a non-enhanced form, the returned value is lost
|
|
125
122
|
// because there is no SSR or client-side handling of the response
|
|
126
123
|
if (DEV && action_result && !event.request.headers.has('x-sveltekit-action')) {
|
|
@@ -154,12 +151,11 @@ export async function render_page(
|
|
|
154
151
|
status,
|
|
155
152
|
error: null,
|
|
156
153
|
event,
|
|
157
|
-
|
|
154
|
+
state,
|
|
158
155
|
options,
|
|
159
156
|
manifest,
|
|
160
|
-
state,
|
|
161
157
|
resolve_opts,
|
|
162
|
-
data_serializer: server_data_serializer(event,
|
|
158
|
+
data_serializer: server_data_serializer(event, state, options)
|
|
163
159
|
});
|
|
164
160
|
}
|
|
165
161
|
|
|
@@ -169,10 +165,10 @@ export async function render_page(
|
|
|
169
165
|
/** @type {Error | null} */
|
|
170
166
|
let load_error = null;
|
|
171
167
|
|
|
172
|
-
const data_serializer = server_data_serializer(event,
|
|
168
|
+
const data_serializer = server_data_serializer(event, state, options);
|
|
173
169
|
const data_serializer_json =
|
|
174
|
-
state.prerendering && should_prerender_data
|
|
175
|
-
? server_data_serializer_json(event,
|
|
170
|
+
(state.prerendering || state.prerender_default === true) && should_prerender_data
|
|
171
|
+
? server_data_serializer_json(event, state, options)
|
|
176
172
|
: null;
|
|
177
173
|
|
|
178
174
|
/** @type {Array<Promise<ServerDataNode | null>>} */
|
|
@@ -192,7 +188,6 @@ export async function render_page(
|
|
|
192
188
|
|
|
193
189
|
const server_data = await load_server_data({
|
|
194
190
|
event,
|
|
195
|
-
event_state,
|
|
196
191
|
state,
|
|
197
192
|
node,
|
|
198
193
|
parent: async () => {
|
|
@@ -227,7 +222,7 @@ export async function render_page(
|
|
|
227
222
|
try {
|
|
228
223
|
return await load_data({
|
|
229
224
|
event,
|
|
230
|
-
|
|
225
|
+
state,
|
|
231
226
|
fetched,
|
|
232
227
|
node,
|
|
233
228
|
parent: async () => {
|
|
@@ -239,7 +234,6 @@ export async function render_page(
|
|
|
239
234
|
},
|
|
240
235
|
resolve_opts,
|
|
241
236
|
server_data_promise: server_promises[i],
|
|
242
|
-
state,
|
|
243
237
|
csr
|
|
244
238
|
});
|
|
245
239
|
} catch (e) {
|
|
@@ -269,6 +263,7 @@ export async function render_page(
|
|
|
269
263
|
if (state.prerendering && should_prerender_data) {
|
|
270
264
|
const body = JSON.stringify({
|
|
271
265
|
type: 'redirect',
|
|
266
|
+
status: err.status,
|
|
272
267
|
location: err.location
|
|
273
268
|
});
|
|
274
269
|
|
|
@@ -281,8 +276,8 @@ export async function render_page(
|
|
|
281
276
|
return redirect_response(err.status, err.location);
|
|
282
277
|
}
|
|
283
278
|
|
|
284
|
-
const
|
|
285
|
-
const
|
|
279
|
+
const error = await handle_error_and_jsonify(event, state, options, err);
|
|
280
|
+
const status = error.status;
|
|
286
281
|
|
|
287
282
|
while (i--) {
|
|
288
283
|
if (page.errors[i]) {
|
|
@@ -304,10 +299,9 @@ export async function render_page(
|
|
|
304
299
|
|
|
305
300
|
return await render_response({
|
|
306
301
|
event,
|
|
307
|
-
|
|
302
|
+
state,
|
|
308
303
|
options,
|
|
309
304
|
manifest,
|
|
310
|
-
state,
|
|
311
305
|
resolve_opts,
|
|
312
306
|
page_config: {
|
|
313
307
|
ssr: nodes.ssr(),
|
|
@@ -315,13 +309,7 @@ export async function render_page(
|
|
|
315
309
|
},
|
|
316
310
|
status,
|
|
317
311
|
error,
|
|
318
|
-
error_components: await load_error_components(
|
|
319
|
-
options,
|
|
320
|
-
ssr,
|
|
321
|
-
error_branch,
|
|
322
|
-
page,
|
|
323
|
-
manifest
|
|
324
|
-
),
|
|
312
|
+
error_components: await load_error_components(ssr, error_branch, page, manifest),
|
|
325
313
|
branch: error_branch,
|
|
326
314
|
fetched,
|
|
327
315
|
data_serializer
|
|
@@ -358,10 +346,9 @@ export async function render_page(
|
|
|
358
346
|
|
|
359
347
|
return await render_response({
|
|
360
348
|
event,
|
|
361
|
-
|
|
349
|
+
state,
|
|
362
350
|
options,
|
|
363
351
|
manifest,
|
|
364
|
-
state,
|
|
365
352
|
resolve_opts,
|
|
366
353
|
page_config: {
|
|
367
354
|
csr,
|
|
@@ -372,8 +359,8 @@ export async function render_page(
|
|
|
372
359
|
branch: compact(branch),
|
|
373
360
|
action_result,
|
|
374
361
|
fetched,
|
|
375
|
-
data_serializer: !ssr ? server_data_serializer(event,
|
|
376
|
-
error_components: await load_error_components(
|
|
362
|
+
data_serializer: !ssr ? server_data_serializer(event, state, options) : data_serializer,
|
|
363
|
+
error_components: await load_error_components(ssr, branch, page, manifest)
|
|
377
364
|
});
|
|
378
365
|
} catch (e) {
|
|
379
366
|
// a remote function could have thrown a redirect during render
|
|
@@ -385,11 +372,9 @@ export async function render_page(
|
|
|
385
372
|
// but the page failed to render, or that a prerendering error occurred
|
|
386
373
|
return await respond_with_error({
|
|
387
374
|
event,
|
|
388
|
-
|
|
375
|
+
state,
|
|
389
376
|
options,
|
|
390
377
|
manifest,
|
|
391
|
-
state,
|
|
392
|
-
status: e instanceof HttpError ? e.status : 500,
|
|
393
378
|
error: e,
|
|
394
379
|
resolve_opts
|
|
395
380
|
});
|
|
@@ -397,18 +382,16 @@ export async function render_page(
|
|
|
397
382
|
}
|
|
398
383
|
|
|
399
384
|
/**
|
|
400
|
-
*
|
|
401
|
-
* @param {SSROptions} options
|
|
402
385
|
* @param {boolean} ssr
|
|
403
386
|
* @param {Array<import('./types.js').Loaded | null>} branch
|
|
404
387
|
* @param {PageNodeIndexes} page
|
|
405
388
|
* @param {SSRManifest} manifest
|
|
406
389
|
*/
|
|
407
|
-
async function load_error_components(
|
|
408
|
-
/** @type {Array<
|
|
390
|
+
async function load_error_components(ssr, branch, page, manifest) {
|
|
391
|
+
/** @type {Array<Component | undefined> | undefined} */
|
|
409
392
|
let error_components;
|
|
410
393
|
|
|
411
|
-
if (
|
|
394
|
+
if (ssr) {
|
|
412
395
|
let last_idx = -1;
|
|
413
396
|
error_components = await Promise.all(
|
|
414
397
|
// eslint-disable-next-line @typescript-eslint/await-thenable
|
|
@@ -2,8 +2,7 @@ import { DEV } from 'esm-env';
|
|
|
2
2
|
import { noop } from '../../../utils/functions.js';
|
|
3
3
|
import { disable_search, make_trackable } from '../../../utils/url.js';
|
|
4
4
|
import { validate_depends, validate_load_response } from '../../shared.js';
|
|
5
|
-
import { with_request_store, merge_tracing } from '@sveltejs/kit/internal/server';
|
|
6
|
-
import { record_span } from '../../telemetry/record_span.js';
|
|
5
|
+
import { with_request_store, merge_tracing, record_span } from '@sveltejs/kit/internal/server';
|
|
7
6
|
import { base64_encode } from '../../utils.js';
|
|
8
7
|
import { NULL_BODY_STATUS } from '../constants.js';
|
|
9
8
|
import { get_node_type } from '../utils.js';
|
|
@@ -11,15 +10,14 @@ import { get_node_type } from '../utils.js';
|
|
|
11
10
|
/**
|
|
12
11
|
* Calls the user's server `load` function.
|
|
13
12
|
* @param {{
|
|
14
|
-
* event: import('
|
|
15
|
-
*
|
|
16
|
-
* state: import('types').SSRState;
|
|
13
|
+
* event: import('$app/server').RequestEvent;
|
|
14
|
+
* state: import('types').RequestState;
|
|
17
15
|
* node: import('types').SSRNode | undefined;
|
|
18
16
|
* parent: () => Promise<Record<string, any>>;
|
|
19
17
|
* }} opts
|
|
20
18
|
* @returns {Promise<import('types').ServerDataNode | null>}
|
|
21
19
|
*/
|
|
22
|
-
export async function load_server_data({ event,
|
|
20
|
+
export async function load_server_data({ event, state, node, parent }) {
|
|
23
21
|
if (!node?.server) return null;
|
|
24
22
|
|
|
25
23
|
let is_tracking = true;
|
|
@@ -67,7 +65,7 @@ export async function load_server_data({ event, event_state, state, node, parent
|
|
|
67
65
|
}
|
|
68
66
|
);
|
|
69
67
|
|
|
70
|
-
if (state.prerendering) {
|
|
68
|
+
if (state.prerendering || state.prerender_default === true) {
|
|
71
69
|
disable_search(url);
|
|
72
70
|
}
|
|
73
71
|
|
|
@@ -83,7 +81,7 @@ export async function load_server_data({ event, event_state, state, node, parent
|
|
|
83
81
|
},
|
|
84
82
|
fn: async (current) => {
|
|
85
83
|
const traced_event = merge_tracing(event, current);
|
|
86
|
-
const result = await with_request_store({ event: traced_event, state
|
|
84
|
+
const result = await with_request_store({ event: traced_event, state }, () =>
|
|
87
85
|
load.call(null, {
|
|
88
86
|
...traced_event,
|
|
89
87
|
fetch: (info, init) => {
|
|
@@ -193,26 +191,24 @@ export async function load_server_data({ event, event_state, state, node, parent
|
|
|
193
191
|
/**
|
|
194
192
|
* Calls the user's `load` function.
|
|
195
193
|
* @param {{
|
|
196
|
-
* event: import('
|
|
197
|
-
*
|
|
194
|
+
* event: import('$app/server').RequestEvent;
|
|
195
|
+
* state: import('types').RequestState;
|
|
198
196
|
* fetched: import('./types.js').Fetched[];
|
|
199
197
|
* node: import('types').SSRNode | undefined;
|
|
200
198
|
* parent: () => Promise<Record<string, any>>;
|
|
201
199
|
* resolve_opts: import('types').RequiredResolveOptions;
|
|
202
200
|
* server_data_promise: Promise<import('types').ServerDataNode | null>;
|
|
203
|
-
* state: import('types').SSRState;
|
|
204
201
|
* csr: boolean;
|
|
205
202
|
* }} opts
|
|
206
203
|
* @returns {Promise<Record<string, any | Promise<any>> | null>}
|
|
207
204
|
*/
|
|
208
205
|
export async function load_data({
|
|
209
206
|
event,
|
|
210
|
-
|
|
207
|
+
state,
|
|
211
208
|
fetched,
|
|
212
209
|
node,
|
|
213
210
|
parent,
|
|
214
211
|
server_data_promise,
|
|
215
|
-
state,
|
|
216
212
|
resolve_opts,
|
|
217
213
|
csr
|
|
218
214
|
}) {
|
|
@@ -234,15 +230,14 @@ export async function load_data({
|
|
|
234
230
|
},
|
|
235
231
|
fn: async (current) => {
|
|
236
232
|
const traced_event = merge_tracing(event, current);
|
|
237
|
-
const child_state = { ...event_state, is_in_universal_load: true };
|
|
238
233
|
|
|
239
|
-
return await with_request_store({ event: traced_event, state
|
|
234
|
+
return await with_request_store({ event: traced_event, state }, () =>
|
|
240
235
|
load.call(null, {
|
|
241
236
|
url: event.url,
|
|
242
237
|
params: event.params,
|
|
243
238
|
data: server_data_node?.data ?? null,
|
|
244
239
|
route: event.route,
|
|
245
|
-
fetch: create_universal_fetch(event, state, fetched, csr, resolve_opts),
|
|
240
|
+
fetch: create_universal_fetch(event, state.prerendering, fetched, csr, resolve_opts),
|
|
246
241
|
setHeaders: event.setHeaders,
|
|
247
242
|
depends: noop,
|
|
248
243
|
parent,
|
|
@@ -261,14 +256,14 @@ export async function load_data({
|
|
|
261
256
|
}
|
|
262
257
|
|
|
263
258
|
/**
|
|
264
|
-
* @param {Pick<import('
|
|
265
|
-
* @param {import('types').
|
|
259
|
+
* @param {Pick<import('$app/server').RequestEvent, 'fetch' | 'url' | 'request' | 'route'>} event
|
|
260
|
+
* @param {import('types').PrerenderOptions | undefined} prerendering
|
|
266
261
|
* @param {import('./types.js').Fetched[]} fetched
|
|
267
262
|
* @param {boolean} csr
|
|
268
|
-
* @param {Pick<Required<import('@sveltejs/kit').ResolveOptions>, 'filterSerializedResponseHeaders'>} resolve_opts
|
|
263
|
+
* @param {Pick<Required<import('@sveltejs/kit/hooks').ResolveOptions>, 'filterSerializedResponseHeaders'>} resolve_opts
|
|
269
264
|
* @returns {typeof fetch}
|
|
270
265
|
*/
|
|
271
|
-
export function create_universal_fetch(event,
|
|
266
|
+
export function create_universal_fetch(event, prerendering, fetched, csr, resolve_opts) {
|
|
272
267
|
/**
|
|
273
268
|
* @param {URL | RequestInfo} input
|
|
274
269
|
* @param {RequestInit} [init]
|
|
@@ -290,9 +285,9 @@ export function create_universal_fetch(event, state, fetched, csr, resolve_opts)
|
|
|
290
285
|
let dependency;
|
|
291
286
|
|
|
292
287
|
if (same_origin) {
|
|
293
|
-
if (
|
|
288
|
+
if (prerendering) {
|
|
294
289
|
dependency = { response, body: null };
|
|
295
|
-
|
|
290
|
+
prerendering.dependencies.set(url.pathname, dependency);
|
|
296
291
|
}
|
|
297
292
|
} else if (url.protocol === 'https:' || url.protocol === 'http:') {
|
|
298
293
|
// simulate CORS errors and "no access to body in no-cors mode" server-side for consistency with client-side behaviour
|
|
@@ -334,14 +329,24 @@ export function create_universal_fetch(event, state, fetched, csr, resolve_opts)
|
|
|
334
329
|
);
|
|
335
330
|
}
|
|
336
331
|
|
|
332
|
+
const request_body =
|
|
333
|
+
input instanceof Request && cloned_body
|
|
334
|
+
? await new Response(cloned_body).text()
|
|
335
|
+
: init?.body;
|
|
336
|
+
|
|
337
|
+
if (
|
|
338
|
+
request_body &&
|
|
339
|
+
typeof request_body !== 'string' &&
|
|
340
|
+
!ArrayBuffer.isView(request_body)
|
|
341
|
+
) {
|
|
342
|
+
// requests whose body can't be hashed aren't serialized — the browser repeats the fetch
|
|
343
|
+
return;
|
|
344
|
+
}
|
|
345
|
+
|
|
337
346
|
fetched.push({
|
|
338
347
|
url: same_origin ? url.href.slice(event.url.origin.length) : url.href,
|
|
339
348
|
method: event.request.method,
|
|
340
|
-
request_body: /** @type {string | ArrayBufferView | undefined} */ (
|
|
341
|
-
input instanceof Request && cloned_body
|
|
342
|
-
? await stream_to_string(cloned_body)
|
|
343
|
-
: init?.body
|
|
344
|
-
),
|
|
349
|
+
request_body: /** @type {string | ArrayBufferView | null | undefined} */ (request_body),
|
|
345
350
|
request_headers: cloned_headers,
|
|
346
351
|
response_body: body,
|
|
347
352
|
response,
|
|
@@ -361,23 +366,14 @@ export function create_universal_fetch(event, state, fetched, csr, resolve_opts)
|
|
|
361
366
|
const [a, b] = response.body.tee();
|
|
362
367
|
|
|
363
368
|
void (async () => {
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
for await (const chunk of a) {
|
|
367
|
-
const combined = new Uint8Array(result.length + chunk.length);
|
|
368
|
-
|
|
369
|
-
combined.set(result, 0);
|
|
370
|
-
combined.set(chunk, result.length);
|
|
371
|
-
|
|
372
|
-
result = combined;
|
|
373
|
-
}
|
|
369
|
+
const result = new Uint8Array(await new Response(a).arrayBuffer());
|
|
374
370
|
|
|
375
371
|
if (dependency) {
|
|
376
372
|
dependency.body = new Uint8Array(result);
|
|
377
373
|
}
|
|
378
374
|
|
|
379
375
|
void push_fetched(base64_encode(result), true);
|
|
380
|
-
})();
|
|
376
|
+
})().catch(noop); // prevent unhandled rejection potentially crashing the process
|
|
381
377
|
|
|
382
378
|
return (teed_body = b);
|
|
383
379
|
}
|
|
@@ -465,13 +461,28 @@ export function create_universal_fetch(event, state, fetched, csr, resolve_opts)
|
|
|
465
461
|
const included = resolve_opts.filterSerializedResponseHeaders(lower, value);
|
|
466
462
|
if (!included) {
|
|
467
463
|
throw new Error(
|
|
468
|
-
`Failed to get response header "${lower}" — it must be included by the \`filterSerializedResponseHeaders\` option: https://svelte.dev/docs/kit/hooks#
|
|
464
|
+
`Failed to get response header "${lower}" — it must be included by the \`filterSerializedResponseHeaders\` option: https://svelte.dev/docs/kit/hooks#handle (at ${event.route.id})`
|
|
469
465
|
);
|
|
470
466
|
}
|
|
471
467
|
}
|
|
472
468
|
|
|
473
469
|
return value;
|
|
474
470
|
};
|
|
471
|
+
|
|
472
|
+
const get_set_cookie = response.headers.getSetCookie;
|
|
473
|
+
response.headers.getSetCookie = () => {
|
|
474
|
+
const values = get_set_cookie.call(response.headers);
|
|
475
|
+
for (const value of values) {
|
|
476
|
+
const included = resolve_opts.filterSerializedResponseHeaders('set-cookie', value);
|
|
477
|
+
if (!included) {
|
|
478
|
+
throw new Error(
|
|
479
|
+
`Failed to get response header "set-cookie" — it must be included by the \`filterSerializedResponseHeaders\` option: https://svelte.dev/docs/kit/hooks#handle (at ${event.route.id})`
|
|
480
|
+
);
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
return values;
|
|
485
|
+
};
|
|
475
486
|
}
|
|
476
487
|
|
|
477
488
|
return proxy;
|
|
@@ -486,21 +497,3 @@ export function create_universal_fetch(event, state, fetched, csr, resolve_opts)
|
|
|
486
497
|
return response;
|
|
487
498
|
};
|
|
488
499
|
}
|
|
489
|
-
|
|
490
|
-
/**
|
|
491
|
-
* @param {ReadableStream<Uint8Array>} stream
|
|
492
|
-
*/
|
|
493
|
-
async function stream_to_string(stream) {
|
|
494
|
-
let result = '';
|
|
495
|
-
const reader = stream.getReader();
|
|
496
|
-
const decoder = new TextDecoder();
|
|
497
|
-
while (true) {
|
|
498
|
-
const { done, value } = await reader.read();
|
|
499
|
-
if (done) {
|
|
500
|
-
result += decoder.decode();
|
|
501
|
-
break;
|
|
502
|
-
}
|
|
503
|
-
result += decoder.decode(value, { stream: true });
|
|
504
|
-
}
|
|
505
|
-
return result;
|
|
506
|
-
}
|