@qwik.dev/router 2.0.0-beta.36 → 2.0.0-beta.38

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 (41) hide show
  1. package/lib/adapters/cloudflare-pages/vite/index.mjs +3 -5
  2. package/lib/adapters/shared/vite/index.d.ts +3 -4
  3. package/lib/adapters/shared/vite/index.mjs +167 -155
  4. package/lib/chunks/dev-preloaded-route-loader.mjs +3 -0
  5. package/lib/chunks/format.mjs +31 -0
  6. package/lib/chunks/fs.mjs +10 -8
  7. package/lib/chunks/head.qwik.mjs +1425 -0
  8. package/lib/chunks/http-error.qwik.mjs +2 -2
  9. package/lib/chunks/pathname.mjs +3 -32
  10. package/lib/chunks/request-body-limit.mjs +37 -0
  11. package/lib/chunks/request-path.mjs +60 -0
  12. package/lib/chunks/routes.mjs +47 -0
  13. package/lib/chunks/server-error.mjs +19 -0
  14. package/lib/chunks/system.mjs +8 -8
  15. package/lib/chunks/use-functions.qwik.mjs +3 -12
  16. package/lib/chunks/user-response.mjs +1875 -0
  17. package/lib/chunks/worker-thread.mjs +317 -0
  18. package/lib/index.d.ts +251 -44
  19. package/lib/index.qwik.mjs +734 -485
  20. package/lib/middleware/aws-lambda/index.mjs +2 -1
  21. package/lib/middleware/azure-swa/index.mjs +13 -9
  22. package/lib/middleware/cloudflare-pages/index.mjs +2 -2
  23. package/lib/middleware/deno/index.d.ts +2 -0
  24. package/lib/middleware/deno/index.mjs +2 -1
  25. package/lib/middleware/netlify-edge/index.mjs +2 -2
  26. package/lib/middleware/node/index.d.ts +9 -1
  27. package/lib/middleware/node/index.mjs +28 -3
  28. package/lib/middleware/request-handler/index.d.ts +65 -26
  29. package/lib/middleware/request-handler/index.mjs +38 -1679
  30. package/lib/middleware/vercel-edge/index.mjs +2 -2
  31. package/lib/ssg/index.d.ts +5 -13
  32. package/lib/ssg/index.mjs +14 -53
  33. package/lib/vite/index.d.ts +23 -0
  34. package/lib/vite/index.mjs +533 -122
  35. package/package.json +4 -3
  36. package/lib/chunks/deepFreeze.qwik.mjs +0 -18
  37. package/lib/chunks/error-handler.mjs +0 -57
  38. package/lib/chunks/not-found-wrapper.qwik.mjs +0 -25
  39. package/lib/chunks/redirect-handler.mjs +0 -6
  40. package/lib/chunks/routing.qwik.mjs +0 -821
  41. package/lib/chunks/worker-thread.qwik.mjs +0 -2585
@@ -0,0 +1,1875 @@
1
+ import { isDev as isDev$1, inlinedQrl } from '@qwik.dev/core';
2
+ import { isDev, _deserialize, _serialize, _verifySerializable } from '@qwik.dev/core/internal';
3
+ import { Q as QACTION_KEY, B as getRouteLoaderValues, E as loadRouteLoader, G as isPromise, x as QDATA_KEY, I as getLoaderRequestEvent, J as resolveRouteLoaderByHash, K as getRouteLoaderResponse, L as getRouteLoaderCtx, M as setRouteLoaders, F as FULLPATH_HEADER, p as Q_ROUTE, w as QFN_KEY, N as resolveRouteConfig, O as matchesRouteLoaderId, _ as _asyncRequestStore } from './head.qwik.mjs';
4
+ import { e as ensureSlash } from './pathname.mjs';
5
+ import { r as recognizeRequest, t as trimRecognizedInternalPathname, Q as QLoaderId, c as IsQAction, d as QActionId, I as IsQLoader, a as resolveValidInternalFullPathname } from './request-path.mjs';
6
+ import { A as AbortMessage, S as ServerError, R as RedirectMessage, t as throwIfControlFlowSignal } from './server-error.mjs';
7
+
8
+ function hash(str) {
9
+ let hash2 = 2166136261;
10
+ for (let i = 0; i < str.length; i++) {
11
+ hash2 ^= str.charCodeAt(i);
12
+ hash2 = hash2 * 16777619 | 0;
13
+ }
14
+ return (hash2 >>> 0).toString(36);
15
+ }
16
+ function normalizeETag(raw) {
17
+ let tag = raw.trim();
18
+ if (tag.endsWith('"') && tag.startsWith('W/"')) {
19
+ tag = tag.slice(3);
20
+ }
21
+ tag = tag.replace(/[^!#-~]/g, "");
22
+ return tag;
23
+ }
24
+ function setETagHeader(requestEv, normalizedETag) {
25
+ const headerETag = `"${normalizedETag}"`;
26
+ requestEv.headers.set("ETag", headerETag);
27
+ }
28
+ function performETagMatch(requestEv, normalizedETag) {
29
+ setETagHeader(requestEv, normalizedETag);
30
+ const ifNoneMatch = requestEv.request.headers.get("If-None-Match");
31
+ if (ifNoneMatch) {
32
+ let found = ifNoneMatch.trim() === "*";
33
+ if (!found) {
34
+ for (const entry of ifNoneMatch.split(",")) {
35
+ const normalizedEntry = normalizeETag(entry);
36
+ if (normalizedEntry === normalizedETag) {
37
+ found = true;
38
+ break;
39
+ }
40
+ }
41
+ }
42
+ if (found) {
43
+ requestEv.status(304);
44
+ requestEv.send(304, "");
45
+ return true;
46
+ }
47
+ }
48
+ return false;
49
+ }
50
+
51
+ function createCacheControl(cacheControl) {
52
+ const controls = [];
53
+ if (cacheControl === "day") {
54
+ cacheControl = 60 * 60 * 24;
55
+ } else if (cacheControl === "week") {
56
+ cacheControl = 60 * 60 * 24 * 7;
57
+ } else if (cacheControl === "month") {
58
+ cacheControl = 60 * 60 * 24 * 30;
59
+ } else if (cacheControl === "year") {
60
+ cacheControl = 60 * 60 * 24 * 365;
61
+ } else if (cacheControl === "private") {
62
+ cacheControl = {
63
+ private: true,
64
+ noCache: true
65
+ };
66
+ } else if (cacheControl === "immutable") {
67
+ cacheControl = {
68
+ public: true,
69
+ immutable: true,
70
+ maxAge: 60 * 60 * 24 * 365
71
+ };
72
+ } else if (cacheControl === "no-cache") {
73
+ cacheControl = {
74
+ noCache: true
75
+ };
76
+ }
77
+ if (typeof cacheControl === "number") {
78
+ cacheControl = {
79
+ maxAge: cacheControl,
80
+ sMaxAge: cacheControl
81
+ };
82
+ }
83
+ if (cacheControl.immutable) {
84
+ controls.push("immutable");
85
+ }
86
+ if (cacheControl.maxAge) {
87
+ controls.push(`max-age=${cacheControl.maxAge}`);
88
+ }
89
+ if (cacheControl.sMaxAge) {
90
+ controls.push(`s-maxage=${cacheControl.sMaxAge}`);
91
+ }
92
+ if (cacheControl.noStore) {
93
+ controls.push("no-store");
94
+ }
95
+ if (cacheControl.noCache) {
96
+ controls.push("no-cache");
97
+ }
98
+ if (cacheControl.private) {
99
+ controls.push("private");
100
+ }
101
+ if (cacheControl.public) {
102
+ controls.push("public");
103
+ }
104
+ if (cacheControl.staleWhileRevalidate) {
105
+ controls.push(`stale-while-revalidate=${cacheControl.staleWhileRevalidate}`);
106
+ }
107
+ if (cacheControl.staleIfError) {
108
+ controls.push(`stale-if-error=${cacheControl.staleIfError}`);
109
+ }
110
+ return controls.join(", ");
111
+ }
112
+
113
+ const SAMESITE = {
114
+ lax: "Lax",
115
+ Lax: "Lax",
116
+ None: "None",
117
+ none: "None",
118
+ strict: "Strict",
119
+ Strict: "Strict"
120
+ };
121
+ const UNIT = {
122
+ seconds: 1,
123
+ minutes: 1 * 60,
124
+ hours: 1 * 60 * 60,
125
+ days: 1 * 60 * 60 * 24,
126
+ weeks: 1 * 60 * 60 * 24 * 7
127
+ };
128
+ function tryDecodeUriComponent(str) {
129
+ try {
130
+ return decodeURIComponent(str);
131
+ } catch {
132
+ return str;
133
+ }
134
+ }
135
+ const parseCookieString = (cookieString) => {
136
+ const cookie = {};
137
+ if (typeof cookieString === "string" && cookieString !== "") {
138
+ const cookieSegments = cookieString.split(";");
139
+ for (const cookieSegment of cookieSegments) {
140
+ const separatorIndex = cookieSegment.indexOf("=");
141
+ if (separatorIndex !== -1) {
142
+ cookie[tryDecodeUriComponent(cookieSegment.slice(0, separatorIndex).trim())] = tryDecodeUriComponent(cookieSegment.slice(separatorIndex + 1).trim());
143
+ }
144
+ }
145
+ }
146
+ return cookie;
147
+ };
148
+ function resolveSameSite(sameSite) {
149
+ if (sameSite === true) {
150
+ return "Strict";
151
+ }
152
+ if (sameSite === false) {
153
+ return "None";
154
+ }
155
+ if (sameSite) {
156
+ return SAMESITE[sameSite];
157
+ }
158
+ return void 0;
159
+ }
160
+ const createSetCookieValue = (cookieName, cookieValue, options) => {
161
+ const c = [
162
+ `${cookieName}=${cookieValue}`
163
+ ];
164
+ if (typeof options.domain === "string") {
165
+ c.push(`Domain=${options.domain}`);
166
+ }
167
+ if (typeof options.maxAge === "number") {
168
+ c.push(`Max-Age=${options.maxAge}`);
169
+ } else if (Array.isArray(options.maxAge)) {
170
+ c.push(`Max-Age=${options.maxAge[0] * UNIT[options.maxAge[1]]}`);
171
+ } else if (typeof options.expires === "number" || typeof options.expires == "string") {
172
+ c.push(`Expires=${options.expires}`);
173
+ } else if (options.expires instanceof Date) {
174
+ c.push(`Expires=${options.expires.toUTCString()}`);
175
+ }
176
+ if (options.httpOnly) {
177
+ c.push("HttpOnly");
178
+ }
179
+ if (typeof options.path === "string") {
180
+ c.push(`Path=${options.path}`);
181
+ }
182
+ const sameSite = resolveSameSite(options.sameSite);
183
+ if (sameSite) {
184
+ c.push(`SameSite=${sameSite}`);
185
+ }
186
+ if (options.secure) {
187
+ c.push("Secure");
188
+ }
189
+ return c.join("; ");
190
+ };
191
+ const REQ_COOKIE = /* @__PURE__ */ Symbol("request-cookies");
192
+ const RES_COOKIE = /* @__PURE__ */ Symbol("response-cookies");
193
+ const LIVE_COOKIE = /* @__PURE__ */ Symbol("live-cookies");
194
+ class Cookie {
195
+ [REQ_COOKIE];
196
+ [RES_COOKIE] = {};
197
+ [LIVE_COOKIE] = {};
198
+ appendCounter = 0;
199
+ constructor(cookieString) {
200
+ this[REQ_COOKIE] = parseCookieString(cookieString);
201
+ this[LIVE_COOKIE] = {
202
+ ...this[REQ_COOKIE]
203
+ };
204
+ }
205
+ get(cookieName, live = true) {
206
+ const value = this[live ? LIVE_COOKIE : REQ_COOKIE][cookieName];
207
+ if (!value) {
208
+ return null;
209
+ }
210
+ return {
211
+ value,
212
+ json() {
213
+ return JSON.parse(value);
214
+ },
215
+ number() {
216
+ return Number(value);
217
+ }
218
+ };
219
+ }
220
+ getAll(live = true) {
221
+ return Object.keys(this[live ? LIVE_COOKIE : REQ_COOKIE]).reduce((cookies, cookieName) => {
222
+ cookies[cookieName] = this.get(cookieName);
223
+ return cookies;
224
+ }, {});
225
+ }
226
+ has(cookieName, live = true) {
227
+ return !!this[live ? LIVE_COOKIE : REQ_COOKIE][cookieName];
228
+ }
229
+ set(cookieName, cookieValue, options = {}) {
230
+ this[LIVE_COOKIE][cookieName] = typeof cookieValue === "string" ? cookieValue : JSON.stringify(cookieValue);
231
+ const resolvedValue = typeof cookieValue === "string" ? cookieValue : encodeURIComponent(JSON.stringify(cookieValue));
232
+ this[RES_COOKIE][cookieName] = createSetCookieValue(cookieName, resolvedValue, options);
233
+ }
234
+ append(cookieName, cookieValue, options = {}) {
235
+ this[LIVE_COOKIE][cookieName] = typeof cookieValue === "string" ? cookieValue : JSON.stringify(cookieValue);
236
+ const resolvedValue = typeof cookieValue === "string" ? cookieValue : encodeURIComponent(JSON.stringify(cookieValue));
237
+ this[RES_COOKIE][++this.appendCounter] = createSetCookieValue(cookieName, resolvedValue, options);
238
+ }
239
+ delete(name, options) {
240
+ this.set(name, "deleted", {
241
+ ...options,
242
+ maxAge: 0
243
+ });
244
+ this[LIVE_COOKIE][name] = null;
245
+ }
246
+ headers() {
247
+ return Object.values(this[RES_COOKIE]);
248
+ }
249
+ }
250
+ const mergeHeadersCookies = (headers, cookies) => {
251
+ const cookieHeaders = cookies.headers();
252
+ if (cookieHeaders.length > 0) {
253
+ const newHeaders = new Headers(headers);
254
+ for (const cookie of cookieHeaders) {
255
+ newHeaders.append("Set-Cookie", cookie);
256
+ }
257
+ return newHeaders;
258
+ }
259
+ return headers;
260
+ };
261
+
262
+ class RewriteMessage extends AbortMessage {
263
+ pathname;
264
+ constructor(pathname) {
265
+ super(), this.pathname = pathname;
266
+ }
267
+ }
268
+
269
+ const encoder = /* @__PURE__ */ new TextEncoder();
270
+ function getContentType(headers) {
271
+ return (headers.get("content-type")?.split(/[;,]/, 1)[0].trim() ?? "").toLowerCase();
272
+ }
273
+ function isContentType(headers, ...types) {
274
+ const type = getContentType(headers);
275
+ for (let i = 0; i < types.length; i++) {
276
+ if (types[i].toLowerCase() === type) {
277
+ return true;
278
+ }
279
+ }
280
+ return false;
281
+ }
282
+
283
+ const RequestEvMode = /* @__PURE__ */ Symbol("RequestEvMode");
284
+ const RequestEvRoute = /* @__PURE__ */ Symbol("RequestEvRoute");
285
+ const RequestRouteName = "@routeName";
286
+ const RequestEvSharedActionId = "@actionId";
287
+ const RequestEvSharedActionFormData = "@actionFormData";
288
+ const RequestEvSharedNonce = "@nonce";
289
+ const RequestEvIsRewrite = "@rewrite";
290
+ const RequestEvShareServerTiming = "@serverTiming";
291
+ const RequestEvETagCacheKey = "@eTagCacheKey";
292
+ const RequestEvHttpStatusMessage = "@httpStatusMessage";
293
+ function getRequestRoute(requestEv) {
294
+ return requestEv[RequestEvRoute];
295
+ }
296
+ function getRequestMode(requestEv) {
297
+ return requestEv[RequestEvMode];
298
+ }
299
+ const ABORT_INDEX = Number.MAX_SAFE_INTEGER;
300
+ const isDangerousKey = (k) => k === "__proto__" || k === "constructor" || k === "prototype";
301
+ const isArrayIndexKey = (k) => /^(0|[1-9]\d*)$/.test(k);
302
+ const createFormPathNode = () => ({
303
+ children: /* @__PURE__ */ new Map(),
304
+ isArray: true
305
+ });
306
+ const getFormPathTree = (formData) => {
307
+ const root = createFormPathNode();
308
+ for (const [name] of formData) {
309
+ const keys = name.split(".");
310
+ let hasDangerousKey = false;
311
+ for (const key of keys) {
312
+ if (isDangerousKey(key)) {
313
+ hasDangerousKey = true;
314
+ break;
315
+ }
316
+ }
317
+ if (hasDangerousKey) {
318
+ continue;
319
+ }
320
+ let pathNode = root;
321
+ for (let i = 0; i < keys.length - 1; i++) {
322
+ const key = keys[i];
323
+ if (key.endsWith("[]")) {
324
+ break;
325
+ }
326
+ let childNode = pathNode.children.get(key);
327
+ if (!childNode) {
328
+ childNode = createFormPathNode();
329
+ pathNode.children.set(key, childNode);
330
+ }
331
+ if (!isArrayIndexKey(keys[i + 1])) {
332
+ childNode.isArray = false;
333
+ }
334
+ pathNode = childNode;
335
+ }
336
+ }
337
+ return root;
338
+ };
339
+ const formToObj = (formData) => {
340
+ const values = /* @__PURE__ */ Object.create(null);
341
+ const pathTree = getFormPathTree(formData);
342
+ for (const [name, value] of formData) {
343
+ const keys = name.split(".");
344
+ let hasDangerousKey = false;
345
+ for (let i = 0; i < keys.length; i++) {
346
+ if (isDangerousKey(keys[i])) {
347
+ hasDangerousKey = true;
348
+ break;
349
+ }
350
+ }
351
+ if (hasDangerousKey) {
352
+ continue;
353
+ }
354
+ let object = values;
355
+ let pathNode = pathTree;
356
+ for (let i = 0; i < keys.length; i++) {
357
+ const key = keys[i];
358
+ if (key.endsWith("[]")) {
359
+ const arrayKey = key.slice(0, -2);
360
+ if (isDangerousKey(arrayKey)) {
361
+ break;
362
+ }
363
+ const existingValue = object[arrayKey];
364
+ if (existingValue !== void 0 && !Array.isArray(existingValue)) {
365
+ break;
366
+ }
367
+ object[arrayKey] = existingValue || [];
368
+ object[arrayKey].push(value);
369
+ break;
370
+ }
371
+ if (Array.isArray(object) && !isArrayIndexKey(key)) {
372
+ break;
373
+ }
374
+ if (i < keys.length - 1) {
375
+ const childNode = pathNode.children.get(key);
376
+ const nextValue = object[key];
377
+ if (nextValue !== void 0) {
378
+ object = nextValue;
379
+ pathNode = childNode;
380
+ continue;
381
+ }
382
+ object = object[key] = childNode.isArray ? [] : /* @__PURE__ */ Object.create(null);
383
+ pathNode = childNode;
384
+ } else {
385
+ object[key] = value;
386
+ }
387
+ }
388
+ }
389
+ return values;
390
+ };
391
+ const parseRequest = async ({ request, method, query }, sharedMap) => {
392
+ const type = getContentType(request.headers);
393
+ if (type === "application/x-www-form-urlencoded" || type === "multipart/form-data") {
394
+ const formData = await request.formData();
395
+ sharedMap.set(RequestEvSharedActionFormData, formData);
396
+ return formToObj(formData);
397
+ } else if (type === "application/json") {
398
+ const data = await request.json();
399
+ return data;
400
+ } else if (type === "application/qwik-json") {
401
+ if (method === "GET" && query.has(QDATA_KEY)) {
402
+ const data = query.get(QDATA_KEY);
403
+ if (data) {
404
+ try {
405
+ return await _deserialize(decodeURIComponent(data));
406
+ } catch {
407
+ }
408
+ }
409
+ }
410
+ return await _deserialize(await request.text());
411
+ }
412
+ return void 0;
413
+ };
414
+ function createRequestEvent(serverRequestEv, loadedRoute, requestHandlers, basePathname, resolved) {
415
+ const { request, platform, env } = serverRequestEv;
416
+ const sharedMap = /* @__PURE__ */ new Map();
417
+ const cookie = new Cookie(request.headers.get("cookie"));
418
+ const headers = new Headers();
419
+ const url = new URL(request.url);
420
+ let internalRequest = false;
421
+ const recognized = recognizeRequest(url.pathname);
422
+ if (recognized) {
423
+ url.pathname = trimRecognizedInternalPathname(url.pathname, recognized);
424
+ sharedMap.set(recognized.type, true);
425
+ internalRequest = "loader";
426
+ if (recognized.data?.loaderId) {
427
+ sharedMap.set(QLoaderId, recognized.data.loaderId);
428
+ }
429
+ }
430
+ const actionId = url.searchParams.get(QACTION_KEY);
431
+ if (actionId) {
432
+ sharedMap.set(IsQAction, true);
433
+ sharedMap.set(QActionId, actionId);
434
+ if (request.method === "POST" && request.headers.get("accept")?.includes("application/json")) {
435
+ internalRequest = "action";
436
+ }
437
+ }
438
+ let routeModuleIndex = -1;
439
+ let writableStream = null;
440
+ let requestData = void 0;
441
+ let locale = serverRequestEv.locale;
442
+ let status = loadedRoute?.$notFound$ ? 404 : 200;
443
+ const next = async () => {
444
+ routeModuleIndex++;
445
+ while (routeModuleIndex < requestHandlers.length) {
446
+ const moduleRequestHandler = requestHandlers[routeModuleIndex];
447
+ const result = moduleRequestHandler(requestEv);
448
+ throwIfControlFlowSignal(isPromise(result) ? await result : result);
449
+ routeModuleIndex++;
450
+ }
451
+ };
452
+ const resetRoute = (_loadedRoute, _requestHandlers, _url = url) => {
453
+ loadedRoute = _loadedRoute;
454
+ status = loadedRoute?.$notFound$ ? 404 : 200;
455
+ requestHandlers = _requestHandlers;
456
+ url.pathname = _url.pathname;
457
+ url.search = _url.search;
458
+ routeModuleIndex = -1;
459
+ };
460
+ const check = () => {
461
+ if (writableStream !== null) {
462
+ throw new Error("Response already sent");
463
+ }
464
+ };
465
+ const send = (statusOrResponse, body) => {
466
+ check();
467
+ if (typeof statusOrResponse === "number") {
468
+ status = statusOrResponse;
469
+ const writableStream2 = requestEv.getWritableStream();
470
+ const writer = writableStream2.getWriter();
471
+ writer.write(typeof body === "string" ? encoder.encode(body) : body);
472
+ writer.close();
473
+ } else {
474
+ status = statusOrResponse.status;
475
+ statusOrResponse.headers.forEach((value, key) => {
476
+ if (key.toLowerCase() === "set-cookie") {
477
+ return;
478
+ }
479
+ headers.append(key, value);
480
+ });
481
+ statusOrResponse.headers.getSetCookie().forEach((ck) => {
482
+ const index = ck.indexOf("=");
483
+ if (index === -1) {
484
+ return;
485
+ }
486
+ const key = ck.slice(0, index).trim();
487
+ const value = ck.slice(index + 1).trim();
488
+ cookie.set(key, value);
489
+ });
490
+ if (statusOrResponse.body) {
491
+ const writableStream2 = requestEv.getWritableStream();
492
+ statusOrResponse.body.pipeTo(writableStream2);
493
+ } else {
494
+ requestEv.getWritableStream().getWriter().close();
495
+ }
496
+ }
497
+ return exit();
498
+ };
499
+ const exit = (message = new AbortMessage()) => {
500
+ routeModuleIndex = ABORT_INDEX;
501
+ return message;
502
+ };
503
+ const requestEv = {
504
+ [RequestEvMode]: serverRequestEv.mode,
505
+ get [RequestEvRoute]() {
506
+ return loadedRoute;
507
+ },
508
+ cookie,
509
+ headers,
510
+ env,
511
+ method: request.method,
512
+ signal: request.signal,
513
+ originalUrl: new URL(url),
514
+ get params() {
515
+ return loadedRoute?.$params$ ?? {};
516
+ },
517
+ get pathname() {
518
+ return url.pathname;
519
+ },
520
+ platform,
521
+ get query() {
522
+ return url.searchParams;
523
+ },
524
+ request,
525
+ url,
526
+ internalRequest,
527
+ basePathname,
528
+ sharedMap,
529
+ get headersSent() {
530
+ return writableStream !== null;
531
+ },
532
+ get exited() {
533
+ return routeModuleIndex >= ABORT_INDEX;
534
+ },
535
+ get clientConn() {
536
+ return serverRequestEv.getClientConn();
537
+ },
538
+ next,
539
+ resetRoute,
540
+ exit,
541
+ cacheControl: (cacheControl, target = "Cache-Control") => {
542
+ check();
543
+ headers.set(target, createCacheControl(cacheControl));
544
+ },
545
+ resolveValue: async (loaderOrAction) => {
546
+ if (loaderOrAction.__brand === "server_loader") {
547
+ const loaderValues = getRouteLoaderValues(requestEv);
548
+ if (loaderOrAction.__id in loaderValues) {
549
+ return loaderValues[loaderOrAction.__id];
550
+ }
551
+ return loadRouteLoader(loaderOrAction, requestEv);
552
+ }
553
+ return void 0;
554
+ },
555
+ status: (statusCode) => {
556
+ if (typeof statusCode === "number") {
557
+ check();
558
+ status = statusCode;
559
+ return statusCode;
560
+ }
561
+ return status;
562
+ },
563
+ locale: (_locale) => {
564
+ if (typeof _locale === "string") {
565
+ locale = _locale;
566
+ }
567
+ return locale || "";
568
+ },
569
+ error: (statusCode, message) => {
570
+ status = statusCode;
571
+ headers.delete("Cache-Control");
572
+ return new ServerError(statusCode, message);
573
+ },
574
+ redirect: (statusCode, url2) => {
575
+ check();
576
+ status = statusCode;
577
+ if (url2) {
578
+ if (
579
+ // //test.com
580
+ /^\/\//.test(url2) || // /test//path
581
+ /([^:])\/\/+/.test(url2)
582
+ ) {
583
+ const fixedURL = url2.replace(/^\/\/+/, "/").replace(/([^:])\/\/+/g, "$1/");
584
+ console.warn(`Redirect URL ${url2} is invalid, fixing to ${fixedURL}`);
585
+ url2 = fixedURL;
586
+ }
587
+ headers.set("Location", url2);
588
+ }
589
+ headers.delete("Cache-Control");
590
+ if (statusCode > 301) {
591
+ headers.set("Cache-Control", "no-store");
592
+ }
593
+ if (internalRequest === "loader") {
594
+ return new RedirectMessage();
595
+ }
596
+ return exit(new RedirectMessage());
597
+ },
598
+ rewrite: (pathname) => {
599
+ check();
600
+ if (pathname.startsWith("http")) {
601
+ throw new ServerError(400, isDev ? "Rewrite does not support absolute urls" : "Bad Request");
602
+ }
603
+ sharedMap.set(RequestEvIsRewrite, true);
604
+ return exit(new RewriteMessage(pathname.replace(/\/+/g, "/")));
605
+ },
606
+ defer: (returnData) => {
607
+ return typeof returnData === "function" ? returnData : () => returnData;
608
+ },
609
+ fail: (statusCode, data) => {
610
+ check();
611
+ status = statusCode;
612
+ headers.delete("Cache-Control");
613
+ return {
614
+ failed: true,
615
+ ...data
616
+ };
617
+ },
618
+ text: (statusCode, text) => {
619
+ headers.set("Content-Type", "text/plain; charset=utf-8");
620
+ return send(statusCode, text);
621
+ },
622
+ html: (statusCode, html) => {
623
+ headers.set("Content-Type", "text/html; charset=utf-8");
624
+ return send(statusCode, html);
625
+ },
626
+ parseBody: async () => {
627
+ if (requestData !== void 0) {
628
+ return requestData;
629
+ }
630
+ return requestData = parseRequest(requestEv, sharedMap);
631
+ },
632
+ json: (statusCode, data) => {
633
+ headers.set("Content-Type", "application/json; charset=utf-8");
634
+ return send(statusCode, JSON.stringify(data));
635
+ },
636
+ send,
637
+ isDirty: () => {
638
+ return writableStream !== null;
639
+ },
640
+ getWritableStream: () => {
641
+ if (writableStream === null) {
642
+ if (isDev) {
643
+ const serverTiming = sharedMap.get(RequestEvShareServerTiming);
644
+ if (serverTiming) {
645
+ headers.set("Server-Timing", serverTiming.map(([name, duration]) => `${name};dur=${duration}`).join(","));
646
+ }
647
+ }
648
+ writableStream = serverRequestEv.getWritableStream(status, headers, cookie, resolved, requestEv);
649
+ }
650
+ return writableStream;
651
+ }
652
+ };
653
+ return requestEv;
654
+ }
655
+
656
+ const MAX_CACHE_SIZE = typeof globalThis.__SSR_CACHE_SIZE__ === "number" ? globalThis.__SSR_CACHE_SIZE__ : 50;
657
+ function createLruCache() {
658
+ const cache = /* @__PURE__ */ new Map();
659
+ return {
660
+ get(key) {
661
+ const entry = cache.get(key);
662
+ if (entry !== void 0) {
663
+ cache.delete(key);
664
+ cache.set(key, entry);
665
+ }
666
+ return entry;
667
+ },
668
+ set(key, entry) {
669
+ if (MAX_CACHE_SIZE <= 0) {
670
+ return;
671
+ }
672
+ if (cache.size >= MAX_CACHE_SIZE) {
673
+ const firstKey = cache.keys().next().value;
674
+ cache.delete(firstKey);
675
+ }
676
+ cache.set(key, entry);
677
+ },
678
+ clear(key) {
679
+ if (key != null) {
680
+ cache.delete(key);
681
+ } else {
682
+ cache.clear();
683
+ }
684
+ }
685
+ };
686
+ }
687
+ const ssrCache = createLruCache();
688
+ const loaderCache = createLruCache();
689
+ function resolveETag(eTagExport, headProps) {
690
+ if (eTagExport === void 0) {
691
+ return null;
692
+ }
693
+ if (typeof eTagExport === "function") {
694
+ return eTagExport(headProps);
695
+ }
696
+ return eTagExport;
697
+ }
698
+ function resolveCacheKey(cacheKeyExport, defaultKey, requestEv, eTag) {
699
+ if (cacheKeyExport === true) {
700
+ return defaultKey(requestEv, eTag);
701
+ }
702
+ if (typeof cacheKeyExport !== "function") {
703
+ return "";
704
+ }
705
+ return cacheKeyExport(requestEv, eTag) || "";
706
+ }
707
+ function defaultSsrCacheKey(requestEv, eTag) {
708
+ const status = requestEv.status();
709
+ const pathname = requestEv.url.pathname;
710
+ return eTag ? `${status}|${eTag}|${pathname}` : `${status}|${pathname}`;
711
+ }
712
+ function defaultLoaderCacheKey(requestEv, eTag) {
713
+ const loaderId = requestEv.sharedMap.get(QLoaderId);
714
+ const base = `${requestEv.url.pathname}|${requestEv.url.search}|${loaderId}`;
715
+ return eTag ? `${base}|${eTag}` : base;
716
+ }
717
+ function getCachedSsr(key) {
718
+ return ssrCache.get(key);
719
+ }
720
+ function setCachedSsr(key, entry) {
721
+ ssrCache.set(key, entry);
722
+ }
723
+ function getCachedLoader(key) {
724
+ return loaderCache.get(key);
725
+ }
726
+ function setCachedLoader(key, entry) {
727
+ loaderCache.set(key, entry);
728
+ }
729
+ function clearSsrCache(cacheKey) {
730
+ ssrCache.clear(cacheKey);
731
+ }
732
+ function clearLoaderCache(cacheKey) {
733
+ loaderCache.clear(cacheKey);
734
+ }
735
+
736
+ function createLoaderRequestEventFactory(requestEv) {
737
+ return (loader) => getLoaderRequestEvent(loader, requestEv);
738
+ }
739
+
740
+ function setLoaderData(requestEv, routeLoaders, loaderPaths) {
741
+ if (loaderPaths) {
742
+ Object.assign(getRouteLoaderCtx(requestEv).loaderPaths, loaderPaths);
743
+ }
744
+ setRouteLoaders(requestEv, routeLoaders);
745
+ }
746
+ function resolvePreETag(eTagOption, requestEv) {
747
+ if (typeof eTagOption === "string") {
748
+ return normalizeETag(eTagOption);
749
+ }
750
+ const result = eTagOption(requestEv);
751
+ return result ? normalizeETag(result) : "";
752
+ }
753
+ function addVaryHeader(requestEv, value) {
754
+ const vary = requestEv.headers.get("Vary");
755
+ if (!vary) {
756
+ requestEv.headers.set("Vary", value);
757
+ return;
758
+ }
759
+ const existing = vary.split(",").map((item) => item.trim().toLowerCase());
760
+ if (!existing.includes(value.toLowerCase())) {
761
+ requestEv.headers.set("Vary", `${vary}, ${value}`);
762
+ }
763
+ }
764
+ async function sendLoaderResponse(requestEv, data, loader) {
765
+ requestEv.headers.set("Content-Type", "application/json; charset=utf-8");
766
+ addVaryHeader(requestEv, FULLPATH_HEADER);
767
+ if (loader?.__expires && loader.__expires > 0) {
768
+ requestEv.cacheControl({
769
+ maxAge: Math.ceil(loader.__expires / 1e3),
770
+ private: true
771
+ });
772
+ }
773
+ requestEv.send(200, data);
774
+ }
775
+ function loaderHandler(routeLoaders, loaderPaths) {
776
+ return async (requestEvent) => {
777
+ const requestEv = requestEvent;
778
+ if (!requestEv.sharedMap.has(IsQLoader)) {
779
+ return;
780
+ }
781
+ if (requestEv.headersSent || requestEv.exited) {
782
+ return;
783
+ }
784
+ const loaderId = requestEv.sharedMap.get(QLoaderId);
785
+ const loader = resolveRouteLoaderByHash(routeLoaders, loaderId);
786
+ if (!loader) {
787
+ requestEv.json(404, {
788
+ error: "Loader not found"
789
+ });
790
+ return;
791
+ }
792
+ setLoaderData(requestEv, routeLoaders, loaderPaths);
793
+ const loaderRequestEv = createLoaderRequestEventFactory(requestEv)(loader);
794
+ const normalizedETag = loader.__eTag !== void 0 ? resolvePreETag(loader.__eTag, loaderRequestEv) : "";
795
+ if (normalizedETag && performETagMatch(loaderRequestEv, normalizedETag)) {
796
+ return;
797
+ }
798
+ let cacheKey = "";
799
+ if (loader.__cacheKey) {
800
+ cacheKey = resolveCacheKey(loader.__cacheKey, defaultLoaderCacheKey, loaderRequestEv, normalizedETag);
801
+ }
802
+ if (cacheKey) {
803
+ const cached = getCachedLoader(cacheKey);
804
+ if (cached) {
805
+ if (!normalizedETag) {
806
+ if (performETagMatch(loaderRequestEv, cached.eTag)) {
807
+ return;
808
+ }
809
+ } else {
810
+ setETagHeader(loaderRequestEv, cached.eTag);
811
+ }
812
+ await sendLoaderResponse(requestEv, cached.body, loader);
813
+ return;
814
+ }
815
+ }
816
+ const responseData = await getRouteLoaderResponse(loader.__qrl, loader.__validators, loaderRequestEv);
817
+ const data = await _serialize(responseData);
818
+ const failed = responseData.d && typeof responseData.d === "object" && responseData.d.failed;
819
+ const cacheable = cacheKey && !responseData.r && !responseData.e && !failed;
820
+ const finalETag = normalizedETag || (cacheable ? hash(data) : "");
821
+ if (cacheable && finalETag) {
822
+ setCachedLoader(cacheKey, {
823
+ eTag: finalETag,
824
+ body: data
825
+ });
826
+ }
827
+ if (!normalizedETag && finalETag && performETagMatch(loaderRequestEv, finalETag)) {
828
+ return;
829
+ }
830
+ await sendLoaderResponse(requestEv, data, loader);
831
+ };
832
+ }
833
+ async function sendJsonResponse(requestEv, responseData, status = 200) {
834
+ const data = await _serialize(responseData);
835
+ requestEv.headers.set("Content-Type", "application/json; charset=utf-8");
836
+ requestEv.send(status, data);
837
+ }
838
+ async function sendActionResponse(requestEv, responseData) {
839
+ const data = await _serialize(responseData);
840
+ requestEv.headers.set("Content-Type", "application/json; charset=utf-8");
841
+ requestEv.send(responseData.s || 200, data);
842
+ }
843
+
844
+ function jsonRequestWrapper() {
845
+ return async (requestEvent) => {
846
+ const requestEv = requestEvent;
847
+ const isLoader = requestEv.internalRequest === "loader";
848
+ const isActionJson = requestEv.internalRequest === "action";
849
+ if (!isLoader && !isActionJson) {
850
+ return;
851
+ }
852
+ if (isLoader) {
853
+ addVaryHeader(requestEv, FULLPATH_HEADER);
854
+ const pagePath = requestEv.request.headers.get(FULLPATH_HEADER);
855
+ const pagePathname = resolveValidInternalFullPathname(requestEv.url.pathname, pagePath);
856
+ if (pagePathname) {
857
+ requestEv.url.pathname = pagePathname;
858
+ }
859
+ }
860
+ try {
861
+ await requestEv.next();
862
+ } catch (err) {
863
+ if (requestEv.headersSent) {
864
+ return;
865
+ }
866
+ if (err instanceof RedirectMessage) {
867
+ const location = requestEv.headers.get("Location") || "/";
868
+ requestEv.headers.delete("Location");
869
+ if (isLoader) {
870
+ await sendJsonResponse(requestEv, {
871
+ r: location
872
+ });
873
+ } else {
874
+ await sendActionResponse(requestEv, {
875
+ redirect: location
876
+ });
877
+ }
878
+ } else if (err instanceof ServerError) {
879
+ if (isLoader) {
880
+ await sendJsonResponse(requestEv, {
881
+ e: err
882
+ });
883
+ } else {
884
+ await sendActionResponse(requestEv, {
885
+ e: err,
886
+ s: err.status
887
+ });
888
+ }
889
+ } else if (err instanceof Error) {
890
+ console.error("JSON request error:", err);
891
+ const message = isDev$1 ? `${err.message}
892
+ (this is only visible in dev mode)` : "Internal Server Error";
893
+ const se = new ServerError(500, message);
894
+ if (isLoader) {
895
+ await sendJsonResponse(requestEv, {
896
+ e: se
897
+ });
898
+ } else {
899
+ await sendActionResponse(requestEv, {
900
+ e: se,
901
+ s: 500
902
+ });
903
+ }
904
+ } else {
905
+ throw err;
906
+ }
907
+ }
908
+ };
909
+ }
910
+
911
+ function verifySerializable(data, qrl) {
912
+ try {
913
+ _verifySerializable(data, void 0);
914
+ } catch (e) {
915
+ if (e instanceof Error && qrl.dev) {
916
+ e.loc = qrl.dev;
917
+ }
918
+ throw e;
919
+ }
920
+ }
921
+ async function measure(requestEv, name, fn) {
922
+ const start = performance.now();
923
+ try {
924
+ return await fn();
925
+ } finally {
926
+ const duration = performance.now() - start;
927
+ let measurements = requestEv.sharedMap.get("@serverTiming");
928
+ if (!measurements) {
929
+ requestEv.sharedMap.set("@serverTiming", measurements = []);
930
+ }
931
+ measurements.push([
932
+ name,
933
+ duration
934
+ ]);
935
+ }
936
+ }
937
+ async function runValidators(requestEv, validators, data, devMode) {
938
+ let lastResult = {
939
+ success: true,
940
+ data
941
+ };
942
+ if (validators) {
943
+ for (const validator of validators) {
944
+ if (devMode) {
945
+ lastResult = await measure(requestEv, `validator$`, () => validator.validate(requestEv, data));
946
+ } else {
947
+ lastResult = await validator.validate(requestEv, data);
948
+ }
949
+ if (!lastResult.success) {
950
+ return lastResult;
951
+ } else {
952
+ data = lastResult.data;
953
+ }
954
+ }
955
+ }
956
+ return lastResult;
957
+ }
958
+ function actionHandler(routeActions) {
959
+ return async (requestEvent) => {
960
+ const requestEv = requestEvent;
961
+ if (!requestEv.sharedMap.has(IsQAction)) {
962
+ return;
963
+ }
964
+ if (!requestEv.request.headers.get("accept")?.includes("application/json")) {
965
+ return;
966
+ }
967
+ if (requestEv.headersSent || requestEv.exited) {
968
+ return;
969
+ }
970
+ const actionId = requestEv.sharedMap.get(QActionId);
971
+ const method = requestEv.method;
972
+ const devMode = isDev;
973
+ if (devMode && method === "GET") {
974
+ console.warn('Seems like you are submitting a Qwik Action via GET request. Qwik Actions should be submitted via POST request.\nMake sure your <form> has method="POST" attribute, like this: <form method="POST">');
975
+ }
976
+ if (method !== "POST") {
977
+ return;
978
+ }
979
+ let action;
980
+ for (const routeAction of routeActions) {
981
+ if (routeAction.__id === actionId) {
982
+ action = routeAction;
983
+ }
984
+ }
985
+ if (!action) {
986
+ const serverActionsMap = globalThis._qwikActionsMap;
987
+ action = serverActionsMap?.get(actionId);
988
+ }
989
+ if (!action) {
990
+ requestEv.json(404, {
991
+ error: "Action not found"
992
+ });
993
+ return;
994
+ }
995
+ const data = await requestEv.parseBody();
996
+ if (!data || typeof data !== "object") {
997
+ throw new Error(`Expected request data for the action id ${actionId} to be an object`);
998
+ }
999
+ let actionResult;
1000
+ const result = await runValidators(requestEv, action.__validators, data, devMode);
1001
+ if (!result.success) {
1002
+ actionResult = requestEv.fail(result.status ?? 500, result.error);
1003
+ } else {
1004
+ const actionResolved = devMode ? await measure(requestEv, action.__qrl.getHash(), () => action.__qrl.call(requestEv, result.data, requestEv)) : await action.__qrl.call(requestEv, result.data, requestEv);
1005
+ throwIfControlFlowSignal(actionResolved);
1006
+ if (devMode) {
1007
+ verifySerializable(actionResolved, action.__qrl);
1008
+ }
1009
+ actionResult = actionResolved;
1010
+ }
1011
+ if (requestEv.headers.has("Location")) {
1012
+ throw new RedirectMessage();
1013
+ }
1014
+ const responseData = {
1015
+ result: actionResult
1016
+ };
1017
+ requestEv.sharedMap.set(RequestEvSharedActionId, actionId);
1018
+ requestEv.sharedMap.set("@actionResult", actionResult);
1019
+ if (action.__invalidate) {
1020
+ responseData.loaderHashes = action.__invalidate;
1021
+ } else if (globalThis.__STRICT_LOADERS__) {
1022
+ responseData.loaderHashes = [];
1023
+ }
1024
+ const serialized = await _serialize(responseData);
1025
+ requestEv.headers.set("Content-Type", "application/json; charset=utf-8");
1026
+ requestEv.send(requestEv.status(), serialized);
1027
+ };
1028
+ }
1029
+
1030
+ var HttpStatus = /* @__PURE__ */ (function(HttpStatus2) {
1031
+ HttpStatus2[HttpStatus2["Continue"] = 100] = "Continue";
1032
+ HttpStatus2[HttpStatus2["SwitchingProtocols"] = 101] = "SwitchingProtocols";
1033
+ HttpStatus2[HttpStatus2["Processing"] = 102] = "Processing";
1034
+ HttpStatus2[HttpStatus2["Ok"] = 200] = "Ok";
1035
+ HttpStatus2[HttpStatus2["Created"] = 201] = "Created";
1036
+ HttpStatus2[HttpStatus2["Accepted"] = 202] = "Accepted";
1037
+ HttpStatus2[HttpStatus2["NonAuthoritativeInformation"] = 203] = "NonAuthoritativeInformation";
1038
+ HttpStatus2[HttpStatus2["NoContent"] = 204] = "NoContent";
1039
+ HttpStatus2[HttpStatus2["ResetContent"] = 205] = "ResetContent";
1040
+ HttpStatus2[HttpStatus2["PartialContent"] = 206] = "PartialContent";
1041
+ HttpStatus2[HttpStatus2["MultiStatus"] = 207] = "MultiStatus";
1042
+ HttpStatus2[HttpStatus2["AlreadyReported"] = 208] = "AlreadyReported";
1043
+ HttpStatus2[HttpStatus2["ImUsed"] = 226] = "ImUsed";
1044
+ HttpStatus2[HttpStatus2["MultipleChoices"] = 300] = "MultipleChoices";
1045
+ HttpStatus2[HttpStatus2["MovedPermanently"] = 301] = "MovedPermanently";
1046
+ HttpStatus2[HttpStatus2["Found"] = 302] = "Found";
1047
+ HttpStatus2[HttpStatus2["SeeOther"] = 303] = "SeeOther";
1048
+ HttpStatus2[HttpStatus2["NotModified"] = 304] = "NotModified";
1049
+ HttpStatus2[HttpStatus2["UseProxy"] = 305] = "UseProxy";
1050
+ HttpStatus2[HttpStatus2["SwitchProxy"] = 306] = "SwitchProxy";
1051
+ HttpStatus2[HttpStatus2["TemporaryRedirect"] = 307] = "TemporaryRedirect";
1052
+ HttpStatus2[HttpStatus2["PermanentRedirect"] = 308] = "PermanentRedirect";
1053
+ HttpStatus2[HttpStatus2["BadRequest"] = 400] = "BadRequest";
1054
+ HttpStatus2[HttpStatus2["Unauthorized"] = 401] = "Unauthorized";
1055
+ HttpStatus2[HttpStatus2["PaymentRequired"] = 402] = "PaymentRequired";
1056
+ HttpStatus2[HttpStatus2["Forbidden"] = 403] = "Forbidden";
1057
+ HttpStatus2[HttpStatus2["NotFound"] = 404] = "NotFound";
1058
+ HttpStatus2[HttpStatus2["MethodNotAllowed"] = 405] = "MethodNotAllowed";
1059
+ HttpStatus2[HttpStatus2["NotAcceptable"] = 406] = "NotAcceptable";
1060
+ HttpStatus2[HttpStatus2["ProxyAuthenticationRequired"] = 407] = "ProxyAuthenticationRequired";
1061
+ HttpStatus2[HttpStatus2["RequestTimeout"] = 408] = "RequestTimeout";
1062
+ HttpStatus2[HttpStatus2["Conflict"] = 409] = "Conflict";
1063
+ HttpStatus2[HttpStatus2["Gone"] = 410] = "Gone";
1064
+ HttpStatus2[HttpStatus2["LengthRequired"] = 411] = "LengthRequired";
1065
+ HttpStatus2[HttpStatus2["PreconditionFailed"] = 412] = "PreconditionFailed";
1066
+ HttpStatus2[HttpStatus2["PayloadTooLarge"] = 413] = "PayloadTooLarge";
1067
+ HttpStatus2[HttpStatus2["UriTooLong"] = 414] = "UriTooLong";
1068
+ HttpStatus2[HttpStatus2["UnsupportedMediaType"] = 415] = "UnsupportedMediaType";
1069
+ HttpStatus2[HttpStatus2["RangeNotSatisfiable"] = 416] = "RangeNotSatisfiable";
1070
+ HttpStatus2[HttpStatus2["ExpectationFailed"] = 417] = "ExpectationFailed";
1071
+ HttpStatus2[HttpStatus2["IAmATeapot"] = 418] = "IAmATeapot";
1072
+ HttpStatus2[HttpStatus2["MisdirectedRequest"] = 421] = "MisdirectedRequest";
1073
+ HttpStatus2[HttpStatus2["UnprocessableEntity"] = 422] = "UnprocessableEntity";
1074
+ HttpStatus2[HttpStatus2["Locked"] = 423] = "Locked";
1075
+ HttpStatus2[HttpStatus2["FailedDependency"] = 424] = "FailedDependency";
1076
+ HttpStatus2[HttpStatus2["UpgradeRequired"] = 426] = "UpgradeRequired";
1077
+ HttpStatus2[HttpStatus2["PreconditionRequired"] = 428] = "PreconditionRequired";
1078
+ HttpStatus2[HttpStatus2["TooManyRequests"] = 429] = "TooManyRequests";
1079
+ HttpStatus2[HttpStatus2["RequestHeaderFieldsTooLarge"] = 431] = "RequestHeaderFieldsTooLarge";
1080
+ HttpStatus2[HttpStatus2["UnavailableForLegalReasons"] = 451] = "UnavailableForLegalReasons";
1081
+ HttpStatus2[HttpStatus2["InternalServerError"] = 500] = "InternalServerError";
1082
+ HttpStatus2[HttpStatus2["NotImplemented"] = 501] = "NotImplemented";
1083
+ HttpStatus2[HttpStatus2["BadGateway"] = 502] = "BadGateway";
1084
+ HttpStatus2[HttpStatus2["ServiceUnavailable"] = 503] = "ServiceUnavailable";
1085
+ HttpStatus2[HttpStatus2["GatewayTimeout"] = 504] = "GatewayTimeout";
1086
+ HttpStatus2[HttpStatus2["HttpVersionNotSupported"] = 505] = "HttpVersionNotSupported";
1087
+ HttpStatus2[HttpStatus2["VariantAlsoNegotiates"] = 506] = "VariantAlsoNegotiates";
1088
+ HttpStatus2[HttpStatus2["InsufficientStorage"] = 507] = "InsufficientStorage";
1089
+ HttpStatus2[HttpStatus2["LoopDetected"] = 508] = "LoopDetected";
1090
+ HttpStatus2[HttpStatus2["NotExtended"] = 510] = "NotExtended";
1091
+ HttpStatus2[HttpStatus2["NetworkAuthenticationRequired"] = 511] = "NetworkAuthenticationRequired";
1092
+ return HttpStatus2;
1093
+ })({});
1094
+
1095
+ function getQwikRouterServerData(requestEv) {
1096
+ const { params, request, status, locale, originalUrl } = requestEv;
1097
+ const requestHeaders = {};
1098
+ request.headers.forEach((value, key) => requestHeaders[key] = value);
1099
+ const action = requestEv.sharedMap.get(RequestEvSharedActionId);
1100
+ const actionResult = requestEv.sharedMap.get("@actionResult");
1101
+ const formData = requestEv.sharedMap.get(RequestEvSharedActionFormData);
1102
+ const routeName = requestEv.sharedMap.get(RequestRouteName);
1103
+ const nonce = requestEv.sharedMap.get(RequestEvSharedNonce);
1104
+ const headers = requestEv.request.headers;
1105
+ const reconstructedUrl = new URL(originalUrl.pathname + originalUrl.search, originalUrl);
1106
+ const host = headers.get("X-Forwarded-Host");
1107
+ const protocol = headers.get("X-Forwarded-Proto");
1108
+ if (host) {
1109
+ reconstructedUrl.port = "";
1110
+ reconstructedUrl.host = host;
1111
+ }
1112
+ if (protocol) {
1113
+ reconstructedUrl.protocol = protocol;
1114
+ }
1115
+ const routeLoaderCtx = getRouteLoaderCtx(requestEv);
1116
+ const loaderValues = getRouteLoaderValues(requestEv);
1117
+ return {
1118
+ url: reconstructedUrl.href,
1119
+ requestHeaders,
1120
+ renderMode: getRequestMode(requestEv),
1121
+ locale: locale(),
1122
+ nonce,
1123
+ containerAttributes: {
1124
+ [Q_ROUTE]: routeName
1125
+ },
1126
+ qwikrouter: {
1127
+ routeName,
1128
+ ev: requestEv,
1129
+ params: {
1130
+ ...params
1131
+ },
1132
+ loadedRoute: getRequestRoute(requestEv),
1133
+ routeLoaderCtx,
1134
+ loaderValues,
1135
+ response: {
1136
+ status: status(),
1137
+ statusMessage: requestEv.sharedMap.get(RequestEvHttpStatusMessage),
1138
+ action,
1139
+ actionResult,
1140
+ formData
1141
+ }
1142
+ }
1143
+ };
1144
+ }
1145
+
1146
+ const loadHttpError = () => import('./http-error.qwik.mjs');
1147
+ function createResolveRequestHandlers() {
1148
+ const resolveRequestHandlers2 = (serverPlugins, route, method, checkOrigin, renderHandler) => {
1149
+ const routeLoaders = [];
1150
+ const routeActions = [];
1151
+ const requestHandlers = [];
1152
+ const isPageRoute = !!isLastModulePageRoute2(route.$mods$);
1153
+ if (isPageRoute) {
1154
+ requestHandlers.push(jsonRequestWrapper());
1155
+ requestHandlers.push(serverErrorMiddleware(route, renderHandler));
1156
+ }
1157
+ if (serverPlugins) {
1158
+ _resolveRequestHandlers(routeLoaders, routeActions, requestHandlers, serverPlugins, isPageRoute, method);
1159
+ }
1160
+ const routeModules = route.$mods$;
1161
+ _resolveRequestHandlers(routeLoaders, routeActions, requestHandlers, routeModules, isPageRoute, method, isPageRoute);
1162
+ const routeName = route.$routeName$;
1163
+ if (checkOrigin && (method === "POST" || method === "PUT" || method === "PATCH" || method === "DELETE")) {
1164
+ if (checkOrigin === "lax-proto") {
1165
+ requestHandlers.unshift(csrfLaxProtoCheckMiddleware);
1166
+ } else {
1167
+ requestHandlers.unshift(csrfCheckMiddleware);
1168
+ }
1169
+ }
1170
+ if (isPageRoute) {
1171
+ requestHandlers.push(loaderHandler(routeLoaders, route.$loaderPaths$));
1172
+ requestHandlers.push(actionHandler(routeActions));
1173
+ if (method === "POST" || method === "GET") {
1174
+ requestHandlers.push(runServerFunction);
1175
+ }
1176
+ if (!route.$notFound$) {
1177
+ requestHandlers.push(fixTrailingSlash2);
1178
+ }
1179
+ }
1180
+ if (isPageRoute) {
1181
+ requestHandlers.push((ev) => {
1182
+ ev.sharedMap.set(RequestRouteName, routeName);
1183
+ });
1184
+ requestHandlers.push(actionsMiddleware2(routeActions));
1185
+ requestHandlers.push(loadersMiddleware2(routeLoaders, route));
1186
+ requestHandlers.push(eTagMiddleware(route));
1187
+ requestHandlers.push(renderHandler);
1188
+ }
1189
+ return requestHandlers;
1190
+ };
1191
+ function _resolveRequestHandlers(routeLoaders, routeActions, requestHandlers, routeModules, collectActions, method, guardPageHandlersForLoader = false) {
1192
+ for (let i = 0; i < routeModules.length; i++) {
1193
+ const routeModule = routeModules[i];
1194
+ const moduleHandlers = getModuleRequestHandlers(routeModule, method);
1195
+ const shouldGuardPageHandlers = guardPageHandlersForLoader && i === routeModules.length - 1;
1196
+ requestHandlers.push(...shouldGuardPageHandlers ? moduleHandlers.map((handler) => guardPageHandlerForLoader(routeModule, handler)) : moduleHandlers);
1197
+ if (collectActions) {
1198
+ for (const module of Object.values(routeModule)) {
1199
+ if (typeof module === "function") {
1200
+ if (module.__brand === "server_loader") {
1201
+ routeLoaders.push(module);
1202
+ } else if (module.__brand === "server_action") {
1203
+ routeActions.push(module);
1204
+ }
1205
+ }
1206
+ }
1207
+ }
1208
+ }
1209
+ }
1210
+ function getModuleRequestHandlers(routeModule, method) {
1211
+ const handlers = [];
1212
+ addRequestHandlers(handlers, routeModule.onRequest);
1213
+ let methodReqHandler;
1214
+ switch (method) {
1215
+ case "GET": {
1216
+ methodReqHandler = routeModule.onGet;
1217
+ break;
1218
+ }
1219
+ case "POST": {
1220
+ methodReqHandler = routeModule.onPost;
1221
+ break;
1222
+ }
1223
+ case "PUT": {
1224
+ methodReqHandler = routeModule.onPut;
1225
+ break;
1226
+ }
1227
+ case "PATCH": {
1228
+ methodReqHandler = routeModule.onPatch;
1229
+ break;
1230
+ }
1231
+ case "DELETE": {
1232
+ methodReqHandler = routeModule.onDelete;
1233
+ break;
1234
+ }
1235
+ case "OPTIONS": {
1236
+ methodReqHandler = routeModule.onOptions;
1237
+ break;
1238
+ }
1239
+ case "HEAD": {
1240
+ methodReqHandler = routeModule.onHead;
1241
+ break;
1242
+ }
1243
+ }
1244
+ addRequestHandlers(handlers, methodReqHandler);
1245
+ return handlers;
1246
+ }
1247
+ function addRequestHandlers(handlers, handler) {
1248
+ if (typeof handler === "function") {
1249
+ handlers.push(handler);
1250
+ } else if (Array.isArray(handler)) {
1251
+ handlers.push(...handler);
1252
+ }
1253
+ }
1254
+ function guardPageHandlerForLoader(routeModule, handler) {
1255
+ return (requestEv) => {
1256
+ if (requestEv.sharedMap.has(IsQLoader)) {
1257
+ const loaderId = requestEv.sharedMap.get(QLoaderId);
1258
+ if (!moduleHasLoader(routeModule, loaderId)) {
1259
+ return;
1260
+ }
1261
+ }
1262
+ return handler(requestEv);
1263
+ };
1264
+ }
1265
+ function moduleHasLoader(routeModule, loaderId) {
1266
+ if (typeof loaderId !== "string") {
1267
+ return false;
1268
+ }
1269
+ for (const value of Object.values(routeModule)) {
1270
+ if (checkBrand2(value, "server_loader") && matchesRouteLoaderId(value, loaderId)) {
1271
+ return true;
1272
+ }
1273
+ }
1274
+ return false;
1275
+ }
1276
+ const checkBrand2 = (obj, brand) => {
1277
+ return obj && typeof obj === "function" && obj.__brand === brand;
1278
+ };
1279
+ function actionsMiddleware2(routeActions) {
1280
+ return async (requestEvent) => {
1281
+ const requestEv = requestEvent;
1282
+ if (requestEv.headersSent) {
1283
+ requestEv.exit();
1284
+ return;
1285
+ }
1286
+ const { method } = requestEv;
1287
+ if (isDev$1 && method === "GET") {
1288
+ if (requestEv.query.has(QACTION_KEY)) {
1289
+ console.warn('Seems like you are submitting a Qwik Action via GET request. Qwik Actions should be submitted via POST request.\nMake sure your <form> has method="POST" attribute, like this: <form method="POST">');
1290
+ }
1291
+ }
1292
+ if (method === "POST") {
1293
+ const selectedActionId = requestEv.query.get(QACTION_KEY);
1294
+ if (selectedActionId) {
1295
+ const serverActionsMap = globalThis._qwikActionsMap;
1296
+ const action = routeActions.find((action2) => action2.__id === selectedActionId) ?? serverActionsMap?.get(selectedActionId);
1297
+ if (action) {
1298
+ requestEv.sharedMap.set(RequestEvSharedActionId, selectedActionId);
1299
+ const data = await requestEv.parseBody();
1300
+ if (!data || typeof data !== "object") {
1301
+ throw new Error(`Expected request data for the action id ${selectedActionId} to be an object`);
1302
+ }
1303
+ const result = await runValidators(requestEv, action.__validators, data);
1304
+ let actionResult;
1305
+ if (!result.success) {
1306
+ actionResult = requestEv.fail(result.status ?? 500, result.error);
1307
+ } else {
1308
+ const actionResolved = isDev$1 ? await measure2(requestEv, action.__qrl.getHash(), () => action.__qrl.call(requestEv, result.data, requestEv)) : await action.__qrl.call(requestEv, result.data, requestEv);
1309
+ throwIfControlFlowSignal(actionResolved);
1310
+ if (isDev$1) {
1311
+ verifySerializable2(actionResolved, action.__qrl);
1312
+ }
1313
+ actionResult = actionResolved;
1314
+ }
1315
+ requestEv.sharedMap.set("@actionResult", actionResult);
1316
+ }
1317
+ }
1318
+ }
1319
+ };
1320
+ }
1321
+ function loadersMiddleware2(routeLoaders, route) {
1322
+ return (requestEvent) => {
1323
+ if (requestEvent.headersSent) {
1324
+ requestEvent.exit();
1325
+ return;
1326
+ }
1327
+ if (routeLoaders.length === 0) {
1328
+ return;
1329
+ }
1330
+ setLoaderData(requestEvent, routeLoaders, route);
1331
+ let allBlockSSRLoaders;
1332
+ for (let i = 0; i < routeLoaders.length; i++) {
1333
+ const loader = routeLoaders[i];
1334
+ const promise = loadRouteLoader(loader, requestEvent);
1335
+ promise.catch(() => {
1336
+ });
1337
+ if (loader.__blockSSR) {
1338
+ allBlockSSRLoaders = allBlockSSRLoaders ? allBlockSSRLoaders.then(() => promise) : promise;
1339
+ }
1340
+ }
1341
+ return allBlockSSRLoaders;
1342
+ };
1343
+ }
1344
+ function setLoaderData(requestEv, routeLoaders, route) {
1345
+ if (routeLoaders.length === 0) {
1346
+ return;
1347
+ }
1348
+ const routeLoaderCtx = getRouteLoaderCtx(requestEv);
1349
+ if (route.$loaderPaths$) {
1350
+ Object.assign(routeLoaderCtx.loaderPaths, route.$loaderPaths$);
1351
+ }
1352
+ setRouteLoaders(requestEv, routeLoaders);
1353
+ }
1354
+ function eTagMiddleware(route) {
1355
+ return (requestEv) => {
1356
+ if (requestEv.headersSent) {
1357
+ return;
1358
+ }
1359
+ if (requestEv.method !== "GET") {
1360
+ return;
1361
+ }
1362
+ const mods = route.$mods$;
1363
+ const hasCachingConfig = mods.some((m) => {
1364
+ if (!m) {
1365
+ return false;
1366
+ }
1367
+ if (m.routeConfig) {
1368
+ return typeof m.routeConfig === "function" || m.routeConfig.eTag !== void 0 || m.routeConfig.cacheKey !== void 0;
1369
+ }
1370
+ return m.eTag !== void 0 || m.cacheKey !== void 0;
1371
+ });
1372
+ if (!hasCachingConfig) {
1373
+ return;
1374
+ }
1375
+ const loaderValues = getRouteLoaderValues(requestEv);
1376
+ const getData = (loaderOrAction) => {
1377
+ const id = loaderOrAction.__id;
1378
+ if (loaderOrAction.__brand === "server_loader") {
1379
+ if (!(id in loaderValues)) {
1380
+ throw new Error("Loader not executed for this request.");
1381
+ }
1382
+ return loaderValues[id];
1383
+ }
1384
+ return requestEv.sharedMap.get(RequestEvSharedActionId) === id ? requestEv.sharedMap.get("@actionResult") : void 0;
1385
+ };
1386
+ const routeLocation = {
1387
+ params: requestEv.params,
1388
+ url: requestEv.url,
1389
+ isNavigating: false,
1390
+ prevUrl: void 0
1391
+ };
1392
+ const status = requestEv.status();
1393
+ const config = resolveRouteConfig(getData, routeLocation, mods, "", status);
1394
+ const headProps = {
1395
+ head: config.head,
1396
+ status,
1397
+ withLocale: (fn) => fn(),
1398
+ resolveValue: getData,
1399
+ ...routeLocation
1400
+ };
1401
+ const resolvedETag = resolveETag(config.eTag, headProps);
1402
+ const normalizedETag = resolvedETag !== null ? normalizeETag(resolvedETag) : "";
1403
+ if (normalizedETag && performETagMatch(requestEv, normalizedETag)) {
1404
+ return;
1405
+ }
1406
+ if (MAX_CACHE_SIZE <= 0) {
1407
+ return;
1408
+ }
1409
+ const cacheKey = resolveCacheKey(config.cacheKey, defaultSsrCacheKey, requestEv, normalizedETag);
1410
+ if (!cacheKey) {
1411
+ return;
1412
+ }
1413
+ const cached = getCachedSsr(cacheKey);
1414
+ if (cached) {
1415
+ requestEv.headers.set("Content-Type", "text/html; charset=utf-8");
1416
+ requestEv.headers.set("X-SSR-Cache", "HIT");
1417
+ if (!normalizedETag) {
1418
+ if (performETagMatch(requestEv, cached.eTag)) {
1419
+ return;
1420
+ }
1421
+ } else {
1422
+ setETagHeader(requestEv, cached.eTag);
1423
+ }
1424
+ requestEv.send(status, cached.body);
1425
+ return;
1426
+ }
1427
+ requestEv.sharedMap.set(RequestEvETagCacheKey, {
1428
+ key: cacheKey,
1429
+ eTag: normalizedETag
1430
+ });
1431
+ };
1432
+ }
1433
+ function serverErrorMiddleware(route, renderHandler) {
1434
+ return async (requestEv) => {
1435
+ try {
1436
+ await requestEv.next();
1437
+ } catch (e) {
1438
+ if (!(e instanceof ServerError) || requestEv.headersSent) {
1439
+ throw e;
1440
+ }
1441
+ const accept = requestEv.request.headers.get("Accept");
1442
+ if (accept && !accept.includes("text/html")) {
1443
+ throw e;
1444
+ }
1445
+ const status = e.status;
1446
+ requestEv.status(status);
1447
+ const errorLoader = route.$errorLoader$;
1448
+ route.$mods$ = errorLoader ? await Promise.all(errorLoader.map((load) => load())) : [
1449
+ await loadHttpError()
1450
+ ];
1451
+ requestEv.sharedMap.set(RequestEvHttpStatusMessage, typeof e.data === "string" ? e.data : "Server Error");
1452
+ await renderHandler(requestEv);
1453
+ }
1454
+ };
1455
+ }
1456
+ async function runValidators(requestEv, validators, data) {
1457
+ let lastResult = {
1458
+ success: true,
1459
+ data
1460
+ };
1461
+ if (validators) {
1462
+ for (const validator of validators) {
1463
+ if (isDev$1) {
1464
+ lastResult = await measure2(requestEv, `validator$`, () => validator.validate(requestEv, data));
1465
+ } else {
1466
+ lastResult = await validator.validate(requestEv, data);
1467
+ }
1468
+ if (!lastResult.success) {
1469
+ return lastResult;
1470
+ } else {
1471
+ data = lastResult.data;
1472
+ }
1473
+ }
1474
+ }
1475
+ return lastResult;
1476
+ }
1477
+ function isAsyncIterator(obj) {
1478
+ return obj ? typeof obj === "object" && Symbol.asyncIterator in obj : false;
1479
+ }
1480
+ async function runServerFunction(ev) {
1481
+ const serverFnHash = ev.query.get(QFN_KEY);
1482
+ if (serverFnHash && ev.request.headers.get("X-QRL") === serverFnHash && ev.request.headers.get("Content-Type") === "application/qwik-json") {
1483
+ ev.exit();
1484
+ const data = await ev.parseBody();
1485
+ if (!Array.isArray(data) || !(Array.isArray(data[0]) || data[0] === void 0)) {
1486
+ throw ev.error(500, "Invalid request");
1487
+ }
1488
+ const qrl = inlinedQrl(null, serverFnHash, data.slice(1));
1489
+ let result;
1490
+ try {
1491
+ if (isDev$1) {
1492
+ result = await measure2(ev, `server_${serverFnHash}`, () => qrl.apply(ev, data[0]));
1493
+ } else {
1494
+ result = await qrl.apply(ev, data[0]);
1495
+ }
1496
+ } catch (err) {
1497
+ if (err instanceof ServerError) {
1498
+ throw ev.error(err.status, err.data);
1499
+ }
1500
+ console.error(`Server function ${serverFnHash} failed:`, err);
1501
+ throw ev.error(500, "Invalid request");
1502
+ }
1503
+ throwIfControlFlowSignal(result);
1504
+ if (isAsyncIterator(result)) {
1505
+ await streamServerFunctionResult2(ev, result, qrl);
1506
+ } else {
1507
+ verifySerializable2(result, qrl);
1508
+ ev.headers.set("Content-Type", "application/qwik-json");
1509
+ const message = await _serialize(result);
1510
+ ev.send(200, message);
1511
+ }
1512
+ return;
1513
+ }
1514
+ }
1515
+ async function streamServerFunctionResult2(ev, result, qrl) {
1516
+ ev.headers.set("Content-Type", "text/qwik-json-stream");
1517
+ const writable = ev.getWritableStream();
1518
+ const stream = writable.getWriter();
1519
+ for await (const item of result) {
1520
+ if (isDev$1) {
1521
+ verifySerializable2(item, qrl);
1522
+ }
1523
+ const message = await _serialize(item);
1524
+ if (ev.signal.aborted) {
1525
+ break;
1526
+ }
1527
+ await stream.write(encoder.encode(`${message}
1528
+ `)).catch((err) => {
1529
+ if (isDev$1) {
1530
+ console.error(`Server function ${qrl.getSymbol()} stream write failed:`, err);
1531
+ }
1532
+ });
1533
+ }
1534
+ await stream.close().catch((err) => {
1535
+ if (isDev$1) {
1536
+ console.error(`Server function ${qrl.getSymbol()} stream close failed:`, err);
1537
+ }
1538
+ });
1539
+ }
1540
+ function fixTrailingSlash2(ev) {
1541
+ const { basePathname, originalUrl } = ev;
1542
+ const { pathname, search } = originalUrl;
1543
+ if (!pathname.startsWith("/") || pathname.startsWith("//")) {
1544
+ return;
1545
+ }
1546
+ if (pathname !== basePathname && !pathname.endsWith(".html")) {
1547
+ if (!globalThis.__NO_TRAILING_SLASH__) {
1548
+ if (!pathname.endsWith("/")) {
1549
+ throw ev.redirect(HttpStatus.MovedPermanently, ensureSlash(pathname) + search);
1550
+ }
1551
+ } else {
1552
+ if (pathname.endsWith("/")) {
1553
+ throw ev.redirect(HttpStatus.MovedPermanently, pathname.slice(0, pathname.length - 1) + search);
1554
+ }
1555
+ }
1556
+ }
1557
+ }
1558
+ function verifySerializable2(data, qrl) {
1559
+ try {
1560
+ _verifySerializable(data, void 0);
1561
+ } catch (e) {
1562
+ if (e instanceof Error && qrl.dev) {
1563
+ e.loc = qrl.dev;
1564
+ }
1565
+ throw e;
1566
+ }
1567
+ }
1568
+ const isQrl2 = (value) => {
1569
+ return typeof value === "function" && typeof value.getSymbol === "function";
1570
+ };
1571
+ function isLastModulePageRoute2(routeModules) {
1572
+ const lastRouteModule = routeModules[routeModules.length - 1];
1573
+ return lastRouteModule && typeof lastRouteModule.default === "function";
1574
+ }
1575
+ function getPathname2(url) {
1576
+ url = new URL(url);
1577
+ if (!globalThis.__NO_TRAILING_SLASH__) {
1578
+ if (!url.pathname.endsWith("/")) {
1579
+ url.pathname = ensureSlash(url.pathname);
1580
+ }
1581
+ } else {
1582
+ if (url.pathname.endsWith("/")) {
1583
+ url.pathname = url.pathname.slice(0, -1);
1584
+ }
1585
+ }
1586
+ const search = url.search.slice(1).replaceAll(/&?q(action|data|func|loaders)=[^&]+/g, "");
1587
+ return `${url.pathname}${search ? `?${search}` : ""}${url.hash}`;
1588
+ }
1589
+ function csrfLaxProtoCheckMiddleware(requestEv) {
1590
+ checkCSRF2(requestEv, "lax-proto");
1591
+ }
1592
+ function csrfCheckMiddleware(requestEv) {
1593
+ checkCSRF2(requestEv);
1594
+ }
1595
+ function checkCSRF2(requestEv, laxProto) {
1596
+ const contentType = requestEv.request.headers.get("content-type");
1597
+ const isSimpleRequest = !contentType || isContentType(requestEv.request.headers, "application/x-www-form-urlencoded", "multipart/form-data", "text/plain");
1598
+ if (isSimpleRequest) {
1599
+ const inputOrigin = requestEv.request.headers.get("origin");
1600
+ const origin = requestEv.url.origin;
1601
+ let forbidden = inputOrigin !== origin;
1602
+ if (forbidden && laxProto && inputOrigin?.replace(/^http(s)?/g, "") === origin.replace(/^http(s)?/g, "")) {
1603
+ forbidden = false;
1604
+ }
1605
+ if (forbidden) {
1606
+ throw requestEv.error(403, `CSRF check failed. Cross-site ${requestEv.method} form submissions are forbidden.
1607
+ The request origin "${inputOrigin}" does not match the server origin "${origin}".`);
1608
+ }
1609
+ }
1610
+ }
1611
+ function renderQwikMiddleware2(render) {
1612
+ return async (requestEv) => {
1613
+ if (requestEv.headersSent) {
1614
+ return;
1615
+ }
1616
+ const responseHeaders = requestEv.headers;
1617
+ if (!responseHeaders.has("Content-Type")) {
1618
+ responseHeaders.set("Content-Type", "text/html; charset=utf-8");
1619
+ }
1620
+ const cachePlan = requestEv.sharedMap.get(RequestEvETagCacheKey);
1621
+ const { readable, writable } = new TextEncoderStream();
1622
+ const writableStream = requestEv.getWritableStream();
1623
+ let cacheChunks;
1624
+ let pipeSource = readable;
1625
+ if (cachePlan) {
1626
+ cacheChunks = [];
1627
+ const capture = new TransformStream({
1628
+ transform(chunk, controller) {
1629
+ cacheChunks.push(chunk);
1630
+ controller.enqueue(chunk);
1631
+ }
1632
+ });
1633
+ pipeSource = readable.pipeThrough(capture);
1634
+ }
1635
+ let pipeError;
1636
+ const pipe = pipeSource.pipeTo(writableStream, {
1637
+ preventClose: true
1638
+ }).catch((error) => {
1639
+ pipeError = error;
1640
+ });
1641
+ const stream = writable.getWriter();
1642
+ try {
1643
+ const isStatic = getRequestMode(requestEv) === "static";
1644
+ const serverData = getQwikRouterServerData(requestEv);
1645
+ const result = await render({
1646
+ base: requestEv.basePathname + "build/",
1647
+ stream,
1648
+ streaming: isStatic ? {
1649
+ outOfOrder: false
1650
+ } : void 0,
1651
+ serverData,
1652
+ containerAttributes: {
1653
+ ["q:render"]: isStatic ? "static" : "",
1654
+ ...serverData.containerAttributes
1655
+ }
1656
+ });
1657
+ if (typeof result.html === "string") {
1658
+ await stream.write(result.html);
1659
+ }
1660
+ } finally {
1661
+ await stream.ready;
1662
+ await stream.close();
1663
+ await pipe;
1664
+ }
1665
+ if (pipeError) {
1666
+ throw pipeError;
1667
+ }
1668
+ if (cachePlan && cacheChunks && cacheChunks.length > 0) {
1669
+ const totalLength = cacheChunks.reduce((sum, chunk) => sum + chunk.length, 0);
1670
+ const combined = new Uint8Array(totalLength);
1671
+ let offset = 0;
1672
+ for (const chunk of cacheChunks) {
1673
+ combined.set(chunk, offset);
1674
+ offset += chunk.length;
1675
+ }
1676
+ const html = new TextDecoder().decode(combined);
1677
+ const cachedETag = cachePlan.eTag || hash(html);
1678
+ setCachedSsr(cachePlan.key, {
1679
+ eTag: cachedETag,
1680
+ body: html
1681
+ });
1682
+ }
1683
+ await writableStream.close();
1684
+ };
1685
+ }
1686
+ function now() {
1687
+ return typeof performance !== "undefined" ? performance.now() : 0;
1688
+ }
1689
+ async function measure2(requestEv, name, fn) {
1690
+ const start = now();
1691
+ try {
1692
+ return await fn();
1693
+ } finally {
1694
+ const duration = now() - start;
1695
+ let measurements = requestEv.sharedMap.get(RequestEvShareServerTiming);
1696
+ if (!measurements) {
1697
+ requestEv.sharedMap.set(RequestEvShareServerTiming, measurements = []);
1698
+ }
1699
+ measurements.push([
1700
+ name,
1701
+ duration
1702
+ ]);
1703
+ }
1704
+ }
1705
+ return {
1706
+ actionsMiddleware: actionsMiddleware2,
1707
+ checkBrand: checkBrand2,
1708
+ checkCSRF: checkCSRF2,
1709
+ fixTrailingSlash: fixTrailingSlash2,
1710
+ getPathname: getPathname2,
1711
+ isLastModulePageRoute: isLastModulePageRoute2,
1712
+ isQrl: isQrl2,
1713
+ loadersMiddleware: loadersMiddleware2,
1714
+ measure: measure2,
1715
+ renderQwikMiddleware: renderQwikMiddleware2,
1716
+ resolveRequestHandlers: resolveRequestHandlers2,
1717
+ streamServerFunctionResult: streamServerFunctionResult2,
1718
+ verifySerializable: verifySerializable2
1719
+ };
1720
+ }
1721
+ const { renderQwikMiddleware, resolveRequestHandlers} = createResolveRequestHandlers();
1722
+
1723
+ const ESCAPE_HTML = /[&<>]/g;
1724
+ const escapeHtml = (s) => {
1725
+ return s.replace(ESCAPE_HTML, (c) => {
1726
+ switch (c) {
1727
+ case "&":
1728
+ return "&amp;";
1729
+ case "<":
1730
+ return "&lt;";
1731
+ case ">":
1732
+ return "&gt;";
1733
+ default:
1734
+ return "";
1735
+ }
1736
+ });
1737
+ };
1738
+ const COLOR_400 = "#006ce9";
1739
+ const COLOR_500 = "#713fc2";
1740
+ function minimalHtmlResponse(status, message) {
1741
+ if (typeof status !== "number") {
1742
+ status = 500;
1743
+ }
1744
+ if (typeof message === "string") {
1745
+ message = escapeHtml(message);
1746
+ } else {
1747
+ message = "";
1748
+ }
1749
+ const width = typeof message === "string" ? "600px" : "300px";
1750
+ const color = status >= 500 ? COLOR_500 : COLOR_400;
1751
+ return `
1752
+ <head>
1753
+ <meta charset="utf-8">
1754
+ <meta http-equiv="Status" content="${status}">
1755
+ <title>${status} ${message}</title>
1756
+ <meta name="viewport" content="width=device-width,initial-scale=1">
1757
+ <style>
1758
+ body { color: ${color}; background-color: #fafafa; padding: 30px; font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, Roboto, sans-serif; }
1759
+ p { max-width: ${width}; margin: 60px auto 30px auto; background: white; border-radius: 4px; box-shadow: 0px 0px 50px -20px ${color}; overflow: hidden; }
1760
+ strong { display: inline-block; padding: 15px; background: ${color}; color: white; }
1761
+ span { display: inline-block; padding: 15px; }
1762
+ </style>
1763
+ </head>
1764
+ <body><p><strong>${status}</strong> <span>${message}</span></p></body>
1765
+ `;
1766
+ }
1767
+ function getErrorHtml(status, e) {
1768
+ let message = "Server Error";
1769
+ if (e != null) {
1770
+ if (typeof e.message === "string") {
1771
+ message = e.message;
1772
+ } else {
1773
+ message = String(e);
1774
+ }
1775
+ }
1776
+ return `<html>` + minimalHtmlResponse(status, message) + `</html>`;
1777
+ }
1778
+
1779
+ const ensureError = (e) => e instanceof Error || typeof e === "object" && e !== null ? e : new Error(String(e));
1780
+ async function runNext(requestEv, rebuildRouteInfo, resolve) {
1781
+ try {
1782
+ const isValidURL = (url) => new URL(url.pathname + url.search, url);
1783
+ isValidURL(requestEv.originalUrl);
1784
+ } catch {
1785
+ const status = 404;
1786
+ const message = "Resource Not Found";
1787
+ requestEv.status(status);
1788
+ requestEv.html(status, getErrorHtml(status, message));
1789
+ return new ServerError(status, message);
1790
+ }
1791
+ let rewriteAttempt = 1;
1792
+ async function runOnce() {
1793
+ try {
1794
+ await requestEv.next();
1795
+ } catch (e) {
1796
+ if (e instanceof RedirectMessage) {
1797
+ const stream = requestEv.getWritableStream();
1798
+ await stream.close();
1799
+ return e;
1800
+ } else if (e instanceof RewriteMessage) {
1801
+ if (rewriteAttempt > 50) {
1802
+ return new Error(`Infinite rewrite loop`);
1803
+ }
1804
+ rewriteAttempt += 1;
1805
+ const url = new URL(requestEv.url);
1806
+ url.pathname = e.pathname;
1807
+ const { loadedRoute, requestHandlers } = await rebuildRouteInfo(url);
1808
+ requestEv.resetRoute(loadedRoute, requestHandlers, url);
1809
+ return await runOnce();
1810
+ } else if (e instanceof AbortMessage) {
1811
+ return;
1812
+ } else if (e instanceof ServerError && !requestEv.headersSent) {
1813
+ const status = e.status;
1814
+ const accept = requestEv.request.headers.get("Accept");
1815
+ if (accept && !accept.includes("text/html")) {
1816
+ requestEv.headers.set("Content-Type", "application/qwik-json");
1817
+ requestEv.send(status, await _serialize(e.data));
1818
+ } else {
1819
+ requestEv.html(status, getErrorHtml(status, e.data));
1820
+ }
1821
+ return e;
1822
+ }
1823
+ if (!isDev) {
1824
+ try {
1825
+ if (!requestEv.headersSent) {
1826
+ requestEv.headers.set("content-type", "text/html; charset=utf-8");
1827
+ requestEv.cacheControl({
1828
+ noCache: true
1829
+ });
1830
+ requestEv.status(500);
1831
+ }
1832
+ const stream = requestEv.getWritableStream();
1833
+ if (!stream.locked) {
1834
+ const writer = stream.getWriter();
1835
+ await writer.write(encoder.encode(getErrorHtml(500, "Internal Server Error")));
1836
+ await writer.close();
1837
+ }
1838
+ } catch {
1839
+ console.error("Unable to render error page");
1840
+ }
1841
+ }
1842
+ return e instanceof Error || typeof e === "object" && e !== null ? e : new Error(String(e));
1843
+ }
1844
+ }
1845
+ try {
1846
+ return await runOnce();
1847
+ } finally {
1848
+ if (!requestEv.isDirty()) {
1849
+ resolve(null);
1850
+ }
1851
+ }
1852
+ }
1853
+ function runQwikRouter(serverRequestEv, loadedRoute, requestHandlers, rebuildRouteInfo, basePathname = "/") {
1854
+ let resolve;
1855
+ const responsePromise = new Promise((r) => resolve = r);
1856
+ try {
1857
+ const requestEv = createRequestEvent(serverRequestEv, loadedRoute, requestHandlers, basePathname, resolve);
1858
+ return {
1859
+ response: responsePromise,
1860
+ requestEv,
1861
+ completion: _asyncRequestStore ? _asyncRequestStore.run(requestEv, runNext, requestEv, rebuildRouteInfo, resolve) : runNext(requestEv, rebuildRouteInfo, resolve)
1862
+ };
1863
+ } catch (e) {
1864
+ resolve(null);
1865
+ return {
1866
+ response: responsePromise,
1867
+ requestEv: {
1868
+ headersSent: false
1869
+ },
1870
+ completion: Promise.resolve(ensureError(e))
1871
+ };
1872
+ }
1873
+ }
1874
+
1875
+ export { RewriteMessage as R, resolveRequestHandlers as a, renderQwikMiddleware as b, clearLoaderCache as c, clearSsrCache as d, getErrorHtml as g, mergeHeadersCookies as m, runQwikRouter as r };