@lomray/vite-ssr-boost 7.1.0 → 8.0.0-beta.2

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 (248) hide show
  1. package/README.md +18 -1
  2. package/adapters/body.d.ts +5 -0
  3. package/adapters/body.js +2 -0
  4. package/adapters/body.js.map +1 -0
  5. package/adapters/compression.d.ts +11 -0
  6. package/adapters/compression.js +2 -0
  7. package/adapters/compression.js.map +1 -0
  8. package/adapters/edge.d.ts +11 -0
  9. package/adapters/edge.js +2 -0
  10. package/adapters/edge.js.map +1 -0
  11. package/adapters/express/create-request.d.ts +11 -0
  12. package/adapters/express/create-request.js +2 -0
  13. package/adapters/express/create-request.js.map +1 -0
  14. package/adapters/express/entry.d.ts +55 -0
  15. package/adapters/express/entry.js.map +1 -0
  16. package/{services → adapters/express}/prepare-server.d.ts +15 -40
  17. package/adapters/express/prepare-server.js +2 -0
  18. package/adapters/express/prepare-server.js.map +1 -0
  19. package/adapters/express/render.d.ts +63 -0
  20. package/adapters/express/render.js +2 -0
  21. package/adapters/express/render.js.map +1 -0
  22. package/adapters/express/server.d.ts +15 -0
  23. package/adapters/express/server.js +2 -0
  24. package/adapters/express/server.js.map +1 -0
  25. package/adapters/express.d.ts +11 -0
  26. package/adapters/express.js +2 -0
  27. package/adapters/express.js.map +1 -0
  28. package/adapters/fastify.d.ts +23 -0
  29. package/adapters/fastify.js +2 -0
  30. package/adapters/fastify.js.map +1 -0
  31. package/adapters/hono.d.ts +13 -0
  32. package/adapters/hono.js +2 -0
  33. package/adapters/hono.js.map +1 -0
  34. package/adapters/node.d.ts +19 -0
  35. package/adapters/node.js +2 -0
  36. package/adapters/node.js.map +1 -0
  37. package/browser/entry.d.ts +9 -9
  38. package/browser/entry.js +1 -1
  39. package/browser/entry.js.map +1 -1
  40. package/cli/build.d.ts +2 -2
  41. package/cli/build.js.map +1 -1
  42. package/cli/helpers/keyboard-input.d.ts +1 -1
  43. package/cli/helpers/keyboard-input.js +1 -1
  44. package/cli/helpers/keyboard-input.js.map +1 -1
  45. package/cli/helpers/vite-reset-cache.d.ts +1 -1
  46. package/cli/helpers/vite-reset-cache.js.map +1 -1
  47. package/cli/interfaces/actions.d.ts +8 -9
  48. package/cli/run-amplify-build.d.ts +1 -1
  49. package/cli/run-amplify-build.js.map +1 -1
  50. package/cli/run-dev.d.ts +3 -4
  51. package/cli/run-dev.js +1 -1
  52. package/cli/run-dev.js.map +1 -1
  53. package/cli/run-docker-build.d.ts +2 -2
  54. package/cli/run-docker-build.js.map +1 -1
  55. package/cli/run-prod.d.ts +5 -6
  56. package/cli/run-prod.js +1 -1
  57. package/cli/run-prod.js.map +1 -1
  58. package/cli/run-serverless.d.ts +3 -3
  59. package/cli/run-serverless.js +1 -1
  60. package/cli/run-serverless.js.map +1 -1
  61. package/cli/run-vercel-build.d.ts +1 -1
  62. package/cli/run-vercel-build.js.map +1 -1
  63. package/cli.js +1 -1
  64. package/cli.js.map +1 -1
  65. package/components/navigate.d.ts +3 -3
  66. package/components/navigate.js.map +1 -1
  67. package/components/only-client.d.ts +2 -2
  68. package/components/only-client.js +1 -1
  69. package/components/only-client.js.map +1 -1
  70. package/components/render-client.d.ts +4 -4
  71. package/components/render-client.js +1 -1
  72. package/components/render-client.js.map +1 -1
  73. package/components/response-status.d.ts +2 -2
  74. package/components/response-status.js +1 -1
  75. package/components/response-status.js.map +1 -1
  76. package/components/scroll-to-top.d.ts +2 -2
  77. package/components/scroll-to-top.js +1 -1
  78. package/components/scroll-to-top.js.map +1 -1
  79. package/components/with-suspense.d.ts +3 -3
  80. package/components/with-suspense.js.map +1 -1
  81. package/constants/cli-actions.d.ts +1 -1
  82. package/constants/cli-actions.js.map +1 -1
  83. package/constants/cli-context.d.ts +4 -5
  84. package/constants/cli-context.js.map +1 -1
  85. package/constants/cli-name.d.ts +1 -1
  86. package/constants/cli-name.js.map +1 -1
  87. package/constants/cli-shortcuts.d.ts +2 -2
  88. package/constants/cli-shortcuts.js +1 -1
  89. package/constants/cli-shortcuts.js.map +1 -1
  90. package/constants/common.js.map +1 -1
  91. package/constants/plugin-name.d.ts +1 -1
  92. package/constants/plugin-name.js.map +1 -1
  93. package/constants/stream-error.d.ts +1 -1
  94. package/constants/stream-error.js.map +1 -1
  95. package/context/server.d.ts +3 -4
  96. package/context/server.js.map +1 -1
  97. package/core/compose-html.d.ts +5 -0
  98. package/core/compose-html.js +2 -0
  99. package/core/compose-html.js.map +1 -0
  100. package/core/early-hints.d.ts +6 -0
  101. package/core/early-hints.js +2 -0
  102. package/core/early-hints.js.map +1 -0
  103. package/core/handler.d.ts +30 -0
  104. package/core/handler.js +2 -0
  105. package/core/handler.js.map +1 -0
  106. package/core/head-response.d.ts +5 -0
  107. package/core/head-response.js +2 -0
  108. package/core/head-response.js.map +1 -0
  109. package/core/headers.d.ts +12 -0
  110. package/core/headers.js +2 -0
  111. package/core/headers.js.map +1 -0
  112. package/core/render.d.ts +101 -0
  113. package/core/render.js +2 -0
  114. package/core/render.js.map +1 -0
  115. package/core/transform-html.d.ts +7 -0
  116. package/core/transform-html.js +2 -0
  117. package/core/transform-html.js.map +1 -0
  118. package/core/types.d.ts +7 -0
  119. package/core/types.js +2 -0
  120. package/core/types.js.map +1 -0
  121. package/edge/render-to-stream.d.ts +6 -0
  122. package/edge/render-to-stream.js +2 -0
  123. package/edge/render-to-stream.js.map +1 -0
  124. package/helpers/build-custom-state.d.ts +2 -3
  125. package/helpers/build-custom-state.js +1 -1
  126. package/helpers/build-custom-state.js.map +1 -1
  127. package/helpers/build-router-state.d.ts +2 -2
  128. package/helpers/build-router-state.js.map +1 -1
  129. package/helpers/create-focus-only.d.ts +3 -3
  130. package/helpers/create-focus-only.js.map +1 -1
  131. package/helpers/dev-marker.d.ts +1 -1
  132. package/helpers/dev-marker.js.map +1 -1
  133. package/helpers/get-server-state.d.ts +1 -1
  134. package/helpers/get-server-state.js.map +1 -1
  135. package/helpers/html-escape.d.ts +1 -1
  136. package/helpers/html-escape.js +1 -1
  137. package/helpers/html-escape.js.map +1 -1
  138. package/helpers/import-route.d.ts +7 -7
  139. package/helpers/import-route.js +1 -1
  140. package/helpers/import-route.js.map +1 -1
  141. package/helpers/is-route-file.d.ts +1 -1
  142. package/helpers/is-route-file.js.map +1 -1
  143. package/helpers/obtain-stream-error.d.ts +3 -3
  144. package/helpers/obtain-stream-error.js +1 -1
  145. package/helpers/obtain-stream-error.js.map +1 -1
  146. package/helpers/plugin-config.d.ts +5 -5
  147. package/helpers/plugin-config.js +1 -1
  148. package/helpers/plugin-config.js.map +1 -1
  149. package/helpers/print-server-info.d.ts +3 -4
  150. package/helpers/print-server-info.js +1 -1
  151. package/helpers/print-server-info.js.map +1 -1
  152. package/helpers/print-server-urls.d.ts +2 -2
  153. package/helpers/print-server-urls.js +1 -1
  154. package/helpers/print-server-urls.js.map +1 -1
  155. package/helpers/process-stop.d.ts +1 -1
  156. package/helpers/process-stop.js.map +1 -1
  157. package/helpers/resolve-server-urls.d.ts +3 -4
  158. package/helpers/resolve-server-urls.js +1 -1
  159. package/helpers/resolve-server-urls.js.map +1 -1
  160. package/helpers/serialize-errors.d.ts +2 -2
  161. package/helpers/serialize-errors.js.map +1 -1
  162. package/helpers/vite-aliases.d.ts +2 -2
  163. package/helpers/vite-aliases.js +1 -1
  164. package/helpers/vite-aliases.js.map +1 -1
  165. package/interfaces/fc-route.d.ts +4 -4
  166. package/interfaces/fc-route.js.map +1 -1
  167. package/interfaces/fc.d.ts +3 -4
  168. package/interfaces/route-object.d.ts +6 -6
  169. package/node/compress-response.d.ts +6 -0
  170. package/node/compress-response.js +2 -0
  171. package/node/compress-response.js.map +1 -0
  172. package/node/create-headers.d.ts +6 -0
  173. package/node/create-headers.js +2 -0
  174. package/node/create-headers.js.map +1 -0
  175. package/node/create-request.d.ts +13 -0
  176. package/node/create-request.js +2 -0
  177. package/node/create-request.js.map +1 -0
  178. package/node/http.d.ts +4 -0
  179. package/node/http.js +2 -0
  180. package/node/http.js.map +1 -0
  181. package/node/render-to-stream.d.ts +6 -0
  182. package/node/render-to-stream.js +2 -0
  183. package/node/render-to-stream.js.map +1 -0
  184. package/node/request-signal.d.ts +10 -0
  185. package/node/request-signal.js +2 -0
  186. package/node/request-signal.js.map +1 -0
  187. package/node/split-link-header.d.ts +5 -0
  188. package/node/split-link-header.js +2 -0
  189. package/node/split-link-header.js.map +1 -0
  190. package/node/write-early-hints.d.ts +6 -0
  191. package/node/write-early-hints.js +2 -0
  192. package/node/write-early-hints.js.map +1 -0
  193. package/node/write-fetch-response.d.ts +11 -0
  194. package/node/write-fetch-response.js +2 -0
  195. package/node/write-fetch-response.js.map +1 -0
  196. package/package.json +89 -27
  197. package/plugin.d.ts +7 -7
  198. package/plugin.js.map +1 -1
  199. package/plugins/create-spa-index.d.ts +3 -3
  200. package/plugins/create-spa-index.js.map +1 -1
  201. package/plugins/handle-custom-entrypoint.d.ts +4 -4
  202. package/plugins/handle-custom-entrypoint.js +1 -1
  203. package/plugins/handle-custom-entrypoint.js.map +1 -1
  204. package/plugins/make-aliases.d.ts +3 -3
  205. package/plugins/make-aliases.js +1 -1
  206. package/plugins/make-aliases.js.map +1 -1
  207. package/plugins/normalize-route.d.ts +3 -3
  208. package/plugins/normalize-route.js.map +1 -1
  209. package/services/build.d.ts +5 -51
  210. package/services/build.js +1 -1
  211. package/services/build.js.map +1 -1
  212. package/services/logger.d.ts +2 -30
  213. package/services/logger.js.map +1 -1
  214. package/services/parse-routes.d.ts +5 -42
  215. package/services/parse-routes.js +1 -1
  216. package/services/parse-routes.js.map +1 -1
  217. package/services/path-normalize.d.ts +3 -18
  218. package/services/path-normalize.js +1 -1
  219. package/services/path-normalize.js.map +1 -1
  220. package/services/server-api.d.ts +1 -7
  221. package/services/server-api.js.map +1 -1
  222. package/services/server-config.d.ts +7 -52
  223. package/services/server-config.js +1 -1
  224. package/services/server-config.js.map +1 -1
  225. package/services/ssr-manifest.d.ts +20 -60
  226. package/services/ssr-manifest.js +1 -1
  227. package/services/ssr-manifest.js.map +1 -1
  228. package/workflow/Dockerfile +1 -1
  229. package/helpers/handle-response.d.ts +0 -7
  230. package/helpers/handle-response.js +0 -2
  231. package/helpers/handle-response.js.map +0 -1
  232. package/node/create-fetch-request.d.ts +0 -7
  233. package/node/create-fetch-request.js +0 -2
  234. package/node/create-fetch-request.js.map +0 -1
  235. package/node/entry.d.ts +0 -63
  236. package/node/entry.js.map +0 -1
  237. package/node/render.d.ts +0 -64
  238. package/node/render.js +0 -2
  239. package/node/render.js.map +0 -1
  240. package/node/server.d.ts +0 -16
  241. package/node/server.js +0 -2
  242. package/node/server.js.map +0 -1
  243. package/node/write-response.d.ts +0 -14
  244. package/node/write-response.js +0 -2
  245. package/node/write-response.js.map +0 -1
  246. package/services/prepare-server.js +0 -2
  247. package/services/prepare-server.js.map +0 -1
  248. /package/{node → adapters/express}/entry.js +0 -0
package/README.md CHANGED
@@ -14,7 +14,7 @@ It is built for applications that want to keep Vite and React Router visible, bu
14
14
  - React Router on both client and server
15
15
  - stream rendering with request lifecycle hooks
16
16
  - a Vite-native plugin and CLI flow
17
- - Switch between SPA and SSR in 1 second.
17
+ - a Fetch-based SSR core with Node, Express, Fastify, Hono and edge adapters
18
18
  - response-aware helpers such as redirects and status codes
19
19
  - custom entrypoints for mobile, embedded and service-worker-friendly shells
20
20
 
@@ -35,10 +35,27 @@ 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
+ 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):
40
+
41
+ ```bash
42
+ git clone https://github.com/Lomray-Software/vite-template.git
43
+ cd vite-template
44
+ npm ci
45
+ npm run develop
46
+ ```
47
+
48
+ For production, run `npm run build` and `npm run start:ssr`. For a static SPA, run
49
+ `npm run build:spa` and `npm run start:spa`.
50
+
38
51
  ## Documentation
39
52
 
40
53
  Full documentation lives here: [lomray-software.github.io/vite-ssr-boost](https://lomray-software.github.io/vite-ssr-boost/)
41
54
 
55
+ Existing Express applications move one import to `adapters/express/entry`; hooks are unchanged. See
56
+ [runtime adapters](https://lomray-software.github.io/vite-ssr-boost/guide/runtime-adapters)
57
+ for the Fetch API and the differences between the managed CLI server and a custom runtime.
58
+
42
59
  ## License
43
60
 
44
61
  Made with 💚
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Reconstruct supported parsed bodies while preserving native Fetch body values.
3
+ */
4
+ declare const serializeBody: (body: unknown, contentType?: string) => BodyInit | null;
5
+ export default serializeBody;
@@ -0,0 +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};
2
+ //# sourceMappingURL=body.js.map
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,11 @@
1
+ export type TCompressionFormat = 'deflate' | 'gzip';
2
+ export interface ICompressionOptions {
3
+ format?: TCompressionFormat;
4
+ }
5
+ export type TCompression = boolean | ICompressionOptions;
6
+ type TCreateCompressionStream = (format: TCompressionFormat) => ReadableWritablePair<Uint8Array, BufferSource>;
7
+ /**
8
+ * Compress eligible responses using the transport-provided stream implementation.
9
+ */
10
+ declare const compressResponse: (request: Request, response: Response, compression?: TCompression, createStream?: TCreateCompressionStream) => Response;
11
+ export default compressResponse;
@@ -0,0 +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};
2
+ //# sourceMappingURL=compression.js.map
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,11 @@
1
+ import type { TCompression } from './compression.js';
2
+ import type { TSsrHandler } from '../core/types.js';
3
+ export interface IEdgeAdapterOptions {
4
+ compression?: TCompression;
5
+ }
6
+ export type TEdgeHandler<TPlatformArgs extends unknown[] = unknown[]> = (request: Request, ...platformArgs: TPlatformArgs) => Promise<Response>;
7
+ /**
8
+ * Adapt the Fetch handler to runtime fetch entrypoints and optional compression.
9
+ */
10
+ declare const adapterEdge: <TPlatformArgs extends unknown[] = unknown[]>(handler: TSsrHandler, { compression }?: IEdgeAdapterOptions) => TEdgeHandler<TPlatformArgs>;
11
+ export default adapterEdge;
@@ -0,0 +1,2 @@
1
+ import o from"./compression.js";import s from"../core/head-response.js";const r=(r,{compression:e=!1}={})=>async(...[a])=>s(a,o(a,await r(a),e));export{r as default};
2
+ //# sourceMappingURL=edge.js.map
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,11 @@
1
+ import type { Request as ExpressRequest } from 'express';
2
+ interface ICreateFetchRequestOptions {
3
+ body?: BodyInit | null;
4
+ signal?: AbortSignal;
5
+ }
6
+ /**
7
+ * Preserve Express's trusted protocol and original URL when creating the router request.
8
+ */
9
+ declare function createFetchRequest(req: ExpressRequest, options?: ICreateFetchRequestOptions): Request;
10
+ export type { ICreateFetchRequestOptions };
11
+ export default createFetchRequest;
@@ -0,0 +1,2 @@
1
+ import o from"../body.js";import t from"../../node/create-request.js";function e(e,r={}){const d={...r,origin:`${e.protocol}://${e.get("host")}`,url:e.originalUrl||e.url};return Object.hasOwn(r,"body")||void 0===e.body||"GET"===e.method||"HEAD"===e.method||(d.body=o(e.body,e.get("Content-Type"))),t(e,d)}export{e as default};
2
+ //# sourceMappingURL=create-request.js.map
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,55 @@
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';
5
+ import { createStaticHandler } from 'react-router';
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>> {
13
+ appProps?: T;
14
+ hasEarlyHints?: boolean;
15
+ shouldSkip?: boolean;
16
+ shouldCancel?: boolean;
17
+ }
18
+ export interface IEntrypointOptions<TAppProps = Record<string, any>> extends Pick<IRenderOptions<TAppProps>, 'onRouterReady' | 'onShellReady' | 'onShellError' | 'onResponse' | 'onError' | 'getState' | 'getBody'> {
19
+ onServerCreated?: (app: Express, serverApi: ServerApi) => Promise<void> | void;
20
+ onServerStarted?: (app: Express, serverApi: ServerApi, server: Server) => Promise<void> | void;
21
+ onRequest?: (req: Request, res: ExpressResponse) => Promise<IInitServerRequestOut<TAppProps>> | IInitServerRequestOut<TAppProps>;
22
+ }
23
+ export interface IPrepareRenderOut<TAppProps = Record<string, any>> {
24
+ render: TRender;
25
+ init: IEntryServerOptions<TAppProps>['init'];
26
+ routes: TRouteObject[];
27
+ abortDelay?: number;
28
+ loggerProd?: Logger;
29
+ loggerDev?: Logger;
30
+ middlewares?: {
31
+ compression?: CompressionOptions | false;
32
+ /**
33
+ * basename should be same as vite 'base' config
34
+ */
35
+ expressStatic?: (ServeStaticOptions & {
36
+ basename?: string;
37
+ }) | false;
38
+ };
39
+ }
40
+ export interface IAppServerProps<T = Record<string, any>> {
41
+ server: T;
42
+ }
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'> {
45
+ abortDelay?: number;
46
+ init?: (params: {
47
+ config: ServerConfig;
48
+ }) => IEntrypointOptions<TAppProps> | Promise<IEntrypointOptions<TAppProps>>;
49
+ routerOptions?: Parameters<typeof createStaticHandler>[1];
50
+ }
51
+ /**
52
+ * Render server side application
53
+ */
54
+ declare function entry<TAppProps>(App: TApp<TAppProps>, routes: TRouteObject[], { init, routerOptions, ...rest }?: IEntryServerOptions<TAppProps>): IPrepareRenderOut<TAppProps>;
55
+ export default entry;
@@ -0,0 +1 @@
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,26 +1,23 @@
1
- import { Request } from 'express';
2
- import { TRouteObject } from "../interfaces/route-object.js";
3
- import { IEntrypointOptions, IPrepareRenderOut } from "../node/entry.js";
4
- import { TRender } from "../node/render.js";
5
- import ServerApi from "./server-api.js";
6
- import ServerConfig from "./server-config.js";
7
- interface IPrepareServerEntrypointLoadOut<TAppProps = Record<string, any>> {
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
+ interface IPrepareServerEntrypointLoadOut<TAppProps = Record<string, any>> extends Omit<IEntrypointOptions<TAppProps>, 'onServerCreated' | 'onServerStarted'> {
8
8
  render: TRender;
9
9
  routes: TRouteObject[];
10
10
  abortDelay?: number;
11
- onRequest?: IEntrypointOptions<TAppProps>['onRequest'];
12
- onRouterReady?: IEntrypointOptions<TAppProps>['onRouterReady'];
13
- onShellReady?: IEntrypointOptions<TAppProps>['onShellReady'];
14
- onShellError?: IEntrypointOptions<TAppProps>['onShellError'];
15
- onResponse?: IEntrypointOptions<TAppProps>['onResponse'];
16
- onError?: IEntrypointOptions<TAppProps>['onError'];
17
- getState?: IEntrypointOptions<TAppProps>['getState'];
18
11
  }
19
12
  /**
20
13
  * Load server entrypoint and template
21
14
  * DEV MODE: refresh entrypoint and template
22
15
  */
23
16
  declare class PrepareServer {
17
+ /**
18
+ * Hook which calls after express server started
19
+ */
20
+ onServerStarted?: NonNullable<IEntrypointOptions['onServerStarted']>;
24
21
  /**
25
22
  * Server configuration
26
23
  */
@@ -36,11 +33,7 @@ declare class PrepareServer {
36
33
  /**
37
34
  * Hook which calls after express server created
38
35
  */
39
- protected onServerCreated?: IEntrypointOptions['onServerCreated'];
40
- /**
41
- * Hook which calls after express server started
42
- */
43
- onServerStarted?: IEntrypointOptions['onServerStarted'];
36
+ protected onServerCreated?: NonNullable<IEntrypointOptions['onServerCreated']>;
44
37
  /**
45
38
  * Html shell
46
39
  */
@@ -48,48 +41,30 @@ declare class PrepareServer {
48
41
  /**
49
42
  * Middlewares configs
50
43
  */
51
- protected middlewaresConfigs?: IPrepareRenderOut['middlewares'];
44
+ protected middlewaresConfigs?: NonNullable<IPrepareRenderOut['middlewares']>;
52
45
  /**
53
- * @constructor
54
- */
55
- /**
56
- * @constructor
46
+ * Retain runtime configuration and reuse the existing server API.
57
47
  */
58
48
  protected constructor(config: ServerConfig, serverApi?: ServerApi);
59
- /**
60
- * Init service
61
- */
62
49
  /**
63
50
  * Init service
64
51
  */
65
52
  static init(config: ServerConfig, serverApi?: ServerApi): PrepareServer;
66
- /**
67
- * Resolve and return entrypoint params
68
- */
69
53
  /**
70
54
  * Resolve and return entrypoint params
71
55
  */
72
56
  loadEntrypoint(shouldInit?: boolean): Promise<IPrepareServerEntrypointLoadOut>;
73
- /**
74
- * Load and return html shell
75
- */
76
57
  /**
77
58
  * Load and return html shell
78
59
  */
79
60
  loadHtml(req: Request): Promise<[string, string]>;
80
- /**
81
- * Run server created hook
82
- */
83
61
  /**
84
62
  * Run server created hook
85
63
  */
86
64
  onAppCreated(): Promise<PrepareServer>;
87
- /**
88
- * Return SSR express middlewares configs
89
- */
90
65
  /**
91
66
  * Return SSR express middlewares configs
92
67
  */
93
68
  getMiddlewaresConfig(): NonNullable<PrepareServer['middlewaresConfigs']>;
94
69
  }
95
- export { PrepareServer as default };
70
+ export default PrepareServer;
@@ -0,0 +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};
2
+ //# sourceMappingURL=prepare-server.js.map
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,63 @@
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>> {
9
+ req: ExpressRequest;
10
+ res: ExpressResponse;
11
+ appProps: NonNullable<TAppProps>;
12
+ html: {
13
+ header: string;
14
+ footer: string;
15
+ };
16
+ routerContext?: StaticHandlerContext;
17
+ serverContext?: IServerContext;
18
+ isStream?: boolean;
19
+ hasEarlyHints?: boolean;
20
+ didError?: StreamError;
21
+ }
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>> {
24
+ App: TApp<TAppProps>;
25
+ handler: StaticHandler;
26
+ }
27
+ export interface IRenderOptions<TAppProps = Record<string, any>> {
28
+ abortDelay?: number;
29
+ getBody?: (request: ExpressRequest) => BodyInit | null | undefined;
30
+ onRouterReady?: (params: {
31
+ context: IRequestContext<TAppProps>;
32
+ }) => Promise<IRouterReadyOut> | IRouterReadyOut;
33
+ onShellReady?: (params: {
34
+ context: IRequestContext<TAppProps>;
35
+ }) => IShellReadyOut;
36
+ onShellError?: (params: {
37
+ context: IRequestContext<TAppProps>;
38
+ error: Error;
39
+ }) => string | undefined | void;
40
+ onError?: (params: {
41
+ context: IRequestContext<TAppProps>;
42
+ error: IObtainStreamErrorOut;
43
+ }) => void;
44
+ onResponse?: (params: {
45
+ context: IRequestContext<TAppProps>;
46
+ html: string;
47
+ }) => string | undefined | void;
48
+ getState?: (params: {
49
+ context: IRequestContext<TAppProps>;
50
+ }) => Record<string, Record<string, any>> | undefined | void;
51
+ }
52
+ export interface IRouterReadyOut {
53
+ isStream?: boolean;
54
+ }
55
+ export interface IShellReadyOut {
56
+ header?: string;
57
+ footer?: string;
58
+ }
59
+ /**
60
+ * Render application
61
+ */
62
+ declare function render({ App, handler }: IRenderParams, config: ServerConfig, context: IRequestContext, { onRouterReady, onShellReady, onResponse, onShellError, onError, getBody, getState, abortDelay, }: IRenderOptions): Promise<void>;
63
+ export default render;
@@ -0,0 +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};
2
+ //# sourceMappingURL=render.js.map
@@ -0,0 +1 @@
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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"}
@@ -0,0 +1,15 @@
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 {
5
+ run: (options?: {
6
+ version?: string;
7
+ isPrintInfo?: boolean;
8
+ }) => Server;
9
+ app: Express;
10
+ }
11
+ /**
12
+ * Create SSR server
13
+ */
14
+ declare function createServer(config: ServerConfig): Promise<ICreateServerOut>;
15
+ export default createServer;
@@ -0,0 +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};
2
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,11 @@
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
+ getBody?: (request: Request) => BodyInit | null | undefined;
6
+ }
7
+ /**
8
+ * Bridge Express middleware to Fetch while retaining parsed body support.
9
+ */
10
+ declare const adapterExpress: (handler: TSsrHandler, options?: IExpressAdapterOptions) => RequestHandler;
11
+ export default adapterExpress;
@@ -0,0 +1,2 @@
1
+ import o from"./body.js";import s from"./express/create-request.js";import{handleRequest as e}from"./node.js";import t from"../node/request-signal.js";const r=(r,n={})=>(d,i,a)=>{const p=t(d,i),c=o=>{p.signal.aborted||a(o)};try{const t={signal:p.signal};n.getBody?t.body=n.getBody(d)??null:void 0!==d.body&&(t.body=o(d.body,d.get("Content-Type"))),e(r,s(d,t),i,{compression:n.compression}).catch(c).finally(p.dispose)}catch(o){p.dispose(),c(o)}};export{r as default};
2
+ //# sourceMappingURL=express.js.map
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,23 @@
1
+ import type { TCompression } from './compression.js';
2
+ import type { TSsrHandler } from '../core/types.js';
3
+ import type { TIncomingMessage, TServerResponse } from '../node/http.js';
4
+ interface IFastifyRequest {
5
+ body?: unknown;
6
+ raw: TIncomingMessage;
7
+ }
8
+ interface IFastifyReply {
9
+ getHeaders?: () => Record<string, string | number | string[] | undefined>;
10
+ hijack: () => void;
11
+ raw: TServerResponse;
12
+ }
13
+ type TFastifyHandler = (request: IFastifyRequest, reply: IFastifyReply) => Promise<void>;
14
+ export interface IFastifyAdapterOptions {
15
+ compression?: TCompression;
16
+ getBody?: (request: IFastifyRequest) => BodyInit | null | undefined;
17
+ }
18
+ /**
19
+ * Bridge Fastify requests and hook metadata to the raw streaming transport.
20
+ */
21
+ declare const adapterFastify: (handler: TSsrHandler, options?: IFastifyAdapterOptions) => TFastifyHandler;
22
+ export type { IFastifyReply, IFastifyRequest, TFastifyHandler };
23
+ export default adapterFastify;
@@ -0,0 +1,2 @@
1
+ import o from"./body.js";import e from"../node/compress-response.js";import r from"../node/create-request.js";import t from"../node/request-signal.js";import s from"../node/write-early-hints.js";import a from"../node/write-fetch-response.js";const i=(i,n={})=>async(d,c)=>{const{body:m,raw:p}=d,y=t(p,c.raw);try{const t={signal:y.signal};n.getBody?t.body=n.getBody(d)??null:void 0!==m&&(t.body=o(m,String(p.headers["content-type"]??"")));const f=r(p,t),l=e(f,await i(f,{onEarlyHints:o=>s(c.raw,o)}),n.compression);Object.entries(c.getHeaders?.()??{}).forEach(([o,e])=>{void 0!==e&&c.raw.setHeader(o,e)}),c.hijack(),await a(c.raw,l)}catch(o){if(!y.signal.aborted)throw o;c.hijack()}finally{y.dispose()}};export{i as default};
2
+ //# sourceMappingURL=fastify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fastify.js","sources":["../../src/adapters/fastify.ts"],"sourcesContent":[null],"names":["adapterFastify","handler","options","async","request","reply","body","raw","req","requestSignal","createRequestSignal","requestOptions","signal","getBody","undefined","serializeBody","String","headers","fetchRequest","createRequest","response","compressResponse","onEarlyHints","writeEarlyHints","compression","Object","entries","getHeaders","forEach","name","value","setHeader","hijack","writeFetchResponse","error","aborted","dispose"],"mappings":"kPA+BA,MAAMA,EAAiB,CACrBC,EACAC,EAAkC,KAK3BC,MAAOC,EAASC,KACrB,MAAMC,KAAEA,EAAMC,IAAKC,GAAQJ,EACrBK,EAAgBC,EAAoBF,EAAKH,EAAME,KAErD,IACE,MAAMI,EAAkE,CACtEC,OAAQH,EAAcG,QAGpBV,EAAQW,QACVF,EAAeL,KAAOJ,EAAQW,QAAQT,IAAY,UAChCU,IAATR,IACTK,EAAeL,KAAOS,EAAcT,EAAMU,OAAOR,EAAIS,QAAQ,iBAAmB,MAGlF,MAAMC,EAAeC,EAAcX,EAAKG,GAClCS,EAAWC,EACfH,QACMjB,EAAQiB,EAAc,CAC1BI,aAAeL,GAAYM,EAAgBlB,EAAME,IAAKU,KAExDf,EAAQsB,aAMVC,OAAOC,QAAQrB,EAAMsB,gBAAkB,CAAA,GAAIC,QAAQ,EAAEC,EAAMC,WAC3ChB,IAAVgB,GACFzB,EAAME,IAAIwB,UAAUF,EAAMC,KAG9BzB,EAAM2B,eACAC,EAAmB5B,EAAME,IAAKa,EACtC,CAAE,MAAOc,GACP,IAAKzB,EAAcG,OAAOuB,QACxB,MAAMD,EAMR7B,EAAM2B,QACR,SACEvB,EAAc2B,SAChB"}
@@ -0,0 +1,13 @@
1
+ import type { TSsrHandler } from '../core/types.js';
2
+ interface IHonoContext {
3
+ req: {
4
+ raw: Request;
5
+ };
6
+ }
7
+ type THonoHandler = (context: IHonoContext) => Promise<Response>;
8
+ /**
9
+ * Pass Hono's raw request to the Fetch handler.
10
+ */
11
+ declare const adapterHono: (handler: TSsrHandler) => THonoHandler;
12
+ export type { IHonoContext, THonoHandler };
13
+ export default adapterHono;
@@ -0,0 +1,2 @@
1
+ const a=a=>({req:e})=>a(e.raw);export{a as default};
2
+ //# sourceMappingURL=hono.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hono.js","sources":["../../src/adapters/hono.ts"],"sourcesContent":[null],"names":["adapterHono","handler","req","raw"],"mappings":"AAaA,MAAMA,EAAeC,GACZ,EAAGC,SAAUD,EAAQC,EAAIC"}
@@ -0,0 +1,19 @@
1
+ import type { TCompression } from './compression.js';
2
+ import type { TSsrHandler } from '../core/types.js';
3
+ import type { TIncomingMessage, TServerResponse } from '../node/http.js';
4
+ type TNext = (error?: unknown) => void;
5
+ type TNodeHandler = (req: TIncomingMessage, res: TServerResponse, next?: TNext) => Promise<void>;
6
+ export interface INodeAdapterOptions {
7
+ compression?: TCompression;
8
+ }
9
+ /**
10
+ * Render and write a Fetch response using the Node transport.
11
+ */
12
+ declare const handleRequest: (handler: TSsrHandler, request: Request, res: TServerResponse, { compression }?: INodeAdapterOptions) => Promise<void>;
13
+ /**
14
+ * Connect Node requests to the Fetch handler and dispose disconnect listeners.
15
+ */
16
+ declare const adapterNode: (handler: TSsrHandler, options?: INodeAdapterOptions) => TNodeHandler;
17
+ export type { TNodeHandler };
18
+ export { handleRequest };
19
+ export default adapterNode;
@@ -0,0 +1,2 @@
1
+ import e from"../node/compress-response.js";import r from"../node/create-request.js";import s from"../node/request-signal.js";import o from"../node/write-early-hints.js";import t from"../node/write-fetch-response.js";const n=async(r,s,n,{compression:a=!1}={})=>{const i=e(s,await r(s,{onEarlyHints:e=>o(n,e)}),a);await t(n,i)},a=(e,o={})=>async(t,a,i)=>{const d=s(t,a);try{await n(e,r(t,{signal:d.signal}),a,o)}catch(e){if(d.signal.aborted)return;i?i(e):a.headersSent?a.destroy(e):(a.statusCode=500,a.end("Internal Server Error"))}finally{d.dispose()}};export{a as default,n as handleRequest};
2
+ //# sourceMappingURL=node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node.js","sources":["../../src/adapters/node.ts"],"sourcesContent":[null],"names":["handleRequest","async","handler","request","res","compression","response","compressResponse","onEarlyHints","headers","writeEarlyHints","writeFetchResponse","adapterNode","options","req","next","requestSignal","createRequestSignal","createRequest","signal","error","aborted","headersSent","destroy","statusCode","end","dispose"],"mappings":"yNAmBA,MAAMA,EAAgBC,MACpBC,EACAC,EACAC,GACEC,eAAc,GAA+B,MAE/C,MAAMC,EAAWC,EACfJ,QACMD,EAAQC,EAAS,CACrBK,aAAeC,GAAYC,EAAgBN,EAAKK,KAElDJ,SAGIM,EAAmBP,EAAKE,IAM1BM,EAAc,CAACV,EAAsBW,EAA+B,KAIjEZ,MAAOa,EAAKV,EAAKW,KACtB,MAAMC,EAAgBC,EAAoBH,EAAKV,GAE/C,UACQJ,EACJE,EACAgB,EAAcJ,EAAK,CAAEK,OAAQH,EAAcG,SAC3Cf,EACAS,EAEJ,CAAE,MAAOO,GACP,GAAIJ,EAAcG,OAAOE,QACvB,OAGEN,EACFA,EAAKK,GACIhB,EAAIkB,YACblB,EAAImB,QAAQH,IAEZhB,EAAIoB,WAAa,IACjBpB,EAAIqB,IAAI,yBAEZ,SACET,EAAcU,SAChB"}
@@ -1,17 +1,17 @@
1
- /// <reference types="react-dom" />
2
- import { FC, PropsWithChildren } from 'react';
1
+ import type { FC, PropsWithChildren } from 'react';
3
2
  import ReactDOM from 'react-dom/client';
4
- import { DataRouter, createBrowserRouter } from 'react-router';
5
- import { TRouteObject } from "../interfaces/route-object.js";
6
- interface IAppClientProps<T = undefined> {
3
+ import type { DataRouter } from 'react-router';
4
+ import { createBrowserRouter } from 'react-router';
5
+ import type { TRouteObject } from '../interfaces/route-object.js';
6
+ export interface IAppClientProps<T = undefined> {
7
7
  client: T;
8
8
  }
9
- interface IInitPropsParams {
9
+ export interface IInitPropsParams {
10
10
  isSSRMode: boolean;
11
11
  router: DataRouter;
12
12
  }
13
- type TApp<T> = FC<PropsWithChildren<IAppClientProps<T>>>;
14
- interface IEntryClientOptions<T> {
13
+ export type TApp<T> = FC<PropsWithChildren<IAppClientProps<T>>>;
14
+ export interface IEntryClientOptions<T> {
15
15
  init?: (params: IInitPropsParams) => Promise<T>;
16
16
  routerOptions?: Parameters<typeof createBrowserRouter>[1];
17
17
  createRouter?: typeof createBrowserRouter;
@@ -21,4 +21,4 @@ interface IEntryClientOptions<T> {
21
21
  * Render client side application
22
22
  */
23
23
  declare function entry<TAppProps>(App: TApp<TAppProps>, routes: TRouteObject[], { init, routerOptions, createRouter, rootId, }?: IEntryClientOptions<TAppProps>): Promise<ReactDOM.Root | void>;
24
- export { entry as default, IAppClientProps, IInitPropsParams, TApp, IEntryClientOptions };
24
+ export default entry;
package/browser/entry.js CHANGED
@@ -1,2 +1,2 @@
1
- import t from"react";import e from"react-dom/client";import{matchRoutes as o,createBrowserRouter as r,RouterProvider as a}from"react-router";import{IS_SSR_MODE as n}from"../constants/common.js";async function c(c,i,{init:l,routerOptions:m,createRouter:s=r,rootId:u="root"}={}){const d=o(i,window.location,m?.basename)?.filter((t=>t.route.lazy));d&&d?.length>0&&await Promise.all(d.map((async t=>{const{lazy:e}=t.route;if("function"==typeof e){const o=await e();o&&Object.assign(t.route,{...o,lazy:void 0})}})));const f=s(i,m),p=document.getElementById(u),y=await(l?.({isSSRMode:n,router:f})),w=()=>t.createElement(c,{client:y},t.createElement(a,{router:f}));return n&&"1"!==p.dataset.forceSpa?e.hydrateRoot(p,t.createElement(w,null)):e.createRoot(p).render(t.createElement(w,null))}export{c as default};
1
+ import t from"react";import e from"react-dom/client";import{matchRoutes as o,createBrowserRouter as r,RouterProvider as a}from"react-router";import{IS_SSR_MODE as n}from"../constants/common.js";async function c(c,i,{init:l,routerOptions:m,createRouter:s=r,rootId:u="root"}={}){const d=o(i,window.location,m?.basename)?.filter(t=>t.route.lazy);d&&d?.length>0&&await Promise.all(d.map(async t=>{const{lazy:e}=t.route;if("function"==typeof e){const o=await e();o&&Object.assign(t.route,{...o,lazy:void 0})}}));const f=s(i,m),p=document.getElementById(u),y=await(l?.({isSSRMode:n,router:f})),w=()=>t.createElement(c,{client:y},t.createElement(a,{router:f}));return n&&"1"!==p.dataset.forceSpa?e.hydrateRoot(p,t.createElement(w,null)):e.createRoot(p).render(t.createElement(w,null))}export{c as default};
2
2
  //# sourceMappingURL=entry.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"entry.js","sources":["../../src/browser/entry.tsx"],"sourcesContent":["import type { FC, PropsWithChildren } from 'react';\nimport React from 'react';\nimport ReactDOM from 'react-dom/client';\nimport type { DataRouter, RouteObject } from 'react-router';\nimport { createBrowserRouter, matchRoutes, RouterProvider } from 'react-router';\nimport { IS_SSR_MODE } from '@constants/common';\nimport type { TRouteObject } from '@interfaces/route-object';\n\nexport interface IAppClientProps<T = undefined> {\n client: T;\n}\n\nexport interface IInitPropsParams {\n isSSRMode: boolean;\n router: DataRouter;\n}\n\nexport type TApp<T> = FC<PropsWithChildren<IAppClientProps<T>>>;\n\nexport interface IEntryClientOptions<T> {\n init?: (params: IInitPropsParams) => Promise<T>;\n routerOptions?: Parameters<typeof createBrowserRouter>[1];\n createRouter?: typeof createBrowserRouter;\n rootId?: string;\n}\n\n/**\n * Render client side application\n */\nasync function entry<TAppProps>(\n App: TApp<TAppProps>,\n routes: TRouteObject[],\n {\n init,\n routerOptions,\n createRouter = createBrowserRouter,\n rootId = 'root',\n }: IEntryClientOptions<TAppProps> = {},\n): Promise<ReactDOM.Root | void> {\n const lazyMatches = matchRoutes(\n routes as RouteObject[],\n window.location,\n routerOptions?.basename,\n )?.filter((m) => m.route.lazy);\n\n // Load the lazy matches and update the routes before creating router,\n // so we can hydrate the SSR-rendered content synchronously\n if (lazyMatches && lazyMatches?.length > 0) {\n await Promise.all(\n lazyMatches.map(async (m) => {\n const { lazy } = m.route;\n\n if (typeof lazy === 'function') {\n const lazyResult = await lazy();\n\n if (lazyResult) {\n Object.assign(m.route, {\n ...lazyResult,\n lazy: undefined,\n });\n }\n }\n }),\n );\n }\n\n const router = createRouter(routes as RouteObject[], routerOptions);\n const root = document.getElementById(rootId) as HTMLElement;\n const appProps = (await init?.({ isSSRMode: IS_SSR_MODE, router })) as TAppProps;\n\n const AppComponent: FC = () => (\n <App client={appProps}>\n <RouterProvider router={router} />\n </App>\n );\n\n if (!IS_SSR_MODE || root.dataset['forceSpa'] === '1') {\n return ReactDOM.createRoot(root).render(<AppComponent />);\n }\n\n return ReactDOM.hydrateRoot(root, <AppComponent />);\n}\n\nexport default entry;\n"],"names":["async","entry","App","routes","init","routerOptions","createRouter","createBrowserRouter","rootId","lazyMatches","matchRoutes","window","location","basename","filter","m","route","lazy","length","Promise","all","map","lazyResult","Object","assign","undefined","router","root","document","getElementById","appProps","isSSRMode","IS_SSR_MODE","AppComponent","React","createElement","client","RouterProvider","dataset","ReactDOM","hydrateRoot","createRoot","render"],"mappings":"kMA6BAA,eAAeC,EACbC,EACAC,GACAC,KACEA,EAAIC,cACJA,EAAaC,aACbA,EAAeC,EAAmBC,OAClCA,EAAS,QACyB,CAAA,GAEpC,MAAMC,EAAcC,EAClBP,EACAQ,OAAOC,SACPP,GAAeQ,WACdC,QAAQC,GAAMA,EAAEC,MAAMC,OAIrBR,GAAeA,GAAaS,OAAS,SACjCC,QAAQC,IACZX,EAAYY,KAAIrB,MAAOe,IACrB,MAAME,KAAEA,GAASF,EAAEC,MAEnB,GAAoB,mBAATC,EAAqB,CAC9B,MAAMK,QAAmBL,IAErBK,GACFC,OAAOC,OAAOT,EAAEC,MAAO,IAClBM,EACHL,UAAMQ,GAGZ,MAKN,MAAMC,EAASpB,EAAaH,EAAyBE,GAC/CsB,EAAOC,SAASC,eAAerB,GAC/BsB,QAAkB1B,IAAO,CAAE2B,UAAWC,EAAaN,YAEnDO,EAAmB,IACvBC,EAAAC,cAACjC,EAAG,CAACkC,OAAQN,GACXI,EAAAC,cAACE,GAAeX,OAAQA,KAI5B,OAAKM,GAA4C,MAA7BL,EAAKW,QAAkB,SAIpCC,EAASC,YAAYb,EAAMO,EAAAC,cAACF,EAAY,OAHtCM,EAASE,WAAWd,GAAMe,OAAOR,EAAAC,cAACF,EAAY,MAIzD"}
1
+ {"version":3,"file":"entry.js","sources":["../../src/browser/entry.tsx"],"sourcesContent":[null],"names":["async","entry","App","routes","init","routerOptions","createRouter","createBrowserRouter","rootId","lazyMatches","matchRoutes","window","location","basename","filter","m","route","lazy","length","Promise","all","map","lazyResult","Object","assign","undefined","router","root","document","getElementById","appProps","isSSRMode","IS_SSR_MODE","AppComponent","React","createElement","client","RouterProvider","dataset","ReactDOM","hydrateRoot","createRoot","render"],"mappings":"kMA6BAA,eAAeC,EACbC,EACAC,GACAC,KACEA,EAAIC,cACJA,EAAaC,aACbA,EAAeC,EAAmBC,OAClCA,EAAS,QACyB,CAAA,GAEpC,MAAMC,EAAcC,EAClBP,EACAQ,OAAOC,SACPP,GAAeQ,WACdC,OAAQC,GAAMA,EAAEC,MAAMC,MAIrBR,GAAeA,GAAaS,OAAS,SACjCC,QAAQC,IACZX,EAAYY,IAAIrB,MAAOe,IACrB,MAAME,KAAEA,GAASF,EAAEC,MAEnB,GAAoB,mBAATC,EAAqB,CAC9B,MAAMK,QAAmBL,IAErBK,GACFC,OAAOC,OAAOT,EAAEC,MAAO,IAClBM,EACHL,UAAMQ,GAGZ,KAKN,MAAMC,EAASpB,EAAaH,EAAyBE,GAC/CsB,EAAOC,SAASC,eAAerB,GAC/BsB,QAAkB1B,IAAO,CAAE2B,UAAWC,EAAaN,YAEnDO,EAAmB,IACvBC,EAAAC,cAACjC,EAAG,CAACkC,OAAQN,GACXI,EAAAC,cAACE,GAAeX,OAAQA,KAI5B,OAAKM,GAA4C,MAA7BL,EAAKW,QAAkB,SAIpCC,EAASC,YAAYb,EAAMO,EAAAC,cAACF,EAAY,OAHtCM,EAASE,WAAWd,GAAMe,OAAOR,EAAAC,cAACF,EAAY,MAIzD"}
package/cli/build.d.ts CHANGED
@@ -1,6 +1,6 @@
1
- import { IBuildParams } from "../services/build.js";
1
+ import type { IBuildParams } from '../services/build.js';
2
2
  /**
3
3
  * Build application
4
4
  */
5
5
  declare function build(params: IBuildParams): Promise<void>;
6
- export { build as default };
6
+ export default build;