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

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 (140) hide show
  1. package/lib/adapters/azure-swa/vite/index.cjs +61 -5
  2. package/lib/adapters/azure-swa/vite/index.mjs +26 -201
  3. package/lib/adapters/bun-server/vite/index.cjs +27 -5
  4. package/lib/adapters/bun-server/vite/index.mjs +14 -196
  5. package/lib/adapters/cloud-run/vite/index.cjs +24 -5
  6. package/lib/adapters/cloud-run/vite/index.mjs +13 -195
  7. package/lib/adapters/cloudflare-pages/vite/index.cjs +65 -1
  8. package/lib/adapters/cloudflare-pages/vite/index.mjs +63 -4
  9. package/lib/adapters/deno-server/vite/index.cjs +39 -5
  10. package/lib/adapters/deno-server/vite/index.mjs +16 -198
  11. package/lib/adapters/netlify-edge/vite/index.cjs +88 -6
  12. package/lib/adapters/netlify-edge/vite/index.mjs +56 -240
  13. package/lib/adapters/node-server/vite/index.cjs +27 -5
  14. package/lib/adapters/node-server/vite/index.mjs +14 -196
  15. package/lib/adapters/shared/vite/index.cjs +303 -2
  16. package/lib/adapters/shared/vite/index.d.ts +4 -4
  17. package/lib/adapters/shared/vite/index.mjs +248 -143
  18. package/lib/adapters/ssg/vite/index.cjs +19 -5
  19. package/lib/adapters/ssg/vite/index.mjs +11 -193
  20. package/lib/adapters/vercel-edge/vite/index.cjs +81 -5
  21. package/lib/adapters/vercel-edge/vite/index.d.ts +1 -1
  22. package/lib/adapters/vercel-edge/vite/index.mjs +48 -229
  23. package/lib/chunks/error-handler.cjs +58 -0
  24. package/lib/chunks/error-handler.mjs +59 -0
  25. package/lib/chunks/format-error.cjs +136 -0
  26. package/lib/chunks/format-error.mjs +137 -0
  27. package/lib/chunks/fs.cjs +274 -0
  28. package/lib/chunks/fs.mjs +275 -0
  29. package/lib/chunks/index.cjs +877 -0
  30. package/lib/chunks/index.mjs +876 -0
  31. package/lib/chunks/mime-types.cjs +52 -0
  32. package/lib/chunks/mime-types.mjs +53 -0
  33. package/lib/chunks/routing.qwik.cjs +452 -0
  34. package/lib/chunks/routing.qwik.mjs +453 -0
  35. package/lib/chunks/types.qwik.cjs +24 -0
  36. package/lib/chunks/types.qwik.mjs +25 -0
  37. package/lib/index.d.ts +9 -3
  38. package/lib/index.qwik.cjs +543 -1001
  39. package/lib/index.qwik.mjs +512 -972
  40. package/lib/middleware/aws-lambda/index.cjs +52 -1
  41. package/lib/middleware/aws-lambda/index.mjs +37 -26
  42. package/lib/middleware/azure-swa/index.cjs +92 -1
  43. package/lib/middleware/azure-swa/index.mjs +64 -46
  44. package/lib/middleware/bun/index.cjs +143 -1
  45. package/lib/middleware/bun/index.mjs +103 -117
  46. package/lib/middleware/cloudflare-pages/index.cjs +96 -1
  47. package/lib/middleware/cloudflare-pages/index.mjs +68 -47
  48. package/lib/middleware/deno/index.cjs +130 -1
  49. package/lib/middleware/deno/index.mjs +93 -112
  50. package/lib/middleware/firebase/index.cjs +33 -1
  51. package/lib/middleware/firebase/index.mjs +25 -16
  52. package/lib/middleware/netlify-edge/index.cjs +71 -1
  53. package/lib/middleware/netlify-edge/index.mjs +52 -36
  54. package/lib/middleware/node/index.cjs +219 -1
  55. package/lib/middleware/node/index.mjs +178 -165
  56. package/lib/middleware/request-handler/index.cjs +1488 -18
  57. package/lib/middleware/request-handler/index.d.ts +20 -2
  58. package/lib/middleware/request-handler/index.mjs +1225 -873
  59. package/lib/middleware/vercel-edge/index.cjs +98 -1
  60. package/lib/middleware/vercel-edge/index.mjs +71 -47
  61. package/lib/service-worker/index.cjs +5 -0
  62. package/lib/service-worker/index.mjs +5 -0
  63. package/lib/ssg/index.cjs +15 -1
  64. package/lib/ssg/index.mjs +12 -19
  65. package/lib/vite/index.cjs +2006 -27
  66. package/lib/vite/index.d.ts +9 -9
  67. package/lib/vite/index.mjs +1597 -1216
  68. package/package.json +9 -8
  69. package/lib/adapters/azure-swa/vite/index-BqUeglYs.cjs +0 -1
  70. package/lib/adapters/azure-swa/vite/index-CBIchDYq.js +0 -651
  71. package/lib/adapters/azure-swa/vite/index-ClHGw5z1.js +0 -6
  72. package/lib/adapters/azure-swa/vite/index-CrwlB95_.js +0 -22
  73. package/lib/adapters/azure-swa/vite/index-DTIOTwZo.cjs +0 -11
  74. package/lib/adapters/azure-swa/vite/index-vQuPcef3.cjs +0 -1
  75. package/lib/adapters/bun-server/vite/index-BqUeglYs.cjs +0 -1
  76. package/lib/adapters/bun-server/vite/index-CBIchDYq.js +0 -651
  77. package/lib/adapters/bun-server/vite/index-ClHGw5z1.js +0 -6
  78. package/lib/adapters/bun-server/vite/index-CrwlB95_.js +0 -22
  79. package/lib/adapters/bun-server/vite/index-DTIOTwZo.cjs +0 -11
  80. package/lib/adapters/bun-server/vite/index-vQuPcef3.cjs +0 -1
  81. package/lib/adapters/cloud-run/vite/index-BqUeglYs.cjs +0 -1
  82. package/lib/adapters/cloud-run/vite/index-CBIchDYq.js +0 -651
  83. package/lib/adapters/cloud-run/vite/index-ClHGw5z1.js +0 -6
  84. package/lib/adapters/cloud-run/vite/index-CrwlB95_.js +0 -22
  85. package/lib/adapters/cloud-run/vite/index-DTIOTwZo.cjs +0 -11
  86. package/lib/adapters/cloud-run/vite/index-vQuPcef3.cjs +0 -1
  87. package/lib/adapters/cloudflare-pages/vite/index-BIeHg2Cj.cjs +0 -5
  88. package/lib/adapters/cloudflare-pages/vite/index-C455V8_A.cjs +0 -1
  89. package/lib/adapters/cloudflare-pages/vite/index-ClHGw5z1.js +0 -6
  90. package/lib/adapters/cloudflare-pages/vite/index-D3HITboM.js +0 -645
  91. package/lib/adapters/cloudflare-pages/vite/index-DKcVHRBy.cjs +0 -11
  92. package/lib/adapters/cloudflare-pages/vite/index-DwovcBp3.js +0 -22
  93. package/lib/adapters/cloudflare-pages/vite/index-bogwy7wh.js +0 -250
  94. package/lib/adapters/cloudflare-pages/vite/index-vQuPcef3.cjs +0 -1
  95. package/lib/adapters/deno-server/vite/index-BqUeglYs.cjs +0 -1
  96. package/lib/adapters/deno-server/vite/index-CBIchDYq.js +0 -651
  97. package/lib/adapters/deno-server/vite/index-ClHGw5z1.js +0 -6
  98. package/lib/adapters/deno-server/vite/index-CrwlB95_.js +0 -22
  99. package/lib/adapters/deno-server/vite/index-DTIOTwZo.cjs +0 -11
  100. package/lib/adapters/deno-server/vite/index-vQuPcef3.cjs +0 -1
  101. package/lib/adapters/netlify-edge/vite/index-BqUeglYs.cjs +0 -1
  102. package/lib/adapters/netlify-edge/vite/index-CBIchDYq.js +0 -651
  103. package/lib/adapters/netlify-edge/vite/index-ClHGw5z1.js +0 -6
  104. package/lib/adapters/netlify-edge/vite/index-CrwlB95_.js +0 -22
  105. package/lib/adapters/netlify-edge/vite/index-DTIOTwZo.cjs +0 -11
  106. package/lib/adapters/netlify-edge/vite/index-vQuPcef3.cjs +0 -1
  107. package/lib/adapters/node-server/vite/index-BqUeglYs.cjs +0 -1
  108. package/lib/adapters/node-server/vite/index-CBIchDYq.js +0 -651
  109. package/lib/adapters/node-server/vite/index-ClHGw5z1.js +0 -6
  110. package/lib/adapters/node-server/vite/index-CrwlB95_.js +0 -22
  111. package/lib/adapters/node-server/vite/index-DTIOTwZo.cjs +0 -11
  112. package/lib/adapters/node-server/vite/index-vQuPcef3.cjs +0 -1
  113. package/lib/adapters/shared/vite/index-BqUeglYs.cjs +0 -1
  114. package/lib/adapters/shared/vite/index-CBIchDYq.js +0 -651
  115. package/lib/adapters/shared/vite/index-ClHGw5z1.js +0 -6
  116. package/lib/adapters/shared/vite/index-CrwlB95_.js +0 -22
  117. package/lib/adapters/shared/vite/index-DTIOTwZo.cjs +0 -11
  118. package/lib/adapters/shared/vite/index-vQuPcef3.cjs +0 -1
  119. package/lib/adapters/ssg/vite/index-BqUeglYs.cjs +0 -1
  120. package/lib/adapters/ssg/vite/index-CBIchDYq.js +0 -651
  121. package/lib/adapters/ssg/vite/index-ClHGw5z1.js +0 -6
  122. package/lib/adapters/ssg/vite/index-CrwlB95_.js +0 -22
  123. package/lib/adapters/ssg/vite/index-DTIOTwZo.cjs +0 -11
  124. package/lib/adapters/ssg/vite/index-vQuPcef3.cjs +0 -1
  125. package/lib/adapters/vercel-edge/vite/index-BqUeglYs.cjs +0 -1
  126. package/lib/adapters/vercel-edge/vite/index-CBIchDYq.js +0 -651
  127. package/lib/adapters/vercel-edge/vite/index-ClHGw5z1.js +0 -6
  128. package/lib/adapters/vercel-edge/vite/index-CrwlB95_.js +0 -22
  129. package/lib/adapters/vercel-edge/vite/index-DTIOTwZo.cjs +0 -11
  130. package/lib/adapters/vercel-edge/vite/index-vQuPcef3.cjs +0 -1
  131. package/lib/service-worker.cjs +0 -1
  132. package/lib/service-worker.mjs +0 -5
  133. package/lib/ssg/deno.cjs +0 -1
  134. package/lib/ssg/deno.mjs +0 -6
  135. package/lib/ssg/index-CBIchDYq.js +0 -651
  136. package/lib/ssg/index-ClHGw5z1.js +0 -6
  137. package/lib/ssg/index-DTIOTwZo.cjs +0 -11
  138. package/lib/ssg/index-vQuPcef3.cjs +0 -1
  139. package/lib/ssg/node.cjs +0 -11
  140. package/lib/ssg/node.mjs +0 -651
@@ -1 +1,219 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const b=require("@qwik.dev/core/server"),w=require("@qwik.dev/router/middleware/request-handler"),k=require("node:fs"),g=require("node:path"),E=require("node:url"),_=require("node:http2");var y=typeof document<"u"?document.currentScript:null;const j={"3gp":"video/3gpp","3gpp":"video/3gpp",asf:"video/x-ms-asf",asx:"video/x-ms-asf",avi:"video/x-msvideo",avif:"image/avif",bmp:"image/x-ms-bmp",css:"text/css",flv:"video/x-flv",gif:"image/gif",htm:"text/html",html:"text/html",ico:"image/x-icon",jng:"image/x-jng",jpeg:"image/jpeg",jpg:"image/jpeg",js:"application/javascript",json:"application/json",kar:"audio/midi",m4a:"audio/x-m4a",m4v:"video/x-m4v",mid:"audio/midi",midi:"audio/midi",mng:"video/x-mng",mov:"video/quicktime",mp3:"audio/mpeg",mp4:"video/mp4",mpeg:"video/mpeg",mpg:"video/mpeg",ogg:"audio/ogg",pdf:"application/pdf",png:"image/png",rar:"application/x-rar-compressed",shtml:"text/html",svg:"image/svg+xml",svgz:"image/svg+xml",tif:"image/tiff",tiff:"image/tiff",ts:"video/mp2t",txt:"text/plain",wbmp:"image/vnd.wap.wbmp",webm:"video/webm",webp:"image/webp",wmv:"video/x-ms-wmv",woff:"font/woff",woff2:"font/woff2",xml:"text/xml",zip:"application/zip"};function x(e,t){return t?.getOrigin?.(e)??t?.origin??process.env.ORIGIN??T(e)}function T(e){const{PROTOCOL_HEADER:t,HOST_HEADER:i}=process.env,h=e.headers,v=t&&h[t]||(e.socket.encrypted||e.connection.encrypted?"https":"http"),o=i??(e instanceof _.Http2ServerRequest?":authority":"host"),r=h[o];return`${v}://${r}`}function R(e,t){return O(e.originalUrl||e.url||"/",t)}function P(e=""){return["The stream has been destroyed","write after end"].some(i=>e.includes(i))}const C=/^:(method|scheme|authority|path)$/i;function O(e,t){const i=/\/\/|\\\\/g;return new URL(e.replace(i,"/"),t)}async function A(e,t,i,h,v){const o=new Headers,r=t.headers;try{for(const[a,l]of Object.entries(r))if(!C.test(a)){if(typeof l=="string")o.set(a,l);else if(Array.isArray(l))for(const u of l)o.append(a,u)}}catch(a){console.error(a)}const d=async function*(){for await(const a of t)yield a},n=t.method==="HEAD"||t.method==="GET"?void 0:d(),c=new AbortController,s={method:t.method,headers:o,body:n,signal:c.signal,duplex:"half"};return i.on("close",()=>{c.abort()}),{mode:h,url:e,request:new Request(e.href,s),env:{get(a){return process.env[a]}},getWritableStream:(a,l,u)=>{i.statusCode=a;try{for(const[p,S]of l)C.test(p)||i.setHeader(p,S);const f=u.headers();f.length>0&&i.setHeader("Set-Cookie",f)}catch(f){console.error(f)}return new WritableStream({write(f){i.closed||i.destroyed||i.write(f,p=>{p&&!P(p.message)&&console.error(p)})},close(){i.end()}})},getClientConn:()=>v?v(t):{ip:t.socket.remoteAddress},platform:{ssr:!0,incomingMessage:t,node:process.versions.node},locale:void 0}}function H(e){e.qwikCityPlan&&!e.qwikRouterConfig&&(console.warn("qwikCityPlan is deprecated. Simply remove it."),e.qwikRouterConfig=e.qwikCityPlan),e.manifest&&b.setServerPlatform(e.manifest);const t=e.static?.root??g.join(E.fileURLToPath(typeof document>"u"?require("url").pathToFileURL(__filename).href:y&&y.tagName.toUpperCase()==="SCRIPT"&&y.src||new URL("index.cjs",document.baseURI).href),"..","..","dist");return{router:async(o,r,d)=>{try{const n=x(o,e),c=await A(R(o,n),o,r,"server",e.getClientConn),s=await w.requestHandler(c,e);if(s){const m=await s.completion;if(m)throw m;if(s.requestEv.headersSent)return}d()}catch(n){console.error(n),d(n)}},notFound:async(o,r,d)=>{try{if(!r.headersSent){const n=x(o,e),c=R(o,n),s=!o.headers.accept?.includes("text/html")||w.isStaticPath(o.method||"GET",c)?"Not Found":w.getNotFound(c.pathname);r.writeHead(404,{"Content-Type":"text/html; charset=utf-8","X-Not-Found":c.pathname}),r.end(s)}}catch(n){console.error(n),d(n)}},staticFile:async(o,r,d)=>{try{const n=x(o,e),c=R(o,n);if(w.isStaticPath(o.method||"GET",c)){const s=c.pathname;let m;g.basename(s).includes(".")?m=g.join(t,s):globalThis.__NO_TRAILING_SLASH__?m=g.join(t,s,"index.html"):m=g.join(t,s+"index.html");const a=g.extname(m).replace(/^\./,""),l=k.createReadStream(m);l.on("error",d);const u=j[a];u&&r.setHeader("Content-Type",u),e.static?.cacheControl&&r.setHeader("Cache-Control",e.static.cacheControl),l.pipe(r);return}return d()}catch(n){console.error(n),d(n)}}}}const F=H;exports.createQwikCity=F;exports.createQwikRouter=H;
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const server = require("@qwik.dev/core/server");
4
+ const requestHandler = require("@qwik.dev/router/middleware/request-handler");
5
+ const fs = require("node:fs");
6
+ const path = require("node:path");
7
+ const node_url = require("node:url");
8
+ const mimeTypes = require("../../chunks/mime-types.cjs");
9
+ const node_http2 = require("node:http2");
10
+ var _documentCurrentScript = typeof document !== "undefined" ? document.currentScript : null;
11
+ function computeOrigin(req, opts) {
12
+ return opts?.getOrigin?.(req) ?? opts?.origin ?? process.env.ORIGIN ?? fallbackOrigin(req);
13
+ }
14
+ function fallbackOrigin(req) {
15
+ const { PROTOCOL_HEADER, HOST_HEADER } = process.env;
16
+ const headers = req.headers;
17
+ const protocol = PROTOCOL_HEADER && headers[PROTOCOL_HEADER] || (req.socket.encrypted || req.connection.encrypted ? "https" : "http");
18
+ const hostHeader = HOST_HEADER ?? (req instanceof node_http2.Http2ServerRequest ? ":authority" : "host");
19
+ const host = headers[hostHeader];
20
+ return `${protocol}://${host}`;
21
+ }
22
+ function getUrl(req, origin) {
23
+ return normalizeUrl(req.originalUrl || req.url || "/", origin);
24
+ }
25
+ function isIgnoredError(message = "") {
26
+ const ignoredErrors = ["The stream has been destroyed", "write after end"];
27
+ return ignoredErrors.some((ignored) => message.includes(ignored));
28
+ }
29
+ const invalidHeadersPattern = /^:(method|scheme|authority|path)$/i;
30
+ function normalizeUrl(url, base) {
31
+ const DOUBLE_SLASH_REG = /\/\/|\\\\/g;
32
+ return new URL(url.replace(DOUBLE_SLASH_REG, "/"), base);
33
+ }
34
+ async function fromNodeHttp(url, req, res, mode, getClientConn) {
35
+ const requestHeaders = new Headers();
36
+ const nodeRequestHeaders = req.headers;
37
+ try {
38
+ for (const [key, value] of Object.entries(nodeRequestHeaders)) {
39
+ if (invalidHeadersPattern.test(key)) {
40
+ continue;
41
+ }
42
+ if (typeof value === "string") {
43
+ requestHeaders.set(key, value);
44
+ } else if (Array.isArray(value)) {
45
+ for (const v of value) {
46
+ requestHeaders.append(key, v);
47
+ }
48
+ }
49
+ }
50
+ } catch (err) {
51
+ console.error(err);
52
+ }
53
+ const getRequestBody = async function* () {
54
+ for await (const chunk of req) {
55
+ yield chunk;
56
+ }
57
+ };
58
+ const body = req.method === "HEAD" || req.method === "GET" ? void 0 : getRequestBody();
59
+ const controller = new AbortController();
60
+ const options = {
61
+ method: req.method,
62
+ headers: requestHeaders,
63
+ body,
64
+ signal: controller.signal,
65
+ duplex: "half"
66
+ };
67
+ res.on("close", () => {
68
+ controller.abort();
69
+ });
70
+ const serverRequestEv = {
71
+ mode,
72
+ url,
73
+ request: new Request(url.href, options),
74
+ env: {
75
+ get(key) {
76
+ return process.env[key];
77
+ }
78
+ },
79
+ getWritableStream: (status, headers, cookies) => {
80
+ res.statusCode = status;
81
+ try {
82
+ for (const [key, value] of headers) {
83
+ if (invalidHeadersPattern.test(key)) {
84
+ continue;
85
+ }
86
+ res.setHeader(key, value);
87
+ }
88
+ const cookieHeaders = cookies.headers();
89
+ if (cookieHeaders.length > 0) {
90
+ res.setHeader("Set-Cookie", cookieHeaders);
91
+ }
92
+ } catch (err) {
93
+ console.error(err);
94
+ }
95
+ return new WritableStream({
96
+ write(chunk) {
97
+ if (res.closed || res.destroyed) {
98
+ return;
99
+ }
100
+ res.write(chunk, (error) => {
101
+ if (error && !isIgnoredError(error.message)) {
102
+ console.error(error);
103
+ }
104
+ });
105
+ },
106
+ close() {
107
+ res.end();
108
+ }
109
+ });
110
+ },
111
+ getClientConn: () => {
112
+ return getClientConn ? getClientConn(req) : {
113
+ ip: req.socket.remoteAddress
114
+ };
115
+ },
116
+ platform: {
117
+ ssr: true,
118
+ incomingMessage: req,
119
+ node: process.versions.node
120
+ // Weirdly needed to make typecheck of insights happy
121
+ },
122
+ locale: void 0
123
+ };
124
+ return serverRequestEv;
125
+ }
126
+ function createQwikRouter(opts) {
127
+ if (opts.qwikCityPlan && !opts.qwikRouterConfig) {
128
+ console.warn("qwikCityPlan is deprecated. Simply remove it.");
129
+ opts.qwikRouterConfig = opts.qwikCityPlan;
130
+ }
131
+ if (opts.manifest) {
132
+ server.setServerPlatform(opts.manifest);
133
+ }
134
+ const staticFolder = opts.static?.root ?? path.join(node_url.fileURLToPath(typeof document === "undefined" ? require("url").pathToFileURL(__filename).href : _documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === "SCRIPT" && _documentCurrentScript.src || new URL("middleware/node/index.cjs", document.baseURI).href), "..", "..", "dist");
135
+ const router = async (req, res, next) => {
136
+ try {
137
+ const origin = computeOrigin(req, opts);
138
+ const serverRequestEv = await fromNodeHttp(
139
+ getUrl(req, origin),
140
+ req,
141
+ res,
142
+ "server",
143
+ opts.getClientConn
144
+ );
145
+ const handled = await requestHandler.requestHandler(serverRequestEv, opts);
146
+ if (handled) {
147
+ const err = await handled.completion;
148
+ if (err) {
149
+ throw err;
150
+ }
151
+ if (handled.requestEv.headersSent) {
152
+ return;
153
+ }
154
+ }
155
+ next();
156
+ } catch (e) {
157
+ console.error(e);
158
+ next(e);
159
+ }
160
+ };
161
+ const notFound = async (req, res, next) => {
162
+ try {
163
+ if (!res.headersSent) {
164
+ const origin = computeOrigin(req, opts);
165
+ const url = getUrl(req, origin);
166
+ const notFoundHtml = !req.headers.accept?.includes("text/html") || requestHandler.isStaticPath(req.method || "GET", url) ? "Not Found" : requestHandler.getNotFound(url.pathname);
167
+ res.writeHead(404, {
168
+ "Content-Type": "text/html; charset=utf-8",
169
+ "X-Not-Found": url.pathname
170
+ });
171
+ res.end(notFoundHtml);
172
+ }
173
+ } catch (e) {
174
+ console.error(e);
175
+ next(e);
176
+ }
177
+ };
178
+ const staticFile = async (req, res, next) => {
179
+ try {
180
+ const origin = computeOrigin(req, opts);
181
+ const url = getUrl(req, origin);
182
+ if (requestHandler.isStaticPath(req.method || "GET", url)) {
183
+ const pathname = url.pathname;
184
+ let filePath;
185
+ if (path.basename(pathname).includes(".")) {
186
+ filePath = path.join(staticFolder, pathname);
187
+ } else if (!globalThis.__NO_TRAILING_SLASH__) {
188
+ filePath = path.join(staticFolder, pathname + "index.html");
189
+ } else {
190
+ filePath = path.join(staticFolder, pathname, "index.html");
191
+ }
192
+ const ext = path.extname(filePath).replace(/^\./, "");
193
+ const stream = fs.createReadStream(filePath);
194
+ stream.on("error", next);
195
+ const contentType = mimeTypes.MIME_TYPES[ext];
196
+ if (contentType) {
197
+ res.setHeader("Content-Type", contentType);
198
+ }
199
+ if (opts.static?.cacheControl) {
200
+ res.setHeader("Cache-Control", opts.static.cacheControl);
201
+ }
202
+ stream.pipe(res);
203
+ return;
204
+ }
205
+ return next();
206
+ } catch (e) {
207
+ console.error(e);
208
+ next(e);
209
+ }
210
+ };
211
+ return {
212
+ router,
213
+ notFound,
214
+ staticFile
215
+ };
216
+ }
217
+ const createQwikCity = createQwikRouter;
218
+ exports.createQwikCity = createQwikCity;
219
+ exports.createQwikRouter = createQwikRouter;
@@ -1,205 +1,218 @@
1
- import { setServerPlatform as R } from "@qwik.dev/core/server";
2
- import { requestHandler as b, isStaticPath as x, getNotFound as C } from "@qwik.dev/router/middleware/request-handler";
3
- import { createReadStream as k } from "node:fs";
4
- import { join as v, basename as S, extname as T } from "node:path";
5
- import { fileURLToPath as j } from "node:url";
6
- import { Http2ServerRequest as O } from "node:http2";
7
- const _ = {
8
- "3gp": "video/3gpp",
9
- "3gpp": "video/3gpp",
10
- asf: "video/x-ms-asf",
11
- asx: "video/x-ms-asf",
12
- avi: "video/x-msvideo",
13
- avif: "image/avif",
14
- bmp: "image/x-ms-bmp",
15
- css: "text/css",
16
- flv: "video/x-flv",
17
- gif: "image/gif",
18
- htm: "text/html",
19
- html: "text/html",
20
- ico: "image/x-icon",
21
- jng: "image/x-jng",
22
- jpeg: "image/jpeg",
23
- jpg: "image/jpeg",
24
- js: "application/javascript",
25
- json: "application/json",
26
- kar: "audio/midi",
27
- m4a: "audio/x-m4a",
28
- m4v: "video/x-m4v",
29
- mid: "audio/midi",
30
- midi: "audio/midi",
31
- mng: "video/x-mng",
32
- mov: "video/quicktime",
33
- mp3: "audio/mpeg",
34
- mp4: "video/mp4",
35
- mpeg: "video/mpeg",
36
- mpg: "video/mpeg",
37
- ogg: "audio/ogg",
38
- pdf: "application/pdf",
39
- png: "image/png",
40
- rar: "application/x-rar-compressed",
41
- shtml: "text/html",
42
- svg: "image/svg+xml",
43
- svgz: "image/svg+xml",
44
- tif: "image/tiff",
45
- tiff: "image/tiff",
46
- ts: "video/mp2t",
47
- txt: "text/plain",
48
- wbmp: "image/vnd.wap.wbmp",
49
- webm: "video/webm",
50
- webp: "image/webp",
51
- wmv: "video/x-ms-wmv",
52
- woff: "font/woff",
53
- woff2: "font/woff2",
54
- xml: "text/xml",
55
- zip: "application/zip"
56
- };
57
- function w(e, t) {
58
- return t?.getOrigin?.(e) ?? t?.origin ?? process.env.ORIGIN ?? A(e);
1
+ import { setServerPlatform } from "@qwik.dev/core/server";
2
+ import { isStaticPath, getNotFound, requestHandler } from "@qwik.dev/router/middleware/request-handler";
3
+ import { createReadStream } from "node:fs";
4
+ import { join, basename, extname } from "node:path";
5
+ import { fileURLToPath } from "node:url";
6
+ import { M as MIME_TYPES } from "../../chunks/mime-types.mjs";
7
+ import { Http2ServerRequest } from "node:http2";
8
+ function computeOrigin(req, opts) {
9
+ return opts?.getOrigin?.(req) ?? opts?.origin ?? process.env.ORIGIN ?? fallbackOrigin(req);
59
10
  }
60
- function A(e) {
61
- const { PROTOCOL_HEADER: t, HOST_HEADER: n } = process.env, u = e.headers, h = t && u[t] || (e.socket.encrypted || e.connection.encrypted ? "https" : "http"), o = n ?? (e instanceof O ? ":authority" : "host"), r = u[o];
62
- return `${h}://${r}`;
11
+ function fallbackOrigin(req) {
12
+ const { PROTOCOL_HEADER, HOST_HEADER } = process.env;
13
+ const headers = req.headers;
14
+ const protocol = PROTOCOL_HEADER && headers[PROTOCOL_HEADER] || (req.socket.encrypted || req.connection.encrypted ? "https" : "http");
15
+ const hostHeader = HOST_HEADER ?? (req instanceof Http2ServerRequest ? ":authority" : "host");
16
+ const host = headers[hostHeader];
17
+ return `${protocol}://${host}`;
63
18
  }
64
- function y(e, t) {
65
- return F(e.originalUrl || e.url || "/", t);
19
+ function getUrl(req, origin) {
20
+ return normalizeUrl(req.originalUrl || req.url || "/", origin);
66
21
  }
67
- function P(e = "") {
68
- return ["The stream has been destroyed", "write after end"].some((n) => e.includes(n));
22
+ function isIgnoredError(message = "") {
23
+ const ignoredErrors = ["The stream has been destroyed", "write after end"];
24
+ return ignoredErrors.some((ignored) => message.includes(ignored));
69
25
  }
70
- const H = /^:(method|scheme|authority|path)$/i;
71
- function F(e, t) {
72
- const n = /\/\/|\\\\/g;
73
- return new URL(e.replace(n, "/"), t);
26
+ const invalidHeadersPattern = /^:(method|scheme|authority|path)$/i;
27
+ function normalizeUrl(url, base) {
28
+ const DOUBLE_SLASH_REG = /\/\/|\\\\/g;
29
+ return new URL(url.replace(DOUBLE_SLASH_REG, "/"), base);
74
30
  }
75
- async function L(e, t, n, u, h) {
76
- const o = new Headers(), r = t.headers;
31
+ async function fromNodeHttp(url, req, res, mode, getClientConn) {
32
+ const requestHeaders = new Headers();
33
+ const nodeRequestHeaders = req.headers;
77
34
  try {
78
- for (const [a, l] of Object.entries(r))
79
- if (!H.test(a)) {
80
- if (typeof l == "string")
81
- o.set(a, l);
82
- else if (Array.isArray(l))
83
- for (const f of l)
84
- o.append(a, f);
35
+ for (const [key, value] of Object.entries(nodeRequestHeaders)) {
36
+ if (invalidHeadersPattern.test(key)) {
37
+ continue;
38
+ }
39
+ if (typeof value === "string") {
40
+ requestHeaders.set(key, value);
41
+ } else if (Array.isArray(value)) {
42
+ for (const v of value) {
43
+ requestHeaders.append(key, v);
44
+ }
85
45
  }
86
- } catch (a) {
87
- console.error(a);
46
+ }
47
+ } catch (err) {
48
+ console.error(err);
88
49
  }
89
- const m = async function* () {
90
- for await (const a of t)
91
- yield a;
92
- }, i = t.method === "HEAD" || t.method === "GET" ? void 0 : m(), c = new AbortController(), s = {
93
- method: t.method,
94
- headers: o,
95
- body: i,
96
- signal: c.signal,
50
+ const getRequestBody = async function* () {
51
+ for await (const chunk of req) {
52
+ yield chunk;
53
+ }
54
+ };
55
+ const body = req.method === "HEAD" || req.method === "GET" ? void 0 : getRequestBody();
56
+ const controller = new AbortController();
57
+ const options = {
58
+ method: req.method,
59
+ headers: requestHeaders,
60
+ body,
61
+ signal: controller.signal,
97
62
  duplex: "half"
98
63
  };
99
- return n.on("close", () => {
100
- c.abort();
101
- }), {
102
- mode: u,
103
- url: e,
104
- request: new Request(e.href, s),
64
+ res.on("close", () => {
65
+ controller.abort();
66
+ });
67
+ const serverRequestEv = {
68
+ mode,
69
+ url,
70
+ request: new Request(url.href, options),
105
71
  env: {
106
- get(a) {
107
- return process.env[a];
72
+ get(key) {
73
+ return process.env[key];
108
74
  }
109
75
  },
110
- getWritableStream: (a, l, f) => {
111
- n.statusCode = a;
76
+ getWritableStream: (status, headers, cookies) => {
77
+ res.statusCode = status;
112
78
  try {
113
- for (const [g, E] of l)
114
- H.test(g) || n.setHeader(g, E);
115
- const p = f.headers();
116
- p.length > 0 && n.setHeader("Set-Cookie", p);
117
- } catch (p) {
118
- console.error(p);
79
+ for (const [key, value] of headers) {
80
+ if (invalidHeadersPattern.test(key)) {
81
+ continue;
82
+ }
83
+ res.setHeader(key, value);
84
+ }
85
+ const cookieHeaders = cookies.headers();
86
+ if (cookieHeaders.length > 0) {
87
+ res.setHeader("Set-Cookie", cookieHeaders);
88
+ }
89
+ } catch (err) {
90
+ console.error(err);
119
91
  }
120
92
  return new WritableStream({
121
- write(p) {
122
- n.closed || n.destroyed || n.write(p, (g) => {
123
- g && !P(g.message) && console.error(g);
93
+ write(chunk) {
94
+ if (res.closed || res.destroyed) {
95
+ return;
96
+ }
97
+ res.write(chunk, (error) => {
98
+ if (error && !isIgnoredError(error.message)) {
99
+ console.error(error);
100
+ }
124
101
  });
125
102
  },
126
103
  close() {
127
- n.end();
104
+ res.end();
128
105
  }
129
106
  });
130
107
  },
131
- getClientConn: () => h ? h(t) : {
132
- ip: t.socket.remoteAddress
108
+ getClientConn: () => {
109
+ return getClientConn ? getClientConn(req) : {
110
+ ip: req.socket.remoteAddress
111
+ };
133
112
  },
134
113
  platform: {
135
- ssr: !0,
136
- incomingMessage: t,
114
+ ssr: true,
115
+ incomingMessage: req,
137
116
  node: process.versions.node
138
117
  // Weirdly needed to make typecheck of insights happy
139
118
  },
140
119
  locale: void 0
141
120
  };
121
+ return serverRequestEv;
142
122
  }
143
- function N(e) {
144
- e.qwikCityPlan && !e.qwikRouterConfig && (console.warn("qwikCityPlan is deprecated. Simply remove it."), e.qwikRouterConfig = e.qwikCityPlan), e.manifest && R(e.manifest);
145
- const t = e.static?.root ?? v(j(import.meta.url), "..", "..", "dist");
146
- return {
147
- router: async (o, r, m) => {
148
- try {
149
- const i = w(o, e), c = await L(
150
- y(o, i),
151
- o,
152
- r,
153
- "server",
154
- e.getClientConn
155
- ), s = await b(c, e);
156
- if (s) {
157
- const d = await s.completion;
158
- if (d)
159
- throw d;
160
- if (s.requestEv.headersSent)
161
- return;
123
+ function createQwikRouter(opts) {
124
+ if (opts.qwikCityPlan && !opts.qwikRouterConfig) {
125
+ console.warn("qwikCityPlan is deprecated. Simply remove it.");
126
+ opts.qwikRouterConfig = opts.qwikCityPlan;
127
+ }
128
+ if (opts.manifest) {
129
+ setServerPlatform(opts.manifest);
130
+ }
131
+ const staticFolder = opts.static?.root ?? join(fileURLToPath(import.meta.url), "..", "..", "dist");
132
+ const router = async (req, res, next) => {
133
+ try {
134
+ const origin = computeOrigin(req, opts);
135
+ const serverRequestEv = await fromNodeHttp(
136
+ getUrl(req, origin),
137
+ req,
138
+ res,
139
+ "server",
140
+ opts.getClientConn
141
+ );
142
+ const handled = await requestHandler(serverRequestEv, opts);
143
+ if (handled) {
144
+ const err = await handled.completion;
145
+ if (err) {
146
+ throw err;
162
147
  }
163
- m();
164
- } catch (i) {
165
- console.error(i), m(i);
166
- }
167
- },
168
- notFound: async (o, r, m) => {
169
- try {
170
- if (!r.headersSent) {
171
- const i = w(o, e), c = y(o, i), s = !o.headers.accept?.includes("text/html") || x(o.method || "GET", c) ? "Not Found" : C(c.pathname);
172
- r.writeHead(404, {
173
- "Content-Type": "text/html; charset=utf-8",
174
- "X-Not-Found": c.pathname
175
- }), r.end(s);
148
+ if (handled.requestEv.headersSent) {
149
+ return;
176
150
  }
177
- } catch (i) {
178
- console.error(i), m(i);
179
151
  }
180
- },
181
- staticFile: async (o, r, m) => {
182
- try {
183
- const i = w(o, e), c = y(o, i);
184
- if (x(o.method || "GET", c)) {
185
- const s = c.pathname;
186
- let d;
187
- S(s).includes(".") ? d = v(t, s) : globalThis.__NO_TRAILING_SLASH__ ? d = v(t, s, "index.html") : d = v(t, s + "index.html");
188
- const a = T(d).replace(/^\./, ""), l = k(d);
189
- l.on("error", m);
190
- const f = _[a];
191
- f && r.setHeader("Content-Type", f), e.static?.cacheControl && r.setHeader("Cache-Control", e.static.cacheControl), l.pipe(r);
192
- return;
152
+ next();
153
+ } catch (e) {
154
+ console.error(e);
155
+ next(e);
156
+ }
157
+ };
158
+ const notFound = async (req, res, next) => {
159
+ try {
160
+ if (!res.headersSent) {
161
+ const origin = computeOrigin(req, opts);
162
+ const url = getUrl(req, origin);
163
+ const notFoundHtml = !req.headers.accept?.includes("text/html") || isStaticPath(req.method || "GET", url) ? "Not Found" : getNotFound(url.pathname);
164
+ res.writeHead(404, {
165
+ "Content-Type": "text/html; charset=utf-8",
166
+ "X-Not-Found": url.pathname
167
+ });
168
+ res.end(notFoundHtml);
169
+ }
170
+ } catch (e) {
171
+ console.error(e);
172
+ next(e);
173
+ }
174
+ };
175
+ const staticFile = async (req, res, next) => {
176
+ try {
177
+ const origin = computeOrigin(req, opts);
178
+ const url = getUrl(req, origin);
179
+ if (isStaticPath(req.method || "GET", url)) {
180
+ const pathname = url.pathname;
181
+ let filePath;
182
+ if (basename(pathname).includes(".")) {
183
+ filePath = join(staticFolder, pathname);
184
+ } else if (!globalThis.__NO_TRAILING_SLASH__) {
185
+ filePath = join(staticFolder, pathname + "index.html");
186
+ } else {
187
+ filePath = join(staticFolder, pathname, "index.html");
188
+ }
189
+ const ext = extname(filePath).replace(/^\./, "");
190
+ const stream = createReadStream(filePath);
191
+ stream.on("error", next);
192
+ const contentType = MIME_TYPES[ext];
193
+ if (contentType) {
194
+ res.setHeader("Content-Type", contentType);
193
195
  }
194
- return m();
195
- } catch (i) {
196
- console.error(i), m(i);
196
+ if (opts.static?.cacheControl) {
197
+ res.setHeader("Cache-Control", opts.static.cacheControl);
198
+ }
199
+ stream.pipe(res);
200
+ return;
197
201
  }
202
+ return next();
203
+ } catch (e) {
204
+ console.error(e);
205
+ next(e);
198
206
  }
199
207
  };
208
+ return {
209
+ router,
210
+ notFound,
211
+ staticFile
212
+ };
200
213
  }
201
- const $ = N;
214
+ const createQwikCity = createQwikRouter;
202
215
  export {
203
- $ as createQwikCity,
204
- N as createQwikRouter
216
+ createQwikCity,
217
+ createQwikRouter
205
218
  };