|
1 | 1 | import { DEV } from 'esm-env';
|
| 2 | +import * as devalue from 'devalue'; |
2 | 3 | import { disable_search, make_trackable } from '../../../utils/url.js';
|
3 | 4 | import { validate_depends, validate_load_response } from '../../shared.js';
|
4 | 5 | import { with_request_store, merge_tracing } from '@sveltejs/kit/internal/server';
|
5 | 6 | import { record_span } from '../../telemetry/record_span.js';
|
6 |
| -import { get_node_type } from '../utils.js'; |
| 7 | +import { clarify_devalue_error, get_node_type } from '../utils.js'; |
7 | 8 | import { base64_encode, text_decoder } from '../../utils.js';
|
8 | 9 |
|
9 | 10 | /**
|
@@ -232,20 +233,47 @@ export async function load_data({
|
232 | 233 | },
|
233 | 234 | fn: async (current) => {
|
234 | 235 | const traced_event = merge_tracing(event, current);
|
235 |
| - return await with_request_store({ event: traced_event, state: event_state }, () => |
236 |
| - load.call(null, { |
| 236 | + return await with_request_store({ event: traced_event, state: event_state }, () => { |
| 237 | + /** @type {Record<string, any> | null} */ |
| 238 | + let data = null; |
| 239 | + |
| 240 | + return load.call(null, { |
237 | 241 | url: event.url,
|
238 | 242 | params: event.params,
|
239 |
| - data: server_data_node?.data ?? null, |
| 243 | + get data() { |
| 244 | + if (data === null && server_data_node?.data != null) { |
| 245 | + /** @type {Record<string, (value: any) => any>} */ |
| 246 | + const reducers = {}; |
| 247 | + |
| 248 | + /** @type {Record<string, (value: any) => any>} */ |
| 249 | + const revivers = {}; |
| 250 | + |
| 251 | + for (const key in event_state.transport) { |
| 252 | + reducers[key] = event_state.transport[key].encode; |
| 253 | + revivers[key] = event_state.transport[key].decode; |
| 254 | + } |
| 255 | + |
| 256 | + // run it through devalue so that the developer can't accidentally mutate it |
| 257 | + try { |
| 258 | + data = devalue.parse(devalue.stringify(server_data_node.data, reducers), revivers); |
| 259 | + } catch (e) { |
| 260 | + // @ts-expect-error |
| 261 | + e.path = e.path.slice(1); |
| 262 | + throw new Error(clarify_devalue_error(event, /** @type {any} */ (e))); |
| 263 | + } |
| 264 | + } |
| 265 | + |
| 266 | + return data; |
| 267 | + }, |
240 | 268 | route: event.route,
|
241 | 269 | fetch: create_universal_fetch(event, state, fetched, csr, resolve_opts),
|
242 | 270 | setHeaders: event.setHeaders,
|
243 | 271 | depends: () => {},
|
244 | 272 | parent,
|
245 | 273 | untrack: (fn) => fn(),
|
246 | 274 | tracing: traced_event.tracing
|
247 |
| - }) |
248 |
| - ); |
| 275 | + }); |
| 276 | + }); |
249 | 277 | }
|
250 | 278 | });
|
251 | 279 |
|
|
0 commit comments