@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.
Files changed (38) hide show
  1. package/package.json +12 -1
  2. package/src/core/adapt/builder.js +122 -13
  3. package/src/core/config/options.js +6 -0
  4. package/src/exports/hooks/sequence.js +53 -31
  5. package/src/{runtime/app/server → exports/internal}/event.js +24 -9
  6. package/src/exports/internal/server.js +22 -0
  7. package/src/exports/public.d.ts +117 -5
  8. package/src/exports/vite/dev/index.js +8 -0
  9. package/src/exports/vite/index.js +30 -3
  10. package/src/exports/vite/utils.js +44 -0
  11. package/src/runtime/app/server/index.js +1 -1
  12. package/src/runtime/app/server/remote/command.js +4 -5
  13. package/src/runtime/app/server/remote/form.js +5 -7
  14. package/src/runtime/app/server/remote/prerender.js +5 -7
  15. package/src/runtime/app/server/remote/query.js +6 -8
  16. package/src/runtime/app/server/remote/shared.js +9 -13
  17. package/src/runtime/client/client.js +9 -14
  18. package/src/runtime/server/data/index.js +10 -5
  19. package/src/runtime/server/endpoint.js +4 -3
  20. package/src/runtime/server/page/actions.js +55 -24
  21. package/src/runtime/server/page/index.js +22 -5
  22. package/src/runtime/server/page/load_data.js +131 -121
  23. package/src/runtime/server/page/render.js +15 -7
  24. package/src/runtime/server/page/respond_with_error.js +7 -2
  25. package/src/runtime/server/remote.js +59 -13
  26. package/src/runtime/server/respond.js +110 -34
  27. package/src/runtime/server/utils.js +20 -5
  28. package/src/runtime/shared.js +20 -0
  29. package/src/runtime/telemetry/noop.js +81 -0
  30. package/src/runtime/telemetry/otel.js +21 -0
  31. package/src/runtime/telemetry/record_span.js +65 -0
  32. package/src/types/global-private.d.ts +2 -0
  33. package/src/types/internal.d.ts +28 -0
  34. package/src/types/synthetic/$env+dynamic+private.md +1 -1
  35. package/src/version.js +1 -1
  36. package/types/index.d.ts +117 -4
  37. package/types/index.d.ts.map +2 -2
  38. 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 { with_event } from '../../app/server/event.js';
11
+ import { record_span } from '../../telemetry/record_span.js';
9
12
 
10
- /** @param {import('@sveltejs/kit').RequestEvent} event */
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 {import('@sveltejs/kit').RequestEvent} event
22
- * @param {import('types').SSROptions} options
23
- * @param {import('types').SSRNode['server'] | undefined} server
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(event, options, check_incorrect_fail_use(err))
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 {import('@sveltejs/kit').Redirect} redirect
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 {import('@sveltejs/kit').ActionResult} data
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 {import('@sveltejs/kit').RequestEvent} event
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 {import('@sveltejs/kit').RequestEvent} event
141
- * @param {import('types').SSRNode['server'] | undefined} server
142
- * @returns {Promise<import('@sveltejs/kit').ActionResult>}
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 {import('@sveltejs/kit').Actions} actions
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 {import('@sveltejs/kit').RequestEvent} event
218
- * @param {NonNullable<import('types').ServerNode['actions']>} actions
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 with_event(event, () => action(event));
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 {import('types').ServerHooks['transport']} transport
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 {import('types').ServerHooks['transport']} transport
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(event, page, options, manifest, state, nodes, resolve_opts) {
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 with_event(event, () =>
72
- load.call(null, {
73
- ...event,
74
- fetch: (info, init) => {
75
- const url = new URL(info instanceof Request ? info.url : info, event.url);
76
-
77
- if (DEV && done && !uses.dependencies.has(url.href)) {
78
- console.warn(
79
- `${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`
80
- );
81
- }
82
-
83
- // Note: server fetches are not added to uses.depends due to security concerns
84
- return event.fetch(info, init);
85
- },
86
- /** @param {string[]} deps */
87
- depends: (...deps) => {
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 \`depends(...)\` in a promise handler after \`load(...)\` has returned will not cause the function to re-run when the dependency is invalidated`
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
- if (is_tracking) {
115
- uses.params.add(key);
116
- }
117
- return target[/** @type {string} */ (key)];
118
- }
119
- }),
120
- parent: async () => {
121
- if (DEV && done && !uses.parent) {
122
- console.warn(
123
- `${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`
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
- if (is_tracking) {
128
- uses.parent = true;
129
- }
130
- return parent();
131
- },
132
- route: new Proxy(event.route, {
133
- get: (target, key) => {
134
- if (DEV && done && typeof key === 'string' && !uses.route) {
135
- console.warn(
136
- `${node.server_id}: Accessing \`route.${String(
137
- key
138
- )}\` in a promise handler after \`load(...)\` has returned will not cause the function to re-run when the route changes`
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
- if (is_tracking) {
143
- uses.route = true;
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
- // We're adding getRequestEvent context to the universal load function
207
- // in order to be able to use remote calls within it.
208
- const result = await with_event(event, () =>
209
- load.call(null, {
210
- url: event.url,
211
- params: event.params,
212
- data: server_data_node?.data ?? null,
213
- route: event.route,
214
- fetch: create_universal_fetch(event, state, fetched, csr, resolve_opts),
215
- setHeaders: event.setHeaders,
216
- depends: () => {},
217
- parent,
218
- untrack: (fn) => fn()
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
- }