gitxp 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/.output/nitro.json +17 -0
  2. package/.output/public/assets/index-BGHvBNtP.js +11 -0
  3. package/.output/public/assets/routes-DuE8S6pX.js +60 -0
  4. package/.output/public/assets/styles-D5xbQNYu.css +1 -0
  5. package/.output/server/_chunks/ssr-renderer.mjs +26 -0
  6. package/.output/server/_libs/@floating-ui/core+[...].mjs +671 -0
  7. package/.output/server/_libs/@floating-ui/dom+[...].mjs +649 -0
  8. package/.output/server/_libs/@floating-ui/react-dom+[...].mjs +856 -0
  9. package/.output/server/_libs/@radix-ui/react-arrow+[...].mjs +258 -0
  10. package/.output/server/_libs/@radix-ui/react-dialog+[...].mjs +1862 -0
  11. package/.output/server/_libs/@radix-ui/react-popper+[...].mjs +320 -0
  12. package/.output/server/_libs/@radix-ui/react-tooltip+[...].mjs +534 -0
  13. package/.output/server/_libs/@tanstack/db+[...].mjs +14680 -0
  14. package/.output/server/_libs/@tanstack/react-router+[...].mjs +14563 -0
  15. package/.output/server/_libs/@tanstack/react-router-ssr-query+[...].mjs +126 -0
  16. package/.output/server/_libs/@tanstack/router-core+[...].mjs +3636 -0
  17. package/.output/server/_libs/class-variance-authority+clsx.mjs +69 -0
  18. package/.output/server/_libs/cmdk.mjs +504 -0
  19. package/.output/server/_libs/h3+rou3+srvx.mjs +1361 -0
  20. package/.output/server/_libs/h3-v2.mjs +285 -0
  21. package/.output/server/_libs/lucide-react.mjs +158 -0
  22. package/.output/server/_libs/radix-ui__primitive.mjs +44 -0
  23. package/.output/server/_libs/radix-ui__react-context.mjs +108 -0
  24. package/.output/server/_libs/tailwind-merge.mjs +3380 -0
  25. package/.output/server/_libs/tanstack__history.mjs +384 -0
  26. package/.output/server/_libs/tanstack__query-core.mjs +2225 -0
  27. package/.output/server/_libs/tanstack__react-db.mjs +242 -0
  28. package/.output/server/_libs/tanstack__react-query.mjs +140 -0
  29. package/.output/server/_libs/ufo.mjs +64 -0
  30. package/.output/server/_runtime.mjs +35 -0
  31. package/.output/server/_ssr/empty-plugin-adapters-D9UWiqvJ.mjs +5 -0
  32. package/.output/server/_ssr/events-BNrmOvgU.mjs +13 -0
  33. package/.output/server/_ssr/notifications-DUoENv6E.mjs +514 -0
  34. package/.output/server/_ssr/router-DsUHD4bT.mjs +179 -0
  35. package/.output/server/_ssr/routes-DIFfr242.mjs +982 -0
  36. package/.output/server/_ssr/ssr.mjs +1854 -0
  37. package/.output/server/_ssr/start-5Z2QO8AU.mjs +4 -0
  38. package/.output/server/_tanstack-start-manifest_v-CrD0YpZr.mjs +20 -0
  39. package/.output/server/index.mjs +310 -0
  40. package/.output/server/node_modules/tslib/modules/index.js +70 -0
  41. package/.output/server/node_modules/tslib/modules/package.json +3 -0
  42. package/.output/server/node_modules/tslib/package.json +47 -0
  43. package/.output/server/node_modules/tslib/tslib.js +484 -0
  44. package/.output/server/package.json +9 -0
  45. package/LICENSE +21 -0
  46. package/README.md +325 -0
  47. package/bin/gitxp.js +85 -0
  48. package/package.json +92 -0
@@ -0,0 +1,1854 @@
1
+ import { n as __exportAll } from "../_runtime.mjs";
2
+ import { u as require_react } from "../_libs/@floating-ui/react-dom+[...].mjs";
3
+ import { C as getStylesheetHref, D as executeRewriteInput, E as _getRenderedMatches, F as rootRouteId, I as isNotFound, M as isRedirect, N as isResolvedRedirect, O as invariant, P as parseRedirect, S as getScriptPreloadAttrs, T as resolveManifestCssLink, a as isSsrResponse, c as stripSsrResponseBody, d as RouterProvider, i as disposeSsrResponseDetached, n as bindSsrResponseToRequest, o as normalizeSsrResponse, r as defineHandlerCallback, s as replaceSsrResponse, t as renderRouterToStream, w as resolveManifestAssetLink } from "../_libs/@tanstack/react-router+[...].mjs";
4
+ import { n as createMemoryHistory } from "../_libs/tanstack__history.mjs";
5
+ import { a as getOrigin, c as createSerializationAdapter, d as toCrossJSONAsync, f as toCrossJSONStream, i as getNormalizedURL, l as makeSerovalPlugin, n as mergeHeaders, o as defaultSerovalPlugins, r as attachRouterServerSsrUtils, s as createRawStreamRPCPlugin, t as waitForRequest, u as fromJSON } from "../_libs/@tanstack/router-core+[...].mjs";
6
+ import { l as require_jsx_runtime } from "../_libs/@radix-ui/react-arrow+[...].mjs";
7
+ import { n as toResponse, t as H3Event } from "../_libs/h3-v2.mjs";
8
+ import { AsyncLocalStorage } from "node:async_hooks";
9
+ //#region node_modules/.nitro/vite/services/ssr/index.js
10
+ var ssr_exports = /* @__PURE__ */ __exportAll({
11
+ createServerEntry: () => createServerEntry,
12
+ default: () => server_default,
13
+ n: () => TSS_SERVER_FUNCTION,
14
+ r: () => getServerFnById,
15
+ t: () => createServerFn
16
+ });
17
+ require_react();
18
+ var import_jsx_runtime = require_jsx_runtime();
19
+ function StartServer(props) {
20
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(RouterProvider, { router: props.router });
21
+ }
22
+ var defaultStreamHandler = defineHandlerCallback(({ request, router, responseHeaders }) => renderRouterToStream({
23
+ request,
24
+ router,
25
+ responseHeaders,
26
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(StartServer, { router })
27
+ }));
28
+ var GLOBAL_EVENT_STORAGE_KEY = Symbol.for("tanstack-start:event-storage");
29
+ var globalObj$1 = globalThis;
30
+ if (!globalObj$1[GLOBAL_EVENT_STORAGE_KEY]) globalObj$1[GLOBAL_EVENT_STORAGE_KEY] = new AsyncLocalStorage();
31
+ var eventStorage = globalObj$1[GLOBAL_EVENT_STORAGE_KEY];
32
+ function isPromiseLike(value) {
33
+ return typeof value.then === "function";
34
+ }
35
+ function getSetCookieValues(headers) {
36
+ const headersWithSetCookie = headers;
37
+ if (typeof headersWithSetCookie.getSetCookie === "function") return headersWithSetCookie.getSetCookie();
38
+ const value = headers.get("set-cookie");
39
+ return value ? [value] : [];
40
+ }
41
+ function mergeEventResponseHeaders(response, event) {
42
+ if (response.ok) return;
43
+ const eventSetCookies = getSetCookieValues(event.res.headers);
44
+ if (eventSetCookies.length === 0) return;
45
+ const responseSetCookies = getSetCookieValues(response.headers);
46
+ response.headers.delete("set-cookie");
47
+ for (const cookie of responseSetCookies) response.headers.append("set-cookie", cookie);
48
+ for (const cookie of eventSetCookies) response.headers.append("set-cookie", cookie);
49
+ }
50
+ function attachResponseHeaders(value, event) {
51
+ if (isPromiseLike(value)) return value.then((resolved) => {
52
+ if (resolved instanceof Response) mergeEventResponseHeaders(resolved, event);
53
+ return resolved;
54
+ });
55
+ if (value instanceof Response) mergeEventResponseHeaders(value, event);
56
+ return value;
57
+ }
58
+ function requestHandler(handler) {
59
+ return (request, requestOpts) => {
60
+ let h3Event;
61
+ try {
62
+ h3Event = new H3Event(request);
63
+ } catch (error) {
64
+ if (error instanceof URIError) return new Response(null, {
65
+ status: 400,
66
+ statusText: "Bad Request"
67
+ });
68
+ throw error;
69
+ }
70
+ return toResponse(attachResponseHeaders(eventStorage.run({ h3Event }, () => handler(request, requestOpts)), h3Event), h3Event);
71
+ };
72
+ }
73
+ function getH3Event() {
74
+ const event = eventStorage.getStore();
75
+ if (!event) throw new Error(`No StartEvent found in AsyncLocalStorage. Make sure you are using the function within the server runtime.`);
76
+ return event.h3Event;
77
+ }
78
+ function getResponse() {
79
+ return getH3Event().res;
80
+ }
81
+ var HEADERS = { TSS_SHELL: "X-TSS_SHELL" };
82
+ /**
83
+ * @description Returns the router manifest data that should be sent to the client.
84
+ * This includes only the assets and preloads for the current route and any
85
+ * special assets that are needed for the client. It does not include relationships
86
+ * between routes or any other data that is not needed for the client.
87
+ *
88
+ * @param matchedRoutes - In dev mode, the matched routes are used to build
89
+ * the dev styles URL for route-scoped CSS collection.
90
+ */
91
+ async function getStartManifest(matchedRoutes) {
92
+ const { tsrStartManifest } = await import("../_tanstack-start-manifest_v-CrD0YpZr.mjs");
93
+ const startManifest = tsrStartManifest();
94
+ let routes = startManifest.routes;
95
+ routes[rootRouteId];
96
+ const manifestRoutes = {};
97
+ for (const k in routes) {
98
+ const v = routes[k];
99
+ const result = {};
100
+ if (v.preloads && v.preloads.length > 0) result.preloads = v.preloads;
101
+ if (v.scripts && v.scripts.length > 0) result.scripts = v.scripts;
102
+ if (v.css?.length) result.css = v.css;
103
+ if (result.preloads || result.scripts || result.css) manifestRoutes[k] = result;
104
+ }
105
+ return {
106
+ ...startManifest.scriptFormat ? { scriptFormat: startManifest.scriptFormat } : {},
107
+ ...startManifest.inlineCss ? { inlineCss: startManifest.inlineCss } : {},
108
+ routes: manifestRoutes
109
+ };
110
+ }
111
+ var manifest = {
112
+ "0babd28c77cb1e09ec4d58a288fb1a4e4ea676ad4fb655c65b2949da4de21e51": {
113
+ functionName: "syncNow_createServerFn_handler",
114
+ importer: () => import("./notifications-DUoENv6E.mjs")
115
+ },
116
+ "2360b4abbe0e8d19207ee28b76c335507d4577387d16ff7c5e69d2d1ccf2900b": {
117
+ functionName: "getFailedMutations_createServerFn_handler",
118
+ importer: () => import("./notifications-DUoENv6E.mjs")
119
+ },
120
+ "5cfec4c6dee804d3573d611211f1ac5f56628842c036a21f55c9ae92c73dfff0": {
121
+ functionName: "getNotifications_createServerFn_handler",
122
+ importer: () => import("./notifications-DUoENv6E.mjs")
123
+ },
124
+ "6e5e9052f4c44bc48d2cacaa624ebc266d94ad8c4f5211de50e7760446323376": {
125
+ functionName: "retryFailedMutations_createServerFn_handler",
126
+ importer: () => import("./notifications-DUoENv6E.mjs")
127
+ },
128
+ "9c3c7c75152987d0c0eb6e93398f5ac49bc91adf254a6cb7e7582da1ab9c7b69": {
129
+ functionName: "markNotificationDone_createServerFn_handler",
130
+ importer: () => import("./notifications-DUoENv6E.mjs")
131
+ },
132
+ "c037beb8cda5c53572baa3bcea8e77650282ca11237e45b8703f106284575801": {
133
+ functionName: "getSyncStatus_createServerFn_handler",
134
+ importer: () => import("./notifications-DUoENv6E.mjs")
135
+ },
136
+ "ec7cb03fde2349fdcee3000ccfc2f527248df2b7c89c3db9ad0c3ce452363f15": {
137
+ functionName: "markNotificationRead_createServerFn_handler",
138
+ importer: () => import("./notifications-DUoENv6E.mjs")
139
+ }
140
+ };
141
+ async function getServerFnById(id, access) {
142
+ const serverFnInfo = manifest[id];
143
+ if (!serverFnInfo) throw new Error("Server function info not found for " + id);
144
+ const fnModule = serverFnInfo.module ?? await serverFnInfo.importer();
145
+ if (!fnModule) throw new Error("Server function module not resolved for " + id);
146
+ const action = fnModule[serverFnInfo.functionName];
147
+ if (!action) throw new Error("Server function module export not resolved for serverFn ID: " + id);
148
+ return action;
149
+ }
150
+ var TSS_FORMDATA_CONTEXT = "__TSS_CONTEXT";
151
+ var TSS_SERVER_FUNCTION = Symbol.for("TSS_SERVER_FUNCTION");
152
+ var TSS_SERVER_FUNCTION_FACTORY = Symbol.for("TSS_SERVER_FUNCTION_FACTORY");
153
+ var X_TSS_SERIALIZED = "x-tss-serialized";
154
+ var X_TSS_RAW_RESPONSE = "x-tss-raw";
155
+ /** Content-Type for multiplexed framed responses (RawStream support) */
156
+ var TSS_CONTENT_TYPE_FRAMED = "application/x-tss-framed";
157
+ /**
158
+ * Frame types for binary multiplexing protocol.
159
+ */
160
+ var FrameType = {
161
+ /** Seroval JSON chunk (NDJSON line) */
162
+ JSON: 0,
163
+ /** Raw stream data chunk */
164
+ CHUNK: 1,
165
+ /** Raw stream end (EOF) */
166
+ END: 2,
167
+ /** Raw stream error */
168
+ ERROR: 3
169
+ };
170
+ /** Full Content-Type header value with version parameter */
171
+ var TSS_CONTENT_TYPE_FRAMED_VERSIONED = `${TSS_CONTENT_TYPE_FRAMED}; v=1`;
172
+ function isSafeKey(key) {
173
+ return key !== "__proto__" && key !== "constructor" && key !== "prototype";
174
+ }
175
+ /**
176
+ * Merge target and source into a new null-proto object, filtering dangerous keys.
177
+ */
178
+ function safeObjectMerge(target, source) {
179
+ const result = Object.create(null);
180
+ if (target) {
181
+ for (const key of Object.keys(target)) if (isSafeKey(key)) result[key] = target[key];
182
+ }
183
+ if (source && typeof source === "object") {
184
+ for (const key of Object.keys(source)) if (isSafeKey(key)) result[key] = source[key];
185
+ }
186
+ return result;
187
+ }
188
+ /**
189
+ * Create a null-prototype object, optionally copying from source.
190
+ */
191
+ function createNullProtoObject(source) {
192
+ if (!source) return Object.create(null);
193
+ const obj = Object.create(null);
194
+ for (const key of Object.keys(source)) if (isSafeKey(key)) obj[key] = source[key];
195
+ return obj;
196
+ }
197
+ var GLOBAL_STORAGE_KEY = Symbol.for("tanstack-start:start-storage-context");
198
+ var globalObj = globalThis;
199
+ if (!globalObj[GLOBAL_STORAGE_KEY]) globalObj[GLOBAL_STORAGE_KEY] = new AsyncLocalStorage();
200
+ var startStorage = globalObj[GLOBAL_STORAGE_KEY];
201
+ async function runWithStartContext(context, fn) {
202
+ return startStorage.run(context, fn);
203
+ }
204
+ function getStartContext(opts) {
205
+ const context = startStorage.getStore();
206
+ if (!context && opts?.throwIfNotFound !== false) throw new Error(`No Start context found in AsyncLocalStorage. Make sure you are using the function within the server runtime.`);
207
+ return context;
208
+ }
209
+ var getStartOptions = () => getStartContext().startOptions;
210
+ var getStartContextServerOnly = getStartContext;
211
+ var createServerFn = (options, __opts) => {
212
+ const resolvedOptions = __opts || options || {};
213
+ if (typeof resolvedOptions.method === "undefined") resolvedOptions.method = "GET";
214
+ const setValidator = (validator) => {
215
+ return createServerFn(void 0, {
216
+ ...resolvedOptions,
217
+ validator,
218
+ inputValidator: validator
219
+ });
220
+ };
221
+ const res = {
222
+ options: resolvedOptions,
223
+ middleware: (middleware) => {
224
+ const newMiddleware = [...resolvedOptions.middleware || []];
225
+ middleware.map((m) => {
226
+ if (TSS_SERVER_FUNCTION_FACTORY in m) {
227
+ if (m.options.middleware) newMiddleware.push(...m.options.middleware);
228
+ } else newMiddleware.push(m);
229
+ });
230
+ const res = createServerFn(void 0, {
231
+ ...resolvedOptions,
232
+ middleware: newMiddleware
233
+ });
234
+ res[TSS_SERVER_FUNCTION_FACTORY] = true;
235
+ return res;
236
+ },
237
+ validator: setValidator,
238
+ inputValidator: setValidator,
239
+ handler: (...args) => {
240
+ const [extractedFn, serverFn] = args;
241
+ const newOptions = {
242
+ ...resolvedOptions,
243
+ extractedFn,
244
+ serverFn
245
+ };
246
+ const resolvedMiddleware = [...newOptions.middleware || [], serverFnBaseToMiddleware(newOptions)];
247
+ extractedFn.method = resolvedOptions.method;
248
+ return Object.assign(async (opts) => {
249
+ const result = await executeMiddleware$1(resolvedMiddleware, "client", {
250
+ ...extractedFn,
251
+ ...newOptions,
252
+ data: opts?.data,
253
+ headers: opts?.headers,
254
+ signal: opts?.signal,
255
+ fetch: opts?.fetch,
256
+ context: createNullProtoObject()
257
+ });
258
+ const redirect = parseRedirect(result.error);
259
+ if (redirect) throw redirect;
260
+ if (result.error) throw result.error;
261
+ return result.result;
262
+ }, {
263
+ ...extractedFn,
264
+ method: resolvedOptions.method,
265
+ __executeServer: async (opts) => {
266
+ const startContext = getStartContextServerOnly();
267
+ const serverContextAfterGlobalMiddlewares = startContext.contextAfterGlobalMiddlewares;
268
+ return await executeMiddleware$1(resolvedMiddleware, "server", {
269
+ ...extractedFn,
270
+ ...opts,
271
+ serverFnMeta: extractedFn.serverFnMeta,
272
+ context: safeObjectMerge(opts.context, serverContextAfterGlobalMiddlewares),
273
+ request: startContext.request
274
+ }).then((d) => ({
275
+ result: d.result,
276
+ error: d.error,
277
+ context: d.sendContext
278
+ }));
279
+ }
280
+ });
281
+ }
282
+ };
283
+ const fun = (options) => {
284
+ return createServerFn(void 0, {
285
+ ...resolvedOptions,
286
+ ...options
287
+ });
288
+ };
289
+ return Object.assign(fun, res);
290
+ };
291
+ async function executeMiddleware$1(middlewares, env, opts) {
292
+ let flattenedMiddlewares = flattenMiddlewares([...getStartOptions()?.functionMiddleware || [], ...middlewares]);
293
+ if (env === "server") {
294
+ const startContext = getStartContextServerOnly({ throwIfNotFound: false });
295
+ if (startContext?.executedRequestMiddlewares) flattenedMiddlewares = flattenedMiddlewares.filter((m) => !startContext.executedRequestMiddlewares.has(m));
296
+ }
297
+ const callNextMiddleware = async (ctx) => {
298
+ const nextMiddleware = flattenedMiddlewares.shift();
299
+ if (!nextMiddleware) return ctx;
300
+ try {
301
+ let validator = "validator" in nextMiddleware.options ? nextMiddleware.options.validator : void 0;
302
+ if (!validator && "inputValidator" in nextMiddleware.options) validator = nextMiddleware.options.inputValidator;
303
+ if (validator && env === "server") ctx.data = await execValidator(validator, ctx.data);
304
+ let middlewareFn = void 0;
305
+ if (env === "client") {
306
+ if ("client" in nextMiddleware.options) middlewareFn = nextMiddleware.options.client;
307
+ } else if ("server" in nextMiddleware.options) middlewareFn = nextMiddleware.options.server;
308
+ if (middlewareFn) {
309
+ const userNext = async (userCtx = {}) => {
310
+ const result = await callNextMiddleware({
311
+ ...ctx,
312
+ ...userCtx,
313
+ context: safeObjectMerge(ctx.context, userCtx.context),
314
+ sendContext: safeObjectMerge(ctx.sendContext, userCtx.sendContext),
315
+ headers: mergeHeaders(ctx.headers, userCtx.headers),
316
+ _callSiteFetch: ctx._callSiteFetch,
317
+ fetch: ctx._callSiteFetch ?? userCtx.fetch ?? ctx.fetch,
318
+ result: userCtx.result !== void 0 ? userCtx.result : userCtx instanceof Response ? userCtx : ctx.result,
319
+ error: userCtx.error ?? ctx.error
320
+ });
321
+ if (result.error) throw result.error;
322
+ return result;
323
+ };
324
+ const result = await middlewareFn({
325
+ ...ctx,
326
+ next: userNext
327
+ });
328
+ if (isRedirect(result)) return {
329
+ ...ctx,
330
+ error: result
331
+ };
332
+ if (result instanceof Response) return {
333
+ ...ctx,
334
+ result
335
+ };
336
+ if (!result) throw new Error("User middleware returned undefined. You must call next() or return a result in your middlewares.");
337
+ return result;
338
+ }
339
+ return callNextMiddleware(ctx);
340
+ } catch (error) {
341
+ return {
342
+ ...ctx,
343
+ error
344
+ };
345
+ }
346
+ };
347
+ return callNextMiddleware({
348
+ ...opts,
349
+ headers: opts.headers || {},
350
+ sendContext: opts.sendContext || {},
351
+ context: opts.context || createNullProtoObject(),
352
+ _callSiteFetch: opts.fetch
353
+ });
354
+ }
355
+ function flattenMiddlewares(middlewares, maxDepth = 100) {
356
+ const seen = /* @__PURE__ */ new Set();
357
+ const flattened = [];
358
+ const recurse = (middleware, depth) => {
359
+ if (depth > maxDepth) throw new Error(`Middleware nesting depth exceeded maximum of ${maxDepth}. Check for circular references.`);
360
+ middleware.forEach((m) => {
361
+ if (m.options.middleware) recurse(m.options.middleware, depth + 1);
362
+ if (!seen.has(m)) {
363
+ seen.add(m);
364
+ flattened.push(m);
365
+ }
366
+ });
367
+ };
368
+ recurse(middlewares, 0);
369
+ return flattened;
370
+ }
371
+ async function execValidator(validator, input) {
372
+ if (validator == null) return {};
373
+ if ("~standard" in validator) {
374
+ const result = await validator["~standard"].validate(input);
375
+ if (result.issues) throw new Error(JSON.stringify(result.issues, void 0, 2));
376
+ return result.value;
377
+ }
378
+ if ("parse" in validator) return validator.parse(input);
379
+ if (typeof validator === "function") return validator(input);
380
+ throw new Error("Invalid validator type!");
381
+ }
382
+ function serverFnBaseToMiddleware(options) {
383
+ return {
384
+ "~types": void 0,
385
+ options: {
386
+ inputValidator: options.validator ?? options.inputValidator,
387
+ client: async ({ next, sendContext, fetch, ...ctx }) => {
388
+ const payload = {
389
+ ...ctx,
390
+ context: sendContext,
391
+ fetch
392
+ };
393
+ return next(await options.extractedFn?.(payload));
394
+ },
395
+ server: async ({ next, ...ctx }) => {
396
+ const result = await options.serverFn?.(ctx);
397
+ return next({
398
+ ...ctx,
399
+ result
400
+ });
401
+ }
402
+ }
403
+ };
404
+ }
405
+ var createMiddleware = (options, __opts) => {
406
+ const resolvedOptions = {
407
+ type: "request",
408
+ ...__opts || options
409
+ };
410
+ const setValidator = (validator) => {
411
+ return createMiddleware({}, Object.assign(resolvedOptions, {
412
+ validator,
413
+ inputValidator: validator
414
+ }));
415
+ };
416
+ return {
417
+ options: resolvedOptions,
418
+ middleware: (middleware) => {
419
+ return createMiddleware({}, Object.assign(resolvedOptions, { middleware }));
420
+ },
421
+ validator: setValidator,
422
+ inputValidator: setValidator,
423
+ client: (client) => {
424
+ return createMiddleware({}, Object.assign(resolvedOptions, { client }));
425
+ },
426
+ server: (server) => {
427
+ return createMiddleware({}, Object.assign(resolvedOptions, { server }));
428
+ }
429
+ };
430
+ };
431
+ var innerCreateCsrfMiddleware = (opts = {}) => {
432
+ return createMiddleware().server(async (ctx) => {
433
+ const csrfCtx = ctx;
434
+ if (opts.filter && !await opts.filter(csrfCtx)) return ctx.next();
435
+ if (await isCsrfRequestAllowed(opts, csrfCtx)) return ctx.next();
436
+ return getFailureResponse(opts, csrfCtx);
437
+ });
438
+ };
439
+ var createCsrfMiddleware = innerCreateCsrfMiddleware;
440
+ async function isCsrfRequestAllowed(opts, ctx) {
441
+ const result = await getCsrfRequestValidationResult(opts, ctx);
442
+ return result === true || result === void 0 && opts.allowRequestsWithoutOriginCheck === true;
443
+ }
444
+ async function getCsrfRequestValidationResult(opts, ctx) {
445
+ const fetchSite = ctx.request.headers.get("Sec-Fetch-Site");
446
+ if (fetchSite !== null) return matchValue(opts.secFetchSite ?? "same-origin", fetchSite, ctx);
447
+ const origin = ctx.request.headers.get("Origin");
448
+ if (origin !== null) {
449
+ if (opts.origin) return matchValue(opts.origin, origin, ctx);
450
+ return origin === new URL(ctx.request.url).origin;
451
+ }
452
+ const referer = ctx.request.headers.get("Referer");
453
+ if (referer === null || opts.referer === false) return;
454
+ if (typeof opts.referer === "function") return opts.referer(referer, ctx);
455
+ if (opts.origin) {
456
+ const refererOrigin = getOriginFromUrl(referer);
457
+ return refererOrigin !== void 0 && matchValue(opts.origin, refererOrigin, ctx);
458
+ }
459
+ return isRefererSameOrigin(referer, new URL(ctx.request.url).origin);
460
+ }
461
+ async function matchValue(matcher, value, ctx) {
462
+ if (typeof matcher === "function") return matcher(value, ctx);
463
+ if (Array.isArray(matcher)) return matcher.includes(value);
464
+ return value === matcher;
465
+ }
466
+ function getOriginFromUrl(url) {
467
+ try {
468
+ return new URL(url).origin;
469
+ } catch {
470
+ return;
471
+ }
472
+ }
473
+ function isRefererSameOrigin(referer, requestOrigin) {
474
+ if (referer === requestOrigin) return true;
475
+ if (!referer.startsWith(requestOrigin)) return false;
476
+ if (referer.length === requestOrigin.length) return true;
477
+ const code = referer.charCodeAt(requestOrigin.length);
478
+ return code === 47 || code === 63 || code === 35;
479
+ }
480
+ async function getFailureResponse(opts, ctx) {
481
+ if (typeof opts.failureResponse === "function") return opts.failureResponse(ctx);
482
+ return opts.failureResponse?.clone() ?? new Response("Forbidden", { status: 403 });
483
+ }
484
+ function getDefaultSerovalPlugins() {
485
+ return [...(getStartOptions()?.serializationAdapters)?.map(makeSerovalPlugin) ?? [], ...defaultSerovalPlugins];
486
+ }
487
+ /**
488
+ * Binary frame protocol for multiplexing JSON and raw streams over HTTP.
489
+ *
490
+ * Frame format: [type:1][streamId:4][length:4][payload:length]
491
+ * - type: 1 byte - frame type (JSON, CHUNK, END, ERROR)
492
+ * - streamId: 4 bytes big-endian uint32 - stream identifier
493
+ * - length: 4 bytes big-endian uint32 - payload length
494
+ * - payload: variable length bytes
495
+ */
496
+ /** Cached TextEncoder for frame encoding */
497
+ var textEncoder = new TextEncoder();
498
+ /** Shared empty payload for END frames - avoids allocation per call */
499
+ var EMPTY_PAYLOAD = /* @__PURE__ */ new Uint8Array(0);
500
+ /**
501
+ * Encodes a single frame with header and payload.
502
+ */
503
+ function encodeFrame(type, streamId, payload) {
504
+ const frame = new Uint8Array(9 + payload.length);
505
+ frame[0] = type;
506
+ frame[1] = streamId >>> 24 & 255;
507
+ frame[2] = streamId >>> 16 & 255;
508
+ frame[3] = streamId >>> 8 & 255;
509
+ frame[4] = streamId & 255;
510
+ frame[5] = payload.length >>> 24 & 255;
511
+ frame[6] = payload.length >>> 16 & 255;
512
+ frame[7] = payload.length >>> 8 & 255;
513
+ frame[8] = payload.length & 255;
514
+ frame.set(payload, 9);
515
+ return frame;
516
+ }
517
+ /**
518
+ * Encodes a JSON frame (type 0, streamId 0).
519
+ */
520
+ function encodeJSONFrame(json) {
521
+ return encodeFrame(FrameType.JSON, 0, textEncoder.encode(json));
522
+ }
523
+ /**
524
+ * Encodes a raw stream chunk frame.
525
+ */
526
+ function encodeChunkFrame(streamId, chunk) {
527
+ return encodeFrame(FrameType.CHUNK, streamId, chunk);
528
+ }
529
+ /**
530
+ * Encodes a raw stream end frame.
531
+ */
532
+ function encodeEndFrame(streamId) {
533
+ return encodeFrame(FrameType.END, streamId, EMPTY_PAYLOAD);
534
+ }
535
+ /**
536
+ * Encodes a raw stream error frame.
537
+ */
538
+ function encodeErrorFrame(streamId, error) {
539
+ const message = error instanceof Error ? error.message : String(error ?? "Unknown error");
540
+ return encodeFrame(FrameType.ERROR, streamId, textEncoder.encode(message));
541
+ }
542
+ /**
543
+ * Creates a multiplexed ReadableStream from JSON stream and raw streams.
544
+ *
545
+ * The JSON stream emits NDJSON lines (from seroval's toCrossJSONStream).
546
+ * Raw streams are pumped concurrently, interleaved with JSON frames.
547
+ *
548
+ * Supports late stream registration for RawStreams discovered after initial
549
+ * serialization (e.g., from resolved Promises).
550
+ *
551
+ * @param jsonStream Stream of JSON strings (each string is one NDJSON line)
552
+ * @param rawStreams Map of stream IDs to raw binary streams (known at start)
553
+ * @param lateStreamSource Optional stream of late registrations for streams discovered later
554
+ */
555
+ function createMultiplexedStream(jsonStream, rawStreams, lateStreamSource) {
556
+ let controller;
557
+ let cancelled = false;
558
+ const readers = [];
559
+ const enqueue = (frame) => {
560
+ if (cancelled) return false;
561
+ try {
562
+ controller.enqueue(frame);
563
+ return true;
564
+ } catch {
565
+ return false;
566
+ }
567
+ };
568
+ const errorOutput = (error) => {
569
+ if (cancelled) return;
570
+ cancelled = true;
571
+ try {
572
+ controller.error(error);
573
+ } catch {}
574
+ for (const reader of readers) reader.cancel().catch(() => {});
575
+ };
576
+ async function pumpRawStream(streamId, stream) {
577
+ const reader = stream.getReader();
578
+ readers.push(reader);
579
+ try {
580
+ while (!cancelled) {
581
+ const { done, value } = await reader.read();
582
+ if (done) {
583
+ enqueue(encodeEndFrame(streamId));
584
+ return;
585
+ }
586
+ if (!enqueue(encodeChunkFrame(streamId, value))) return;
587
+ }
588
+ } catch (error) {
589
+ enqueue(encodeErrorFrame(streamId, error));
590
+ } finally {
591
+ reader.releaseLock();
592
+ }
593
+ }
594
+ async function pumpJSON() {
595
+ const reader = jsonStream.getReader();
596
+ readers.push(reader);
597
+ try {
598
+ while (!cancelled) {
599
+ const { done, value } = await reader.read();
600
+ if (done) return;
601
+ if (!enqueue(encodeJSONFrame(value))) return;
602
+ }
603
+ } catch (error) {
604
+ errorOutput(error);
605
+ throw error;
606
+ } finally {
607
+ reader.releaseLock();
608
+ }
609
+ }
610
+ async function pumpLateStreams() {
611
+ if (!lateStreamSource) return [];
612
+ const lateStreamPumps = [];
613
+ const reader = lateStreamSource.getReader();
614
+ readers.push(reader);
615
+ try {
616
+ while (!cancelled) {
617
+ const { done, value } = await reader.read();
618
+ if (done) break;
619
+ lateStreamPumps.push(pumpRawStream(value.id, value.stream));
620
+ }
621
+ } finally {
622
+ reader.releaseLock();
623
+ }
624
+ return lateStreamPumps;
625
+ }
626
+ return new ReadableStream({
627
+ async start(ctrl) {
628
+ controller = ctrl;
629
+ const pumps = [pumpJSON()];
630
+ for (const [streamId, stream] of rawStreams) pumps.push(pumpRawStream(streamId, stream));
631
+ if (lateStreamSource) pumps.push(pumpLateStreams());
632
+ try {
633
+ const latePumps = (await Promise.all(pumps)).find(Array.isArray);
634
+ if (latePumps && latePumps.length > 0) await Promise.all(latePumps);
635
+ if (!cancelled) try {
636
+ controller.close();
637
+ } catch {}
638
+ } catch {}
639
+ },
640
+ cancel() {
641
+ cancelled = true;
642
+ for (const reader of readers) reader.cancel().catch(() => {});
643
+ readers.length = 0;
644
+ }
645
+ });
646
+ }
647
+ var serovalPlugins = void 0;
648
+ var FORM_DATA_CONTENT_TYPES = ["multipart/form-data", "application/x-www-form-urlencoded"];
649
+ var MAX_PAYLOAD_SIZE = 1e6;
650
+ var handleServerAction = async ({ request, context, serverFnId }) => {
651
+ const methodUpper = request.method.toUpperCase();
652
+ const url = new URL(request.url);
653
+ const action = await getServerFnById(serverFnId, { origin: "client" });
654
+ if (action.method && methodUpper !== action.method) return new Response(`expected ${action.method} method. Got ${methodUpper}`, {
655
+ status: 405,
656
+ headers: { Allow: action.method }
657
+ });
658
+ const isServerFn = request.headers.get("x-tsr-serverFn") === "true";
659
+ if (!serovalPlugins) serovalPlugins = getDefaultSerovalPlugins();
660
+ const contentType = request.headers.get("Content-Type");
661
+ function parsePayload(payload) {
662
+ return fromJSON(payload, { plugins: serovalPlugins });
663
+ }
664
+ return await (async () => {
665
+ try {
666
+ let res = await (async () => {
667
+ if (FORM_DATA_CONTENT_TYPES.some((type) => contentType && contentType.includes(type))) {
668
+ if (methodUpper === "GET") invariant();
669
+ const formData = await request.formData();
670
+ const serializedContext = formData.get(TSS_FORMDATA_CONTEXT);
671
+ formData.delete(TSS_FORMDATA_CONTEXT);
672
+ const params = {
673
+ context,
674
+ data: formData,
675
+ method: methodUpper
676
+ };
677
+ if (typeof serializedContext === "string") try {
678
+ const deserializedContext = fromJSON(JSON.parse(serializedContext), { plugins: serovalPlugins });
679
+ if (typeof deserializedContext === "object" && deserializedContext) params.context = safeObjectMerge(deserializedContext, context);
680
+ } catch (e) {}
681
+ return await action(params);
682
+ }
683
+ if (methodUpper === "GET") {
684
+ const payloadParam = url.searchParams.get("payload");
685
+ if (payloadParam && payloadParam.length > MAX_PAYLOAD_SIZE) throw new Error("Payload too large");
686
+ const payload = payloadParam ? parsePayload(JSON.parse(payloadParam)) : {};
687
+ payload.context = safeObjectMerge(payload.context, context);
688
+ payload.method = methodUpper;
689
+ return await action(payload);
690
+ }
691
+ let jsonPayload;
692
+ if (contentType?.includes("application/json")) jsonPayload = await request.json();
693
+ const payload = jsonPayload ? parsePayload(jsonPayload) : {};
694
+ payload.context = safeObjectMerge(payload.context, context);
695
+ payload.method = methodUpper;
696
+ return await action(payload);
697
+ })();
698
+ const unwrapped = res.result || res.error;
699
+ if (isNotFound(res)) res = isNotFoundResponse(res);
700
+ if (!isServerFn) return unwrapped;
701
+ if (unwrapped instanceof Response) {
702
+ if (isRedirect(unwrapped)) return unwrapped;
703
+ unwrapped.headers.set(X_TSS_RAW_RESPONSE, "true");
704
+ return unwrapped;
705
+ }
706
+ return serializeResult(res);
707
+ function serializeResult(res) {
708
+ let nonStreamingBody = void 0;
709
+ const alsResponse = getResponse();
710
+ if (res !== void 0) {
711
+ const rawStreams = /* @__PURE__ */ new Map();
712
+ let initialPhase = true;
713
+ let lateStreamWriter;
714
+ let lateStreamReadable = void 0;
715
+ const pendingLateStreams = [];
716
+ const plugins = [createRawStreamRPCPlugin((id, stream) => {
717
+ if (initialPhase) {
718
+ rawStreams.set(id, stream);
719
+ return;
720
+ }
721
+ if (lateStreamWriter) {
722
+ lateStreamWriter.write({
723
+ id,
724
+ stream
725
+ }).catch(() => {});
726
+ return;
727
+ }
728
+ pendingLateStreams.push({
729
+ id,
730
+ stream
731
+ });
732
+ }), ...serovalPlugins || []];
733
+ let done = false;
734
+ const callbacks = {
735
+ onParse: (value) => {
736
+ nonStreamingBody = value;
737
+ },
738
+ onDone: () => {
739
+ done = true;
740
+ },
741
+ onError: (error) => {
742
+ throw error;
743
+ }
744
+ };
745
+ toCrossJSONStream(res, {
746
+ refs: /* @__PURE__ */ new Map(),
747
+ plugins,
748
+ onParse(value) {
749
+ callbacks.onParse(value);
750
+ },
751
+ onDone() {
752
+ callbacks.onDone();
753
+ },
754
+ onError: (error) => {
755
+ callbacks.onError(error);
756
+ }
757
+ });
758
+ initialPhase = false;
759
+ if (done && rawStreams.size === 0) return new Response(nonStreamingBody ? JSON.stringify(nonStreamingBody) : void 0, {
760
+ status: alsResponse.status,
761
+ statusText: alsResponse.statusText,
762
+ headers: {
763
+ "Content-Type": "application/json",
764
+ [X_TSS_SERIALIZED]: "true"
765
+ }
766
+ });
767
+ const { readable, writable } = new TransformStream();
768
+ lateStreamReadable = readable;
769
+ lateStreamWriter = writable.getWriter();
770
+ for (const registration of pendingLateStreams) lateStreamWriter.write(registration).catch(() => {});
771
+ pendingLateStreams.length = 0;
772
+ const multiplexedStream = createMultiplexedStream(new ReadableStream({
773
+ start(controller) {
774
+ callbacks.onParse = (value) => {
775
+ controller.enqueue(JSON.stringify(value) + "\n");
776
+ };
777
+ callbacks.onDone = () => {
778
+ try {
779
+ controller.close();
780
+ } catch {}
781
+ lateStreamWriter?.close().catch(() => {}).finally(() => {
782
+ lateStreamWriter = void 0;
783
+ });
784
+ };
785
+ callbacks.onError = (error) => {
786
+ controller.error(error);
787
+ lateStreamWriter?.abort(error).catch(() => {}).finally(() => {
788
+ lateStreamWriter = void 0;
789
+ });
790
+ };
791
+ if (nonStreamingBody !== void 0) callbacks.onParse(nonStreamingBody);
792
+ if (done) callbacks.onDone();
793
+ },
794
+ cancel() {
795
+ lateStreamWriter?.abort().catch(() => {});
796
+ lateStreamWriter = void 0;
797
+ }
798
+ }), rawStreams, lateStreamReadable);
799
+ return new Response(multiplexedStream, {
800
+ status: alsResponse.status,
801
+ statusText: alsResponse.statusText,
802
+ headers: {
803
+ "Content-Type": TSS_CONTENT_TYPE_FRAMED_VERSIONED,
804
+ [X_TSS_SERIALIZED]: "true"
805
+ }
806
+ });
807
+ }
808
+ return new Response(void 0, {
809
+ status: alsResponse.status,
810
+ statusText: alsResponse.statusText
811
+ });
812
+ }
813
+ } catch (error) {
814
+ if (error instanceof Response) return error;
815
+ if (isNotFound(error)) return isNotFoundResponse(error);
816
+ console.info();
817
+ console.info("Server Fn Error!");
818
+ console.info();
819
+ console.error(error);
820
+ console.info();
821
+ const serializedError = JSON.stringify(await Promise.resolve(toCrossJSONAsync(error, {
822
+ refs: /* @__PURE__ */ new Map(),
823
+ plugins: serovalPlugins
824
+ })));
825
+ const response = getResponse();
826
+ return new Response(serializedError, {
827
+ status: response.status ?? 500,
828
+ statusText: response.statusText,
829
+ headers: {
830
+ "Content-Type": "application/json",
831
+ [X_TSS_SERIALIZED]: "true"
832
+ }
833
+ });
834
+ }
835
+ })();
836
+ };
837
+ function isNotFoundResponse(error) {
838
+ const { headers, ...rest } = error;
839
+ return new Response(JSON.stringify(rest), {
840
+ status: 404,
841
+ headers: {
842
+ "Content-Type": "application/json",
843
+ ...headers || {}
844
+ }
845
+ });
846
+ }
847
+ var LINK_PARAM_TOKEN_RE = /^[!#$%&'*+\-.^_`|~0-9A-Za-z]+$/;
848
+ var PRELOAD_AS_VALUES = /* @__PURE__ */ new Set([
849
+ "fetch",
850
+ "font",
851
+ "image",
852
+ "script",
853
+ "style",
854
+ "track"
855
+ ]);
856
+ function buildLinkParam(name, value) {
857
+ if (value === void 0) return name;
858
+ if (LINK_PARAM_TOKEN_RE.test(value)) return `${name}=${value}`;
859
+ return `${name}=${JSON.stringify(value)}`;
860
+ }
861
+ function serializeEarlyHint(hint) {
862
+ const parts = [`<${hint.href}>`, buildLinkParam("rel", hint.rel)];
863
+ if (hint.as) parts.push(buildLinkParam("as", hint.as));
864
+ if (hint.crossOrigin !== void 0) parts.push(buildLinkParam("crossorigin", hint.crossOrigin || void 0));
865
+ if (hint.type) parts.push(buildLinkParam("type", hint.type));
866
+ if (hint.integrity) parts.push(buildLinkParam("integrity", hint.integrity));
867
+ if (hint.referrerPolicy) parts.push(buildLinkParam("referrerpolicy", hint.referrerPolicy));
868
+ if (hint.fetchPriority) parts.push(buildLinkParam("fetchpriority", hint.fetchPriority));
869
+ return parts.join("; ");
870
+ }
871
+ function getStringAttr(attrs, name, fallbackName) {
872
+ const value = attrs?.[name] ?? (fallbackName ? attrs?.[fallbackName] : void 0);
873
+ return typeof value === "string" ? value : void 0;
874
+ }
875
+ function getPreloadAs(attrs) {
876
+ const as = getStringAttr(attrs, "as");
877
+ return as && PRELOAD_AS_VALUES.has(as) ? as : void 0;
878
+ }
879
+ function addEarlyHintFetchAttrs(hint, attrs) {
880
+ const crossOrigin = getStringAttr(attrs, "crossOrigin", "crossorigin");
881
+ const type = getStringAttr(attrs, "type");
882
+ const integrity = getStringAttr(attrs, "integrity");
883
+ const referrerPolicy = getStringAttr(attrs, "referrerPolicy", "referrerpolicy");
884
+ const fetchPriority = getStringAttr(attrs, "fetchPriority", "fetchpriority");
885
+ if (crossOrigin !== void 0) hint.crossOrigin = crossOrigin;
886
+ if (type) hint.type = type;
887
+ if (integrity) hint.integrity = integrity;
888
+ if (referrerPolicy) hint.referrerPolicy = referrerPolicy;
889
+ if (fetchPriority) hint.fetchPriority = fetchPriority;
890
+ }
891
+ function linkAttrsToEarlyHint(attrs) {
892
+ const href = getStringAttr(attrs, "href");
893
+ const rel = getStringAttr(attrs, "rel");
894
+ if (!href || !rel) return void 0;
895
+ const relTokens = rel.split(/\s+/);
896
+ let hintRel;
897
+ let hintAs;
898
+ if (relTokens.includes("modulepreload")) {
899
+ hintRel = "modulepreload";
900
+ hintAs = "script";
901
+ } else if (relTokens.includes("stylesheet")) {
902
+ hintRel = "preload";
903
+ hintAs = "style";
904
+ } else if (relTokens.includes("preload")) {
905
+ hintAs = getPreloadAs(attrs);
906
+ if (!hintAs) return void 0;
907
+ hintRel = "preload";
908
+ } else if (relTokens.includes("preconnect")) {
909
+ hintRel = "preconnect";
910
+ hintAs = void 0;
911
+ } else if (relTokens.includes("dns-prefetch")) {
912
+ hintRel = "dns-prefetch";
913
+ hintAs = void 0;
914
+ }
915
+ if (!hintRel) return void 0;
916
+ const hint = {
917
+ href,
918
+ rel: hintRel
919
+ };
920
+ if (hintAs) hint.as = hintAs;
921
+ addEarlyHintFetchAttrs(hint, attrs);
922
+ return hint;
923
+ }
924
+ function collectStaticHintsFromManifest(manifest, matchedRoutes) {
925
+ const hints = [];
926
+ for (const route of matchedRoutes) {
927
+ const routeManifest = manifest.routes[route.id];
928
+ if (!routeManifest) continue;
929
+ for (const link of routeManifest.preloads ?? []) {
930
+ const attrs = getScriptPreloadAttrs(manifest, link);
931
+ const hint = {
932
+ href: attrs.href,
933
+ rel: attrs.rel,
934
+ as: "script"
935
+ };
936
+ if (attrs.crossOrigin !== void 0) hint.crossOrigin = attrs.crossOrigin;
937
+ hints.push(hint);
938
+ }
939
+ for (const link of routeManifest.css ?? []) {
940
+ const stylesheetHref = getStylesheetHref(link);
941
+ if (manifest.inlineCss?.styles[stylesheetHref] !== void 0) continue;
942
+ const resolvedLink = resolveManifestCssLink(link);
943
+ const hint = {
944
+ href: stylesheetHref,
945
+ rel: "preload",
946
+ as: "style"
947
+ };
948
+ if (resolvedLink.crossOrigin !== void 0) hint.crossOrigin = resolvedLink.crossOrigin;
949
+ hints.push(hint);
950
+ }
951
+ }
952
+ return hints;
953
+ }
954
+ function collectDynamicHintsFromMatches(matches) {
955
+ const hints = [];
956
+ for (const match of matches) {
957
+ const links = match.links;
958
+ if (!Array.isArray(links)) continue;
959
+ for (const link of links) {
960
+ const hint = linkAttrsToEarlyHint(link);
961
+ if (hint) hints.push(hint);
962
+ }
963
+ }
964
+ return hints;
965
+ }
966
+ function createEarlyHintsEvent(opts) {
967
+ const nextHints = [];
968
+ const nextLinks = [];
969
+ for (const hint of opts.hints) {
970
+ const link = serializeEarlyHint(hint);
971
+ if (opts.sentLinks.has(link)) continue;
972
+ opts.sentLinks.add(link);
973
+ opts.sentHints.push(hint);
974
+ nextHints.push(hint);
975
+ nextLinks.push(link);
976
+ }
977
+ if (!nextHints.length && opts.phase !== "dynamic") return void 0;
978
+ return {
979
+ phase: opts.phase,
980
+ hints: nextHints,
981
+ links: nextLinks,
982
+ allHints: opts.sentHints.slice(),
983
+ allLinks: Array.from(opts.sentLinks)
984
+ };
985
+ }
986
+ function createResponseLinkHeaderEntries(opts) {
987
+ for (const hint of opts.hints) {
988
+ const link = serializeEarlyHint(hint);
989
+ if (opts.sentLinks.has(link)) continue;
990
+ opts.sentLinks.add(link);
991
+ opts.entries.push({
992
+ phase: opts.phase,
993
+ hint,
994
+ link
995
+ });
996
+ }
997
+ }
998
+ function getResponseLinkHeaderEntries(opts) {
999
+ if (!opts.filter) return opts.entries.map((entry) => entry.link);
1000
+ try {
1001
+ const links = [];
1002
+ for (const entry of opts.entries) if (opts.filter(entry)) links.push(entry.link);
1003
+ return links;
1004
+ } catch (err) {
1005
+ console.error("Error filtering response Link headers:", err);
1006
+ return [];
1007
+ }
1008
+ }
1009
+ function notifyEarlyHints(phase, event, onEarlyHints) {
1010
+ try {
1011
+ const result = onEarlyHints(event);
1012
+ if (result) Promise.resolve(result).catch((err) => {
1013
+ console.error(`Error sending ${phase} early hints:`, err);
1014
+ });
1015
+ } catch (err) {
1016
+ console.error(`Error sending ${phase} early hints:`, err);
1017
+ }
1018
+ }
1019
+ function getResponseLinkHeaderFilter(responseLinkHeader) {
1020
+ if (typeof responseLinkHeader !== "object") return;
1021
+ return responseLinkHeader.filter;
1022
+ }
1023
+ function appendResponseLinkHeaders(opts) {
1024
+ for (const link of getResponseLinkHeaderEntries(opts)) opts.responseHeaders.append("Link", link);
1025
+ }
1026
+ function collectResponseLinkHeaderEntries(opts) {
1027
+ for (let index = 0; index < opts.event.hints.length; index++) opts.entries.push({
1028
+ phase: opts.phase,
1029
+ hint: opts.event.hints[index],
1030
+ link: opts.event.links[index]
1031
+ });
1032
+ }
1033
+ function collectEarlyHintsPhase(opts) {
1034
+ const event = opts.onEarlyHints ? createEarlyHintsEvent({
1035
+ phase: opts.phase,
1036
+ hints: opts.hints,
1037
+ sentLinks: opts.sentLinks,
1038
+ sentHints: opts.sentHints
1039
+ }) : void 0;
1040
+ if (event) notifyEarlyHints(opts.phase, event, opts.onEarlyHints);
1041
+ if (!opts.responseLinkHeaderEntries) return;
1042
+ if (event) {
1043
+ collectResponseLinkHeaderEntries({
1044
+ phase: opts.phase,
1045
+ event,
1046
+ entries: opts.responseLinkHeaderEntries
1047
+ });
1048
+ return;
1049
+ }
1050
+ createResponseLinkHeaderEntries({
1051
+ phase: opts.phase,
1052
+ hints: opts.hints,
1053
+ sentLinks: opts.sentLinks,
1054
+ entries: opts.responseLinkHeaderEntries
1055
+ });
1056
+ }
1057
+ function createEarlyHintsCollector(opts) {
1058
+ if (!opts?.onEarlyHints && !opts?.responseLinkHeader) return;
1059
+ const sentLinks = /* @__PURE__ */ new Set();
1060
+ const sentHints = opts.onEarlyHints ? new Array() : void 0;
1061
+ const responseLinkHeaderEntries = opts.responseLinkHeader ? new Array() : void 0;
1062
+ const responseLinkHeaderFilter = getResponseLinkHeaderFilter(opts.responseLinkHeader);
1063
+ return {
1064
+ collectStatic: ({ manifest, matchedRoutes }) => {
1065
+ if (!matchedRoutes?.length) return;
1066
+ collectEarlyHintsPhase({
1067
+ phase: "static",
1068
+ hints: collectStaticHintsFromManifest(manifest, matchedRoutes),
1069
+ sentLinks,
1070
+ sentHints,
1071
+ onEarlyHints: opts.onEarlyHints,
1072
+ responseLinkHeaderEntries
1073
+ });
1074
+ },
1075
+ collectDynamic: (matches) => {
1076
+ collectEarlyHintsPhase({
1077
+ phase: "dynamic",
1078
+ hints: collectDynamicHintsFromMatches(matches),
1079
+ sentLinks,
1080
+ sentHints,
1081
+ onEarlyHints: opts.onEarlyHints,
1082
+ responseLinkHeaderEntries
1083
+ });
1084
+ },
1085
+ appendResponseHeaders: (headers) => {
1086
+ if (!responseLinkHeaderEntries?.length) return;
1087
+ appendResponseLinkHeaders({
1088
+ responseHeaders: headers,
1089
+ entries: responseLinkHeaderEntries,
1090
+ filter: responseLinkHeaderFilter
1091
+ });
1092
+ }
1093
+ };
1094
+ }
1095
+ function normalizeTransformAssetResult(result) {
1096
+ if (typeof result === "string") return { href: result };
1097
+ return result;
1098
+ }
1099
+ function escapeCssString(value) {
1100
+ return value.replace(/\\/g, "\\\\").replace(/"/g, "\\\"").replace(/\n/g, "\\a ").replace(/\r/g, "\\d ").replace(/\f/g, "\\c ");
1101
+ }
1102
+ async function transformInlineCssTemplate(options) {
1103
+ const { strings, urls } = options.template;
1104
+ if (strings.length !== urls.length + 1) throw new Error(`TanStack Start inlineCss template for ${options.stylesheetHref} is invalid`);
1105
+ let css = strings[0];
1106
+ for (let index = 0; index < urls.length; index++) {
1107
+ const transformed = normalizeTransformAssetResult(await options.transformFn({
1108
+ kind: "css-url",
1109
+ url: urls[index],
1110
+ stylesheetHref: options.stylesheetHref
1111
+ }));
1112
+ css += escapeCssString(transformed.href) + strings[index + 1];
1113
+ }
1114
+ return css;
1115
+ }
1116
+ async function transformInlineCssStyles(inlineCss, transformFn) {
1117
+ const transformedStyles = {};
1118
+ const transformedEntries = await Promise.all(Object.entries(inlineCss.styles).map(async ([stylesheetHref, css]) => {
1119
+ const template = inlineCss.templates?.[stylesheetHref];
1120
+ return [stylesheetHref, template ? await transformInlineCssTemplate({
1121
+ stylesheetHref,
1122
+ template,
1123
+ transformFn
1124
+ }) : css];
1125
+ }));
1126
+ for (const [stylesheetHref, css] of transformedEntries) transformedStyles[stylesheetHref] = css;
1127
+ return {
1128
+ styles: transformedStyles,
1129
+ ...inlineCss.templates ? { templates: inlineCss.templates } : {}
1130
+ };
1131
+ }
1132
+ function resolveTransformAssetsCrossOrigin(config, kind) {
1133
+ if (!config) return void 0;
1134
+ if (typeof config === "string") return config;
1135
+ return config[kind];
1136
+ }
1137
+ function isObjectShorthand(transform) {
1138
+ return "prefix" in transform;
1139
+ }
1140
+ function resolveTransformAssetsConfig(transform) {
1141
+ if (typeof transform === "string") {
1142
+ const prefix = transform;
1143
+ return {
1144
+ type: "transform",
1145
+ transformFn: ({ url }) => ({ href: `${prefix}${url}` }),
1146
+ cache: true
1147
+ };
1148
+ }
1149
+ if (typeof transform === "function") return {
1150
+ type: "transform",
1151
+ transformFn: transform,
1152
+ cache: true
1153
+ };
1154
+ if (isObjectShorthand(transform)) {
1155
+ const { prefix, crossOrigin } = transform;
1156
+ return {
1157
+ type: "transform",
1158
+ transformFn: ({ url, kind }) => {
1159
+ const href = `${prefix}${url}`;
1160
+ if (kind === "css-url") return { href };
1161
+ const co = resolveTransformAssetsCrossOrigin(crossOrigin, kind);
1162
+ return co ? {
1163
+ href,
1164
+ crossOrigin: co
1165
+ } : { href };
1166
+ },
1167
+ cache: true
1168
+ };
1169
+ }
1170
+ if ("createTransform" in transform && transform.createTransform) return {
1171
+ type: "createTransform",
1172
+ createTransform: transform.createTransform,
1173
+ cache: transform.cache !== false
1174
+ };
1175
+ return {
1176
+ type: "transform",
1177
+ transformFn: typeof transform.transform === "string" ? (({ url }) => ({ href: `${transform.transform}${url}` })) : transform.transform,
1178
+ cache: transform.cache !== false
1179
+ };
1180
+ }
1181
+ function assignManifestLink(link, next) {
1182
+ if (typeof link === "string") return next.crossOrigin ? next : next.href;
1183
+ const nextLink = {
1184
+ ...link,
1185
+ href: next.href
1186
+ };
1187
+ if (next.crossOrigin) nextLink.crossOrigin = next.crossOrigin;
1188
+ else delete nextLink.crossOrigin;
1189
+ return nextLink;
1190
+ }
1191
+ async function transformManifestAssets(source, transformFn, _opts) {
1192
+ const manifest = structuredClone(source);
1193
+ const inlineCssEnabled = _opts?.inlineCss !== false;
1194
+ const scriptTransforms = /* @__PURE__ */ new Map();
1195
+ const transformScript = (url) => {
1196
+ const cached = scriptTransforms.get(url);
1197
+ if (cached) return cached;
1198
+ const transformed = Promise.resolve(transformFn({
1199
+ url,
1200
+ kind: "script"
1201
+ })).then(normalizeTransformAssetResult);
1202
+ scriptTransforms.set(url, transformed);
1203
+ return transformed;
1204
+ };
1205
+ if (!inlineCssEnabled) delete manifest.inlineCss;
1206
+ else if (manifest.inlineCss) manifest.inlineCss = await transformInlineCssStyles(manifest.inlineCss, transformFn);
1207
+ for (const route of Object.values(manifest.routes)) {
1208
+ if (route.preloads?.length) route.preloads = await Promise.all(route.preloads.map(async (link) => {
1209
+ const result = await transformScript(resolveManifestAssetLink(link).href);
1210
+ return assignManifestLink(link, {
1211
+ href: result.href,
1212
+ crossOrigin: result.crossOrigin
1213
+ });
1214
+ }));
1215
+ if (route.css?.length && !manifest.inlineCss) route.css = await Promise.all(route.css.map(async (link) => {
1216
+ const result = normalizeTransformAssetResult(await transformFn({
1217
+ url: resolveManifestCssLink(link).href,
1218
+ kind: "stylesheet"
1219
+ }));
1220
+ return assignManifestLink(link, {
1221
+ href: result.href,
1222
+ crossOrigin: result.crossOrigin
1223
+ });
1224
+ }));
1225
+ if (route.scripts?.length) for (const script of route.scripts) {
1226
+ const src = script.attrs?.src;
1227
+ if (typeof src !== "string") continue;
1228
+ const result = await transformScript(src);
1229
+ script.attrs = {
1230
+ ...script.attrs,
1231
+ src: result.href
1232
+ };
1233
+ if (result.crossOrigin) script.attrs.crossOrigin = result.crossOrigin;
1234
+ else delete script.attrs.crossOrigin;
1235
+ }
1236
+ }
1237
+ return manifest;
1238
+ }
1239
+ /**
1240
+ * Builds a final ServerManifest without URL transforms. Used when no
1241
+ * transformAssets option is provided.
1242
+ *
1243
+ * Returns a new manifest object so the cached base manifest is never mutated.
1244
+ */
1245
+ function buildManifest(source, opts) {
1246
+ return {
1247
+ ...source.scriptFormat ? { scriptFormat: source.scriptFormat } : {},
1248
+ ...opts?.inlineCss !== false && source.inlineCss ? { inlineCss: structuredClone(source.inlineCss) } : {},
1249
+ routes: { ...source.routes }
1250
+ };
1251
+ }
1252
+ function getStaticHandlerInlineCssDefault(handlerInlineCss) {
1253
+ if (typeof handlerInlineCss === "function") return;
1254
+ return handlerInlineCss ?? true;
1255
+ }
1256
+ async function resolveInlineCssForRequest(opts) {
1257
+ if (opts.requestInlineCss !== void 0) return opts.requestInlineCss;
1258
+ if (typeof opts.handlerInlineCss === "function") return await opts.handlerInlineCss({ request: opts.request });
1259
+ return opts.handlerInlineCss ?? true;
1260
+ }
1261
+ function createCachedBaseManifestLoader(loadBaseManifest) {
1262
+ let baseManifestPromise;
1263
+ return () => {
1264
+ if (!baseManifestPromise) baseManifestPromise = loadBaseManifest().catch((error) => {
1265
+ baseManifestPromise = void 0;
1266
+ throw error;
1267
+ });
1268
+ return baseManifestPromise;
1269
+ };
1270
+ }
1271
+ function createFinalManifestTransformResolver(transformAssets, opts) {
1272
+ const transformConfig = transformAssets !== void 0 ? resolveTransformAssetsConfig(transformAssets) : void 0;
1273
+ const cache = transformConfig ? transformConfig.cache : true;
1274
+ const warmup = !!transformAssets && typeof transformAssets === "object" && "warmup" in transformAssets && transformAssets.warmup === true;
1275
+ let cachedCreateTransformPromise;
1276
+ const clearCachedCreateTransform = () => {
1277
+ cachedCreateTransformPromise = void 0;
1278
+ };
1279
+ return {
1280
+ cache,
1281
+ warmup,
1282
+ clearCachedCreateTransform,
1283
+ getTransformFn: async (ctx) => {
1284
+ if (!transformConfig) return void 0;
1285
+ if (transformConfig.type !== "createTransform") return transformConfig.transformFn;
1286
+ if (!cache || !opts.cacheCreateTransform) return transformConfig.createTransform(ctx);
1287
+ if (!cachedCreateTransformPromise) cachedCreateTransformPromise = Promise.resolve(transformConfig.createTransform(ctx)).catch((error) => {
1288
+ clearCachedCreateTransform();
1289
+ throw error;
1290
+ });
1291
+ return cachedCreateTransformPromise;
1292
+ }
1293
+ };
1294
+ }
1295
+ function createFinalManifestResolver(opts) {
1296
+ const finalManifestCache = /* @__PURE__ */ new Map();
1297
+ const transformResolver = createFinalManifestTransformResolver(opts.transformAssets, { cacheCreateTransform: opts.cacheCreateTransform });
1298
+ const handlerDefaultInlineCss = getStaticHandlerInlineCssDefault(opts.inlineCss);
1299
+ const getRequestManifestOptions = async (requestOpts) => {
1300
+ const transformFn = await transformResolver.getTransformFn({
1301
+ warmup: false,
1302
+ request: requestOpts.request
1303
+ });
1304
+ const inlineCss = await resolveInlineCssForRequest({
1305
+ request: requestOpts.request,
1306
+ handlerInlineCss: opts.inlineCss,
1307
+ requestInlineCss: requestOpts.requestInlineCss
1308
+ });
1309
+ return {
1310
+ getBaseManifest: requestOpts.getBaseManifest,
1311
+ transformFn,
1312
+ cache: transformResolver.cache,
1313
+ inlineCss
1314
+ };
1315
+ };
1316
+ const resolveRequest = async (requestOpts, cache) => {
1317
+ return resolveFinalManifest({
1318
+ ...await getRequestManifestOptions(requestOpts),
1319
+ finalManifestCache: cache
1320
+ });
1321
+ };
1322
+ return {
1323
+ warmup: ({ getBaseManifest }) => warmupFinalManifest({
1324
+ enabled: transformResolver.warmup,
1325
+ handlerDefaultInlineCss,
1326
+ cache: transformResolver.cache,
1327
+ finalManifestCache,
1328
+ getBaseManifest,
1329
+ getTransformFn: () => transformResolver.getTransformFn({ warmup: true }),
1330
+ onError: transformResolver.clearCachedCreateTransform
1331
+ }),
1332
+ resolveCached: (requestOpts) => resolveRequest(requestOpts, finalManifestCache),
1333
+ resolveUncached: (requestOpts) => resolveRequest(requestOpts, void 0)
1334
+ };
1335
+ }
1336
+ function getFinalManifestCacheKey(inlineCss) {
1337
+ return inlineCss ? "inline-css" : "linked-css";
1338
+ }
1339
+ function cacheFinalManifestPromise(cachedFinalManifestPromises, cacheKey, promise) {
1340
+ const cachedFinalManifestPromise = promise.catch((error) => {
1341
+ if (cachedFinalManifestPromises.get(cacheKey) === cachedFinalManifestPromise) cachedFinalManifestPromises.delete(cacheKey);
1342
+ throw error;
1343
+ });
1344
+ cachedFinalManifestPromises.set(cacheKey, cachedFinalManifestPromise);
1345
+ return cachedFinalManifestPromise;
1346
+ }
1347
+ function getOrCreateCachedFinalManifestPromise(cachedFinalManifestPromises, cacheKey, computeFinalManifest) {
1348
+ const cachedFinalManifestPromise = cachedFinalManifestPromises.get(cacheKey);
1349
+ if (cachedFinalManifestPromise) return cachedFinalManifestPromise;
1350
+ return cacheFinalManifestPromise(cachedFinalManifestPromises, cacheKey, Promise.resolve().then(computeFinalManifest));
1351
+ }
1352
+ async function buildFinalManifest(opts) {
1353
+ return opts.transformFn ? await transformManifestAssets(opts.base, opts.transformFn, { inlineCss: opts.inlineCss }) : buildManifest(opts.base, { inlineCss: opts.inlineCss });
1354
+ }
1355
+ async function resolveFinalManifest(opts) {
1356
+ const computeFinalManifest = async () => {
1357
+ return buildFinalManifest({
1358
+ base: await opts.getBaseManifest(),
1359
+ transformFn: opts.transformFn,
1360
+ inlineCss: opts.inlineCss
1361
+ });
1362
+ };
1363
+ if (opts.finalManifestCache && (!opts.transformFn || opts.cache)) return getOrCreateCachedFinalManifestPromise(opts.finalManifestCache, getFinalManifestCacheKey(opts.inlineCss), computeFinalManifest);
1364
+ return computeFinalManifest();
1365
+ }
1366
+ function warmupFinalManifest(opts) {
1367
+ if (!opts.enabled || opts.handlerDefaultInlineCss === void 0 || !opts.cache) return;
1368
+ const inlineCss = opts.handlerDefaultInlineCss;
1369
+ const warmupPromise = getOrCreateCachedFinalManifestPromise(opts.finalManifestCache, getFinalManifestCacheKey(inlineCss), async () => {
1370
+ const [base, transformFn] = await Promise.all([opts.getBaseManifest(), opts.getTransformFn()]);
1371
+ return buildFinalManifest({
1372
+ base,
1373
+ transformFn,
1374
+ inlineCss
1375
+ });
1376
+ });
1377
+ if (opts.onError) warmupPromise.catch(opts.onError);
1378
+ return warmupPromise;
1379
+ }
1380
+ var ServerFunctionSerializationAdapter = createSerializationAdapter({
1381
+ key: "$TSS/serverfn",
1382
+ test: (v) => {
1383
+ if (typeof v !== "function") return false;
1384
+ if (!(TSS_SERVER_FUNCTION in v)) return false;
1385
+ return !!v[TSS_SERVER_FUNCTION];
1386
+ },
1387
+ toSerializable: ({ serverFnMeta }) => ({ functionId: serverFnMeta.id }),
1388
+ fromSerializable: ({ functionId }) => {
1389
+ const fn = async (opts, signal) => {
1390
+ return (await (await getServerFnById(functionId, { origin: "client" }))(opts ?? {}, signal)).result;
1391
+ };
1392
+ return fn;
1393
+ }
1394
+ });
1395
+ function getStartResponseHeaders(opts) {
1396
+ return mergeHeaders({ "Content-Type": "text/html; charset=utf-8" }, ..._getRenderedMatches(opts.router.stores.matches.get()).map((match) => {
1397
+ return match.headers;
1398
+ }));
1399
+ }
1400
+ var entriesPromise;
1401
+ var defaultCsrfMiddleware = createCsrfMiddleware({ filter: (ctx) => ctx.handlerType === "serverFn" });
1402
+ var getCachedBaseManifest = createCachedBaseManifestLoader(() => getStartManifest());
1403
+ var getProdBaseManifest = () => getCachedBaseManifest();
1404
+ var getBaseManifest = getProdBaseManifest;
1405
+ var createEarlyHintsForRequest = createEarlyHintsCollector;
1406
+ async function loadEntries() {
1407
+ const [routerEntry, startEntry, pluginAdapters] = await Promise.all([
1408
+ import("./router-DsUHD4bT.mjs").then((n) => n.t),
1409
+ import("./start-5Z2QO8AU.mjs"),
1410
+ import("./empty-plugin-adapters-D9UWiqvJ.mjs")
1411
+ ]);
1412
+ return {
1413
+ routerEntry,
1414
+ startEntry,
1415
+ pluginAdapters
1416
+ };
1417
+ }
1418
+ function getEntries() {
1419
+ if (!entriesPromise) entriesPromise = loadEntries();
1420
+ return entriesPromise;
1421
+ }
1422
+ var ROUTER_BASEPATH = "/";
1423
+ var SERVER_FN_BASE = "/_serverFn/";
1424
+ var IS_PRERENDERING = process.env.TSS_PRERENDERING === "true";
1425
+ var IS_SHELL_ENV = process.env.TSS_SHELL === "true";
1426
+ var IS_DEV = false;
1427
+ var ERR_NO_RESPONSE = IS_DEV ? `It looks like you forgot to return a response from your server route handler. If you want to defer to the app router, make sure to have a component set in this route.` : "Internal Server Error";
1428
+ var ERR_NO_DEFER = IS_DEV ? `You cannot defer to the app router if there is no component defined on this route.` : "Internal Server Error";
1429
+ function throwRouteHandlerError() {
1430
+ throw new Error(ERR_NO_RESPONSE);
1431
+ }
1432
+ function throwIfMayNotDefer() {
1433
+ throw new Error(ERR_NO_DEFER);
1434
+ }
1435
+ /**
1436
+ * Check if a value is a special response (Response or Redirect)
1437
+ */
1438
+ function isSpecialResponse(value) {
1439
+ return value instanceof Response || isRedirect(value);
1440
+ }
1441
+ /**
1442
+ * Normalize middleware result to context shape
1443
+ */
1444
+ function handleCtxResult(result) {
1445
+ if (isSsrResponse(result) || isSpecialResponse(result)) return { response: result };
1446
+ return result;
1447
+ }
1448
+ function disposeLateResponse(result, signal) {
1449
+ const response = handleCtxResult(result)?.response;
1450
+ if (isSsrResponse(response) || isSpecialResponse(response)) disposeSsrResponseDetached(response, signal.reason);
1451
+ }
1452
+ function isSignalAborted(signal) {
1453
+ return signal.aborted;
1454
+ }
1455
+ /**
1456
+ * Execute a middleware chain
1457
+ */
1458
+ async function executeMiddleware(middlewares, ctx, signal) {
1459
+ let index = -1;
1460
+ let streamResponse;
1461
+ let retiredStreamIdentities;
1462
+ const isResponseAlias = (candidate, response) => candidate === response || candidate instanceof Response && response.body !== null && candidate.body === response.body;
1463
+ const setResponse = (response) => {
1464
+ if (isSsrResponse(response)) {
1465
+ if (response.serverSsrCleanup === "stream") streamResponse = response;
1466
+ ctx.response = response.response;
1467
+ return;
1468
+ }
1469
+ ctx.response = response;
1470
+ };
1471
+ const disposeStreamResponse = async (reason) => {
1472
+ const response = streamResponse;
1473
+ if (!response) return;
1474
+ streamResponse = void 0;
1475
+ retiredStreamIdentities ??= /* @__PURE__ */ new WeakSet();
1476
+ retiredStreamIdentities.add(response.response);
1477
+ if (response.response.body) retiredStreamIdentities.add(response.response.body);
1478
+ const currentResponse = ctx.response;
1479
+ if (isResponseAlias(currentResponse, response.response)) ctx.response = void 0;
1480
+ await response.dispose(reason);
1481
+ };
1482
+ const disposeAbandonedResult = (result) => {
1483
+ const exposed = handleCtxResult(result)?.response;
1484
+ const response = isSsrResponse(exposed) ? exposed.response : exposed;
1485
+ if (streamResponse && isResponseAlias(response, streamResponse.response)) {
1486
+ disposeStreamResponse(signal.reason).catch(console.error);
1487
+ return;
1488
+ }
1489
+ if (response instanceof Response && retiredStreamIdentities && (retiredStreamIdentities.has(response) || response.body !== null && retiredStreamIdentities.has(response.body))) return;
1490
+ disposeLateResponse(result, signal);
1491
+ };
1492
+ const getFinalResponse = async () => {
1493
+ const response = ctx.response;
1494
+ if (!response) throwRouteHandlerError();
1495
+ if (!streamResponse) return response;
1496
+ if (response === streamResponse.response) return streamResponse;
1497
+ if (streamResponse.response.body !== null && response.body === streamResponse.response.body) return {
1498
+ ...streamResponse,
1499
+ response
1500
+ };
1501
+ await disposeStreamResponse("middleware response replaced");
1502
+ return response;
1503
+ };
1504
+ let nextPromise;
1505
+ function next(nextCtx) {
1506
+ const result = runNext(nextCtx);
1507
+ nextPromise = result;
1508
+ return result;
1509
+ }
1510
+ async function runNext(nextCtx) {
1511
+ if (signal.aborted) throw signal.reason;
1512
+ if (nextCtx) {
1513
+ if (nextCtx.context) ctx.context = safeObjectMerge(ctx.context, nextCtx.context);
1514
+ for (const key of Object.keys(nextCtx)) if (key === "response") setResponse(nextCtx.response);
1515
+ else if (key !== "context") ctx[key] = nextCtx[key];
1516
+ }
1517
+ index++;
1518
+ const middleware = middlewares[index];
1519
+ if (!middleware) return ctx;
1520
+ let result;
1521
+ try {
1522
+ const pending = middleware({
1523
+ ...ctx,
1524
+ next
1525
+ });
1526
+ if (pending === nextPromise) {
1527
+ nextPromise = void 0;
1528
+ result = await pending;
1529
+ if (isSignalAborted(signal)) {
1530
+ disposeAbandonedResult(result);
1531
+ throw signal.reason;
1532
+ }
1533
+ } else result = await waitForRequest(pending, signal, disposeAbandonedResult);
1534
+ } catch (err) {
1535
+ if (isSignalAborted(signal)) throw signal.reason;
1536
+ if (isSpecialResponse(err)) {
1537
+ setResponse(err);
1538
+ return ctx;
1539
+ }
1540
+ throw err;
1541
+ }
1542
+ const normalized = handleCtxResult(result);
1543
+ if (normalized) {
1544
+ if (normalized.response !== void 0) setResponse(normalized.response);
1545
+ if (normalized.context) ctx.context = safeObjectMerge(ctx.context, normalized.context);
1546
+ }
1547
+ return ctx;
1548
+ }
1549
+ try {
1550
+ await runNext();
1551
+ const response = await waitForRequest(getFinalResponse(), signal, disposeAbandonedResult);
1552
+ if (signal.aborted) {
1553
+ disposeAbandonedResult(response);
1554
+ throw signal.reason;
1555
+ }
1556
+ return {
1557
+ ctx,
1558
+ response
1559
+ };
1560
+ } catch (err) {
1561
+ const disposal = disposeStreamResponse(signal.aborted ? signal.reason : err);
1562
+ if (signal.aborted) disposal.catch(console.error);
1563
+ else await disposal;
1564
+ throw err;
1565
+ }
1566
+ }
1567
+ /**
1568
+ * Wrap a route handler as middleware
1569
+ */
1570
+ function handlerToMiddleware(handler, mayDefer = false) {
1571
+ if (mayDefer) return handler;
1572
+ return async (ctx) => {
1573
+ const response = await handler({
1574
+ ...ctx,
1575
+ next: throwIfMayNotDefer
1576
+ });
1577
+ if (!response) throwRouteHandlerError();
1578
+ return response;
1579
+ };
1580
+ }
1581
+ /**
1582
+ * Creates the TanStack Start request handler.
1583
+ *
1584
+ * @example Backwards-compatible usage (handler callback only):
1585
+ * ```ts
1586
+ * export default createStartHandler(defaultStreamHandler)
1587
+ * ```
1588
+ *
1589
+ * @example With CDN URL rewriting:
1590
+ * ```ts
1591
+ * export default createStartHandler({
1592
+ * handler: defaultStreamHandler,
1593
+ * transformAssets: 'https://cdn.example.com',
1594
+ * })
1595
+ * ```
1596
+ *
1597
+ * @example With per-request URL rewriting:
1598
+ * ```ts
1599
+ * export default createStartHandler({
1600
+ * handler: defaultStreamHandler,
1601
+ * transformAssets: {
1602
+ * transform: ({ url }) => {
1603
+ * const cdnBase = getRequest().headers.get('x-cdn-base') || ''
1604
+ * return { href: `${cdnBase}${url}` }
1605
+ * },
1606
+ * cache: false,
1607
+ * },
1608
+ * })
1609
+ * ```
1610
+ */
1611
+ function createStartHandler(cbOrOptions) {
1612
+ const handlerOptions = typeof cbOrOptions === "function" ? {} : cbOrOptions;
1613
+ const cb = typeof cbOrOptions === "function" ? cbOrOptions : cbOrOptions.handler;
1614
+ const finalManifestResolver = createFinalManifestResolver({
1615
+ ...handlerOptions,
1616
+ cacheCreateTransform: true
1617
+ });
1618
+ const resolveManifestForRequest = finalManifestResolver.resolveCached;
1619
+ finalManifestResolver.warmup({ getBaseManifest: () => getBaseManifest(void 0) });
1620
+ const startRequestResolver = async (request, requestOpts) => {
1621
+ let router = null;
1622
+ let responseOwnsCleanup = false;
1623
+ try {
1624
+ request.signal.throwIfAborted();
1625
+ const { url, handledProtocolRelativeURL } = getNormalizedURL(request.url);
1626
+ const href = url.pathname + url.search + url.hash;
1627
+ const origin = getOrigin(request);
1628
+ if (handledProtocolRelativeURL) return Response.redirect(url, 308);
1629
+ const entries = await waitForRequest(getEntries(), request.signal);
1630
+ const hasStartInstance = !!entries.startEntry.startInstance;
1631
+ const startOptions = await waitForRequest(entries.startEntry.startInstance?.getOptions(), request.signal) || {};
1632
+ const { hasPluginAdapters, pluginSerializationAdapters } = entries.pluginAdapters;
1633
+ const serializationAdapters = [
1634
+ ...startOptions.serializationAdapters || [],
1635
+ ...hasPluginAdapters ? pluginSerializationAdapters : [],
1636
+ ServerFunctionSerializationAdapter
1637
+ ];
1638
+ const requestStartOptions = {
1639
+ ...startOptions,
1640
+ requestMiddleware: hasStartInstance ? startOptions.requestMiddleware : [defaultCsrfMiddleware],
1641
+ serializationAdapters
1642
+ };
1643
+ const flattenedRequestMiddlewares = requestStartOptions.requestMiddleware ? flattenMiddlewares(requestStartOptions.requestMiddleware) : [];
1644
+ const executedRequestMiddlewares = new Set(flattenedRequestMiddlewares);
1645
+ const getRouter = async () => {
1646
+ if (router) return router;
1647
+ router = await waitForRequest(entries.routerEntry.getRouter(), request.signal);
1648
+ let isShell = IS_SHELL_ENV;
1649
+ if (IS_PRERENDERING && !isShell) isShell = request.headers.get(HEADERS.TSS_SHELL) === "true";
1650
+ const history = createMemoryHistory({ initialEntries: [href] });
1651
+ router.update({
1652
+ history,
1653
+ isShell,
1654
+ isPrerendering: IS_PRERENDERING,
1655
+ origin: router.options.origin ?? origin,
1656
+ defaultSsr: requestStartOptions.defaultSsr,
1657
+ serializationAdapters: [...requestStartOptions.serializationAdapters, ...router.options.serializationAdapters || []],
1658
+ basepath: ROUTER_BASEPATH
1659
+ });
1660
+ return router;
1661
+ };
1662
+ if (SERVER_FN_BASE && url.pathname.startsWith(SERVER_FN_BASE)) {
1663
+ const serverFnId = url.pathname.slice(SERVER_FN_BASE.length).split("/")[0];
1664
+ if (!serverFnId) throw new Error("Invalid server action param for serverFnId");
1665
+ const serverFnHandler = async ({ context }) => {
1666
+ return runWithStartContext({
1667
+ getRouter,
1668
+ startOptions: requestStartOptions,
1669
+ contextAfterGlobalMiddlewares: context,
1670
+ request,
1671
+ executedRequestMiddlewares,
1672
+ handlerType: "serverFn"
1673
+ }, () => handleServerAction({
1674
+ request,
1675
+ context: requestOpts?.context,
1676
+ serverFnId
1677
+ }));
1678
+ };
1679
+ const { response: middlewareResponse } = await executeMiddleware([...flattenedRequestMiddlewares.map((d) => d.options.server), serverFnHandler], {
1680
+ request,
1681
+ pathname: url.pathname,
1682
+ handlerType: "serverFn",
1683
+ context: createNullProtoObject(requestOpts?.context)
1684
+ }, request.signal);
1685
+ const result = await handleRedirectResponse(middlewareResponse, request, getRouter, request.signal);
1686
+ bindSsrResponseToRequest(router ?? void 0, result, request.signal);
1687
+ request.signal.throwIfAborted();
1688
+ responseOwnsCleanup = result.serverSsrCleanup === "stream";
1689
+ return result.response;
1690
+ }
1691
+ const executeRouter = async (serverContext, matchedRoutes) => {
1692
+ const acceptParts = (request.headers.get("Accept") || "*/*").split(",");
1693
+ if (!["*/*", "text/html"].some((mimeType) => acceptParts.some((part) => part.trim().startsWith(mimeType)))) return normalizeSsrResponse(Response.json({ error: "Only HTML requests are supported here" }, { status: 500 }));
1694
+ const manifest = await waitForRequest(resolveManifestForRequest({
1695
+ request,
1696
+ requestInlineCss: requestOpts?.inlineCss,
1697
+ getBaseManifest: () => getBaseManifest(matchedRoutes)
1698
+ }), request.signal);
1699
+ const earlyHints = createEarlyHintsForRequest({
1700
+ onEarlyHints: requestOpts?.onEarlyHints,
1701
+ responseLinkHeader: requestOpts?.responseLinkHeader
1702
+ });
1703
+ earlyHints?.collectStatic({
1704
+ manifest,
1705
+ matchedRoutes
1706
+ });
1707
+ const routerInstance = await getRouter();
1708
+ attachRouterServerSsrUtils({
1709
+ router: routerInstance,
1710
+ manifest,
1711
+ getRequestAssets: () => getStartContext({ throwIfNotFound: false })?.requestAssets
1712
+ });
1713
+ routerInstance.options.additionalContext = { serverContext };
1714
+ await routerInstance.load({ _signal: request.signal });
1715
+ request.signal.throwIfAborted();
1716
+ if (routerInstance._serverResult?.type === "redirect") return normalizeSsrResponse(routerInstance._serverResult.redirect);
1717
+ earlyHints?.collectDynamic(_getRenderedMatches(routerInstance.stores.matches.get()));
1718
+ const ctx = getStartContext({ throwIfNotFound: false });
1719
+ await waitForRequest(routerInstance.serverSsr.dehydrate({ requestAssets: ctx?.requestAssets }), request.signal);
1720
+ request.signal.throwIfAborted();
1721
+ const responseHeaders = getStartResponseHeaders({ router: routerInstance });
1722
+ earlyHints?.appendResponseHeaders(responseHeaders);
1723
+ request.signal.throwIfAborted();
1724
+ return normalizeSsrResponse(await waitForRequest(cb({
1725
+ request,
1726
+ router: routerInstance,
1727
+ responseHeaders
1728
+ }), request.signal, (late) => disposeLateResponse(late, request.signal)));
1729
+ };
1730
+ const requestHandlerMiddleware = async ({ context }) => {
1731
+ return runWithStartContext({
1732
+ getRouter,
1733
+ startOptions: requestStartOptions,
1734
+ contextAfterGlobalMiddlewares: context,
1735
+ request,
1736
+ executedRequestMiddlewares,
1737
+ handlerType: "router"
1738
+ }, async () => {
1739
+ try {
1740
+ return await handleServerRoutes({
1741
+ getRouter,
1742
+ request,
1743
+ url,
1744
+ executeRouter,
1745
+ context,
1746
+ executedRequestMiddlewares
1747
+ });
1748
+ } catch (err) {
1749
+ if (err instanceof Response) return err;
1750
+ throw err;
1751
+ }
1752
+ });
1753
+ };
1754
+ const { response: middlewareResponse } = await executeMiddleware([...flattenedRequestMiddlewares.map((d) => d.options.server), requestHandlerMiddleware], {
1755
+ request,
1756
+ pathname: url.pathname,
1757
+ handlerType: "router",
1758
+ context: createNullProtoObject(requestOpts?.context)
1759
+ }, request.signal);
1760
+ const response = await handleRedirectResponse(middlewareResponse, request, getRouter, request.signal);
1761
+ bindSsrResponseToRequest(router ?? void 0, response, request.signal);
1762
+ request.signal.throwIfAborted();
1763
+ responseOwnsCleanup = response.serverSsrCleanup === "stream";
1764
+ return response.response;
1765
+ } finally {
1766
+ if (router?.serverSsr && !responseOwnsCleanup) router.serverSsr.cleanup();
1767
+ router = null;
1768
+ }
1769
+ };
1770
+ return requestHandler(startRequestResolver);
1771
+ }
1772
+ async function handleRedirectResponse(response, request, getRouter, signal) {
1773
+ signal.throwIfAborted();
1774
+ const ssrResponse = normalizeSsrResponse(response);
1775
+ if (!isRedirect(ssrResponse.response)) return ssrResponse;
1776
+ if (isResolvedRedirect(ssrResponse.response)) {
1777
+ if (request.headers.get("x-tsr-serverFn") === "true") return waitForRequest(replaceSsrResponse(ssrResponse, Response.json({
1778
+ ...ssrResponse.response.options,
1779
+ isSerializedRedirect: true
1780
+ }, { headers: ssrResponse.response.headers }), "redirect response replaced"), signal);
1781
+ return ssrResponse;
1782
+ }
1783
+ const opts = ssrResponse.response.options;
1784
+ if (opts.to && typeof opts.to === "string" && !opts.to.startsWith("/")) throw new Error(`Server side redirects must use absolute paths via the 'href' or 'to' options. The redirect() method's "to" property accepts an internal path only. Use the "href" property to provide an external URL. Received: ${JSON.stringify(opts)}`);
1785
+ if ([
1786
+ "params",
1787
+ "search",
1788
+ "hash"
1789
+ ].some((d) => typeof opts[d] === "function")) throw new Error(`Server side redirects must use static search, params, and hash values and do not support functional values. Received functional values for: ${Object.keys(opts).filter((d) => typeof opts[d] === "function").map((d) => `"${d}"`).join(", ")}`);
1790
+ signal.throwIfAborted();
1791
+ const router = await waitForRequest(getRouter(), signal);
1792
+ signal.throwIfAborted();
1793
+ const redirect = router.resolveRedirect(ssrResponse.response);
1794
+ if (request.headers.get("x-tsr-serverFn") === "true") return waitForRequest(replaceSsrResponse(ssrResponse, Response.json({
1795
+ ...ssrResponse.response.options,
1796
+ isSerializedRedirect: true
1797
+ }, { headers: ssrResponse.response.headers }), "redirect response replaced"), signal);
1798
+ return waitForRequest(replaceSsrResponse(ssrResponse, redirect, "redirect response replaced"), signal);
1799
+ }
1800
+ async function handleServerRoutes({ getRouter, request, url, executeRouter, context, executedRequestMiddlewares }) {
1801
+ const router = await getRouter();
1802
+ const pathname = executeRewriteInput(router.rewrite, url).pathname;
1803
+ const [matchedRoutes, rawParams, foundRoute] = router.getMatchedRoutes(pathname);
1804
+ const isExactMatch = foundRoute && rawParams["**"] === void 0;
1805
+ const routeMiddlewares = [];
1806
+ for (const route of matchedRoutes) {
1807
+ const serverMiddleware = route.options.server?.middleware;
1808
+ if (serverMiddleware) {
1809
+ const flattened = flattenMiddlewares(serverMiddleware);
1810
+ for (const m of flattened) if (!executedRequestMiddlewares.has(m)) routeMiddlewares.push(m.options.server);
1811
+ }
1812
+ }
1813
+ const server = foundRoute?.options.server;
1814
+ let isHeadFallback = false;
1815
+ if (server?.handlers && isExactMatch) {
1816
+ const handlers = typeof server.handlers === "function" ? server.handlers({ createHandlers: (d) => d }) : server.handlers;
1817
+ const requestMethod = request.method.toUpperCase();
1818
+ const handler = requestMethod === "HEAD" ? handlers["HEAD"] ?? handlers["GET"] ?? handlers["ANY"] : handlers[requestMethod] ?? handlers["ANY"];
1819
+ isHeadFallback = requestMethod === "HEAD" && handler !== void 0 && !handlers["HEAD"];
1820
+ if (handler) {
1821
+ const mayDefer = !!foundRoute.options.component;
1822
+ if (typeof handler === "function") routeMiddlewares.push(handlerToMiddleware(handler, mayDefer));
1823
+ else {
1824
+ if (handler.middleware?.length) {
1825
+ const handlerMiddlewares = flattenMiddlewares(handler.middleware);
1826
+ for (const m of handlerMiddlewares) routeMiddlewares.push(m.options.server);
1827
+ }
1828
+ if (handler.handler) routeMiddlewares.push(handlerToMiddleware(handler.handler, mayDefer));
1829
+ }
1830
+ }
1831
+ }
1832
+ routeMiddlewares.push(((ctx) => executeRouter(ctx.context, matchedRoutes)));
1833
+ const { ctx, response } = await executeMiddleware(routeMiddlewares, {
1834
+ request,
1835
+ context,
1836
+ params: rawParams,
1837
+ pathname,
1838
+ handlerType: "router"
1839
+ }, request.signal);
1840
+ if (isHeadFallback) {
1841
+ if (!ctx.response) throwRouteHandlerError();
1842
+ return waitForRequest(stripSsrResponseBody(await handleRedirectResponse(response, request, getRouter, request.signal), "HEAD body stripped"), request.signal);
1843
+ }
1844
+ return normalizeSsrResponse(response);
1845
+ }
1846
+ var fetch = createStartHandler(defaultStreamHandler);
1847
+ function createServerEntry(entry) {
1848
+ return { async fetch(...args) {
1849
+ return await entry.fetch(...args);
1850
+ } };
1851
+ }
1852
+ var server_default = createServerEntry({ fetch });
1853
+ //#endregion
1854
+ export { createServerEntry, server_default as default, ssr_exports as i, TSS_SERVER_FUNCTION as n, getServerFnById as r, createServerFn as t };