@lomray/vite-ssr-boost 8.0.0-beta.1 → 8.0.0-beta.3

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 (208) hide show
  1. package/README.md +2 -1
  2. package/adapters/body.d.ts +1 -1
  3. package/adapters/body.js +1 -1
  4. package/adapters/body.js.map +1 -1
  5. package/adapters/compression.d.ts +5 -5
  6. package/adapters/compression.js +1 -1
  7. package/adapters/compression.js.map +1 -1
  8. package/adapters/edge.d.ts +5 -5
  9. package/adapters/edge.js.map +1 -1
  10. package/adapters/express/create-request.d.ts +2 -2
  11. package/adapters/express/create-request.js.map +1 -1
  12. package/adapters/express/entry.d.ts +17 -19
  13. package/adapters/express/entry.js.map +1 -1
  14. package/adapters/express/prepare-server.d.ts +7 -25
  15. package/adapters/express/prepare-server.js +1 -1
  16. package/adapters/express/prepare-server.js.map +1 -1
  17. package/adapters/express/render.d.ts +14 -15
  18. package/adapters/express/render.js +1 -1
  19. package/adapters/express/render.js.map +1 -1
  20. package/adapters/express/server.d.ts +5 -6
  21. package/adapters/express/server.js +1 -1
  22. package/adapters/express/server.js.map +1 -1
  23. package/adapters/express.d.ts +5 -5
  24. package/adapters/express.js.map +1 -1
  25. package/adapters/fastify.d.ts +5 -5
  26. package/adapters/fastify.js +1 -1
  27. package/adapters/fastify.js.map +1 -1
  28. package/adapters/hono.d.ts +2 -2
  29. package/adapters/hono.js.map +1 -1
  30. package/adapters/node.d.ts +6 -5
  31. package/adapters/node.js.map +1 -1
  32. package/browser/entry.d.ts +9 -9
  33. package/browser/entry.js +1 -1
  34. package/browser/entry.js.map +1 -1
  35. package/cli/build.d.ts +2 -2
  36. package/cli/build.js.map +1 -1
  37. package/cli/helpers/keyboard-input.d.ts +1 -1
  38. package/cli/helpers/keyboard-input.js +1 -1
  39. package/cli/helpers/keyboard-input.js.map +1 -1
  40. package/cli/helpers/vite-reset-cache.d.ts +1 -1
  41. package/cli/helpers/vite-reset-cache.js.map +1 -1
  42. package/cli/interfaces/actions.d.ts +8 -9
  43. package/cli/run-amplify-build.d.ts +1 -1
  44. package/cli/run-amplify-build.js.map +1 -1
  45. package/cli/run-dev.d.ts +3 -4
  46. package/cli/run-dev.js.map +1 -1
  47. package/cli/run-docker-build.d.ts +2 -2
  48. package/cli/run-docker-build.js.map +1 -1
  49. package/cli/run-prod.d.ts +4 -5
  50. package/cli/run-prod.js.map +1 -1
  51. package/cli/run-serverless.d.ts +2 -2
  52. package/cli/run-serverless.js.map +1 -1
  53. package/cli/run-vercel-build.d.ts +1 -1
  54. package/cli/run-vercel-build.js.map +1 -1
  55. package/cli.js +1 -1
  56. package/cli.js.map +1 -1
  57. package/components/navigate.d.ts +3 -3
  58. package/components/navigate.js.map +1 -1
  59. package/components/only-client.d.ts +2 -2
  60. package/components/only-client.js +1 -1
  61. package/components/only-client.js.map +1 -1
  62. package/components/render-client.d.ts +4 -4
  63. package/components/render-client.js +1 -1
  64. package/components/render-client.js.map +1 -1
  65. package/components/response-status.d.ts +2 -2
  66. package/components/response-status.js.map +1 -1
  67. package/components/scroll-to-top.d.ts +2 -2
  68. package/components/scroll-to-top.js +1 -1
  69. package/components/scroll-to-top.js.map +1 -1
  70. package/components/with-suspense.d.ts +3 -3
  71. package/components/with-suspense.js.map +1 -1
  72. package/constants/cli-actions.d.ts +1 -1
  73. package/constants/cli-actions.js.map +1 -1
  74. package/constants/cli-context.d.ts +4 -5
  75. package/constants/cli-context.js.map +1 -1
  76. package/constants/cli-name.d.ts +1 -1
  77. package/constants/cli-name.js.map +1 -1
  78. package/constants/cli-shortcuts.d.ts +2 -2
  79. package/constants/cli-shortcuts.js +1 -1
  80. package/constants/cli-shortcuts.js.map +1 -1
  81. package/constants/common.js.map +1 -1
  82. package/constants/plugin-name.d.ts +1 -1
  83. package/constants/plugin-name.js.map +1 -1
  84. package/constants/stream-error.d.ts +1 -1
  85. package/constants/stream-error.js.map +1 -1
  86. package/context/server.d.ts +3 -4
  87. package/context/server.js.map +1 -1
  88. package/core/compose-html.d.ts +2 -2
  89. package/core/compose-html.js.map +1 -1
  90. package/core/early-hints.d.ts +2 -2
  91. package/core/early-hints.js.map +1 -1
  92. package/core/handler.d.ts +3 -3
  93. package/core/handler.js.map +1 -1
  94. package/core/head-response.d.ts +1 -1
  95. package/core/head-response.js.map +1 -1
  96. package/core/headers.d.ts +3 -4
  97. package/core/headers.js +1 -1
  98. package/core/headers.js.map +1 -1
  99. package/core/render.d.ts +13 -13
  100. package/core/render.js +1 -1
  101. package/core/render.js.map +1 -1
  102. package/core/transform-html.d.ts +1 -1
  103. package/core/transform-html.js.map +1 -1
  104. package/core/types.d.ts +2 -3
  105. package/edge/render-to-stream.d.ts +2 -2
  106. package/edge/render-to-stream.js +1 -1
  107. package/edge/render-to-stream.js.map +1 -1
  108. package/helpers/build-custom-state.d.ts +1 -1
  109. package/helpers/build-custom-state.js +1 -1
  110. package/helpers/build-custom-state.js.map +1 -1
  111. package/helpers/build-router-state.d.ts +2 -2
  112. package/helpers/build-router-state.js.map +1 -1
  113. package/helpers/create-focus-only.d.ts +3 -3
  114. package/helpers/create-focus-only.js.map +1 -1
  115. package/helpers/dev-marker.d.ts +1 -1
  116. package/helpers/dev-marker.js.map +1 -1
  117. package/helpers/get-server-state.d.ts +1 -1
  118. package/helpers/get-server-state.js.map +1 -1
  119. package/helpers/html-escape.d.ts +1 -1
  120. package/helpers/html-escape.js +1 -1
  121. package/helpers/html-escape.js.map +1 -1
  122. package/helpers/import-route.d.ts +7 -7
  123. package/helpers/import-route.js +1 -1
  124. package/helpers/import-route.js.map +1 -1
  125. package/helpers/is-route-file.d.ts +1 -1
  126. package/helpers/is-route-file.js.map +1 -1
  127. package/helpers/obtain-stream-error.d.ts +3 -3
  128. package/helpers/obtain-stream-error.js.map +1 -1
  129. package/helpers/plugin-config.d.ts +5 -5
  130. package/helpers/plugin-config.js +1 -1
  131. package/helpers/plugin-config.js.map +1 -1
  132. package/helpers/print-server-info.d.ts +3 -4
  133. package/helpers/print-server-info.js +1 -1
  134. package/helpers/print-server-info.js.map +1 -1
  135. package/helpers/print-server-urls.d.ts +2 -2
  136. package/helpers/print-server-urls.js +1 -1
  137. package/helpers/print-server-urls.js.map +1 -1
  138. package/helpers/process-stop.d.ts +1 -1
  139. package/helpers/process-stop.js.map +1 -1
  140. package/helpers/resolve-server-urls.d.ts +3 -4
  141. package/helpers/resolve-server-urls.js +1 -1
  142. package/helpers/resolve-server-urls.js.map +1 -1
  143. package/helpers/serialize-errors.d.ts +2 -2
  144. package/helpers/serialize-errors.js.map +1 -1
  145. package/helpers/vite-aliases.d.ts +2 -2
  146. package/helpers/vite-aliases.js +1 -1
  147. package/helpers/vite-aliases.js.map +1 -1
  148. package/interfaces/fc-route.d.ts +4 -4
  149. package/interfaces/fc-route.js.map +1 -1
  150. package/interfaces/fc.d.ts +3 -4
  151. package/interfaces/route-object.d.ts +6 -6
  152. package/node/compress-response.d.ts +2 -2
  153. package/node/compress-response.js +1 -1
  154. package/node/compress-response.js.map +1 -1
  155. package/node/create-headers.d.ts +1 -1
  156. package/node/create-headers.js.map +1 -1
  157. package/node/create-request.d.ts +2 -2
  158. package/node/create-request.js.map +1 -1
  159. package/node/http.d.ts +4 -6
  160. package/node/render-to-stream.d.ts +2 -2
  161. package/node/render-to-stream.js +1 -1
  162. package/node/render-to-stream.js.map +1 -1
  163. package/node/request-signal.d.ts +2 -2
  164. package/node/request-signal.js.map +1 -1
  165. package/node/split-link-header.d.ts +1 -1
  166. package/node/split-link-header.js.map +1 -1
  167. package/node/write-early-hints.d.ts +2 -2
  168. package/node/write-early-hints.js.map +1 -1
  169. package/node/write-fetch-response.d.ts +3 -2
  170. package/node/write-fetch-response.js +1 -1
  171. package/node/write-fetch-response.js.map +1 -1
  172. package/package.json +52 -32
  173. package/plugin.d.ts +7 -7
  174. package/plugin.js +1 -1
  175. package/plugin.js.map +1 -1
  176. package/plugins/create-spa-index.d.ts +3 -3
  177. package/plugins/create-spa-index.js.map +1 -1
  178. package/plugins/handle-custom-entrypoint.d.ts +4 -4
  179. package/plugins/handle-custom-entrypoint.js +1 -1
  180. package/plugins/handle-custom-entrypoint.js.map +1 -1
  181. package/plugins/make-aliases.d.ts +3 -3
  182. package/plugins/make-aliases.js +1 -1
  183. package/plugins/make-aliases.js.map +1 -1
  184. package/plugins/normalize-route.d.ts +3 -3
  185. package/plugins/normalize-route.js.map +1 -1
  186. package/plugins/optimize-browser-dependencies.d.ts +6 -0
  187. package/plugins/optimize-browser-dependencies.js +2 -0
  188. package/plugins/optimize-browser-dependencies.js.map +1 -0
  189. package/services/build.d.ts +5 -51
  190. package/services/build.js +1 -1
  191. package/services/build.js.map +1 -1
  192. package/services/logger.d.ts +2 -30
  193. package/services/logger.js.map +1 -1
  194. package/services/parse-routes.d.ts +5 -42
  195. package/services/parse-routes.js +1 -1
  196. package/services/parse-routes.js.map +1 -1
  197. package/services/path-normalize.d.ts +3 -18
  198. package/services/path-normalize.js +1 -1
  199. package/services/path-normalize.js.map +1 -1
  200. package/services/server-api.d.ts +1 -7
  201. package/services/server-api.js.map +1 -1
  202. package/services/server-config.d.ts +4 -48
  203. package/services/server-config.js +1 -1
  204. package/services/server-config.js.map +1 -1
  205. package/services/ssr-manifest.d.ts +6 -63
  206. package/services/ssr-manifest.js +1 -1
  207. package/services/ssr-manifest.js.map +1 -1
  208. package/workflow/Dockerfile +1 -1
package/README.md CHANGED
@@ -35,7 +35,8 @@ It is built for applications that want to keep Vite and React Router visible, bu
35
35
  npm i @lomray/vite-ssr-boost
36
36
  ```
37
37
 
38
- Use Node 22 or newer. Start with the [React template](https://github.com/Lomray-Software/vite-template):
38
+ Requires Node 22.12+. Your React Router and Babel versions may require a newer Node release.
39
+ Start with the [React template](https://github.com/Lomray-Software/vite-template):
39
40
 
40
41
  ```bash
41
42
  git clone https://github.com/Lomray-Software/vite-template.git
@@ -2,4 +2,4 @@
2
2
  * Reconstruct supported parsed bodies while preserving native Fetch body values.
3
3
  */
4
4
  declare const serializeBody: (body: unknown, contentType?: string) => BodyInit | null;
5
- export { serializeBody as default };
5
+ export default serializeBody;
package/adapters/body.js CHANGED
@@ -1,2 +1,2 @@
1
- const e=(e,r="")=>{if(null==e)return null;if("string"==typeof e||e instanceof URLSearchParams||e instanceof Blob||e instanceof FormData||e instanceof ReadableStream||e instanceof ArrayBuffer||ArrayBuffer.isView(e))return e;const n=r.split(";")[0]?.trim().toLowerCase();if("application/x-www-form-urlencoded"===n)return(e=>{const r=new URLSearchParams;return Object.entries(e).forEach((([e,n])=>{(Array.isArray(n)?n:[n]).forEach((n=>{if(null!=n&&!["string","number","boolean","bigint"].includes(typeof n))throw new TypeError("Cannot serialize nested or non-primitive URL-encoded fields. Provide the adapter getBody option.");r.append(e,null==n?"":String(n))}))})),r})(e);if(!n||"application/json"===n||n.endsWith("+json"))return JSON.stringify(e);throw new TypeError(`Cannot serialize a parsed ${n} body. Provide the adapter getBody option.`)};export{e as default};
1
+ const e=(e,r="")=>{if(null==e)return null;if("string"==typeof e||e instanceof URLSearchParams||e instanceof Blob||e instanceof FormData||e instanceof ReadableStream||e instanceof ArrayBuffer||ArrayBuffer.isView(e))return e;const n=r.split(";")[0]?.trim().toLowerCase();if("application/x-www-form-urlencoded"===n)return(e=>{const r=new URLSearchParams;return Object.entries(e).forEach(([e,n])=>{(Array.isArray(n)?n:[n]).forEach(n=>{if(null!=n&&!["string","number","boolean","bigint"].includes(typeof n))throw new TypeError("Cannot serialize nested or non-primitive URL-encoded fields. Provide the adapter getBody option.");r.append(e,null==n?"":String(n))})}),r})(e);if(!n||"application/json"===n||n.endsWith("+json"))return JSON.stringify(e);throw new TypeError(`Cannot serialize a parsed ${n} body. Provide the adapter getBody option.`)};export{e as default};
2
2
  //# sourceMappingURL=body.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"body.js","sources":["../../src/adapters/body.ts"],"sourcesContent":["/**\n * Serialize flat form fields without silently flattening nested parser output.\n */\nconst serializeForm = (body: Record<string, unknown>): URLSearchParams => {\n const form = new URLSearchParams();\n\n Object.entries(body).forEach(([name, value]) => {\n const values = Array.isArray(value) ? value : [value];\n\n values.forEach((item) => {\n if (item != null && !['string', 'number', 'boolean', 'bigint'].includes(typeof item)) {\n throw new TypeError(\n 'Cannot serialize nested or non-primitive URL-encoded fields. Provide the adapter getBody option.',\n );\n }\n\n form.append(name, item == null ? '' : String(item));\n });\n });\n\n return form;\n};\n\n/**\n * Reconstruct supported parsed bodies while preserving native Fetch body values.\n */\nconst serializeBody = (body: unknown, contentType = ''): BodyInit | null => {\n if (body == null) {\n return null;\n }\n\n if (\n typeof body === 'string' ||\n body instanceof URLSearchParams ||\n body instanceof Blob ||\n body instanceof FormData ||\n body instanceof ReadableStream ||\n body instanceof ArrayBuffer ||\n ArrayBuffer.isView(body)\n ) {\n return body as BodyInit;\n }\n\n const mediaType = contentType.split(';')[0]?.trim().toLowerCase();\n\n if (mediaType === 'application/x-www-form-urlencoded') {\n return serializeForm(body as Record<string, unknown>);\n }\n\n if (!mediaType || mediaType === 'application/json' || mediaType.endsWith('+json')) {\n return JSON.stringify(body);\n }\n\n throw new TypeError(\n `Cannot serialize a parsed ${mediaType} body. Provide the adapter getBody option.`,\n );\n};\n\nexport default serializeBody;\n"],"names":["serializeBody","body","contentType","URLSearchParams","Blob","FormData","ReadableStream","ArrayBuffer","isView","mediaType","split","trim","toLowerCase","form","Object","entries","forEach","name","value","Array","isArray","item","includes","TypeError","append","String","serializeForm","endsWith","JSON","stringify"],"mappings":"AAGA,MAuBMA,EAAgB,CAACC,EAAeC,EAAc,MAClD,GAAY,MAARD,EACF,OAAO,KAGT,GACkB,iBAATA,GACPA,aAAgBE,iBAChBF,aAAgBG,MAChBH,aAAgBI,UAChBJ,aAAgBK,gBAChBL,aAAgBM,aAChBA,YAAYC,OAAOP,GAEnB,OAAOA,EAGT,MAAMQ,EAAYP,EAAYQ,MAAM,KAAK,IAAIC,OAAOC,cAEpD,GAAkB,sCAAdH,EACF,MA3CkB,CAACR,IACrB,MAAMY,EAAO,IAAIV,gBAgBjB,OAdAW,OAAOC,QAAQd,GAAMe,SAAQ,EAAEC,EAAMC,OACpBC,MAAMC,QAAQF,GAASA,EAAQ,CAACA,IAExCF,SAASK,IACd,GAAY,MAARA,IAAiB,CAAC,SAAU,SAAU,UAAW,UAAUC,gBAAgBD,GAC7E,MAAM,IAAIE,UACR,oGAIJV,EAAKW,OAAOP,EAAc,MAARI,EAAe,GAAKI,OAAOJ,GAAM,GACnD,IAGGR,CAAI,EA0BFa,CAAczB,GAGvB,IAAKQ,GAA2B,qBAAdA,GAAoCA,EAAUkB,SAAS,SACvE,OAAOC,KAAKC,UAAU5B,GAGxB,MAAM,IAAIsB,UACR,6BAA6Bd,8CAC9B"}
1
+ {"version":3,"file":"body.js","sources":["../../src/adapters/body.ts"],"sourcesContent":[null],"names":["serializeBody","body","contentType","URLSearchParams","Blob","FormData","ReadableStream","ArrayBuffer","isView","mediaType","split","trim","toLowerCase","form","Object","entries","forEach","name","value","Array","isArray","item","includes","TypeError","append","String","serializeForm","endsWith","JSON","stringify"],"mappings":"AAGA,MAuBMA,EAAgB,CAACC,EAAeC,EAAc,MAClD,GAAY,MAARD,EACF,OAAO,KAGT,GACkB,iBAATA,GACPA,aAAgBE,iBAChBF,aAAgBG,MAChBH,aAAgBI,UAChBJ,aAAgBK,gBAChBL,aAAgBM,aAChBA,YAAYC,OAAOP,GAEnB,OAAOA,EAGT,MAAMQ,EAAYP,EAAYQ,MAAM,KAAK,IAAIC,OAAOC,cAEpD,GAAkB,sCAAdH,EACF,MA3CkB,CAACR,IACrB,MAAMY,EAAO,IAAIV,gBAgBjB,OAdAW,OAAOC,QAAQd,GAAMe,QAAQ,EAAEC,EAAMC,OACpBC,MAAMC,QAAQF,GAASA,EAAQ,CAACA,IAExCF,QAASK,IACd,GAAY,MAARA,IAAiB,CAAC,SAAU,SAAU,UAAW,UAAUC,gBAAgBD,GAC7E,MAAM,IAAIE,UACR,oGAIJV,EAAKW,OAAOP,EAAc,MAARI,EAAe,GAAKI,OAAOJ,QAI1CR,GA0BEa,CAAczB,GAGvB,IAAKQ,GAA2B,qBAAdA,GAAoCA,EAAUkB,SAAS,SACvE,OAAOC,KAAKC,UAAU5B,GAGxB,MAAM,IAAIsB,UACR,6BAA6Bd"}
@@ -1,11 +1,11 @@
1
- type TCompressionFormat = 'deflate' | 'gzip';
2
- interface ICompressionOptions {
1
+ export type TCompressionFormat = 'deflate' | 'gzip';
2
+ export interface ICompressionOptions {
3
3
  format?: TCompressionFormat;
4
4
  }
5
- type TCompression = boolean | ICompressionOptions;
6
- type TCreateCompressionStream = (format: TCompressionFormat) => ReadableWritablePair<Uint8Array, Uint8Array>;
5
+ export type TCompression = boolean | ICompressionOptions;
6
+ type TCreateCompressionStream = (format: TCompressionFormat) => ReadableWritablePair<Uint8Array, BufferSource>;
7
7
  /**
8
8
  * Compress eligible responses using the transport-provided stream implementation.
9
9
  */
10
10
  declare const compressResponse: (request: Request, response: Response, compression?: TCompression, createStream?: TCreateCompressionStream) => Response;
11
- export { compressResponse as default, TCompressionFormat, ICompressionOptions, TCompression };
11
+ export default compressResponse;
@@ -1,2 +1,2 @@
1
- const t=(t,e)=>{const s=new Map;return t.split(",").forEach((t=>{const[e="",...a]=t.trim().toLowerCase().split(";"),n=a.find((t=>t.trim().startsWith("q="))),o=n?Number(n.split("=")[1]):1;s.set(e,Number.isFinite(o)?o:0)})),s.get(e)??s.get("*")??0},e=(e,s,a=!1,n=(t=>new CompressionStream(t)))=>{if(!a||!s.body||s.bodyUsed||"HEAD"===e.method||s.status<200||[204,205,206,304].includes(s.status)||s.headers.has("Content-Encoding")||s.headers.has("Content-Range")||s.headers.get("Cache-Control")?.toLowerCase().includes("no-transform")||"function"!=typeof CompressionStream)return s;const o=e.headers.get("Accept-Encoding")??"",r="object"==typeof a?a.format:void 0,i=new Headers(s.headers),d=(r?[r]:["gzip","deflate"]).map((e=>({candidate:e,quality:t(o,e)}))).filter((({quality:t})=>t>0)).sort(((t,e)=>e.quality-t.quality))[0]?.candidate;return((t,e)=>{const s=t.get("Vary")?.split(",").map((t=>t.trim().toLowerCase()))??[];s.includes("*")||s.includes(e.toLowerCase())||t.append("Vary",e)})(i,"Accept-Encoding"),d?(i.delete("Content-Length"),i.set("Content-Encoding",d),new Response(s.body.pipeThrough(n(d)),{headers:i,status:s.status,statusText:s.statusText})):new Response(s.body,{headers:i,status:s.status,statusText:s.statusText})};export{e as default};
1
+ const t=(t,e)=>{const s=new Map;return t.split(",").forEach(t=>{const[e="",...a]=t.trim().toLowerCase().split(";"),n=a.find(t=>t.trim().startsWith("q=")),o=n?Number(n.split("=")[1]):1;s.set(e,Number.isFinite(o)?o:0)}),s.get(e)??s.get("*")??0},e=(e,s,a=!1,n=t=>new CompressionStream(t))=>{if(!a||!s.body||s.bodyUsed||"HEAD"===e.method||s.status<200||[204,205,206,304].includes(s.status)||s.headers.has("Content-Encoding")||s.headers.has("Content-Range")||s.headers.get("Cache-Control")?.toLowerCase().includes("no-transform")||"function"!=typeof CompressionStream)return s;const o=e.headers.get("Accept-Encoding")??"",r="object"==typeof a?a.format:void 0,i=new Headers(s.headers),d=(r?[r]:["gzip","deflate"]).map(e=>({candidate:e,quality:t(o,e)})).filter(({quality:t})=>t>0).sort((t,e)=>e.quality-t.quality)[0]?.candidate;return((t,e)=>{const s=t.get("Vary")?.split(",").map(t=>t.trim().toLowerCase())??[];s.includes("*")||s.includes(e.toLowerCase())||t.append("Vary",e)})(i,"Accept-Encoding"),d?(i.delete("Content-Length"),i.set("Content-Encoding",d),new Response(s.body.pipeThrough(n(d)),{headers:i,status:s.status,statusText:s.statusText})):new Response(s.body,{headers:i,status:s.status,statusText:s.statusText})};export{e as default};
2
2
  //# sourceMappingURL=compression.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"compression.js","sources":["../../src/adapters/compression.ts"],"sourcesContent":["export type TCompressionFormat = 'deflate' | 'gzip';\n\nexport interface ICompressionOptions {\n format?: TCompressionFormat;\n}\n\nexport type TCompression = boolean | ICompressionOptions;\n\ntype TCreateCompressionStream = (\n format: TCompressionFormat,\n) => ReadableWritablePair<Uint8Array, Uint8Array>;\n\n/**\n * Read the negotiated encoding quality, including wildcard fallbacks.\n */\nconst getQuality = (header: string, format: TCompressionFormat): number => {\n const values = new Map<string, number>();\n\n header.split(',').forEach((part) => {\n const [encoding = '', ...params] = part.trim().toLowerCase().split(';');\n const quality = params.find((param) => param.trim().startsWith('q='));\n const parsed = quality ? Number(quality.split('=')[1]) : 1;\n\n values.set(encoding, Number.isFinite(parsed) ? parsed : 0);\n });\n\n return values.get(format) ?? values.get('*') ?? 0;\n};\n\n/**\n * Include the negotiation header without duplicating existing Vary values.\n */\nconst appendVary = (headers: Headers, value: string): void => {\n const vary =\n headers\n .get('Vary')\n ?.split(',')\n .map((item) => item.trim().toLowerCase()) ?? [];\n\n if (!vary.includes('*') && !vary.includes(value.toLowerCase())) {\n headers.append('Vary', value);\n }\n};\n\n/**\n * Compress eligible responses using the transport-provided stream implementation.\n */\nconst compressResponse = (\n request: Request,\n response: Response,\n compression: TCompression = false,\n createStream: TCreateCompressionStream = (format) => new CompressionStream(format),\n): Response => {\n if (\n !compression ||\n !response.body ||\n response.bodyUsed ||\n request.method === 'HEAD' ||\n response.status < 200 ||\n [204, 205, 206, 304].includes(response.status) ||\n response.headers.has('Content-Encoding') ||\n response.headers.has('Content-Range') ||\n response.headers.get('Cache-Control')?.toLowerCase().includes('no-transform') ||\n typeof CompressionStream !== 'function'\n ) {\n return response;\n }\n\n const acceptEncoding = request.headers.get('Accept-Encoding') ?? '';\n const configured = typeof compression === 'object' ? compression.format : undefined;\n const headers = new Headers(response.headers);\n const format = (configured ? [configured] : (['gzip', 'deflate'] as const))\n .map((candidate) => ({ candidate, quality: getQuality(acceptEncoding, candidate) }))\n .filter(({ quality }) => quality > 0)\n .sort((left, right) => right.quality - left.quality)[0]?.candidate;\n\n appendVary(headers, 'Accept-Encoding');\n\n if (!format) {\n return new Response(response.body, {\n headers,\n status: response.status,\n statusText: response.statusText,\n });\n }\n\n headers.delete('Content-Length');\n headers.set('Content-Encoding', format);\n\n return new Response(response.body.pipeThrough(createStream(format)), {\n headers,\n status: response.status,\n statusText: response.statusText,\n });\n};\n\nexport default compressResponse;\n"],"names":["getQuality","header","format","values","Map","split","forEach","part","encoding","params","trim","toLowerCase","quality","find","param","startsWith","parsed","Number","set","isFinite","get","compressResponse","request","response","compression","createStream","CompressionStream","body","bodyUsed","method","status","includes","headers","has","acceptEncoding","configured","undefined","Headers","map","candidate","filter","sort","left","right","value","vary","item","append","appendVary","delete","Response","pipeThrough","statusText"],"mappings":"AAeA,MAAMA,EAAa,CAACC,EAAgBC,KAClC,MAAMC,EAAS,IAAIC,IAUnB,OARAH,EAAOI,MAAM,KAAKC,SAASC,IACzB,MAAOC,EAAW,MAAOC,GAAUF,EAAKG,OAAOC,cAAcN,MAAM,KAC7DO,EAAUH,EAAOI,MAAMC,GAAUA,EAAMJ,OAAOK,WAAW,QACzDC,EAASJ,EAAUK,OAAOL,EAAQP,MAAM,KAAK,IAAM,EAEzDF,EAAOe,IAAIV,EAAUS,OAAOE,SAASH,GAAUA,EAAS,EAAE,IAGrDb,EAAOiB,IAAIlB,IAAWC,EAAOiB,IAAI,MAAQ,CAAC,EAqB7CC,EAAmB,CACvBC,EACAC,EACAC,GAA4B,EAC5BC,EAAyC,CAACvB,GAAW,IAAIwB,kBAAkBxB,OAE3E,IACGsB,IACAD,EAASI,MACVJ,EAASK,UACU,SAAnBN,EAAQO,QACRN,EAASO,OAAS,KAClB,CAAC,IAAK,IAAK,IAAK,KAAKC,SAASR,EAASO,SACvCP,EAASS,QAAQC,IAAI,qBACrBV,EAASS,QAAQC,IAAI,kBACrBV,EAASS,QAAQZ,IAAI,kBAAkBT,cAAcoB,SAAS,iBACjC,mBAAtBL,kBAEP,OAAOH,EAGT,MAAMW,EAAiBZ,EAAQU,QAAQZ,IAAI,oBAAsB,GAC3De,EAAoC,iBAAhBX,EAA2BA,EAAYtB,YAASkC,EACpEJ,EAAU,IAAIK,QAAQd,EAASS,SAC/B9B,GAAUiC,EAAa,CAACA,GAAe,CAAC,OAAQ,YACnDG,KAAKC,IAAS,CAAQA,YAAW3B,QAASZ,EAAWkC,EAAgBK,OACrEC,QAAO,EAAG5B,aAAcA,EAAU,IAClC6B,MAAK,CAACC,EAAMC,IAAUA,EAAM/B,QAAU8B,EAAK9B,UAAS,IAAI2B,UAI3D,MA9CiB,EAACP,EAAkBY,KACpC,MAAMC,EACJb,EACGZ,IAAI,SACHf,MAAM,KACPiC,KAAKQ,GAASA,EAAKpC,OAAOC,iBAAkB,GAE5CkC,EAAKd,SAAS,MAASc,EAAKd,SAASa,EAAMjC,gBAC9CqB,EAAQe,OAAO,OAAQH,EACzB,EAmCAI,CAAWhB,EAAS,mBAEf9B,GAQL8B,EAAQiB,OAAO,kBACfjB,EAAQd,IAAI,mBAAoBhB,GAEzB,IAAIgD,SAAS3B,EAASI,KAAKwB,YAAY1B,EAAavB,IAAU,CACnE8B,UACAF,OAAQP,EAASO,OACjBsB,WAAY7B,EAAS6B,cAbd,IAAIF,SAAS3B,EAASI,KAAM,CACjCK,UACAF,OAAQP,EAASO,OACjBsB,WAAY7B,EAAS6B,YAWvB"}
1
+ {"version":3,"file":"compression.js","sources":["../../src/adapters/compression.ts"],"sourcesContent":[null],"names":["getQuality","header","format","values","Map","split","forEach","part","encoding","params","trim","toLowerCase","quality","find","param","startsWith","parsed","Number","set","isFinite","get","compressResponse","request","response","compression","createStream","CompressionStream","body","bodyUsed","method","status","includes","headers","has","acceptEncoding","configured","undefined","Headers","map","candidate","filter","sort","left","right","value","vary","item","append","appendVary","delete","Response","pipeThrough","statusText"],"mappings":"AAeA,MAAMA,EAAa,CAACC,EAAgBC,KAClC,MAAMC,EAAS,IAAIC,IAUnB,OARAH,EAAOI,MAAM,KAAKC,QAASC,IACzB,MAAOC,EAAW,MAAOC,GAAUF,EAAKG,OAAOC,cAAcN,MAAM,KAC7DO,EAAUH,EAAOI,KAAMC,GAAUA,EAAMJ,OAAOK,WAAW,OACzDC,EAASJ,EAAUK,OAAOL,EAAQP,MAAM,KAAK,IAAM,EAEzDF,EAAOe,IAAIV,EAAUS,OAAOE,SAASH,GAAUA,EAAS,KAGnDb,EAAOiB,IAAIlB,IAAWC,EAAOiB,IAAI,MAAQ,GAqB5CC,EAAmB,CACvBC,EACAC,EACAC,GAA4B,EAC5BC,EAA0CvB,GAAW,IAAIwB,kBAAkBxB,MAE3E,IACGsB,IACAD,EAASI,MACVJ,EAASK,UACU,SAAnBN,EAAQO,QACRN,EAASO,OAAS,KAClB,CAAC,IAAK,IAAK,IAAK,KAAKC,SAASR,EAASO,SACvCP,EAASS,QAAQC,IAAI,qBACrBV,EAASS,QAAQC,IAAI,kBACrBV,EAASS,QAAQZ,IAAI,kBAAkBT,cAAcoB,SAAS,iBACjC,mBAAtBL,kBAEP,OAAOH,EAGT,MAAMW,EAAiBZ,EAAQU,QAAQZ,IAAI,oBAAsB,GAC3De,EAAoC,iBAAhBX,EAA2BA,EAAYtB,YAASkC,EACpEJ,EAAU,IAAIK,QAAQd,EAASS,SAC/B9B,GAAUiC,EAAa,CAACA,GAAe,CAAC,OAAQ,YACnDG,IAAKC,IAAS,CAAQA,YAAW3B,QAASZ,EAAWkC,EAAgBK,MACrEC,OAAO,EAAG5B,aAAcA,EAAU,GAClC6B,KAAK,CAACC,EAAMC,IAAUA,EAAM/B,QAAU8B,EAAK9B,SAAS,IAAI2B,UAI3D,MA9CiB,EAACP,EAAkBY,KACpC,MAAMC,EACJb,EACGZ,IAAI,SACHf,MAAM,KACPiC,IAAKQ,GAASA,EAAKpC,OAAOC,gBAAkB,GAE5CkC,EAAKd,SAAS,MAASc,EAAKd,SAASa,EAAMjC,gBAC9CqB,EAAQe,OAAO,OAAQH,IAoCzBI,CAAWhB,EAAS,mBAEf9B,GAQL8B,EAAQiB,OAAO,kBACfjB,EAAQd,IAAI,mBAAoBhB,GAEzB,IAAIgD,SAAS3B,EAASI,KAAKwB,YAAY1B,EAAavB,IAAU,CACnE8B,UACAF,OAAQP,EAASO,OACjBsB,WAAY7B,EAAS6B,cAbd,IAAIF,SAAS3B,EAASI,KAAM,CACjCK,UACAF,OAAQP,EAASO,OACjBsB,WAAY7B,EAAS6B"}
@@ -1,11 +1,11 @@
1
- import { TCompression } from "./compression.js";
2
- import { TSsrHandler } from "../core/types.js";
3
- interface IEdgeAdapterOptions {
1
+ import type { TCompression } from './compression.js';
2
+ import type { TSsrHandler } from '../core/types.js';
3
+ export interface IEdgeAdapterOptions {
4
4
  compression?: TCompression;
5
5
  }
6
- type TEdgeHandler<TPlatformArgs extends unknown[] = unknown[]> = (request: Request, ...platformArgs: TPlatformArgs) => Promise<Response>;
6
+ export type TEdgeHandler<TPlatformArgs extends unknown[] = unknown[]> = (request: Request, ...platformArgs: TPlatformArgs) => Promise<Response>;
7
7
  /**
8
8
  * Adapt the Fetch handler to runtime fetch entrypoints and optional compression.
9
9
  */
10
10
  declare const adapterEdge: <TPlatformArgs extends unknown[] = unknown[]>(handler: TSsrHandler, { compression }?: IEdgeAdapterOptions) => TEdgeHandler<TPlatformArgs>;
11
- export { adapterEdge as default, IEdgeAdapterOptions, TEdgeHandler };
11
+ export default adapterEdge;
@@ -1 +1 @@
1
- {"version":3,"file":"edge.js","sources":["../../src/adapters/edge.ts"],"sourcesContent":["import compressResponse from '@adapters/compression';\nimport type { TCompression } from '@adapters/compression';\nimport headResponse from '@core/head-response';\nimport type { TSsrHandler } from '@core/types';\n\nexport interface IEdgeAdapterOptions {\n compression?: TCompression;\n}\n\nexport type TEdgeHandler<TPlatformArgs extends unknown[] = unknown[]> = (\n request: Request,\n ...platformArgs: TPlatformArgs\n) => Promise<Response>;\n\n/**\n * Adapt the Fetch handler to runtime fetch entrypoints and optional compression.\n */\nconst adapterEdge = <TPlatformArgs extends unknown[] = unknown[]>(\n handler: TSsrHandler,\n { compression = false }: IEdgeAdapterOptions = {},\n): TEdgeHandler<TPlatformArgs> => {\n /**\n * Apply compression and HEAD handling to the completed Fetch response.\n */\n return async (...[request]: Parameters<TEdgeHandler<TPlatformArgs>>) => {\n return headResponse(request, compressResponse(request, await handler(request), compression));\n };\n};\n\nexport default adapterEdge;\n"],"names":["adapterEdge","handler","compression","async","request","headResponse","compressResponse"],"mappings":"wEAiBA,MAAMA,EAAc,CAClBC,GACEC,eAAc,GAA+B,CAAA,IAKxCC,UAAWC,KACTC,EAAaD,EAASE,EAAiBF,QAAeH,EAAQG,GAAUF"}
1
+ {"version":3,"file":"edge.js","sources":["../../src/adapters/edge.ts"],"sourcesContent":[null],"names":["adapterEdge","handler","compression","async","request","headResponse","compressResponse"],"mappings":"wEAiBA,MAAMA,EAAc,CAClBC,GACEC,eAAc,GAA+B,CAAA,IAKxCC,UAAWC,KACTC,EAAaD,EAASE,EAAiBF,QAAeH,EAAQG,GAAUF"}
@@ -1,4 +1,4 @@
1
- import { Request as ExpressRequest } from 'express';
1
+ import type { Request as ExpressRequest } from 'express';
2
2
  interface ICreateFetchRequestOptions {
3
3
  body?: BodyInit | null;
4
4
  signal?: AbortSignal;
@@ -8,4 +8,4 @@ interface ICreateFetchRequestOptions {
8
8
  */
9
9
  declare function createFetchRequest(req: ExpressRequest, options?: ICreateFetchRequestOptions): Request;
10
10
  export type { ICreateFetchRequestOptions };
11
- export { createFetchRequest as default };
11
+ export default createFetchRequest;
@@ -1 +1 @@
1
- {"version":3,"file":"create-request.js","sources":["../../../src/adapters/express/create-request.ts"],"sourcesContent":["import type { Request as ExpressRequest } from 'express';\nimport serializeBody from '@adapters/body';\nimport createRequest from '@node/create-request';\nimport type { ICreateRequestOptions } from '@node/create-request';\n\ninterface ICreateFetchRequestOptions {\n body?: BodyInit | null;\n signal?: AbortSignal;\n}\n\n/**\n * Preserve Express's trusted protocol and original URL when creating the router request.\n */\nfunction createFetchRequest(\n req: ExpressRequest,\n options: ICreateFetchRequestOptions = {},\n): Request {\n const requestOptions: ICreateRequestOptions = {\n ...options,\n origin: `${req.protocol}://${req.get('host') as string}`,\n url: req.originalUrl || req.url,\n };\n\n if (\n !Object.hasOwn(options, 'body') &&\n req.body !== undefined &&\n req.method !== 'GET' &&\n req.method !== 'HEAD'\n ) {\n requestOptions.body = serializeBody(req.body, req.get('Content-Type'));\n }\n\n return createRequest(req, requestOptions);\n}\n\nexport type { ICreateFetchRequestOptions };\n\nexport default createFetchRequest;\n"],"names":["createFetchRequest","req","options","requestOptions","origin","protocol","get","url","originalUrl","Object","hasOwn","undefined","body","method","serializeBody","createRequest"],"mappings":"sEAaA,SAASA,EACPC,EACAC,EAAsC,IAEtC,MAAMC,EAAwC,IACzCD,EACHE,OAAQ,GAAGH,EAAII,cAAcJ,EAAIK,IAAI,UACrCC,IAAKN,EAAIO,aAAeP,EAAIM,KAY9B,OARGE,OAAOC,OAAOR,EAAS,cACXS,IAAbV,EAAIW,MACW,QAAfX,EAAIY,QACW,SAAfZ,EAAIY,SAEJV,EAAeS,KAAOE,EAAcb,EAAIW,KAAMX,EAAIK,IAAI,kBAGjDS,EAAcd,EAAKE,EAC5B"}
1
+ {"version":3,"file":"create-request.js","sources":["../../../src/adapters/express/create-request.ts"],"sourcesContent":[null],"names":["createFetchRequest","req","options","requestOptions","origin","protocol","get","url","originalUrl","Object","hasOwn","undefined","body","method","serializeBody","createRequest"],"mappings":"sEAaA,SAASA,EACPC,EACAC,EAAsC,IAEtC,MAAMC,EAAwC,IACzCD,EACHE,OAAQ,GAAGH,EAAII,cAAcJ,EAAIK,IAAI,UACrCC,IAAKN,EAAIO,aAAeP,EAAIM,KAY9B,OARGE,OAAOC,OAAOR,EAAS,cACXS,IAAbV,EAAIW,MACW,QAAfX,EAAIY,QACW,SAAfZ,EAAIY,SAEJV,EAAeS,KAAOE,EAAcb,EAAIW,KAAMX,EAAIK,IAAI,kBAGjDS,EAAcd,EAAKE,EAC5B"}
@@ -1,28 +1,26 @@
1
- /// <reference types="node" />
2
- import { Server } from 'node:net';
3
- import { CompressionOptions } from 'compression';
4
- import { Express, Request } from 'express';
5
- import { Response as ExpressResponse } from "express";
6
- import { FC, PropsWithChildren } from 'react';
1
+ import type { Server } from 'node:net';
2
+ import type { CompressionOptions } from 'compression';
3
+ import type { Express, Request, Response as ExpressResponse } from 'express';
4
+ import type { FC, PropsWithChildren } from 'react';
7
5
  import { createStaticHandler } from 'react-router';
8
- import { ServeStaticOptions } from 'serve-static';
9
- import { Logger } from 'vite';
10
- import { IRenderOptions, TRender } from "./render.js";
11
- import { TRouteObject } from "../../interfaces/route-object.js";
12
- import ServerApi from "../../services/server-api.js";
13
- import ServerConfig from "../../services/server-config.js";
14
- interface IInitServerRequestOut<T = Record<string, any>> {
6
+ import type { ServeStaticOptions } from 'serve-static';
7
+ import type { Logger } from 'vite';
8
+ import type { IRenderOptions, TRender } from './render.js';
9
+ import type { TRouteObject } from '../../interfaces/route-object.js';
10
+ import type ServerApi from '../../services/server-api.js';
11
+ import type ServerConfig from '../../services/server-config.js';
12
+ export interface IInitServerRequestOut<T = Record<string, any>> {
15
13
  appProps?: T;
16
14
  hasEarlyHints?: boolean;
17
15
  shouldSkip?: boolean;
18
16
  shouldCancel?: boolean;
19
17
  }
20
- interface IEntrypointOptions<TAppProps = Record<string, any>> extends Pick<IRenderOptions<TAppProps>, 'onRouterReady' | 'onShellReady' | 'onShellError' | 'onResponse' | 'onError' | 'getState' | 'getBody'> {
18
+ export interface IEntrypointOptions<TAppProps = Record<string, any>> extends Pick<IRenderOptions<TAppProps>, 'onRouterReady' | 'onShellReady' | 'onShellError' | 'onResponse' | 'onError' | 'getState' | 'getBody'> {
21
19
  onServerCreated?: (app: Express, serverApi: ServerApi) => Promise<void> | void;
22
20
  onServerStarted?: (app: Express, serverApi: ServerApi, server: Server) => Promise<void> | void;
23
21
  onRequest?: (req: Request, res: ExpressResponse) => Promise<IInitServerRequestOut<TAppProps>> | IInitServerRequestOut<TAppProps>;
24
22
  }
25
- interface IPrepareRenderOut<TAppProps = Record<string, any>> {
23
+ export interface IPrepareRenderOut<TAppProps = Record<string, any>> {
26
24
  render: TRender;
27
25
  init: IEntryServerOptions<TAppProps>['init'];
28
26
  routes: TRouteObject[];
@@ -39,11 +37,11 @@ interface IPrepareRenderOut<TAppProps = Record<string, any>> {
39
37
  }) | false;
40
38
  };
41
39
  }
42
- interface IAppServerProps<T = Record<string, any>> {
40
+ export interface IAppServerProps<T = Record<string, any>> {
43
41
  server: T;
44
42
  }
45
- type TApp<T> = FC<PropsWithChildren<Record<string, any> & IAppServerProps<T>>>;
46
- interface IEntryServerOptions<TAppProps = Record<string, any>> extends Pick<IPrepareRenderOut, 'loggerProd' | 'loggerDev' | 'middlewares'> {
43
+ export type TApp<T> = FC<PropsWithChildren<Record<string, any> & IAppServerProps<T>>>;
44
+ export interface IEntryServerOptions<TAppProps = Record<string, any>> extends Pick<IPrepareRenderOut, 'loggerProd' | 'loggerDev' | 'middlewares'> {
47
45
  abortDelay?: number;
48
46
  init?: (params: {
49
47
  config: ServerConfig;
@@ -54,4 +52,4 @@ interface IEntryServerOptions<TAppProps = Record<string, any>> extends Pick<IPre
54
52
  * Render server side application
55
53
  */
56
54
  declare function entry<TAppProps>(App: TApp<TAppProps>, routes: TRouteObject[], { init, routerOptions, ...rest }?: IEntryServerOptions<TAppProps>): IPrepareRenderOut<TAppProps>;
57
- export { entry as default, IInitServerRequestOut, IEntrypointOptions, IPrepareRenderOut, IAppServerProps, TApp, IEntryServerOptions };
55
+ export default entry;
@@ -1 +1 @@
1
- {"version":3,"file":"entry.js","sources":["../../../src/adapters/express/entry.tsx"],"sourcesContent":["import type { Server } from 'node:net';\nimport type { CompressionOptions } from 'compression';\nimport type { Express, Request, Response as ExpressResponse } from 'express';\nimport type { FC, PropsWithChildren } from 'react';\nimport type { RouteObject } from 'react-router';\nimport { createStaticHandler } from 'react-router';\nimport type { ServeStaticOptions } from 'serve-static';\nimport type { Logger } from 'vite';\nimport type { IRenderOptions, IRenderParams, TRender } from '@adapters/express/render';\nimport render from '@adapters/express/render';\nimport type { TRouteObject } from '@interfaces/route-object';\nimport type ServerApi from '@services/server-api';\nimport type ServerConfig from '@services/server-config';\n\nexport interface IInitServerRequestOut<T = Record<string, any>> {\n appProps?: T;\n hasEarlyHints?: boolean;\n shouldSkip?: boolean;\n shouldCancel?: boolean;\n}\n\nexport interface IEntrypointOptions<TAppProps = Record<string, any>> extends Pick<\n IRenderOptions<TAppProps>,\n | 'onRouterReady'\n | 'onShellReady'\n | 'onShellError'\n | 'onResponse'\n | 'onError'\n | 'getState'\n | 'getBody'\n> {\n onServerCreated?: (app: Express, serverApi: ServerApi) => Promise<void> | void;\n onServerStarted?: (app: Express, serverApi: ServerApi, server: Server) => Promise<void> | void;\n onRequest?: (\n req: Request,\n res: ExpressResponse,\n ) => Promise<IInitServerRequestOut<TAppProps>> | IInitServerRequestOut<TAppProps>;\n}\n\nexport interface IPrepareRenderOut<TAppProps = Record<string, any>> {\n render: TRender;\n init: IEntryServerOptions<TAppProps>['init'];\n routes: TRouteObject[];\n abortDelay?: number;\n loggerProd?: Logger;\n loggerDev?: Logger;\n middlewares?: {\n compression?: CompressionOptions | false;\n\n /**\n * basename should be same as vite 'base' config\n */\n expressStatic?: (ServeStaticOptions & { basename?: string }) | false;\n };\n}\n\nexport interface IAppServerProps<T = Record<string, any>> {\n server: T;\n}\n\nexport type TApp<T> = FC<PropsWithChildren<Record<string, any> & IAppServerProps<T>>>;\n\nexport interface IEntryServerOptions<TAppProps = Record<string, any>> extends Pick<\n IPrepareRenderOut,\n 'loggerProd' | 'loggerDev' | 'middlewares'\n> {\n abortDelay?: number;\n init?: (params: {\n config: ServerConfig;\n }) => IEntrypointOptions<TAppProps> | Promise<IEntrypointOptions<TAppProps>>;\n routerOptions?: Parameters<typeof createStaticHandler>[1];\n}\n\n/**\n * Render server side application\n */\nfunction entry<TAppProps>(\n App: TApp<TAppProps>,\n routes: TRouteObject[],\n { init, routerOptions, ...rest }: IEntryServerOptions<TAppProps> = {},\n): IPrepareRenderOut<TAppProps> {\n const handler = createStaticHandler(routes as RouteObject[], routerOptions);\n\n return {\n render: render.bind(null, { handler, App } as IRenderParams<TAppProps>) as TRender,\n init,\n routes,\n ...rest,\n };\n}\n\nexport default entry;\n"],"names":["entry","App","routes","init","routerOptions","rest","handler","createStaticHandler","render","bind"],"mappings":"8EA4EA,SAASA,EACPC,EACAC,GACAC,KAAEA,EAAIC,cAAEA,KAAkBC,GAAyC,IAEnE,MAAMC,EAAUC,EAAoBL,EAAyBE,GAE7D,MAAO,CACLI,OAAQA,EAAOC,KAAK,KAAM,CAAEH,UAASL,QACrCE,OACAD,YACGG,EAEP"}
1
+ {"version":3,"file":"entry.js","sources":["../../../src/adapters/express/entry.tsx"],"sourcesContent":[null],"names":["entry","App","routes","init","routerOptions","rest","handler","createStaticHandler","render","bind"],"mappings":"8EA4EA,SAASA,EACPC,EACAC,GACAC,KAAEA,EAAIC,cAAEA,KAAkBC,GAAyC,IAEnE,MAAMC,EAAUC,EAAoBL,EAAyBE,GAE7D,MAAO,CACLI,OAAQA,EAAOC,KAAK,KAAM,CAAEH,UAASL,QACrCE,OACAD,YACGG,EAEP"}
@@ -1,9 +1,9 @@
1
- import { Request } from 'express';
2
- import { IEntrypointOptions, IPrepareRenderOut } from "./entry.js";
3
- import { TRender } from "./render.js";
4
- import { TRouteObject } from "../../interfaces/route-object.js";
5
- import ServerApi from "../../services/server-api.js";
6
- import ServerConfig from "../../services/server-config.js";
1
+ import type { Request } from 'express';
2
+ import type { IEntrypointOptions, IPrepareRenderOut } from './entry.js';
3
+ import type { TRender } from './render.js';
4
+ import type { TRouteObject } from '../../interfaces/route-object.js';
5
+ import ServerApi from '../../services/server-api.js';
6
+ import type ServerConfig from '../../services/server-config.js';
7
7
  interface IPrepareServerEntrypointLoadOut<TAppProps = Record<string, any>> extends Omit<IEntrypointOptions<TAppProps>, 'onServerCreated' | 'onServerStarted'> {
8
8
  render: TRender;
9
9
  routes: TRouteObject[];
@@ -42,47 +42,29 @@ declare class PrepareServer {
42
42
  * Middlewares configs
43
43
  */
44
44
  protected middlewaresConfigs?: NonNullable<IPrepareRenderOut['middlewares']>;
45
- /**
46
- * Retain runtime configuration and reuse the existing server API.
47
- */
48
45
  /**
49
46
  * Retain runtime configuration and reuse the existing server API.
50
47
  */
51
48
  protected constructor(config: ServerConfig, serverApi?: ServerApi);
52
- /**
53
- * Init service
54
- */
55
49
  /**
56
50
  * Init service
57
51
  */
58
52
  static init(config: ServerConfig, serverApi?: ServerApi): PrepareServer;
59
- /**
60
- * Resolve and return entrypoint params
61
- */
62
53
  /**
63
54
  * Resolve and return entrypoint params
64
55
  */
65
56
  loadEntrypoint(shouldInit?: boolean): Promise<IPrepareServerEntrypointLoadOut>;
66
- /**
67
- * Load and return html shell
68
- */
69
57
  /**
70
58
  * Load and return html shell
71
59
  */
72
60
  loadHtml(req: Request): Promise<[string, string]>;
73
- /**
74
- * Run server created hook
75
- */
76
61
  /**
77
62
  * Run server created hook
78
63
  */
79
64
  onAppCreated(): Promise<PrepareServer>;
80
- /**
81
- * Return SSR express middlewares configs
82
- */
83
65
  /**
84
66
  * Return SSR express middlewares configs
85
67
  */
86
68
  getMiddlewaresConfig(): NonNullable<PrepareServer['middlewaresConfigs']>;
87
69
  }
88
- export { PrepareServer as default };
70
+ export default PrepareServer;
@@ -1,2 +1,2 @@
1
- import e from"node:fs";import t from"node:path";import r from"node:process";import{pathToFileURL as i}from"node:url";import o from"chalk";import s from"../../services/server-api.js";class n{onServerStarted;config;serverApi;entrypoint;onServerCreated;html;middlewaresConfigs;constructor(e,t){this.config=e,this.serverApi=t??new s}static init(e,t){return new n(e,t)}async loadEntrypoint(e=!0){if(this.entrypoint&&this.config.isProd)return this.entrypoint;const{root:s,isProd:n,serverFile:a}=this.config.getParams(),l=t.resolve(`${s}/${a}`);let d;try{d=n?(await import(i(l).toString())).default:(await this.config.getVite().ssrLoadModule(l,{fixStacktrace:!0})).default}catch(e){if(e instanceof Error&&e.message.includes("Cannot find module")&&e.message.includes("/build/"))return this.config.getLogger().error(o.red(`Before starting the server, you need to create a build: ${o.yellow("ssr-boost build")} or provide path to build dir: ${o.yellow("ssr-boost start --build-dir build")}`)),r.exit(1);throw e}!e&&d.init&&delete d.init;const{render:c,init:g,routes:h,abortDelay:f,loggerProd:p,loggerDev:m,middlewares:u}=d;this.middlewaresConfigs=u,p&&n?this.config.setLogger(p):m&&!n&&this.config.setLogger(m);const{onServerCreated:y,onServerStarted:v,...w}=await(g?.({config:this.config}))??{};return this.entrypoint={render:c,routes:h,abortDelay:f,...w},this.onServerCreated=y,this.onServerStarted=v,this.entrypoint}async loadHtml(r){const{isProd:i,root:o,indexFile:s,clientFile:n}=this.config.getParams();this.html&&i||(this.html=e.readFileSync(t.resolve(`${o}/${s}`),"utf-8"));let a=this.html;if(!i){const e=t.posix.normalize(`${this.config.getVite()?.config.base}/${n}`);a=(await this.config.getVite().transformIndexHtml(r.originalUrl,this.html,s)).replace(new RegExp(String.raw`<script[^>]*?\bsrc=["']/?${e}([^"']*)["'][^>]*?\sasync\b`,"g"),(e=>e.replace(/\sasync\b/,"")))}return a.split("\x3c!--ssr-outlet--\x3e")}async onAppCreated(){return await this.loadEntrypoint(),await(this.onServerCreated?.(this.config.getApp(),this.serverApi)),this}getMiddlewaresConfig(){const{compression:e,expressStatic:t}=this.middlewaresConfigs??{};return{compression:!1!==e&&{...e},expressStatic:!1!==t&&{...t,basename:t?.basename??"/"}}}}export{n as default};
1
+ import e from"node:fs";import t from"node:path";import r from"node:process";import{pathToFileURL as i}from"node:url";import o from"chalk";import s from"../../services/server-api.js";class n{onServerStarted;config;serverApi;entrypoint;onServerCreated;html;middlewaresConfigs;constructor(e,t){this.config=e,this.serverApi=t??new s}static init(e,t){return new n(e,t)}async loadEntrypoint(e=!0){if(this.entrypoint&&this.config.isProd)return this.entrypoint;const{root:s,isProd:n,serverFile:a}=this.config.getParams(),l=t.resolve(`${s}/${a}`);let d;try{d=n?(await(import(i(l).toString()))).default:(await this.config.getVite().ssrLoadModule(l,{fixStacktrace:!0})).default}catch(e){if(e instanceof Error&&e.message.includes("Cannot find module")&&e.message.includes("/build/"))return this.config.getLogger().error(o.red(`Before starting the server, you need to create a build: ${o.yellow("ssr-boost build")} or provide path to build dir: ${o.yellow("ssr-boost start --build-dir build")}`)),r.exit(1);throw e}!e&&d.init&&delete d.init;const{render:c,init:g,routes:h,abortDelay:f,loggerProd:p,loggerDev:m,middlewares:u}=d;this.middlewaresConfigs=u,p&&n?this.config.setLogger(p):m&&!n&&this.config.setLogger(m);const{onServerCreated:y,onServerStarted:v,...w}=await(g?.({config:this.config}))??{};return this.entrypoint={render:c,routes:h,abortDelay:f,...w},this.onServerCreated=y,this.onServerStarted=v,this.entrypoint}async loadHtml(r){const{isProd:i,root:o,indexFile:s,clientFile:n}=this.config.getParams();this.html&&i||(this.html=e.readFileSync(t.resolve(`${o}/${s}`),"utf-8"));let a=this.html;if(!i){const e=t.posix.normalize(`${this.config.getVite()?.config.base}/${n}`);a=(await this.config.getVite().transformIndexHtml(r.originalUrl,this.html,s)).replace(new RegExp(String.raw`<script[^>]*?\bsrc=["']/?${e}([^"']*)["'][^>]*?\sasync\b`,"g"),e=>e.replace(/\sasync\b/,""))}return a.split("\x3c!--ssr-outlet--\x3e")}async onAppCreated(){return await this.loadEntrypoint(),await(this.onServerCreated?.(this.config.getApp(),this.serverApi)),this}getMiddlewaresConfig(){const{compression:e,expressStatic:t}=this.middlewaresConfigs??{};return{compression:!1!==e&&{...e},expressStatic:!1!==t&&{...t,basename:t?.basename??"/"}}}}export{n as default};
2
2
  //# sourceMappingURL=prepare-server.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"prepare-server.js","sources":["../../../src/adapters/express/prepare-server.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport process from 'node:process';\nimport { pathToFileURL } from 'node:url';\nimport chalk from 'chalk';\nimport type { Express, Request } from 'express';\nimport type { IEntrypointOptions, IPrepareRenderOut } from '@adapters/express/entry';\nimport type { TRender } from '@adapters/express/render';\nimport type { TRouteObject } from '@interfaces/route-object';\nimport ServerApi from '@services/server-api';\nimport type ServerConfig from '@services/server-config';\n\ninterface IPrepareServerEntrypointLoadOut<TAppProps = Record<string, any>> extends Omit<\n IEntrypointOptions<TAppProps>,\n 'onServerCreated' | 'onServerStarted'\n> {\n render: TRender;\n routes: TRouteObject[];\n abortDelay?: number;\n}\n\n/**\n * Load server entrypoint and template\n * DEV MODE: refresh entrypoint and template\n */\nclass PrepareServer {\n /**\n * Hook which calls after express server started\n */\n public onServerStarted?: NonNullable<IEntrypointOptions['onServerStarted']>;\n\n /**\n * Server configuration\n */\n protected readonly config: ServerConfig;\n\n /**\n * Server API\n */\n protected readonly serverApi: ServerApi;\n\n /**\n * Entrypoint resolved params\n */\n protected entrypoint?: IPrepareServerEntrypointLoadOut;\n\n /**\n * Hook which calls after express server created\n */\n protected onServerCreated?: NonNullable<IEntrypointOptions['onServerCreated']>;\n\n /**\n * Html shell\n */\n protected html: string;\n\n /**\n * Middlewares configs\n */\n protected middlewaresConfigs?: NonNullable<IPrepareRenderOut['middlewares']>;\n\n /**\n * Retain runtime configuration and reuse the existing server API.\n */\n protected constructor(config: ServerConfig, serverApi?: ServerApi) {\n this.config = config;\n this.serverApi = serverApi ?? new ServerApi();\n }\n\n /**\n * Init service\n */\n public static init(config: ServerConfig, serverApi?: ServerApi): PrepareServer {\n return new PrepareServer(config, serverApi);\n }\n\n /**\n * Resolve and return entrypoint params\n */\n public async loadEntrypoint(shouldInit = true): Promise<IPrepareServerEntrypointLoadOut> {\n /**\n * load server entrypoint each time only in development mode (for fast refresh)\n */\n if (this.entrypoint && this.config.isProd) {\n return this.entrypoint;\n }\n\n const { root, isProd, serverFile } = this.config.getParams();\n const entrypointPath = path.resolve(`${root}/${serverFile}`);\n\n let resolvedEntrypoint: IPrepareRenderOut;\n\n try {\n if (!isProd) {\n resolvedEntrypoint = (\n await this.config.getVite()!.ssrLoadModule(entrypointPath, {\n fixStacktrace: true,\n })\n ).default as IPrepareRenderOut;\n } else {\n resolvedEntrypoint = (\n (await import(pathToFileURL(entrypointPath).toString())) as { default: IPrepareRenderOut }\n ).default;\n }\n } catch (e) {\n if (\n e instanceof Error &&\n e.message.includes('Cannot find module') &&\n e.message.includes('/build/')\n ) {\n this.config\n .getLogger()\n .error(\n chalk.red(\n `Before starting the server, you need to create a build: ${chalk.yellow(\n 'ssr-boost build',\n )} or provide path to build dir: ${chalk.yellow(\n 'ssr-boost start --build-dir build',\n )}`,\n ),\n );\n\n return process.exit(1);\n }\n\n throw e;\n }\n\n if (!shouldInit && resolvedEntrypoint.init) {\n delete resolvedEntrypoint.init;\n }\n\n const { render, init, routes, abortDelay, loggerProd, loggerDev, middlewares } =\n resolvedEntrypoint;\n\n this.middlewaresConfigs = middlewares;\n\n if (loggerProd && isProd) {\n this.config.setLogger(loggerProd);\n } else if (loggerDev && !isProd) {\n this.config.setLogger(loggerDev);\n }\n\n const { onServerCreated, onServerStarted, ...renderParams } =\n (await init?.({\n config: this.config,\n })) ?? {};\n\n this.entrypoint = {\n render,\n routes,\n abortDelay,\n ...renderParams,\n };\n this.onServerCreated = onServerCreated;\n this.onServerStarted = onServerStarted;\n\n return this.entrypoint;\n }\n\n /**\n * Load and return html shell\n */\n public async loadHtml(req: Request): Promise<[string, string]> {\n const { isProd, root, indexFile, clientFile } = this.config.getParams();\n\n if (!this.html || !isProd) {\n this.html = fs.readFileSync(path.resolve(`${root}/${indexFile}`), 'utf-8');\n }\n\n let modifiedHtml = this.html;\n\n if (!isProd) {\n const clientFileEntry = path.posix.normalize(\n `${this.config.getVite()?.config.base}/${clientFile}`,\n );\n\n /**\n * Apply Vite transforms and remove async from the entry to preserve plugin preambles.\n */\n modifiedHtml = (\n await this.config.getVite()!.transformIndexHtml(req.originalUrl, this.html, indexFile)\n ).replace(\n new RegExp(\n String.raw`<script[^>]*?\\bsrc=[\"']/?${clientFileEntry}([^\"']*)[\"'][^>]*?\\sasync\\b`,\n 'g',\n ),\n (match) => match.replace(/\\sasync\\b/, ''),\n );\n }\n\n return modifiedHtml.split('<!--ssr-outlet-->') as [string, string];\n }\n\n /**\n * Run server created hook\n */\n public async onAppCreated(): Promise<PrepareServer> {\n await this.loadEntrypoint();\n await this.onServerCreated?.(this.config.getApp<Express>()!, this.serverApi);\n\n return this;\n }\n\n /**\n * Return SSR express middlewares configs\n */\n public getMiddlewaresConfig(): NonNullable<PrepareServer['middlewaresConfigs']> {\n const { compression, expressStatic } = this.middlewaresConfigs ?? {};\n\n return {\n compression:\n compression !== false\n ? {\n ...compression,\n }\n : false,\n expressStatic:\n expressStatic !== false\n ? {\n ...expressStatic,\n basename: expressStatic?.basename ?? '/',\n }\n : false,\n };\n }\n}\n\nexport default PrepareServer;\n"],"names":["PrepareServer","onServerStarted","config","serverApi","entrypoint","onServerCreated","html","middlewaresConfigs","constructor","this","ServerApi","static","async","shouldInit","isProd","root","serverFile","getParams","entrypointPath","path","resolve","resolvedEntrypoint","import","pathToFileURL","toString","default","getVite","ssrLoadModule","fixStacktrace","e","Error","message","includes","getLogger","error","chalk","red","yellow","process","exit","init","render","routes","abortDelay","loggerProd","loggerDev","middlewares","setLogger","renderParams","req","indexFile","clientFile","fs","readFileSync","modifiedHtml","clientFileEntry","posix","normalize","base","transformIndexHtml","originalUrl","replace","RegExp","String","raw","match","split","loadEntrypoint","getApp","getMiddlewaresConfig","compression","expressStatic","basename"],"mappings":"sLAyBA,MAAMA,EAIGC,gBAKYC,OAKAC,UAKTC,WAKAC,gBAKAC,KAKAC,mBAKVC,YAAsBN,EAAsBC,GAC1CM,KAAKP,OAASA,EACdO,KAAKN,UAAYA,GAAa,IAAIO,CACpC,CAKOC,YAAYT,EAAsBC,GACvC,OAAO,IAAIH,EAAcE,EAAQC,EACnC,CAKOS,qBAAqBC,GAAa,GAIvC,GAAIJ,KAAKL,YAAcK,KAAKP,OAAOY,OACjC,OAAOL,KAAKL,WAGd,MAAMW,KAAEA,EAAID,OAAEA,EAAME,WAAEA,GAAeP,KAAKP,OAAOe,YAC3CC,EAAiBC,EAAKC,QAAQ,GAAGL,KAAQC,KAE/C,IAAIK,EAEJ,IAQIA,EAPGP,SAQMQ,OAAOC,EAAcL,GAAgBM,aAC5CC,eAPMhB,KAAKP,OAAOwB,UAAWC,cAAcT,EAAgB,CACzDU,eAAe,KAEjBH,OAMN,CAAE,MAAOI,GACP,GACEA,aAAaC,OACbD,EAAEE,QAAQC,SAAS,uBACnBH,EAAEE,QAAQC,SAAS,WAcnB,OAZAvB,KAAKP,OACF+B,YACAC,MACCC,EAAMC,IACJ,2DAA2DD,EAAME,OAC/D,oDACiCF,EAAME,OACvC,yCAKDC,EAAQC,KAAK,GAGtB,MAAMV,CACR,EAEKhB,GAAcQ,EAAmBmB,aAC7BnB,EAAmBmB,KAG5B,MAAMC,OAAEA,EAAMD,KAAEA,EAAIE,OAAEA,EAAMC,WAAEA,EAAUC,WAAEA,EAAUC,UAAEA,EAASC,YAAEA,GAC/DzB,EAEFZ,KAAKF,mBAAqBuC,EAEtBF,GAAc9B,EAChBL,KAAKP,OAAO6C,UAAUH,GACbC,IAAc/B,GACvBL,KAAKP,OAAO6C,UAAUF,GAGxB,MAAMxC,gBAAEA,EAAeJ,gBAAEA,KAAoB+C,SACpCR,IAAO,CACZtC,OAAQO,KAAKP,WACR,CAAA,EAWT,OATAO,KAAKL,WAAa,CAChBqC,SACAC,SACAC,gBACGK,GAELvC,KAAKJ,gBAAkBA,EACvBI,KAAKR,gBAAkBA,EAEhBQ,KAAKL,UACd,CAKOQ,eAAeqC,GACpB,MAAMnC,OAAEA,EAAMC,KAAEA,EAAImC,UAAEA,EAASC,WAAEA,GAAe1C,KAAKP,OAAOe,YAEvDR,KAAKH,MAASQ,IACjBL,KAAKH,KAAO8C,EAAGC,aAAalC,EAAKC,QAAQ,GAAGL,KAAQmC,KAAc,UAGpE,IAAII,EAAe7C,KAAKH,KAExB,IAAKQ,EAAQ,CACX,MAAMyC,EAAkBpC,EAAKqC,MAAMC,UACjC,GAAGhD,KAAKP,OAAOwB,WAAWxB,OAAOwD,QAAQP,KAM3CG,SACQ7C,KAAKP,OAAOwB,UAAWiC,mBAAmBV,EAAIW,YAAanD,KAAKH,KAAM4C,IAC5EW,QACA,IAAIC,OACFC,OAAOC,GAAG,4BAA4BT,+BACtC,MAEDU,GAAUA,EAAMJ,QAAQ,YAAa,KAE1C,CAEA,OAAOP,EAAaY,MAAM,0BAC5B,CAKOtD,qBAIL,aAHMH,KAAK0D,uBACL1D,KAAKJ,kBAAkBI,KAAKP,OAAOkE,SAAoB3D,KAAKN,YAE3DM,IACT,CAKO4D,uBACL,MAAMC,YAAEA,EAAWC,cAAEA,GAAkB9D,KAAKF,oBAAsB,CAAA,EAElE,MAAO,CACL+D,aACkB,IAAhBA,GACI,IACKA,GAGXC,eACoB,IAAlBA,GACI,IACKA,EACHC,SAAUD,GAAeC,UAAY,KAIjD"}
1
+ {"version":3,"file":"prepare-server.js","sources":["../../../src/adapters/express/prepare-server.ts"],"sourcesContent":[null],"names":["PrepareServer","onServerStarted","config","serverApi","entrypoint","onServerCreated","html","middlewaresConfigs","constructor","this","ServerApi","init","loadEntrypoint","shouldInit","isProd","root","serverFile","getParams","entrypointPath","path","resolve","resolvedEntrypoint","pathToFileURL","toString","default","getVite","ssrLoadModule","fixStacktrace","e","Error","message","includes","getLogger","error","chalk","red","yellow","process","exit","render","routes","abortDelay","loggerProd","loggerDev","middlewares","setLogger","renderParams","loadHtml","req","indexFile","clientFile","fs","readFileSync","modifiedHtml","clientFileEntry","posix","normalize","base","transformIndexHtml","originalUrl","replace","RegExp","String","raw","match","split","onAppCreated","getApp","getMiddlewaresConfig","compression","expressStatic","basename"],"mappings":"sLAyBA,MAAMA,EAIGC,gBAKYC,OAKAC,UAKTC,WAKAC,gBAKAC,KAKAC,mBAKV,WAAAC,CAAsBN,EAAsBC,GAC1CM,KAAKP,OAASA,EACdO,KAAKN,UAAYA,GAAa,IAAIO,CACpC,CAKO,WAAOC,CAAKT,EAAsBC,GACvC,OAAO,IAAIH,EAAcE,EAAQC,EACnC,CAKO,oBAAMS,CAAeC,GAAa,GAIvC,GAAIJ,KAAKL,YAAcK,KAAKP,OAAOY,OACjC,OAAOL,KAAKL,WAGd,MAAMW,KAAEA,EAAID,OAAEA,EAAME,WAAEA,GAAeP,KAAKP,OAAOe,YAC3CC,EAAiBC,EAAKC,QAAQ,GAAGL,KAAQC,KAE/C,IAAIK,EAEJ,IAQIA,EAPGP,gBAQaQ,EAAcJ,GAAgBK,cAC5CC,eAPMf,KAAKP,OAAOuB,UAAWC,cAAcR,EAAgB,CACzDS,eAAe,KAEjBH,OAMN,CAAE,MAAOI,GACP,GACEA,aAAaC,OACbD,EAAEE,QAAQC,SAAS,uBACnBH,EAAEE,QAAQC,SAAS,WAcnB,OAZAtB,KAAKP,OACF8B,YACAC,MACCC,EAAMC,IACJ,2DAA2DD,EAAME,OAC/D,oDACiCF,EAAME,OACvC,yCAKDC,EAAQC,KAAK,GAGtB,MAAMV,CACR,EAEKf,GAAcQ,EAAmBV,aAC7BU,EAAmBV,KAG5B,MAAM4B,OAAEA,EAAM5B,KAAEA,EAAI6B,OAAEA,EAAMC,WAAEA,EAAUC,WAAEA,EAAUC,UAAEA,EAASC,YAAEA,GAC/DvB,EAEFZ,KAAKF,mBAAqBqC,EAEtBF,GAAc5B,EAChBL,KAAKP,OAAO2C,UAAUH,GACbC,IAAc7B,GACvBL,KAAKP,OAAO2C,UAAUF,GAGxB,MAAMtC,gBAAEA,EAAeJ,gBAAEA,KAAoB6C,SACpCnC,IAAO,CACZT,OAAQO,KAAKP,WACR,CAAA,EAWT,OATAO,KAAKL,WAAa,CAChBmC,SACAC,SACAC,gBACGK,GAELrC,KAAKJ,gBAAkBA,EACvBI,KAAKR,gBAAkBA,EAEhBQ,KAAKL,UACd,CAKO,cAAM2C,CAASC,GACpB,MAAMlC,OAAEA,EAAMC,KAAEA,EAAIkC,UAAEA,EAASC,WAAEA,GAAezC,KAAKP,OAAOe,YAEvDR,KAAKH,MAASQ,IACjBL,KAAKH,KAAO6C,EAAGC,aAAajC,EAAKC,QAAQ,GAAGL,KAAQkC,KAAc,UAGpE,IAAII,EAAe5C,KAAKH,KAExB,IAAKQ,EAAQ,CACX,MAAMwC,EAAkBnC,EAAKoC,MAAMC,UACjC,GAAG/C,KAAKP,OAAOuB,WAAWvB,OAAOuD,QAAQP,KAM3CG,SACQ5C,KAAKP,OAAOuB,UAAWiC,mBAAmBV,EAAIW,YAAalD,KAAKH,KAAM2C,IAC5EW,QACA,IAAIC,OACFC,OAAOC,GAAG,4BAA4BT,+BACtC,KAEDU,GAAUA,EAAMJ,QAAQ,YAAa,IAE1C,CAEA,OAAOP,EAAaY,MAAM,0BAC5B,CAKO,kBAAMC,GAIX,aAHMzD,KAAKG,uBACLH,KAAKJ,kBAAkBI,KAAKP,OAAOiE,SAAoB1D,KAAKN,YAE3DM,IACT,CAKO,oBAAA2D,GACL,MAAMC,YAAEA,EAAWC,cAAEA,GAAkB7D,KAAKF,oBAAsB,CAAA,EAElE,MAAO,CACL8D,aACkB,IAAhBA,GACI,IACKA,GAGXC,eACoB,IAAlBA,GACI,IACKA,EACHC,SAAUD,GAAeC,UAAY,KAIjD"}
@@ -1,12 +1,11 @@
1
- import { Request as ExpressRequest } from 'express';
2
- import { Response as ExpressResponse } from "express";
3
- import { StaticHandlerContext, StaticHandler } from 'react-router';
4
- import { TApp } from "./entry.js";
5
- import StreamError from "../../constants/stream-error.js";
6
- import { IServerContext } from "../../context/server.js";
7
- import { IObtainStreamErrorOut } from "../../helpers/obtain-stream-error.js";
8
- import ServerConfig from "../../services/server-config.js";
9
- interface IRequestContext<TAppProps = Record<any, any>> {
1
+ import type { Request as ExpressRequest, Response as ExpressResponse } from 'express';
2
+ import type { StaticHandlerContext, StaticHandler } from 'react-router';
3
+ import type { TApp } from './entry.js';
4
+ import StreamError from '../../constants/stream-error.js';
5
+ import type { IServerContext } from '../../context/server.js';
6
+ import type { IObtainStreamErrorOut } from '../../helpers/obtain-stream-error.js';
7
+ import type ServerConfig from '../../services/server-config.js';
8
+ export interface IRequestContext<TAppProps = Record<any, any>> {
10
9
  req: ExpressRequest;
11
10
  res: ExpressResponse;
12
11
  appProps: NonNullable<TAppProps>;
@@ -20,12 +19,12 @@ interface IRequestContext<TAppProps = Record<any, any>> {
20
19
  hasEarlyHints?: boolean;
21
20
  didError?: StreamError;
22
21
  }
23
- type TRender<TAppProps = Record<any, any>> = (config: ServerConfig, context: IRequestContext<TAppProps>, options: IRenderOptions) => Promise<void>;
24
- interface IRenderParams<TAppProps = Record<string, any>> {
22
+ export type TRender<TAppProps = Record<any, any>> = (config: ServerConfig, context: IRequestContext<TAppProps>, options: IRenderOptions) => Promise<void>;
23
+ export interface IRenderParams<TAppProps = Record<string, any>> {
25
24
  App: TApp<TAppProps>;
26
25
  handler: StaticHandler;
27
26
  }
28
- interface IRenderOptions<TAppProps = Record<string, any>> {
27
+ export interface IRenderOptions<TAppProps = Record<string, any>> {
29
28
  abortDelay?: number;
30
29
  getBody?: (request: ExpressRequest) => BodyInit | null | undefined;
31
30
  onRouterReady?: (params: {
@@ -50,10 +49,10 @@ interface IRenderOptions<TAppProps = Record<string, any>> {
50
49
  context: IRequestContext<TAppProps>;
51
50
  }) => Record<string, Record<string, any>> | undefined | void;
52
51
  }
53
- interface IRouterReadyOut {
52
+ export interface IRouterReadyOut {
54
53
  isStream?: boolean;
55
54
  }
56
- interface IShellReadyOut {
55
+ export interface IShellReadyOut {
57
56
  header?: string;
58
57
  footer?: string;
59
58
  }
@@ -61,4 +60,4 @@ interface IShellReadyOut {
61
60
  * Render application
62
61
  */
63
62
  declare function render({ App, handler }: IRenderParams, config: ServerConfig, context: IRequestContext, { onRouterReady, onShellReady, onResponse, onShellError, onError, getBody, getState, abortDelay, }: IRenderOptions): Promise<void>;
64
- export { render as default, IRequestContext, TRender, IRenderParams, IRenderOptions, IRouterReadyOut, IShellReadyOut };
63
+ export default render;
@@ -1,2 +1,2 @@
1
- import e from"chalk";import r from"react";import t from"./create-request.js";import o from"../../constants/stream-error.js";import s from"../../core/early-hints.js";import{getHeaderEntries as n,getSetCookieHeaders as a}from"../../core/headers.js";import i from"../../core/render.js";import d from"../../node/render-to-stream.js";import c from"../../node/request-signal.js";import m from"../../node/write-early-hints.js";import p,{writeFetchHeaders as l}from"../../node/write-fetch-response.js";import h from"../../services/ssr-manifest.js";const f=(e,r,o)=>{const s={signal:r};return o&&"GET"!==e.method&&"HEAD"!==e.method&&(s.body=o(e)??null),t(e,s)};async function u({App:t,handler:u},x,y,{onRouterReady:g,onShellReady:S,onResponse:E,onShellError:w,onError:C,getBody:j,getState:v,abortDelay:R=15e3}){const{appProps:b,html:A,req:H,res:q}=y,k=x.getLogger(),D=c(H,q);try{const c={appProps:b,html:A,request:f(H,D.signal,j),response:{headers:new Headers}},L=e=>(y.didError=e.didError,y.html=e.html,y.isStream=e.isStream,y.routerContext=e.routerContext,y.serverContext=e.serverContext,y),P=await i({createApp:(e,o)=>r.createElement(t,{server:{...o.appProps,req:H}},e),handler:u,renderToStream:d},c,{abortDelay:R,getState:v?({context:e})=>v({context:L(e)}):void 0,onError:({context:r,error:t})=>{const{code:s,message:n}=t;if(C?.({context:L(r),error:t}),k.info(e.red(`Stream error. Code: ${s}`)),[o.RenderAborted,o.RenderTimeout,o.RenderCancel].includes(s))return void k.info(e.dim(n));const{original:a}=t;k.error(a)},onResponse:E?({context:e,html:r})=>E({context:L(e),html:r}):void 0,onRouterReady:g?({context:e})=>g({context:L(e)}):void 0,onShellError:w?({context:e,error:r})=>w({context:L(e),error:r}):void 0,onShellReady:({context:e})=>{const r=L(e);((e,r)=>{if(r.headersSent||r.writableEnded)return;r.status(e.response.status??200),n(e.response.headers).forEach((([e,t])=>r.setHeader(e,t)));const t=a(e.response.headers);t.length&&r.setHeader("Set-Cookie",t)})(e,q);const t=S?.({context:r});return((e,r)=>{const t=new Headers(e.response.headers);t.delete("Set-Cookie");for(const[e,o]of Object.entries(r.getHeaders()))if("set-cookie"!==e.toLowerCase()&&void 0!==o)if(Array.isArray(o))for(const r of o)t.append(e,r);else t.set(e,"number"==typeof o?String(o):o);e.response.headers=t,e.response.status=r.statusCode})(e,q),t??{}},prepare:async({context:e,executionContext:r})=>{const t=L(e),o=h.get(x);await o.prepareDevAssets(e.routerContext?.matches);const n=o.injectAssets(t);t.hasEarlyHints&&await s(r,n)},routerRequestContext:y},{onEarlyHints:e=>m(q,e)});L(c),await(async(e,r)=>{const t=r.headers.get("Location");if(t&&r.status>=300&&r.status<400&&!e.headersSent&&!e.writableEnded&&!e.destroyed)return l(e,r),await(r.body?.cancel()),void e.redirect(r.status,t);await p(e,r)})(q,P)}finally{D.dispose()}}export{u as default};
1
+ import e from"chalk";import r from"react";import t from"./create-request.js";import o from"../../constants/stream-error.js";import s from"../../core/early-hints.js";import{getHeaderEntries as n,getSetCookieHeaders as a}from"../../core/headers.js";import i from"../../core/render.js";import d from"../../node/render-to-stream.js";import c from"../../node/request-signal.js";import m from"../../node/write-early-hints.js";import p,{writeFetchHeaders as l}from"../../node/write-fetch-response.js";import h from"../../services/ssr-manifest.js";const f=(e,r,o)=>{const s={signal:r};return o&&"GET"!==e.method&&"HEAD"!==e.method&&(s.body=o(e)??null),t(e,s)};async function u({App:t,handler:u},x,y,{onRouterReady:g,onShellReady:S,onResponse:E,onShellError:w,onError:C,getBody:j,getState:v,abortDelay:R=15e3}){const{appProps:b,html:A,req:H,res:q}=y,k=x.getLogger(),D=c(H,q);try{const c={appProps:b,html:A,request:f(H,D.signal,j),response:{headers:new Headers}},L=e=>(y.didError=e.didError,y.html=e.html,y.isStream=e.isStream,y.routerContext=e.routerContext,y.serverContext=e.serverContext,y),P=await i({createApp:(e,o)=>r.createElement(t,{server:{...o.appProps,req:H}},e),handler:u,renderToStream:d},c,{abortDelay:R,getState:v?({context:e})=>v({context:L(e)}):void 0,onError:({context:r,error:t})=>{const{code:s,message:n}=t;if(C?.({context:L(r),error:t}),k.info(e.red(`Stream error. Code: ${s}`)),[o.RenderAborted,o.RenderTimeout,o.RenderCancel].includes(s))return void k.info(e.dim(n));const{original:a}=t;k.error(a)},onResponse:E?({context:e,html:r})=>E({context:L(e),html:r}):void 0,onRouterReady:g?({context:e})=>g({context:L(e)}):void 0,onShellError:w?({context:e,error:r})=>w({context:L(e),error:r}):void 0,onShellReady:({context:e})=>{const r=L(e);((e,r)=>{if(r.headersSent||r.writableEnded)return;r.status(e.response.status??200),n(e.response.headers).forEach(([e,t])=>r.setHeader(e,t));const t=a(e.response.headers);t.length&&r.setHeader("Set-Cookie",t)})(e,q);const t=S?.({context:r});return((e,r)=>{const t=new Headers(e.response.headers);t.delete("Set-Cookie");for(const[e,o]of Object.entries(r.getHeaders()))if("set-cookie"!==e.toLowerCase()&&void 0!==o)if(Array.isArray(o))for(const r of o)t.append(e,r);else t.set(e,"number"==typeof o?String(o):o);e.response.headers=t,e.response.status=r.statusCode})(e,q),t??{}},prepare:async({context:e,executionContext:r})=>{const t=L(e),o=h.get(x);await o.prepareDevAssets(e.routerContext?.matches);const n=o.injectAssets(t);t.hasEarlyHints&&await s(r,n)},routerRequestContext:y},{onEarlyHints:e=>m(q,e)});L(c),await(async(e,r)=>{const t=r.headers.get("Location");if(t&&r.status>=300&&r.status<400&&!e.headersSent&&!e.writableEnded&&!e.destroyed)return l(e,r),await(r.body?.cancel()),void e.redirect(r.status,t);await p(e,r)})(q,P)}finally{D.dispose()}}export{u as default};
2
2
  //# sourceMappingURL=render.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"render.js","sources":["../../../src/adapters/express/render.tsx"],"sourcesContent":["import chalk from 'chalk';\nimport type { Request as ExpressRequest, Response as ExpressResponse } from 'express';\nimport React from 'react';\nimport type { StaticHandlerContext, StaticHandler } from 'react-router';\nimport createFetchRequest from '@adapters/express/create-request';\nimport type { TApp } from '@adapters/express/entry';\nimport StreamError from '@constants/stream-error';\nimport type { IServerContext } from '@context/server';\nimport emitEarlyHints from '@core/early-hints';\nimport { getHeaderEntries, getSetCookieHeaders } from '@core/headers';\nimport coreRender from '@core/render';\nimport type { ISsrRequestContext } from '@core/render';\nimport type { IObtainStreamErrorOut } from '@helpers/obtain-stream-error';\nimport renderToStream from '@node/render-to-stream';\nimport createRequestSignal from '@node/request-signal';\nimport writeEarlyHints from '@node/write-early-hints';\nimport writeFetchResponse, { writeFetchHeaders } from '@node/write-fetch-response';\nimport type ServerConfig from '@services/server-config';\nimport SsrManifest from '@services/ssr-manifest';\n\nexport interface IRequestContext<TAppProps = Record<any, any>> {\n req: ExpressRequest;\n res: ExpressResponse;\n appProps: NonNullable<TAppProps>;\n html: { header: string; footer: string };\n routerContext?: StaticHandlerContext;\n serverContext?: IServerContext;\n isStream?: boolean;\n hasEarlyHints?: boolean;\n didError?: StreamError;\n}\n\nexport type TRender<TAppProps = Record<any, any>> = (\n config: ServerConfig,\n context: IRequestContext<TAppProps>,\n options: IRenderOptions,\n) => Promise<void>;\n\nexport interface IRenderParams<TAppProps = Record<string, any>> {\n App: TApp<TAppProps>;\n handler: StaticHandler;\n}\n\nexport interface IRenderOptions<TAppProps = Record<string, any>> {\n abortDelay?: number;\n getBody?: (request: ExpressRequest) => BodyInit | null | undefined;\n onRouterReady?: (params: {\n context: IRequestContext<TAppProps>;\n }) => Promise<IRouterReadyOut> | IRouterReadyOut;\n onShellReady?: (params: { context: IRequestContext<TAppProps> }) => IShellReadyOut;\n onShellError?: (params: {\n context: IRequestContext<TAppProps>;\n error: Error;\n }) => string | undefined | void;\n onError?: (params: { context: IRequestContext<TAppProps>; error: IObtainStreamErrorOut }) => void;\n onResponse?: (params: {\n context: IRequestContext<TAppProps>;\n html: string;\n }) => string | undefined | void;\n getState?: (params: {\n context: IRequestContext<TAppProps>;\n }) => Record<string, Record<string, any>> | undefined | void;\n}\n\nexport interface IRouterReadyOut {\n isStream?: boolean;\n}\n\nexport interface IShellReadyOut {\n header?: string;\n footer?: string;\n}\n\n/**\n * Reconstruct parsed bodies only for request methods that can carry them.\n */\nconst createRenderRequest = (\n req: ExpressRequest,\n signal: AbortSignal,\n getBody: IRenderOptions['getBody'],\n): Request => {\n const options: { signal: AbortSignal; body?: BodyInit | null } = { signal };\n\n if (getBody && req.method !== 'GET' && req.method !== 'HEAD') {\n options.body = getBody(req) ?? null;\n }\n\n return createFetchRequest(req, options);\n};\n\n/**\n * Expose core response metadata to legacy hooks before they run.\n */\nconst prepareResponse = (context: ISsrRequestContext, res: ExpressResponse): void => {\n if (res.headersSent || res.writableEnded) {\n return;\n }\n\n res.status(context.response.status ?? 200);\n getHeaderEntries(context.response.headers).forEach(([name, value]) => res.setHeader(name, value));\n\n const cookies = getSetCookieHeaders(context.response.headers);\n\n if (cookies.length) {\n res.setHeader('Set-Cookie', cookies);\n }\n};\n\n/**\n * Copy legacy hook metadata back to the core; cookies remain on the live response.\n */\nconst syncResponse = (context: ISsrRequestContext, res: ExpressResponse): void => {\n const headers = new Headers(context.response.headers);\n\n headers.delete('Set-Cookie');\n\n for (const [name, value] of Object.entries(res.getHeaders())) {\n if (name.toLowerCase() === 'set-cookie' || value === undefined) {\n continue;\n }\n\n if (Array.isArray(value)) {\n for (const item of value) {\n headers.append(name, item);\n }\n } else {\n headers.set(name, typeof value === 'number' ? String(value) : value);\n }\n }\n\n context.response.headers = headers;\n context.response.status = res.statusCode;\n};\n\n/**\n * Preserve Express redirect formatting before falling back to the Fetch body writer.\n */\nconst writeResponse = async (res: ExpressResponse, response: Response): Promise<void> => {\n const location = response.headers.get('Location');\n\n if (\n location &&\n response.status >= 300 &&\n response.status < 400 &&\n !res.headersSent &&\n !res.writableEnded &&\n !res.destroyed\n ) {\n writeFetchHeaders(res, response);\n await response.body?.cancel();\n res.redirect(response.status, location);\n\n return;\n }\n\n await writeFetchResponse(res, response);\n};\n\n/**\n * Render application\n */\nasync function render(\n { App, handler }: IRenderParams,\n config: ServerConfig,\n context: IRequestContext,\n {\n onRouterReady,\n onShellReady,\n onResponse,\n onShellError,\n onError,\n getBody,\n getState,\n abortDelay = 15000,\n }: IRenderOptions,\n): Promise<void> {\n const { appProps, html: shellHtml, req, res } = context;\n const Logger = config.getLogger();\n const requestSignal = createRequestSignal(req, res);\n try {\n const coreContext: ISsrRequestContext = {\n appProps,\n html: shellHtml,\n request: createRenderRequest(req, requestSignal.signal, getBody),\n response: {\n headers: new Headers(),\n },\n };\n\n /**\n * Keep legacy hooks attached to their original mutable request context.\n */\n const syncContext = (updated: ISsrRequestContext): IRequestContext => {\n context.didError = updated.didError;\n context.html = updated.html;\n context.isStream = updated.isStream;\n context.routerContext = updated.routerContext;\n context.serverContext = updated.serverContext;\n\n return context;\n };\n const response = await coreRender(\n {\n /**\n * Preserve the legacy App server props and live Express request.\n */\n createApp: (children, updated) => (\n <App server={{ ...updated.appProps, req }}>{children}</App>\n ),\n handler,\n renderToStream,\n },\n coreContext,\n {\n abortDelay,\n\n /**\n * Read custom state through the legacy request context.\n */\n getState: getState\n ? ({ context: updated }) => getState({ context: syncContext(updated) })\n : undefined,\n\n /**\n * Preserve legacy error hooks and keep expected aborts at info level.\n */\n onError: ({ context: updated, error }) => {\n const { code, message } = error;\n\n onError?.({ context: syncContext(updated), error });\n Logger.info(chalk.red(`Stream error. Code: ${code}`));\n\n if (\n [\n StreamError.RenderAborted,\n StreamError.RenderTimeout,\n StreamError.RenderCancel,\n ].includes(code)\n ) {\n Logger.info(chalk.dim(message));\n\n return;\n }\n\n const { original } = error;\n\n Logger.error(original as string);\n },\n\n /**\n * Transform streamed HTML using the existing legacy hook signature.\n */\n onResponse: onResponse\n ? ({ context: updated, html }) => onResponse({ context: syncContext(updated), html })\n : undefined,\n\n /**\n * Expose router state before the legacy hook chooses a rendering mode.\n */\n onRouterReady: onRouterReady\n ? ({ context: updated }) => onRouterReady({ context: syncContext(updated) })\n : undefined,\n\n /**\n * Let the legacy hook replace the default shell-error response.\n */\n onShellError: onShellError\n ? ({ context: updated, error }) => onShellError({ context: syncContext(updated), error })\n : undefined,\n\n /**\n * Synchronize response metadata around the legacy shell hook.\n */\n onShellReady: ({ context: updated }) => {\n const legacyContext = syncContext(updated);\n\n prepareResponse(updated, res);\n\n const shell = onShellReady?.({ context: legacyContext });\n\n syncResponse(updated, res);\n\n return shell ?? {};\n },\n\n /**\n * Prepare Vite assets and send requested early hints before rendering.\n */\n prepare: async ({ context: updated, executionContext }) => {\n const legacyContext = syncContext(updated);\n const manifest = SsrManifest.get(config);\n\n await manifest.prepareDevAssets(updated.routerContext?.matches);\n\n const hints = manifest.injectAssets(legacyContext);\n\n if (legacyContext.hasEarlyHints) {\n await emitEarlyHints(executionContext, hints);\n }\n },\n routerRequestContext: context,\n },\n {\n /**\n * Deliver early hints through the existing Express response.\n */\n onEarlyHints: (headers) => writeEarlyHints(res, headers),\n },\n );\n\n syncContext(coreContext);\n\n await writeResponse(res, response);\n } finally {\n requestSignal.dispose();\n }\n}\n\nexport default render;\n"],"names":["createRenderRequest","req","signal","getBody","options","method","body","createFetchRequest","async","render","App","handler","config","context","onRouterReady","onShellReady","onResponse","onShellError","onError","getState","abortDelay","appProps","html","shellHtml","res","Logger","getLogger","requestSignal","createRequestSignal","coreContext","request","response","headers","Headers","syncContext","updated","didError","isStream","routerContext","serverContext","coreRender","createApp","children","React","createElement","server","renderToStream","undefined","error","code","message","info","chalk","red","StreamError","RenderAborted","RenderTimeout","RenderCancel","includes","dim","original","legacyContext","headersSent","writableEnded","status","getHeaderEntries","forEach","name","value","setHeader","cookies","getSetCookieHeaders","length","prepareResponse","shell","delete","Object","entries","getHeaders","toLowerCase","Array","isArray","item","append","set","String","statusCode","syncResponse","prepare","executionContext","manifest","SsrManifest","get","prepareDevAssets","matches","hints","injectAssets","hasEarlyHints","emitEarlyHints","routerRequestContext","onEarlyHints","writeEarlyHints","location","destroyed","writeFetchHeaders","cancel","redirect","writeFetchResponse","writeResponse","dispose"],"mappings":"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"}
1
+ {"version":3,"file":"render.js","sources":["../../../src/adapters/express/render.tsx"],"sourcesContent":[null],"names":["createRenderRequest","req","signal","getBody","options","method","body","createFetchRequest","async","render","App","handler","config","context","onRouterReady","onShellReady","onResponse","onShellError","onError","getState","abortDelay","appProps","html","shellHtml","res","Logger","getLogger","requestSignal","createRequestSignal","coreContext","request","response","headers","Headers","syncContext","updated","didError","isStream","routerContext","serverContext","coreRender","createApp","children","React","createElement","server","renderToStream","undefined","error","code","message","info","chalk","red","StreamError","RenderAborted","RenderTimeout","RenderCancel","includes","dim","original","legacyContext","headersSent","writableEnded","status","getHeaderEntries","forEach","name","value","setHeader","cookies","getSetCookieHeaders","length","prepareResponse","shell","delete","Object","entries","getHeaders","toLowerCase","Array","isArray","item","append","set","String","statusCode","syncResponse","prepare","executionContext","manifest","SsrManifest","get","prepareDevAssets","matches","hints","injectAssets","hasEarlyHints","emitEarlyHints","routerRequestContext","onEarlyHints","writeEarlyHints","location","destroyed","writeFetchHeaders","cancel","redirect","writeFetchResponse","writeResponse","dispose"],"mappings":"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"}
@@ -1,8 +1,7 @@
1
- /// <reference types="node" />
2
- import { Server } from 'node:net';
3
- import { Express } from 'express';
4
- import ServerConfig from "../../services/server-config.js";
5
- interface ICreateServerOut {
1
+ import type { Server } from 'node:net';
2
+ import type { Express } from 'express';
3
+ import type ServerConfig from '../../services/server-config.js';
4
+ export interface ICreateServerOut {
6
5
  run: (options?: {
7
6
  version?: string;
8
7
  isPrintInfo?: boolean;
@@ -13,4 +12,4 @@ interface ICreateServerOut {
13
12
  * Create SSR server
14
13
  */
15
14
  declare function createServer(config: ServerConfig): Promise<ICreateServerOut>;
16
- export { createServer as default, ICreateServerOut };
15
+ export default createServer;
@@ -1,2 +1,2 @@
1
- import e from"node:http";import r from"node:https";import t from"node:path";import s from"compression";import o from"express";import i from"./prepare-server.js";import a from"../../helpers/print-server-info.js";import n from"../../services/server-api.js";async function p(p){const d=o().disable("x-powered-by");p.isProd&&d.set("env","production");const c=new n;p.setApp(d);const m=i.init(p,c);if(!p.isProd){const e=await(await import("vite")).createServer({server:{middlewareMode:!0,watch:{usePolling:!0,interval:100}},appType:"custom",mode:p.mode});d.use(e.middlewares),p.setVite(e)}const{isSPA:l}=p.getParams();if(l||await m.onAppCreated(),p.isProd){const{root:e,publicDir:r}=p.getParams(),{compression:i,expressStatic:a}=m.getMiddlewaresConfig();if(i&&d.use(s(i)),l||d.use(((e,r,t)=>{"/index.html"!==e.url||c.hasAccessIndexHtml()||(e.url="/index-not-found.html"),t()})),a){const{basename:s,...i}=a;d.use(s,o.static(t.resolve(`${e}/${r}`),{...i,index:!!l&&void 0}))}}return l?d.use(/(.*)/,((e,r,t)=>{(async()=>{try{const t=(await m.loadHtml(e)).join("");r.send(t)}catch(e){p.getLogger().error(`Failed to handle request: ${e?.message}`,{error:e}),t(e)}})()})):d.use(/(.*)/,((e,r,t)=>{(async()=>{try{const[{render:s,onRequest:o,...i},a]=await Promise.all([m.loadEntrypoint(),m.loadHtml(e)]),{appProps:n,hasEarlyHints:d,shouldSkip:c,shouldCancel:l}=await(o?.(e,r))??{},[u,f]=a;if(l)return;if(c)return t();const h={req:e,res:r,hasEarlyHints:d,appProps:n??{},html:{header:u,footer:f}};await s(p,h,i)}catch(e){p.getLogger().error(`Failed to handle request: ${e?.message}`,{error:e}),t(e)}})()})),{run:({version:t,isPrintInfo:s=!0}={})=>{const{port:o,host:i}=p.getParams(),n=Boolean(p.getVite()?.config?.server?.https);p.isHost&&!p.isProd&&(p.getVite().config.server.host=i);const l=(n?r.createServer(p.getVite().config.server.https,d):e.createServer(d)).listen(o,i,(()=>{m.onServerStarted?.(d,c,l),s&&a(p,{version:t,server:l})}));return l},app:d}}export{p as default};
1
+ import e from"node:http";import r from"node:https";import t from"node:path";import s from"compression";import o from"express";import i from"./prepare-server.js";import a from"../../helpers/print-server-info.js";import n from"../../services/server-api.js";async function p(p){const d=o().disable("x-powered-by");p.isProd&&d.set("env","production");const c=new n;p.setApp(d);const m=i.init(p,c);if(!p.isProd){const e=await(await(import("vite"))).createServer({server:{middlewareMode:!0,watch:{usePolling:!0,interval:100}},appType:"custom",mode:p.mode});d.use(e.middlewares),p.setVite(e)}const{isSPA:l}=p.getParams();if(l||await m.onAppCreated(),p.isProd){const{root:e,publicDir:r}=p.getParams(),{compression:i,expressStatic:a}=m.getMiddlewaresConfig();if(i&&d.use(s(i)),l||d.use((e,r,t)=>{"/index.html"!==e.url||c.hasAccessIndexHtml()||(e.url="/index-not-found.html"),t()}),a){const{basename:s,...i}=a;d.use(s,o.static(t.resolve(`${e}/${r}`),{...i,index:!!l&&void 0}))}}return l?d.use(/(.*)/,(e,r,t)=>{(async()=>{try{const t=(await m.loadHtml(e)).join("");r.send(t)}catch(e){p.getLogger().error(`Failed to handle request: ${e?.message}`,{error:e}),t(e)}})()}):d.use(/(.*)/,(e,r,t)=>{(async()=>{try{const[{render:s,onRequest:o,...i},a]=await Promise.all([m.loadEntrypoint(),m.loadHtml(e)]),{appProps:n,hasEarlyHints:d,shouldSkip:c,shouldCancel:l}=await(o?.(e,r))??{},[u,f]=a;if(l)return;if(c)return t();const h={req:e,res:r,hasEarlyHints:d,appProps:n??{},html:{header:u,footer:f}};await s(p,h,i)}catch(e){p.getLogger().error(`Failed to handle request: ${e?.message}`,{error:e}),t(e)}})()}),{run:({version:t,isPrintInfo:s=!0}={})=>{const{port:o,host:i}=p.getParams(),n=Boolean(p.getVite()?.config?.server?.https);p.isHost&&!p.isProd&&(p.getVite().config.server.host=i);const l=(n?r.createServer(p.getVite().config.server.https,d):e.createServer(d)).listen(o,i,()=>{m.onServerStarted?.(d,c,l),s&&a(p,{version:t,server:l})});return l},app:d}}export{p as default};
2
2
  //# sourceMappingURL=server.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sources":["../../../src/adapters/express/server.ts"],"sourcesContent":["import http from 'node:http';\nimport https from 'node:https';\nimport type { Server } from 'node:net';\nimport path from 'node:path';\nimport compression from 'compression';\nimport type { Express } from 'express';\nimport express from 'express';\nimport PrepareServer from '@adapters/express/prepare-server';\nimport type { IRequestContext } from '@adapters/express/render';\nimport printServerInfo from '@helpers/print-server-info';\nimport ServerApi from '@services/server-api';\nimport type ServerConfig from '@services/server-config';\n\nexport interface ICreateServerOut {\n run: (options?: { version?: string; isPrintInfo?: boolean }) => Server;\n app: Express;\n}\n\n/**\n * Create SSR server\n */\nasync function createServer(config: ServerConfig): Promise<ICreateServerOut> {\n const app = express().disable('x-powered-by');\n\n if (config.isProd) {\n app.set('env', 'production');\n }\n\n const serverApi = new ServerApi();\n\n config.setApp(app);\n\n const prepareServer = PrepareServer.init(config, serverApi);\n\n if (!config.isProd) {\n /**\n * Create Vite server in middleware mode and configure the app type as\n * 'custom', disabling Vite's own HTML serving logic so parent server\n * can take control\n */\n const vite = await (\n await import('vite')\n ).createServer({\n server: {\n middlewareMode: true,\n watch: {\n /**\n * During tests, we edit the files too fast and sometimes chokidar\n * misses change events, so enforce polling for consistency\n */\n usePolling: true,\n interval: 100,\n },\n },\n appType: 'custom',\n mode: config.mode,\n });\n\n /**\n * Use vite's connect instance as middleware\n */\n app.use(vite.middlewares);\n\n config.setVite(vite);\n }\n\n const { isSPA } = config.getParams();\n\n if (!isSPA) {\n await prepareServer.onAppCreated();\n }\n\n if (config.isProd) {\n const { root, publicDir } = config.getParams();\n const { compression: compressionConfig, expressStatic } = prepareServer.getMiddlewaresConfig();\n\n if (compressionConfig) {\n app.use(compression(compressionConfig));\n }\n\n if (!isSPA) {\n /**\n * ignore index.html file in SSR mode\n */\n app.use((req, _, next) => {\n if (req.url === '/index.html' && !serverApi.hasAccessIndexHtml()) {\n req.url = '/index-not-found.html';\n }\n\n next();\n });\n }\n\n if (expressStatic) {\n const { basename, ...expressStaticOpts } = expressStatic;\n\n app.use(\n basename!,\n express.static(path.resolve(`${root}/${publicDir}`), {\n ...expressStaticOpts,\n index: isSPA ? undefined : false,\n }),\n );\n }\n }\n\n /**\n * SSR mode\n */\n if (!isSPA) {\n app.use(/(.*)/, (req, res, next) => {\n void (async () => {\n try {\n const [{ render, onRequest, ...renderParams }, clientHtml] = await Promise.all([\n prepareServer.loadEntrypoint(),\n prepareServer.loadHtml(req),\n ]);\n const { appProps, hasEarlyHints, shouldSkip, shouldCancel } =\n (await onRequest?.(req, res)) ?? {};\n const [header, footer] = clientHtml;\n\n if (shouldCancel) {\n return;\n }\n\n if (shouldSkip) {\n return next();\n }\n\n const context: IRequestContext = {\n req,\n res,\n hasEarlyHints,\n appProps: appProps ?? {},\n html: { header, footer },\n };\n\n await render(config, context, renderParams);\n } catch (e) {\n config\n .getLogger()\n .error(`Failed to handle request: ${(e as Error)?.message}`, { error: e as Error });\n next(e);\n }\n })();\n });\n } else {\n /**\n * SPA mode, redirect any request to index.html\n */\n app.use(/(.*)/, (req, res, next) => {\n void (async () => {\n try {\n const html = (await prepareServer.loadHtml(req)).join('');\n\n res.send(html);\n } catch (e) {\n config\n .getLogger()\n .error(`Failed to handle request: ${(e as Error)?.message}`, { error: e as Error });\n next(e);\n }\n })();\n });\n }\n\n return {\n /**\n * Start the configured transport and notify the server lifecycle hook.\n */\n run: ({ version, isPrintInfo = true } = {}): Server => {\n const { port, host } = config.getParams();\n const isHTTPS = Boolean(config.getVite()?.config?.server?.https);\n\n /**\n * update resolved host for print network link\n */\n if (config.isHost && !config.isProd) {\n config.getVite()!.config.server.host = host;\n }\n\n const server = (\n isHTTPS\n ? https.createServer(config.getVite()!.config.server.https!, app)\n : http.createServer(app)\n ).listen(port, host, () => {\n void prepareServer.onServerStarted?.(app, serverApi, server);\n\n if (!isPrintInfo) {\n return;\n }\n\n void printServerInfo(config, { version, server });\n });\n\n return server;\n },\n app,\n };\n}\n\nexport default createServer;\n"],"names":["async","createServer","config","app","express","disable","isProd","set","serverApi","ServerApi","setApp","prepareServer","PrepareServer","init","vite","import","server","middlewareMode","watch","usePolling","interval","appType","mode","use","middlewares","setVite","isSPA","getParams","onAppCreated","root","publicDir","compression","compressionConfig","expressStatic","getMiddlewaresConfig","req","_","next","url","hasAccessIndexHtml","basename","expressStaticOpts","static","path","resolve","index","undefined","res","html","loadHtml","join","send","e","getLogger","error","message","render","onRequest","renderParams","clientHtml","Promise","all","loadEntrypoint","appProps","hasEarlyHints","shouldSkip","shouldCancel","header","footer","context","run","version","isPrintInfo","port","host","isHTTPS","Boolean","getVite","https","isHost","http","listen","onServerStarted","printServerInfo"],"mappings":"+PAqBAA,eAAeC,EAAaC,GAC1B,MAAMC,EAAMC,IAAUC,QAAQ,gBAE1BH,EAAOI,QACTH,EAAII,IAAI,MAAO,cAGjB,MAAMC,EAAY,IAAIC,EAEtBP,EAAOQ,OAAOP,GAEd,MAAMQ,EAAgBC,EAAcC,KAAKX,EAAQM,GAEjD,IAAKN,EAAOI,OAAQ,CAMlB,MAAMQ,cACEC,OAAO,SACbd,aAAa,CACbe,OAAQ,CACNC,gBAAgB,EAChBC,MAAO,CAKLC,YAAY,EACZC,SAAU,MAGdC,QAAS,SACTC,KAAMpB,EAAOoB,OAMfnB,EAAIoB,IAAIT,EAAKU,aAEbtB,EAAOuB,QAAQX,EACjB,CAEA,MAAMY,MAAEA,GAAUxB,EAAOyB,YAMzB,GAJKD,SACGf,EAAciB,eAGlB1B,EAAOI,OAAQ,CACjB,MAAMuB,KAAEA,EAAIC,UAAEA,GAAc5B,EAAOyB,aAC3BI,YAAaC,EAAiBC,cAAEA,GAAkBtB,EAAcuB,uBAmBxE,GAjBIF,GACF7B,EAAIoB,IAAIQ,EAAYC,IAGjBN,GAIHvB,EAAIoB,KAAI,CAACY,EAAKC,EAAGC,KACC,gBAAZF,EAAIG,KAA0B9B,EAAU+B,uBAC1CJ,EAAIG,IAAM,yBAGZD,GAAM,IAINJ,EAAe,CACjB,MAAMO,SAAEA,KAAaC,GAAsBR,EAE3C9B,EAAIoB,IACFiB,EACApC,EAAQsC,OAAOC,EAAKC,QAAQ,GAAGf,KAAQC,KAAc,IAChDW,EACHI,QAAOnB,QAAQoB,IAGrB,CACF,CA8DA,OAzDKpB,EAyCHvB,EAAIoB,IAAI,QAAQ,CAACY,EAAKY,EAAKV,KACpB,WACH,IACE,MAAMW,SAAcrC,EAAcsC,SAASd,IAAMe,KAAK,IAEtDH,EAAII,KAAKH,EACX,CAAE,MAAOI,GACPlD,EACGmD,YACAC,MAAM,6BAA8BF,GAAaG,UAAW,CAAED,MAAOF,IACxEf,EAAKe,EACP,CACD,EAXI,EAWD,IApDNjD,EAAIoB,IAAI,QAAQ,CAACY,EAAKY,EAAKV,KACpB,WACH,IACE,OAAOmB,OAAEA,EAAMC,UAAEA,KAAcC,GAAgBC,SAAoBC,QAAQC,IAAI,CAC7ElD,EAAcmD,iBACdnD,EAAcsC,SAASd,MAEnB4B,SAAEA,EAAQC,cAAEA,EAAaC,WAAEA,EAAUC,aAAEA,SACpCT,IAAYtB,EAAKY,KAAS,CAAA,GAC5BoB,EAAQC,GAAUT,EAEzB,GAAIO,EACF,OAGF,GAAID,EACF,OAAO5B,IAGT,MAAMgC,EAA2B,CAC/BlC,MACAY,MACAiB,gBACAD,SAAUA,GAAY,CAAA,EACtBf,KAAM,CAAEmB,SAAQC,iBAGZZ,EAAOtD,EAAQmE,EAASX,EAChC,CAAE,MAAON,GACPlD,EACGmD,YACAC,MAAM,6BAA8BF,GAAaG,UAAW,CAAED,MAAOF,IACxEf,EAAKe,EACP,CACD,EAjCI,EAiCD,IAsBD,CAILkB,IAAK,EAAGC,UAASC,eAAc,GAAS,CAAA,KACtC,MAAMC,KAAEA,EAAIC,KAAEA,GAASxE,EAAOyB,YACxBgD,EAAUC,QAAQ1E,EAAO2E,WAAW3E,QAAQc,QAAQ8D,OAKtD5E,EAAO6E,SAAW7E,EAAOI,SAC3BJ,EAAO2E,UAAW3E,OAAOc,OAAO0D,KAAOA,GAGzC,MAAM1D,GACJ2D,EACIG,EAAM7E,aAAaC,EAAO2E,UAAW3E,OAAOc,OAAO8D,MAAQ3E,GAC3D6E,EAAK/E,aAAaE,IACtB8E,OAAOR,EAAMC,GAAM,KACd/D,EAAcuE,kBAAkB/E,EAAKK,EAAWQ,GAEhDwD,GAIAW,EAAgBjF,EAAQ,CAAEqE,UAASvD,UAAS,IAGnD,OAAOA,CAAM,EAEfb,MAEJ"}
1
+ {"version":3,"file":"server.js","sources":["../../../src/adapters/express/server.ts"],"sourcesContent":[null],"names":["async","createServer","config","app","express","disable","isProd","set","serverApi","ServerApi","setApp","prepareServer","PrepareServer","init","vite","server","middlewareMode","watch","usePolling","interval","appType","mode","use","middlewares","setVite","isSPA","getParams","onAppCreated","root","publicDir","compression","compressionConfig","expressStatic","getMiddlewaresConfig","req","_","next","url","hasAccessIndexHtml","basename","expressStaticOpts","static","path","resolve","index","undefined","res","html","loadHtml","join","send","e","getLogger","error","message","render","onRequest","renderParams","clientHtml","Promise","all","loadEntrypoint","appProps","hasEarlyHints","shouldSkip","shouldCancel","header","footer","context","run","version","isPrintInfo","port","host","isHTTPS","Boolean","getVite","https","isHost","http","listen","onServerStarted","printServerInfo"],"mappings":"+PAqBAA,eAAeC,EAAaC,GAC1B,MAAMC,EAAMC,IAAUC,QAAQ,gBAE1BH,EAAOI,QACTH,EAAII,IAAI,MAAO,cAGjB,MAAMC,EAAY,IAAIC,EAEtBP,EAAOQ,OAAOP,GAEd,MAAMQ,EAAgBC,EAAcC,KAAKX,EAAQM,GAEjD,IAAKN,EAAOI,OAAQ,CAMlB,MAAMQ,qBACS,UACbb,aAAa,CACbc,OAAQ,CACNC,gBAAgB,EAChBC,MAAO,CAKLC,YAAY,EACZC,SAAU,MAGdC,QAAS,SACTC,KAAMnB,EAAOmB,OAMflB,EAAImB,IAAIR,EAAKS,aAEbrB,EAAOsB,QAAQV,EACjB,CAEA,MAAMW,MAAEA,GAAUvB,EAAOwB,YAMzB,GAJKD,SACGd,EAAcgB,eAGlBzB,EAAOI,OAAQ,CACjB,MAAMsB,KAAEA,EAAIC,UAAEA,GAAc3B,EAAOwB,aAC3BI,YAAaC,EAAiBC,cAAEA,GAAkBrB,EAAcsB,uBAmBxE,GAjBIF,GACF5B,EAAImB,IAAIQ,EAAYC,IAGjBN,GAIHtB,EAAImB,IAAI,CAACY,EAAKC,EAAGC,KACC,gBAAZF,EAAIG,KAA0B7B,EAAU8B,uBAC1CJ,EAAIG,IAAM,yBAGZD,MAIAJ,EAAe,CACjB,MAAMO,SAAEA,KAAaC,GAAsBR,EAE3C7B,EAAImB,IACFiB,EACAnC,EAAQqC,OAAOC,EAAKC,QAAQ,GAAGf,KAAQC,KAAc,IAChDW,EACHI,QAAOnB,QAAQoB,IAGrB,CACF,CA8DA,OAzDKpB,EAyCHtB,EAAImB,IAAI,OAAQ,CAACY,EAAKY,EAAKV,KACpB,WACH,IACE,MAAMW,SAAcpC,EAAcqC,SAASd,IAAMe,KAAK,IAEtDH,EAAII,KAAKH,EACX,CAAE,MAAOI,GACPjD,EACGkD,YACAC,MAAM,6BAA8BF,GAAaG,UAAW,CAAED,MAAOF,IACxEf,EAAKe,EACP,CACD,EAXI,KAzCPhD,EAAImB,IAAI,OAAQ,CAACY,EAAKY,EAAKV,KACpB,WACH,IACE,OAAOmB,OAAEA,EAAMC,UAAEA,KAAcC,GAAgBC,SAAoBC,QAAQC,IAAI,CAC7EjD,EAAckD,iBACdlD,EAAcqC,SAASd,MAEnB4B,SAAEA,EAAQC,cAAEA,EAAaC,WAAEA,EAAUC,aAAEA,SACpCT,IAAYtB,EAAKY,KAAS,CAAA,GAC5BoB,EAAQC,GAAUT,EAEzB,GAAIO,EACF,OAGF,GAAID,EACF,OAAO5B,IAGT,MAAMgC,EAA2B,CAC/BlC,MACAY,MACAiB,gBACAD,SAAUA,GAAY,CAAA,EACtBf,KAAM,CAAEmB,SAAQC,iBAGZZ,EAAOrD,EAAQkE,EAASX,EAChC,CAAE,MAAON,GACPjD,EACGkD,YACAC,MAAM,6BAA8BF,GAAaG,UAAW,CAAED,MAAOF,IACxEf,EAAKe,EACP,CACD,EAjCI,KAuDF,CAILkB,IAAK,EAAGC,UAASC,eAAc,GAAS,CAAA,KACtC,MAAMC,KAAEA,EAAIC,KAAEA,GAASvE,EAAOwB,YACxBgD,EAAUC,QAAQzE,EAAO0E,WAAW1E,QAAQa,QAAQ8D,OAKtD3E,EAAO4E,SAAW5E,EAAOI,SAC3BJ,EAAO0E,UAAW1E,OAAOa,OAAO0D,KAAOA,GAGzC,MAAM1D,GACJ2D,EACIG,EAAM5E,aAAaC,EAAO0E,UAAW1E,OAAOa,OAAO8D,MAAQ1E,GAC3D4E,EAAK9E,aAAaE,IACtB6E,OAAOR,EAAMC,EAAM,KACd9D,EAAcsE,kBAAkB9E,EAAKK,EAAWO,GAEhDwD,GAIAW,EAAgBhF,EAAQ,CAAEoE,UAASvD,aAG1C,OAAOA,GAETZ,MAEJ"}
@@ -1,11 +1,11 @@
1
- import { Request, RequestHandler } from 'express';
2
- import { INodeAdapterOptions } from "./node.js";
3
- import { TSsrHandler } from "../core/types.js";
4
- interface IExpressAdapterOptions extends INodeAdapterOptions {
1
+ import type { Request, RequestHandler } from 'express';
2
+ import type { INodeAdapterOptions } from './node.js';
3
+ import type { TSsrHandler } from '../core/types.js';
4
+ export interface IExpressAdapterOptions extends INodeAdapterOptions {
5
5
  getBody?: (request: Request) => BodyInit | null | undefined;
6
6
  }
7
7
  /**
8
8
  * Bridge Express middleware to Fetch while retaining parsed body support.
9
9
  */
10
10
  declare const adapterExpress: (handler: TSsrHandler, options?: IExpressAdapterOptions) => RequestHandler;
11
- export { adapterExpress as default, IExpressAdapterOptions };
11
+ export default adapterExpress;
@@ -1 +1 @@
1
- {"version":3,"file":"express.js","sources":["../../src/adapters/express.ts"],"sourcesContent":["import type { NextFunction, Request, RequestHandler, Response as ExpressResponse } from 'express';\nimport serializeBody from '@adapters/body';\nimport createFetchRequest from '@adapters/express/create-request';\nimport { handleRequest } from '@adapters/node';\nimport type { INodeAdapterOptions } from '@adapters/node';\nimport type { TSsrHandler } from '@core/types';\nimport createRequestSignal from '@node/request-signal';\n\nexport interface IExpressAdapterOptions extends INodeAdapterOptions {\n getBody?: (request: Request) => BodyInit | null | undefined;\n}\n\n/**\n * Bridge Express middleware to Fetch while retaining parsed body support.\n */\nconst adapterExpress = (\n handler: TSsrHandler,\n options: IExpressAdapterOptions = {},\n): RequestHandler => {\n /**\n * Preserve Express routing semantics and dispose request listeners on completion.\n */\n return (req: Request, res: ExpressResponse, next: NextFunction): void => {\n const requestSignal = createRequestSignal(req, res);\n\n /**\n * Forward failures only while the client connection is still active.\n */\n const onError = (error: unknown): void => {\n if (!requestSignal.signal.aborted) {\n next(error);\n }\n };\n\n try {\n const requestOptions: { body?: BodyInit | null; signal: AbortSignal } = {\n signal: requestSignal.signal,\n };\n\n if (options.getBody) {\n requestOptions.body = options.getBody(req) ?? null;\n } else if (req.body !== undefined) {\n requestOptions.body = serializeBody(req.body, req.get('Content-Type'));\n }\n\n void handleRequest(handler, createFetchRequest(req, requestOptions), res, {\n compression: options.compression,\n })\n .catch(onError)\n .finally(requestSignal.dispose);\n } catch (error) {\n requestSignal.dispose();\n onError(error);\n }\n };\n};\n\nexport default adapterExpress;\n"],"names":["adapterExpress","handler","options","req","res","next","requestSignal","createRequestSignal","onError","error","signal","aborted","requestOptions","getBody","body","undefined","serializeBody","get","handleRequest","createFetchRequest","compression","catch","finally","dispose"],"mappings":"uJAeA,MAAMA,EAAiB,CACrBC,EACAC,EAAkC,KAK3B,CAACC,EAAcC,EAAsBC,KAC1C,MAAMC,EAAgBC,EAAoBJ,EAAKC,GAKzCI,EAAWC,IACVH,EAAcI,OAAOC,SACxBN,EAAKI,EACP,EAGF,IACE,MAAMG,EAAkE,CACtEF,OAAQJ,EAAcI,QAGpBR,EAAQW,QACVD,EAAeE,KAAOZ,EAAQW,QAAQV,IAAQ,UACxBY,IAAbZ,EAAIW,OACbF,EAAeE,KAAOE,EAAcb,EAAIW,KAAMX,EAAIc,IAAI,kBAGnDC,EAAcjB,EAASkB,EAAmBhB,EAAKS,GAAiBR,EAAK,CACxEgB,YAAalB,EAAQkB,cAEpBC,MAAMb,GACNc,QAAQhB,EAAciB,QAC3B,CAAE,MAAOd,GACPH,EAAciB,UACdf,EAAQC,EACV"}
1
+ {"version":3,"file":"express.js","sources":["../../src/adapters/express.ts"],"sourcesContent":[null],"names":["adapterExpress","handler","options","req","res","next","requestSignal","createRequestSignal","onError","error","signal","aborted","requestOptions","getBody","body","undefined","serializeBody","get","handleRequest","createFetchRequest","compression","catch","finally","dispose"],"mappings":"uJAeA,MAAMA,EAAiB,CACrBC,EACAC,EAAkC,KAK3B,CAACC,EAAcC,EAAsBC,KAC1C,MAAMC,EAAgBC,EAAoBJ,EAAKC,GAKzCI,EAAWC,IACVH,EAAcI,OAAOC,SACxBN,EAAKI,IAIT,IACE,MAAMG,EAAkE,CACtEF,OAAQJ,EAAcI,QAGpBR,EAAQW,QACVD,EAAeE,KAAOZ,EAAQW,QAAQV,IAAQ,UACxBY,IAAbZ,EAAIW,OACbF,EAAeE,KAAOE,EAAcb,EAAIW,KAAMX,EAAIc,IAAI,kBAGnDC,EAAcjB,EAASkB,EAAmBhB,EAAKS,GAAiBR,EAAK,CACxEgB,YAAalB,EAAQkB,cAEpBC,MAAMb,GACNc,QAAQhB,EAAciB,QAC3B,CAAE,MAAOd,GACPH,EAAciB,UACdf,EAAQC,EACV"}