import { a as set_manifest, c as rendered_env, i as read_implementation, n as options, o as set_read_implementation, s as explicit_public_env, t as get_hooks, u as __commonJSMin } from "./chunks/internal.js"; import { _ as stringify, a as split_remote_key, b as once, f as get_status, g as text_encoder, h as get_relative_path, i as parse_remote_arg, m as base64_encode, n as TRAILING_SLASH_PARAM, o as stringify$1, p as normalize_error, r as create_remote_key, t as INVALIDATED_PARAM, y as noop } from "./chunks/shared.js"; import { a as app_dir, c as override, l as reset, o as assets, s as base } from "./chunks/internal2.js"; import { E as PAGE_METHODS, _ as negotiate, a as get_global_name, b as deserialize_binary_form, c as handle_fatal_error, d as redirect_response, f as serialize_uses, g as is_form_content_type, h as s, i as format_server_error, l as has_prerendered_path, m as escape_html, o as get_node_type, p as static_error_page, r as create_replacer, s as handle_error_and_jsonify, t as clarify_devalue_error, u as method_not_allowed, w as ENDPOINT_METHODS } from "./chunks/utils.js"; import { t as uneval } from "./chunks/uneval.js"; import { _ as has_data_suffix, b as strip_resolution_suffix, d as make_trackable, f as normalize_path, g as add_resolution_suffix, h as add_data_suffix, i as validate_page_server_exports, l as decode_pathname, m as noop_span, n as validate_layout_server_exports, o as find_route, p as resolve, r as validate_page_exports, s as hash, t as validate_layout_exports, u as disable_search, v as has_resolution_suffix, x as compact, y as strip_data_suffix } from "./chunks/exports.js"; import { b as writable, y as readable } from "./chunks/async.js"; import { error, isRedirect, json, text } from "@sveltejs/kit"; import { ActionFailure, HttpError, Redirect, SvelteKitError } from "@sveltejs/kit/internal"; import { merge_tracing, with_request_store } from "@sveltejs/kit/internal/server"; //#region ../node_modules/.pnpm/@sveltejs+kit@3.0.0-next.4_@sveltejs+vite-plugin-svelte@7.1.2_svelte@5.56.3_vite@8.0.16_831df308509456bf75377b19fdb5b8d4/node_modules/@sveltejs/kit/src/runtime/server/constants.js var NULL_BODY_STATUS = [ 101, 103, 204, 205, 304 ]; var IN_WEBCONTAINER = !!globalThis.process?.versions?.webcontainer; //#endregion //#region ../node_modules/.pnpm/@sveltejs+kit@3.0.0-next.4_@sveltejs+vite-plugin-svelte@7.1.2_svelte@5.56.3_vite@8.0.16_831df308509456bf75377b19fdb5b8d4/node_modules/@sveltejs/kit/src/runtime/server/endpoint.js /** * @param {import('@sveltejs/kit').RequestEvent} event * @param {import('types').RequestState} event_state * @param {import('types').SSREndpoint} mod * @param {import('types').SSRState} state * @returns {Promise} */ async function render_endpoint(event, event_state, mod, state) { const method = event.request.method; let handler = mod[method] || mod.fallback; if (method === "HEAD" && !mod.HEAD && mod.GET) handler = mod.GET; if (!handler) return method_not_allowed(mod, method); const prerender = mod.prerender ?? state.prerender_default; if (prerender && (mod.POST || mod.PATCH || mod.PUT || mod.DELETE)) throw new Error("Cannot prerender endpoints that have mutative methods"); if (state.prerendering && !state.prerendering.inside_reroute && !prerender) if (state.depth > 0) throw new Error(`${event.route.id} is not prerenderable`); else return new Response(void 0, { status: 204 }); try { const response = await with_request_store({ event, state: event_state }, () => handler(event)); if (!(response instanceof Response)) throw new Error(`Invalid response from route ${event.url.pathname}: handler should return a Response object`); if (state.prerendering && (!state.prerendering.inside_reroute || prerender)) { const cloned = new Response(response.clone().body, { status: response.status, statusText: response.statusText, headers: new Headers(response.headers) }); cloned.headers.set("x-sveltekit-prerender", String(prerender)); if (state.prerendering.inside_reroute && prerender) { cloned.headers.set("x-sveltekit-routeid", encodeURI(event.route.id)); state.prerendering.dependencies.set(event.url.pathname, { response: cloned, body: null }); } else return cloned; } return response; } catch (e) { if (e instanceof Redirect) return new Response(void 0, { status: e.status, headers: { location: e.location } }); throw e; } } /** * @param {import('@sveltejs/kit').RequestEvent} event */ function is_endpoint_request(event) { const { method, headers } = event.request; if (ENDPOINT_METHODS.includes(method) && !PAGE_METHODS.includes(method)) return true; if (method === "POST" && headers.get("x-sveltekit-action") === "true") return false; return negotiate(event.request.headers.get("accept") ?? "*/*", ["*", "text/html"]) !== "text/html"; } //#endregion //#region ../node_modules/.pnpm/@sveltejs+kit@3.0.0-next.4_@sveltejs+vite-plugin-svelte@7.1.2_svelte@5.56.3_vite@8.0.16_831df308509456bf75377b19fdb5b8d4/node_modules/@sveltejs/kit/src/runtime/telemetry/record_span.js /** @import { RecordSpan } from 'types' */ /** @type {RecordSpan} */ async function record_span({ name, attributes, fn }) { return fn(noop_span); } //#endregion //#region ../node_modules/.pnpm/@sveltejs+kit@3.0.0-next.4_@sveltejs+vite-plugin-svelte@7.1.2_svelte@5.56.3_vite@8.0.16_831df308509456bf75377b19fdb5b8d4/node_modules/@sveltejs/kit/src/runtime/server/page/actions.js /** @import { RequestEvent, ActionResult, Actions } from '@sveltejs/kit' */ /** @import { SSROptions, SSRNode, ServerNode, ServerHooks } from 'types' */ /** @param {RequestEvent} event */ function is_action_json_request(event) { return negotiate(event.request.headers.get("accept") ?? "*/*", ["application/json", "text/html"]) === "application/json" && event.request.method === "POST"; } /** * @param {RequestEvent} event * @param {import('types').RequestState} event_state * @param {SSROptions} options * @param {SSRNode['server'] | undefined} server */ async function handle_action_json_request(event, event_state, options, server) { const actions = server?.actions; if (!actions) { const no_actions_error = new SvelteKitError(405, "Method Not Allowed", `POST method not allowed. No form actions exist for this page`); return action_json({ type: "error", error: await handle_error_and_jsonify(event, event_state, options, no_actions_error) }, { status: no_actions_error.status, headers: { allow: "GET" } }); } check_named_default_separate(actions); try { const data = await call_action(event, event_state, actions); if (data instanceof ActionFailure) return action_json({ type: "failure", status: data.status, data: stringify_action_response(data.data, event.route.id, options.hooks.transport) }); else return action_json({ type: "success", status: data ? 200 : 204, data: stringify_action_response(data, event.route.id, options.hooks.transport) }); } catch (e) { const err = normalize_error(e); if (err instanceof Redirect) return action_json_redirect(err); return action_json({ type: "error", error: await handle_error_and_jsonify(event, event_state, options, check_incorrect_fail_use(err)) }, { status: get_status(err) }); } } /** * @param {HttpError | Error} error */ function check_incorrect_fail_use(error) { return error instanceof ActionFailure ? /* @__PURE__ */ new Error("Cannot \"throw fail()\". Use \"return fail()\"") : error; } /** * @param {Redirect} redirect */ function action_json_redirect(redirect) { return action_json({ type: "redirect", status: redirect.status, location: redirect.location }); } /** * @param {ActionResult} data * @param {ResponseInit} [init] */ function action_json(data, init) { return json(data, init); } /** * @param {RequestEvent} event */ function is_action_request(event) { return event.request.method === "POST"; } /** * @param {RequestEvent} event * @param {import('types').RequestState} event_state * @param {SSRNode['server'] | undefined} server * @returns {Promise} */ async function handle_action_request(event, event_state, server) { const actions = server?.actions; if (!actions) { event.setHeaders({ allow: "GET" }); return { type: "error", error: new SvelteKitError(405, "Method Not Allowed", `POST method not allowed. No form actions exist for this page`) }; } check_named_default_separate(actions); try { const data = await call_action(event, event_state, actions); if (data instanceof ActionFailure) return { type: "failure", status: data.status, data: data.data }; else return { type: "success", status: 200, data }; } catch (e) { const err = normalize_error(e); if (err instanceof Redirect) return { type: "redirect", status: err.status, location: err.location }; return { type: "error", error: check_incorrect_fail_use(err) }; } } /** * @param {Actions} actions */ function check_named_default_separate(actions) { if (actions.default && Object.keys(actions).length > 1) throw new Error("When using named actions, the default action cannot be used. See the docs for more info: https://svelte.dev/docs/kit/form-actions#named-actions"); } /** * @param {RequestEvent} event * @param {import('types').RequestState} event_state * @param {NonNullable} actions * @throws {Redirect | HttpError | SvelteKitError | Error} */ async function call_action(event, event_state, actions) { const url = new URL(event.request.url); let name = "default"; for (const param of url.searchParams) if (param[0].startsWith("/")) { name = param[0].slice(1); if (name === "default") throw new Error("Cannot use reserved action name \"default\""); break; } const action = actions[name]; if (!action) throw new SvelteKitError(404, "Not Found", `No action with name '${name}' found`); if (!is_form_content_type(event.request)) throw new SvelteKitError(415, "Unsupported Media Type", `Form actions expect form-encoded data — received ${event.request.headers.get("content-type")}`); return record_span({ name: "sveltekit.form_action", attributes: { "sveltekit.form_action.name": name, "http.route": event.route.id || "unknown" }, fn: async (current) => { const traced_event = merge_tracing(event, current); const result = await with_request_store({ event: traced_event, state: event_state }, () => action(traced_event)); if (result instanceof ActionFailure) current.setAttributes({ "sveltekit.form_action.result.type": "failure", "sveltekit.form_action.result.status": result.status }); return result; } }); } /** * Try to `devalue.uneval` the data object, and if it fails, return a proper Error with context * @param {any} data * @param {string} route_id * @param {ServerHooks['transport']} transport */ function uneval_action_response(data, route_id, transport) { const replacer = create_replacer(transport); return try_serialize(data, (value) => uneval(value, replacer), route_id); } /** * Try to `devalue.stringify` the data object, and if it fails, return a proper Error with context * @param {any} data * @param {string} route_id * @param {ServerHooks['transport']} transport */ function stringify_action_response(data, route_id, transport) { const encoders = Object.fromEntries(Object.entries(transport).map(([key, value]) => [key, value.encode])); return try_serialize(data, (value) => stringify(value, encoders), route_id); } /** * @param {any} data * @param {(data: any) => string} fn * @param {string} route_id */ function try_serialize(data, fn, route_id) { try { return fn(data); } catch (e) { const error = e; if (data instanceof Response) throw new Error(`Data returned from action inside ${route_id} is not serializable. Form actions need to return plain objects or fail(). E.g. return { success: true } or return fail(400, { message: "invalid" });`, { cause: e }); if ("path" in error) { let message = `Data returned from action inside ${route_id} is not serializable: ${error.message}`; if (error.path !== "") message += ` (data.${error.path})`; throw new Error(message, { cause: e }); } throw error; } } //#endregion //#region ../node_modules/.pnpm/@sveltejs+kit@3.0.0-next.4_@sveltejs+vite-plugin-svelte@7.1.2_svelte@5.56.3_vite@8.0.16_831df308509456bf75377b19fdb5b8d4/node_modules/@sveltejs/kit/src/utils/streaming.js /** * Create an async iterator and a function to push values into it * @template T * @returns {{ * iterate: (transform?: (input: T) => T) => AsyncIterable; * add: (promise: Promise) => void; * }} */ function create_async_iterator() { let resolved = -1; let returned = -1; /** @type {PromiseWithResolvers[]} */ const deferred = []; return { iterate: (transform = (x) => x) => { return { [Symbol.asyncIterator]() { return { next: async () => { const next = deferred[++returned]; if (!next) return { value: null, done: true }; return { value: transform(await next.promise), done: false }; } }; } }; }, add: (promise) => { deferred.push(Promise.withResolvers()); promise.then((value) => { deferred[++resolved].resolve(value); }); } }; } //#endregion //#region ../node_modules/.pnpm/@sveltejs+kit@3.0.0-next.4_@sveltejs+vite-plugin-svelte@7.1.2_svelte@5.56.3_vite@8.0.16_831df308509456bf75377b19fdb5b8d4/node_modules/@sveltejs/kit/src/runtime/server/page/data_serializer.js /** * If the serialized data contains promises, `chunks` will be an * async iterable containing their resolutions * @param {import('@sveltejs/kit').RequestEvent} event * @param {import('types').RequestState} event_state * @param {import('types').SSROptions} options * @returns {import('./types.js').ServerDataSerializer} */ function server_data_serializer(event, event_state, options) { let promise_id = 1; let max_nodes = -1; const iterator = create_async_iterator(); const global = get_global_name(options); /** @param {number} index */ function get_replacer(index) { /** @param {any} thing */ return function replacer(thing) { if (typeof thing?.then === "function") { const id = promise_id++; const promise = thing.then( /** @param {any} data */ (data) => ({ data }) ).catch( /** @param {any} error */ async (error) => ({ error: await handle_error_and_jsonify(event, event_state, options, error) }) ).then( /** * @param {{data: any; error: any}} result */ async ({ data, error }) => { let str; try { str = uneval(error ? [, error] : [data], replacer); } catch { error = await handle_error_and_jsonify(event, event_state, options, /* @__PURE__ */ new Error(`Failed to serialize promise while rendering ${event.route.id}`)); str = uneval([, error], replacer); } return { index, str: `${global}.resolve(${id}, ${str.includes("app.decode") ? `(app) => ${str}` : `() => ${str}`})` }; } ); iterator.add(promise); return `${global}.defer(${id})`; } else for (const key in options.hooks.transport) { const encoded = options.hooks.transport[key].encode(thing); if (encoded) return `app.decode('${key}', ${uneval(encoded, replacer)})`; } }; } const strings = []; return { set_max_nodes(i) { max_nodes = i; }, add_node(i, node) { try { if (!node) { strings[i] = "null"; return; } /** @type {any} */ const payload = { type: "data", data: node.data, uses: serialize_uses(node) }; if (node.slash) payload.slash = node.slash; strings[i] = uneval(payload, get_replacer(i)); } catch (e) { e.path = e.path.slice(1); throw new Error(clarify_devalue_error(event, e), { cause: e }); } }, get_data(csp) { const open = ``; const close = `<\/script>\n`; return { data: `[${compact(max_nodes > -1 ? strings.slice(0, max_nodes) : strings).join(",")}]`, chunks: promise_id > 1 ? iterator.iterate(({ index, str }) => { if (max_nodes > -1 && index >= max_nodes) return ""; return open + str + close; }) : null }; } }; } /** * If the serialized data contains promises, `chunks` will be an * async iterable containing their resolutions * @param {import('@sveltejs/kit').RequestEvent} event * @param {import('types').RequestState} event_state * @param {import('types').SSROptions} options * @returns {import('./types.js').ServerDataSerializerJson} */ function server_data_serializer_json(event, event_state, options) { let promise_id = 1; const iterator = create_async_iterator(); const reducers = { ...Object.fromEntries(Object.entries(options.hooks.transport).map(([key, value]) => [key, value.encode])), /** @param {any} thing */ Promise: (thing) => { if (typeof thing?.then !== "function") return; const id = promise_id++; /** @type {'data' | 'error'} */ let key = "data"; const promise = thing.catch( /** @param {any} e */ async (e) => { key = "error"; return handle_error_and_jsonify(event, event_state, options, e); } ).then( /** @param {any} value */ async (value) => { let str; try { str = stringify(value, reducers); } catch { const error = await handle_error_and_jsonify(event, event_state, options, /* @__PURE__ */ new Error(`Failed to serialize promise while rendering ${event.route.id}`)); key = "error"; str = stringify(error, reducers); } return `{"type":"chunk","id":${id},"${key}":${str}}\n`; } ); iterator.add(promise); return id; } }; const strings = []; return { add_node(i, node) { try { if (!node) { strings[i] = "null"; return; } if (node.type === "error" || node.type === "skip") { strings[i] = JSON.stringify(node); return; } strings[i] = `{"type":"data","data":${stringify(node.data, reducers)},"uses":${JSON.stringify(serialize_uses(node))}${node.slash ? `,"slash":${JSON.stringify(node.slash)}` : ""}}`; } catch (e) { e.path = "data" + e.path; throw new Error(clarify_devalue_error(event, e), { cause: e }); } }, get_data() { return { data: `{"type":"data","nodes":[${strings.join(",")}]}\n`, chunks: promise_id > 1 ? iterator.iterate() : null }; } }; } //#endregion //#region ../node_modules/.pnpm/@sveltejs+kit@3.0.0-next.4_@sveltejs+vite-plugin-svelte@7.1.2_svelte@5.56.3_vite@8.0.16_831df308509456bf75377b19fdb5b8d4/node_modules/@sveltejs/kit/src/runtime/server/page/load_data.js /** * Calls the user's server `load` function. * @param {{ * event: import('@sveltejs/kit').RequestEvent; * event_state: import('types').RequestState; * state: import('types').SSRState; * node: import('types').SSRNode | undefined; * parent: () => Promise>; * }} opts * @returns {Promise} */ async function load_server_data({ event, event_state, state, node, parent }) { if (!node?.server) return null; let is_tracking = true; const uses = { dependencies: /* @__PURE__ */ new Set(), params: /* @__PURE__ */ new Set(), parent: false, route: false, url: false, search_params: /* @__PURE__ */ new Set() }; const load = node.server.load; const slash = node.server.trailingSlash; if (!load) return { type: "data", data: null, uses, slash }; const url = make_trackable(event.url, () => { if (is_tracking) uses.url = true; }, (param) => { if (is_tracking) uses.search_params.add(param); }); if (state.prerendering) disable_search(url); return { type: "data", data: await record_span({ name: "sveltekit.load", attributes: { "sveltekit.load.node_id": node.server_id || "unknown", "sveltekit.load.node_type": get_node_type(node.server_id), "sveltekit.load.environment": "server", "http.route": event.route.id || "unknown" }, fn: async (current) => { const traced_event = merge_tracing(event, current); return await with_request_store({ event: traced_event, state: event_state }, () => load.call(null, { ...traced_event, fetch: (info, init) => { new URL(info instanceof Request ? info.url : info, event.url); return event.fetch(info, init); }, /** @param {string[]} deps */ depends: (...deps) => { for (const dep of deps) { const { href } = new URL(dep, event.url); uses.dependencies.add(href); } }, params: new Proxy(event.params, { get: (target, key) => { if (is_tracking) uses.params.add(key); return target[key]; } }), parent: async () => { if (is_tracking) uses.parent = true; return parent(); }, route: new Proxy(event.route, { get: (target, key) => { if (is_tracking) uses.route = true; return target[key]; } }), url, untrack(fn) { is_tracking = false; try { return fn(); } finally { is_tracking = true; } } })); } }) ?? null, uses, slash }; } /** * Calls the user's `load` function. * @param {{ * event: import('@sveltejs/kit').RequestEvent; * event_state: import('types').RequestState; * fetched: import('./types.js').Fetched[]; * node: import('types').SSRNode | undefined; * parent: () => Promise>; * resolve_opts: import('types').RequiredResolveOptions; * server_data_promise: Promise; * state: import('types').SSRState; * csr: boolean; * }} opts * @returns {Promise> | null>} */ async function load_data({ event, event_state, fetched, node, parent, server_data_promise, state, resolve_opts, csr }) { const server_data_node = await server_data_promise; const load = node?.universal?.load; if (!load) return server_data_node?.data ?? null; return await record_span({ name: "sveltekit.load", attributes: { "sveltekit.load.node_id": node.universal_id || "unknown", "sveltekit.load.node_type": get_node_type(node.universal_id), "sveltekit.load.environment": "server", "http.route": event.route.id || "unknown" }, fn: async (current) => { const traced_event = merge_tracing(event, current); return await with_request_store({ event: traced_event, state: { ...event_state, is_in_universal_load: true } }, () => load.call(null, { url: event.url, params: event.params, data: server_data_node?.data ?? null, route: event.route, fetch: create_universal_fetch(event, state, fetched, csr, resolve_opts), setHeaders: event.setHeaders, depends: noop, parent, untrack: (fn) => fn(), tracing: traced_event.tracing })); } }) ?? null; } /** * @param {Pick} event * @param {import('types').SSRState} state * @param {import('./types.js').Fetched[]} fetched * @param {boolean} csr * @param {Pick, 'filterSerializedResponseHeaders'>} resolve_opts * @returns {typeof fetch} */ function create_universal_fetch(event, state, fetched, csr, resolve_opts) { /** * @param {URL | RequestInfo} input * @param {RequestInit} [init] */ const universal_fetch = async (input, init) => { const cloned_body = input instanceof Request && input.body ? input.clone().body : null; const cloned_headers = input instanceof Request && [...input.headers].length ? new Headers(input.headers) : init?.headers; let response = await event.fetch(input, init); const url = new URL(input instanceof Request ? input.url : input, event.url); const same_origin = url.origin === event.url.origin; /** @type {import('types').PrerenderDependency} */ let dependency; if (same_origin) { if (state.prerendering) { dependency = { response, body: null }; state.prerendering.dependencies.set(url.pathname, dependency); } } else if (url.protocol === "https:" || url.protocol === "http:") if ((input instanceof Request ? input.mode : init?.mode ?? "cors") === "no-cors") response = new Response("", { status: response.status, statusText: response.statusText, headers: response.headers }); else { const acao = response.headers.get("access-control-allow-origin"); if (!acao || acao !== event.url.origin && acao !== "*") throw new Error(`CORS error: ${acao ? "Incorrect" : "No"} 'Access-Control-Allow-Origin' header is present on the requested resource`); } /** @type {ReadableStream} */ let teed_body; const proxy = new Proxy(response, { get(response, key, receiver) { /** * @param {string | undefined} body * @param {boolean} is_b64 */ async function push_fetched(body, is_b64) { const status_number = Number(response.status); if (isNaN(status_number)) throw new Error(`response.status is not a number. value: "${response.status}" type: ${typeof response.status}`); fetched.push({ url: same_origin ? url.href.slice(event.url.origin.length) : url.href, method: event.request.method, request_body: input instanceof Request && cloned_body ? await stream_to_string(cloned_body) : init?.body, request_headers: cloned_headers, response_body: body, response, is_b64 }); } if (key === "body") { if (response.body === null) return null; if (teed_body) return teed_body; const [a, b] = response.body.tee(); (async () => { let result = new Uint8Array(); for await (const chunk of a) { const combined = new Uint8Array(result.length + chunk.length); combined.set(result, 0); combined.set(chunk, result.length); result = combined; } if (dependency) dependency.body = new Uint8Array(result); push_fetched(base64_encode(result), true); })(); return teed_body = b; } if (key === "arrayBuffer") return async () => { const buffer = await response.arrayBuffer(); const bytes = new Uint8Array(buffer); if (dependency) dependency.body = bytes; if (buffer instanceof ArrayBuffer) await push_fetched(base64_encode(bytes), true); return buffer; }; async function text() { const body = await response.text(); if (body === "" && NULL_BODY_STATUS.includes(response.status)) { await push_fetched(void 0, false); return; } if (!body || typeof body === "string") await push_fetched(body, false); if (dependency) dependency.body = body; return body; } if (key === "text") return text; if (key === "json") return async () => { const body = await text(); return body ? JSON.parse(body) : void 0; }; const value = Reflect.get(response, key, response); if (value instanceof Function) return Object.defineProperties( /** * @this {any} */ function() { return Reflect.apply(value, this === receiver ? response : this, arguments); }, { name: { value: value.name }, length: { value: value.length } } ); return value; } }); if (csr) { const get = response.headers.get; response.headers.get = (key) => { const lower = key.toLowerCase(); const value = get.call(response.headers, lower); if (value && !lower.startsWith("x-sveltekit-")) { if (!resolve_opts.filterSerializedResponseHeaders(lower, value)) throw new Error(`Failed to get response header "${lower}" — it must be included by the \`filterSerializedResponseHeaders\` option: https://svelte.dev/docs/kit/hooks#Server-hooks-handle (at ${event.route.id})`); } return value; }; } return proxy; }; return (input, init) => { const response = universal_fetch(input, init); response.catch(noop); return response; }; } /** * @param {ReadableStream} stream */ async function stream_to_string(stream) { let result = ""; const reader = stream.getReader(); const decoder = new TextDecoder(); while (true) { const { done, value } = await reader.read(); if (done) { result += decoder.decode(); break; } result += decoder.decode(value, { stream: true }); } return result; } //#endregion //#region ../node_modules/.pnpm/@sveltejs+kit@3.0.0-next.4_@sveltejs+vite-plugin-svelte@7.1.2_svelte@5.56.3_vite@8.0.16_831df308509456bf75377b19fdb5b8d4/node_modules/@sveltejs/kit/src/runtime/server/page/serialize_data.js /** * Inside a script element, only `<\/script` and ``, so the script element might be unexpectedly * kept open up until an unrelated HTML comment in the page. * * U+2028 LINE SEPARATOR and U+2029 PARAGRAPH SEPARATOR are escaped for the sake of pre-2018 * browsers. * * @see tests for unsafe parsing examples. * @see https://html.spec.whatwg.org/multipage/scripting.html#restrictions-for-contents-of-script-elements * @see https://html.spec.whatwg.org/multipage/syntax.html#cdata-rcdata-restrictions * @see https://html.spec.whatwg.org/multipage/parsing.html#script-data-state * @see https://html.spec.whatwg.org/multipage/parsing.html#script-data-double-escaped-state * @see https://github.com/tc39/proposal-json-superset * @type {Record} */ var replacements = { "<": "\\u003C", "\u2028": "\\u2028", "\u2029": "\\u2029" }; var pattern = new RegExp(`[${Object.keys(replacements).join("")}]`, "g"); /** * Generates a raw HTML string containing a safe script element carrying data and associated attributes. * * It escapes all the special characters needed to guarantee the element is unbroken, but care must * be taken to ensure it is inserted in the document at an acceptable position for a script element, * and that the resulting string isn't further modified. * * @param {import('./types.js').Fetched} fetched * @param {(name: string, value: string) => boolean} filter * @param {boolean} [prerendering] * @returns {string} The raw HTML of a script element carrying the JSON payload. * @example const html = serialize_data('/data.json', null, { foo: 'bar' }); */ function serialize_data(fetched, filter, prerendering = false) { /** @type {Record} */ const headers = {}; let cache_control = null; let age = null; let varyAny = false; for (const [key, value] of fetched.response.headers) { if (filter(key, value)) headers[key] = value; if (key === "cache-control") cache_control = value; else if (key === "age") age = value; else if (key === "vary" && value.trim() === "*") varyAny = true; } const payload = { status: fetched.response.status, statusText: fetched.response.statusText, headers, body: fetched.response_body }; const safe_payload = JSON.stringify(payload).replace(pattern, (match) => replacements[match]); const attrs = [ "type=\"application/json\"", "data-sveltekit-fetched", `data-url="${escape_html(fetched.url, true)}"` ]; if (fetched.is_b64) attrs.push("data-b64"); if (fetched.request_headers || fetched.request_body) { /** @type {import('types').StrictBody[]} */ const values = []; if (fetched.request_headers) values.push([...new Headers(fetched.request_headers)].join(",")); if (fetched.request_body) values.push(fetched.request_body); attrs.push(`data-hash="${hash(...values)}"`); } if (!prerendering && fetched.method === "GET" && cache_control && !varyAny) { const match = /s-maxage=(\d+)/g.exec(cache_control) ?? /max-age=(\d+)/g.exec(cache_control); if (match) { const ttl = +match[1] - +(age ?? "0"); attrs.push(`data-ttl="${ttl}"`); } } return `