@sveltejs/kit 2.30.1 → 2.31.0
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 +12 -1
- package/src/core/adapt/builder.js +122 -13
- package/src/core/config/options.js +6 -0
- package/src/exports/hooks/sequence.js +53 -31
- package/src/{runtime/app/server → exports/internal}/event.js +24 -9
- package/src/exports/internal/server.js +22 -0
- package/src/exports/public.d.ts +117 -5
- package/src/exports/vite/dev/index.js +8 -0
- package/src/exports/vite/index.js +30 -3
- package/src/exports/vite/utils.js +44 -0
- package/src/runtime/app/server/index.js +1 -1
- package/src/runtime/app/server/remote/command.js +4 -5
- package/src/runtime/app/server/remote/form.js +5 -7
- package/src/runtime/app/server/remote/prerender.js +5 -7
- package/src/runtime/app/server/remote/query.js +6 -8
- package/src/runtime/app/server/remote/shared.js +9 -13
- package/src/runtime/client/client.js +9 -14
- package/src/runtime/server/data/index.js +10 -5
- package/src/runtime/server/endpoint.js +4 -3
- package/src/runtime/server/page/actions.js +55 -24
- package/src/runtime/server/page/index.js +22 -5
- package/src/runtime/server/page/load_data.js +131 -121
- package/src/runtime/server/page/render.js +15 -7
- package/src/runtime/server/page/respond_with_error.js +7 -2
- package/src/runtime/server/remote.js +59 -13
- package/src/runtime/server/respond.js +110 -34
- package/src/runtime/server/utils.js +20 -5
- package/src/runtime/shared.js +20 -0
- package/src/runtime/telemetry/noop.js +81 -0
- package/src/runtime/telemetry/otel.js +21 -0
- package/src/runtime/telemetry/record_span.js +65 -0
- package/src/types/global-private.d.ts +2 -0
- package/src/types/internal.d.ts +28 -0
- package/src/types/synthetic/$env+dynamic+private.md +1 -1
- package/src/version.js +1 -1
- package/types/index.d.ts +117 -4
- package/types/index.d.ts.map +2 -2
- package/src/runtime/server/event-state.js +0 -40
|
@@ -1,13 +1,16 @@
|
|
|
1
|
+
/** @import { RequestEvent, ActionResult, Actions } from '@sveltejs/kit' */
|
|
2
|
+
/** @import { SSROptions, SSRNode, ServerNode, ServerHooks } from 'types' */
|
|
1
3
|
import * as devalue from 'devalue';
|
|
2
4
|
import { DEV } from 'esm-env';
|
|
3
5
|
import { json } from '@sveltejs/kit';
|
|
4
6
|
import { HttpError, Redirect, ActionFailure, SvelteKitError } from '@sveltejs/kit/internal';
|
|
7
|
+
import { with_request_store, merge_tracing } from '@sveltejs/kit/internal/server';
|
|
5
8
|
import { get_status, normalize_error } from '../../../utils/error.js';
|
|
6
9
|
import { is_form_content_type, negotiate } from '../../../utils/http.js';
|
|
7
10
|
import { handle_error_and_jsonify } from '../utils.js';
|
|
8
|
-
import {
|
|
11
|
+
import { record_span } from '../../telemetry/record_span.js';
|
|
9
12
|
|
|
10
|
-
/** @param {
|
|
13
|
+
/** @param {RequestEvent} event */
|
|
11
14
|
export function is_action_json_request(event) {
|
|
12
15
|
const accept = negotiate(event.request.headers.get('accept') ?? '*/*', [
|
|
13
16
|
'application/json',
|
|
@@ -18,11 +21,12 @@ export function is_action_json_request(event) {
|
|
|
18
21
|
}
|
|
19
22
|
|
|
20
23
|
/**
|
|
21
|
-
* @param {
|
|
22
|
-
* @param {import('types').
|
|
23
|
-
* @param {
|
|
24
|
+
* @param {RequestEvent} event
|
|
25
|
+
* @param {import('types').RequestState} event_state
|
|
26
|
+
* @param {SSROptions} options
|
|
27
|
+
* @param {SSRNode['server'] | undefined} server
|
|
24
28
|
*/
|
|
25
|
-
export async function handle_action_json_request(event, options, server) {
|
|
29
|
+
export async function handle_action_json_request(event, event_state, options, server) {
|
|
26
30
|
const actions = server?.actions;
|
|
27
31
|
|
|
28
32
|
if (!actions) {
|
|
@@ -35,7 +39,7 @@ export async function handle_action_json_request(event, options, server) {
|
|
|
35
39
|
return action_json(
|
|
36
40
|
{
|
|
37
41
|
type: 'error',
|
|
38
|
-
error: await handle_error_and_jsonify(event, options, no_actions_error)
|
|
42
|
+
error: await handle_error_and_jsonify(event, event_state, options, no_actions_error)
|
|
39
43
|
},
|
|
40
44
|
{
|
|
41
45
|
status: no_actions_error.status,
|
|
@@ -51,7 +55,7 @@ export async function handle_action_json_request(event, options, server) {
|
|
|
51
55
|
check_named_default_separate(actions);
|
|
52
56
|
|
|
53
57
|
try {
|
|
54
|
-
const data = await call_action(event, actions);
|
|
58
|
+
const data = await call_action(event, event_state, actions);
|
|
55
59
|
|
|
56
60
|
if (__SVELTEKIT_DEV__) {
|
|
57
61
|
validate_action_return(data);
|
|
@@ -92,7 +96,12 @@ export async function handle_action_json_request(event, options, server) {
|
|
|
92
96
|
return action_json(
|
|
93
97
|
{
|
|
94
98
|
type: 'error',
|
|
95
|
-
error: await handle_error_and_jsonify(
|
|
99
|
+
error: await handle_error_and_jsonify(
|
|
100
|
+
event,
|
|
101
|
+
event_state,
|
|
102
|
+
options,
|
|
103
|
+
check_incorrect_fail_use(err)
|
|
104
|
+
)
|
|
96
105
|
},
|
|
97
106
|
{
|
|
98
107
|
status: get_status(err)
|
|
@@ -111,7 +120,7 @@ export function check_incorrect_fail_use(error) {
|
|
|
111
120
|
}
|
|
112
121
|
|
|
113
122
|
/**
|
|
114
|
-
* @param {
|
|
123
|
+
* @param {Redirect} redirect
|
|
115
124
|
*/
|
|
116
125
|
export function action_json_redirect(redirect) {
|
|
117
126
|
return action_json({
|
|
@@ -122,7 +131,7 @@ export function action_json_redirect(redirect) {
|
|
|
122
131
|
}
|
|
123
132
|
|
|
124
133
|
/**
|
|
125
|
-
* @param {
|
|
134
|
+
* @param {ActionResult} data
|
|
126
135
|
* @param {ResponseInit} [init]
|
|
127
136
|
*/
|
|
128
137
|
function action_json(data, init) {
|
|
@@ -130,18 +139,19 @@ function action_json(data, init) {
|
|
|
130
139
|
}
|
|
131
140
|
|
|
132
141
|
/**
|
|
133
|
-
* @param {
|
|
142
|
+
* @param {RequestEvent} event
|
|
134
143
|
*/
|
|
135
144
|
export function is_action_request(event) {
|
|
136
145
|
return event.request.method === 'POST';
|
|
137
146
|
}
|
|
138
147
|
|
|
139
148
|
/**
|
|
140
|
-
* @param {
|
|
141
|
-
* @param {import('types').
|
|
142
|
-
* @
|
|
149
|
+
* @param {RequestEvent} event
|
|
150
|
+
* @param {import('types').RequestState} event_state
|
|
151
|
+
* @param {SSRNode['server'] | undefined} server
|
|
152
|
+
* @returns {Promise<ActionResult>}
|
|
143
153
|
*/
|
|
144
|
-
export async function handle_action_request(event, server) {
|
|
154
|
+
export async function handle_action_request(event, event_state, server) {
|
|
145
155
|
const actions = server?.actions;
|
|
146
156
|
|
|
147
157
|
if (!actions) {
|
|
@@ -164,7 +174,7 @@ export async function handle_action_request(event, server) {
|
|
|
164
174
|
check_named_default_separate(actions);
|
|
165
175
|
|
|
166
176
|
try {
|
|
167
|
-
const data = await call_action(event, actions);
|
|
177
|
+
const data = await call_action(event, event_state, actions);
|
|
168
178
|
|
|
169
179
|
if (__SVELTEKIT_DEV__) {
|
|
170
180
|
validate_action_return(data);
|
|
@@ -203,7 +213,7 @@ export async function handle_action_request(event, server) {
|
|
|
203
213
|
}
|
|
204
214
|
|
|
205
215
|
/**
|
|
206
|
-
* @param {
|
|
216
|
+
* @param {Actions} actions
|
|
207
217
|
*/
|
|
208
218
|
function check_named_default_separate(actions) {
|
|
209
219
|
if (actions.default && Object.keys(actions).length > 1) {
|
|
@@ -214,11 +224,12 @@ function check_named_default_separate(actions) {
|
|
|
214
224
|
}
|
|
215
225
|
|
|
216
226
|
/**
|
|
217
|
-
* @param {
|
|
218
|
-
* @param {
|
|
227
|
+
* @param {RequestEvent} event
|
|
228
|
+
* @param {import('types').RequestState} event_state
|
|
229
|
+
* @param {NonNullable<ServerNode['actions']>} actions
|
|
219
230
|
* @throws {Redirect | HttpError | SvelteKitError | Error}
|
|
220
231
|
*/
|
|
221
|
-
async function call_action(event, actions) {
|
|
232
|
+
async function call_action(event, event_state, actions) {
|
|
222
233
|
const url = new URL(event.request.url);
|
|
223
234
|
|
|
224
235
|
let name = 'default';
|
|
@@ -247,7 +258,27 @@ async function call_action(event, actions) {
|
|
|
247
258
|
);
|
|
248
259
|
}
|
|
249
260
|
|
|
250
|
-
return
|
|
261
|
+
return record_span({
|
|
262
|
+
name: 'sveltekit.form_action',
|
|
263
|
+
attributes: {
|
|
264
|
+
'sveltekit.form_action.name': name,
|
|
265
|
+
'http.route': event.route.id || 'unknown'
|
|
266
|
+
},
|
|
267
|
+
fn: async (current) => {
|
|
268
|
+
const traced_event = merge_tracing(event, current);
|
|
269
|
+
const result = await with_request_store({ event: traced_event, state: event_state }, () =>
|
|
270
|
+
action(traced_event)
|
|
271
|
+
);
|
|
272
|
+
if (result instanceof ActionFailure) {
|
|
273
|
+
current.setAttributes({
|
|
274
|
+
'sveltekit.form_action.result.type': 'failure',
|
|
275
|
+
'sveltekit.form_action.result.status': result.status
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
return result;
|
|
280
|
+
}
|
|
281
|
+
});
|
|
251
282
|
}
|
|
252
283
|
|
|
253
284
|
/** @param {any} data */
|
|
@@ -265,7 +296,7 @@ function validate_action_return(data) {
|
|
|
265
296
|
* Try to `devalue.uneval` the data object, and if it fails, return a proper Error with context
|
|
266
297
|
* @param {any} data
|
|
267
298
|
* @param {string} route_id
|
|
268
|
-
* @param {
|
|
299
|
+
* @param {ServerHooks['transport']} transport
|
|
269
300
|
*/
|
|
270
301
|
export function uneval_action_response(data, route_id, transport) {
|
|
271
302
|
const replacer = (/** @type {any} */ thing) => {
|
|
@@ -284,7 +315,7 @@ export function uneval_action_response(data, route_id, transport) {
|
|
|
284
315
|
* Try to `devalue.stringify` the data object, and if it fails, return a proper Error with context
|
|
285
316
|
* @param {any} data
|
|
286
317
|
* @param {string} route_id
|
|
287
|
-
* @param {
|
|
318
|
+
* @param {ServerHooks['transport']} transport
|
|
288
319
|
*/
|
|
289
320
|
function stringify_action_response(data, route_id, transport) {
|
|
290
321
|
const encoders = Object.fromEntries(
|
|
@@ -25,6 +25,7 @@ const MAX_DEPTH = 10;
|
|
|
25
25
|
|
|
26
26
|
/**
|
|
27
27
|
* @param {import('@sveltejs/kit').RequestEvent} event
|
|
28
|
+
* @param {import('types').RequestState} event_state
|
|
28
29
|
* @param {import('types').PageNodeIndexes} page
|
|
29
30
|
* @param {import('types').SSROptions} options
|
|
30
31
|
* @param {import('@sveltejs/kit').SSRManifest} manifest
|
|
@@ -33,7 +34,16 @@ const MAX_DEPTH = 10;
|
|
|
33
34
|
* @param {import('types').RequiredResolveOptions} resolve_opts
|
|
34
35
|
* @returns {Promise<Response>}
|
|
35
36
|
*/
|
|
36
|
-
export async function render_page(
|
|
37
|
+
export async function render_page(
|
|
38
|
+
event,
|
|
39
|
+
event_state,
|
|
40
|
+
page,
|
|
41
|
+
options,
|
|
42
|
+
manifest,
|
|
43
|
+
state,
|
|
44
|
+
nodes,
|
|
45
|
+
resolve_opts
|
|
46
|
+
) {
|
|
37
47
|
if (state.depth > MAX_DEPTH) {
|
|
38
48
|
// infinite request cycle detected
|
|
39
49
|
return text(`Not found: ${event.url.pathname}`, {
|
|
@@ -43,7 +53,7 @@ export async function render_page(event, page, options, manifest, state, nodes,
|
|
|
43
53
|
|
|
44
54
|
if (is_action_json_request(event)) {
|
|
45
55
|
const node = await manifest._.nodes[page.leaf]();
|
|
46
|
-
return handle_action_json_request(event, options, node?.server);
|
|
56
|
+
return handle_action_json_request(event, event_state, options, node?.server);
|
|
47
57
|
}
|
|
48
58
|
|
|
49
59
|
try {
|
|
@@ -57,11 +67,11 @@ export async function render_page(event, page, options, manifest, state, nodes,
|
|
|
57
67
|
if (is_action_request(event)) {
|
|
58
68
|
const remote_id = get_remote_action(event.url);
|
|
59
69
|
if (remote_id) {
|
|
60
|
-
action_result = await handle_remote_form_post(event, manifest, remote_id);
|
|
70
|
+
action_result = await handle_remote_form_post(event, event_state, manifest, remote_id);
|
|
61
71
|
} else {
|
|
62
72
|
// for action requests, first call handler in +page.server.js
|
|
63
73
|
// (this also determines status code)
|
|
64
|
-
action_result = await handle_action_request(event, leaf_node.server);
|
|
74
|
+
action_result = await handle_action_request(event, event_state, leaf_node.server);
|
|
65
75
|
}
|
|
66
76
|
|
|
67
77
|
if (action_result?.type === 'redirect') {
|
|
@@ -133,6 +143,7 @@ export async function render_page(event, page, options, manifest, state, nodes,
|
|
|
133
143
|
status,
|
|
134
144
|
error: null,
|
|
135
145
|
event,
|
|
146
|
+
event_state,
|
|
136
147
|
options,
|
|
137
148
|
manifest,
|
|
138
149
|
state,
|
|
@@ -163,6 +174,7 @@ export async function render_page(event, page, options, manifest, state, nodes,
|
|
|
163
174
|
|
|
164
175
|
return await load_server_data({
|
|
165
176
|
event,
|
|
177
|
+
event_state,
|
|
166
178
|
state,
|
|
167
179
|
node,
|
|
168
180
|
parent: async () => {
|
|
@@ -189,6 +201,7 @@ export async function render_page(event, page, options, manifest, state, nodes,
|
|
|
189
201
|
try {
|
|
190
202
|
return await load_data({
|
|
191
203
|
event,
|
|
204
|
+
event_state,
|
|
192
205
|
fetched,
|
|
193
206
|
node,
|
|
194
207
|
parent: async () => {
|
|
@@ -243,7 +256,7 @@ export async function render_page(event, page, options, manifest, state, nodes,
|
|
|
243
256
|
}
|
|
244
257
|
|
|
245
258
|
const status = get_status(err);
|
|
246
|
-
const error = await handle_error_and_jsonify(event, options, err);
|
|
259
|
+
const error = await handle_error_and_jsonify(event, event_state, options, err);
|
|
247
260
|
|
|
248
261
|
while (i--) {
|
|
249
262
|
if (page.errors[i]) {
|
|
@@ -258,6 +271,7 @@ export async function render_page(event, page, options, manifest, state, nodes,
|
|
|
258
271
|
|
|
259
272
|
return await render_response({
|
|
260
273
|
event,
|
|
274
|
+
event_state,
|
|
261
275
|
options,
|
|
262
276
|
manifest,
|
|
263
277
|
state,
|
|
@@ -293,6 +307,7 @@ export async function render_page(event, page, options, manifest, state, nodes,
|
|
|
293
307
|
// ndjson format
|
|
294
308
|
let { data, chunks } = get_data_json(
|
|
295
309
|
event,
|
|
310
|
+
event_state,
|
|
296
311
|
options,
|
|
297
312
|
branch.map((node) => node?.server_data)
|
|
298
313
|
);
|
|
@@ -311,6 +326,7 @@ export async function render_page(event, page, options, manifest, state, nodes,
|
|
|
311
326
|
|
|
312
327
|
return await render_response({
|
|
313
328
|
event,
|
|
329
|
+
event_state,
|
|
314
330
|
options,
|
|
315
331
|
manifest,
|
|
316
332
|
state,
|
|
@@ -330,6 +346,7 @@ export async function render_page(event, page, options, manifest, state, nodes,
|
|
|
330
346
|
// but the page failed to render, or that a prerendering error occurred
|
|
331
347
|
return await respond_with_error({
|
|
332
348
|
event,
|
|
349
|
+
event_state,
|
|
333
350
|
options,
|
|
334
351
|
manifest,
|
|
335
352
|
state,
|
|
@@ -1,20 +1,23 @@
|
|
|
1
1
|
import { DEV } from 'esm-env';
|
|
2
2
|
import { disable_search, make_trackable } from '../../../utils/url.js';
|
|
3
|
-
import { validate_depends } from '../../shared.js';
|
|
3
|
+
import { validate_depends, validate_load_response } from '../../shared.js';
|
|
4
|
+
import { with_request_store, merge_tracing } from '@sveltejs/kit/internal/server';
|
|
5
|
+
import { record_span } from '../../telemetry/record_span.js';
|
|
6
|
+
import { get_node_type } from '../utils.js';
|
|
4
7
|
import { base64_encode, text_decoder } from '../../utils.js';
|
|
5
|
-
import { with_event } from '../../app/server/event.js';
|
|
6
8
|
|
|
7
9
|
/**
|
|
8
10
|
* Calls the user's server `load` function.
|
|
9
11
|
* @param {{
|
|
10
12
|
* event: import('@sveltejs/kit').RequestEvent;
|
|
13
|
+
* event_state: import('types').RequestState;
|
|
11
14
|
* state: import('types').SSRState;
|
|
12
15
|
* node: import('types').SSRNode | undefined;
|
|
13
16
|
* parent: () => Promise<Record<string, any>>;
|
|
14
17
|
* }} opts
|
|
15
18
|
* @returns {Promise<import('types').ServerDataNode | null>}
|
|
16
19
|
*/
|
|
17
|
-
export async function load_server_data({ event, state, node, parent }) {
|
|
20
|
+
export async function load_server_data({ event, event_state, state, node, parent }) {
|
|
18
21
|
if (!node?.server) return null;
|
|
19
22
|
|
|
20
23
|
let is_tracking = true;
|
|
@@ -68,97 +71,111 @@ export async function load_server_data({ event, state, node, parent }) {
|
|
|
68
71
|
|
|
69
72
|
let done = false;
|
|
70
73
|
|
|
71
|
-
const result = await
|
|
72
|
-
load
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
for (const dep of deps) {
|
|
89
|
-
const { href } = new URL(dep, event.url);
|
|
90
|
-
|
|
91
|
-
if (DEV) {
|
|
92
|
-
validate_depends(node.server_id || 'missing route ID', dep);
|
|
93
|
-
|
|
94
|
-
if (done && !uses.dependencies.has(href)) {
|
|
74
|
+
const result = await record_span({
|
|
75
|
+
name: 'sveltekit.load',
|
|
76
|
+
attributes: {
|
|
77
|
+
'sveltekit.load.node_id': node.server_id || 'unknown',
|
|
78
|
+
'sveltekit.load.node_type': get_node_type(node.server_id),
|
|
79
|
+
'sveltekit.load.environment': 'server',
|
|
80
|
+
'http.route': event.route.id || 'unknown'
|
|
81
|
+
},
|
|
82
|
+
fn: async (current) => {
|
|
83
|
+
const traced_event = merge_tracing(event, current);
|
|
84
|
+
const result = await with_request_store({ event: traced_event, state: event_state }, () =>
|
|
85
|
+
load.call(null, {
|
|
86
|
+
...traced_event,
|
|
87
|
+
fetch: (info, init) => {
|
|
88
|
+
const url = new URL(info instanceof Request ? info.url : info, event.url);
|
|
89
|
+
|
|
90
|
+
if (DEV && done && !uses.dependencies.has(url.href)) {
|
|
95
91
|
console.warn(
|
|
96
|
-
`${node.server_id}: Calling \`
|
|
92
|
+
`${node.server_id}: Calling \`event.fetch(...)\` in a promise handler after \`load(...)\` has returned will not cause the function to re-run when the dependency is invalidated`
|
|
97
93
|
);
|
|
98
94
|
}
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
uses.dependencies.add(href);
|
|
102
|
-
}
|
|
103
|
-
},
|
|
104
|
-
params: new Proxy(event.params, {
|
|
105
|
-
get: (target, key) => {
|
|
106
|
-
if (DEV && done && typeof key === 'string' && !uses.params.has(key)) {
|
|
107
|
-
console.warn(
|
|
108
|
-
`${node.server_id}: Accessing \`params.${String(
|
|
109
|
-
key
|
|
110
|
-
)}\` in a promise handler after \`load(...)\` has returned will not cause the function to re-run when the param changes`
|
|
111
|
-
);
|
|
112
|
-
}
|
|
113
95
|
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
96
|
+
// Note: server fetches are not added to uses.depends due to security concerns
|
|
97
|
+
return event.fetch(info, init);
|
|
98
|
+
},
|
|
99
|
+
/** @param {string[]} deps */
|
|
100
|
+
depends: (...deps) => {
|
|
101
|
+
for (const dep of deps) {
|
|
102
|
+
const { href } = new URL(dep, event.url);
|
|
103
|
+
|
|
104
|
+
if (DEV) {
|
|
105
|
+
validate_depends(node.server_id || 'missing route ID', dep);
|
|
106
|
+
|
|
107
|
+
if (done && !uses.dependencies.has(href)) {
|
|
108
|
+
console.warn(
|
|
109
|
+
`${node.server_id}: Calling \`depends(...)\` in a promise handler after \`load(...)\` has returned will not cause the function to re-run when the dependency is invalidated`
|
|
110
|
+
);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
uses.dependencies.add(href);
|
|
115
|
+
}
|
|
116
|
+
},
|
|
117
|
+
params: new Proxy(event.params, {
|
|
118
|
+
get: (target, key) => {
|
|
119
|
+
if (DEV && done && typeof key === 'string' && !uses.params.has(key)) {
|
|
120
|
+
console.warn(
|
|
121
|
+
`${node.server_id}: Accessing \`params.${String(
|
|
122
|
+
key
|
|
123
|
+
)}\` in a promise handler after \`load(...)\` has returned will not cause the function to re-run when the param changes`
|
|
124
|
+
);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
if (is_tracking) {
|
|
128
|
+
uses.params.add(key);
|
|
129
|
+
}
|
|
130
|
+
return target[/** @type {string} */ (key)];
|
|
131
|
+
}
|
|
132
|
+
}),
|
|
133
|
+
parent: async () => {
|
|
134
|
+
if (DEV && done && !uses.parent) {
|
|
135
|
+
console.warn(
|
|
136
|
+
`${node.server_id}: Calling \`parent(...)\` in a promise handler after \`load(...)\` has returned will not cause the function to re-run when parent data changes`
|
|
137
|
+
);
|
|
138
|
+
}
|
|
126
139
|
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
+
if (is_tracking) {
|
|
141
|
+
uses.parent = true;
|
|
142
|
+
}
|
|
143
|
+
return parent();
|
|
144
|
+
},
|
|
145
|
+
route: new Proxy(event.route, {
|
|
146
|
+
get: (target, key) => {
|
|
147
|
+
if (DEV && done && typeof key === 'string' && !uses.route) {
|
|
148
|
+
console.warn(
|
|
149
|
+
`${node.server_id}: Accessing \`route.${String(
|
|
150
|
+
key
|
|
151
|
+
)}\` in a promise handler after \`load(...)\` has returned will not cause the function to re-run when the route changes`
|
|
152
|
+
);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
if (is_tracking) {
|
|
156
|
+
uses.route = true;
|
|
157
|
+
}
|
|
158
|
+
return target[/** @type {'id'} */ (key)];
|
|
159
|
+
}
|
|
160
|
+
}),
|
|
161
|
+
url,
|
|
162
|
+
untrack(fn) {
|
|
163
|
+
is_tracking = false;
|
|
164
|
+
try {
|
|
165
|
+
return fn();
|
|
166
|
+
} finally {
|
|
167
|
+
is_tracking = true;
|
|
168
|
+
}
|
|
140
169
|
}
|
|
170
|
+
})
|
|
171
|
+
);
|
|
141
172
|
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
return target[/** @type {'id'} */ (key)];
|
|
146
|
-
}
|
|
147
|
-
}),
|
|
148
|
-
url,
|
|
149
|
-
untrack(fn) {
|
|
150
|
-
is_tracking = false;
|
|
151
|
-
try {
|
|
152
|
-
return fn();
|
|
153
|
-
} finally {
|
|
154
|
-
is_tracking = true;
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
})
|
|
158
|
-
);
|
|
173
|
+
return result;
|
|
174
|
+
}
|
|
175
|
+
});
|
|
159
176
|
|
|
160
177
|
if (__SVELTEKIT_DEV__) {
|
|
161
|
-
validate_load_response(result, node.server_id);
|
|
178
|
+
validate_load_response(result, `in ${node.server_id}`);
|
|
162
179
|
}
|
|
163
180
|
|
|
164
181
|
done = true;
|
|
@@ -175,6 +192,7 @@ export async function load_server_data({ event, state, node, parent }) {
|
|
|
175
192
|
* Calls the user's `load` function.
|
|
176
193
|
* @param {{
|
|
177
194
|
* event: import('@sveltejs/kit').RequestEvent;
|
|
195
|
+
* event_state: import('types').RequestState;
|
|
178
196
|
* fetched: import('./types.js').Fetched[];
|
|
179
197
|
* node: import('types').SSRNode | undefined;
|
|
180
198
|
* parent: () => Promise<Record<string, any>>;
|
|
@@ -187,6 +205,7 @@ export async function load_server_data({ event, state, node, parent }) {
|
|
|
187
205
|
*/
|
|
188
206
|
export async function load_data({
|
|
189
207
|
event,
|
|
208
|
+
event_state,
|
|
190
209
|
fetched,
|
|
191
210
|
node,
|
|
192
211
|
parent,
|
|
@@ -203,24 +222,35 @@ export async function load_data({
|
|
|
203
222
|
return server_data_node?.data ?? null;
|
|
204
223
|
}
|
|
205
224
|
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
225
|
+
const result = await record_span({
|
|
226
|
+
name: 'sveltekit.load',
|
|
227
|
+
attributes: {
|
|
228
|
+
'sveltekit.load.node_id': node.universal_id || 'unknown',
|
|
229
|
+
'sveltekit.load.node_type': get_node_type(node.universal_id),
|
|
230
|
+
'sveltekit.load.environment': 'server',
|
|
231
|
+
'http.route': event.route.id || 'unknown'
|
|
232
|
+
},
|
|
233
|
+
fn: async (current) => {
|
|
234
|
+
const traced_event = merge_tracing(event, current);
|
|
235
|
+
return await with_request_store({ event: traced_event, state: event_state }, () =>
|
|
236
|
+
load.call(null, {
|
|
237
|
+
url: event.url,
|
|
238
|
+
params: event.params,
|
|
239
|
+
data: server_data_node?.data ?? null,
|
|
240
|
+
route: event.route,
|
|
241
|
+
fetch: create_universal_fetch(event, state, fetched, csr, resolve_opts),
|
|
242
|
+
setHeaders: event.setHeaders,
|
|
243
|
+
depends: () => {},
|
|
244
|
+
parent,
|
|
245
|
+
untrack: (fn) => fn(),
|
|
246
|
+
tracing: traced_event.tracing
|
|
247
|
+
})
|
|
248
|
+
);
|
|
249
|
+
}
|
|
250
|
+
});
|
|
221
251
|
|
|
222
252
|
if (__SVELTEKIT_DEV__) {
|
|
223
|
-
validate_load_response(result, node.universal_id);
|
|
253
|
+
validate_load_response(result, `in ${node.universal_id}`);
|
|
224
254
|
}
|
|
225
255
|
|
|
226
256
|
return result ?? null;
|
|
@@ -405,23 +435,3 @@ async function stream_to_string(stream) {
|
|
|
405
435
|
}
|
|
406
436
|
return result;
|
|
407
437
|
}
|
|
408
|
-
|
|
409
|
-
/**
|
|
410
|
-
* @param {any} data
|
|
411
|
-
* @param {string} [id]
|
|
412
|
-
*/
|
|
413
|
-
function validate_load_response(data, id) {
|
|
414
|
-
if (data != null && Object.getPrototypeOf(data) !== Object.prototype) {
|
|
415
|
-
throw new Error(
|
|
416
|
-
`a load function in ${id} returned ${
|
|
417
|
-
typeof data !== 'object'
|
|
418
|
-
? `a ${typeof data}`
|
|
419
|
-
: data instanceof Response
|
|
420
|
-
? 'a Response object'
|
|
421
|
-
: Array.isArray(data)
|
|
422
|
-
? 'an array'
|
|
423
|
-
: 'a non-plain object'
|
|
424
|
-
}, but must return a plain object at the top level (i.e. \`return {...}\`)`
|
|
425
|
-
);
|
|
426
|
-
}
|
|
427
|
-
}
|