@qwik.dev/router 2.0.0-beta.1 → 2.0.0-beta.10

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 (149) hide show
  1. package/adapters/static/vite.d.ts +1 -1
  2. package/lib/adapters/azure-swa/vite/index-BqUeglYs.cjs +1 -0
  3. package/lib/adapters/azure-swa/vite/index-CBIchDYq.js +651 -0
  4. package/lib/adapters/azure-swa/vite/index-ClHGw5z1.js +6 -0
  5. package/lib/adapters/azure-swa/vite/index-CrwlB95_.js +22 -0
  6. package/lib/adapters/azure-swa/vite/index-DTIOTwZo.cjs +11 -0
  7. package/lib/adapters/azure-swa/vite/index-vQuPcef3.cjs +1 -0
  8. package/lib/adapters/azure-swa/vite/index.cjs +5 -96
  9. package/lib/adapters/azure-swa/vite/index.d.ts +2 -2
  10. package/lib/adapters/azure-swa/vite/index.mjs +201 -26
  11. package/lib/adapters/bun-server/vite/index-BqUeglYs.cjs +1 -0
  12. package/lib/adapters/bun-server/vite/index-CBIchDYq.js +651 -0
  13. package/lib/adapters/bun-server/vite/index-ClHGw5z1.js +6 -0
  14. package/lib/adapters/bun-server/vite/index-CrwlB95_.js +22 -0
  15. package/lib/adapters/bun-server/vite/index-DTIOTwZo.cjs +11 -0
  16. package/lib/adapters/bun-server/vite/index-vQuPcef3.cjs +1 -0
  17. package/lib/adapters/bun-server/vite/index.cjs +5 -50
  18. package/lib/adapters/bun-server/vite/index.d.ts +2 -2
  19. package/lib/adapters/bun-server/vite/index.mjs +196 -12
  20. package/lib/adapters/cloud-run/vite/index-BqUeglYs.cjs +1 -0
  21. package/lib/adapters/cloud-run/vite/index-CBIchDYq.js +651 -0
  22. package/lib/adapters/cloud-run/vite/index-ClHGw5z1.js +6 -0
  23. package/lib/adapters/cloud-run/vite/index-CrwlB95_.js +22 -0
  24. package/lib/adapters/cloud-run/vite/index-DTIOTwZo.cjs +11 -0
  25. package/lib/adapters/cloud-run/vite/index-vQuPcef3.cjs +1 -0
  26. package/lib/adapters/cloud-run/vite/index.cjs +5 -47
  27. package/lib/adapters/cloud-run/vite/index.d.ts +2 -2
  28. package/lib/adapters/cloud-run/vite/index.mjs +195 -11
  29. package/lib/adapters/cloudflare-pages/vite/index-BIeHg2Cj.cjs +5 -0
  30. package/lib/adapters/cloudflare-pages/vite/index-C455V8_A.cjs +1 -0
  31. package/lib/adapters/cloudflare-pages/vite/index-ClHGw5z1.js +6 -0
  32. package/lib/adapters/cloudflare-pages/vite/index-D3HITboM.js +645 -0
  33. package/lib/adapters/cloudflare-pages/vite/index-DKcVHRBy.cjs +11 -0
  34. package/lib/adapters/cloudflare-pages/vite/index-DwovcBp3.js +22 -0
  35. package/lib/adapters/cloudflare-pages/vite/index-bogwy7wh.js +250 -0
  36. package/lib/adapters/cloudflare-pages/vite/index-vQuPcef3.cjs +1 -0
  37. package/lib/adapters/cloudflare-pages/vite/index.cjs +1 -115
  38. package/lib/adapters/cloudflare-pages/vite/index.d.ts +2 -2
  39. package/lib/adapters/cloudflare-pages/vite/index.mjs +4 -78
  40. package/lib/adapters/deno-server/vite/index-BqUeglYs.cjs +1 -0
  41. package/lib/adapters/deno-server/vite/index-CBIchDYq.js +651 -0
  42. package/lib/adapters/deno-server/vite/index-ClHGw5z1.js +6 -0
  43. package/lib/adapters/deno-server/vite/index-CrwlB95_.js +22 -0
  44. package/lib/adapters/deno-server/vite/index-DTIOTwZo.cjs +11 -0
  45. package/lib/adapters/deno-server/vite/index-vQuPcef3.cjs +1 -0
  46. package/lib/adapters/deno-server/vite/index.cjs +5 -62
  47. package/lib/adapters/deno-server/vite/index.d.ts +2 -2
  48. package/lib/adapters/deno-server/vite/index.mjs +198 -14
  49. package/lib/adapters/netlify-edge/vite/index-BqUeglYs.cjs +1 -0
  50. package/lib/adapters/netlify-edge/vite/index-CBIchDYq.js +651 -0
  51. package/lib/adapters/netlify-edge/vite/index-ClHGw5z1.js +6 -0
  52. package/lib/adapters/netlify-edge/vite/index-CrwlB95_.js +22 -0
  53. package/lib/adapters/netlify-edge/vite/index-DTIOTwZo.cjs +11 -0
  54. package/lib/adapters/netlify-edge/vite/index-vQuPcef3.cjs +1 -0
  55. package/lib/adapters/netlify-edge/vite/index.cjs +6 -129
  56. package/lib/adapters/netlify-edge/vite/index.d.ts +2 -2
  57. package/lib/adapters/netlify-edge/vite/index.mjs +240 -60
  58. package/lib/adapters/node-server/vite/index-BqUeglYs.cjs +1 -0
  59. package/lib/adapters/node-server/vite/index-CBIchDYq.js +651 -0
  60. package/lib/adapters/node-server/vite/index-ClHGw5z1.js +6 -0
  61. package/lib/adapters/node-server/vite/index-CrwlB95_.js +22 -0
  62. package/lib/adapters/node-server/vite/index-DTIOTwZo.cjs +11 -0
  63. package/lib/adapters/node-server/vite/index-vQuPcef3.cjs +1 -0
  64. package/lib/adapters/node-server/vite/index.cjs +5 -50
  65. package/lib/adapters/node-server/vite/index.d.ts +2 -2
  66. package/lib/adapters/node-server/vite/index.mjs +196 -12
  67. package/lib/adapters/shared/vite/index-BqUeglYs.cjs +1 -0
  68. package/lib/adapters/shared/vite/index-CBIchDYq.js +651 -0
  69. package/lib/adapters/shared/vite/index-ClHGw5z1.js +6 -0
  70. package/lib/adapters/shared/vite/index-CrwlB95_.js +22 -0
  71. package/lib/adapters/shared/vite/index-DTIOTwZo.cjs +11 -0
  72. package/lib/adapters/shared/vite/index-vQuPcef3.cjs +1 -0
  73. package/lib/adapters/shared/vite/index.cjs +2 -375
  74. package/lib/adapters/shared/vite/index.d.ts +9 -15
  75. package/lib/adapters/shared/vite/index.mjs +155 -292
  76. package/lib/adapters/ssg/vite/index-BqUeglYs.cjs +1 -0
  77. package/lib/adapters/ssg/vite/index-CBIchDYq.js +651 -0
  78. package/lib/adapters/ssg/vite/index-ClHGw5z1.js +6 -0
  79. package/lib/adapters/ssg/vite/index-CrwlB95_.js +22 -0
  80. package/lib/adapters/ssg/vite/index-DTIOTwZo.cjs +11 -0
  81. package/lib/adapters/ssg/vite/index-vQuPcef3.cjs +1 -0
  82. package/lib/adapters/ssg/vite/index.cjs +5 -0
  83. package/lib/adapters/ssg/vite/index.d.ts +13 -0
  84. package/lib/adapters/ssg/vite/index.mjs +201 -0
  85. package/lib/adapters/vercel-edge/vite/index-BqUeglYs.cjs +1 -0
  86. package/lib/adapters/vercel-edge/vite/index-CBIchDYq.js +651 -0
  87. package/lib/adapters/vercel-edge/vite/index-ClHGw5z1.js +6 -0
  88. package/lib/adapters/vercel-edge/vite/index-CrwlB95_.js +22 -0
  89. package/lib/adapters/vercel-edge/vite/index-DTIOTwZo.cjs +11 -0
  90. package/lib/adapters/vercel-edge/vite/index-vQuPcef3.cjs +1 -0
  91. package/lib/adapters/vercel-edge/vite/index.cjs +5 -118
  92. package/lib/adapters/vercel-edge/vite/index.d.ts +2 -2
  93. package/lib/adapters/vercel-edge/vite/index.mjs +230 -51
  94. package/lib/index.d.ts +172 -50
  95. package/lib/index.qwik.cjs +333 -160
  96. package/lib/index.qwik.mjs +335 -162
  97. package/lib/middleware/aws-lambda/index.cjs +1 -0
  98. package/lib/middleware/aws-lambda/index.d.ts +3 -2
  99. package/lib/middleware/aws-lambda/index.mjs +27 -41
  100. package/lib/middleware/azure-swa/index.cjs +1 -0
  101. package/lib/middleware/azure-swa/index.mjs +46 -269
  102. package/lib/middleware/bun/index.cjs +1 -0
  103. package/lib/middleware/bun/index.mjs +68 -120
  104. package/lib/middleware/cloudflare-pages/index.cjs +1 -0
  105. package/lib/middleware/cloudflare-pages/index.mjs +48 -80
  106. package/lib/middleware/deno/index.cjs +1 -0
  107. package/lib/middleware/deno/index.mjs +63 -110
  108. package/lib/middleware/firebase/index.cjs +1 -0
  109. package/lib/middleware/firebase/index.mjs +16 -28
  110. package/lib/middleware/netlify-edge/index.cjs +1 -0
  111. package/lib/middleware/netlify-edge/index.mjs +36 -64
  112. package/lib/middleware/node/index.cjs +1 -314
  113. package/lib/middleware/node/index.mjs +116 -198
  114. package/lib/middleware/request-handler/index.cjs +11 -1607
  115. package/lib/middleware/request-handler/index.d.ts +63 -62
  116. package/lib/middleware/request-handler/index.mjs +879 -1333
  117. package/lib/middleware/vercel-edge/index.cjs +1 -0
  118. package/lib/middleware/vercel-edge/index.mjs +47 -82
  119. package/lib/modules.d.ts +4 -12
  120. package/lib/service-worker.cjs +1 -17
  121. package/lib/service-worker.mjs +5 -15
  122. package/lib/ssg/deno.cjs +1 -0
  123. package/lib/ssg/deno.mjs +6 -0
  124. package/lib/ssg/index-CBIchDYq.js +651 -0
  125. package/lib/ssg/index-ClHGw5z1.js +6 -0
  126. package/lib/ssg/index-DTIOTwZo.cjs +11 -0
  127. package/lib/ssg/index-vQuPcef3.cjs +1 -0
  128. package/lib/ssg/index.cjs +1 -0
  129. package/lib/{static → ssg}/index.d.ts +17 -17
  130. package/lib/ssg/index.mjs +22 -0
  131. package/lib/ssg/node.cjs +11 -0
  132. package/lib/ssg/node.mjs +651 -0
  133. package/lib/vite/index.cjs +28 -27431
  134. package/lib/vite/index.d.ts +16 -0
  135. package/lib/vite/index.mjs +1413 -27227
  136. package/modules.d.ts +4 -12
  137. package/package.json +50 -39
  138. package/ssg.d.ts +2 -0
  139. package/static.d.ts +1 -1
  140. package/lib/adapters/static/vite/index.cjs +0 -368
  141. package/lib/adapters/static/vite/index.d.ts +0 -10
  142. package/lib/adapters/static/vite/index.mjs +0 -331
  143. package/lib/static/deno.mjs +0 -8
  144. package/lib/static/index.cjs +0 -67
  145. package/lib/static/index.mjs +0 -48
  146. package/lib/static/node.cjs +0 -1124
  147. package/lib/static/node.mjs +0 -1086
  148. package/middleware/request-handler/generated/not-found-paths.ts +0 -7
  149. package/middleware/request-handler/generated/static-paths.ts +0 -35
@@ -1,1614 +1,18 @@
1
- "use strict";
2
- var __create = Object.create;
3
- var __defProp = Object.defineProperty;
4
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
- var __getOwnPropNames = Object.getOwnPropertyNames;
6
- var __getProtoOf = Object.getPrototypeOf;
7
- var __hasOwnProp = Object.prototype.hasOwnProperty;
8
- var __export = (target, all) => {
9
- for (var name in all)
10
- __defProp(target, name, { get: all[name], enumerable: true });
11
- };
12
- var __copyProps = (to, from, except, desc) => {
13
- if (from && typeof from === "object" || typeof from === "function") {
14
- for (let key of __getOwnPropNames(from))
15
- if (!__hasOwnProp.call(to, key) && key !== except)
16
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
- }
18
- return to;
19
- };
20
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
- // If the importer is in node compatibility mode or this is not an ESM
22
- // file that has been converted to a CommonJS file using a Babel-
23
- // compatible transform (i.e. "__esModule" has not been set), then set
24
- // "default" to the CommonJS "module.exports" for node compatibility.
25
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
- mod
27
- ));
28
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
-
30
- // packages/qwik-router/src/middleware/request-handler/index.ts
31
- var index_exports = {};
32
- __export(index_exports, {
33
- AbortMessage: () => AbortMessage,
34
- RedirectMessage: () => RedirectMessage,
35
- RewriteMessage: () => RewriteMessage,
36
- ServerError: () => ServerError,
37
- _TextEncoderStream_polyfill: () => _TextEncoderStream_polyfill,
38
- getErrorHtml: () => getErrorHtml,
39
- mergeHeadersCookies: () => mergeHeadersCookies,
40
- requestHandler: () => requestHandler
41
- });
42
- module.exports = __toCommonJS(index_exports);
43
-
44
- // packages/qwik-router/src/middleware/request-handler/error-handler.ts
45
- var ServerError = class extends Error {
46
- constructor(status, data) {
47
- super(typeof data === "string" ? data : void 0);
48
- this.status = status;
49
- this.data = data;
50
- }
51
- };
52
- function getErrorHtml(status, e) {
53
- let message = "Server Error";
54
- if (e != null) {
55
- if (typeof e.message === "string") {
56
- message = e.message;
57
- } else {
58
- message = String(e);
59
- }
60
- }
61
- return `<html>` + minimalHtmlResponse(status, message) + `</html>`;
62
- }
63
- function minimalHtmlResponse(status, message) {
64
- if (typeof status !== "number") {
65
- status = 500;
66
- }
67
- if (typeof message === "string") {
68
- message = escapeHtml(message);
69
- } else {
70
- message = "";
71
- }
72
- const width = typeof message === "string" ? "600px" : "300px";
73
- const color = status >= 500 ? COLOR_500 : COLOR_400;
74
- return `
1
+ "use strict";var De=Object.create;var ne=Object.defineProperty;var Se=Object.getOwnPropertyDescriptor;var $e=Object.getOwnPropertyNames;var Fe=Object.getPrototypeOf,Qe=Object.prototype.hasOwnProperty;var Ee=(e,r,n,t)=>{if(r&&typeof r=="object"||typeof r=="function")for(let i of $e(r))!Qe.call(e,i)&&i!==n&&ne(e,i,{get:()=>r[i],enumerable:!(t=Se(r,i))||t.enumerable});return e};var re=(e,r,n)=>(n=e!=null?De(Fe(e)):{},Ee(r||!e||!e.__esModule?ne(n,"default",{value:e,enumerable:!0}):n,e));Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const T=require("@qwik.dev/core/internal");require("@qwik.dev/core");const _=require("@qwik.dev/router/middleware/request-handler"),te=new WeakMap,ie="qaction",Y="qloaders",ze="qfunc",oe="qdata",je="q:route";function Ge(e,r){const n=ce(e),t=ae(e),i=ce(r),o=ae(r);return pe(e,n,t,r,i,o)}function pe(e,r,n,t,i,o){if(t.startsWith("/build/"))return null;let a=null;for(;r<n;){const s=e.charCodeAt(r++),c=t.charCodeAt(i++);if(s===91){const f=Re(e,r),l=r+(f?3:0),u=K(e,l,n,93),h=e.substring(l,u),y=K(e,u+1,n,47),w=e.substring(u+1,y);r=u+1;const R=i-1;if(f){const x=Ke(h,w,t,R,o,e,r+w.length+1,n);if(x)return Object.assign(a||(a={}),x)}const p=K(t,R,o,47,w);if(p==-1)return null;const N=t.substring(R,p);if(!f&&!w&&!N)return null;i=p,(a||(a={}))[h]=decodeURIComponent(N)}else if(s!==c&&!(isNaN(c)&&Be(e,r)))return null}return se(e,r)&&se(t,i)?a||{}:null}function Be(e,r){return e.charCodeAt(r)===91&&Re(e,r+1)}function ae(e){const r=e.length;return r>1&&e.charCodeAt(r-1)===47?r-1:r}function se(e,r){const n=e.length;return r>=n||r==n-1&&e.charCodeAt(r)===47}function ce(e){return e.charCodeAt(0)===47?1:0}function Re(e,r){return e.charCodeAt(r)===46&&e.charCodeAt(r+1)===46&&e.charCodeAt(r+2)===46}function K(e,r,n,t,i=""){for(;r<n&&e.charCodeAt(r)!==t;)r++;const o=i.length;for(let a=0;a<o;a++)if(e.charCodeAt(r-o+a)!==i.charCodeAt(a))return-1;return r-o}function Ke(e,r,n,t,i,o,a,s){n.charCodeAt(t)===47&&t++;let c=i;const f=r+"/";for(;c>=t;){const l=pe(o,a,s,n,c,i);if(l){let h=n.substring(t,Math.min(c,i));return h.endsWith(f)&&(h=h.substring(0,h.length-f.length)),l[e]=decodeURIComponent(h),l}const u=ve(n,t,f,c,t-1)+f.length;if(c===u)break;c=u}return null}function ve(e,r,n,t,i){let o=e.lastIndexOf(n,t);return o==t-n.length&&(o=e.lastIndexOf(n,t-n.length-1)),o>r?o:i}var S=(e=>(e[e.RouteName=0]="RouteName",e[e.Loaders=1]="Loaders",e[e.OriginalPathname=2]="OriginalPathname",e[e.RouteBundleNames=3]="RouteBundleNames",e))(S||{}),$=(e=>(e[e.Pathname=0]="Pathname",e[e.MenuLoader=1]="MenuLoader",e))($||{}),U=(e=>(e[e.RouteName=0]="RouteName",e[e.Params=1]="Params",e[e.Mods=2]="Mods",e[e.Menu=3]="Menu",e[e.RouteBundleNames=4]="RouteBundleNames",e))(U||{});const be=e=>e==null?e:(Object.getOwnPropertyNames(e).forEach(r=>{const n=e[r];n&&typeof n=="object"&&!Object.isFrozen(n)&&be(n)}),Object.freeze(e)),Je=async(e,r,n,t)=>{if(!Array.isArray(e))return null;for(const i of e){const o=i[S.RouteName],a=Ge(o,t);if(!a)continue;const s=i[S.Loaders],c=i[S.RouteBundleNames],f=new Array(s.length),l=[];s.forEach((y,w)=>{le(y,l,R=>f[w]=R,n)});const u=Ye(r,t);let h;return le(u,l,y=>h=y?.default,n),l.length>0&&await Promise.all(l),[o,a,f,be(h),c]}return null},le=(e,r,n,t)=>{if(typeof e=="function"){const i=te.get(e);if(i)n(i);else{const o=e();typeof o.then=="function"?r.push(o.then(a=>{t!==!1&&te.set(e,a),n(a)})):o&&n(o)}}},Ye=(e,r)=>{if(e){r=r.endsWith("/")?r:r+"/";const n=e.find(t=>t[$.Pathname]===r||r.startsWith(t[$.Pathname]+(r.endsWith("/")?"":"/")));if(n)return n[$.MenuLoader]}};var V=(e=>(e[e.Continue=100]="Continue",e[e.SwitchingProtocols=101]="SwitchingProtocols",e[e.Processing=102]="Processing",e[e.Ok=200]="Ok",e[e.Created=201]="Created",e[e.Accepted=202]="Accepted",e[e.NonAuthoritativeInformation=203]="NonAuthoritativeInformation",e[e.NoContent=204]="NoContent",e[e.ResetContent=205]="ResetContent",e[e.PartialContent=206]="PartialContent",e[e.MultiStatus=207]="MultiStatus",e[e.AlreadyReported=208]="AlreadyReported",e[e.ImUsed=226]="ImUsed",e[e.MultipleChoices=300]="MultipleChoices",e[e.MovedPermanently=301]="MovedPermanently",e[e.Found=302]="Found",e[e.SeeOther=303]="SeeOther",e[e.NotModified=304]="NotModified",e[e.UseProxy=305]="UseProxy",e[e.SwitchProxy=306]="SwitchProxy",e[e.TemporaryRedirect=307]="TemporaryRedirect",e[e.PermanentRedirect=308]="PermanentRedirect",e[e.BadRequest=400]="BadRequest",e[e.Unauthorized=401]="Unauthorized",e[e.PaymentRequired=402]="PaymentRequired",e[e.Forbidden=403]="Forbidden",e[e.NotFound=404]="NotFound",e[e.MethodNotAllowed=405]="MethodNotAllowed",e[e.NotAcceptable=406]="NotAcceptable",e[e.ProxyAuthenticationRequired=407]="ProxyAuthenticationRequired",e[e.RequestTimeout=408]="RequestTimeout",e[e.Conflict=409]="Conflict",e[e.Gone=410]="Gone",e[e.LengthRequired=411]="LengthRequired",e[e.PreconditionFailed=412]="PreconditionFailed",e[e.PayloadTooLarge=413]="PayloadTooLarge",e[e.UriTooLong=414]="UriTooLong",e[e.UnsupportedMediaType=415]="UnsupportedMediaType",e[e.RangeNotSatisfiable=416]="RangeNotSatisfiable",e[e.ExpectationFailed=417]="ExpectationFailed",e[e.IAmATeapot=418]="IAmATeapot",e[e.MisdirectedRequest=421]="MisdirectedRequest",e[e.UnprocessableEntity=422]="UnprocessableEntity",e[e.Locked=423]="Locked",e[e.FailedDependency=424]="FailedDependency",e[e.UpgradeRequired=426]="UpgradeRequired",e[e.PreconditionRequired=428]="PreconditionRequired",e[e.TooManyRequests=429]="TooManyRequests",e[e.RequestHeaderFieldsTooLarge=431]="RequestHeaderFieldsTooLarge",e[e.UnavailableForLegalReasons=451]="UnavailableForLegalReasons",e[e.InternalServerError=500]="InternalServerError",e[e.NotImplemented=501]="NotImplemented",e[e.BadGateway=502]="BadGateway",e[e.ServiceUnavailable=503]="ServiceUnavailable",e[e.GatewayTimeout=504]="GatewayTimeout",e[e.HttpVersionNotSupported=505]="HttpVersionNotSupported",e[e.VariantAlsoNegotiates=506]="VariantAlsoNegotiates",e[e.InsufficientStorage=507]="InsufficientStorage",e[e.LoopDetected=508]="LoopDetected",e[e.NotExtended=510]="NotExtended",e[e.NetworkAuthenticationRequired=511]="NetworkAuthenticationRequired",e))(V||{});const Ve=e=>e&&typeof e.then=="function";function Xe(e){const r=[];return e==="day"?e=3600*24:e==="week"?e=3600*24*7:e==="month"?e=3600*24*30:e==="year"?e=3600*24*365:e==="private"?e={private:!0,noCache:!0}:e==="immutable"?e={public:!0,immutable:!0,maxAge:3600*24*365}:e==="no-cache"&&(e={noCache:!0}),typeof e=="number"&&(e={maxAge:e,sMaxAge:e}),e.immutable&&r.push("immutable"),e.maxAge&&r.push(`max-age=${e.maxAge}`),e.sMaxAge&&r.push(`s-maxage=${e.sMaxAge}`),e.noStore&&r.push("no-store"),e.noCache&&r.push("no-cache"),e.private&&r.push("private"),e.public&&r.push("public"),e.staleWhileRevalidate&&r.push(`stale-while-revalidate=${e.staleWhileRevalidate}`),e.staleIfError&&r.push(`stale-if-error=${e.staleIfError}`),r.join(", ")}const Ze={lax:"Lax",Lax:"Lax",None:"None",none:"None",strict:"Strict",Strict:"Strict"},He={seconds:1,minutes:60,hours:3600,days:3600*24,weeks:3600*24*7},de=(e,r,n)=>{const t=[`${e}=${r}`];typeof n.domain=="string"&&t.push(`Domain=${n.domain}`),typeof n.maxAge=="number"?t.push(`Max-Age=${n.maxAge}`):Array.isArray(n.maxAge)?t.push(`Max-Age=${n.maxAge[0]*He[n.maxAge[1]]}`):typeof n.expires=="number"||typeof n.expires=="string"?t.push(`Expires=${n.expires}`):n.expires instanceof Date&&t.push(`Expires=${n.expires.toUTCString()}`),n.httpOnly&&t.push("HttpOnly"),typeof n.path=="string"&&t.push(`Path=${n.path}`);const i=nn(n.sameSite);return i&&t.push(`SameSite=${i}`),n.secure&&t.push("Secure"),t.join("; ")};function fe(e){try{return decodeURIComponent(e)}catch{return e}}const en=e=>{const r={};if(typeof e=="string"&&e!==""){const n=e.split(";");for(const t of n){const i=t.indexOf("=");i!==-1&&(r[fe(t.slice(0,i).trim())]=fe(t.slice(i+1).trim()))}}return r};function nn(e){if(e===!0)return"Strict";if(e===!1)return"None";if(e)return Ze[e]}const P=Symbol("request-cookies"),D=Symbol("response-cookies"),M=Symbol("live-cookies");class rn{[P];[D]={};[M]={};appendCounter=0;constructor(r){this[P]=en(r),this[M]={...this[P]}}get(r,n=!0){const t=this[n?M:P][r];return t?{value:t,json(){return JSON.parse(t)},number(){return Number(t)}}:null}getAll(r=!0){return Object.keys(this[r?M:P]).reduce((n,t)=>(n[t]=this.get(t),n),{})}has(r,n=!0){return!!this[n?M:P][r]}set(r,n,t={}){this[M][r]=typeof n=="string"?n:JSON.stringify(n);const i=typeof n=="string"?n:encodeURIComponent(JSON.stringify(n));this[D][r]=de(r,i,t)}append(r,n,t={}){this[M][r]=typeof n=="string"?n:JSON.stringify(n);const i=typeof n=="string"?n:encodeURIComponent(JSON.stringify(n));this[D][++this.appendCounter]=de(r,i,t)}delete(r,n){this.set(r,"deleted",{...n,maxAge:0}),this[M][r]=null}headers(){return Object.values(this[D])}}const tn=(e,r)=>{const n=r.headers();if(n.length>0){const t=new Headers(e);for(const i of n)t.append("Set-Cookie",i);return t}return e};function F(e,r){let n="Server Error";return r!=null&&(typeof r.message=="string"?n=r.message:n=String(r)),"<html>"+_e(e,n)+"</html>"}function _e(e,r){typeof e!="number"&&(e=500),typeof r=="string"?r=an(r):r="";const n=typeof r=="string"?"600px":"300px",t=e>=500?cn:sn;return`
75
2
  <head>
76
3
  <meta charset="utf-8">
77
- <meta http-equiv="Status" content="${status}">
78
- <title>${status} ${message}</title>
4
+ <meta http-equiv="Status" content="${e}">
5
+ <title>${e} ${r}</title>
79
6
  <meta name="viewport" content="width=device-width,initial-scale=1">
80
7
  <style>
81
- body { color: ${color}; background-color: #fafafa; padding: 30px; font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, Roboto, sans-serif; }
82
- p { max-width: ${width}; margin: 60px auto 30px auto; background: white; border-radius: 4px; box-shadow: 0px 0px 50px -20px ${color}; overflow: hidden; }
83
- strong { display: inline-block; padding: 15px; background: ${color}; color: white; }
8
+ body { color: ${t}; background-color: #fafafa; padding: 30px; font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, Roboto, sans-serif; }
9
+ p { max-width: ${n}; margin: 60px auto 30px auto; background: white; border-radius: 4px; box-shadow: 0px 0px 50px -20px ${t}; overflow: hidden; }
10
+ strong { display: inline-block; padding: 15px; background: ${t}; color: white; }
84
11
  span { display: inline-block; padding: 15px; }
85
12
  </style>
86
13
  </head>
87
- <body><p><strong>${status}</strong> <span>${message}</span></p></body>
88
- `;
89
- }
90
- var ESCAPE_HTML = /[&<>]/g;
91
- var escapeHtml = (s) => {
92
- return s.replace(ESCAPE_HTML, (c) => {
93
- switch (c) {
94
- case "&":
95
- return "&amp;";
96
- case "<":
97
- return "&lt;";
98
- case ">":
99
- return "&gt;";
100
- default:
101
- return "";
102
- }
103
- });
104
- };
105
- var COLOR_400 = "#006ce9";
106
- var COLOR_500 = "#713fc2";
107
-
108
- // packages/qwik-router/src/middleware/request-handler/cookie.ts
109
- var SAMESITE = {
110
- lax: "Lax",
111
- Lax: "Lax",
112
- None: "None",
113
- none: "None",
114
- strict: "Strict",
115
- Strict: "Strict"
116
- };
117
- var UNIT = {
118
- seconds: 1,
119
- minutes: 1 * 60,
120
- hours: 1 * 60 * 60,
121
- days: 1 * 60 * 60 * 24,
122
- weeks: 1 * 60 * 60 * 24 * 7
123
- };
124
- var createSetCookieValue = (cookieName, cookieValue, options) => {
125
- const c = [`${cookieName}=${cookieValue}`];
126
- if (typeof options.domain === "string") {
127
- c.push(`Domain=${options.domain}`);
128
- }
129
- if (typeof options.maxAge === "number") {
130
- c.push(`Max-Age=${options.maxAge}`);
131
- } else if (Array.isArray(options.maxAge)) {
132
- c.push(`Max-Age=${options.maxAge[0] * UNIT[options.maxAge[1]]}`);
133
- } else if (typeof options.expires === "number" || typeof options.expires == "string") {
134
- c.push(`Expires=${options.expires}`);
135
- } else if (options.expires instanceof Date) {
136
- c.push(`Expires=${options.expires.toUTCString()}`);
137
- }
138
- if (options.httpOnly) {
139
- c.push("HttpOnly");
140
- }
141
- if (typeof options.path === "string") {
142
- c.push(`Path=${options.path}`);
143
- }
144
- const sameSite = resolveSameSite(options.sameSite);
145
- if (sameSite) {
146
- c.push(`SameSite=${sameSite}`);
147
- }
148
- if (options.secure) {
149
- c.push("Secure");
150
- }
151
- return c.join("; ");
152
- };
153
- function tryDecodeUriComponent(str) {
154
- try {
155
- return decodeURIComponent(str);
156
- } catch {
157
- return str;
158
- }
159
- }
160
- var parseCookieString = (cookieString) => {
161
- const cookie = {};
162
- if (typeof cookieString === "string" && cookieString !== "") {
163
- const cookieSegments = cookieString.split(";");
164
- for (const cookieSegment of cookieSegments) {
165
- const separatorIndex = cookieSegment.indexOf("=");
166
- if (separatorIndex !== -1) {
167
- cookie[tryDecodeUriComponent(cookieSegment.slice(0, separatorIndex).trim())] = tryDecodeUriComponent(cookieSegment.slice(separatorIndex + 1).trim());
168
- }
169
- }
170
- }
171
- return cookie;
172
- };
173
- function resolveSameSite(sameSite) {
174
- if (sameSite === true) {
175
- return "Strict";
176
- }
177
- if (sameSite === false) {
178
- return "None";
179
- }
180
- if (sameSite) {
181
- return SAMESITE[sameSite];
182
- }
183
- return void 0;
184
- }
185
- var REQ_COOKIE = Symbol("request-cookies");
186
- var RES_COOKIE = Symbol("response-cookies");
187
- var LIVE_COOKIE = Symbol("live-cookies");
188
- var Cookie = class {
189
- [REQ_COOKIE];
190
- [RES_COOKIE] = {};
191
- [LIVE_COOKIE] = {};
192
- appendCounter = 0;
193
- constructor(cookieString) {
194
- this[REQ_COOKIE] = parseCookieString(cookieString);
195
- this[LIVE_COOKIE] = { ...this[REQ_COOKIE] };
196
- }
197
- get(cookieName, live = true) {
198
- const value = this[live ? LIVE_COOKIE : REQ_COOKIE][cookieName];
199
- if (!value) {
200
- return null;
201
- }
202
- return {
203
- value,
204
- json() {
205
- return JSON.parse(value);
206
- },
207
- number() {
208
- return Number(value);
209
- }
210
- };
211
- }
212
- getAll(live = true) {
213
- return Object.keys(this[live ? LIVE_COOKIE : REQ_COOKIE]).reduce(
214
- (cookies, cookieName) => {
215
- cookies[cookieName] = this.get(cookieName);
216
- return cookies;
217
- },
218
- {}
219
- );
220
- }
221
- has(cookieName, live = true) {
222
- return !!this[live ? LIVE_COOKIE : REQ_COOKIE][cookieName];
223
- }
224
- set(cookieName, cookieValue, options = {}) {
225
- this[LIVE_COOKIE][cookieName] = typeof cookieValue === "string" ? cookieValue : JSON.stringify(cookieValue);
226
- const resolvedValue = typeof cookieValue === "string" ? cookieValue : encodeURIComponent(JSON.stringify(cookieValue));
227
- this[RES_COOKIE][cookieName] = createSetCookieValue(cookieName, resolvedValue, options);
228
- }
229
- append(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][++this.appendCounter] = createSetCookieValue(
233
- cookieName,
234
- resolvedValue,
235
- options
236
- );
237
- }
238
- delete(name, options) {
239
- this.set(name, "deleted", { ...options, maxAge: 0 });
240
- this[LIVE_COOKIE][name] = null;
241
- }
242
- headers() {
243
- return Object.values(this[RES_COOKIE]);
244
- }
245
- };
246
- var mergeHeadersCookies = (headers, cookies) => {
247
- const cookieHeaders = cookies.headers();
248
- if (cookieHeaders.length > 0) {
249
- const newHeaders = new Headers(headers);
250
- for (const cookie of cookieHeaders) {
251
- newHeaders.append("Set-Cookie", cookie);
252
- }
253
- return newHeaders;
254
- }
255
- return headers;
256
- };
257
-
258
- // packages/qwik-router/src/middleware/request-handler/redirect-handler.ts
259
- var AbortMessage = class {
260
- };
261
- var RedirectMessage = class extends AbortMessage {
262
- };
263
-
264
- // packages/qwik-router/src/middleware/request-handler/rewrite-handler.ts
265
- var RewriteMessage = class extends AbortMessage {
266
- constructor(pathname) {
267
- super();
268
- this.pathname = pathname;
269
- }
270
- };
271
-
272
- // packages/qwik-router/src/runtime/src/constants.ts
273
- var MODULE_CACHE = /* @__PURE__ */ new WeakMap();
274
- var QACTION_KEY = "qaction";
275
- var QFN_KEY = "qfunc";
276
- var QDATA_KEY = "qdata";
277
-
278
- // packages/qwik-router/src/runtime/src/route-matcher.ts
279
- function matchRoute(route, path) {
280
- const routeIdx = startIdxSkipSlash(route);
281
- const routeLength = lengthNoTrailingSlash(route);
282
- const pathIdx = startIdxSkipSlash(path);
283
- const pathLength = lengthNoTrailingSlash(path);
284
- return matchRoutePart(route, routeIdx, routeLength, path, pathIdx, pathLength);
285
- }
286
- function matchRoutePart(route, routeIdx, routeLength, path, pathIdx, pathLength) {
287
- let params = null;
288
- while (routeIdx < routeLength) {
289
- const routeCh = route.charCodeAt(routeIdx++);
290
- const pathCh = path.charCodeAt(pathIdx++);
291
- if (routeCh === 91 /* OPEN_BRACKET */) {
292
- const isMany = isThreeDots(route, routeIdx);
293
- const paramNameStart = routeIdx + (isMany ? 3 : 0);
294
- const paramNameEnd = scan(route, paramNameStart, routeLength, 93 /* CLOSE_BRACKET */);
295
- const paramName = route.substring(paramNameStart, paramNameEnd);
296
- const paramSuffixEnd = scan(route, paramNameEnd + 1, routeLength, 47 /* SLASH */);
297
- const suffix = route.substring(paramNameEnd + 1, paramSuffixEnd);
298
- routeIdx = paramNameEnd + 1;
299
- const paramValueStart = pathIdx - 1;
300
- if (isMany) {
301
- const match = recursiveScan(
302
- paramName,
303
- suffix,
304
- path,
305
- paramValueStart,
306
- pathLength,
307
- route,
308
- routeIdx + suffix.length + 1,
309
- routeLength
310
- );
311
- if (match) {
312
- return Object.assign(params || (params = {}), match);
313
- }
314
- }
315
- const paramValueEnd = scan(path, paramValueStart, pathLength, 47 /* SLASH */, suffix);
316
- if (paramValueEnd == -1) {
317
- return null;
318
- }
319
- const paramValue = path.substring(paramValueStart, paramValueEnd);
320
- if (!isMany && !suffix && !paramValue) {
321
- return null;
322
- }
323
- pathIdx = paramValueEnd;
324
- (params || (params = {}))[paramName] = decodeURIComponent(paramValue);
325
- } else if (routeCh !== pathCh) {
326
- if (!(isNaN(pathCh) && isRestParameter(route, routeIdx))) {
327
- return null;
328
- }
329
- }
330
- }
331
- if (allConsumed(route, routeIdx) && allConsumed(path, pathIdx)) {
332
- return params || {};
333
- } else {
334
- return null;
335
- }
336
- }
337
- function isRestParameter(text, idx) {
338
- return text.charCodeAt(idx) === 91 /* OPEN_BRACKET */ && isThreeDots(text, idx + 1);
339
- }
340
- function lengthNoTrailingSlash(text) {
341
- const length = text.length;
342
- return length > 1 && text.charCodeAt(length - 1) === 47 /* SLASH */ ? length - 1 : length;
343
- }
344
- function allConsumed(text, idx) {
345
- const length = text.length;
346
- return idx >= length || idx == length - 1 && text.charCodeAt(idx) === 47 /* SLASH */;
347
- }
348
- function startIdxSkipSlash(text) {
349
- return text.charCodeAt(0) === 47 /* SLASH */ ? 1 : 0;
350
- }
351
- function isThreeDots(text, idx) {
352
- return text.charCodeAt(idx) === 46 /* DOT */ && text.charCodeAt(idx + 1) === 46 /* DOT */ && text.charCodeAt(idx + 2) === 46 /* DOT */;
353
- }
354
- function scan(text, idx, end, ch, suffix = "") {
355
- while (idx < end && text.charCodeAt(idx) !== ch) {
356
- idx++;
357
- }
358
- const suffixLength = suffix.length;
359
- for (let i = 0; i < suffixLength; i++) {
360
- if (text.charCodeAt(idx - suffixLength + i) !== suffix.charCodeAt(i)) {
361
- return -1;
362
- }
363
- }
364
- return idx - suffixLength;
365
- }
366
- function recursiveScan(paramName, suffix, path, pathStart, pathLength, route, routeStart, routeLength) {
367
- if (path.charCodeAt(pathStart) === 47 /* SLASH */) {
368
- pathStart++;
369
- }
370
- let pathIdx = pathLength;
371
- const sep = suffix + "/";
372
- while (pathIdx >= pathStart) {
373
- const match = matchRoutePart(route, routeStart, routeLength, path, pathIdx, pathLength);
374
- if (match) {
375
- let value = path.substring(pathStart, Math.min(pathIdx, pathLength));
376
- if (value.endsWith(sep)) {
377
- value = value.substring(0, value.length - sep.length);
378
- }
379
- match[paramName] = decodeURIComponent(value);
380
- return match;
381
- }
382
- const newPathIdx = lastIndexOf(path, pathStart, sep, pathIdx, pathStart - 1) + sep.length;
383
- if (pathIdx === newPathIdx) {
384
- break;
385
- }
386
- pathIdx = newPathIdx;
387
- }
388
- return null;
389
- }
390
- function lastIndexOf(text, start, match, searchIdx, notFoundIdx) {
391
- let idx = text.lastIndexOf(match, searchIdx);
392
- if (idx == searchIdx - match.length) {
393
- idx = text.lastIndexOf(match, searchIdx - match.length - 1);
394
- }
395
- return idx > start ? idx : notFoundIdx;
396
- }
397
-
398
- // packages/qwik-router/src/runtime/src/utils.ts
399
- var isPromise = (value) => {
400
- return value && typeof value.then === "function";
401
- };
402
- var deepFreeze = (obj) => {
403
- if (obj == null) {
404
- return obj;
405
- }
406
- Object.getOwnPropertyNames(obj).forEach((prop) => {
407
- const value = obj[prop];
408
- if (value && typeof value === "object" && !Object.isFrozen(value)) {
409
- deepFreeze(value);
410
- }
411
- });
412
- return Object.freeze(obj);
413
- };
414
-
415
- // packages/qwik-router/src/runtime/src/routing.ts
416
- var loadRoute = async (routes, menus, cacheModules, pathname) => {
417
- if (!Array.isArray(routes)) {
418
- return null;
419
- }
420
- for (const routeData of routes) {
421
- const routeName = routeData[0];
422
- const params = matchRoute(routeName, pathname);
423
- if (!params) {
424
- continue;
425
- }
426
- const loaders = routeData[1];
427
- const routeBundleNames = routeData[3];
428
- const modules = new Array(loaders.length);
429
- const pendingLoads = [];
430
- loaders.forEach((moduleLoader, i) => {
431
- loadModule(
432
- moduleLoader,
433
- pendingLoads,
434
- (routeModule) => modules[i] = routeModule,
435
- cacheModules
436
- );
437
- });
438
- const menuLoader = getMenuLoader(menus, pathname);
439
- let menu = void 0;
440
- loadModule(
441
- menuLoader,
442
- pendingLoads,
443
- (menuModule) => menu = menuModule == null ? void 0 : menuModule.default,
444
- cacheModules
445
- );
446
- if (pendingLoads.length > 0) {
447
- await Promise.all(pendingLoads);
448
- }
449
- return [routeName, params, modules, deepFreeze(menu), routeBundleNames];
450
- }
451
- return null;
452
- };
453
- var loadModule = (moduleLoader, pendingLoads, moduleSetter, cacheModules) => {
454
- if (typeof moduleLoader === "function") {
455
- const loadedModule = MODULE_CACHE.get(moduleLoader);
456
- if (loadedModule) {
457
- moduleSetter(loadedModule);
458
- } else {
459
- const moduleOrPromise = moduleLoader();
460
- if (typeof moduleOrPromise.then === "function") {
461
- pendingLoads.push(
462
- moduleOrPromise.then((loadedModule2) => {
463
- if (cacheModules !== false) {
464
- MODULE_CACHE.set(moduleLoader, loadedModule2);
465
- }
466
- moduleSetter(loadedModule2);
467
- })
468
- );
469
- } else if (moduleOrPromise) {
470
- moduleSetter(moduleOrPromise);
471
- }
472
- }
473
- }
474
- };
475
- var getMenuLoader = (menus, pathname) => {
476
- if (menus) {
477
- pathname = pathname.endsWith("/") ? pathname : pathname + "/";
478
- const menu = menus.find(
479
- (m) => m[0] === pathname || pathname.startsWith(m[0] + (pathname.endsWith("/") ? "" : "/"))
480
- );
481
- if (menu) {
482
- return menu[1];
483
- }
484
- }
485
- };
486
-
487
- // packages/qwik-router/src/middleware/request-handler/cache-control.ts
488
- function createCacheControl(cacheControl) {
489
- const controls = [];
490
- if (cacheControl === "day") {
491
- cacheControl = 60 * 60 * 24;
492
- } else if (cacheControl === "week") {
493
- cacheControl = 60 * 60 * 24 * 7;
494
- } else if (cacheControl === "month") {
495
- cacheControl = 60 * 60 * 24 * 30;
496
- } else if (cacheControl === "year") {
497
- cacheControl = 60 * 60 * 24 * 365;
498
- } else if (cacheControl === "private") {
499
- cacheControl = {
500
- private: true,
501
- noCache: true
502
- };
503
- } else if (cacheControl === "immutable") {
504
- cacheControl = {
505
- public: true,
506
- immutable: true,
507
- maxAge: 60 * 60 * 24 * 365
508
- };
509
- } else if (cacheControl === "no-cache") {
510
- cacheControl = {
511
- noCache: true
512
- };
513
- }
514
- if (typeof cacheControl === "number") {
515
- cacheControl = {
516
- maxAge: cacheControl,
517
- sMaxAge: cacheControl
518
- };
519
- }
520
- if (cacheControl.immutable) {
521
- controls.push("immutable");
522
- }
523
- if (cacheControl.maxAge) {
524
- controls.push(`max-age=${cacheControl.maxAge}`);
525
- }
526
- if (cacheControl.sMaxAge) {
527
- controls.push(`s-maxage=${cacheControl.sMaxAge}`);
528
- }
529
- if (cacheControl.noStore) {
530
- controls.push("no-store");
531
- }
532
- if (cacheControl.noCache) {
533
- controls.push("no-cache");
534
- }
535
- if (cacheControl.private) {
536
- controls.push("private");
537
- }
538
- if (cacheControl.public) {
539
- controls.push("public");
540
- }
541
- if (cacheControl.staleWhileRevalidate) {
542
- controls.push(`stale-while-revalidate=${cacheControl.staleWhileRevalidate}`);
543
- }
544
- if (cacheControl.staleIfError) {
545
- controls.push(`stale-if-error=${cacheControl.staleIfError}`);
546
- }
547
- return controls.join(", ");
548
- }
549
-
550
- // packages/qwik-router/src/middleware/request-handler/user-response.ts
551
- var asyncStore;
552
- import("node:async_hooks").then((module2) => {
553
- const AsyncLocalStorage = module2.AsyncLocalStorage;
554
- asyncStore = new AsyncLocalStorage();
555
- globalThis.qcAsyncRequestStore = asyncStore;
556
- }).catch((err) => {
557
- console.warn(
558
- "AsyncLocalStorage not available, continuing without it. This might impact concurrent server calls.",
559
- err
560
- );
561
- });
562
- function runQwikRouter(serverRequestEv, loadedRoute, requestHandlers, rebuildRouteInfo, trailingSlash = true, basePathname = "/", qwikSerializer) {
563
- let resolve;
564
- const responsePromise = new Promise((r) => resolve = r);
565
- const requestEv = createRequestEvent(
566
- serverRequestEv,
567
- loadedRoute,
568
- requestHandlers,
569
- trailingSlash,
570
- basePathname,
571
- qwikSerializer,
572
- resolve
573
- );
574
- return {
575
- response: responsePromise,
576
- requestEv,
577
- completion: asyncStore ? asyncStore.run(requestEv, runNext, requestEv, rebuildRouteInfo, resolve) : runNext(requestEv, rebuildRouteInfo, resolve)
578
- };
579
- }
580
- async function runNext(requestEv, rebuildRouteInfo, resolve) {
581
- let rewriteAttempt = 1;
582
- async function _runNext() {
583
- try {
584
- await requestEv.next();
585
- } catch (e) {
586
- if (e instanceof RedirectMessage) {
587
- const stream = requestEv.getWritableStream();
588
- await stream.close();
589
- } else if (e instanceof RewriteMessage) {
590
- if (rewriteAttempt > 50) {
591
- throw new Error(`Infinite rewrite loop`);
592
- }
593
- rewriteAttempt += 1;
594
- const url = new URL(requestEv.url);
595
- url.pathname = e.pathname;
596
- const { loadedRoute, requestHandlers } = await rebuildRouteInfo(url);
597
- requestEv.resetRoute(loadedRoute, requestHandlers, url);
598
- return await _runNext();
599
- } else if (e instanceof ServerError) {
600
- if (!requestEv.headersSent) {
601
- const status = e.status;
602
- const accept = requestEv.request.headers.get("Accept");
603
- if (accept && !accept.includes("text/html")) {
604
- const qwikSerializer = requestEv[RequestEvQwikSerializer];
605
- requestEv.headers.set("Content-Type", "application/qwik-json");
606
- requestEv.send(status, await qwikSerializer._serialize([e.data]));
607
- } else {
608
- const html = getErrorHtml(e.status, e.data);
609
- requestEv.html(status, html);
610
- }
611
- }
612
- } else if (!(e instanceof AbortMessage)) {
613
- if (getRequestMode(requestEv) !== "dev") {
614
- try {
615
- if (!requestEv.headersSent) {
616
- requestEv.headers.set("content-type", "text/html; charset=utf-8");
617
- requestEv.cacheControl({ noCache: true });
618
- requestEv.status(500);
619
- }
620
- const stream = requestEv.getWritableStream();
621
- if (!stream.locked) {
622
- const writer = stream.getWriter();
623
- await writer.write(encoder.encode(minimalHtmlResponse(500, "Internal Server Error")));
624
- await writer.close();
625
- }
626
- } catch {
627
- console.error("Unable to render error page");
628
- }
629
- }
630
- return e;
631
- }
632
- }
633
- return void 0;
634
- }
635
- try {
636
- return await _runNext();
637
- } finally {
638
- if (!requestEv.isDirty()) {
639
- resolve(null);
640
- }
641
- }
642
- }
643
- function getRouteMatchPathname(pathname, trailingSlash) {
644
- if (pathname.endsWith(QDATA_JSON)) {
645
- const trimEnd = pathname.length - QDATA_JSON_LEN + (trailingSlash ? 1 : 0);
646
- pathname = pathname.slice(0, trimEnd);
647
- if (pathname === "") {
648
- pathname = "/";
649
- }
650
- }
651
- return pathname;
652
- }
653
- var IsQData = "@isQData";
654
- var QDATA_JSON = "/q-data.json";
655
- var QDATA_JSON_LEN = QDATA_JSON.length;
656
-
657
- // packages/qwik-router/src/middleware/request-handler/request-event.ts
658
- var RequestEvLoaders = Symbol("RequestEvLoaders");
659
- var RequestEvMode = Symbol("RequestEvMode");
660
- var RequestEvRoute = Symbol("RequestEvRoute");
661
- var RequestEvQwikSerializer = Symbol("RequestEvQwikSerializer");
662
- var RequestEvTrailingSlash = Symbol("RequestEvTrailingSlash");
663
- var RequestRouteName = "@routeName";
664
- var RequestEvSharedActionId = "@actionId";
665
- var RequestEvSharedActionFormData = "@actionFormData";
666
- var RequestEvSharedNonce = "@nonce";
667
- var RequestEvIsRewrite = "@rewrite";
668
- function createRequestEvent(serverRequestEv, loadedRoute, requestHandlers, trailingSlash, basePathname, qwikSerializer, resolved) {
669
- const { request, platform, env } = serverRequestEv;
670
- const sharedMap = /* @__PURE__ */ new Map();
671
- const cookie = new Cookie(request.headers.get("cookie"));
672
- const headers = new Headers();
673
- const url = new URL(request.url);
674
- if (url.pathname.endsWith(QDATA_JSON)) {
675
- url.pathname = url.pathname.slice(0, -QDATA_JSON_LEN);
676
- if (trailingSlash && !url.pathname.endsWith("/")) {
677
- url.pathname += "/";
678
- }
679
- sharedMap.set(IsQData, true);
680
- }
681
- let routeModuleIndex = -1;
682
- let writableStream = null;
683
- let requestData = void 0;
684
- let locale = serverRequestEv.locale;
685
- let status = 200;
686
- const next = async () => {
687
- routeModuleIndex++;
688
- while (routeModuleIndex < requestHandlers.length) {
689
- const moduleRequestHandler = requestHandlers[routeModuleIndex];
690
- const asyncStore2 = globalThis.qcAsyncRequestStore;
691
- const result = (asyncStore2 == null ? void 0 : asyncStore2.run) ? asyncStore2.run(requestEv, moduleRequestHandler, requestEv) : moduleRequestHandler(requestEv);
692
- if (isPromise(result)) {
693
- await result;
694
- }
695
- routeModuleIndex++;
696
- }
697
- };
698
- const resetRoute = (_loadedRoute, _requestHandlers, _url = url) => {
699
- loadedRoute = _loadedRoute;
700
- requestHandlers = _requestHandlers;
701
- url.pathname = _url.pathname;
702
- url.search = _url.search;
703
- routeModuleIndex = -1;
704
- };
705
- const check = () => {
706
- if (writableStream !== null) {
707
- throw new Error("Response already sent");
708
- }
709
- };
710
- const send = (statusOrResponse, body) => {
711
- check();
712
- if (typeof statusOrResponse === "number") {
713
- status = statusOrResponse;
714
- const writableStream2 = requestEv.getWritableStream();
715
- const writer = writableStream2.getWriter();
716
- writer.write(typeof body === "string" ? encoder.encode(body) : body);
717
- writer.close();
718
- } else {
719
- status = statusOrResponse.status;
720
- statusOrResponse.headers.forEach((value, key) => {
721
- if (key.toLowerCase() === "set-cookie") {
722
- return;
723
- }
724
- headers.append(key, value);
725
- });
726
- statusOrResponse.headers.getSetCookie().forEach((ck) => {
727
- const index = ck.indexOf("=");
728
- if (index === -1) {
729
- return;
730
- }
731
- const key = ck.slice(0, index).trim();
732
- const value = ck.slice(index + 1).trim();
733
- cookie.set(key, value);
734
- });
735
- if (statusOrResponse.body) {
736
- const writableStream2 = requestEv.getWritableStream();
737
- statusOrResponse.body.pipeTo(writableStream2);
738
- } else {
739
- requestEv.getWritableStream().getWriter().close();
740
- }
741
- }
742
- return exit();
743
- };
744
- const exit = () => {
745
- routeModuleIndex = ABORT_INDEX;
746
- return new AbortMessage();
747
- };
748
- const loaders = {};
749
- const requestEv = {
750
- [RequestEvLoaders]: loaders,
751
- [RequestEvMode]: serverRequestEv.mode,
752
- [RequestEvTrailingSlash]: trailingSlash,
753
- get [RequestEvRoute]() {
754
- return loadedRoute;
755
- },
756
- [RequestEvQwikSerializer]: qwikSerializer,
757
- cookie,
758
- headers,
759
- env,
760
- method: request.method,
761
- signal: request.signal,
762
- originalUrl: new URL(url),
763
- get params() {
764
- return (loadedRoute == null ? void 0 : loadedRoute[1]) ?? {};
765
- },
766
- get pathname() {
767
- return url.pathname;
768
- },
769
- platform,
770
- get query() {
771
- return url.searchParams;
772
- },
773
- request,
774
- url,
775
- basePathname,
776
- sharedMap,
777
- get headersSent() {
778
- return writableStream !== null;
779
- },
780
- get exited() {
781
- return routeModuleIndex >= ABORT_INDEX;
782
- },
783
- get clientConn() {
784
- return serverRequestEv.getClientConn();
785
- },
786
- next,
787
- resetRoute,
788
- exit,
789
- cacheControl: (cacheControl, target = "Cache-Control") => {
790
- check();
791
- headers.set(target, createCacheControl(cacheControl));
792
- },
793
- resolveValue: async (loaderOrAction) => {
794
- const id = loaderOrAction.__id;
795
- if (loaderOrAction.__brand === "server_loader") {
796
- if (!(id in loaders)) {
797
- throw new Error(
798
- "You can not get the returned data of a loader that has not been executed for this request."
799
- );
800
- }
801
- }
802
- return loaders[id];
803
- },
804
- status: (statusCode) => {
805
- if (typeof statusCode === "number") {
806
- check();
807
- status = statusCode;
808
- return statusCode;
809
- }
810
- return status;
811
- },
812
- locale: (_locale) => {
813
- if (typeof _locale === "string") {
814
- locale = _locale;
815
- }
816
- return locale || "";
817
- },
818
- error: (statusCode, message) => {
819
- status = statusCode;
820
- return new ServerError(statusCode, message);
821
- },
822
- redirect: (statusCode, url2) => {
823
- check();
824
- status = statusCode;
825
- if (url2) {
826
- const fixedURL = url2.replace(/([^:])\/{2,}/g, "$1/");
827
- if (url2 !== fixedURL) {
828
- console.warn(`Redirect URL ${url2} is invalid, fixing to ${fixedURL}`);
829
- }
830
- headers.set("Location", fixedURL);
831
- }
832
- if (statusCode > 301 && !headers.get("Cache-Control")) {
833
- headers.set("Cache-Control", "no-store");
834
- }
835
- exit();
836
- return new RedirectMessage();
837
- },
838
- rewrite: (pathname) => {
839
- check();
840
- if (pathname.startsWith("http")) {
841
- throw new Error("Rewrite does not support absolute urls");
842
- }
843
- sharedMap.set(RequestEvIsRewrite, true);
844
- return new RewriteMessage(pathname.replace(/\/+/g, "/"));
845
- },
846
- defer: (returnData) => {
847
- return typeof returnData === "function" ? returnData : () => returnData;
848
- },
849
- fail: (statusCode, data) => {
850
- check();
851
- status = statusCode;
852
- return {
853
- failed: true,
854
- ...data
855
- };
856
- },
857
- text: (statusCode, text) => {
858
- headers.set("Content-Type", "text/plain; charset=utf-8");
859
- return send(statusCode, text);
860
- },
861
- html: (statusCode, html) => {
862
- headers.set("Content-Type", "text/html; charset=utf-8");
863
- return send(statusCode, html);
864
- },
865
- parseBody: async () => {
866
- if (requestData !== void 0) {
867
- return requestData;
868
- }
869
- return requestData = parseRequest(requestEv, sharedMap, qwikSerializer);
870
- },
871
- json: (statusCode, data) => {
872
- headers.set("Content-Type", "application/json; charset=utf-8");
873
- return send(statusCode, JSON.stringify(data));
874
- },
875
- send,
876
- isDirty: () => {
877
- return writableStream !== null;
878
- },
879
- getWritableStream: () => {
880
- if (writableStream === null) {
881
- if (serverRequestEv.mode === "dev") {
882
- const serverTiming = sharedMap.get("@serverTiming");
883
- if (serverTiming) {
884
- headers.set("Server-Timing", serverTiming.map((a) => `${a[0]};dur=${a[1]}`).join(","));
885
- }
886
- }
887
- writableStream = serverRequestEv.getWritableStream(
888
- status,
889
- headers,
890
- cookie,
891
- resolved,
892
- requestEv
893
- );
894
- }
895
- return writableStream;
896
- }
897
- };
898
- return Object.freeze(requestEv);
899
- }
900
- function getRequestLoaders(requestEv) {
901
- return requestEv[RequestEvLoaders];
902
- }
903
- function getRequestTrailingSlash(requestEv) {
904
- return requestEv[RequestEvTrailingSlash];
905
- }
906
- function getRequestRoute(requestEv) {
907
- return requestEv[RequestEvRoute];
908
- }
909
- function getRequestMode(requestEv) {
910
- return requestEv[RequestEvMode];
911
- }
912
- var ABORT_INDEX = Number.MAX_SAFE_INTEGER;
913
- var parseRequest = async ({ request, method, query }, sharedMap, qwikSerializer) => {
914
- var _a;
915
- const type = ((_a = request.headers.get("content-type")) == null ? void 0 : _a.split(/[;,]/, 1)[0].trim()) ?? "";
916
- if (type === "application/x-www-form-urlencoded" || type === "multipart/form-data") {
917
- const formData = await request.formData();
918
- sharedMap.set(RequestEvSharedActionFormData, formData);
919
- return formToObj(formData);
920
- } else if (type === "application/json") {
921
- const data = await request.json();
922
- return data;
923
- } else if (type === "application/qwik-json") {
924
- if (method === "GET" && query.has(QDATA_KEY)) {
925
- const data = query.get(QDATA_KEY);
926
- if (data) {
927
- try {
928
- return qwikSerializer._deserialize(decodeURIComponent(data));
929
- } catch {
930
- }
931
- }
932
- }
933
- return qwikSerializer._deserialize(await request.text());
934
- }
935
- return void 0;
936
- };
937
- var formToObj = (formData) => {
938
- const values = [...formData.entries()].reduce((values2, [name, value]) => {
939
- name.split(".").reduce((object, key, index, keys) => {
940
- if (key.endsWith("[]")) {
941
- const arrayKey = key.slice(0, -2);
942
- object[arrayKey] = object[arrayKey] || [];
943
- return object[arrayKey] = [...object[arrayKey], value];
944
- }
945
- if (index < keys.length - 1) {
946
- return object[key] = object[key] || (Number.isNaN(+keys[index + 1]) ? {} : []);
947
- }
948
- return object[key] = value;
949
- }, values2);
950
- return values2;
951
- }, {});
952
- return values;
953
- };
954
-
955
- // packages/qwik-router/src/middleware/request-handler/response-page.ts
956
- function getQwikRouterServerData(requestEv) {
957
- const { params, request, status, locale, originalUrl } = requestEv;
958
- const requestHeaders = {};
959
- request.headers.forEach((value, key) => requestHeaders[key] = value);
960
- const action = requestEv.sharedMap.get(RequestEvSharedActionId);
961
- const formData = requestEv.sharedMap.get(RequestEvSharedActionFormData);
962
- const routeName = requestEv.sharedMap.get(RequestRouteName);
963
- const nonce = requestEv.sharedMap.get(RequestEvSharedNonce);
964
- const headers = requestEv.request.headers;
965
- const reconstructedUrl = new URL(originalUrl.pathname + originalUrl.search, originalUrl);
966
- const host = headers.get("X-Forwarded-Host");
967
- const protocol = headers.get("X-Forwarded-Proto");
968
- if (host) {
969
- reconstructedUrl.port = "";
970
- reconstructedUrl.host = host;
971
- }
972
- if (protocol) {
973
- reconstructedUrl.protocol = protocol;
974
- }
975
- return {
976
- url: reconstructedUrl.href,
977
- requestHeaders,
978
- locale: locale(),
979
- nonce,
980
- containerAttributes: {
981
- "q:route": routeName
982
- },
983
- qwikrouter: {
984
- routeName,
985
- ev: requestEv,
986
- params: { ...params },
987
- loadedRoute: getRequestRoute(requestEv),
988
- response: {
989
- status: status(),
990
- loaders: getRequestLoaders(requestEv),
991
- action,
992
- formData
993
- }
994
- }
995
- };
996
- }
997
-
998
- // packages/qwik-router/src/middleware/request-handler/resolve-request-handlers.ts
999
- var resolveRequestHandlers = (serverPlugins, route, method, checkOrigin, renderHandler) => {
1000
- const routeLoaders = [];
1001
- const routeActions = [];
1002
- const requestHandlers = [];
1003
- const isPageRoute = !!(route && isLastModulePageRoute(route[2]));
1004
- if (serverPlugins) {
1005
- _resolveRequestHandlers(
1006
- routeLoaders,
1007
- routeActions,
1008
- requestHandlers,
1009
- serverPlugins,
1010
- isPageRoute,
1011
- method
1012
- );
1013
- }
1014
- if (route) {
1015
- const routeName = route[0];
1016
- if (checkOrigin && (method === "POST" || method === "PUT" || method === "PATCH" || method === "DELETE")) {
1017
- requestHandlers.unshift(csrfCheckMiddleware);
1018
- }
1019
- if (isPageRoute) {
1020
- if (method === "POST" || method === "GET") {
1021
- requestHandlers.push(pureServerFunction);
1022
- }
1023
- requestHandlers.push(fixTrailingSlash);
1024
- requestHandlers.push(renderQData);
1025
- }
1026
- const routeModules = route[2];
1027
- requestHandlers.push(handleRedirect);
1028
- _resolveRequestHandlers(
1029
- routeLoaders,
1030
- routeActions,
1031
- requestHandlers,
1032
- routeModules,
1033
- isPageRoute,
1034
- method
1035
- );
1036
- if (isPageRoute) {
1037
- requestHandlers.push((ev) => {
1038
- ev.sharedMap.set(RequestRouteName, routeName);
1039
- });
1040
- requestHandlers.push(actionsMiddleware(routeActions, routeLoaders));
1041
- requestHandlers.push(renderHandler);
1042
- }
1043
- }
1044
- return requestHandlers;
1045
- };
1046
- var _resolveRequestHandlers = (routeLoaders, routeActions, requestHandlers, routeModules, collectActions, method) => {
1047
- for (const routeModule of routeModules) {
1048
- if (typeof routeModule.onRequest === "function") {
1049
- requestHandlers.push(routeModule.onRequest);
1050
- } else if (Array.isArray(routeModule.onRequest)) {
1051
- requestHandlers.push(...routeModule.onRequest);
1052
- }
1053
- let methodReqHandler;
1054
- switch (method) {
1055
- case "GET": {
1056
- methodReqHandler = routeModule.onGet;
1057
- break;
1058
- }
1059
- case "POST": {
1060
- methodReqHandler = routeModule.onPost;
1061
- break;
1062
- }
1063
- case "PUT": {
1064
- methodReqHandler = routeModule.onPut;
1065
- break;
1066
- }
1067
- case "PATCH": {
1068
- methodReqHandler = routeModule.onPatch;
1069
- break;
1070
- }
1071
- case "DELETE": {
1072
- methodReqHandler = routeModule.onDelete;
1073
- break;
1074
- }
1075
- case "OPTIONS": {
1076
- methodReqHandler = routeModule.onOptions;
1077
- break;
1078
- }
1079
- case "HEAD": {
1080
- methodReqHandler = routeModule.onHead;
1081
- break;
1082
- }
1083
- }
1084
- if (typeof methodReqHandler === "function") {
1085
- requestHandlers.push(methodReqHandler);
1086
- } else if (Array.isArray(methodReqHandler)) {
1087
- requestHandlers.push(...methodReqHandler);
1088
- }
1089
- if (collectActions) {
1090
- for (const module2 of Object.values(routeModule)) {
1091
- if (typeof module2 === "function") {
1092
- if (module2.__brand === "server_loader") {
1093
- routeLoaders.push(module2);
1094
- } else if (module2.__brand === "server_action") {
1095
- routeActions.push(module2);
1096
- }
1097
- }
1098
- }
1099
- }
1100
- }
1101
- };
1102
- function actionsMiddleware(routeActions, routeLoaders) {
1103
- return async (requestEv) => {
1104
- if (requestEv.headersSent) {
1105
- requestEv.exit();
1106
- return;
1107
- }
1108
- const { method } = requestEv;
1109
- const loaders = getRequestLoaders(requestEv);
1110
- const isDev = getRequestMode(requestEv) === "dev";
1111
- const qwikSerializer = requestEv[RequestEvQwikSerializer];
1112
- if (isDev && method === "GET") {
1113
- if (requestEv.query.has(QACTION_KEY)) {
1114
- console.warn(
1115
- '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">'
1116
- );
1117
- }
1118
- }
1119
- if (method === "POST") {
1120
- const selectedActionId = requestEv.query.get(QACTION_KEY);
1121
- if (selectedActionId) {
1122
- const serverActionsMap = globalThis._qwikActionsMap;
1123
- const action = routeActions.find((action2) => action2.__id === selectedActionId) ?? (serverActionsMap == null ? void 0 : serverActionsMap.get(selectedActionId));
1124
- if (action) {
1125
- requestEv.sharedMap.set(RequestEvSharedActionId, selectedActionId);
1126
- const data = await requestEv.parseBody();
1127
- if (!data || typeof data !== "object") {
1128
- throw new Error(
1129
- `Expected request data for the action id ${selectedActionId} to be an object`
1130
- );
1131
- }
1132
- const result = await runValidators(requestEv, action.__validators, data, isDev);
1133
- if (!result.success) {
1134
- loaders[selectedActionId] = requestEv.fail(result.status ?? 500, result.error);
1135
- } else {
1136
- const actionResolved = isDev ? await measure(
1137
- requestEv,
1138
- action.__qrl.getSymbol().split("_", 1)[0],
1139
- () => action.__qrl.call(requestEv, result.data, requestEv)
1140
- ) : await action.__qrl.call(requestEv, result.data, requestEv);
1141
- if (isDev) {
1142
- verifySerializable(qwikSerializer, actionResolved, action.__qrl);
1143
- }
1144
- loaders[selectedActionId] = actionResolved;
1145
- }
1146
- }
1147
- }
1148
- }
1149
- if (routeLoaders.length > 0) {
1150
- const resolvedLoadersPromises = routeLoaders.map((loader) => {
1151
- const loaderId = loader.__id;
1152
- loaders[loaderId] = runValidators(
1153
- requestEv,
1154
- loader.__validators,
1155
- void 0,
1156
- // data
1157
- isDev
1158
- ).then((res) => {
1159
- if (res.success) {
1160
- if (isDev) {
1161
- return measure(
1162
- requestEv,
1163
- loader.__qrl.getSymbol().split("_", 1)[0],
1164
- () => loader.__qrl.call(requestEv, requestEv)
1165
- );
1166
- } else {
1167
- return loader.__qrl.call(requestEv, requestEv);
1168
- }
1169
- } else {
1170
- return requestEv.fail(res.status ?? 500, res.error);
1171
- }
1172
- }).then((resolvedLoader) => {
1173
- if (typeof resolvedLoader === "function") {
1174
- loaders[loaderId] = resolvedLoader();
1175
- } else {
1176
- if (isDev) {
1177
- verifySerializable(qwikSerializer, resolvedLoader, loader.__qrl);
1178
- }
1179
- loaders[loaderId] = resolvedLoader;
1180
- }
1181
- return resolvedLoader;
1182
- });
1183
- return loaders[loaderId];
1184
- });
1185
- await Promise.all(resolvedLoadersPromises);
1186
- }
1187
- };
1188
- }
1189
- async function runValidators(requestEv, validators, data, isDev) {
1190
- let lastResult = {
1191
- success: true,
1192
- data
1193
- };
1194
- if (validators) {
1195
- for (const validator of validators) {
1196
- if (isDev) {
1197
- lastResult = await measure(
1198
- requestEv,
1199
- `validator$`,
1200
- () => validator.validate(requestEv, data)
1201
- );
1202
- } else {
1203
- lastResult = await validator.validate(requestEv, data);
1204
- }
1205
- if (!lastResult.success) {
1206
- return lastResult;
1207
- } else {
1208
- data = lastResult.data;
1209
- }
1210
- }
1211
- }
1212
- return lastResult;
1213
- }
1214
- function isAsyncIterator(obj) {
1215
- return obj ? typeof obj === "object" && Symbol.asyncIterator in obj : false;
1216
- }
1217
- async function pureServerFunction(ev) {
1218
- const fn = ev.query.get(QFN_KEY);
1219
- if (fn && ev.request.headers.get("X-QRL") === fn && ev.request.headers.get("Content-Type") === "application/qwik-json") {
1220
- ev.exit();
1221
- const isDev = getRequestMode(ev) === "dev";
1222
- const qwikSerializer = ev[RequestEvQwikSerializer];
1223
- const data = await ev.parseBody();
1224
- if (Array.isArray(data)) {
1225
- const [qrl, ...args] = data;
1226
- if (isQrl(qrl) && qrl.getHash() === fn) {
1227
- let result;
1228
- try {
1229
- if (isDev) {
1230
- result = await measure(
1231
- ev,
1232
- `server_${qrl.getSymbol()}`,
1233
- () => qrl.apply(ev, args)
1234
- );
1235
- } else {
1236
- result = await qrl.apply(ev, args);
1237
- }
1238
- } catch (err) {
1239
- if (err instanceof ServerError) {
1240
- throw ev.error(err.status, err.data);
1241
- }
1242
- throw ev.error(500, "Invalid request");
1243
- }
1244
- if (isAsyncIterator(result)) {
1245
- ev.headers.set("Content-Type", "text/qwik-json-stream");
1246
- const writable = ev.getWritableStream();
1247
- const stream = writable.getWriter();
1248
- for await (const item of result) {
1249
- if (isDev) {
1250
- verifySerializable(qwikSerializer, item, qrl);
1251
- }
1252
- const message = await qwikSerializer._serialize([item]);
1253
- if (ev.signal.aborted) {
1254
- break;
1255
- }
1256
- await stream.write(encoder.encode(`${message}
1257
- `));
1258
- }
1259
- stream.close();
1260
- } else {
1261
- verifySerializable(qwikSerializer, result, qrl);
1262
- ev.headers.set("Content-Type", "application/qwik-json");
1263
- const message = await qwikSerializer._serialize([result]);
1264
- ev.send(200, message);
1265
- }
1266
- return;
1267
- }
1268
- }
1269
- throw ev.error(500, "Invalid request");
1270
- }
1271
- }
1272
- function fixTrailingSlash(ev) {
1273
- const trailingSlash = getRequestTrailingSlash(ev);
1274
- const { basePathname, originalUrl, sharedMap } = ev;
1275
- const { pathname, search } = originalUrl;
1276
- const isQData = sharedMap.has(IsQData);
1277
- if (!isQData && pathname !== basePathname && !pathname.endsWith(".html")) {
1278
- if (trailingSlash) {
1279
- if (!pathname.endsWith("/")) {
1280
- throw ev.redirect(301 /* MovedPermanently */, pathname + "/" + search);
1281
- }
1282
- } else {
1283
- if (pathname.endsWith("/")) {
1284
- throw ev.redirect(
1285
- 301 /* MovedPermanently */,
1286
- pathname.slice(0, pathname.length - 1) + search
1287
- );
1288
- }
1289
- }
1290
- }
1291
- }
1292
- function verifySerializable(qwikSerializer, data, qrl) {
1293
- try {
1294
- qwikSerializer._verifySerializable(data, void 0);
1295
- } catch (e) {
1296
- if (e instanceof Error && qrl.dev) {
1297
- e.loc = qrl.dev;
1298
- }
1299
- throw e;
1300
- }
1301
- }
1302
- var isQrl = (value) => {
1303
- return typeof value === "function" && typeof value.getSymbol === "function";
1304
- };
1305
- function isLastModulePageRoute(routeModules) {
1306
- const lastRouteModule = routeModules[routeModules.length - 1];
1307
- return lastRouteModule && typeof lastRouteModule.default === "function";
1308
- }
1309
- function getPathname(url, trailingSlash) {
1310
- url = new URL(url);
1311
- if (url.pathname.endsWith(QDATA_JSON)) {
1312
- url.pathname = url.pathname.slice(0, -QDATA_JSON.length);
1313
- }
1314
- if (trailingSlash) {
1315
- if (!url.pathname.endsWith("/")) {
1316
- url.pathname += "/";
1317
- }
1318
- } else {
1319
- if (url.pathname.endsWith("/")) {
1320
- url.pathname = url.pathname.slice(0, -1);
1321
- }
1322
- }
1323
- const search = url.search.slice(1).replaceAll(/&?q(action|data|func)=[^&]+/g, "");
1324
- return `${url.pathname}${search ? `?${search}` : ""}${url.hash}`;
1325
- }
1326
- var encoder = /* @__PURE__ */ new TextEncoder();
1327
- function csrfCheckMiddleware(requestEv) {
1328
- const isForm = isContentType(
1329
- requestEv.request.headers,
1330
- "application/x-www-form-urlencoded",
1331
- "multipart/form-data",
1332
- "text/plain"
1333
- );
1334
- if (isForm) {
1335
- const inputOrigin = requestEv.request.headers.get("origin");
1336
- const origin = requestEv.url.origin;
1337
- const forbidden = inputOrigin !== origin;
1338
- if (forbidden) {
1339
- throw requestEv.error(
1340
- 403,
1341
- `CSRF check failed. Cross-site ${requestEv.method} form submissions are forbidden.
1342
- The request origin "${inputOrigin}" does not match the server origin "${origin}".`
1343
- );
1344
- }
1345
- }
1346
- }
1347
- function renderQwikMiddleware(render) {
1348
- return async (requestEv) => {
1349
- if (requestEv.headersSent) {
1350
- return;
1351
- }
1352
- const isPageDataReq = requestEv.sharedMap.has(IsQData);
1353
- if (isPageDataReq) {
1354
- return;
1355
- }
1356
- const requestHeaders = {};
1357
- requestEv.request.headers.forEach((value, key) => requestHeaders[key] = value);
1358
- const responseHeaders = requestEv.headers;
1359
- if (!responseHeaders.has("Content-Type")) {
1360
- responseHeaders.set("Content-Type", "text/html; charset=utf-8");
1361
- }
1362
- const trailingSlash = getRequestTrailingSlash(requestEv);
1363
- const { readable, writable } = new TextEncoderStream();
1364
- const writableStream = requestEv.getWritableStream();
1365
- const pipe = readable.pipeTo(writableStream, { preventClose: true });
1366
- const stream = writable.getWriter();
1367
- const status = requestEv.status();
1368
- try {
1369
- const isStatic = getRequestMode(requestEv) === "static";
1370
- const serverData = getQwikRouterServerData(requestEv);
1371
- const result = await render({
1372
- base: requestEv.basePathname + "build/",
1373
- stream,
1374
- serverData,
1375
- containerAttributes: {
1376
- ["q:render"]: isStatic ? "static" : "",
1377
- ...serverData.containerAttributes
1378
- }
1379
- });
1380
- const qData = {
1381
- loaders: getRequestLoaders(requestEv),
1382
- action: requestEv.sharedMap.get(RequestEvSharedActionId),
1383
- status: status !== 200 ? status : 200,
1384
- href: getPathname(requestEv.url, trailingSlash)
1385
- };
1386
- if (typeof result.html === "string") {
1387
- await stream.write(result.html);
1388
- }
1389
- requestEv.sharedMap.set("qData", qData);
1390
- } finally {
1391
- await stream.ready;
1392
- await stream.close();
1393
- await pipe;
1394
- }
1395
- await writableStream.close();
1396
- };
1397
- }
1398
- async function handleRedirect(requestEv) {
1399
- const isPageDataReq = requestEv.sharedMap.has(IsQData);
1400
- if (!isPageDataReq) {
1401
- return;
1402
- }
1403
- try {
1404
- await requestEv.next();
1405
- } catch (err) {
1406
- if (!(err instanceof RedirectMessage)) {
1407
- throw err;
1408
- }
1409
- }
1410
- if (requestEv.headersSent) {
1411
- return;
1412
- }
1413
- const status = requestEv.status();
1414
- const location = requestEv.headers.get("Location");
1415
- const isRedirect = status >= 301 && status <= 308 && location;
1416
- if (isRedirect) {
1417
- const adaptedLocation = makeQDataPath(location);
1418
- if (adaptedLocation) {
1419
- requestEv.headers.set("Location", adaptedLocation);
1420
- requestEv.getWritableStream().close();
1421
- return;
1422
- } else {
1423
- requestEv.status(200);
1424
- requestEv.headers.delete("Location");
1425
- }
1426
- }
1427
- }
1428
- async function renderQData(requestEv) {
1429
- const isPageDataReq = requestEv.sharedMap.has(IsQData);
1430
- if (!isPageDataReq) {
1431
- return;
1432
- }
1433
- await requestEv.next();
1434
- if (requestEv.headersSent || requestEv.exited) {
1435
- return;
1436
- }
1437
- const status = requestEv.status();
1438
- const redirectLocation = requestEv.headers.get("Location");
1439
- const trailingSlash = getRequestTrailingSlash(requestEv);
1440
- const requestHeaders = {};
1441
- requestEv.request.headers.forEach((value, key) => requestHeaders[key] = value);
1442
- requestEv.headers.set("Content-Type", "application/json; charset=utf-8");
1443
- const qData = {
1444
- loaders: getRequestLoaders(requestEv),
1445
- action: requestEv.sharedMap.get(RequestEvSharedActionId),
1446
- status: status !== 200 ? status : 200,
1447
- href: getPathname(requestEv.url, trailingSlash),
1448
- redirect: redirectLocation ?? void 0,
1449
- isRewrite: requestEv.sharedMap.get(RequestEvIsRewrite)
1450
- };
1451
- const writer = requestEv.getWritableStream().getWriter();
1452
- const qwikSerializer = requestEv[RequestEvQwikSerializer];
1453
- const data = await qwikSerializer._serialize([qData]);
1454
- writer.write(encoder.encode(data));
1455
- requestEv.sharedMap.set("qData", qData);
1456
- writer.close();
1457
- }
1458
- function makeQDataPath(href) {
1459
- if (href.startsWith("/")) {
1460
- const append = QDATA_JSON;
1461
- const url = new URL(href, "http://localhost");
1462
- const pathname = url.pathname.endsWith("/") ? url.pathname.slice(0, -1) : url.pathname;
1463
- return pathname + (append.startsWith("/") ? "" : "/") + append + url.search;
1464
- } else {
1465
- return void 0;
1466
- }
1467
- }
1468
- function now() {
1469
- return typeof performance !== "undefined" ? performance.now() : 0;
1470
- }
1471
- async function measure(requestEv, name, fn) {
1472
- const start = now();
1473
- try {
1474
- return await fn();
1475
- } finally {
1476
- const duration = now() - start;
1477
- let measurements = requestEv.sharedMap.get("@serverTiming");
1478
- if (!measurements) {
1479
- requestEv.sharedMap.set("@serverTiming", measurements = []);
1480
- }
1481
- measurements.push([name, duration]);
1482
- }
1483
- }
1484
- function isContentType(headers, ...types) {
1485
- var _a;
1486
- const type = ((_a = headers.get("content-type")) == null ? void 0 : _a.split(/;/, 1)[0].trim()) ?? "";
1487
- return types.includes(type);
1488
- }
1489
-
1490
- // packages/qwik-router/src/middleware/request-handler/request-handler.ts
1491
- async function requestHandler(serverRequestEv, opts, qwikSerializer) {
1492
- const { render, qwikRouterConfig, checkOrigin } = opts;
1493
- if (!qwikRouterConfig) {
1494
- throw new Error("qwikRouterConfig is required.");
1495
- }
1496
- const pathname = serverRequestEv.url.pathname;
1497
- const matchPathname = getRouteMatchPathname(pathname, qwikRouterConfig.trailingSlash);
1498
- const routeAndHandlers = await loadRequestHandlers(
1499
- qwikRouterConfig,
1500
- matchPathname,
1501
- serverRequestEv.request.method,
1502
- checkOrigin ?? true,
1503
- render
1504
- );
1505
- if (routeAndHandlers) {
1506
- const [route, requestHandlers] = routeAndHandlers;
1507
- const rebuildRouteInfo = async (url) => {
1508
- const matchPathname2 = getRouteMatchPathname(url.pathname, qwikRouterConfig.trailingSlash);
1509
- const routeAndHandlers2 = await loadRequestHandlers(
1510
- qwikRouterConfig,
1511
- matchPathname2,
1512
- serverRequestEv.request.method,
1513
- checkOrigin ?? true,
1514
- render
1515
- );
1516
- if (routeAndHandlers2) {
1517
- const [loadedRoute, requestHandlers2] = routeAndHandlers2;
1518
- return { loadedRoute, requestHandlers: requestHandlers2 };
1519
- } else {
1520
- return { loadedRoute: null, requestHandlers: [] };
1521
- }
1522
- };
1523
- return runQwikRouter(
1524
- serverRequestEv,
1525
- route,
1526
- requestHandlers,
1527
- rebuildRouteInfo,
1528
- qwikRouterConfig.trailingSlash,
1529
- qwikRouterConfig.basePathname,
1530
- qwikSerializer
1531
- );
1532
- }
1533
- return null;
1534
- }
1535
- async function loadRequestHandlers(qwikRouterConfig, pathname, method, checkOrigin, renderFn) {
1536
- const { routes, serverPlugins, menus, cacheModules } = qwikRouterConfig;
1537
- const route = await loadRoute(routes, menus, cacheModules, pathname);
1538
- const requestHandlers = resolveRequestHandlers(
1539
- serverPlugins,
1540
- route,
1541
- method,
1542
- checkOrigin,
1543
- renderQwikMiddleware(renderFn)
1544
- );
1545
- if (requestHandlers.length > 0) {
1546
- return [route, requestHandlers];
1547
- }
1548
- return null;
1549
- }
1550
-
1551
- // packages/qwik-router/src/middleware/request-handler/polyfill.ts
1552
- var _TextEncoderStream_polyfill = class {
1553
- #pendingHighSurrogate = null;
1554
- #handle = new TextEncoder();
1555
- #transform = new TransformStream({
1556
- transform: (chunk, controller) => {
1557
- chunk = String(chunk);
1558
- let finalChunk = "";
1559
- for (let i = 0; i < chunk.length; i++) {
1560
- const item = chunk[i];
1561
- const codeUnit = item.charCodeAt(0);
1562
- if (this.#pendingHighSurrogate !== null) {
1563
- const highSurrogate = this.#pendingHighSurrogate;
1564
- this.#pendingHighSurrogate = null;
1565
- if (56320 <= codeUnit && codeUnit <= 57343) {
1566
- finalChunk += highSurrogate + item;
1567
- continue;
1568
- }
1569
- finalChunk += "\uFFFD";
1570
- }
1571
- if (55296 <= codeUnit && codeUnit <= 56319) {
1572
- this.#pendingHighSurrogate = item;
1573
- continue;
1574
- }
1575
- if (56320 <= codeUnit && codeUnit <= 57343) {
1576
- finalChunk += "\uFFFD";
1577
- continue;
1578
- }
1579
- finalChunk += item;
1580
- }
1581
- if (finalChunk) {
1582
- controller.enqueue(this.#handle.encode(finalChunk));
1583
- }
1584
- },
1585
- flush: (controller) => {
1586
- if (this.#pendingHighSurrogate !== null) {
1587
- controller.enqueue(new Uint8Array([239, 191, 189]));
1588
- }
1589
- }
1590
- });
1591
- get encoding() {
1592
- return this.#handle.encoding;
1593
- }
1594
- get readable() {
1595
- return this.#transform.readable;
1596
- }
1597
- get writable() {
1598
- return this.#transform.writable;
1599
- }
1600
- get [Symbol.toStringTag]() {
1601
- return "TextEncoderStream";
1602
- }
1603
- };
1604
- // Annotate the CommonJS export names for ESM import in node:
1605
- 0 && (module.exports = {
1606
- AbortMessage,
1607
- RedirectMessage,
1608
- RewriteMessage,
1609
- ServerError,
1610
- _TextEncoderStream_polyfill,
1611
- getErrorHtml,
1612
- mergeHeadersCookies,
1613
- requestHandler
1614
- });
14
+ <body><p><strong>${e}</strong> <span>${r}</span></p></body>
15
+ `}const on=/[&<>]/g,an=e=>e.replace(on,r=>{switch(r){case"&":return"&amp;";case"<":return"&lt;";case">":return"&gt;";default:return""}}),sn="#006ce9",cn="#713fc2";let Q;import("node:async_hooks").then(e=>{const r=e.AsyncLocalStorage;Q=new r,globalThis.qcAsyncRequestStore=Q}).catch(e=>{console.warn("AsyncLocalStorage not available, continuing without it. This might impact concurrent server calls.",e)});function ln(e,r,n,t,i="/"){let o;const a=new Promise(c=>o=c),s=fn(e,r,n,i,o);return{response:a,requestEv:s,completion:Q?Q.run(s,ue,s,t,o):ue(s,t,o)}}async function ue(e,r,n){try{(a=>new URL(a.pathname+a.search,a))(e.originalUrl)}catch{const a="Resource Not Found";e.status(404);const s=F(404,a);return e.html(404,s),new _.ServerError(404,a)}let t=1;async function i(){try{await e.next()}catch(o){if(o instanceof _.RedirectMessage)await e.getWritableStream().close();else if(o instanceof _.RewriteMessage){if(t>50)throw new Error("Infinite rewrite loop");t+=1;const a=new URL(e.url);a.pathname=o.pathname;const{loadedRoute:s,requestHandlers:c}=await r(a);return e.resetRoute(s,c,a),await i()}else if(o instanceof _.ServerError){if(!e.headersSent){const a=o.status,s=e.request.headers.get("Accept");if(s&&!s.includes("text/html"))e.headers.set("Content-Type","application/qwik-json"),e.send(a,await T._serialize([o.data]));else{const c=F(o.status,o.data);e.html(a,c)}}}else if(!(o instanceof _.AbortMessage)){if(L(e)!=="dev")try{e.headersSent||(e.headers.set("content-type","text/html; charset=utf-8"),e.cacheControl({noCache:!0}),e.status(500));const a=e.getWritableStream();if(!a.locked){const s=a.getWriter();await s.write(j.encode(F(500,"Internal Server Error"))),await s.close()}}catch{console.error("Unable to render error page")}return o}}}try{return await i()}finally{e.isDirty()||n(null)}}function he(e){if(e.endsWith(I)){const r=e.length-Ae+(globalThis.__NO_TRAILING_SLASH__?0:1);e=e.slice(0,r),e===""&&(e="/")}return e}const q="@isQData",I="/q-data.json",Ae=I.length,Te=Symbol("RequestEvLoaders"),Me=Symbol("RequestEvMode"),Ne=Symbol("RequestEvRoute"),xe=Symbol("RequestEvLoaderSerializationStrategyMap"),Ce="@routeName",z="@actionId",Pe="@actionFormData",dn="@nonce",Ie="@rewrite",X="@serverTiming",H="qData";function fn(e,r,n,t,i){const{request:o,platform:a,env:s}=e,c=new Map,f=new rn(o.headers.get("cookie")),l=new Headers,u=new URL(o.url);u.pathname.endsWith(I)&&(u.pathname=u.pathname.slice(0,-Ae),!globalThis.__NO_TRAILING_SLASH__&&!u.pathname.endsWith("/")&&(u.pathname+="/"),c.set(q,!0));let h=-1,y=null,w,R=e.locale,p=200;const N=async()=>{for(h++;h<n.length;){const d=n[h],m=globalThis.qcAsyncRequestStore,g=m?.run?m.run(b,d,b):d(b);Ve(g)&&await g,h++}},x=(d,m,g=u)=>{r=d,n=m,u.pathname=g.pathname,u.search=g.search,h=-1},C=()=>{if(y!==null)throw new Error("Response already sent")},k=(d,m)=>{if(C(),typeof d=="number"){p=d;const A=b.getWritableStream().getWriter();A.write(typeof m=="string"?j.encode(m):m),A.close()}else if(p=d.status,d.headers.forEach((g,A)=>{A.toLowerCase()!=="set-cookie"&&l.append(A,g)}),d.headers.getSetCookie().forEach(g=>{const A=g.indexOf("=");if(A===-1)return;const We=g.slice(0,A).trim(),ke=g.slice(A+1).trim();f.set(We,ke)}),d.body){const g=b.getWritableStream();d.body.pipeTo(g)}else b.getWritableStream().getWriter().close();return B()},B=()=>(h=me,new _.AbortMessage),O={},b={[Te]:O,[xe]:new Map,[Me]:e.mode,get[Ne](){return r},cookie:f,headers:l,env:s,method:o.method,signal:o.signal,originalUrl:new URL(u),get params(){return r?.[U.Params]??{}},get pathname(){return u.pathname},platform:a,get query(){return u.searchParams},request:o,url:u,basePathname:t,sharedMap:c,get headersSent(){return y!==null},get exited(){return h>=me},get clientConn(){return e.getClientConn()},next:N,resetRoute:x,exit:B,cacheControl:(d,m="Cache-Control")=>{C(),l.set(m,Xe(d))},resolveValue:(async d=>{const m=d.__id;if(d.__brand==="server_loader"){if(!(m in O))throw new Error("You can not get the returned data of a loader that has not been executed for this request.");if(O[m]===T._UNINITIALIZED){const g=L(b)==="dev";await Oe(d,O,b,g)}}return O[m]}),status:d=>typeof d=="number"?(C(),p=d,d):p,locale:d=>(typeof d=="string"&&(R=d),R||""),error:(d,m)=>(p=d,l.delete("Cache-Control"),new _.ServerError(d,m)),redirect:(d,m)=>{if(C(),p=d,m){const g=m.replace(/([^:])\/{2,}/g,"$1/");m!==g&&console.warn(`Redirect URL ${m} is invalid, fixing to ${g}`),l.set("Location",g)}return l.delete("Cache-Control"),d>301&&l.set("Cache-Control","no-store"),B(),new _.RedirectMessage},rewrite:d=>{if(C(),d.startsWith("http"))throw new Error("Rewrite does not support absolute urls");return c.set(Ie,!0),new _.RewriteMessage(d.replace(/\/+/g,"/"))},defer:d=>typeof d=="function"?d:()=>d,fail:(d,m)=>(C(),p=d,l.delete("Cache-Control"),{failed:!0,...m}),text:(d,m)=>(l.set("Content-Type","text/plain; charset=utf-8"),k(d,m)),html:(d,m)=>(l.set("Content-Type","text/html; charset=utf-8"),k(d,m)),parseBody:async()=>w!==void 0?w:w=hn(b,c),json:(d,m)=>(l.set("Content-Type","application/json; charset=utf-8"),k(d,JSON.stringify(m))),send:k,isDirty:()=>y!==null,getWritableStream:()=>{if(y===null){if(e.mode==="dev"){const d=c.get(X);d&&l.set("Server-Timing",d.map(([m,g])=>`${m};dur=${g}`).join(","))}y=e.getWritableStream(p,l,f,i,b)}return y}};return Object.freeze(b)}function W(e){return e[Te]}function Le(e){return e[xe]}function un(e){return e[Ne]}function L(e){return e[Me]}const me=Number.MAX_SAFE_INTEGER,hn=async({request:e,method:r,query:n},t)=>{const i=e.headers.get("content-type")?.split(/[;,]/,1)[0].trim()??"";if(i==="application/x-www-form-urlencoded"||i==="multipart/form-data"){const o=await e.formData();return t.set(Pe,o),mn(o)}else{if(i==="application/json")return await e.json();if(i==="application/qwik-json"){if(r==="GET"&&n.has(oe)){const o=n.get(oe);if(o)try{return T._deserialize(decodeURIComponent(o))}catch{}}return T._deserialize(await e.text())}}},mn=e=>[...e.entries()].reduce((n,[t,i])=>(t.split(".").reduce((o,a,s,c)=>{if(a.endsWith("[]")){const f=a.slice(0,-2);return o[f]=o[f]||[],o[f]=[...o[f],i]}return s<c.length-1?o[a]=o[a]||(Number.isNaN(+c[s+1])?{}:[]):o[a]=i},n),n),{});function gn(e){const{params:r,request:n,status:t,locale:i,originalUrl:o}=e,a={};n.headers.forEach((N,x)=>a[x]=N);const s=e.sharedMap.get(z),c=e.sharedMap.get(Pe),f=e.sharedMap.get(Ce),l=e.sharedMap.get(dn),u=e.request.headers,h=new URL(o.pathname+o.search,o),y=u.get("X-Forwarded-Host"),w=u.get("X-Forwarded-Proto");y&&(h.port="",h.host=y),w&&(h.protocol=w);const R=W(e),p=Le(e);return{url:h.href,requestHeaders:a,locale:i(),nonce:l,containerAttributes:{[je]:f},qwikrouter:{routeName:f,ev:e,params:{...r},loadedRoute:un(e),response:{status:t(),loaders:R,loadersSerializationStrategy:p,action:s,formData:c}}}}const yn=(e,r,n,t,i)=>{const o=[],a=[],s=[],c=!!(r&&Tn(r[U.Mods]));if(e&&ge(o,a,s,e,c,n),r){const f=r[U.RouteName];t&&(n==="POST"||n==="PUT"||n==="PATCH"||n==="DELETE")&&(t==="lax-proto"?s.unshift(Mn):s.unshift(Nn)),c&&((n==="POST"||n==="GET")&&s.push(bn),s.push(_n),s.push(Pn));const l=r[U.Mods];s.push(Cn),ge(o,a,s,l,c,n),c&&(s.push(u=>{u.sharedMap.set(Ce,f)}),s.push(wn(a)),s.push(pn(o)),s.push(i))}return s},ge=(e,r,n,t,i,o)=>{for(const a of t){typeof a.onRequest=="function"?n.push(a.onRequest):Array.isArray(a.onRequest)&&n.push(...a.onRequest);let s;switch(o){case"GET":{s=a.onGet;break}case"POST":{s=a.onPost;break}case"PUT":{s=a.onPut;break}case"PATCH":{s=a.onPatch;break}case"DELETE":{s=a.onDelete;break}case"OPTIONS":{s=a.onOptions;break}case"HEAD":{s=a.onHead;break}}if(typeof s=="function"?n.push(s):Array.isArray(s)&&n.push(...s),i)for(const c of Object.values(a))typeof c=="function"&&(c.__brand==="server_loader"?e.push(c):c.__brand==="server_action"&&r.push(c))}};function wn(e){return async r=>{const n=r;if(n.headersSent){n.exit();return}const{method:t}=n,i=W(n),o=L(n)==="dev";if(o&&t==="GET"&&n.query.has(ie)&&console.warn(`Seems like you are submitting a Qwik Action via GET request. Qwik Actions should be submitted via POST request.
16
+ Make sure your <form> has method="POST" attribute, like this: <form method="POST">`),t==="POST"){const a=n.query.get(ie);if(a){const s=globalThis._qwikActionsMap,c=e.find(f=>f.__id===a)??s?.get(a);if(c){n.sharedMap.set(z,a);const f=await n.parseBody();if(!f||typeof f!="object")throw new Error(`Expected request data for the action id ${a} to be an object`);const l=await Ue(n,c.__validators,f,o);if(!l.success)i[a]=n.fail(l.status??500,l.error);else{const u=o?await G(n,c.__qrl.getHash(),()=>c.__qrl.call(n,l.data,n)):await c.__qrl.call(n,l.data,n);o&&E(u,c.__qrl),i[a]=u}}}}}}function pn(e){return async r=>{const n=r;if(n.headersSent){n.exit();return}const t=W(n),i=L(n)==="dev";if(e.length>0){let o=[];if(n.query.has(Y)){const s=n.query.getAll(Y);for(const c of e)s.includes(c.__id)?o.push(c):t[c.__id]=T._UNINITIALIZED}else o=e;const a=o.map(s=>Oe(s,t,n,i));await Promise.all(a)}}}async function Oe(e,r,n,t){const i=e.__id;return r[i]=Ue(n,e.__validators,void 0,t).then(a=>a.success?t?G(n,e.__qrl.getHash(),()=>e.__qrl.call(n,n)):e.__qrl.call(n,n):n.fail(a.status??500,a.error)).then(a=>(typeof a=="function"?r[i]=a():(t&&E(a,e.__qrl),r[i]=a),a)),Le(n).set(i,e.__serializationStrategy),r[i]}async function Ue(e,r,n,t){let i={success:!0,data:n};if(r)for(const o of r)if(t?i=await G(e,"validator$",()=>o.validate(e,n)):i=await o.validate(e,n),i.success)n=i.data;else return i;return i}function Rn(e){return e?typeof e=="object"&&Symbol.asyncIterator in e:!1}async function bn(e){const r=e.query.get(ze);if(r&&e.request.headers.get("X-QRL")===r&&e.request.headers.get("Content-Type")==="application/qwik-json"){e.exit();const n=L(e)==="dev",t=await e.parseBody();if(Array.isArray(t)){const[i,...o]=t;if(An(i)&&i.getHash()===r){let a;try{n?a=await G(e,`server_${i.getSymbol()}`,()=>i.apply(e,o)):a=await i.apply(e,o)}catch(s){throw s instanceof _.ServerError?e.error(s.status,s.data):e.error(500,"Invalid request")}if(Rn(a)){e.headers.set("Content-Type","text/qwik-json-stream");const c=e.getWritableStream().getWriter();for await(const f of a){n&&E(f,i);const l=await T._serialize([f]);if(e.signal.aborted)break;await c.write(j.encode(`${l}
17
+ `))}c.close()}else{E(a,i),e.headers.set("Content-Type","application/qwik-json");const s=await T._serialize([a]);e.send(200,s)}return}}throw e.error(500,"Invalid request")}}function _n(e){const{basePathname:r,originalUrl:n,sharedMap:t}=e,{pathname:i,search:o}=n;if(!t.has(q)&&i!==r&&!i.endsWith(".html")){if(globalThis.__NO_TRAILING_SLASH__){if(i.endsWith("/"))throw e.redirect(V.MovedPermanently,i.slice(0,i.length-1)+o)}else if(!i.endsWith("/"))throw e.redirect(V.MovedPermanently,i+"/"+o)}}function E(e,r){try{T._verifySerializable(e,void 0)}catch(n){throw n instanceof Error&&r.dev&&(n.loc=r.dev),n}}const An=e=>typeof e=="function"&&typeof e.getSymbol=="function";function Tn(e){const r=e[e.length-1];return r&&typeof r.default=="function"}function Z(e){e=new URL(e),e.pathname.endsWith(I)&&(e.pathname=e.pathname.slice(0,-I.length)),globalThis.__NO_TRAILING_SLASH__?e.pathname.endsWith("/")&&(e.pathname=e.pathname.slice(0,-1)):e.pathname.endsWith("/")||(e.pathname+="/");const r=e.search.slice(1).replaceAll(/&?q(action|data|func|loaders)=[^&]+/g,"");return`${e.pathname}${r?`?${r}`:""}${e.hash}`}const j=new TextEncoder;function Mn(e){qe(e,"lax-proto")}function Nn(e){qe(e)}function qe(e,r){if(Ln(e.request.headers,"application/x-www-form-urlencoded","multipart/form-data","text/plain")){const t=e.request.headers.get("origin"),i=e.url.origin;let o=t!==i;if(o&&r&&t?.replace(/^http(s)?/g,"")===i.replace(/^http(s)?/g,"")&&(o=!1),o)throw e.error(403,`CSRF check failed. Cross-site ${e.method} form submissions are forbidden.
18
+ The request origin "${t}" does not match the server origin "${i}".`)}}function xn(e){return async r=>{if(r.headersSent||r.sharedMap.has(q))return;r.request.headers.forEach((l,u)=>l);const t=r.headers;t.has("Content-Type")||t.set("Content-Type","text/html; charset=utf-8");const{readable:i,writable:o}=new TextEncoderStream,a=r.getWritableStream(),s=i.pipeTo(a,{preventClose:!0}),c=o.getWriter(),f=r.status();try{const l=L(r)==="static",u=gn(r),h=await e({base:r.basePathname+"build/",stream:c,serverData:u,containerAttributes:{"q:render":l?"static":"",...u.containerAttributes}}),y={loaders:W(r),action:r.sharedMap.get(z),status:f!==200?f:200,href:Z(r.url)};typeof h.html=="string"&&await c.write(h.html),r.sharedMap.set(H,y)}finally{await c.ready,await c.close(),await s}await a.close()}}async function Cn(e){if(!e.sharedMap.has(q))return;try{await e.next()}catch(o){if(!(o instanceof _.RedirectMessage))throw o}if(e.headersSent)return;const n=e.status(),t=e.headers.get("Location");if(n>=301&&n<=308&&t){const o=In(t);if(o){e.headers.set("Location",o),e.getWritableStream().close();return}else e.status(200),e.headers.delete("Location")}}async function Pn(e){if(!e.sharedMap.has(q)||(await e.next(),e.headersSent||e.exited))return;const n=e.status(),t=e.headers.get("Location");e.request.headers.forEach((l,u)=>l),e.headers.set("Content-Type","application/json; charset=utf-8");let i=W(e);const o=e.query.getAll(Y),a=o.length>0;if(a){const l={};for(const u of o){const h=i[u];l[u]=h}i=l}const s=a?{loaders:i,status:n!==200?n:200,href:Z(e.url)}:{loaders:i,action:e.sharedMap.get(z),status:n!==200?n:200,href:Z(e.url),redirect:t??void 0,isRewrite:e.sharedMap.get(Ie)},c=e.getWritableStream().getWriter(),f=await T._serialize([s]);c.write(j.encode(f)),e.sharedMap.set(H,s),c.close()}function In(e){if(e.startsWith("/")){const r=I,n=new URL(e,"http://localhost");return(n.pathname.endsWith("/")?n.pathname.slice(0,-1):n.pathname)+(r.startsWith("/")?"":"/")+r+n.search}else return}function ye(){return typeof performance<"u"?performance.now():0}async function G(e,r,n){const t=ye();try{return await n()}finally{const i=ye()-t;let o=e.sharedMap.get(X);o||e.sharedMap.set(X,o=[]),o.push([r,i])}}function Ln(e,...r){const n=e.get("content-type")?.split(/;/,1)[0].trim()??"";return r.includes(n)}let v;async function On(e,r){const{render:n,checkOrigin:t}=r;let{qwikRouterConfig:i}=r;if(i||(v||(v=await import("@qwik-router-config")),i=v),!i)throw new Error("qwikRouterConfig is required.");const o=e.url.pathname,a=he(o),s=await we(i,a,e.request.method,t??!0,n);if(s){const[c,f]=s;return ln(e,c,f,async u=>{const h=he(u.pathname),y=await we(i,h,e.request.method,t??!0,n);if(y){const[w,R]=y;return{loadedRoute:w,requestHandlers:R}}else return{loadedRoute:null,requestHandlers:[]}},i.basePathname)}return null}async function we(e,r,n,t,i){const{routes:o,serverPlugins:a,menus:s,cacheModules:c}=e,f=await Je(o,s,c,r),l=yn(a,f,n,t,xn(i));return l.length>0?[f,l]:null}const Un=["__QWIK_ROUTER_NOT_FOUND_ARRAY__"];function qn(e){for(const[r,n]of Un)if(e.startsWith(r))return n;return _e(404,"Resource Not Found")}const J=new Set(["__QWIK_ROUTER_STATIC_PATHS_ARRAY__"]);function Wn(e,r){if(e.toUpperCase()!=="GET")return!1;const n=r.pathname;if(n.startsWith("/"+(globalThis.__QWIK_BUILD_DIR__||"build")+"/")||n.startsWith("/"+(globalThis.__QWIK_ASSETS_DIR__||"assets")+"/")||J.has(n))return!0;if(n.endsWith("/q-data.json")){const t=n.replace(/\/q-data.json$/,"");if(J.has(t+"/")||J.has(t))return!0}return!1}class kn extends Error{constructor(r,n){super(typeof n=="string"?n:void 0),this.status=r,this.data=n}}class ee{}class Dn extends ee{}class Sn extends ee{constructor(r){super(),this.pathname=r}}class $n{#e=null;#n=new TextEncoder;#r=new TransformStream({transform:(r,n)=>{r=String(r);let t="";for(let i=0;i<r.length;i++){const o=r[i],a=o.charCodeAt(0);if(this.#e!==null){const s=this.#e;if(this.#e=null,56320<=a&&a<=57343){t+=s+o;continue}t+="�"}if(55296<=a&&a<=56319){this.#e=o;continue}if(56320<=a&&a<=57343){t+="�";continue}t+=o}t&&n.enqueue(this.#n.encode(t))},flush:r=>{this.#e!==null&&r.enqueue(new Uint8Array([239,191,189]))}});get encoding(){return this.#n.encoding}get readable(){return this.#r.readable}get writable(){return this.#r.writable}get[Symbol.toStringTag](){return"TextEncoderStream"}}exports.AbortMessage=ee;exports.RedirectMessage=Dn;exports.RequestEvShareQData=H;exports.RewriteMessage=Sn;exports.ServerError=kn;exports._TextEncoderStream_polyfill=$n;exports.getErrorHtml=F;exports.getNotFound=qn;exports.isStaticPath=Wn;exports.mergeHeadersCookies=tn;exports.requestHandler=On;