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.
- package/bin/args.js +8 -0
- package/bin/args.test.js +11 -1
- package/bin/cli-bun.js +2 -2
- package/dist/client/assets/MemberDetail-Du4HYTda.js +1 -0
- package/dist/client/assets/index-g58gbZKl.js +12 -0
- package/dist/client/assets/matchContext-BfDTxnb0.js +2 -0
- package/dist/client/assets/providers._name-DztqmroK.js +1 -0
- package/dist/client/assets/providers._name.functions._token-Dds2hD5R.js +1 -0
- package/dist/client/assets/providers._name.functions._token-DkZe4R_v.js +1 -0
- package/dist/client/assets/providers._name.index-B6cK3ZCZ.js +1 -0
- package/dist/client/assets/providers._name.index-CvFTUtAs.js +1 -0
- package/dist/client/assets/providers._name.resources._token-Bf7TPYcB.js +1 -0
- package/dist/client/assets/providers._name.resources._token-CIjv9yb8.js +1 -0
- package/dist/client/assets/routes-Dz3Kksbm.js +1 -0
- package/dist/server/assets/{_tanstack-start-manifest_v-DNIp6gp3.js → _tanstack-start-manifest_v-Drm3Ru6D.js} +15 -13
- package/dist/server/server.js +984 -372
- package/package.json +2 -2
- package/dist/client/assets/MemberDetail-D8jkDkVP.js +0 -1
- package/dist/client/assets/index-DM9VsIdh.js +0 -13
- package/dist/client/assets/providers._name-C-FSbmVZ.js +0 -1
- package/dist/client/assets/providers._name.functions._token-B3S8Gcfx.js +0 -1
- package/dist/client/assets/providers._name.functions._token-C4VPHGlG.js +0 -1
- package/dist/client/assets/providers._name.index-CWHPtoBD.js +0 -1
- package/dist/client/assets/providers._name.index-nlnQuJ9Q.js +0 -1
- package/dist/client/assets/providers._name.resources._token-BISpZVHI.js +0 -1
- package/dist/client/assets/providers._name.resources._token-CvMi94a3.js +0 -1
- package/dist/client/assets/routes-DwhZQHE3.js +0 -1
- package/dist/client/assets/useSelector-BIt42tGI.js +0 -1
package/dist/server/server.js
CHANGED
|
@@ -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 {
|
|
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/
|
|
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
|
-
|
|
31
|
-
|
|
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
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
function
|
|
40
|
-
|
|
41
|
-
const
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
}
|
|
48
|
-
function
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
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
|
-
|
|
57
|
-
|
|
58
|
-
|
|
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
|
-
|
|
441
|
+
return await entry.fetch(request, requestOpts);
|
|
61
442
|
} catch (error) {
|
|
62
|
-
|
|
63
|
-
status: 400,
|
|
64
|
-
statusText: "Bad Request"
|
|
65
|
-
});
|
|
66
|
-
throw error;
|
|
443
|
+
return handleStartError(error);
|
|
67
444
|
}
|
|
68
|
-
|
|
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
|
|
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
|
|
462
|
+
return event;
|
|
75
463
|
}
|
|
76
|
-
|
|
77
|
-
|
|
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-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
418
|
-
if (TSS_SERVER_FUNCTION_FACTORY in
|
|
419
|
-
if (
|
|
420
|
-
} else newMiddleware.push(
|
|
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:
|
|
430
|
-
|
|
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
|
-
|
|
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
|
-
|
|
869
|
+
const ctx = {
|
|
461
870
|
...extractedFn,
|
|
462
|
-
|
|
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
|
-
}
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
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
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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:
|
|
927
|
+
next: (nextCtx = {}) => callNextMiddleware(ctx, nextCtx)
|
|
519
928
|
});
|
|
520
|
-
if (
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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:
|
|
616
|
-
|
|
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
|
-
|
|
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
|
-
|
|
631
|
-
|
|
632
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
683
|
-
|
|
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
|
-
|
|
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
|
|
711
|
-
|
|
712
|
-
|
|
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 (
|
|
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
|
|
727
|
-
|
|
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
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
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
|
|
744
|
-
|
|
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
|
|
749
|
-
return unwrapped;
|
|
1245
|
+
return setProtectedResponseHeaders(unwrapped, RAW_RESPONSE_HEADERS);
|
|
750
1246
|
}
|
|
751
|
-
return serializeResult(res, request
|
|
1247
|
+
return serializeResult(res, request, getRequestSerovalPlugins());
|
|
752
1248
|
} catch (error) {
|
|
753
1249
|
if (error instanceof Response) return error;
|
|
754
|
-
|
|
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,
|
|
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
|
|
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
|
-
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
1394
|
-
if (
|
|
1395
|
-
return opts.handlerInlineCss
|
|
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 =
|
|
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) =>
|
|
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(
|
|
1478
|
-
const
|
|
1479
|
-
if (
|
|
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
|
-
|
|
1483
|
-
return
|
|
1975
|
+
finalManifestCache.set(cacheKey, cachedPromise);
|
|
1976
|
+
return cachedPromise;
|
|
1484
1977
|
}
|
|
1485
|
-
function
|
|
1486
|
-
const
|
|
1487
|
-
if (
|
|
1488
|
-
return cacheFinalManifestPromise(
|
|
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
|
|
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 =
|
|
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
|
-
|
|
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(
|
|
1538
|
-
|
|
1539
|
-
|
|
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
|
|
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 (!
|
|
1562
|
-
|
|
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
|
-
|
|
1586
|
-
|
|
1587
|
-
|
|
1588
|
-
|
|
1589
|
-
|
|
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
|
|
2130
|
+
let returnedDepth = Infinity;
|
|
1623
2131
|
const disposeAbandonedResult = createLateResponseDisposer(signal);
|
|
1624
|
-
const
|
|
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
|
-
|
|
1630
|
-
|
|
1631
|
-
|
|
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,
|
|
1635
|
-
current.response
|
|
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)
|
|
1639
|
-
|
|
1640
|
-
response
|
|
1641
|
-
|
|
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
|
|
1649
|
-
|
|
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
|
-
|
|
1662
|
-
|
|
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 =
|
|
1666
|
-
const middleware =
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
1702
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
1767
|
-
|
|
1768
|
-
const
|
|
1769
|
-
if (
|
|
1770
|
-
|
|
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
|
|
1791
|
-
|
|
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
|
|
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(
|
|
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
|
|
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
|
|
2409
|
+
const storedStartContext = getStartContext({ throwIfNotFound: false });
|
|
1850
2410
|
attachRouterServerSsrUtils({
|
|
1851
2411
|
router: routerInstance,
|
|
1852
2412
|
manifest,
|
|
1853
|
-
getRequestAssets: () =>
|
|
2413
|
+
getRequestAssets: () => storedStartContext?.requestAssets
|
|
1854
2414
|
});
|
|
1855
2415
|
routerInstance.options.additionalContext = { serverContext };
|
|
1856
|
-
await routerInstance.load({
|
|
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:
|
|
2424
|
+
requestAssets: storedStartContext?.requestAssets,
|
|
1863
2425
|
signal
|
|
1864
2426
|
});
|
|
1865
2427
|
signal.throwIfAborted();
|
|
1866
|
-
const responseHeaders = getStartResponseHeaders(
|
|
2428
|
+
const responseHeaders = getStartResponseHeaders(routerInstance);
|
|
1867
2429
|
earlyHints?.appendResponseHeaders(responseHeaders);
|
|
1868
2430
|
signal.throwIfAborted();
|
|
1869
|
-
|
|
1870
|
-
return normalizeSsrResponse(await waitForRequest(cb({
|
|
2431
|
+
return normalizeSsrResponse(await cb({
|
|
1871
2432
|
request,
|
|
1872
2433
|
router: routerInstance,
|
|
1873
2434
|
responseHeaders
|
|
1874
|
-
})
|
|
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
|
|
2450
|
+
const middlewareCtx = {
|
|
1889
2451
|
request,
|
|
1890
2452
|
pathname: url.pathname,
|
|
1891
2453
|
handlerType,
|
|
1892
2454
|
context: createNullProtoObject(requestOpts?.context)
|
|
1893
|
-
}
|
|
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 =
|
|
1897
|
-
if (
|
|
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
|
-
|
|
2489
|
+
response = result.response;
|
|
1906
2490
|
} finally {
|
|
1907
|
-
if (router?.serverSsr && !responseOwnsCleanup)
|
|
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
|
|
2498
|
+
return withStartRequest(startRequestResolver);
|
|
1911
2499
|
}
|
|
1912
2500
|
var relativeRedirectProtocols = /* @__PURE__ */ new Set();
|
|
1913
|
-
|
|
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
|
-
|
|
1941
|
-
|
|
1942
|
-
|
|
1943
|
-
|
|
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
|
-
|
|
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 =
|
|
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
|
|
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
|
|
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
|
-
|
|
1979
|
-
|
|
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(
|
|
2596
|
+
} else routeMiddlewares.push(parsedHandler);
|
|
1982
2597
|
}
|
|
1983
2598
|
}
|
|
1984
2599
|
}
|
|
1985
|
-
|
|
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
|
-
},
|
|
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
|
-
|
|
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 };
|