|
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