@sveltejs/kit 3.0.0-next.14 → 3.0.0-next.16
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 +6 -3
- package/src/cli.js +6 -3
- package/src/core/adapt/builder.js +12 -5
- package/src/core/config/index.js +4 -5
- package/src/core/env.js +3 -3
- package/src/core/postbuild/prerender.js +6 -10
- package/src/core/sync/sync.js +3 -2
- package/src/core/sync/utils.js +2 -2
- package/src/core/sync/write_tsconfig/index.js +71 -53
- package/src/core/sync/write_tsconfig/utils.js +0 -61
- package/src/core/sync/write_tsconfig/validate.js +128 -0
- package/src/core/sync/write_types/index.js +2 -2
- package/src/exports/public.d.ts +22 -16
- package/src/exports/vite/build/build_server.js +2 -3
- package/src/exports/vite/dev/index.js +44 -36
- package/src/exports/vite/index.js +46 -5
- package/src/exports/vite/utils.js +61 -8
- package/src/runner.js +4 -2
- package/src/runtime/app/forms.js +4 -7
- package/src/runtime/app/internal/transport.js +53 -0
- package/src/runtime/app/paths/client.js +2 -2
- package/src/runtime/app/paths/internal/client.js +2 -2
- package/src/runtime/app/server/remote/prerender.js +6 -10
- package/src/runtime/app/server/remote/query.js +3 -3
- package/src/runtime/app/server/remote/requested.js +2 -2
- package/src/runtime/app/server/remote/shared.js +1 -16
- package/src/runtime/client/client.js +29 -25
- package/src/runtime/client/parse.js +1 -1
- package/src/runtime/client/remote-functions/command.svelte.js +1 -2
- package/src/runtime/client/remote-functions/prerender.svelte.js +1 -1
- package/src/runtime/client/remote-functions/query/proxy.js +2 -2
- package/src/runtime/client/remote-functions/query-live/proxy.js +2 -2
- package/src/runtime/pathname.js +7 -1
- package/src/runtime/server/data/index.js +5 -8
- package/src/runtime/server/dev.js +22 -0
- package/src/runtime/server/endpoint.js +3 -4
- package/src/runtime/server/fetch.js +22 -24
- package/src/runtime/server/index.js +54 -22
- package/src/runtime/server/internal.js +12 -5
- package/src/runtime/server/page/actions.js +18 -43
- package/src/runtime/server/page/data_serializer.js +12 -13
- package/src/runtime/server/page/index.js +16 -32
- package/src/runtime/server/page/load_data.js +26 -15
- package/src/runtime/server/page/render.js +9 -11
- package/src/runtime/server/page/respond_with_error.js +8 -20
- package/src/runtime/server/remote-functions.js +11 -15
- package/src/runtime/server/respond.js +26 -31
- package/src/runtime/server/state.js +36 -19
- package/src/runtime/server/utils.js +0 -20
- package/src/runtime/shared.js +16 -38
- package/src/types/internal.d.ts +45 -52
- package/src/utils/filesystem.js +1 -23
- package/src/version.js +1 -1
- package/types/index.d.ts +24 -18
- package/types/index.d.ts.map +1 -1
- package/src/runtime/server/app.js +0 -9
|
@@ -18,13 +18,14 @@ import {
|
|
|
18
18
|
} from '../../pathname.js';
|
|
19
19
|
import { try_get_request_store, with_request_store } from '@sveltejs/kit/internal/server';
|
|
20
20
|
import { text_encoder } from '../../utils.js';
|
|
21
|
-
import { count_non_ssi_comments,
|
|
21
|
+
import { count_non_ssi_comments, get_global_name } from '../utils.js';
|
|
22
22
|
import { handle_error_and_jsonify } from '../errors.js';
|
|
23
23
|
import * as env from '__sveltekit/env';
|
|
24
24
|
import { collect_remote_data } from '../remote-functions.js';
|
|
25
25
|
import Root from '../../components/root.svelte';
|
|
26
26
|
import { render } from 'svelte/server';
|
|
27
27
|
import { Props, RenderNode } from '../../props.svelte.js';
|
|
28
|
+
import { has_custom_transporters, uneval } from '#app/internal/transport';
|
|
28
29
|
|
|
29
30
|
// TODO rename this function/module
|
|
30
31
|
|
|
@@ -35,12 +36,11 @@ import { Props, RenderNode } from '../../props.svelte.js';
|
|
|
35
36
|
* fetched: Array<import('./types.js').Fetched>;
|
|
36
37
|
* options: import('types').SSROptions;
|
|
37
38
|
* manifest: import('@sveltejs/kit').SSRManifest;
|
|
38
|
-
* state: import('types').SSRState;
|
|
39
39
|
* page_config: { ssr: boolean; csr: boolean };
|
|
40
40
|
* status: number;
|
|
41
41
|
* error: App.Error | null;
|
|
42
42
|
* event: import('@sveltejs/kit').RequestEvent;
|
|
43
|
-
*
|
|
43
|
+
* state: import('types').RequestState;
|
|
44
44
|
* resolve_opts: import('types').RequiredResolveOptions;
|
|
45
45
|
* action_result?: import('@sveltejs/kit').ActionResult;
|
|
46
46
|
* data_serializer: import('./types.js').ServerDataSerializer;
|
|
@@ -52,12 +52,11 @@ export async function render_response({
|
|
|
52
52
|
fetched,
|
|
53
53
|
options,
|
|
54
54
|
manifest,
|
|
55
|
-
state,
|
|
56
55
|
page_config,
|
|
57
56
|
status,
|
|
58
57
|
error = null,
|
|
59
58
|
event,
|
|
60
|
-
|
|
59
|
+
state,
|
|
61
60
|
resolve_opts,
|
|
62
61
|
action_result,
|
|
63
62
|
data_serializer,
|
|
@@ -183,7 +182,7 @@ export async function render_response({
|
|
|
183
182
|
|
|
184
183
|
props.page.data = data;
|
|
185
184
|
|
|
186
|
-
const render_state = { ...
|
|
185
|
+
const render_state = { ...state, is_in_render: true };
|
|
187
186
|
|
|
188
187
|
const render_opts = {
|
|
189
188
|
context: new Map([
|
|
@@ -431,7 +430,7 @@ export async function render_response({
|
|
|
431
430
|
|
|
432
431
|
let app_declaration = '';
|
|
433
432
|
|
|
434
|
-
if (
|
|
433
|
+
if (has_custom_transporters) {
|
|
435
434
|
if (client.inline) {
|
|
436
435
|
app_declaration = `const app = ${global}.app.app;`;
|
|
437
436
|
} else if (client.app) {
|
|
@@ -482,8 +481,7 @@ export async function render_response({
|
|
|
482
481
|
if (form_value) {
|
|
483
482
|
serialized.form = uneval_action_response(
|
|
484
483
|
form_value,
|
|
485
|
-
/** @type {string} */ (event.route.id)
|
|
486
|
-
options.hooks.transport
|
|
484
|
+
/** @type {string} */ (event.route.id)
|
|
487
485
|
);
|
|
488
486
|
}
|
|
489
487
|
|
|
@@ -518,11 +516,11 @@ export async function render_response({
|
|
|
518
516
|
args.push(`{\n${indent}\t${hydrate.join(`,\n${indent}\t`)}\n${indent}}`);
|
|
519
517
|
}
|
|
520
518
|
|
|
521
|
-
const remote_data = await collect_remote_data({}, event,
|
|
519
|
+
const remote_data = await collect_remote_data({}, event, state, options);
|
|
522
520
|
|
|
523
521
|
const serialized_data =
|
|
524
522
|
Object.keys(remote_data).length > 0
|
|
525
|
-
? `${global}.data = ${
|
|
523
|
+
? `${global}.data = ${uneval(remote_data)};\n\n\t\t\t\t\t\t`
|
|
526
524
|
: '';
|
|
527
525
|
|
|
528
526
|
// `client.app` is a proxy for `bundleStrategy === 'split'`
|
|
@@ -13,26 +13,17 @@ import { server_data_serializer } from './data_serializer.js';
|
|
|
13
13
|
/**
|
|
14
14
|
* @param {{
|
|
15
15
|
* event: import('@sveltejs/kit').RequestEvent;
|
|
16
|
-
*
|
|
16
|
+
* state: import('types').RequestState;
|
|
17
17
|
* options: import('types').SSROptions;
|
|
18
18
|
* manifest: import('@sveltejs/kit').SSRManifest;
|
|
19
|
-
* state: import('types').SSRState;
|
|
20
19
|
* error: unknown;
|
|
21
20
|
* resolve_opts: import('types').RequiredResolveOptions;
|
|
22
21
|
* }} opts
|
|
23
22
|
*/
|
|
24
|
-
export async function respond_with_error({
|
|
25
|
-
event,
|
|
26
|
-
event_state,
|
|
27
|
-
options,
|
|
28
|
-
manifest,
|
|
29
|
-
state,
|
|
30
|
-
error,
|
|
31
|
-
resolve_opts
|
|
32
|
-
}) {
|
|
23
|
+
export async function respond_with_error({ event, state, options, manifest, error, resolve_opts }) {
|
|
33
24
|
// reroute to the fallback page to prevent an infinite chain of requests.
|
|
34
25
|
if (event.request.headers.get('x-sveltekit-error')) {
|
|
35
|
-
const transformed = await handle_error_and_jsonify(event,
|
|
26
|
+
const transformed = await handle_error_and_jsonify(event, state, options, error);
|
|
36
27
|
return static_error_page(options, transformed.status, transformed.message);
|
|
37
28
|
}
|
|
38
29
|
|
|
@@ -44,16 +35,15 @@ export async function respond_with_error({
|
|
|
44
35
|
const nodes = new PageNodes([default_layout]);
|
|
45
36
|
const ssr = nodes.ssr();
|
|
46
37
|
const csr = nodes.csr();
|
|
47
|
-
const data_serializer = server_data_serializer(event,
|
|
38
|
+
const data_serializer = server_data_serializer(event, state, options);
|
|
48
39
|
// Do this here first in case the awaits below before rendering themselves error
|
|
49
|
-
const transformed = await handle_error_and_jsonify(event,
|
|
40
|
+
const transformed = await handle_error_and_jsonify(event, state, options, error);
|
|
50
41
|
|
|
51
42
|
if (ssr) {
|
|
52
43
|
state.error = true;
|
|
53
44
|
|
|
54
45
|
const server_data_promise = load_server_data({
|
|
55
46
|
event,
|
|
56
|
-
event_state,
|
|
57
47
|
state,
|
|
58
48
|
node: default_layout,
|
|
59
49
|
// eslint-disable-next-line @typescript-eslint/require-await
|
|
@@ -65,14 +55,13 @@ export async function respond_with_error({
|
|
|
65
55
|
|
|
66
56
|
const data = await load_data({
|
|
67
57
|
event,
|
|
68
|
-
|
|
58
|
+
state,
|
|
69
59
|
fetched,
|
|
70
60
|
node: default_layout,
|
|
71
61
|
// eslint-disable-next-line @typescript-eslint/require-await
|
|
72
62
|
parent: async () => ({}),
|
|
73
63
|
resolve_opts,
|
|
74
64
|
server_data_promise,
|
|
75
|
-
state,
|
|
76
65
|
csr
|
|
77
66
|
});
|
|
78
67
|
|
|
@@ -93,7 +82,6 @@ export async function respond_with_error({
|
|
|
93
82
|
return await render_response({
|
|
94
83
|
options,
|
|
95
84
|
manifest,
|
|
96
|
-
state,
|
|
97
85
|
page_config: {
|
|
98
86
|
ssr,
|
|
99
87
|
csr
|
|
@@ -104,7 +92,7 @@ export async function respond_with_error({
|
|
|
104
92
|
error_components: [],
|
|
105
93
|
fetched,
|
|
106
94
|
event,
|
|
107
|
-
|
|
95
|
+
state,
|
|
108
96
|
resolve_opts,
|
|
109
97
|
data_serializer
|
|
110
98
|
});
|
|
@@ -115,7 +103,7 @@ export async function respond_with_error({
|
|
|
115
103
|
return redirect_response(e.status, e.location);
|
|
116
104
|
}
|
|
117
105
|
|
|
118
|
-
const transformed = await handle_error_and_jsonify(event,
|
|
106
|
+
const transformed = await handle_error_and_jsonify(event, state, options, e);
|
|
119
107
|
|
|
120
108
|
return static_error_page(options, transformed.status, transformed.message);
|
|
121
109
|
}
|
|
@@ -6,7 +6,8 @@ import { Redirect, SvelteKitError } from '@sveltejs/kit/internal';
|
|
|
6
6
|
import { with_request_store, merge_tracing } from '@sveltejs/kit/internal/server';
|
|
7
7
|
import { app_dir, base } from '$app/paths/internal/server';
|
|
8
8
|
import { is_form_content_type } from '../../utils/http.js';
|
|
9
|
-
import { create_remote_key, parse_remote_arg, split_remote_key
|
|
9
|
+
import { create_remote_key, parse_remote_arg, split_remote_key } from '../shared.js';
|
|
10
|
+
import { stringify } from '#app/internal/transport';
|
|
10
11
|
import { handle_error_and_jsonify } from './errors.js';
|
|
11
12
|
import { normalize_error } from '../../utils/error.js';
|
|
12
13
|
import { check_incorrect_fail_use } from './page/actions.js';
|
|
@@ -59,7 +60,6 @@ async function handle_remote_call_internal(event, state, options, manifest, id)
|
|
|
59
60
|
|
|
60
61
|
/** @type {RemoteInternals} */
|
|
61
62
|
const internals = fn.__;
|
|
62
|
-
const transport = options.hooks.transport;
|
|
63
63
|
|
|
64
64
|
event.tracing.current.setAttributes({
|
|
65
65
|
'sveltekit.remote.call.type': internals.type,
|
|
@@ -87,7 +87,7 @@ async function handle_remote_call_internal(event, state, options, manifest, id)
|
|
|
87
87
|
new URL(event.request.url).searchParams.get('payload')
|
|
88
88
|
);
|
|
89
89
|
|
|
90
|
-
const generator = internals.run(event, state, parse_remote_arg(payload
|
|
90
|
+
const generator = internals.run(event, state, parse_remote_arg(payload));
|
|
91
91
|
|
|
92
92
|
const encoder = new TextEncoder();
|
|
93
93
|
|
|
@@ -156,7 +156,7 @@ async function handle_remote_call_internal(event, state, options, manifest, id)
|
|
|
156
156
|
}
|
|
157
157
|
|
|
158
158
|
// only send changed data
|
|
159
|
-
if (result !== (result = stringify(value
|
|
159
|
+
if (result !== (result = stringify(value))) {
|
|
160
160
|
send(controller, {
|
|
161
161
|
type: 'result',
|
|
162
162
|
result
|
|
@@ -214,9 +214,7 @@ async function handle_remote_call_internal(event, state, options, manifest, id)
|
|
|
214
214
|
/** @type {{ payloads: string[] }} */
|
|
215
215
|
const { payloads } = await event.request.json();
|
|
216
216
|
|
|
217
|
-
const args = await Promise.all(
|
|
218
|
-
payloads.map((payload) => parse_remote_arg(payload, transport))
|
|
219
|
-
);
|
|
217
|
+
const args = await Promise.all(payloads.map((payload) => parse_remote_arg(payload)));
|
|
220
218
|
|
|
221
219
|
data._ = await with_request_store({ event, state }, () => internals.run(args, options));
|
|
222
220
|
|
|
@@ -266,7 +264,7 @@ async function handle_remote_call_internal(event, state, options, manifest, id)
|
|
|
266
264
|
return json(
|
|
267
265
|
/** @type {RemoteFunctionResponse} */ ({
|
|
268
266
|
type: 'result',
|
|
269
|
-
data: stringify(data
|
|
267
|
+
data: stringify(data)
|
|
270
268
|
}),
|
|
271
269
|
{ headers }
|
|
272
270
|
);
|
|
@@ -279,7 +277,7 @@ async function handle_remote_call_internal(event, state, options, manifest, id)
|
|
|
279
277
|
/** @type {{ payload: string, refreshes?: string[] }} */
|
|
280
278
|
const { payload, refreshes } = await event.request.json();
|
|
281
279
|
state.remote.requested = create_requested_map(refreshes);
|
|
282
|
-
const arg = parse_remote_arg(payload
|
|
280
|
+
const arg = parse_remote_arg(payload);
|
|
283
281
|
|
|
284
282
|
data._ = await with_request_store(
|
|
285
283
|
{ event, state: { ...state, is_in_remote_form_or_command: true } },
|
|
@@ -291,7 +289,7 @@ async function handle_remote_call_internal(event, state, options, manifest, id)
|
|
|
291
289
|
|
|
292
290
|
case 'prerender': {
|
|
293
291
|
data._ = await with_request_store({ event, state }, () =>
|
|
294
|
-
fn(parse_remote_arg(additional_args
|
|
292
|
+
fn(parse_remote_arg(additional_args))
|
|
295
293
|
);
|
|
296
294
|
|
|
297
295
|
break;
|
|
@@ -303,9 +301,7 @@ async function handle_remote_call_internal(event, state, options, manifest, id)
|
|
|
303
301
|
new URL(event.request.url).searchParams.get('payload')
|
|
304
302
|
);
|
|
305
303
|
|
|
306
|
-
data._ = await with_request_store({ event, state }, () =>
|
|
307
|
-
fn(parse_remote_arg(payload, transport))
|
|
308
|
-
);
|
|
304
|
+
data._ = await with_request_store({ event, state }, () => fn(parse_remote_arg(payload)));
|
|
309
305
|
|
|
310
306
|
break;
|
|
311
307
|
}
|
|
@@ -316,7 +312,7 @@ async function handle_remote_call_internal(event, state, options, manifest, id)
|
|
|
316
312
|
return json(
|
|
317
313
|
/** @type {RemoteFunctionResponse} */ ({
|
|
318
314
|
type: 'result',
|
|
319
|
-
data: stringify(data
|
|
315
|
+
data: stringify(data)
|
|
320
316
|
}),
|
|
321
317
|
{ headers }
|
|
322
318
|
);
|
|
@@ -327,7 +323,7 @@ async function handle_remote_call_internal(event, state, options, manifest, id)
|
|
|
327
323
|
return json(
|
|
328
324
|
/** @type {RemoteFunctionResponse} */ ({
|
|
329
325
|
type: 'result',
|
|
330
|
-
data: stringify(data
|
|
326
|
+
data: stringify(data)
|
|
331
327
|
}),
|
|
332
328
|
{ headers }
|
|
333
329
|
);
|
|
@@ -42,7 +42,6 @@ import { server_data_serializer } from './page/data_serializer.js';
|
|
|
42
42
|
import { get_remote_id, handle_remote_call } from './remote-functions.js';
|
|
43
43
|
import { record_span } from '../telemetry/record_span.js';
|
|
44
44
|
import { otel } from '../telemetry/otel.js';
|
|
45
|
-
import { create_request_state } from './state.js';
|
|
46
45
|
|
|
47
46
|
/** @type {import('types').RequiredResolveOptions['transformPageChunk']} */
|
|
48
47
|
const default_transform = ({ html }) => html;
|
|
@@ -85,7 +84,7 @@ export const respond = propagate_context(internal_respond);
|
|
|
85
84
|
* @param {Request} request
|
|
86
85
|
* @param {import('types').SSROptions} options
|
|
87
86
|
* @param {import('@sveltejs/kit').SSRManifest} manifest
|
|
88
|
-
* @param {import('types').
|
|
87
|
+
* @param {import('types').RequestState} state
|
|
89
88
|
* @returns {Promise<Response>}
|
|
90
89
|
*/
|
|
91
90
|
export async function internal_respond(request, options, manifest, state) {
|
|
@@ -181,8 +180,6 @@ export async function internal_respond(request, options, manifest, state) {
|
|
|
181
180
|
url
|
|
182
181
|
);
|
|
183
182
|
|
|
184
|
-
const event_state = create_request_state(state, options.hooks);
|
|
185
|
-
|
|
186
183
|
/** @type {import('@sveltejs/kit').RequestEvent} */
|
|
187
184
|
const event = {
|
|
188
185
|
cookies,
|
|
@@ -197,7 +194,12 @@ export async function internal_respond(request, options, manifest, state) {
|
|
|
197
194
|
}),
|
|
198
195
|
locals: {},
|
|
199
196
|
params: {},
|
|
200
|
-
platform: state.platform
|
|
197
|
+
platform: state.emulator?.platform
|
|
198
|
+
? await state.emulator.platform({
|
|
199
|
+
config: {},
|
|
200
|
+
prerender: !!state.prerendering?.fallback
|
|
201
|
+
})
|
|
202
|
+
: state.platform,
|
|
201
203
|
request,
|
|
202
204
|
route: { id: null },
|
|
203
205
|
setHeaders: (new_headers) => {
|
|
@@ -235,6 +237,7 @@ export async function internal_respond(request, options, manifest, state) {
|
|
|
235
237
|
isRemoteRequest: !!remote_id
|
|
236
238
|
};
|
|
237
239
|
|
|
240
|
+
// @ts-expect-error this has to be assigned lazily
|
|
238
241
|
event.fetch = create_fetch({
|
|
239
242
|
event,
|
|
240
243
|
options,
|
|
@@ -244,13 +247,6 @@ export async function internal_respond(request, options, manifest, state) {
|
|
|
244
247
|
set_internal
|
|
245
248
|
});
|
|
246
249
|
|
|
247
|
-
if (state.emulator?.platform) {
|
|
248
|
-
event.platform = await state.emulator.platform({
|
|
249
|
-
config: {},
|
|
250
|
-
prerender: !!state.prerendering?.fallback
|
|
251
|
-
});
|
|
252
|
-
}
|
|
253
|
-
|
|
254
250
|
/** @type {string | null} */
|
|
255
251
|
let resolved_path = url.pathname;
|
|
256
252
|
|
|
@@ -324,7 +320,7 @@ export async function internal_respond(request, options, manifest, state) {
|
|
|
324
320
|
statusText: response.statusText
|
|
325
321
|
});
|
|
326
322
|
} catch (error) {
|
|
327
|
-
return await handle_fatal_error(event,
|
|
323
|
+
return await handle_fatal_error(event, state, options, error);
|
|
328
324
|
}
|
|
329
325
|
}
|
|
330
326
|
|
|
@@ -368,11 +364,13 @@ export async function internal_respond(request, options, manifest, state) {
|
|
|
368
364
|
|
|
369
365
|
if (result) {
|
|
370
366
|
route = result.route;
|
|
367
|
+
// @ts-expect-error this has to be assigned lazily
|
|
371
368
|
event.route = { id: route.id };
|
|
369
|
+
// @ts-expect-error this has to be assigned lazily
|
|
372
370
|
event.params = result.params;
|
|
373
371
|
}
|
|
374
372
|
} catch (e) {
|
|
375
|
-
return await handle_fatal_error(event,
|
|
373
|
+
return await handle_fatal_error(event, state, options, e);
|
|
376
374
|
}
|
|
377
375
|
}
|
|
378
376
|
|
|
@@ -432,6 +430,7 @@ export async function internal_respond(request, options, manifest, state) {
|
|
|
432
430
|
}
|
|
433
431
|
|
|
434
432
|
if (state.emulator?.platform) {
|
|
433
|
+
// @ts-expect-error this has to be assigned lazily
|
|
435
434
|
event.platform = await state.emulator.platform({ config, prerender });
|
|
436
435
|
}
|
|
437
436
|
|
|
@@ -454,10 +453,10 @@ export async function internal_respond(request, options, manifest, state) {
|
|
|
454
453
|
add_cookies_to_headers(response.headers, new_cookies.values());
|
|
455
454
|
return response;
|
|
456
455
|
} catch (err) {
|
|
457
|
-
return await handle_fatal_error(event,
|
|
456
|
+
return await handle_fatal_error(event, state, options, err);
|
|
458
457
|
}
|
|
459
458
|
}
|
|
460
|
-
return await handle_fatal_error(event,
|
|
459
|
+
return await handle_fatal_error(event, state, options, e);
|
|
461
460
|
}
|
|
462
461
|
|
|
463
462
|
async function handle() {
|
|
@@ -486,7 +485,7 @@ export async function internal_respond(request, options, manifest, state) {
|
|
|
486
485
|
}
|
|
487
486
|
};
|
|
488
487
|
|
|
489
|
-
return await with_request_store({ event: traced_event, state
|
|
488
|
+
return await with_request_store({ event: traced_event, state }, () =>
|
|
490
489
|
options.hooks.handle({
|
|
491
490
|
event: traced_event,
|
|
492
491
|
resolve: (event, opts) => {
|
|
@@ -593,10 +592,9 @@ export async function internal_respond(request, options, manifest, state) {
|
|
|
593
592
|
if (resolved_path === null) {
|
|
594
593
|
return await respond_with_error({
|
|
595
594
|
event,
|
|
596
|
-
|
|
595
|
+
state,
|
|
597
596
|
options,
|
|
598
597
|
manifest,
|
|
599
|
-
state,
|
|
600
598
|
error: new SvelteKitError(
|
|
601
599
|
400,
|
|
602
600
|
'Malformed URI',
|
|
@@ -609,10 +607,9 @@ export async function internal_respond(request, options, manifest, state) {
|
|
|
609
607
|
if (options.hash_routing || state.prerendering?.fallback) {
|
|
610
608
|
return await render_response({
|
|
611
609
|
event,
|
|
612
|
-
|
|
610
|
+
state,
|
|
613
611
|
options,
|
|
614
612
|
manifest,
|
|
615
|
-
state,
|
|
616
613
|
page_config: { ssr: false, csr: true },
|
|
617
614
|
status: 200,
|
|
618
615
|
error: null,
|
|
@@ -626,12 +623,12 @@ export async function internal_respond(request, options, manifest, state) {
|
|
|
626
623
|
],
|
|
627
624
|
fetched: [],
|
|
628
625
|
resolve_opts,
|
|
629
|
-
data_serializer: server_data_serializer(event,
|
|
626
|
+
data_serializer: server_data_serializer(event, state, options)
|
|
630
627
|
});
|
|
631
628
|
}
|
|
632
629
|
|
|
633
630
|
if (remote_id) {
|
|
634
|
-
return await handle_remote_call(event,
|
|
631
|
+
return await handle_remote_call(event, state, options, manifest, remote_id);
|
|
635
632
|
}
|
|
636
633
|
|
|
637
634
|
if (route) {
|
|
@@ -643,11 +640,10 @@ export async function internal_respond(request, options, manifest, state) {
|
|
|
643
640
|
if (is_data_request) {
|
|
644
641
|
response = await render_data(
|
|
645
642
|
event,
|
|
646
|
-
|
|
643
|
+
state,
|
|
647
644
|
route,
|
|
648
645
|
options,
|
|
649
646
|
manifest,
|
|
650
|
-
state,
|
|
651
647
|
invalidated_data_nodes,
|
|
652
648
|
trailing_slash
|
|
653
649
|
);
|
|
@@ -672,18 +668,17 @@ export async function internal_respond(request, options, manifest, state) {
|
|
|
672
668
|
}
|
|
673
669
|
|
|
674
670
|
if (endpoint) {
|
|
675
|
-
response = await render_endpoint(event,
|
|
671
|
+
response = await render_endpoint(event, state, endpoint);
|
|
676
672
|
} else if (route.page) {
|
|
677
673
|
if (!page_nodes) {
|
|
678
674
|
throw new Error('page_nodes not found. This should never happen');
|
|
679
675
|
} else if (page_methods.has(method)) {
|
|
680
676
|
response = await render_page(
|
|
681
677
|
event,
|
|
682
|
-
|
|
678
|
+
state,
|
|
683
679
|
route.page,
|
|
684
680
|
options,
|
|
685
681
|
manifest,
|
|
686
|
-
state,
|
|
687
682
|
page_nodes,
|
|
688
683
|
resolve_opts
|
|
689
684
|
);
|
|
@@ -769,10 +764,9 @@ export async function internal_respond(request, options, manifest, state) {
|
|
|
769
764
|
|
|
770
765
|
return await respond_with_error({
|
|
771
766
|
event,
|
|
772
|
-
|
|
767
|
+
state,
|
|
773
768
|
options,
|
|
774
769
|
manifest,
|
|
775
|
-
state,
|
|
776
770
|
error: new SvelteKitError(404, 'Not Found', `Not found: ${event.url.pathname}`),
|
|
777
771
|
resolve_opts
|
|
778
772
|
});
|
|
@@ -793,12 +787,13 @@ export async function internal_respond(request, options, manifest, state) {
|
|
|
793
787
|
// and I don't even know how to describe it. need to investigate at some point
|
|
794
788
|
|
|
795
789
|
// HttpError from endpoint can end up here - TODO should it be handled there instead?
|
|
796
|
-
return await handle_fatal_error(event,
|
|
790
|
+
return await handle_fatal_error(event, state, options, e);
|
|
797
791
|
} finally {
|
|
798
792
|
event.cookies.set = () => {
|
|
799
793
|
throw new Error('Cannot use `cookies.set(...)` after the response has been generated');
|
|
800
794
|
};
|
|
801
795
|
|
|
796
|
+
// @ts-expect-error this has to be assigned lazily
|
|
802
797
|
event.setHeaders = () => {
|
|
803
798
|
throw new Error('Cannot use `setHeaders(...)` after the response has been generated');
|
|
804
799
|
};
|
|
@@ -1,20 +1,9 @@
|
|
|
1
|
-
/** @import { RequestState, ServerHooks
|
|
1
|
+
/** @import { InternalRequestOptions, RequestState, ServerHooks } from 'types' */
|
|
2
2
|
import { record_span } from '../telemetry/record_span.js';
|
|
3
3
|
|
|
4
|
-
/**
|
|
5
|
-
|
|
6
|
-
* @param {ServerHooks} hooks
|
|
7
|
-
* @returns {RequestState}
|
|
8
|
-
*/
|
|
9
|
-
export function create_request_state(state, hooks) {
|
|
10
|
-
// Request state is rebuilt fresh, resetting remote caches and context flags.
|
|
4
|
+
/** Per-request caches and context flags — never carried into a fork. */
|
|
5
|
+
function transient_fields() {
|
|
11
6
|
return {
|
|
12
|
-
prerendering: state.prerendering,
|
|
13
|
-
transport: hooks.transport,
|
|
14
|
-
handleValidationError: hooks.handleValidationError,
|
|
15
|
-
tracing: {
|
|
16
|
-
record_span
|
|
17
|
-
},
|
|
18
7
|
remote: {
|
|
19
8
|
data: null,
|
|
20
9
|
explicit: null,
|
|
@@ -29,15 +18,43 @@ export function create_request_state(state, hooks) {
|
|
|
29
18
|
is_in_remote_query: false,
|
|
30
19
|
is_in_remote_prerender: false,
|
|
31
20
|
is_in_render: false,
|
|
32
|
-
|
|
21
|
+
original_event: undefined
|
|
33
22
|
};
|
|
34
23
|
}
|
|
35
24
|
|
|
36
25
|
/**
|
|
37
|
-
* @param {
|
|
38
|
-
* @
|
|
26
|
+
* @param {InternalRequestOptions} options
|
|
27
|
+
* @param {ServerHooks} hooks
|
|
28
|
+
* @returns {RequestState}
|
|
29
|
+
*/
|
|
30
|
+
export function create_request_state(options, hooks) {
|
|
31
|
+
// every field is initialized up front so the object shape stays stable
|
|
32
|
+
return {
|
|
33
|
+
getClientAddress: options.getClientAddress,
|
|
34
|
+
platform: options.platform,
|
|
35
|
+
read: options.read,
|
|
36
|
+
before_handle: options.before_handle,
|
|
37
|
+
emulator: options.emulator,
|
|
38
|
+
prerendering: options.prerendering,
|
|
39
|
+
prerender_default: undefined,
|
|
40
|
+
error: false,
|
|
41
|
+
depth: 0,
|
|
42
|
+
handleValidationError: hooks.handleValidationError,
|
|
43
|
+
tracing: {
|
|
44
|
+
record_span
|
|
45
|
+
},
|
|
46
|
+
...transient_fields()
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* @param {RequestState} state
|
|
52
|
+
* @returns {RequestState}
|
|
39
53
|
*/
|
|
40
54
|
export function fork_state_for_subrequest(state) {
|
|
41
|
-
|
|
42
|
-
|
|
55
|
+
return {
|
|
56
|
+
...state,
|
|
57
|
+
...transient_fields(),
|
|
58
|
+
depth: state.depth + 1
|
|
59
|
+
};
|
|
43
60
|
}
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
/** @import { ServerHooks } from 'types' */
|
|
2
|
-
import * as devalue from 'devalue';
|
|
3
1
|
import { text } from '@sveltejs/kit';
|
|
4
2
|
import { ENDPOINT_METHODS } from '../../constants.js';
|
|
5
3
|
|
|
@@ -139,21 +137,3 @@ export function get_node_type(node_id) {
|
|
|
139
137
|
export function count_non_ssi_comments(str) {
|
|
140
138
|
return (str.match(/<!--(?!#)/g) ?? []).length;
|
|
141
139
|
}
|
|
142
|
-
|
|
143
|
-
/**
|
|
144
|
-
* Creates a serialiser for non-arbitrary POJOs using the app's transport hook
|
|
145
|
-
* @param {ServerHooks['transport']} transport
|
|
146
|
-
* @returns {(thing: unknown) => string | undefined}
|
|
147
|
-
*/
|
|
148
|
-
export function create_replacer(transport) {
|
|
149
|
-
/** @param {unknown} thing */
|
|
150
|
-
const replacer = (thing) => {
|
|
151
|
-
for (const key in transport) {
|
|
152
|
-
const encoded = transport[key].encode(thing);
|
|
153
|
-
if (encoded) {
|
|
154
|
-
return `app.decode('${key}', ${devalue.uneval(encoded, replacer)})`;
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
};
|
|
158
|
-
return replacer;
|
|
159
|
-
}
|