@lomray/vite-ssr-boost 8.4.1 → 8.4.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.
package/README.md
CHANGED
|
@@ -86,6 +86,8 @@ Deferred router data needs no additional state library. Keep footer hydration by
|
|
|
86
86
|
|
|
87
87
|
**Fetch handler.** Import `createHandler` from `@lomray/vite-ssr-boost/core/handler` and connect it through `adapters/node`, `adapters/express`, `adapters/fastify`, `adapters/hono` or `adapters/edge`. Your transport owns the development server, static assets and route-asset injection; follow [Runtime adapters](./docs/guide/runtime-adapters.md) when you need this control.
|
|
88
88
|
|
|
89
|
+
Both paths are measured weekly in the public [ssr-benchmarks](https://github.com/Lomray-Software/ssr-benchmarks) repository: the same application on vite-ssr-boost, React Router Framework mode, Vike, TanStack Start and Next.js, and a runtime matrix that serves the boost build through Express, `node:http`, Fastify, Hono and Bun. See [Benchmarks](./docs/reference/benchmarks.md) for what is measured and how to reproduce it.
|
|
90
|
+
|
|
89
91
|
## Not a fit when
|
|
90
92
|
|
|
91
93
|
- You need an implementation of React Server Components and Server Actions.
|
|
@@ -158,7 +160,7 @@ The [example projects guide](./docs/examples/index.md) explains the wiring in ea
|
|
|
158
160
|
Test SSR routes without a server with `@lomray/vite-ssr-boost/testing`; see the [Vitest and Playwright guide](https://lomray-software.github.io/vite-ssr-boost/guide/testing).
|
|
159
161
|
|
|
160
162
|
- [Documentation site](https://lomray-software.github.io/vite-ssr-boost/), [comparison guide](./docs/guide/choosing.md) and [FAQ](./docs/reference/faq.md).
|
|
161
|
-
- [Hydration order and streaming](./docs/reference/hydration-and-streaming.md).
|
|
163
|
+
- [Hydration order and streaming](./docs/reference/hydration-and-streaming.md) and [Benchmarks](./docs/reference/benchmarks.md).
|
|
162
164
|
- API: [Plugin](./docs/api/plugin.md), [Browser entry](./docs/api/browser-entry.md), [Server entry](./docs/api/server-entry.md), [Node production](./docs/api/node-production.md), [Components and helpers](./docs/api/components-and-helpers.md) and [CLI](./docs/api/cli.md).
|
|
163
165
|
|
|
164
166
|
## AI agents
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import e from"chalk";import
|
|
1
|
+
import e from"chalk";import r from"react";import t from"./create-request.js";import s from"./route-assets.js";import o from"../../constants/stream-error.js";import n from"../../core/early-hints.js";import{getSetCookieHeaders as a,getHeaderEntries as i}from"../../core/headers.js";import d from"../../core/render.js";import c from"../../node/render-to-stream.js";import p from"../../node/request-signal.js";import l from"../../node/write-early-hints.js";import m,{writeFetchHeaders as h}from"../../node/write-fetch-response.js";import u,{isDiagnosticsEnabled as f}from"../../services/diagnostics.js";const y=(e,r,t)=>{if(t&&!r.headersSent&&!r.writableEnded){e.response.status!==t.status&&r.status(e.response.status??200);const s=new Set([...t.headers.keys(),...e.response.headers.keys()]);for(const o of s)e.response.headers.get(o)!==t.headers.get(o)&&(e.response.headers.has(o)?r.setHeader(o,"set-cookie"===o?a(e.response.headers):e.response.headers.get(o)):r.removeHeader(o))}const s=new Headers(e.response.headers);s.delete("Set-Cookie");for(const[e,t]of Object.entries(r.getHeaders()))if("set-cookie"!==e.toLowerCase()&&void 0!==t)if(Array.isArray(t))for(const r of t)s.append(e,r);else s.set(e,"number"==typeof t?String(t):t);e.response.headers=s,e.response.status=r.statusCode};async function g({App:g,handler:S,policy:w,spaShell:b},j,v,{onRouterReady:E,onShellReady:R,onResponse:H,onShellError:C,onError:x,getBody:k,getState:q,hydration:A,nonce:P,bootstrapScriptContent:L,documentHeaders:D,sessionCookie:O,protectPrivate:T,abortDelay:B=15e3}){const{req:G,res:U}=v,$=j.getLogger(),z=p(G,U);try{const p=((e,r,s)=>{const o={signal:r};return s&&"GET"!==e.method&&"HEAD"!==e.method&&(o.body=s(e)??null),t(e,o)})(G,z.signal,k),F=Object.assign(v,{request:p,response:{headers:new Headers},diagnostics:f(!j.isProd)?new u(new URL(p.url).pathname,$):void 0});if(!j.isProd&&F.diagnostics){const{diagnostics:e}=F;for(const r of["req","res"]){let t=F[r];Object.defineProperty(F,r,{configurable:!0,enumerable:!0,get:()=>(e.deprecatedReqRes(),t),set:e=>{t=e}})}}const{response:I}=F;y(F,U),200===I.status&&(I.status=void 0);const J=await d({createApp:(e,t)=>r.createElement(g,{server:{...t.appProps,req:G}},e),handler:S,policy:w,spaShell:b,renderToStream:c},F,{abortDelay:B,hydration:A,nonce:P,bootstrapScriptContent:L,documentHeaders:D,sessionCookie:O,protectPrivate:T,getState:q?()=>q({context:F}):void 0,onError:({error:r})=>{const{code:t,message:s}=r;if(x?.({context:F,error:r}),$.info(e.red(`Stream error. Code: ${t}`)),[o.RenderAborted,o.RenderTimeout,o.RenderCancel].includes(t))return void $.info(e.dim(s));const{original:n}=r;$.error(n)},onResponse:H?({html:e,isEnd:r})=>H({context:F,html:e,isEnd:r}):void 0,onRouterReady:E?()=>E({context:F}):void 0,onShellError:C?({error:e})=>C({context:F,error:e}):void 0,onShellReady:()=>{((e,r)=>{if(r.headersSent||r.writableEnded)return;r.status(e.response.status??200),i(e.response.headers).forEach(([e,t])=>r.setHeader(e,t));const t=a(e.response.headers);t.length&&r.setHeader("Set-Cookie",t)})(F,U);const{response:e}=F,{headers:r,status:t}=e,s=R?{headers:new Headers(r),status:t}:void 0,o=R?.({context:F});return y(F,U,s),o??{}},prepare:async({executionContext:e})=>{const{matches:r,isSpa:t,hasEarlyHints:o}=F,a=(await s(j,r,t)).injectAssets(F,Boolean(o));o&&await n(e,a)},routerRequestContext:F},{onEarlyHints:e=>l(U,e)});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 h(e,r),await(r.body?.cancel()),void e.redirect(r.status,t);await m(e,r)})(U,J)}finally{z.dispose()}}export{g as default};
|
|
2
2
|
//# sourceMappingURL=render.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render.js","sources":["../../../src/adapters/express/render.tsx"],"sourcesContent":[null],"names":["
|
|
1
|
+
{"version":3,"file":"render.js","sources":["../../../src/adapters/express/render.tsx"],"sourcesContent":[null],"names":["syncResponse","context","res","previous","headersSent","writableEnded","response","status","names","Set","headers","keys","name","get","has","setHeader","getSetCookieHeaders","removeHeader","Headers","delete","value","Object","entries","getHeaders","toLowerCase","undefined","Array","isArray","item","append","set","String","statusCode","async","render","App","handler","policy","spaShell","config","initialContext","onRouterReady","onShellReady","onResponse","onShellError","onError","getBody","getState","hydration","nonce","bootstrapScriptContent","documentHeaders","sessionCookie","protectPrivate","abortDelay","req","Logger","getLogger","requestSignal","createRequestSignal","request","signal","options","method","body","createFetchRequest","createRenderRequest","assign","diagnostics","isDiagnosticsEnabled","isProd","Diagnostics","URL","url","pathname","defineProperty","configurable","enumerable","deprecatedReqRes","next","initialResponse","coreRender","createApp","children","updated","React","createElement","server","appProps","renderToStream","error","code","message","info","chalk","red","StreamError","RenderAborted","RenderTimeout","RenderCancel","includes","dim","original","html","isEnd","getHeaderEntries","forEach","cookies","length","prepareResponse","shellResponse","shell","prepare","executionContext","matches","isSpa","hasEarlyHints","hints","getRouteAssets","injectAssets","Boolean","emitEarlyHints","routerRequestContext","onEarlyHints","writeEarlyHints","location","destroyed","writeFetchHeaders","cancel","redirect","writeFetchResponse","writeResponse","dispose"],"mappings":"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"}
|
package/adapters/express.js
CHANGED
|
@@ -1,2 +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,
|
|
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={})=>(i,d,a)=>{const y=t(i,d),l=o=>{y.signal.aborted||a(o)};try{const t={signal:y.signal};n.getBody?t.body=n.getBody(i)??null:void 0!==i.body&&(t.body=o(i.body,i.get("Content-Type"))),e(r,s(i,t),d,{compression:n.compression}).catch(l).finally(y.dispose)}catch(o){try{l(o)}finally{y.dispose()}}};export{r as default};
|
|
2
2
|
//# sourceMappingURL=express.js.map
|
package/adapters/express.js.map
CHANGED
|
@@ -1 +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,
|
|
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,GACP,IACED,EAAQC,EACV,SACEH,EAAciB,SAChB,CACF"}
|
package/node/request-signal.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const o=(o,e)=>{const t=new AbortController,r=()=>t.abort(),n=()=>{e.writableEnded||r()};return o.once("aborted",r),e.once("close",n),(o.aborted||e.destroyed)&&r(),{dispose:()=>{o.off("aborted",r),e.off("close",n)},signal:t.signal}};export{o as default};
|
|
1
|
+
const o=(o,e)=>{const t=new AbortController,r=()=>t.abort(),n=()=>{e.writableEnded||r()};return o.once("aborted",r),e.once("close",n),(o.aborted||e.destroyed)&&r(),{dispose:()=>{o.off("aborted",r),e.off("close",n),t.abort(null)},signal:t.signal}};export{o as default};
|
|
2
2
|
//# sourceMappingURL=request-signal.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"request-signal.js","sources":["../../src/node/request-signal.ts"],"sourcesContent":[null],"names":["createRequestSignal","req","res","controller","AbortController","abort","onClose","writableEnded","once","aborted","destroyed","dispose","off","signal"],"mappings":"AAUA,MAAMA,EAAsB,CAACC,EAAuBC,KAClD,MAAMC,EAAa,IAAIC,gBAKjBC,EAAQ,IAAYF,EAAWE,QAK/BC,EAAU,KACTJ,EAAIK,eACPF,
|
|
1
|
+
{"version":3,"file":"request-signal.js","sources":["../../src/node/request-signal.ts"],"sourcesContent":[null],"names":["createRequestSignal","req","res","controller","AbortController","abort","onClose","writableEnded","once","aborted","destroyed","dispose","off","signal"],"mappings":"AAUA,MAAMA,EAAsB,CAACC,EAAuBC,KAClD,MAAMC,EAAa,IAAIC,gBAKjBC,EAAQ,IAAYF,EAAWE,QAK/BC,EAAU,KACTJ,EAAIK,eACPF,KAwBJ,OAPAJ,EAAIO,KAAK,UAAWH,GACpBH,EAAIM,KAAK,QAASF,IAEdL,EAAIQ,SAAWP,EAAIQ,YACrBL,IAGK,CAAEM,QAjBO,KACdV,EAAIW,IAAI,UAAWP,GACnBH,EAAIU,IAAI,QAASN,GAKjBH,EAAWE,MAAM,OAUDQ,OAAQV,EAAWU"}
|