pulumi-package-docs 0.9.0 → 0.9.1

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 (28) hide show
  1. package/bin/args.js +8 -0
  2. package/bin/args.test.js +11 -1
  3. package/bin/cli-bun.js +2 -2
  4. package/dist/client/assets/MemberDetail-Du4HYTda.js +1 -0
  5. package/dist/client/assets/index-g58gbZKl.js +12 -0
  6. package/dist/client/assets/matchContext-BfDTxnb0.js +2 -0
  7. package/dist/client/assets/providers._name-DztqmroK.js +1 -0
  8. package/dist/client/assets/providers._name.functions._token-Dds2hD5R.js +1 -0
  9. package/dist/client/assets/providers._name.functions._token-DkZe4R_v.js +1 -0
  10. package/dist/client/assets/providers._name.index-B6cK3ZCZ.js +1 -0
  11. package/dist/client/assets/providers._name.index-CvFTUtAs.js +1 -0
  12. package/dist/client/assets/providers._name.resources._token-Bf7TPYcB.js +1 -0
  13. package/dist/client/assets/providers._name.resources._token-CIjv9yb8.js +1 -0
  14. package/dist/client/assets/routes-Dz3Kksbm.js +1 -0
  15. package/dist/server/assets/{_tanstack-start-manifest_v-DNIp6gp3.js → _tanstack-start-manifest_v-Drm3Ru6D.js} +15 -13
  16. package/dist/server/server.js +984 -372
  17. package/package.json +2 -2
  18. package/dist/client/assets/MemberDetail-D8jkDkVP.js +0 -1
  19. package/dist/client/assets/index-DM9VsIdh.js +0 -13
  20. package/dist/client/assets/providers._name-C-FSbmVZ.js +0 -1
  21. package/dist/client/assets/providers._name.functions._token-B3S8Gcfx.js +0 -1
  22. package/dist/client/assets/providers._name.functions._token-C4VPHGlG.js +0 -1
  23. package/dist/client/assets/providers._name.index-CWHPtoBD.js +0 -1
  24. package/dist/client/assets/providers._name.index-nlnQuJ9Q.js +0 -1
  25. package/dist/client/assets/providers._name.resources._token-BISpZVHI.js +0 -1
  26. package/dist/client/assets/providers._name.resources._token-CvMi94a3.js +0 -1
  27. package/dist/client/assets/routes-DwhZQHE3.js +0 -1
  28. package/dist/client/assets/useSelector-BIt42tGI.js +0 -1
@@ -2,12 +2,13 @@ import "react";
2
2
  import { RouterProvider } from "@tanstack/react-router";
3
3
  import { jsx } from "react/jsx-runtime";
4
4
  import { defineHandlerCallback, renderRouterToStream } from "@tanstack/react-router/ssr/server";
5
+ import { parseSetCookie, splitSetCookieString } from "cookie-es";
6
+ import { _getRenderedMatches, createSerializationAdapter, getScriptPreloadAttrs, getStylesheetHref, invariant, isDangerousProtocol, isNotFound, isPromise, isRedirect, parseRedirect, resolveManifestAssetLink, resolveManifestCssLink, rootRouteId } from "@tanstack/router-core";
5
7
  import { AsyncLocalStorage } from "node:async_hooks";
6
- import { H3Event, toResponse } from "h3-v2";
7
- import { _getRenderedMatches, createSerializationAdapter, executeRewriteInput, getScriptPreloadAttrs, getStylesheetHref, invariant, isDangerousProtocol, isNotFound, isPromise, isRedirect, parseRedirect, resolveManifestAssetLink, resolveManifestCssLink, rootRouteId } from "@tanstack/router-core";
8
8
  import { makeSerovalPlugin, mergeHeaders, mergeHeaders as mergeHeaders$1 } from "@tanstack/router-core/ssr/client";
9
9
  import { fromJSON, toCrossJSONAsync, toCrossJSONStream } from "seroval";
10
- import { attachRouterServerSsrUtils, bindSsrResponseToRequest, createRawStreamRPCPlugin, defaultSerovalDeserializerPlugins, disposeSsrResponse, getNormalizedURL, isSsrResponse, normalizeSsrResponse, replaceSsrResponse, stripSsrResponseBody, waitForRequest } from "@tanstack/router-core/ssr/server";
10
+ import { isServer } from "@tanstack/router-core/isServer";
11
+ import { attachRouterServerSsrUtils, bindSsrResponseToRequest, createRawStreamRPCPlugin, defaultSerovalDeserializerPlugins, disposeSsrResponse, getNormalizedURL, isSsrResponse, normalizeSsrResponse, stripSsrResponseBody, waitForRequest } from "@tanstack/router-core/ssr/server";
11
12
  import { createServerHistory } from "@tanstack/history";
12
13
  //#region node_modules/@tanstack/react-start-server/dist/esm/StartServer.js
13
14
  function StartServer(props) {
@@ -22,59 +23,466 @@ var defaultStreamHandler = defineHandlerCallback(({ request, router, responseHea
22
23
  children: /* @__PURE__ */ jsx(StartServer, { router })
23
24
  }));
24
25
  //#endregion
25
- //#region node_modules/@tanstack/start-server-core/dist/esm/request-response.js
26
+ //#region node_modules/@tanstack/start-server-core/dist/esm/headers.js
27
+ function getSetCookieValues(headers) {
28
+ const headersWithSetCookie = headers;
29
+ if (typeof headersWithSetCookie.getSetCookie === "function") return headersWithSetCookie.getSetCookie();
30
+ const value = headers.get("set-cookie");
31
+ return value ? splitSetCookieString(value) : [];
32
+ }
33
+ //#endregion
34
+ //#region node_modules/@tanstack/start-server-core/dist/esm/internal-request-response.js
26
35
  var GLOBAL_EVENT_STORAGE_KEY = Symbol.for("tanstack-start:event-storage");
27
36
  var globalObj$1 = globalThis;
28
37
  if (!globalObj$1[GLOBAL_EVENT_STORAGE_KEY]) globalObj$1[GLOBAL_EVENT_STORAGE_KEY] = new AsyncLocalStorage();
29
38
  var eventStorage = globalObj$1[GLOBAL_EVENT_STORAGE_KEY];
30
- function isPromiseLike(value) {
31
- return typeof value.then === "function";
39
+ var PROTECTED_RESPONSE_HEADERS = Symbol.for("tanstack-start:protected-response-headers");
40
+ function getProtectedResponseHeaders(response) {
41
+ return response[PROTECTED_RESPONSE_HEADERS];
42
+ }
43
+ function installProtectedResponseHeaders(response, headers) {
44
+ Object.defineProperty(response, PROTECTED_RESPONSE_HEADERS, {
45
+ value: headers,
46
+ configurable: true
47
+ });
32
48
  }
33
- function getSetCookieValues(headers) {
34
- const headersWithSetCookie = headers;
35
- if (typeof headersWithSetCookie.getSetCookie === "function") return headersWithSetCookie.getSetCookie();
36
- const value = headers.get("set-cookie");
37
- return value ? [value] : [];
38
- }
39
- function mergeEventResponseHeaders(response, event) {
40
- if (response.ok) return;
41
- const eventSetCookies = getSetCookieValues(event.res.headers);
42
- if (eventSetCookies.length === 0) return;
43
- const responseSetCookies = getSetCookieValues(response.headers);
44
- response.headers.delete("set-cookie");
45
- for (const cookie of responseSetCookies) response.headers.append("set-cookie", cookie);
46
- for (const cookie of eventSetCookies) response.headers.append("set-cookie", cookie);
47
- }
48
- function attachResponseHeaders(value, event) {
49
- if (isPromiseLike(value)) return value.then((resolved) => {
50
- if (resolved instanceof Response) mergeEventResponseHeaders(resolved, event);
51
- return resolved;
49
+ /** Transport requirements belong to the encoded body, not its wrapper. */
50
+ function transferResponseProtocol(source, target) {
51
+ const protectedHeaders = getProtectedResponseHeaders(source);
52
+ if (protectedHeaders && getProtectedResponseHeaders(target) !== protectedHeaders) installProtectedResponseHeaders(target, protectedHeaders);
53
+ }
54
+ /** Preserve metadata when Start reconstructs an existing response. */
55
+ function transferResponseMetadata(source, target) {
56
+ transferResponseProtocol(source, target);
57
+ const event = eventStorage.getStore();
58
+ const appliedHeaderAppends = event?.responseHeaderAppends?.get(source);
59
+ if (appliedHeaderAppends) event.responseHeaderAppends.set(target, appliedHeaderAppends);
60
+ }
61
+ function sanitizeStatusMessage(statusMessage) {
62
+ return statusMessage.replace(/[^\t\x20-\x7e]/g, "");
63
+ }
64
+ function sanitizeStatusCode(statusCode) {
65
+ const code = typeof statusCode === "string" ? Number(statusCode) : statusCode;
66
+ if (code === void 0 || !Number.isInteger(code) || code < 200 || code > 599) return;
67
+ return code;
68
+ }
69
+ function getObjectProperty(value, key) {
70
+ if (typeof value === "object" && value || typeof value === "function") return value[key];
71
+ }
72
+ function getStatusCodeProperty(value, key) {
73
+ const property = getObjectProperty(value, key);
74
+ if (typeof property === "string" || typeof property === "number") return property;
75
+ }
76
+ function getErrorStatus(error) {
77
+ const cause = getObjectProperty(error, "cause");
78
+ return sanitizeStatusCode(getStatusCodeProperty(error, "status") ?? getStatusCodeProperty(error, "statusCode") ?? getStatusCodeProperty(cause, "status") ?? getStatusCodeProperty(cause, "statusCode"));
79
+ }
80
+ function getErrorStatusText(error) {
81
+ const cause = getObjectProperty(error, "cause");
82
+ const statusText = getObjectProperty(error, "statusText") ?? getObjectProperty(error, "statusMessage") ?? getObjectProperty(cause, "statusText") ?? getObjectProperty(cause, "statusMessage");
83
+ if (typeof statusText === "string") return sanitizeStatusMessage(statusText);
84
+ }
85
+ var GENERATED_BODY_EXCLUDED_HEADERS = /* @__PURE__ */ new Set([
86
+ "connection",
87
+ "content-encoding",
88
+ "content-length",
89
+ "keep-alive",
90
+ "proxy-connection",
91
+ "te",
92
+ "trailer",
93
+ "transfer-encoding"
94
+ ]);
95
+ function isResponse(value) {
96
+ return value instanceof Response || Object.prototype.toString.call(value) === "[object Response]";
97
+ }
98
+ function getErrorHeaders(error) {
99
+ let init = getObjectProperty(error, "headers");
100
+ if (!init) {
101
+ const cause = getObjectProperty(error, "cause");
102
+ if (isResponse(cause)) return;
103
+ init = getObjectProperty(cause, "headers");
104
+ }
105
+ if (!init) return;
106
+ let headers;
107
+ try {
108
+ headers = new Headers(init);
109
+ } catch {
110
+ return;
111
+ }
112
+ for (const name of GENERATED_BODY_EXCLUDED_HEADERS) headers.delete(name);
113
+ return headers;
114
+ }
115
+ function getDistinctCookieKey(name, options, defaultPath = "") {
116
+ return [
117
+ name,
118
+ options.domain || "",
119
+ options.path ?? defaultPath
120
+ ].join(";");
121
+ }
122
+ function getDistinctCookieKeyFromHeader(cookie) {
123
+ const parsed = parseSetCookie(cookie);
124
+ return parsed ? getDistinctCookieKey(parsed.name, parsed) : `\0${cookie}`;
125
+ }
126
+ function replaceSetCookieValues(headers, cookies) {
127
+ headers.delete("set-cookie");
128
+ for (const cookie of cookies) headers.append("set-cookie", cookie);
129
+ }
130
+ function getCookieKey(state, cookie) {
131
+ const keys = state.setCookieKeys ||= /* @__PURE__ */ new Map();
132
+ let key = keys.get(cookie);
133
+ if (key === void 0) {
134
+ key = getDistinctCookieKeyFromHeader(cookie);
135
+ keys.set(cookie, key);
136
+ }
137
+ return key;
138
+ }
139
+ function getMergedSetCookieValues(state, currentCookies, cookiesToMerge) {
140
+ if (currentCookies.length === 0) return cookiesToMerge;
141
+ const cookieKeysToMerge = /* @__PURE__ */ new Set();
142
+ for (const cookie of cookiesToMerge) cookieKeysToMerge.add(getCookieKey(state, cookie));
143
+ return currentCookies.filter((cookie) => !cookieKeysToMerge.has(getCookieKey(state, cookie))).concat(cookiesToMerge);
144
+ }
145
+ function hasProtectedHeaderChanges(response, protectedHeaders) {
146
+ const headers = response.headers;
147
+ for (const [name, value] of protectedHeaders) if (headers.get(name) !== value) return true;
148
+ return false;
149
+ }
150
+ function applyProtectedHeaders(protectedHeaders, headers) {
151
+ for (const [name, value] of protectedHeaders) if (value === null) headers.delete(name);
152
+ else headers.set(name, value);
153
+ }
154
+ function applyHeaderState(target, state, generatedBody, protectedHeaders, appliedHeaderAppends) {
155
+ let headers = target;
156
+ const mutableHeaders = () => {
157
+ if (headers === target) headers = new Headers(target);
158
+ return headers;
159
+ };
160
+ if (state.clearHeaders) {
161
+ for (const name of Array.from(target.keys())) if (!protectedHeaders?.has(name)) mutableHeaders().delete(name);
162
+ }
163
+ if (!state.clearHeaders && state.removedHeaders) {
164
+ for (const name of state.removedHeaders) if (!protectedHeaders?.has(name) && headers.has(name)) mutableHeaders().delete(name);
165
+ }
166
+ for (const [name, value] of state.headers) if (name !== "set-cookie" && !protectedHeaders?.has(name) && !(generatedBody && GENERATED_BODY_EXCLUDED_HEADERS.has(name))) {
167
+ let append = state.headerAppends?.get(name);
168
+ if (!append) {
169
+ if (headers.get(name) !== value) mutableHeaders().set(name, value);
170
+ continue;
171
+ }
172
+ const applied = appliedHeaderAppends?.get(name);
173
+ const pending = [];
174
+ while (append && append !== applied) {
175
+ pending.push(append.value);
176
+ append = append.previous;
177
+ }
178
+ for (let index = pending.length - 1; index >= 0; index--) mutableHeaders().append(name, pending[index]);
179
+ }
180
+ if (state.setCookieBehavior && !protectedHeaders?.has("set-cookie")) {
181
+ const eventSetCookies = getSetCookieValues(state.headers);
182
+ const currentCookies = getSetCookieValues(headers);
183
+ const cookies = state.setCookieBehavior === "replace" ? eventSetCookies : getMergedSetCookieValues(state, currentCookies, eventSetCookies);
184
+ if (cookies.length !== currentCookies.length || cookies.some((cookie, index) => cookie !== currentCookies[index])) replaceSetCookieValues(mutableHeaders(), cookies);
185
+ }
186
+ return headers;
187
+ }
188
+ function canHaveBody(method, status) {
189
+ return method !== "HEAD" && status !== 204 && status !== 205 && status !== 304;
190
+ }
191
+ /** A protected content type marks a Start-serialized body the client decodes. */
192
+ function isSerializedResponse(protectedHeaders) {
193
+ return typeof protectedHeaders?.get("content-type") === "string";
194
+ }
195
+ /**
196
+ * A helper status that forbids a body never applies to a serialized
197
+ * server-function reply, because the client must decode it. Only a HEAD request
198
+ * drops its body.
199
+ */
200
+ function getHelperStatus(state, serialized) {
201
+ const status = state?.status;
202
+ if (!serialized || status === void 0 || canHaveBody("GET", status)) return status;
203
+ }
204
+ /** Helper status text describes the helper status and is ignored with it. */
205
+ function getHelperStatusText(state, helperStatus) {
206
+ return helperStatus === state?.status ? state?.statusText : void 0;
207
+ }
208
+ function cancelDroppedBody(response, reason) {
209
+ try {
210
+ response.body?.cancel(reason).catch(() => {});
211
+ } catch {}
212
+ }
213
+ function createReconciledResponse(body, status, statusText, headers) {
214
+ try {
215
+ return new Response(body, {
216
+ status,
217
+ statusText,
218
+ headers
219
+ });
220
+ } catch (cause) {
221
+ throw new Error("Unable to reconcile response because its body has already been consumed or locked.", { cause });
222
+ }
223
+ }
224
+ /** Apply helper state to a response that leaves Start. */
225
+ function finalizeResponse(response, event) {
226
+ return applyResponseState(response, event, event.request.method);
227
+ }
228
+ /**
229
+ * Apply helper state with the body rules of `method`. Request middleware still
230
+ * reads a HEAD response's body, so the pipeline applies GET rules and strips a
231
+ * HEAD body only when the response leaves it.
232
+ */
233
+ function applyResponseState(response, event, method, disposeBody) {
234
+ const protectedHeaders = getProtectedResponseHeaders(response);
235
+ const serialized = isSerializedResponse(protectedHeaders);
236
+ let helperStatus = getHelperStatus(event.responseState, serialized);
237
+ const mustDropBody = !canHaveBody(method, helperStatus ?? response.status) && response.body !== null;
238
+ if (mustDropBody) {
239
+ const reason = method === "HEAD" ? "HEAD body stripped" : "Response body dropped by Start reconciliation";
240
+ if (disposeBody) disposeBody(reason);
241
+ else cancelDroppedBody(response, reason);
242
+ helperStatus = getHelperStatus(event.responseState, serialized);
243
+ }
244
+ const state = event.responseState;
245
+ if (!state && !mustDropBody) {
246
+ event.currentResponse = response;
247
+ return response;
248
+ }
249
+ const status = helperStatus ?? response.status;
250
+ const statusText = getHelperStatusText(state, helperStatus) ?? response.statusText;
251
+ const statusChanged = status !== response.status;
252
+ const statusTextChanged = statusText !== response.statusText;
253
+ const headers = state ? applyHeaderState(response.headers, state, serialized, protectedHeaders, event.responseHeaderAppends?.get(response)) : response.headers;
254
+ const reconciled = statusChanged || statusTextChanged || mustDropBody || headers !== response.headers ? createReconciledResponse(mustDropBody ? null : response.body, status, statusText, headers) : response;
255
+ if (protectedHeaders && reconciled !== response) installProtectedResponseHeaders(reconciled, protectedHeaders);
256
+ return publishResponse(reconciled, event);
257
+ }
258
+ function publishResponse(response, event) {
259
+ const headerAppends = event.responseState?.headerAppends;
260
+ if (headerAppends?.size) (event.responseHeaderAppends ||= /* @__PURE__ */ new WeakMap()).set(response, new Map(headerAppends));
261
+ event.currentResponse = response;
262
+ return response;
263
+ }
264
+ function getHttpErrorStatus(status) {
265
+ return status !== void 0 && status >= 400 ? status : void 0;
266
+ }
267
+ /**
268
+ * Status for a response built from an uncaught error. Only an error status
269
+ * (400-599) from a helper or from error metadata describes the failure, so a
270
+ * success or redirect status set before the throw cannot hide it. The error is
271
+ * logged unless its own metadata marks it as an HTTP error. Reporting runs
272
+ * before helper state is read, so hooks that write helpers are included.
273
+ */
274
+ function resolveErrorStatus(error, event) {
275
+ const metadataStatus = getErrorStatus(error);
276
+ const errorStatus = getHttpErrorStatus(metadataStatus);
277
+ if (errorStatus === void 0) console.error(error);
278
+ const state = event?.responseState;
279
+ const helperStatus = getHttpErrorStatus(state?.status);
280
+ const status = helperStatus ?? errorStatus ?? 500;
281
+ const statusText = getHelperStatusText(state, helperStatus) ?? (status === errorStatus || metadataStatus === void 0 ? getErrorStatusText(error) : void 0) ?? "";
282
+ if (state && state.status !== helperStatus) {
283
+ state.status = void 0;
284
+ state.statusText = void 0;
285
+ }
286
+ return {
287
+ status,
288
+ statusText
289
+ };
290
+ }
291
+ /**
292
+ * Internal: status and status text for a serialized server-function error.
293
+ * Logs the error and discards a non-error helper status, like any error
294
+ * response Start builds.
295
+ */
296
+ function resolveErrorResponseStatus(error) {
297
+ return resolveErrorStatus(error, eventStorage.getStore());
298
+ }
299
+ function createErrorResponse(error, event) {
300
+ let headers = getErrorHeaders(error) ?? new Headers();
301
+ const { status, statusText } = resolveErrorStatus(error, event);
302
+ const state = event.responseState;
303
+ const body = canHaveBody(event.request.method, status) ? JSON.stringify({
304
+ status,
305
+ statusText,
306
+ unhandled: true,
307
+ message: "HTTPError"
308
+ }) : null;
309
+ if (!headers.has("content-type")) headers.set("content-type", "application/json");
310
+ if (state) headers = applyHeaderState(headers, state, true);
311
+ return publishResponse(new Response(body !== null && !headers.has("content-type") ? new TextEncoder().encode(body) : body, {
312
+ status,
313
+ statusText,
314
+ headers
315
+ }), event);
316
+ }
317
+ function finalizeError(error, event) {
318
+ if (error instanceof Response) return finalizeResponse(error, event);
319
+ return createErrorResponse(error, event);
320
+ }
321
+ function handleStartError(error) {
322
+ const event = eventStorage.getStore();
323
+ if (event) return finalizeError(error, event);
324
+ if (error instanceof Response) return error;
325
+ const request = new Request("http://localhost");
326
+ return createErrorResponse(error, {
327
+ request,
328
+ requestUrl: new URL(request.url)
52
329
  });
53
- if (value instanceof Response) mergeEventResponseHeaders(value, event);
54
- return value;
55
330
  }
56
- function requestHandler(handler) {
57
- return (request, requestOpts) => {
58
- let h3Event;
331
+ /** Apply helper state to a response inside the request middleware pipeline. */
332
+ function reconcileResponse(response, event, disposeBody) {
333
+ if (!event.responseState && (response === event.currentResponse || canHaveBody("GET", response.status)) || isRedirect(response)) {
334
+ event.currentResponse = response;
335
+ return response;
336
+ }
337
+ return applyResponseState(response, event, "GET", disposeBody);
338
+ }
339
+ /**
340
+ * Restore protocol headers that middleware changed directly on the response.
341
+ * Start does this once, when the response leaves the request middleware
342
+ * pipeline; helper writes never override them.
343
+ */
344
+ function restoreResponseProtocol(response, event) {
345
+ const protectedHeaders = getProtectedResponseHeaders(response);
346
+ if (!protectedHeaders || !hasProtectedHeaderChanges(response, protectedHeaders)) return response;
347
+ const headers = new Headers(response.headers);
348
+ applyProtectedHeaders(protectedHeaders, headers);
349
+ const restored = createReconciledResponse(response.body, response.status, response.statusText, headers);
350
+ transferResponseMetadata(response, restored);
351
+ event.currentResponse = restored;
352
+ return restored;
353
+ }
354
+ /**
355
+ * Build a Start-owned serialized reply with already normalized protocol
356
+ * headers. A bodyless helper status never applies to it; only a HEAD request
357
+ * drops its body.
358
+ */
359
+ function createFinalizedResponse(body, headers, protectedHeaders, event) {
360
+ const state = event.responseState;
361
+ let status = 200;
362
+ let statusText = "";
363
+ if (state) {
364
+ const helperStatus = getHelperStatus(state, true);
365
+ status = helperStatus ?? 200;
366
+ statusText = getHelperStatusText(state, helperStatus) ?? "";
367
+ headers = applyHeaderState(headers, state, true, protectedHeaders);
368
+ }
369
+ const response = new Response(canHaveBody(event.request.method, status) ? body : null, {
370
+ status,
371
+ statusText,
372
+ headers
373
+ });
374
+ installProtectedResponseHeaders(response, protectedHeaders);
375
+ return publishResponse(response, event);
376
+ }
377
+ function protectResponseHeaders(response, headers) {
378
+ const previous = getProtectedResponseHeaders(response);
379
+ if (previous === headers) return;
380
+ if (previous) {
381
+ const merged = new Map(previous);
382
+ for (const [name, value] of headers) merged.set(name, value);
383
+ headers = merged;
384
+ }
385
+ installProtectedResponseHeaders(response, headers);
386
+ }
387
+ /**
388
+ * Set and protect transport headers on a new response. Reuse the body stream
389
+ * without cloning or teeing it; callers transfer ownership to the result.
390
+ */
391
+ function setProtectedResponseHeaders(response, headers) {
392
+ let next;
393
+ try {
394
+ next = new Response(response.body, response);
395
+ applyProtectedHeaders(headers, next.headers);
396
+ } catch (cause) {
397
+ throw new Error("Unable to set response header because its body has already been consumed or locked.", { cause });
398
+ }
399
+ transferResponseMetadata(response, next);
400
+ protectResponseHeaders(next, headers);
401
+ return next;
402
+ }
403
+ function decodePathname(pathname) {
404
+ try {
405
+ return decodeURI(pathname);
406
+ } catch (error) {
407
+ if (error instanceof URIError) return;
408
+ throw error;
409
+ }
410
+ }
411
+ function runInStartRequest(request, requestOpts, handler) {
412
+ let requestUrl;
413
+ try {
414
+ requestUrl = new URL(request.url);
415
+ } catch (error) {
416
+ if (error instanceof TypeError) return new Response(null, {
417
+ status: 400,
418
+ statusText: "Bad Request"
419
+ });
420
+ throw error;
421
+ }
422
+ const pathname = requestUrl.pathname;
423
+ if (pathname.includes("%") && decodePathname(pathname) === void 0) return new Response(null, {
424
+ status: 400,
425
+ statusText: "Bad Request"
426
+ });
427
+ const event = {
428
+ request,
429
+ requestUrl
430
+ };
431
+ return eventStorage.run(event, handler, request, requestOpts, event);
432
+ }
433
+ /**
434
+ * Keep the complete server entry, including custom error handling, inside one
435
+ * request scope. A custom returned response is used as-is; call handleStartError
436
+ * in a custom catch to preserve Start's response helper state.
437
+ */
438
+ function createServerEntry$1(entry) {
439
+ return { fetch: withStartRequest(async (request, requestOpts) => {
59
440
  try {
60
- h3Event = new H3Event(request);
441
+ return await entry.fetch(request, requestOpts);
61
442
  } catch (error) {
62
- if (error instanceof URIError) return new Response(null, {
63
- status: 400,
64
- statusText: "Bad Request"
65
- });
66
- throw error;
443
+ return handleStartError(error);
67
444
  }
68
- return toResponse(attachResponseHeaders(eventStorage.run({ h3Event }, () => handler(request, requestOpts)), h3Event), h3Event);
445
+ }) };
446
+ }
447
+ /**
448
+ * Establish request scope; the response pipeline owns reconciliation. A nested
449
+ * handler delegating the same request participates in its scope. Independent
450
+ * fetch invocations and different requests get a fresh event.
451
+ */
452
+ function withStartRequest(handler) {
453
+ return (request, requestOpts) => {
454
+ const event = eventStorage.getStore();
455
+ if (event?.request === request) return handler(request, requestOpts, event);
456
+ return runInStartRequest(request, requestOpts, handler);
69
457
  };
70
458
  }
71
- function getH3Event() {
459
+ function getStartEvent() {
72
460
  const event = eventStorage.getStore();
73
461
  if (!event) throw new Error(`No StartEvent found in AsyncLocalStorage. Make sure you are using the function within the server runtime.`);
74
- return event.h3Event;
462
+ return event;
75
463
  }
76
- function getResponse() {
77
- return getH3Event().res;
464
+ /**
465
+ * Internal: returns the per-request parsed URL for `request`, memoized on the
466
+ * Start event so the framework parses each request URL only once. Falls back
467
+ * to parsing when called outside a Start event (e.g. in unit tests) or for a
468
+ * foreign request. Callers MUST NOT mutate the returned URL.
469
+ */
470
+ function getParsedRequestUrl(request) {
471
+ const event = eventStorage.getStore();
472
+ if (event && event.request === request) return event.requestUrl;
473
+ return new URL(request.url);
474
+ }
475
+ /**
476
+ * Internal: helper status state for a serialized server-function reply.
477
+ * Bodyless statuses never apply to it and are omitted with their status text.
478
+ */
479
+ function getSerializedResponseState() {
480
+ const state = getStartEvent().responseState;
481
+ const status = getHelperStatus(state, true);
482
+ return {
483
+ status,
484
+ statusText: getHelperStatusText(state, status)
485
+ };
78
486
  }
79
487
  //#endregion
80
488
  //#region node_modules/@tanstack/start-server-core/dist/esm/constants.js
@@ -91,7 +499,7 @@ var HEADERS = { TSS_SHELL: "X-TSS_SHELL" };
91
499
  * the dev styles URL for route-scoped CSS collection.
92
500
  */
93
501
  async function getStartManifest(matchedRoutes) {
94
- const { tsrStartManifest } = await import("./assets/_tanstack-start-manifest_v-DNIp6gp3.js");
502
+ const { tsrStartManifest } = await import("./assets/_tanstack-start-manifest_v-Drm3Ru6D.js");
95
503
  const startManifest = tsrStartManifest();
96
504
  let routes = startManifest.routes;
97
505
  routes[rootRouteId];
@@ -152,7 +560,7 @@ var GLOBAL_STORAGE_KEY = Symbol.for("tanstack-start:start-storage-context");
152
560
  var globalObj = globalThis;
153
561
  if (!globalObj[GLOBAL_STORAGE_KEY]) globalObj[GLOBAL_STORAGE_KEY] = new AsyncLocalStorage();
154
562
  var startStorage = globalObj[GLOBAL_STORAGE_KEY];
155
- async function runWithStartContext(context, fn) {
563
+ function runWithStartContext(context, fn) {
156
564
  return startStorage.run(context, fn);
157
565
  }
158
566
  function getStartContext(opts) {
@@ -308,7 +716,8 @@ function createMultiplexedStream(recordStream, options = {}) {
308
716
  if (!(value instanceof Uint8Array)) throw new TypeError("RawStream chunks must be Uint8Array");
309
717
  let offset = 0;
310
718
  do {
311
- const frameAdmission = admitFrame(1, streamId, value.byteLength <= 16777216 ? value : value.subarray(offset, offset + MAX_FRAME_PAYLOAD_SIZE));
719
+ const chunk = value.byteLength <= 16777216 ? value : value.subarray(offset, offset + MAX_FRAME_PAYLOAD_SIZE);
720
+ const frameAdmission = admitFrame(1, streamId, chunk);
312
721
  if (frameAdmission !== true && (frameAdmission === false || !await frameAdmission)) return;
313
722
  offset += MAX_FRAME_PAYLOAD_SIZE;
314
723
  } while (offset < value.byteLength);
@@ -379,10 +788,18 @@ function isSafeKey(key) {
379
788
  function safeObjectMerge(target, source) {
380
789
  const result = Object.create(null);
381
790
  if (target) {
382
- for (const key of Object.keys(target)) if (isSafeKey(key)) result[key] = target[key];
791
+ const keys = Object.keys(target);
792
+ for (let i = 0; i < keys.length; i++) {
793
+ const key = keys[i];
794
+ if (isSafeKey(key)) result[key] = target[key];
795
+ }
383
796
  }
384
797
  if (source && typeof source === "object") {
385
- for (const key of Object.keys(source)) if (isSafeKey(key)) result[key] = source[key];
798
+ const keys = Object.keys(source);
799
+ for (let i = 0; i < keys.length; i++) {
800
+ const key = keys[i];
801
+ if (isSafeKey(key)) result[key] = source[key];
802
+ }
386
803
  }
387
804
  return result;
388
805
  }
@@ -390,10 +807,7 @@ function safeObjectMerge(target, source) {
390
807
  * Create a null-prototype object, optionally copying from source.
391
808
  */
392
809
  function createNullProtoObject(source) {
393
- if (!source) return Object.create(null);
394
- const obj = Object.create(null);
395
- for (const key of Object.keys(source)) if (isSafeKey(key)) obj[key] = source[key];
396
- return obj;
810
+ return source ? safeObjectMerge(source, void 0) : Object.create(null);
397
811
  }
398
812
  //#endregion
399
813
  //#region node_modules/@tanstack/start-client-core/dist/esm/getStartContextServerOnly.js
@@ -403,21 +817,14 @@ var getStartContextServerOnly = getStartContext;
403
817
  var createServerFn = (options, __opts) => {
404
818
  const resolvedOptions = __opts || options || {};
405
819
  if (typeof resolvedOptions.method === "undefined") resolvedOptions.method = "GET";
406
- const setValidator = (validator) => {
407
- return createServerFn(void 0, {
408
- ...resolvedOptions,
409
- validator,
410
- inputValidator: validator
411
- });
412
- };
413
820
  const res = {
414
821
  options: resolvedOptions,
415
822
  middleware: (middleware) => {
416
823
  const newMiddleware = [...resolvedOptions.middleware || []];
417
- middleware.map((m) => {
418
- if (TSS_SERVER_FUNCTION_FACTORY in m) {
419
- if (m.options.middleware) newMiddleware.push(...m.options.middleware);
420
- } else newMiddleware.push(m);
824
+ middleware.forEach((item) => {
825
+ if (TSS_SERVER_FUNCTION_FACTORY in item) {
826
+ if (item.options.middleware) newMiddleware.push(...item.options.middleware);
827
+ } else newMiddleware.push(item);
421
828
  });
422
829
  const res = createServerFn(void 0, {
423
830
  ...resolvedOptions,
@@ -426,8 +833,12 @@ var createServerFn = (options, __opts) => {
426
833
  res[TSS_SERVER_FUNCTION_FACTORY] = true;
427
834
  return res;
428
835
  },
429
- validator: setValidator,
430
- inputValidator: setValidator,
836
+ validator: (validator) => {
837
+ return createServerFn(void 0, {
838
+ ...resolvedOptions,
839
+ validator
840
+ });
841
+ },
431
842
  handler: (...args) => {
432
843
  const [extractedFn, serverFn] = args;
433
844
  const newOptions = {
@@ -447,28 +858,29 @@ var createServerFn = (options, __opts) => {
447
858
  fetch: opts?.fetch,
448
859
  context: createNullProtoObject()
449
860
  });
450
- const redirect = parseRedirect(result.error);
451
- if (redirect) throw redirect;
452
- if (result.error) throw result.error;
861
+ if ("error" in result) throw parseRedirect(result.error) ?? result.error;
453
862
  return result.result;
454
863
  }, {
455
864
  ...extractedFn,
456
865
  method: resolvedOptions.method,
457
- __executeServer: async (opts) => {
866
+ __executeServer: isServer ?? typeof window === "undefined" ? async (opts) => {
458
867
  const startContext = getStartContextServerOnly();
459
868
  const serverContextAfterGlobalMiddlewares = startContext.contextAfterGlobalMiddlewares;
460
- return await executeMiddleware$1(resolvedMiddleware, "server", {
869
+ const ctx = {
461
870
  ...extractedFn,
462
- ...opts,
871
+ data: opts.data,
872
+ method: opts.method ?? resolvedOptions.method,
463
873
  serverFnMeta: extractedFn.serverFnMeta,
464
874
  context: safeObjectMerge(opts.context, serverContextAfterGlobalMiddlewares),
465
875
  request: startContext.request
466
- }).then((d) => ({
467
- result: d.result,
468
- error: d.error,
469
- context: d.sendContext
470
- }));
471
- }
876
+ };
877
+ const result = await executeMiddleware$1(resolvedMiddleware, "server", ctx);
878
+ if ("error" in result) return { error: result.error };
879
+ return result.sendContext === void 0 ? { result: result.result } : {
880
+ result: result.result,
881
+ context: result.sendContext
882
+ };
883
+ } : void 0
472
884
  });
473
885
  }
474
886
  };
@@ -480,72 +892,71 @@ var createServerFn = (options, __opts) => {
480
892
  };
481
893
  return Object.assign(fun, res);
482
894
  };
895
+ function mergeOptionalSendContext(target, source) {
896
+ return target === void 0 && source === void 0 ? void 0 : safeObjectMerge(target, source);
897
+ }
898
+ function mergeOptionalHeaders(target, source) {
899
+ return target || source ? mergeHeaders(target, source) : void 0;
900
+ }
483
901
  async function executeMiddleware$1(middlewares, env, opts) {
484
- let flattenedMiddlewares = flattenMiddlewares([...getStartOptions()?.functionMiddleware || [], ...middlewares]);
485
- if (env === "server") {
486
- const startContext = getStartContextServerOnly({ throwIfNotFound: false });
487
- if (startContext?.executedRequestMiddlewares) flattenedMiddlewares = flattenedMiddlewares.filter((m) => !startContext.executedRequestMiddlewares.has(m));
488
- }
489
- const callNextMiddleware = async (ctx) => {
490
- const nextMiddleware = flattenedMiddlewares.shift();
491
- if (!nextMiddleware) return ctx;
492
- try {
493
- let validator = "validator" in nextMiddleware.options ? nextMiddleware.options.validator : void 0;
494
- if (!validator && "inputValidator" in nextMiddleware.options) validator = nextMiddleware.options.inputValidator;
902
+ const flattenedMiddlewares = flattenMiddlewares((getStartOptions()?.functionMiddleware || []).concat(middlewares), void 0, env === "server" ? new Set(getStartContextServerOnly({ throwIfNotFound: false })?.executedRequestMiddlewares) : void 0);
903
+ let index = 0;
904
+ const callNextMiddleware = async (callerCtx, userCtx) => {
905
+ let ctx = callerCtx;
906
+ if (userCtx !== void 0) {
907
+ ctx = {
908
+ ...callerCtx,
909
+ ...userCtx
910
+ };
911
+ ctx.context = safeObjectMerge(callerCtx.context, userCtx.context);
912
+ ctx.sendContext = mergeOptionalSendContext(callerCtx.sendContext, userCtx.sendContext);
913
+ ctx.headers = mergeOptionalHeaders(callerCtx.headers, userCtx.headers);
914
+ ctx._callSiteFetch = callerCtx._callSiteFetch;
915
+ ctx.fetch = callerCtx._callSiteFetch ?? userCtx.fetch ?? callerCtx.fetch;
916
+ ctx.result = userCtx.result !== void 0 ? userCtx.result : userCtx instanceof Response ? userCtx : callerCtx.result;
917
+ }
918
+ let result = ctx;
919
+ while (index < flattenedMiddlewares.length) {
920
+ const options = flattenedMiddlewares[index++].options;
921
+ const validator = options.validator;
495
922
  if (validator && env === "server") ctx.data = await execValidator(validator, ctx.data);
496
- let middlewareFn = void 0;
497
- if (env === "client") {
498
- if ("client" in nextMiddleware.options) middlewareFn = nextMiddleware.options.client;
499
- } else if ("server" in nextMiddleware.options) middlewareFn = nextMiddleware.options.server;
923
+ const middlewareFn = env === "client" ? options.client : options.server;
500
924
  if (middlewareFn) {
501
- const userNext = async (userCtx = {}) => {
502
- const result = await callNextMiddleware({
503
- ...ctx,
504
- ...userCtx,
505
- context: safeObjectMerge(ctx.context, userCtx.context),
506
- sendContext: safeObjectMerge(ctx.sendContext, userCtx.sendContext),
507
- headers: mergeHeaders(ctx.headers, userCtx.headers),
508
- _callSiteFetch: ctx._callSiteFetch,
509
- fetch: ctx._callSiteFetch ?? userCtx.fetch ?? ctx.fetch,
510
- result: userCtx.result !== void 0 ? userCtx.result : userCtx instanceof Response ? userCtx : ctx.result,
511
- error: userCtx.error ?? ctx.error
512
- });
513
- if (result.error) throw result.error;
514
- return result;
515
- };
516
- const result = await middlewareFn({
925
+ result = await middlewareFn({
517
926
  ...ctx,
518
- next: userNext
927
+ next: (nextCtx = {}) => callNextMiddleware(ctx, nextCtx)
519
928
  });
520
- if (isRedirect(result)) return {
521
- ...ctx,
522
- error: result
523
- };
524
- if (result instanceof Response) return {
525
- ...ctx,
526
- result
527
- };
528
- if (!result) throw new Error("User middleware returned undefined. You must call next() or return a result in your middlewares.");
529
- return result;
929
+ if (result instanceof Response) {
930
+ if (isRedirect(result)) throw result;
931
+ result = {
932
+ ...ctx,
933
+ result
934
+ };
935
+ } else if (!result) throw new Error("User middleware returned undefined. You must call next() or return a result in your middlewares.");
936
+ break;
530
937
  }
531
- return callNextMiddleware(ctx);
532
- } catch (error) {
533
- return {
534
- ...ctx,
535
- error
536
- };
537
938
  }
939
+ if ("error" in result) throw result.error;
940
+ return result;
538
941
  };
539
- return callNextMiddleware({
942
+ const initialCtx = {
540
943
  ...opts,
541
- headers: opts.headers || {},
542
- sendContext: opts.sendContext || {},
944
+ headers: opts.headers || (env === "client" ? {} : void 0),
945
+ sendContext: opts.sendContext,
543
946
  context: opts.context || createNullProtoObject(),
544
947
  _callSiteFetch: opts.fetch
545
- });
948
+ };
949
+ if (initialCtx.sendContext !== void 0) initialCtx.sendContext ||= {};
950
+ try {
951
+ return await callNextMiddleware(initialCtx);
952
+ } catch (error) {
953
+ return {
954
+ ...initialCtx,
955
+ error
956
+ };
957
+ }
546
958
  }
547
- function flattenMiddlewares(middlewares, maxDepth = 100) {
548
- const seen = /* @__PURE__ */ new Set();
959
+ function flattenMiddlewares(middlewares, maxDepth = 100, seen = /* @__PURE__ */ new Set()) {
549
960
  const flattened = [];
550
961
  const recurse = (middleware, depth) => {
551
962
  if (depth > maxDepth) throw new Error(`Middleware nesting depth exceeded maximum of ${maxDepth}. Check for circular references.`);
@@ -575,7 +986,7 @@ function serverFnBaseToMiddleware(options) {
575
986
  return {
576
987
  "~types": void 0,
577
988
  options: {
578
- inputValidator: options.validator ?? options.inputValidator,
989
+ validator: options.validator,
579
990
  client: async ({ next, sendContext, fetch, ...ctx }) => {
580
991
  const payload = {
581
992
  ...ctx,
@@ -584,13 +995,13 @@ function serverFnBaseToMiddleware(options) {
584
995
  };
585
996
  return next(await options.extractedFn?.(payload));
586
997
  },
587
- server: async ({ next, ...ctx }) => {
998
+ server: isServer ?? typeof window === "undefined" ? async ({ next: _next, ...ctx }) => {
588
999
  const result = await options.serverFn?.(ctx);
589
- return next({
1000
+ return {
590
1001
  ...ctx,
591
1002
  result
592
- });
593
- }
1003
+ };
1004
+ } : void 0
594
1005
  }
595
1006
  };
596
1007
  }
@@ -601,19 +1012,14 @@ var createMiddleware = (options, __opts) => {
601
1012
  type: "request",
602
1013
  ...__opts || options
603
1014
  };
604
- const setValidator = (validator) => {
605
- return createMiddleware({}, Object.assign(resolvedOptions, {
606
- validator,
607
- inputValidator: validator
608
- }));
609
- };
610
1015
  return {
611
1016
  options: resolvedOptions,
612
1017
  middleware: (middleware) => {
613
1018
  return createMiddleware({}, Object.assign(resolvedOptions, { middleware }));
614
1019
  },
615
- validator: setValidator,
616
- inputValidator: setValidator,
1020
+ validator: (validator) => {
1021
+ return createMiddleware({}, Object.assign(resolvedOptions, { validator }));
1022
+ },
617
1023
  client: (client) => {
618
1024
  return createMiddleware({}, Object.assign(resolvedOptions, { client }));
619
1025
  },
@@ -625,19 +1031,33 @@ var createMiddleware = (options, __opts) => {
625
1031
  //#endregion
626
1032
  //#region node_modules/@tanstack/start-client-core/dist/esm/createCsrfMiddleware.js
627
1033
  var innerCreateCsrfMiddleware = (opts = {}) => {
628
- return createMiddleware().server(async (ctx) => {
1034
+ const continueRequest = (result, ctx) => {
1035
+ return isValidationResultAllowed(result, opts) ? ctx.next() : getFailureResponse(opts, ctx);
1036
+ };
1037
+ const validateRequest = (ctx) => {
1038
+ const result = validateCsrfRequest(opts, ctx);
1039
+ if (isPromise(result)) return result.then((result) => continueRequest(result, ctx));
1040
+ return continueRequest(result, ctx);
1041
+ };
1042
+ return createMiddleware().server((ctx) => {
629
1043
  const csrfCtx = ctx;
630
- if (opts.filter && !await opts.filter(csrfCtx)) return ctx.next();
631
- if (await isCsrfRequestAllowed(opts, csrfCtx)) return ctx.next();
632
- return getFailureResponse(opts, csrfCtx);
1044
+ try {
1045
+ if (opts.filter) {
1046
+ const shouldValidate = opts.filter(csrfCtx);
1047
+ if (isPromise(shouldValidate)) return shouldValidate.then((shouldValidate) => shouldValidate ? validateRequest(csrfCtx) : ctx.next());
1048
+ if (!shouldValidate) return ctx.next();
1049
+ }
1050
+ return validateRequest(csrfCtx);
1051
+ } catch (error) {
1052
+ return Promise.reject(error);
1053
+ }
633
1054
  });
634
1055
  };
635
1056
  var createCsrfMiddleware = innerCreateCsrfMiddleware;
636
- async function isCsrfRequestAllowed(opts, ctx) {
637
- const result = await getCsrfRequestValidationResult(opts, ctx);
1057
+ function isValidationResultAllowed(result, opts) {
638
1058
  return result === true || result === void 0 && opts.allowRequestsWithoutOriginCheck === true;
639
1059
  }
640
- async function getCsrfRequestValidationResult(opts, ctx) {
1060
+ function validateCsrfRequest(opts, ctx) {
641
1061
  const fetchSite = ctx.request.headers.get("Sec-Fetch-Site");
642
1062
  if (fetchSite !== null) return matchValue(opts.secFetchSite ?? "same-origin", fetchSite, ctx);
643
1063
  const origin = ctx.request.headers.get("Origin");
@@ -654,7 +1074,7 @@ async function getCsrfRequestValidationResult(opts, ctx) {
654
1074
  }
655
1075
  return isRefererSameOrigin(referer, new URL(ctx.request.url).origin);
656
1076
  }
657
- async function matchValue(matcher, value, ctx) {
1077
+ function matchValue(matcher, value, ctx) {
658
1078
  if (typeof matcher === "function") return matcher(value, ctx);
659
1079
  if (Array.isArray(matcher)) return matcher.includes(value);
660
1080
  return value === matcher;
@@ -673,14 +1093,45 @@ function isRefererSameOrigin(referer, requestOrigin) {
673
1093
  const code = referer.charCodeAt(requestOrigin.length);
674
1094
  return code === 47 || code === 63 || code === 35;
675
1095
  }
676
- async function getFailureResponse(opts, ctx) {
1096
+ function getFailureResponse(opts, ctx) {
677
1097
  if (typeof opts.failureResponse === "function") return opts.failureResponse(ctx);
678
1098
  return opts.failureResponse?.clone() ?? new Response("Forbidden", { status: 403 });
679
1099
  }
680
1100
  //#endregion
681
1101
  //#region node_modules/@tanstack/start-server-core/dist/esm/server-functions-handler.js
682
- var serovalPlugins = void 0;
683
- var FORM_DATA_CONTENT_TYPES = ["multipart/form-data", "application/x-www-form-urlencoded"];
1102
+ var SERIALIZED_JSON_HEADERS = /* @__PURE__ */ new Map([
1103
+ ["content-type", "application/json"],
1104
+ [X_TSS_SERIALIZED, "true"],
1105
+ [X_TSS_RAW_RESPONSE, null],
1106
+ ["location", null]
1107
+ ]);
1108
+ var SERIALIZED_JSON_HEADER_INIT = new Headers({
1109
+ "content-type": "application/json",
1110
+ [X_TSS_SERIALIZED]: "true"
1111
+ });
1112
+ /** Completed bytes own no stream until the request pipeline accepts them. */
1113
+ var DeferredResponse = class {
1114
+ constructor(body) {
1115
+ this.body = body;
1116
+ }
1117
+ createResponse(event) {
1118
+ return createFinalizedResponse(this.body, SERIALIZED_JSON_HEADER_INIT, SERIALIZED_JSON_HEADERS, event);
1119
+ }
1120
+ };
1121
+ var SERIALIZED_FRAMED_HEADERS = /* @__PURE__ */ new Map([
1122
+ ["content-type", TSS_CONTENT_TYPE_FRAMED_VERSIONED],
1123
+ [X_TSS_SERIALIZED, "true"],
1124
+ [X_TSS_RAW_RESPONSE, null],
1125
+ ["location", null]
1126
+ ]);
1127
+ var NOT_FOUND_HEADERS = /* @__PURE__ */ new Map([
1128
+ ["content-type", "application/json"],
1129
+ [X_TSS_SERIALIZED, null],
1130
+ [X_TSS_RAW_RESPONSE, null],
1131
+ ["location", null]
1132
+ ]);
1133
+ var RAW_RESPONSE_HEADERS = /* @__PURE__ */ new Map([[X_TSS_RAW_RESPONSE, "true"]]);
1134
+ var THROWN_RESPONSE_HEADERS = /* @__PURE__ */ new Map([[X_TSS_RAW_RESPONSE, "thrown"]]);
684
1135
  var MAX_PAYLOAD_SIZE = 1e6;
685
1136
  var MAX_PENDING_SERIALIZATION_RECORDS = 1024;
686
1137
  var MAX_PENDING_SERIALIZATION_BYTES = 33554432;
@@ -699,82 +1150,104 @@ function runSerializationCleanup(dispose) {
699
1150
  function cancelRawStream(stream, reason) {
700
1151
  stream.cancel(reason).catch(() => {});
701
1152
  }
702
- var handleServerAction = async ({ request, context, serverFnId }) => {
1153
+ /**
1154
+ * Marks a Response thrown during a server-function request so the client
1155
+ * rejects the call with it. Redirects keep their own protocol.
1156
+ */
1157
+ function toThrownServerFnResponse(response) {
1158
+ return isRedirect(response) ? response : setProtectedResponseHeaders(response, THROWN_RESPONSE_HEADERS);
1159
+ }
1160
+ /**
1161
+ * Builds the reply for a server-function request that failed outside the
1162
+ * function, such as in request middleware. Like a failed call, it carries
1163
+ * only the thrown value under an `error` key, so the client rethrows it.
1164
+ */
1165
+ async function createServerFnErrorResponse(error, serovalPlugins) {
1166
+ if (isNotFound(error)) return isNotFoundResponse(error);
1167
+ const headers = getErrorHeaders(error) ?? new Headers();
1168
+ const { status, statusText } = resolveErrorResponseStatus(error);
1169
+ headers.set("Content-Type", "application/json");
1170
+ headers.set(X_TSS_SERIALIZED, "true");
1171
+ headers.delete(X_TSS_RAW_RESPONSE);
1172
+ headers.delete("location");
1173
+ const plugins = serovalPlugins ?? getSerovalPlugins(defaultSerovalDeserializerPlugins);
1174
+ let serializedError;
1175
+ try {
1176
+ serializedError = JSON.stringify(await toCrossJSONAsync({ error }, {
1177
+ refs: /* @__PURE__ */ new Map(),
1178
+ plugins
1179
+ }));
1180
+ } catch (serializationError) {
1181
+ serializedError = JSON.stringify(await toCrossJSONAsync({ error: serializationError }, {
1182
+ refs: /* @__PURE__ */ new Map(),
1183
+ plugins
1184
+ }));
1185
+ }
1186
+ const errorResponse = new Response(serializedError, {
1187
+ status,
1188
+ statusText,
1189
+ headers
1190
+ });
1191
+ protectResponseHeaders(errorResponse, SERIALIZED_JSON_HEADERS);
1192
+ return errorResponse;
1193
+ }
1194
+ var handleServerAction = async ({ request, serverFnId }) => {
703
1195
  const methodUpper = request.method.toUpperCase();
704
- const url = new URL(request.url);
705
1196
  const action = await getServerFnById(serverFnId, { origin: "client" });
706
1197
  if (action.method && methodUpper !== action.method) return new Response(`expected ${action.method} method. Got ${methodUpper}`, {
707
1198
  status: 405,
708
1199
  headers: { Allow: action.method }
709
1200
  });
710
- const isServerFn = request.headers.get("x-tsr-serverFn") === "true";
711
- serovalPlugins ??= getSerovalPlugins(defaultSerovalDeserializerPlugins);
712
- const contentType = request.headers.get("Content-Type");
1201
+ const headers = request.headers;
1202
+ const isServerFn = headers.get("x-tsr-serverfn") === "true";
1203
+ let serovalPlugins;
1204
+ const getRequestSerovalPlugins = () => {
1205
+ return serovalPlugins ??= getSerovalPlugins(defaultSerovalDeserializerPlugins);
1206
+ };
1207
+ const contentType = headers.get("content-type");
713
1208
  try {
714
1209
  let res;
715
- if (FORM_DATA_CONTENT_TYPES.some((type) => contentType && contentType.includes(type))) {
1210
+ if (contentType && (contentType.includes("multipart/form-data") || contentType.includes("application/x-www-form-urlencoded"))) {
716
1211
  if (methodUpper === "GET") invariant();
717
1212
  const formData = await request.formData();
718
1213
  const serializedContext = formData.get(TSS_FORMDATA_CONTEXT);
719
1214
  formData.delete(TSS_FORMDATA_CONTEXT);
720
1215
  const params = {
721
- context,
722
1216
  data: formData,
723
1217
  method: methodUpper
724
1218
  };
725
1219
  if (typeof serializedContext === "string") try {
726
- const deserializedContext = fromJSON(JSON.parse(serializedContext), { plugins: serovalPlugins });
727
- if (typeof deserializedContext === "object" && deserializedContext) params.context = safeObjectMerge(deserializedContext, context);
1220
+ const parsedContext = JSON.parse(serializedContext);
1221
+ const deserializedContext = fromJSON(parsedContext, { plugins: getRequestSerovalPlugins() });
1222
+ if (typeof deserializedContext === "object" && deserializedContext) params.context = deserializedContext;
728
1223
  } catch (e) {}
729
1224
  res = await action(params);
730
- } else if (methodUpper === "GET") {
731
- const payloadParam = url.searchParams.get("payload");
732
- if (payloadParam && payloadParam.length > MAX_PAYLOAD_SIZE) throw new Error("Payload too large");
733
- const payload = payloadParam ? fromJSON(JSON.parse(payloadParam), { plugins: serovalPlugins }) : {};
734
- payload.context = safeObjectMerge(payload.context, context);
735
- payload.method = methodUpper;
736
- res = await action(payload);
737
1225
  } else {
738
- const payload = contentType?.includes("application/json") ? fromJSON(await request.json(), { plugins: serovalPlugins }) : {};
739
- payload.context = safeObjectMerge(payload.context, context);
740
- payload.method = methodUpper;
741
- res = await action(payload);
1226
+ let json;
1227
+ if (methodUpper === "GET") {
1228
+ const payloadParam = getParsedRequestUrl(request).searchParams.get("payload");
1229
+ if (payloadParam && payloadParam.length > MAX_PAYLOAD_SIZE) throw new Error("Payload too large");
1230
+ json = payloadParam ? JSON.parse(payloadParam) : void 0;
1231
+ } else if (contentType?.includes("application/json")) json = await request.json();
1232
+ const payload = json === void 0 ? void 0 : fromJSON(json, { plugins: getRequestSerovalPlugins() });
1233
+ res = await action({
1234
+ data: payload?.data,
1235
+ context: payload?.context,
1236
+ method: methodUpper
1237
+ });
742
1238
  }
743
- const unwrapped = res.result !== void 0 ? res.result : res.error;
744
- if (isNotFound(res)) res = isNotFoundResponse(res);
745
- if (!isServerFn) return unwrapped;
1239
+ const failed = "error" in res;
1240
+ const unwrapped = failed ? res.error : res.result;
1241
+ if (!isServerFn && (unwrapped instanceof Response || unwrapped === null || typeof unwrapped !== "object")) return unwrapped;
746
1242
  if (unwrapped instanceof Response) {
1243
+ if (failed) return toThrownServerFnResponse(unwrapped);
747
1244
  if (isRedirect(unwrapped)) return unwrapped;
748
- unwrapped.headers.set(X_TSS_RAW_RESPONSE, "true");
749
- return unwrapped;
1245
+ return setProtectedResponseHeaders(unwrapped, RAW_RESPONSE_HEADERS);
750
1246
  }
751
- return serializeResult(res, request.signal, serovalPlugins);
1247
+ return serializeResult(res, request, getRequestSerovalPlugins());
752
1248
  } catch (error) {
753
1249
  if (error instanceof Response) return error;
754
- if (isNotFound(error)) return isNotFoundResponse(error);
755
- console.error("Server Fn Error!", error);
756
- const serializedError = JSON.stringify(await toCrossJSONAsync(error, {
757
- refs: /* @__PURE__ */ new Map(),
758
- plugins: serovalPlugins
759
- }));
760
- const response = getResponse();
761
- const headers = {
762
- "Content-Type": "application/json",
763
- [X_TSS_SERIALIZED]: "true"
764
- };
765
- try {
766
- return new Response(serializedError, {
767
- status: response.status ?? 500,
768
- statusText: response.statusText,
769
- headers
770
- });
771
- } catch {
772
- return new Response(serializedError, {
773
- status: 500,
774
- statusText: "",
775
- headers
776
- });
777
- }
1250
+ return createServerFnErrorResponse(error, serovalPlugins);
778
1251
  }
779
1252
  };
780
1253
  /**
@@ -782,8 +1255,7 @@ var handleServerAction = async ({ request, context, serverFnId }) => {
782
1255
  * synchronously without RawStreams becomes plain JSON; everything else is a
783
1256
  * framed response whose records and raw streams are multiplexed in order.
784
1257
  */
785
- function serializeResult(res, signal, plugins) {
786
- const alsResponse = getResponse();
1258
+ function serializeResult(res, request, plugins) {
787
1259
  const initialRecords = [];
788
1260
  let initialBytes = 0;
789
1261
  const pendingRawStreams = [];
@@ -843,14 +1315,7 @@ function serializeResult(res, signal, plugins) {
843
1315
  throw serializationFailure[0];
844
1316
  }
845
1317
  if (!done) disposeSerialization = dispose;
846
- if (done && pendingRawStreams.length === 0 && initialRecords.length === 1) return new Response(initialRecords[0], {
847
- status: alsResponse.status,
848
- statusText: alsResponse.statusText,
849
- headers: {
850
- "Content-Type": "application/json",
851
- [X_TSS_SERIALIZED]: "true"
852
- }
853
- });
1318
+ if (done && pendingRawStreams.length === 0 && initialRecords.length === 1) return new DeferredResponse(initialRecords[0]);
854
1319
  if (done && initialRecords.length === 1) {
855
1320
  const json = initialRecords[0];
856
1321
  if (json.byteLength > 16777216) {
@@ -871,7 +1336,7 @@ function serializeResult(res, signal, plugins) {
871
1336
  cancel(reason) {
872
1337
  for (const registration of rawStreams) cancelRawStream(registration.stream, reason);
873
1338
  }
874
- }), { signal });
1339
+ }), { signal: request.signal });
875
1340
  }
876
1341
  const { readable, writable } = new TransformStream();
877
1342
  const writer = writable.getWriter();
@@ -944,35 +1409,46 @@ function serializeResult(res, signal, plugins) {
944
1409
  abortRecordStream(error);
945
1410
  });
946
1411
  return createFramedResponse(readable, {
947
- signal: AbortSignal.any([recordAbortController.signal, signal]),
1412
+ signal: AbortSignal.any([recordAbortController.signal, request.signal]),
948
1413
  onCancel: abortRecordStream
949
1414
  });
950
- function createFramedResponse(records, options) {
951
- const multiplexedStream = createMultiplexedStream(records, options);
952
- try {
953
- return new Response(multiplexedStream, {
954
- status: alsResponse.status,
955
- statusText: alsResponse.statusText,
956
- headers: {
957
- "Content-Type": TSS_CONTENT_TYPE_FRAMED_VERSIONED,
958
- [X_TSS_SERIALIZED]: "true"
959
- }
960
- });
961
- } catch (error) {
962
- cancelRawStream(multiplexedStream, error);
963
- throw error;
964
- }
1415
+ }
1416
+ function createFramedResponse(records, options) {
1417
+ const multiplexedStream = createMultiplexedStream(records, options);
1418
+ const { status, statusText } = getSerializedResponseState();
1419
+ try {
1420
+ const response = new Response(multiplexedStream, {
1421
+ status,
1422
+ statusText,
1423
+ headers: {
1424
+ "Content-Type": TSS_CONTENT_TYPE_FRAMED_VERSIONED,
1425
+ [X_TSS_SERIALIZED]: "true"
1426
+ }
1427
+ });
1428
+ protectResponseHeaders(response, SERIALIZED_FRAMED_HEADERS);
1429
+ return response;
1430
+ } catch (error) {
1431
+ cancelRawStream(multiplexedStream, error);
1432
+ throw error;
965
1433
  }
966
1434
  }
967
1435
  function isNotFoundResponse(error) {
968
1436
  const { headers, ...rest } = error;
969
- return new Response(JSON.stringify(rest), {
1437
+ let responseHeaders;
1438
+ if (headers) {
1439
+ const copiedHeaders = new Headers(headers);
1440
+ copiedHeaders.set("Content-Type", "application/json");
1441
+ copiedHeaders.delete(X_TSS_SERIALIZED);
1442
+ copiedHeaders.delete(X_TSS_RAW_RESPONSE);
1443
+ copiedHeaders.delete("location");
1444
+ responseHeaders = copiedHeaders;
1445
+ } else responseHeaders = { "Content-Type": "application/json" };
1446
+ const response = new Response(JSON.stringify(rest), {
970
1447
  status: 404,
971
- headers: {
972
- "Content-Type": "application/json",
973
- ...headers || {}
974
- }
1448
+ headers: responseHeaders
975
1449
  });
1450
+ protectResponseHeaders(response, NOT_FOUND_HEADERS);
1451
+ return response;
976
1452
  }
977
1453
  //#endregion
978
1454
  //#region node_modules/@tanstack/start-server-core/dist/esm/early-hints.js
@@ -1065,7 +1541,7 @@ function collectStaticHintsFromManifest(manifest, matchedRoutes) {
1065
1541
  rel: attrs.rel,
1066
1542
  as: "script"
1067
1543
  };
1068
- if (attrs.crossOrigin !== void 0) hint.crossOrigin = attrs.crossOrigin;
1544
+ addEarlyHintFetchAttrs(hint, attrs);
1069
1545
  hints.push(hint);
1070
1546
  }
1071
1547
  for (const link of routeManifest.css ?? []) {
@@ -1340,7 +1816,8 @@ async function transformManifestAssets(source, transformFn, _opts) {
1340
1816
  else if (manifest.inlineCss) manifest.inlineCss = await transformInlineCssStyles(manifest.inlineCss, transformFn);
1341
1817
  for (const route of Object.values(manifest.routes)) {
1342
1818
  if (route.preloads?.length) route.preloads = await Promise.all(route.preloads.map(async (link) => {
1343
- const result = await transformScript(resolveManifestAssetLink(link).href);
1819
+ const resolved = resolveManifestAssetLink(link);
1820
+ const result = await transformScript(resolved.href);
1344
1821
  return assignManifestLink(link, {
1345
1822
  href: result.href,
1346
1823
  crossOrigin: result.crossOrigin
@@ -1385,14 +1862,20 @@ function buildManifest(source, opts) {
1385
1862
  }
1386
1863
  //#endregion
1387
1864
  //#region node_modules/@tanstack/start-server-core/dist/esm/inlineCss.js
1388
- function getStaticHandlerInlineCssDefault(handlerInlineCss) {
1865
+ /**
1866
+ * The inline-CSS choice that needs no handler callback: a request override
1867
+ * wins, then a static handler option, then the default. Undefined when a
1868
+ * handler callback has to decide.
1869
+ */
1870
+ function getStaticInlineCss(requestInlineCss, handlerInlineCss) {
1871
+ if (requestInlineCss !== void 0) return requestInlineCss;
1389
1872
  if (typeof handlerInlineCss === "function") return;
1390
1873
  return handlerInlineCss ?? true;
1391
1874
  }
1392
1875
  async function resolveInlineCssForRequest(opts) {
1393
- if (opts.requestInlineCss !== void 0) return opts.requestInlineCss;
1394
- if (typeof opts.handlerInlineCss === "function") return await opts.handlerInlineCss({ request: opts.request });
1395
- return opts.handlerInlineCss ?? true;
1876
+ const inlineCss = getStaticInlineCss(opts.requestInlineCss, opts.handlerInlineCss);
1877
+ if (inlineCss !== void 0) return inlineCss;
1878
+ return await opts.handlerInlineCss({ request: opts.request });
1396
1879
  }
1397
1880
  //#endregion
1398
1881
  //#region node_modules/@tanstack/start-server-core/dist/esm/finalManifest.js
@@ -1433,7 +1916,7 @@ function createFinalManifestTransformResolver(transformAssets, opts) {
1433
1916
  function createFinalManifestResolver(opts) {
1434
1917
  const finalManifestCache = /* @__PURE__ */ new Map();
1435
1918
  const transformResolver = createFinalManifestTransformResolver(opts.transformAssets, { cacheCreateTransform: opts.cacheCreateTransform });
1436
- const handlerDefaultInlineCss = getStaticHandlerInlineCssDefault(opts.inlineCss);
1919
+ const handlerDefaultInlineCss = getStaticInlineCss(void 0, opts.inlineCss);
1437
1920
  const getRequestManifestOptions = async (requestOpts) => {
1438
1921
  const transformFn = await transformResolver.getTransformFn({
1439
1922
  warmup: false,
@@ -1467,25 +1950,35 @@ function createFinalManifestResolver(opts) {
1467
1950
  getTransformFn: () => transformResolver.getTransformFn({ warmup: true }),
1468
1951
  onError: transformResolver.clearCachedCreateTransform
1469
1952
  }),
1470
- resolveCached: (requestOpts) => resolveRequest(requestOpts, finalManifestCache),
1953
+ resolveCached: (requestOpts) => {
1954
+ const inlineCss = getStaticInlineCss(requestOpts.requestInlineCss, opts.inlineCss);
1955
+ if (transformResolver.cache && inlineCss !== void 0) {
1956
+ const cached = finalManifestCache.get(getFinalManifestCacheKey(inlineCss));
1957
+ if (cached) return cached;
1958
+ }
1959
+ return resolveRequest(requestOpts, finalManifestCache);
1960
+ },
1471
1961
  resolveUncached: (requestOpts) => resolveRequest(requestOpts, void 0)
1472
1962
  };
1473
1963
  }
1474
1964
  function getFinalManifestCacheKey(inlineCss) {
1475
1965
  return inlineCss ? "inline-css" : "linked-css";
1476
1966
  }
1477
- function cacheFinalManifestPromise(cachedFinalManifestPromises, cacheKey, promise) {
1478
- const cachedFinalManifestPromise = promise.catch((error) => {
1479
- if (cachedFinalManifestPromises.get(cacheKey) === cachedFinalManifestPromise) cachedFinalManifestPromises.delete(cacheKey);
1967
+ function cacheFinalManifestPromise(finalManifestCache, cacheKey, promise) {
1968
+ const cachedPromise = promise.then((manifest) => {
1969
+ if (finalManifestCache.get(cacheKey) === cachedPromise) finalManifestCache.set(cacheKey, manifest);
1970
+ return manifest;
1971
+ }, (error) => {
1972
+ if (finalManifestCache.get(cacheKey) === cachedPromise) finalManifestCache.delete(cacheKey);
1480
1973
  throw error;
1481
1974
  });
1482
- cachedFinalManifestPromises.set(cacheKey, cachedFinalManifestPromise);
1483
- return cachedFinalManifestPromise;
1975
+ finalManifestCache.set(cacheKey, cachedPromise);
1976
+ return cachedPromise;
1484
1977
  }
1485
- function getOrCreateCachedFinalManifestPromise(cachedFinalManifestPromises, cacheKey, computeFinalManifest) {
1486
- const cachedFinalManifestPromise = cachedFinalManifestPromises.get(cacheKey);
1487
- if (cachedFinalManifestPromise) return cachedFinalManifestPromise;
1488
- return cacheFinalManifestPromise(cachedFinalManifestPromises, cacheKey, Promise.resolve().then(computeFinalManifest));
1978
+ function getOrCreateCachedFinalManifest(finalManifestCache, cacheKey, computeFinalManifest) {
1979
+ const cached = finalManifestCache.get(cacheKey);
1980
+ if (cached) return cached;
1981
+ return cacheFinalManifestPromise(finalManifestCache, cacheKey, Promise.resolve().then(computeFinalManifest));
1489
1982
  }
1490
1983
  async function buildFinalManifest(opts) {
1491
1984
  return opts.transformFn ? await transformManifestAssets(opts.base, opts.transformFn, { inlineCss: opts.inlineCss }) : buildManifest(opts.base, { inlineCss: opts.inlineCss });
@@ -1498,20 +1991,20 @@ async function resolveFinalManifest(opts) {
1498
1991
  inlineCss: opts.inlineCss
1499
1992
  });
1500
1993
  };
1501
- if (opts.finalManifestCache && (!opts.transformFn || opts.cache)) return getOrCreateCachedFinalManifestPromise(opts.finalManifestCache, getFinalManifestCacheKey(opts.inlineCss), computeFinalManifest);
1994
+ if (opts.finalManifestCache && (!opts.transformFn || opts.cache)) return getOrCreateCachedFinalManifest(opts.finalManifestCache, getFinalManifestCacheKey(opts.inlineCss), computeFinalManifest);
1502
1995
  return computeFinalManifest();
1503
1996
  }
1504
1997
  function warmupFinalManifest(opts) {
1505
1998
  if (!opts.enabled || opts.handlerDefaultInlineCss === void 0 || !opts.cache) return;
1506
1999
  const inlineCss = opts.handlerDefaultInlineCss;
1507
- const warmupPromise = getOrCreateCachedFinalManifestPromise(opts.finalManifestCache, getFinalManifestCacheKey(inlineCss), async () => {
2000
+ const warmupPromise = cacheFinalManifestPromise(opts.finalManifestCache, getFinalManifestCacheKey(inlineCss), Promise.resolve().then(async () => {
1508
2001
  const [base, transformFn] = await Promise.all([opts.getBaseManifest(), opts.getTransformFn()]);
1509
2002
  return buildFinalManifest({
1510
2003
  base,
1511
2004
  transformFn,
1512
2005
  inlineCss
1513
2006
  });
1514
- });
2007
+ }));
1515
2008
  if (opts.onError) warmupPromise.catch(opts.onError);
1516
2009
  return warmupPromise;
1517
2010
  }
@@ -1527,19 +2020,26 @@ var ServerFunctionSerializationAdapter = createSerializationAdapter({
1527
2020
  toSerializable: ({ serverFnMeta }) => ({ functionId: serverFnMeta.id }),
1528
2021
  fromSerializable: ({ functionId }) => {
1529
2022
  const fn = async (opts, signal) => {
1530
- return (await (await getServerFnById(functionId, { origin: "client" }))(opts ?? {}, signal)).result;
2023
+ const serverFn = await getServerFnById(functionId, { origin: "client" });
2024
+ const result = await serverFn({
2025
+ data: opts?.data,
2026
+ context: opts?.context,
2027
+ method: serverFn.method ?? "GET"
2028
+ }, signal);
2029
+ if ("error" in result) throw result.error;
2030
+ return result.result;
1531
2031
  };
1532
2032
  return fn;
1533
2033
  }
1534
2034
  });
1535
2035
  //#endregion
1536
2036
  //#region node_modules/@tanstack/start-server-core/dist/esm/createStartHandler.js
1537
- function getStartResponseHeaders(opts) {
1538
- return mergeHeaders$1({ "Content-Type": "text/html; charset=utf-8" }, ..._getRenderedMatches(opts.router.stores.matches.get()).map((match) => {
1539
- return match.headers;
1540
- }));
2037
+ function getStartResponseHeaders(router) {
2038
+ const headers = new Headers({ "content-type": "text/html; charset=utf-8" });
2039
+ const matches = _getRenderedMatches(router.stores.matches.get());
2040
+ return matches.some((match) => match.headers) ? mergeHeaders$1(headers, ...matches.map((match) => match.headers)) : headers;
1541
2041
  }
1542
- var entriesPromise;
2042
+ var cachedEntries;
1543
2043
  var defaultCsrfMiddleware = createCsrfMiddleware({ filter: (ctx) => ctx.handlerType === "serverFn" });
1544
2044
  var getCachedBaseManifest = createCachedBaseManifestLoader(() => getStartManifest());
1545
2045
  var getProdBaseManifest = () => getCachedBaseManifest();
@@ -1558,8 +2058,11 @@ async function loadEntries() {
1558
2058
  };
1559
2059
  }
1560
2060
  function getEntries() {
1561
- if (!entriesPromise) entriesPromise = loadEntries();
1562
- return entriesPromise;
2061
+ if (!cachedEntries) cachedEntries = loadEntries().then((entries) => {
2062
+ cachedEntries = entries;
2063
+ return entries;
2064
+ });
2065
+ return cachedEntries;
1563
2066
  }
1564
2067
  var ROUTER_BASEPATH = "/";
1565
2068
  var SERVER_FN_BASE = "/_serverFn/";
@@ -1577,16 +2080,21 @@ function throwIfMayNotDefer() {
1577
2080
  function getResponseFromResult(result) {
1578
2081
  return isSsrResponse(result) || result instanceof Response ? result : result?.response;
1579
2082
  }
1580
- var responseBodySources = /* @__PURE__ */ new WeakMap();
1581
2083
  function disposeResponseResult(result, reason) {
1582
2084
  const response = getResponseFromResult(result);
1583
2085
  if (isSsrResponse(response) || response instanceof Response) disposeSsrResponse(response, reason);
1584
2086
  }
1585
- function hasResponseBody(value) {
1586
- return value instanceof Response && value.body !== null;
1587
- }
1588
- function inheritsResponseOwnership(ownership, candidate) {
1589
- return hasResponseBody(candidate) && (candidate.body === ownership.response.body || responseBodySources.get(candidate) === ownership.response);
2087
+ /**
2088
+ * A new body continues the owned one when it is the same stream, or when the
2089
+ * owned body is already being read, as by a pipe, a tee, or a `Response` that
2090
+ * copies a body by reading it (Bun, or a wrapped global `Response`). Start
2091
+ * cannot tell such a reader from one that stops early, so it disposes only an
2092
+ * unread body. A stream whose reader stops early ends with the request's abort
2093
+ * or the SSR stream's lifetime limit.
2094
+ */
2095
+ function inheritsResponseOwnership(ownership, body) {
2096
+ const ownedBody = ownership.response.body;
2097
+ return body === ownedBody || ownedBody.locked;
1590
2098
  }
1591
2099
  function disposeResponseOwnership(ownership, reason) {
1592
2100
  const { response, sourceBody, streamResponse } = ownership;
@@ -1616,54 +2124,80 @@ function createLateResponseDisposer(signal) {
1616
2124
  * Compose middleware around a terminal response handler. With no middleware
1617
2125
  * the terminal runs directly.
1618
2126
  */
1619
- async function executeMiddleware(middlewares, terminal, ctx, signal, terminalNext) {
2127
+ async function executeMiddleware(middlewares, terminal, ctx, signal, event, terminalNext) {
1620
2128
  let index = -1;
1621
2129
  let responseOwnership;
1622
- let settled = false;
2130
+ let returnedDepth = Infinity;
1623
2131
  const disposeAbandonedResult = createLateResponseDisposer(signal);
1624
- const setResponse = (response) => {
1625
- const ssrResponse = isSsrResponse(response) ? response : void 0;
1626
- const streamResponse = ssrResponse?.serverSsrCleanup === "stream" ? ssrResponse : void 0;
1627
- const exposed = ssrResponse ? ssrResponse.response : response;
2132
+ const adoptResponse = (exposed, streamResponse) => {
1628
2133
  const current = responseOwnership;
1629
- if (settled) {
1630
- if (exposed !== ctx.response) disposeResponseResult(response, "late middleware response");
1631
- return;
1632
- }
2134
+ const body = exposed instanceof Response ? exposed.body : null;
2135
+ const response = exposed;
2136
+ if (streamResponse && !body && streamResponse !== current?.streamResponse) streamResponse.dispose("Response body dropped by Start reconciliation");
1633
2137
  if (current && current.response === exposed) current.streamResponse ??= streamResponse;
1634
- else if (current && inheritsResponseOwnership(current, exposed)) {
1635
- current.response = exposed;
2138
+ else if (current && body && inheritsResponseOwnership(current, body)) {
2139
+ if (body === current.response.body) transferResponseProtocol(current.response, response);
2140
+ current.response = response;
1636
2141
  current.streamResponse ??= streamResponse;
1637
2142
  } else {
1638
- if (current) disposeResponseOwnership(current, "middleware response replaced");
1639
- if (hasResponseBody(exposed)) responseOwnership = {
1640
- response: exposed,
1641
- sourceBody: exposed.body,
2143
+ if (current) {
2144
+ responseOwnership = void 0;
2145
+ disposeResponseOwnership(current, "middleware response replaced");
2146
+ }
2147
+ responseOwnership = body ? {
2148
+ response,
2149
+ sourceBody: body,
1642
2150
  streamResponse
1643
- };
1644
- else responseOwnership = void 0;
2151
+ } : void 0;
1645
2152
  }
1646
2153
  ctx.response = exposed;
1647
2154
  };
1648
- const reconcileCtxResponse = () => {
1649
- if (ctx.response !== responseOwnership?.response) setResponse(ctx.response);
2155
+ const disposeCurrentBody = (reason) => {
2156
+ const current = responseOwnership;
2157
+ responseOwnership = void 0;
2158
+ if (current) disposeResponseOwnership(current, reason);
2159
+ };
2160
+ const setResponse = (response, caller) => {
2161
+ const owned = response !== void 0 && response === responseOwnership?.response;
2162
+ const ssrResponse = !owned && isSsrResponse(response) ? response : void 0;
2163
+ const exposed = ssrResponse ? ssrResponse.response : response;
2164
+ if (returnedDepth <= caller) {
2165
+ if (exposed !== ctx.response) disposeResponseResult(response, "late middleware response");
2166
+ return;
2167
+ }
2168
+ if (!owned) adoptResponse(exposed, ssrResponse?.serverSsrCleanup === "stream" ? ssrResponse : void 0);
2169
+ if (exposed instanceof Response) {
2170
+ const reconciled = reconcileResponse(exposed, event, disposeCurrentBody);
2171
+ if (reconciled !== exposed) adoptRebuilt(exposed, reconciled);
2172
+ }
2173
+ };
2174
+ const adoptRebuilt = (exposed, rebuilt) => {
2175
+ const current = responseOwnership;
2176
+ if (current?.response === exposed && rebuilt.body) {
2177
+ current.response = rebuilt;
2178
+ ctx.response = rebuilt;
2179
+ } else adoptResponse(rebuilt);
1650
2180
  };
1651
2181
  let nextPromise;
1652
2182
  function next(nextCtx) {
1653
- const result = runNext(nextCtx);
2183
+ const result = runNext(index, nextCtx);
1654
2184
  nextPromise = result;
1655
2185
  return result;
1656
2186
  }
1657
- async function runNext(nextCtx) {
2187
+ async function runNext(caller, nextCtx) {
1658
2188
  signal.throwIfAborted();
1659
2189
  if (nextCtx) {
1660
2190
  if (nextCtx.context) ctx.context = safeObjectMerge(ctx.context, nextCtx.context);
1661
- for (const key of Object.keys(nextCtx)) if (key === "response") setResponse(nextCtx.response);
1662
- else if (key !== "context") ctx[key] = nextCtx[key];
2191
+ const keys = Object.keys(nextCtx);
2192
+ for (let i = 0; i < keys.length; i++) {
2193
+ const key = keys[i];
2194
+ if (key === "response") setResponse(nextCtx.response, caller);
2195
+ else if (key !== "context") ctx[key] = nextCtx[key];
2196
+ }
1663
2197
  }
1664
- index++;
1665
- const isTerminal = index === middlewares.length;
1666
- const middleware = index < middlewares.length ? middlewares[index] : isTerminal ? terminal : void 0;
2198
+ const depth = ++index;
2199
+ const isTerminal = depth === middlewares.length;
2200
+ const middleware = depth < middlewares.length ? middlewares[depth] : isTerminal ? terminal : void 0;
1667
2201
  const middlewareNext = isTerminal && terminalNext ? terminalNext : next;
1668
2202
  if (!middleware) return ctx;
1669
2203
  let result;
@@ -1674,45 +2208,61 @@ async function executeMiddleware(middlewares, terminal, ctx, signal, terminalNex
1674
2208
  });
1675
2209
  if (nextPromise && pending === nextPromise) {
1676
2210
  nextPromise = void 0;
1677
- await pending;
1678
- if (signal.aborted) throw signal.reason;
1679
- return ctx;
2211
+ result = await pending;
2212
+ signal.throwIfAborted();
1680
2213
  } else if (!isPromise(pending)) {
1681
2214
  result = pending;
1682
2215
  signal.throwIfAborted();
1683
2216
  } else result = await waitForRequest(pending, signal, disposeAbandonedResult, disposeAbandonedResult);
1684
2217
  } catch (err) {
1685
- reconcileCtxResponse();
2218
+ if (depth < returnedDepth) returnedDepth = depth;
2219
+ if (returnedDepth > caller) adoptResponse(ctx.response);
1686
2220
  if (signal.aborted) {
1687
2221
  if (result !== void 0) disposeAbandonedResult(result);
1688
2222
  if (err !== signal.reason) disposeAbandonedResult(err);
1689
2223
  throw signal.reason;
1690
2224
  }
1691
2225
  if (err instanceof Response) {
1692
- setResponse(err);
2226
+ setResponse(ctx.handlerType === "serverFn" ? toThrownServerFnResponse(err) : err, caller);
1693
2227
  return ctx;
1694
2228
  }
1695
2229
  throw err;
1696
2230
  }
2231
+ if (depth < returnedDepth) returnedDepth = depth;
1697
2232
  if (isTerminal && terminalNext && !result) throwRouteHandlerError();
1698
- reconcileCtxResponse();
2233
+ if (isTerminal && !terminalNext && result instanceof DeferredResponse) {
2234
+ if (returnedDepth > caller) {
2235
+ adoptResponse(void 0);
2236
+ adoptResponse(result.createResponse(event));
2237
+ }
2238
+ return ctx;
2239
+ }
1699
2240
  if (result && result !== ctx) {
1700
2241
  const response = getResponseFromResult(result);
1701
- if (response !== void 0 && response !== ctx.response) setResponse(response);
1702
- if (response !== result && result.context && result.context !== ctx.context) ctx.context = safeObjectMerge(ctx.context, result.context);
1703
- }
2242
+ if (response !== void 0) {
2243
+ if (ctx.response !== responseOwnership?.response && ctx.response !== response && returnedDepth > caller) adoptResponse(ctx.response);
2244
+ setResponse(response, caller);
2245
+ } else setResponse(ctx.response, caller);
2246
+ if (returnedDepth > caller && response !== result && result.context && result.context !== ctx.context) ctx.context = safeObjectMerge(ctx.context, result.context);
2247
+ } else setResponse(ctx.response, caller);
1704
2248
  return ctx;
1705
2249
  }
1706
2250
  try {
1707
- await runNext();
1708
- const response = ctx.response;
2251
+ await runNext(-1);
2252
+ let response = ctx.response;
1709
2253
  if (!response) throwRouteHandlerError();
1710
- reconcileCtxResponse();
1711
2254
  if (signal.aborted) throw signal.reason;
1712
- settled = true;
2255
+ returnedDepth = -1;
2256
+ if (middlewares.length && ctx.handlerType === "serverFn") {
2257
+ const restored = restoreResponseProtocol(response, event);
2258
+ if (restored !== response) {
2259
+ adoptRebuilt(response, restored);
2260
+ response = restored;
2261
+ }
2262
+ }
1713
2263
  return responseOwnership ? getOwnedResponse(responseOwnership) : response;
1714
2264
  } catch (err) {
1715
- settled = true;
2265
+ returnedDepth = -1;
1716
2266
  if (responseOwnership) disposeResponseOwnership(responseOwnership, signal.aborted ? signal.reason : err);
1717
2267
  throw err;
1718
2268
  }
@@ -1756,18 +2306,24 @@ function createStartHandler(cbOrOptions) {
1756
2306
  });
1757
2307
  const resolveManifestForRequest = finalManifestResolver.resolveCached;
1758
2308
  finalManifestResolver.warmup({ getBaseManifest: () => getBaseManifest(void 0) });
1759
- const startRequestResolver = async (request, requestOpts) => {
2309
+ const startRequestResolver = async (request, requestOpts, event) => {
1760
2310
  const signal = request.signal;
1761
2311
  let router;
1762
2312
  let routerPromise;
1763
2313
  let responseOwnsCleanup = false;
2314
+ let response;
1764
2315
  try {
1765
2316
  signal.throwIfAborted();
1766
- const { url, handledProtocolRelativeURL } = getNormalizedURL(request.url);
1767
- const href = url.pathname + url.search + url.hash;
1768
- const origin = url.origin;
1769
- if (handledProtocolRelativeURL) return Response.redirect(url, 308);
1770
- const entries = await waitForRequest(getEntries(), signal);
2317
+ const requestUrl = event.requestUrl;
2318
+ let url = requestUrl;
2319
+ const pathname = url.pathname;
2320
+ if (!SERVER_FN_BASE || !pathname.startsWith(SERVER_FN_BASE) || pathname.includes("%") || pathname.startsWith("//")) {
2321
+ const normalized = getNormalizedURL(requestUrl);
2322
+ url = normalized.url;
2323
+ if (normalized.handledProtocolRelativeURL) return finalizeResponse(Response.redirect(url, 308), event);
2324
+ }
2325
+ const pendingEntries = getEntries();
2326
+ const entries = isPromise(pendingEntries) ? await waitForRequest(pendingEntries, signal) : pendingEntries;
1771
2327
  const isServerFnRequest = !!SERVER_FN_BASE && url.pathname.startsWith(SERVER_FN_BASE);
1772
2328
  const startInstance = entries.startEntry.startInstance;
1773
2329
  let startOptions;
@@ -1787,22 +2343,29 @@ function createStartHandler(cbOrOptions) {
1787
2343
  requestMiddleware: startInstance ? startOptions.requestMiddleware : isServerFnRequest ? [defaultCsrfMiddleware] : void 0,
1788
2344
  serializationAdapters
1789
2345
  };
1790
- const flattenedRequestMiddlewares = requestStartOptions.requestMiddleware ? flattenMiddlewares(requestStartOptions.requestMiddleware) : [];
1791
- const executedRequestMiddlewares = new Set(flattenedRequestMiddlewares);
2346
+ const requestMiddleware = requestStartOptions.requestMiddleware;
2347
+ let executedRequestMiddlewares;
2348
+ let flattenedRequestMiddlewares = [];
2349
+ if (requestMiddleware?.length) {
2350
+ executedRequestMiddlewares = /* @__PURE__ */ new Set();
2351
+ flattenedRequestMiddlewares = flattenMiddlewares(requestMiddleware, void 0, executedRequestMiddlewares);
2352
+ }
1792
2353
  const getRouter = () => {
1793
2354
  routerPromise ??= (async () => {
1794
2355
  signal.throwIfAborted();
1795
- const requestRouter = await waitForRequest(entries.routerEntry.getRouter(), signal);
2356
+ const routerUrl = url === requestUrl ? getNormalizedURL(url).url : url;
2357
+ const pendingRouter = entries.routerEntry.getRouter();
2358
+ const requestRouter = isPromise(pendingRouter) ? await waitForRequest(pendingRouter, signal) : pendingRouter;
1796
2359
  let isShell = IS_SHELL_ENV;
1797
2360
  if (IS_PRERENDERING && !isShell) isShell = request.headers.get(HEADERS.TSS_SHELL) === "true";
1798
- const history = createServerHistory(href);
2361
+ const history = createServerHistory(routerUrl.pathname + routerUrl.search + routerUrl.hash);
1799
2362
  requestRouter.update({
1800
2363
  history,
1801
2364
  isShell,
1802
2365
  isPrerendering: IS_PRERENDERING,
1803
- origin: requestRouter.options.origin ?? origin,
2366
+ origin: requestRouter.options.origin ?? routerUrl.origin,
1804
2367
  defaultSsr: requestStartOptions.defaultSsr,
1805
- serializationAdapters: [...requestStartOptions.serializationAdapters, ...requestRouter.options.serializationAdapters || []],
2368
+ serializationAdapters: requestRouter.options.serializationAdapters?.length ? [...requestStartOptions.serializationAdapters, ...requestRouter.options.serializationAdapters] : requestStartOptions.serializationAdapters,
1806
2369
  basepath: ROUTER_BASEPATH
1807
2370
  });
1808
2371
  router = requestRouter;
@@ -1827,51 +2390,49 @@ function createStartHandler(cbOrOptions) {
1827
2390
  contextAfterGlobalMiddlewares: context
1828
2391
  }, () => handleServerAction({
1829
2392
  request,
1830
- context: requestOpts?.context,
1831
2393
  serverFnId
1832
2394
  }));
1833
2395
  } else {
1834
- const executeRouter = async (serverContext, matchedRoutes) => {
2396
+ const executeRouter = async (serverContext, matchedRoutes, routerInstance) => {
1835
2397
  if (!/(^|,)\s*(\*\/\*|text\/html)/.test(request.headers.get("Accept") || "*/*")) return normalizeSsrResponse(Response.json({ error: "Only HTML requests are supported here" }, { status: 406 }));
1836
- const manifest = await waitForRequest(resolveManifestForRequest({
2398
+ const pendingManifest = resolveManifestForRequest({
1837
2399
  request,
1838
2400
  requestInlineCss: requestOpts?.inlineCss,
1839
2401
  getBaseManifest: () => getBaseManifest(matchedRoutes)
1840
- }), signal);
1841
- const earlyHints = createEarlyHintsForRequest({
1842
- onEarlyHints: requestOpts?.onEarlyHints,
1843
- responseLinkHeader: requestOpts?.responseLinkHeader
1844
2402
  });
2403
+ const manifest = isPromise(pendingManifest) ? await waitForRequest(pendingManifest, signal) : pendingManifest;
2404
+ const earlyHints = createEarlyHintsForRequest(requestOpts);
1845
2405
  earlyHints?.collectStatic({
1846
2406
  manifest,
1847
2407
  matchedRoutes
1848
2408
  });
1849
- const routerInstance = await getRouter();
2409
+ const storedStartContext = getStartContext({ throwIfNotFound: false });
1850
2410
  attachRouterServerSsrUtils({
1851
2411
  router: routerInstance,
1852
2412
  manifest,
1853
- getRequestAssets: () => getStartContext({ throwIfNotFound: false })?.requestAssets
2413
+ getRequestAssets: () => storedStartContext?.requestAssets
1854
2414
  });
1855
2415
  routerInstance.options.additionalContext = { serverContext };
1856
- await routerInstance.load({ _signal: signal });
2416
+ await routerInstance.load({
2417
+ _signal: signal,
2418
+ _skipLocationUpdate: true
2419
+ });
1857
2420
  signal.throwIfAborted();
1858
2421
  if (routerInstance._serverResult?.type === "redirect") return normalizeSsrResponse(routerInstance._serverResult.redirect);
1859
2422
  earlyHints?.collectDynamic(_getRenderedMatches(routerInstance.stores.matches.get()));
1860
- const ctx = getStartContext({ throwIfNotFound: false });
1861
2423
  await routerInstance.serverSsr.dehydrate({
1862
- requestAssets: ctx?.requestAssets,
2424
+ requestAssets: storedStartContext?.requestAssets,
1863
2425
  signal
1864
2426
  });
1865
2427
  signal.throwIfAborted();
1866
- const responseHeaders = getStartResponseHeaders({ router: routerInstance });
2428
+ const responseHeaders = getStartResponseHeaders(routerInstance);
1867
2429
  earlyHints?.appendResponseHeaders(responseHeaders);
1868
2430
  signal.throwIfAborted();
1869
- const disposeLate = createLateResponseDisposer(signal);
1870
- return normalizeSsrResponse(await waitForRequest(cb({
2431
+ return normalizeSsrResponse(await cb({
1871
2432
  request,
1872
2433
  router: routerInstance,
1873
2434
  responseHeaders
1874
- }), signal, disposeLate, disposeLate));
2435
+ }));
1875
2436
  };
1876
2437
  terminal = ({ context }) => runWithStartContext({
1877
2438
  ...startContext,
@@ -1879,22 +2440,45 @@ function createStartHandler(cbOrOptions) {
1879
2440
  }, () => handleServerRoutes({
1880
2441
  getRouter,
1881
2442
  request,
1882
- url,
1883
2443
  executeRouter,
1884
2444
  context,
1885
- executedRequestMiddlewares
2445
+ executedRequestMiddlewares,
2446
+ signal,
2447
+ event
1886
2448
  }));
1887
2449
  }
1888
- const middlewareResponse = await executeMiddleware(flattenedRequestMiddlewares.map((d) => d.options.server), terminal, {
2450
+ const middlewareCtx = {
1889
2451
  request,
1890
2452
  pathname: url.pathname,
1891
2453
  handlerType,
1892
2454
  context: createNullProtoObject(requestOpts?.context)
1893
- }, signal);
2455
+ };
2456
+ let middlewareResponse;
2457
+ try {
2458
+ if (!isServerFnRequest && flattenedRequestMiddlewares.length === 0) middlewareResponse = await terminal(middlewareCtx);
2459
+ else middlewareResponse = await executeMiddleware(flattenedRequestMiddlewares.map((d) => d.options.server), terminal, middlewareCtx, signal, event);
2460
+ } catch (error) {
2461
+ if (signal.aborted) throw error;
2462
+ if (error instanceof Response) middlewareResponse = reconcileResponse(error, event);
2463
+ else if (!isServerFnRequest) throw error;
2464
+ else {
2465
+ const disposeLate = createLateResponseDisposer(signal);
2466
+ middlewareResponse = await waitForRequest(runWithStartContext({
2467
+ ...startContext,
2468
+ contextAfterGlobalMiddlewares: middlewareCtx.context
2469
+ }, () => createServerFnErrorResponse(error)), signal, disposeLate, disposeLate);
2470
+ middlewareResponse = reconcileResponse(middlewareResponse, event);
2471
+ }
2472
+ }
1894
2473
  let result;
1895
2474
  try {
1896
- result = await handleRedirectResponse(middlewareResponse, getRouter, signal, isServerFnRequest && request.headers.get("x-tsr-serverFn") === "true");
1897
- if (request.method === "HEAD") result = stripSsrResponseBody(result, "HEAD body stripped");
2475
+ result = normalizeSsrResponse(middlewareResponse);
2476
+ if (isRedirect(result.response)) result = await handleRedirectResponse(result, getRouter, signal, isServerFnRequest && request.headers.get("x-tsr-serverFn") === "true", event);
2477
+ if (request.method === "HEAD" && result.response.body !== null) {
2478
+ const source = result.response;
2479
+ result = stripSsrResponseBody(result, "HEAD body stripped");
2480
+ transferResponseMetadata(source, result.response);
2481
+ }
1898
2482
  } catch (error) {
1899
2483
  disposeResponseResult(middlewareResponse, signal.aborted ? signal.reason : error);
1900
2484
  throw error;
@@ -1902,17 +2486,26 @@ function createStartHandler(cbOrOptions) {
1902
2486
  bindSsrResponseToRequest(router, result, signal);
1903
2487
  signal.throwIfAborted();
1904
2488
  responseOwnsCleanup = result.serverSsrCleanup === "stream";
1905
- return result.response;
2489
+ response = result.response;
1906
2490
  } finally {
1907
- if (router?.serverSsr && !responseOwnsCleanup) router.serverSsr.cleanup();
2491
+ if (router?.serverSsr && !responseOwnsCleanup) {
2492
+ router.serverSsr.cleanup();
2493
+ if (response) response = finalizeResponse(response, event);
2494
+ }
1908
2495
  }
2496
+ return response;
1909
2497
  };
1910
- return requestHandler(startRequestResolver);
2498
+ return withStartRequest(startRequestResolver);
1911
2499
  }
1912
2500
  var relativeRedirectProtocols = /* @__PURE__ */ new Set();
1913
- async function handleRedirectResponse(response, getRouter, signal, serializeRedirect) {
2501
+ var SERIALIZED_REDIRECT_HEADERS = /* @__PURE__ */ new Map([
2502
+ ["content-type", "application/json"],
2503
+ ["location", null],
2504
+ [X_TSS_RAW_RESPONSE, null],
2505
+ [X_TSS_SERIALIZED, null]
2506
+ ]);
2507
+ async function handleRedirectResponse(ssrResponse, getRouter, signal, serializeRedirect, event) {
1914
2508
  signal.throwIfAborted();
1915
- const ssrResponse = normalizeSsrResponse(response);
1916
2509
  const redirect = ssrResponse.response;
1917
2510
  if (!isRedirect(redirect)) return ssrResponse;
1918
2511
  const opts = redirect.options;
@@ -1935,28 +2528,50 @@ async function handleRedirectResponse(response, getRouter, signal, serializeRedi
1935
2528
  if (serializeRedirect) {
1936
2529
  const redirectOptions = { ...opts };
1937
2530
  delete redirectOptions.headers;
2531
+ redirectOptions.isSerializedRedirect = true;
1938
2532
  const responseHeaders = new Headers(redirect.headers);
1939
2533
  responseHeaders.set("content-type", "application/json");
1940
- return replaceSsrResponse(ssrResponse, Response.json({
1941
- ...redirectOptions,
1942
- isSerializedRedirect: true
1943
- }, { headers: responseHeaders }), "redirect response replaced");
2534
+ responseHeaders.delete("location");
2535
+ responseHeaders.delete(X_TSS_RAW_RESPONSE);
2536
+ responseHeaders.delete(X_TSS_SERIALIZED);
2537
+ const body = JSON.stringify(redirectOptions);
2538
+ if (body === void 0) throw new TypeError("Value is not JSON serializable");
2539
+ disposeSsrResponse(ssrResponse, "redirect response replaced");
2540
+ return {
2541
+ response: createFinalizedResponse(body, responseHeaders, SERIALIZED_REDIRECT_HEADERS, event),
2542
+ serverSsrCleanup: "none"
2543
+ };
1944
2544
  }
2545
+ ssrResponse.response = finalizeResponse(redirect, event);
1945
2546
  return ssrResponse;
1946
2547
  }
1947
- async function handleServerRoutes({ getRouter, request, url, executeRouter, context, executedRequestMiddlewares }) {
2548
+ function withParsedParams(handler, matchedRoutes) {
2549
+ if (!matchedRoutes.some((route) => route.options.params?.parse ?? route.options.parseParams)) return handler;
2550
+ return (ctx) => {
2551
+ const params = Object.assign(Object.create(null), ctx.params);
2552
+ for (const route of matchedRoutes) {
2553
+ const parse = route.options.params?.parse ?? route.options.parseParams;
2554
+ if (parse) Object.assign(params, parse(params));
2555
+ }
2556
+ return handler({
2557
+ ...ctx,
2558
+ params
2559
+ });
2560
+ };
2561
+ }
2562
+ async function handleServerRoutes({ getRouter, request, executeRouter, context, executedRequestMiddlewares, signal, event }) {
1948
2563
  const router = await getRouter();
1949
- const pathname = executeRewriteInput(router.rewrite, url).pathname;
2564
+ const { pathname } = router.latestLocation;
1950
2565
  const [matchedRoutes, rawParams, foundRoute] = router.getMatchedRoutes(pathname);
1951
2566
  const isExactMatch = foundRoute && rawParams["**"] === void 0;
1952
2567
  const routeMiddlewares = [];
1953
- let terminalHandler = (ctx) => executeRouter(ctx.context, matchedRoutes);
2568
+ let terminalHandler = (ctx) => executeRouter(ctx.context, matchedRoutes, router);
1954
2569
  let terminalNext;
1955
2570
  for (const route of matchedRoutes) {
1956
2571
  const serverMiddleware = route.options.server?.middleware;
1957
2572
  if (serverMiddleware) {
1958
2573
  const flattened = flattenMiddlewares(serverMiddleware);
1959
- for (const m of flattened) if (!executedRequestMiddlewares.has(m)) routeMiddlewares.push(m.options.server);
2574
+ for (const m of flattened) if (!executedRequestMiddlewares?.has(m)) routeMiddlewares.push(m.options.server);
1960
2575
  }
1961
2576
  }
1962
2577
  const server = foundRoute?.options.server;
@@ -1966,38 +2581,35 @@ async function handleServerRoutes({ getRouter, request, url, executeRouter, cont
1966
2581
  const handler = requestMethod === "HEAD" ? handlers["HEAD"] ?? handlers["GET"] ?? handlers["ANY"] : handlers[requestMethod] ?? handlers["ANY"];
1967
2582
  if (handler) {
1968
2583
  const mayDefer = !!foundRoute.options.component;
1969
- if (typeof handler === "function") if (!mayDefer) {
1970
- terminalHandler = handler;
1971
- terminalNext = throwIfMayNotDefer;
1972
- } else routeMiddlewares.push(handler);
1973
- else {
2584
+ if (typeof handler !== "function") {
1974
2585
  if (handler.middleware?.length) {
1975
2586
  const handlerMiddlewares = flattenMiddlewares(handler.middleware);
1976
2587
  for (const m of handlerMiddlewares) routeMiddlewares.push(m.options.server);
1977
2588
  }
1978
- if (handler.handler) if (!mayDefer) {
1979
- terminalHandler = handler.handler;
2589
+ }
2590
+ const routeHandler = typeof handler === "function" ? handler : handler.handler;
2591
+ if (routeHandler) {
2592
+ const parsedHandler = withParsedParams(routeHandler, matchedRoutes);
2593
+ if (!mayDefer) {
2594
+ terminalHandler = parsedHandler;
1980
2595
  terminalNext = throwIfMayNotDefer;
1981
- } else routeMiddlewares.push(handler.handler);
2596
+ } else routeMiddlewares.push(parsedHandler);
1982
2597
  }
1983
2598
  }
1984
2599
  }
1985
- return normalizeSsrResponse(await executeMiddleware(routeMiddlewares, terminalHandler, {
2600
+ const response = await executeMiddleware(routeMiddlewares, terminalHandler, {
1986
2601
  request,
1987
2602
  context,
1988
2603
  params: rawParams,
1989
2604
  pathname,
1990
2605
  handlerType: "router"
1991
- }, request.signal, terminalNext));
2606
+ }, signal, event, terminalNext);
2607
+ return normalizeSsrResponse(response);
1992
2608
  }
1993
2609
  //#endregion
1994
2610
  //#region node_modules/@tanstack/react-start/dist/plugin/default-entry/server.ts
1995
2611
  var fetch = createStartHandler(defaultStreamHandler);
1996
- function createServerEntry(entry) {
1997
- return { async fetch(...args) {
1998
- return await entry.fetch(...args);
1999
- } };
2000
- }
2612
+ var createServerEntry = createServerEntry$1;
2001
2613
  var server_default = createServerEntry({ fetch });
2002
2614
  //#endregion
2003
2615
  export { createServerEntry, server_default as default, TSS_SERVER_FUNCTION as n, getServerFnById as r, createServerFn as t };