import { b as base, a as assets, o as override, r as reset, p as public_env, s as safe_public_env, c as options, d as set_private_env, e as prerendering, f as set_public_env, g as get_hooks, h as set_safe_public_env } from "./chunks/internal.js"; import { m as make_trackable, d as disable_search, n as normalize_path, a as add_data_suffix, r as resolve, b as decode_pathname, h as has_data_suffix, s as strip_data_suffix, c as decode_params, v as validate_layout_server_exports, e as validate_layout_exports, f as validate_page_server_exports, g as validate_page_exports, i as validate_server_exports } from "./chunks/exports.js"; import { w as writable, r as readable } from "./chunks/index.js"; const DEV = false; const SVELTE_KIT_ASSETS = "/_svelte_kit_assets"; const ENDPOINT_METHODS = ["GET", "POST", "PUT", "PATCH", "DELETE", "OPTIONS", "HEAD"]; const PAGE_METHODS = ["GET", "POST", "HEAD"]; function negotiate(accept, types) { const parts = []; accept.split(",").forEach((str, i) => { const match = /([^/]+)\/([^;]+)(?:;q=([0-9.]+))?/.exec(str); if (match) { const [, type, subtype, q = "1"] = match; parts.push({ type, subtype, q: +q, i }); } }); parts.sort((a, b) => { if (a.q !== b.q) { return b.q - a.q; } if (a.subtype === "*" !== (b.subtype === "*")) { return a.subtype === "*" ? 1 : -1; } if (a.type === "*" !== (b.type === "*")) { return a.type === "*" ? 1 : -1; } return a.i - b.i; }); let accepted; let min_priority = Infinity; for (const mimetype of types) { const [type, subtype] = mimetype.split("/"); const priority = parts.findIndex( (part) => (part.type === type || part.type === "*") && (part.subtype === subtype || part.subtype === "*") ); if (priority !== -1 && priority < min_priority) { accepted = mimetype; min_priority = priority; } } return accepted; } function is_content_type(request, ...types) { const type = request.headers.get("content-type")?.split(";", 1)[0].trim() ?? ""; return types.includes(type.toLowerCase()); } function is_form_content_type(request) { return is_content_type( request, "application/x-www-form-urlencoded", "multipart/form-data", "text/plain" ); } class HttpError { /** * @param {number} status * @param {{message: string} extends App.Error ? (App.Error | string | undefined) : App.Error} body */ constructor(status, body2) { this.status = status; if (typeof body2 === "string") { this.body = { message: body2 }; } else if (body2) { this.body = body2; } else { this.body = { message: `Error: ${status}` }; } } toString() { return JSON.stringify(this.body); } } class Redirect { /** * @param {300 | 301 | 302 | 303 | 304 | 305 | 306 | 307 | 308} status * @param {string} location */ constructor(status, location) { this.status = status; this.location = location; } } class SvelteKitError extends Error { /** * @param {number} status * @param {string} text * @param {string} message */ constructor(status, text2, message) { super(message); this.status = status; this.text = text2; } } class ActionFailure { /** * @param {number} status * @param {T} data */ constructor(status, data) { this.status = status; this.data = data; } } function json(data, init2) { const body2 = JSON.stringify(data); const headers2 = new Headers(init2?.headers); if (!headers2.has("content-length")) { headers2.set("content-length", encoder$3.encode(body2).byteLength.toString()); } if (!headers2.has("content-type")) { headers2.set("content-type", "application/json"); } return new Response(body2, { ...init2, headers: headers2 }); } const encoder$3 = new TextEncoder(); function text(body2, init2) { const headers2 = new Headers(init2?.headers); if (!headers2.has("content-length")) { const encoded = encoder$3.encode(body2); headers2.set("content-length", encoded.byteLength.toString()); return new Response(encoded, { ...init2, headers: headers2 }); } return new Response(body2, { ...init2, headers: headers2 }); } function coalesce_to_error(err) { return err instanceof Error || err && /** @type {any} */ err.name && /** @type {any} */ err.message ? ( /** @type {Error} */ err ) : new Error(JSON.stringify(err)); } function normalize_error(error) { return ( /** @type {import('../runtime/control.js').Redirect | HttpError | SvelteKitError | Error} */ error ); } function get_status(error) { return error instanceof HttpError || error instanceof SvelteKitError ? error.status : 500; } function get_message(error) { return error instanceof SvelteKitError ? error.text : "Internal Error"; } function method_not_allowed(mod, method) { return text(`${method} method not allowed`, { status: 405, headers: { // https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/405 // "The server must generate an Allow header field in a 405 status code response" allow: allowed_methods(mod).join(", ") } }); } function allowed_methods(mod) { const allowed = ENDPOINT_METHODS.filter((method) => method in mod); if ("GET" in mod || "HEAD" in mod) allowed.push("HEAD"); return allowed; } function static_error_page(options2, status, message) { let page = options2.templates.error({ status, message }); return text(page, { headers: { "content-type": "text/html; charset=utf-8" }, status }); } async function handle_fatal_error(event, options2, error) { error = error instanceof HttpError ? error : coalesce_to_error(error); const status = get_status(error); const body2 = await handle_error_and_jsonify(event, options2, error); const type = negotiate(event.request.headers.get("accept") || "text/html", [ "application/json", "text/html" ]); if (event.isDataRequest || type === "application/json") { return json(body2, { status }); } return static_error_page(options2, status, body2.message); } async function handle_error_and_jsonify(event, options2, error) { if (error instanceof HttpError) { return error.body; } const status = get_status(error); const message = get_message(error); return await options2.hooks.handleError({ error, event, status, message }) ?? { message }; } function redirect_response(status, location) { const response = new Response(void 0, { status, headers: { location } }); return response; } function clarify_devalue_error(event, error) { if (error.path) { return `Data returned from \`load\` while rendering ${event.route.id} is not serializable: ${error.message} (data${error.path})`; } if (error.path === "") { return `Data returned from \`load\` while rendering ${event.route.id} is not a plain object`; } return error.message; } function stringify_uses(node) { const uses = []; if (node.uses && node.uses.dependencies.size > 0) { uses.push(`"dependencies":${JSON.stringify(Array.from(node.uses.dependencies))}`); } if (node.uses && node.uses.search_params.size > 0) { uses.push(`"search_params":${JSON.stringify(Array.from(node.uses.search_params))}`); } if (node.uses && node.uses.params.size > 0) { uses.push(`"params":${JSON.stringify(Array.from(node.uses.params))}`); } if (node.uses?.parent) uses.push('"parent":1'); if (node.uses?.route) uses.push('"route":1'); if (node.uses?.url) uses.push('"url":1'); return `"uses":{${uses.join(",")}}`; } async function render_endpoint(event, mod, state) { const method = ( /** @type {import('types').HttpMethod} */ event.request.method ); let handler = mod[method] || mod.fallback; if (method === "HEAD" && mod.GET && !mod.HEAD) { 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 && !prerender) { if (state.depth > 0) { throw new Error(`${event.route.id} is not prerenderable`); } else { return new Response(void 0, { status: 204 }); } } try { let response = await handler( /** @type {import('@sveltejs/kit').RequestEvent>} */ event ); if (!(response instanceof Response)) { throw new Error( `Invalid response from route ${event.url.pathname}: handler should return a Response object` ); } if (state.prerendering) { response = new Response(response.body, { status: response.status, statusText: response.statusText, headers: new Headers(response.headers) }); response.headers.set("x-sveltekit-prerender", String(prerender)); } return response; } catch (e) { if (e instanceof Redirect) { return new Response(void 0, { status: e.status, headers: { location: e.location } }); } throw e; } } function is_endpoint_request(event) { const { method, headers: headers2 } = event.request; if (ENDPOINT_METHODS.includes(method) && !PAGE_METHODS.includes(method)) { return true; } if (method === "POST" && headers2.get("x-sveltekit-action") === "true") return false; const accept = event.request.headers.get("accept") ?? "*/*"; return negotiate(accept, ["*", "text/html"]) !== "text/html"; } function compact(arr) { return arr.filter( /** @returns {val is NonNullable} */ (val) => val != null ); } const escaped = { "<": "\\u003C", "\\": "\\\\", "\b": "\\b", "\f": "\\f", "\n": "\\n", "\r": "\\r", " ": "\\t", "\u2028": "\\u2028", "\u2029": "\\u2029" }; class DevalueError extends Error { /** * @param {string} message * @param {string[]} keys */ constructor(message, keys) { super(message); this.name = "DevalueError"; this.path = keys.join(""); } } function is_primitive(thing) { return Object(thing) !== thing; } const object_proto_names = /* @__PURE__ */ Object.getOwnPropertyNames( Object.prototype ).sort().join("\0"); function is_plain_object(thing) { const proto = Object.getPrototypeOf(thing); return proto === Object.prototype || proto === null || Object.getOwnPropertyNames(proto).sort().join("\0") === object_proto_names; } function get_type(thing) { return Object.prototype.toString.call(thing).slice(8, -1); } function get_escaped_char(char) { switch (char) { case '"': return '\\"'; case "<": return "\\u003C"; case "\\": return "\\\\"; case "\n": return "\\n"; case "\r": return "\\r"; case " ": return "\\t"; case "\b": return "\\b"; case "\f": return "\\f"; case "\u2028": return "\\u2028"; case "\u2029": return "\\u2029"; default: return char < " " ? `\\u${char.charCodeAt(0).toString(16).padStart(4, "0")}` : ""; } } function stringify_string(str) { let result = ""; let last_pos = 0; const len = str.length; for (let i = 0; i < len; i += 1) { const char = str[i]; const replacement = get_escaped_char(char); if (replacement) { result += str.slice(last_pos, i) + replacement; last_pos = i + 1; } } return `"${last_pos === 0 ? str : result + str.slice(last_pos)}"`; } const chars$1 = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_$"; const unsafe_chars = /[<\b\f\n\r\t\0\u2028\u2029]/g; const reserved = /^(?:do|if|in|for|int|let|new|try|var|byte|case|char|else|enum|goto|long|this|void|with|await|break|catch|class|const|final|float|short|super|throw|while|yield|delete|double|export|import|native|return|switch|throws|typeof|boolean|default|extends|finally|package|private|abstract|continue|debugger|function|volatile|interface|protected|transient|implements|instanceof|synchronized)$/; function uneval(value, replacer) { const counts = /* @__PURE__ */ new Map(); const keys = []; const custom = /* @__PURE__ */ new Map(); function walk(thing) { if (typeof thing === "function") { throw new DevalueError(`Cannot stringify a function`, keys); } if (!is_primitive(thing)) { if (counts.has(thing)) { counts.set(thing, counts.get(thing) + 1); return; } counts.set(thing, 1); if (replacer) { const str2 = replacer(thing); if (typeof str2 === "string") { custom.set(thing, str2); return; } } const type = get_type(thing); switch (type) { case "Number": case "BigInt": case "String": case "Boolean": case "Date": case "RegExp": return; case "Array": thing.forEach((value2, i) => { keys.push(`[${i}]`); walk(value2); keys.pop(); }); break; case "Set": Array.from(thing).forEach(walk); break; case "Map": for (const [key2, value2] of thing) { keys.push( `.get(${is_primitive(key2) ? stringify_primitive$1(key2) : "..."})` ); walk(value2); keys.pop(); } break; default: if (!is_plain_object(thing)) { throw new DevalueError( `Cannot stringify arbitrary non-POJOs`, keys ); } if (Object.getOwnPropertySymbols(thing).length > 0) { throw new DevalueError( `Cannot stringify POJOs with symbolic keys`, keys ); } for (const key2 in thing) { keys.push(`.${key2}`); walk(thing[key2]); keys.pop(); } } } } walk(value); const names = /* @__PURE__ */ new Map(); Array.from(counts).filter((entry) => entry[1] > 1).sort((a, b) => b[1] - a[1]).forEach((entry, i) => { names.set(entry[0], get_name(i)); }); function stringify2(thing) { if (names.has(thing)) { return names.get(thing); } if (is_primitive(thing)) { return stringify_primitive$1(thing); } if (custom.has(thing)) { return custom.get(thing); } const type = get_type(thing); switch (type) { case "Number": case "String": case "Boolean": return `Object(${stringify2(thing.valueOf())})`; case "RegExp": return `new RegExp(${stringify_string(thing.source)}, "${thing.flags}")`; case "Date": return `new Date(${thing.getTime()})`; case "Array": const members = ( /** @type {any[]} */ thing.map( (v, i) => i in thing ? stringify2(v) : "" ) ); const tail = thing.length === 0 || thing.length - 1 in thing ? "" : ","; return `[${members.join(",")}${tail}]`; case "Set": case "Map": return `new ${type}([${Array.from(thing).map(stringify2).join(",")}])`; default: const obj = `{${Object.keys(thing).map((key2) => `${safe_key(key2)}:${stringify2(thing[key2])}`).join(",")}}`; const proto = Object.getPrototypeOf(thing); if (proto === null) { return Object.keys(thing).length > 0 ? `Object.assign(Object.create(null),${obj})` : `Object.create(null)`; } return obj; } } const str = stringify2(value); if (names.size) { const params = []; const statements = []; const values = []; names.forEach((name, thing) => { params.push(name); if (custom.has(thing)) { values.push( /** @type {string} */ custom.get(thing) ); return; } if (is_primitive(thing)) { values.push(stringify_primitive$1(thing)); return; } const type = get_type(thing); switch (type) { case "Number": case "String": case "Boolean": values.push(`Object(${stringify2(thing.valueOf())})`); break; case "RegExp": values.push(thing.toString()); break; case "Date": values.push(`new Date(${thing.getTime()})`); break; case "Array": values.push(`Array(${thing.length})`); thing.forEach((v, i) => { statements.push(`${name}[${i}]=${stringify2(v)}`); }); break; case "Set": values.push(`new Set`); statements.push( `${name}.${Array.from(thing).map((v) => `add(${stringify2(v)})`).join(".")}` ); break; case "Map": values.push(`new Map`); statements.push( `${name}.${Array.from(thing).map(([k, v]) => `set(${stringify2(k)}, ${stringify2(v)})`).join(".")}` ); break; default: values.push( Object.getPrototypeOf(thing) === null ? "Object.create(null)" : "{}" ); Object.keys(thing).forEach((key2) => { statements.push( `${name}${safe_prop(key2)}=${stringify2(thing[key2])}` ); }); } }); statements.push(`return ${str}`); return `(function(${params.join(",")}){${statements.join( ";" )}}(${values.join(",")}))`; } else { return str; } } function get_name(num) { let name = ""; do { name = chars$1[num % chars$1.length] + name; num = ~~(num / chars$1.length) - 1; } while (num >= 0); return reserved.test(name) ? `${name}0` : name; } function escape_unsafe_char(c) { return escaped[c] || c; } function escape_unsafe_chars(str) { return str.replace(unsafe_chars, escape_unsafe_char); } function safe_key(key2) { return /^[_$a-zA-Z][_$a-zA-Z0-9]*$/.test(key2) ? key2 : escape_unsafe_chars(JSON.stringify(key2)); } function safe_prop(key2) { return /^[_$a-zA-Z][_$a-zA-Z0-9]*$/.test(key2) ? `.${key2}` : `[${escape_unsafe_chars(JSON.stringify(key2))}]`; } function stringify_primitive$1(thing) { if (typeof thing === "string") return stringify_string(thing); if (thing === void 0) return "void 0"; if (thing === 0 && 1 / thing < 0) return "-0"; const str = String(thing); if (typeof thing === "number") return str.replace(/^(-)?0\./, "$1."); if (typeof thing === "bigint") return thing + "n"; return str; } const UNDEFINED = -1; const HOLE = -2; const NAN = -3; const POSITIVE_INFINITY = -4; const NEGATIVE_INFINITY = -5; const NEGATIVE_ZERO = -6; function stringify(value, reducers) { const stringified = []; const indexes = /* @__PURE__ */ new Map(); const custom = []; for (const key2 in reducers) { custom.push({ key: key2, fn: reducers[key2] }); } const keys = []; let p = 0; function flatten(thing) { if (typeof thing === "function") { throw new DevalueError(`Cannot stringify a function`, keys); } if (indexes.has(thing)) return indexes.get(thing); if (thing === void 0) return UNDEFINED; if (Number.isNaN(thing)) return NAN; if (thing === Infinity) return POSITIVE_INFINITY; if (thing === -Infinity) return NEGATIVE_INFINITY; if (thing === 0 && 1 / thing < 0) return NEGATIVE_ZERO; const index2 = p++; indexes.set(thing, index2); for (const { key: key2, fn } of custom) { const value2 = fn(thing); if (value2) { stringified[index2] = `["${key2}",${flatten(value2)}]`; return index2; } } let str = ""; if (is_primitive(thing)) { str = stringify_primitive(thing); } else { const type = get_type(thing); switch (type) { case "Number": case "String": case "Boolean": str = `["Object",${stringify_primitive(thing)}]`; break; case "BigInt": str = `["BigInt",${thing}]`; break; case "Date": str = `["Date","${thing.toISOString()}"]`; break; case "RegExp": const { source, flags } = thing; str = flags ? `["RegExp",${stringify_string(source)},"${flags}"]` : `["RegExp",${stringify_string(source)}]`; break; case "Array": str = "["; for (let i = 0; i < thing.length; i += 1) { if (i > 0) str += ","; if (i in thing) { keys.push(`[${i}]`); str += flatten(thing[i]); keys.pop(); } else { str += HOLE; } } str += "]"; break; case "Set": str = '["Set"'; for (const value2 of thing) { str += `,${flatten(value2)}`; } str += "]"; break; case "Map": str = '["Map"'; for (const [key2, value2] of thing) { keys.push( `.get(${is_primitive(key2) ? stringify_primitive(key2) : "..."})` ); str += `,${flatten(key2)},${flatten(value2)}`; } str += "]"; break; default: if (!is_plain_object(thing)) { throw new DevalueError( `Cannot stringify arbitrary non-POJOs`, keys ); } if (Object.getOwnPropertySymbols(thing).length > 0) { throw new DevalueError( `Cannot stringify POJOs with symbolic keys`, keys ); } if (Object.getPrototypeOf(thing) === null) { str = '["null"'; for (const key2 in thing) { keys.push(`.${key2}`); str += `,${stringify_string(key2)},${flatten(thing[key2])}`; keys.pop(); } str += "]"; } else { str = "{"; let started = false; for (const key2 in thing) { if (started) str += ","; started = true; keys.push(`.${key2}`); str += `${stringify_string(key2)}:${flatten(thing[key2])}`; keys.pop(); } str += "}"; } } } stringified[index2] = str; return index2; } const index = flatten(value); if (index < 0) return `${index}`; return `[${stringified.join(",")}]`; } function stringify_primitive(thing) { const type = typeof thing; if (type === "string") return stringify_string(thing); if (thing instanceof String) return stringify_string(thing.toString()); if (thing === void 0) return UNDEFINED.toString(); if (thing === 0 && 1 / thing < 0) return NEGATIVE_ZERO.toString(); if (type === "bigint") return `["BigInt","${thing}"]`; return String(thing); } function is_action_json_request(event) { const accept = negotiate(event.request.headers.get("accept") ?? "*/*", [ "application/json", "text/html" ]); return accept === "application/json" && event.request.method === "POST"; } async function handle_action_json_request(event, options2, server) { const actions = server?.actions; if (!actions) { const no_actions_error = new SvelteKitError( 405, "Method Not Allowed", "POST method not allowed. No actions exist for this page" ); return action_json( { type: "error", error: await handle_error_and_jsonify(event, options2, no_actions_error) }, { status: no_actions_error.status, headers: { // https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/405 // "The server must generate an Allow header field in a 405 status code response" allow: "GET" } } ); } check_named_default_separate(actions); try { const data = await call_action(event, actions); if (false) ; if (data instanceof ActionFailure) { return action_json({ type: "failure", status: data.status, // @ts-expect-error we assign a string to what is supposed to be an object. That's ok // because we don't use the object outside, and this way we have better code navigation // through knowing where the related interface is used. data: stringify_action_response( data.data, /** @type {string} */ event.route.id ) }); } else { return action_json({ type: "success", status: data ? 200 : 204, // @ts-expect-error see comment above data: stringify_action_response( data, /** @type {string} */ event.route.id ) }); } } 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, options2, check_incorrect_fail_use(err)) }, { status: get_status(err) } ); } } function check_incorrect_fail_use(error) { return error instanceof ActionFailure ? new Error('Cannot "throw fail()". Use "return fail()"') : error; } function action_json_redirect(redirect) { return action_json({ type: "redirect", status: redirect.status, location: redirect.location }); } function action_json(data, init2) { return json(data, init2); } function is_action_request(event) { return event.request.method === "POST"; } async function handle_action_request(event, server) { const actions = server?.actions; if (!actions) { event.setHeaders({ // https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/405 // "The server must generate an Allow header field in a 405 status code response" allow: "GET" }); return { type: "error", error: new SvelteKitError( 405, "Method Not Allowed", "POST method not allowed. No actions exist for this page" ) }; } check_named_default_separate(actions); try { const data = await call_action(event, actions); if (false) ; if (data instanceof ActionFailure) { return { type: "failure", status: data.status, data: data.data }; } else { return { type: "success", status: 200, // @ts-expect-error this will be removed upon serialization, so `undefined` is the same as omission 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) }; } } 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://kit.svelte.dev/docs/form-actions#named-actions" ); } } async function call_action(event, 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 action(event); } function validate_action_return(data) { if (data instanceof Redirect) { throw new Error("Cannot `return redirect(...)` — use `redirect(...)` instead"); } if (data instanceof HttpError) { throw new Error("Cannot `return error(...)` — use `error(...)` or `return fail(...)` instead"); } } function uneval_action_response(data, route_id) { return try_deserialize(data, uneval, route_id); } function stringify_action_response(data, route_id) { return try_deserialize(data, stringify, route_id); } function try_deserialize(data, fn, route_id) { try { return fn(data); } catch (e) { const error = ( /** @type {any} */ 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); } throw error; } } const INVALIDATED_PARAM = "x-sveltekit-invalidated"; const TRAILING_SLASH_PARAM = "x-sveltekit-trailing-slash"; function b64_encode(buffer) { if (globalThis.Buffer) { return Buffer.from(buffer).toString("base64"); } const little_endian = new Uint8Array(new Uint16Array([1]).buffer)[0] > 0; return btoa( new TextDecoder(little_endian ? "utf-16le" : "utf-16be").decode( new Uint16Array(new Uint8Array(buffer)) ) ); } async function load_server_data({ event, 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 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); } const result = await node.server.load?.call(null, { ...event, fetch: (info, init2) => { new URL(info instanceof Request ? info.url : info, event.url); return event.fetch(info, init2); }, /** @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, key2) => { if (is_tracking) { uses.params.add(key2); } return target[ /** @type {string} */ key2 ]; } }), parent: async () => { if (is_tracking) { uses.parent = true; } return parent(); }, route: new Proxy(event.route, { get: (target, key2) => { if (is_tracking) { uses.route = true; } return target[ /** @type {'id'} */ key2 ]; } }), url, untrack(fn) { is_tracking = false; try { return fn(); } finally { is_tracking = true; } } }); return { type: "data", data: result ?? null, uses, slash: node.server.trailingSlash }; } async function load_data({ event, fetched, node, parent, server_data_promise, state, resolve_opts, csr }) { const server_data_node = await server_data_promise; if (!node?.universal?.load) { return server_data_node?.data ?? null; } const result = await node.universal.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: () => { }, parent, untrack: (fn) => fn() }); return result ?? null; } function create_universal_fetch(event, state, fetched, csr, resolve_opts) { const universal_fetch = async (input, init2) => { 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) : init2?.headers; let response = await event.fetch(input, init2); const url = new URL(input instanceof Request ? input.url : input, event.url); const same_origin = url.origin === event.url.origin; let dependency; if (same_origin) { if (state.prerendering) { dependency = { response, body: null }; state.prerendering.dependencies.set(url.pathname, dependency); } } else { const mode = input instanceof Request ? input.mode : init2?.mode ?? "cors"; if (mode === "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` ); } } } const proxy = new Proxy(response, { get(response2, key2, _receiver) { async function push_fetched(body2, is_b64) { const status_number = Number(response2.status); if (isNaN(status_number)) { throw new Error( `response.status is not a number. value: "${response2.status}" type: ${typeof response2.status}` ); } fetched.push({ url: same_origin ? url.href.slice(event.url.origin.length) : url.href, method: event.request.method, request_body: ( /** @type {string | ArrayBufferView | undefined} */ input instanceof Request && cloned_body ? await stream_to_string(cloned_body) : init2?.body ), request_headers: cloned_headers, response_body: body2, response: response2, is_b64 }); } if (key2 === "arrayBuffer") { return async () => { const buffer = await response2.arrayBuffer(); if (dependency) { dependency.body = new Uint8Array(buffer); } if (buffer instanceof ArrayBuffer) { await push_fetched(b64_encode(buffer), true); } return buffer; }; } async function text2() { const body2 = await response2.text(); if (!body2 || typeof body2 === "string") { await push_fetched(body2, false); } if (dependency) { dependency.body = body2; } return body2; } if (key2 === "text") { return text2; } if (key2 === "json") { return async () => { return JSON.parse(await text2()); }; } return Reflect.get(response2, key2, response2); } }); if (csr) { const get = response.headers.get; response.headers.get = (key2) => { const lower = key2.toLowerCase(); const value = get.call(response.headers, lower); if (value && !lower.startsWith("x-sveltekit-")) { const included = resolve_opts.filterSerializedResponseHeaders(lower, value); if (!included) { throw new Error( `Failed to get response header "${lower}" — it must be included by the \`filterSerializedResponseHeaders\` option: https://kit.svelte.dev/docs/hooks#server-hooks-handle (at ${event.route.id})` ); } } return value; }; } return proxy; }; return (input, init2) => { const response = universal_fetch(input, init2); response.catch(() => { }); return response; }; } 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) { break; } result += decoder.decode(value); } return result; } function hash(...values) { let hash2 = 5381; for (const value of values) { if (typeof value === "string") { let i = value.length; while (i) hash2 = hash2 * 33 ^ value.charCodeAt(--i); } else if (ArrayBuffer.isView(value)) { const buffer = new Uint8Array(value.buffer, value.byteOffset, value.byteLength); let i = buffer.length; while (i) hash2 = hash2 * 33 ^ buffer[--i]; } else { throw new TypeError("value must be a string or TypedArray"); } } return (hash2 >>> 0).toString(36); } const escape_html_attr_dict = { "&": "&", '"': """ }; const escape_html_attr_regex = new RegExp( // special characters `[${Object.keys(escape_html_attr_dict).join("")}]|[\\ud800-\\udbff](?![\\udc00-\\udfff])|[\\ud800-\\udbff][\\udc00-\\udfff]|[\\udc00-\\udfff]`, "g" ); function escape_html_attr(str) { const escaped_str = str.replace(escape_html_attr_regex, (match) => { if (match.length === 2) { return match; } return escape_html_attr_dict[match] ?? `&#${match.charCodeAt(0)};`; }); return `"${escaped_str}"`; } const replacements = { "<": "\\u003C", "\u2028": "\\u2028", "\u2029": "\\u2029" }; const pattern = new RegExp(`[${Object.keys(replacements).join("")}]`, "g"); function serialize_data(fetched, filter, prerendering2 = false) { const headers2 = {}; let cache_control = null; let age = null; let varyAny = false; for (const [key2, value] of fetched.response.headers) { if (filter(key2, value)) { headers2[key2] = value; } if (key2 === "cache-control") cache_control = value; else if (key2 === "age") age = value; else if (key2 === "vary" && value.trim() === "*") varyAny = true; } const payload = { status: fetched.response.status, statusText: fetched.response.statusText, headers: headers2, 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_attr(fetched.url)}` ]; if (fetched.is_b64) { attrs.push("data-b64"); } if (fetched.request_headers || fetched.request_body) { 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 (!prerendering2 && 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 `