@sveltejs/kit 3.0.0-next.2 → 3.0.0-next.20
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 +58 -36
- package/src/cli.js +14 -11
- package/src/constants.js +6 -1
- package/src/core/adapt/builder.js +54 -60
- package/src/core/adapt/index.js +2 -5
- package/src/core/config/index.js +141 -76
- package/src/core/config/options.js +260 -260
- package/src/core/config/types.d.ts +1 -1
- package/src/core/env.js +143 -13
- package/src/core/generate_manifest/index.js +18 -15
- package/src/core/postbuild/analyse.js +7 -19
- 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 +193 -69
- 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 +72 -52
- package/src/core/sync/sync.js +35 -26
- 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} +105 -56
- package/src/core/sync/write_client_manifest.js +13 -28
- package/src/core/sync/write_env.js +7 -5
- package/src/core/sync/write_server.js +25 -33
- 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 +119 -116
- 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 +194 -0
- package/src/exports/hooks/sequence.js +9 -6
- package/src/exports/index.js +53 -20
- 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} +1 -2
- 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 +219 -1118
- package/src/exports/url.js +86 -0
- package/src/exports/vite/build/build_server.js +53 -64
- 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 +199 -125
- package/src/exports/vite/index.js +1514 -833
- package/src/exports/vite/module_ids.js +2 -2
- package/src/exports/vite/preview/index.js +32 -24
- package/src/exports/vite/utils.js +83 -45
- 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 +519 -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 +75 -75
- 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 +70 -53
- package/src/runtime/server/csrf.js +65 -0
- package/src/runtime/server/data/index.js +48 -52
- package/src/runtime/server/dev.js +22 -0
- package/src/runtime/server/endpoint.js +3 -4
- package/src/runtime/server/env_module.js +0 -5
- package/src/runtime/server/errors.js +160 -0
- package/src/runtime/server/fetch.js +31 -38
- package/src/runtime/server/index.js +90 -64
- package/src/runtime/server/internal.js +71 -0
- package/src/runtime/server/page/actions.js +84 -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 +22 -23
- package/src/runtime/server/page/index.js +35 -53
- package/src/runtime/server/page/load_data.js +47 -54
- package/src/runtime/server/page/render.js +172 -238
- package/src/runtime/server/page/respond_with_error.js +16 -30
- 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 +639 -0
- package/src/runtime/server/respond.js +188 -129
- package/src/runtime/server/sourcemaps.js +183 -0
- package/src/runtime/server/state.js +53 -0
- package/src/runtime/server/utils.js +12 -154
- 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 +160 -150
- 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 +2291 -2135
- package/types/index.d.ts.map +116 -108
- 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
11
|
* @param {import('@sveltejs/kit').RequestEvent} event
|
|
15
|
-
* @param {import('types').RequestState}
|
|
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
|
}
|
|
@@ -127,19 +126,17 @@ export function server_data_serializer(event, event_state, options) {
|
|
|
127
126
|
* If the serialized data contains promises, `chunks` will be an
|
|
128
127
|
* async iterable containing their resolutions
|
|
129
128
|
* @param {import('@sveltejs/kit').RequestEvent} event
|
|
130
|
-
* @param {import('types').RequestState}
|
|
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,15 @@
|
|
|
1
|
-
/** @import {
|
|
2
|
-
/** @import {
|
|
1
|
+
/** @import { Component } from 'svelte' */
|
|
2
|
+
/** @import { RequestEvent, SSRManifest } from '@sveltejs/kit' */
|
|
3
|
+
/** @import { ActionResult } from '$app/forms' */
|
|
4
|
+
/** @import { PageNodeIndexes, RequestState, RequiredResolveOptions, ServerDataNode, SSRNode, SSROptions } from 'types' */
|
|
3
5
|
import { text } from '@sveltejs/kit';
|
|
4
|
-
import {
|
|
6
|
+
import { Redirect } from '@sveltejs/kit/internal';
|
|
5
7
|
import { compact } from '../../../utils/array.js';
|
|
6
8
|
import { get_status, normalize_error } from '../../../utils/error.js';
|
|
7
9
|
import { noop } from '../../../utils/functions.js';
|
|
8
10
|
import { add_data_suffix } from '../../pathname.js';
|
|
9
|
-
import { redirect_response
|
|
11
|
+
import { redirect_response } from '../utils.js';
|
|
12
|
+
import { static_error_page, handle_error_and_jsonify } from '../errors.js';
|
|
10
13
|
import {
|
|
11
14
|
handle_action_json_request,
|
|
12
15
|
handle_action_request,
|
|
@@ -18,7 +21,7 @@ import { load_data, load_server_data } from './load_data.js';
|
|
|
18
21
|
import { render_response } from './render.js';
|
|
19
22
|
import { respond_with_error } from './respond_with_error.js';
|
|
20
23
|
import { DEV } from 'esm-env';
|
|
21
|
-
import { get_remote_action, handle_remote_form_post } from '../remote.js';
|
|
24
|
+
import { get_remote_action, handle_remote_form_post } from '../remote-functions.js';
|
|
22
25
|
import { PageNodes } from '../../../utils/page_nodes.js';
|
|
23
26
|
|
|
24
27
|
/**
|
|
@@ -28,25 +31,15 @@ const MAX_DEPTH = 10;
|
|
|
28
31
|
|
|
29
32
|
/**
|
|
30
33
|
* @param {RequestEvent} event
|
|
31
|
-
* @param {RequestState}
|
|
34
|
+
* @param {RequestState} state
|
|
32
35
|
* @param {PageNodeIndexes} page
|
|
33
36
|
* @param {SSROptions} options
|
|
34
37
|
* @param {SSRManifest} manifest
|
|
35
|
-
* @param {SSRState} state
|
|
36
38
|
* @param {import('../../../utils/page_nodes.js').PageNodes} nodes
|
|
37
39
|
* @param {RequiredResolveOptions} resolve_opts
|
|
38
40
|
* @returns {Promise<Response>}
|
|
39
41
|
*/
|
|
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
|
-
) {
|
|
42
|
+
export async function render_page(event, state, page, options, manifest, nodes, resolve_opts) {
|
|
50
43
|
if (state.depth > MAX_DEPTH) {
|
|
51
44
|
// infinite request cycle detected
|
|
52
45
|
return text(`Not found: ${event.url.pathname}`, {
|
|
@@ -56,7 +49,7 @@ export async function render_page(
|
|
|
56
49
|
|
|
57
50
|
if (is_action_json_request(event)) {
|
|
58
51
|
const node = await manifest._.nodes[page.leaf]();
|
|
59
|
-
return handle_action_json_request(event,
|
|
52
|
+
return handle_action_json_request(event, state, options, node?.server);
|
|
60
53
|
}
|
|
61
54
|
|
|
62
55
|
try {
|
|
@@ -70,11 +63,11 @@ export async function render_page(
|
|
|
70
63
|
if (is_action_request(event)) {
|
|
71
64
|
const remote_id = get_remote_action(event.url);
|
|
72
65
|
if (remote_id) {
|
|
73
|
-
action_result = await handle_remote_form_post(event,
|
|
66
|
+
action_result = await handle_remote_form_post(event, state, manifest, remote_id);
|
|
74
67
|
} else {
|
|
75
68
|
// for action requests, first call handler in +page.server.js
|
|
76
69
|
// (this also determines status code)
|
|
77
|
-
action_result = await handle_action_request(event,
|
|
70
|
+
action_result = await handle_action_request(event, state, leaf_node.server);
|
|
78
71
|
}
|
|
79
72
|
|
|
80
73
|
if (action_result?.type === 'redirect') {
|
|
@@ -120,7 +113,10 @@ export async function render_page(
|
|
|
120
113
|
// renders an empty 'shell' page if SSR is turned off and if there is
|
|
121
114
|
// no server data to prerender. As a result, the load functions and rendering
|
|
122
115
|
// only occur client-side.
|
|
123
|
-
if (
|
|
116
|
+
if (
|
|
117
|
+
ssr === false &&
|
|
118
|
+
!((state.prerendering || state.prerender_default === true) && should_prerender_data)
|
|
119
|
+
) {
|
|
124
120
|
// if the user makes a request through a non-enhanced form, the returned value is lost
|
|
125
121
|
// because there is no SSR or client-side handling of the response
|
|
126
122
|
if (DEV && action_result && !event.request.headers.has('x-sveltekit-action')) {
|
|
@@ -154,12 +150,11 @@ export async function render_page(
|
|
|
154
150
|
status,
|
|
155
151
|
error: null,
|
|
156
152
|
event,
|
|
157
|
-
|
|
153
|
+
state,
|
|
158
154
|
options,
|
|
159
155
|
manifest,
|
|
160
|
-
state,
|
|
161
156
|
resolve_opts,
|
|
162
|
-
data_serializer: server_data_serializer(event,
|
|
157
|
+
data_serializer: server_data_serializer(event, state, options)
|
|
163
158
|
});
|
|
164
159
|
}
|
|
165
160
|
|
|
@@ -169,10 +164,10 @@ export async function render_page(
|
|
|
169
164
|
/** @type {Error | null} */
|
|
170
165
|
let load_error = null;
|
|
171
166
|
|
|
172
|
-
const data_serializer = server_data_serializer(event,
|
|
167
|
+
const data_serializer = server_data_serializer(event, state, options);
|
|
173
168
|
const data_serializer_json =
|
|
174
|
-
state.prerendering && should_prerender_data
|
|
175
|
-
? server_data_serializer_json(event,
|
|
169
|
+
(state.prerendering || state.prerender_default === true) && should_prerender_data
|
|
170
|
+
? server_data_serializer_json(event, state, options)
|
|
176
171
|
: null;
|
|
177
172
|
|
|
178
173
|
/** @type {Array<Promise<ServerDataNode | null>>} */
|
|
@@ -192,7 +187,6 @@ export async function render_page(
|
|
|
192
187
|
|
|
193
188
|
const server_data = await load_server_data({
|
|
194
189
|
event,
|
|
195
|
-
event_state,
|
|
196
190
|
state,
|
|
197
191
|
node,
|
|
198
192
|
parent: async () => {
|
|
@@ -227,7 +221,7 @@ export async function render_page(
|
|
|
227
221
|
try {
|
|
228
222
|
return await load_data({
|
|
229
223
|
event,
|
|
230
|
-
|
|
224
|
+
state,
|
|
231
225
|
fetched,
|
|
232
226
|
node,
|
|
233
227
|
parent: async () => {
|
|
@@ -239,7 +233,6 @@ export async function render_page(
|
|
|
239
233
|
},
|
|
240
234
|
resolve_opts,
|
|
241
235
|
server_data_promise: server_promises[i],
|
|
242
|
-
state,
|
|
243
236
|
csr
|
|
244
237
|
});
|
|
245
238
|
} catch (e) {
|
|
@@ -269,6 +262,7 @@ export async function render_page(
|
|
|
269
262
|
if (state.prerendering && should_prerender_data) {
|
|
270
263
|
const body = JSON.stringify({
|
|
271
264
|
type: 'redirect',
|
|
265
|
+
status: err.status,
|
|
272
266
|
location: err.location
|
|
273
267
|
});
|
|
274
268
|
|
|
@@ -281,8 +275,8 @@ export async function render_page(
|
|
|
281
275
|
return redirect_response(err.status, err.location);
|
|
282
276
|
}
|
|
283
277
|
|
|
284
|
-
const
|
|
285
|
-
const
|
|
278
|
+
const error = await handle_error_and_jsonify(event, state, options, err);
|
|
279
|
+
const status = error.status;
|
|
286
280
|
|
|
287
281
|
while (i--) {
|
|
288
282
|
if (page.errors[i]) {
|
|
@@ -304,10 +298,9 @@ export async function render_page(
|
|
|
304
298
|
|
|
305
299
|
return await render_response({
|
|
306
300
|
event,
|
|
307
|
-
|
|
301
|
+
state,
|
|
308
302
|
options,
|
|
309
303
|
manifest,
|
|
310
|
-
state,
|
|
311
304
|
resolve_opts,
|
|
312
305
|
page_config: {
|
|
313
306
|
ssr: nodes.ssr(),
|
|
@@ -315,13 +308,7 @@ export async function render_page(
|
|
|
315
308
|
},
|
|
316
309
|
status,
|
|
317
310
|
error,
|
|
318
|
-
error_components: await load_error_components(
|
|
319
|
-
options,
|
|
320
|
-
ssr,
|
|
321
|
-
error_branch,
|
|
322
|
-
page,
|
|
323
|
-
manifest
|
|
324
|
-
),
|
|
311
|
+
error_components: await load_error_components(ssr, error_branch, page, manifest),
|
|
325
312
|
branch: error_branch,
|
|
326
313
|
fetched,
|
|
327
314
|
data_serializer
|
|
@@ -358,10 +345,9 @@ export async function render_page(
|
|
|
358
345
|
|
|
359
346
|
return await render_response({
|
|
360
347
|
event,
|
|
361
|
-
|
|
348
|
+
state,
|
|
362
349
|
options,
|
|
363
350
|
manifest,
|
|
364
|
-
state,
|
|
365
351
|
resolve_opts,
|
|
366
352
|
page_config: {
|
|
367
353
|
csr,
|
|
@@ -372,8 +358,8 @@ export async function render_page(
|
|
|
372
358
|
branch: compact(branch),
|
|
373
359
|
action_result,
|
|
374
360
|
fetched,
|
|
375
|
-
data_serializer: !ssr ? server_data_serializer(event,
|
|
376
|
-
error_components: await load_error_components(
|
|
361
|
+
data_serializer: !ssr ? server_data_serializer(event, state, options) : data_serializer,
|
|
362
|
+
error_components: await load_error_components(ssr, branch, page, manifest)
|
|
377
363
|
});
|
|
378
364
|
} catch (e) {
|
|
379
365
|
// a remote function could have thrown a redirect during render
|
|
@@ -385,11 +371,9 @@ export async function render_page(
|
|
|
385
371
|
// but the page failed to render, or that a prerendering error occurred
|
|
386
372
|
return await respond_with_error({
|
|
387
373
|
event,
|
|
388
|
-
|
|
374
|
+
state,
|
|
389
375
|
options,
|
|
390
376
|
manifest,
|
|
391
|
-
state,
|
|
392
|
-
status: e instanceof HttpError ? e.status : 500,
|
|
393
377
|
error: e,
|
|
394
378
|
resolve_opts
|
|
395
379
|
});
|
|
@@ -397,18 +381,16 @@ export async function render_page(
|
|
|
397
381
|
}
|
|
398
382
|
|
|
399
383
|
/**
|
|
400
|
-
*
|
|
401
|
-
* @param {SSROptions} options
|
|
402
384
|
* @param {boolean} ssr
|
|
403
385
|
* @param {Array<import('./types.js').Loaded | null>} branch
|
|
404
386
|
* @param {PageNodeIndexes} page
|
|
405
387
|
* @param {SSRManifest} manifest
|
|
406
388
|
*/
|
|
407
|
-
async function load_error_components(
|
|
408
|
-
/** @type {Array<
|
|
389
|
+
async function load_error_components(ssr, branch, page, manifest) {
|
|
390
|
+
/** @type {Array<Component | undefined> | undefined} */
|
|
409
391
|
let error_components;
|
|
410
392
|
|
|
411
|
-
if (
|
|
393
|
+
if (ssr) {
|
|
412
394
|
let last_idx = -1;
|
|
413
395
|
error_components = await Promise.all(
|
|
414
396
|
// 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';
|
|
@@ -12,14 +11,13 @@ import { get_node_type } from '../utils.js';
|
|
|
12
11
|
* Calls the user's server `load` function.
|
|
13
12
|
* @param {{
|
|
14
13
|
* event: import('@sveltejs/kit').RequestEvent;
|
|
15
|
-
*
|
|
16
|
-
* state: import('types').SSRState;
|
|
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) => {
|
|
@@ -194,25 +192,23 @@ export async function load_server_data({ event, event_state, state, node, parent
|
|
|
194
192
|
* Calls the user's `load` function.
|
|
195
193
|
* @param {{
|
|
196
194
|
* event: import('@sveltejs/kit').RequestEvent;
|
|
197
|
-
*
|
|
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,
|
|
@@ -262,13 +257,13 @@ export async function load_data({
|
|
|
262
257
|
|
|
263
258
|
/**
|
|
264
259
|
* @param {Pick<import('@sveltejs/kit').RequestEvent, 'fetch' | 'url' | 'request' | 'route'>} event
|
|
265
|
-
* @param {import('types').
|
|
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
|
-
}
|