@lomray/vite-ssr-boost 8.4.0-beta.4 → 8.4.0
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 +23 -0
- package/adapters/express/render.js +1 -1
- package/adapters/express/render.js.map +1 -1
- package/browser/entry.js.map +1 -1
- package/cloudflare.d.ts +5 -3
- package/cloudflare.js +1 -1
- package/cloudflare.js.map +1 -1
- package/core/cache-control.d.ts +4 -0
- package/core/cache-control.js +1 -1
- package/core/cache-control.js.map +1 -1
- package/core/conditional-request.d.ts +2 -1
- package/core/conditional-request.js +1 -1
- package/core/conditional-request.js.map +1 -1
- package/core/copy-loader-headers.d.ts +1 -1
- package/core/copy-loader-headers.js +1 -1
- package/core/copy-loader-headers.js.map +1 -1
- package/core/document-headers.js +1 -1
- package/core/document-headers.js.map +1 -1
- package/core/handler.js +1 -1
- package/core/handler.js.map +1 -1
- package/core/render.js +1 -1
- package/core/render.js.map +1 -1
- package/core/spa-html.js.map +1 -1
- package/core/spa-shell.js +1 -1
- package/core/spa-shell.js.map +1 -1
- package/core/ssr-policy.d.ts +37 -4
- package/core/ssr-policy.js +1 -1
- package/core/ssr-policy.js.map +1 -1
- package/http.d.ts +12 -0
- package/node/production.d.ts +3 -3
- package/package.json +5 -3
- package/services/diagnostics.d.ts +18 -1
- package/services/diagnostics.js.map +1 -1
- package/services/request-timeline.d.ts +31 -2
- package/services/request-timeline.js +1 -1
- package/services/request-timeline.js.map +1 -1
- package/services/route-asset-preparer.js.map +1 -1
- package/services/route-assets-memory.d.ts +20 -8
- package/services/route-assets-memory.js +1 -1
- package/services/route-assets-memory.js.map +1 -1
- package/services/ssr-manifest.d.ts +4 -4
- package/services/ssr-manifest.js +1 -1
- package/services/ssr-manifest.js.map +1 -1
- package/testing/browser-observer.d.ts +13 -7
- package/testing/browser-observer.js +1 -1
- package/testing/browser-observer.js.map +1 -1
- package/testing/create-handler.d.ts +1 -0
- package/testing/create-handler.js.map +1 -1
- package/testing/deferred.js.map +1 -1
- package/testing/edge.d.ts +12 -0
- package/testing/edge.js.map +1 -1
- package/testing/parse-response.js.map +1 -1
- package/testing/playwright.d.ts +2 -0
- package/testing/playwright.js +1 -1
- package/testing/playwright.js.map +1 -1
- package/testing/requests.d.ts +3 -0
- package/testing/requests.js.map +1 -1
- package/testing/response.d.ts +49 -3
- package/testing/response.js +1 -1
- package/testing/response.js.map +1 -1
- package/testing.d.ts +12 -0
- package/testing.js.map +1 -1
package/README.md
CHANGED
|
@@ -161,6 +161,29 @@ Test SSR routes without a server with `@lomray/vite-ssr-boost/testing`; see the
|
|
|
161
161
|
- [Hydration order and streaming](./docs/reference/hydration-and-streaming.md).
|
|
162
162
|
- 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
163
|
|
|
164
|
+
## AI agents
|
|
165
|
+
|
|
166
|
+
The repository includes `ssr-boost-migrate` and `ssr-boost-new-app` in the [Agent Skills format](https://agentskills.io/specification).
|
|
167
|
+
|
|
168
|
+
Claude Code plugin:
|
|
169
|
+
|
|
170
|
+
```sh
|
|
171
|
+
claude plugin marketplace add Lomray-Software/vite-ssr-boost
|
|
172
|
+
claude plugin install ssr-boost@lomray
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
Codex CLI, from this checkout:
|
|
176
|
+
|
|
177
|
+
```sh
|
|
178
|
+
mkdir -p ~/.codex/skills
|
|
179
|
+
cp -R skills/ssr-boost-migrate skills/ssr-boost-new-app ~/.codex/skills/
|
|
180
|
+
# Or use the target application's .codex/skills directory.
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
Current Codex versions document `.agents/skills` for discovery; use that destination or the symlinks in [AI usage and installation](./docs/ai-usage.md#ai-agents). That page also covers local Claude plugin testing before the files reach the default branch.
|
|
184
|
+
|
|
185
|
+
For Cursor, copy the folders into the app's `skills/` directory and add a `.cursor/rules/ssr-boost.mdc` rule pointing to the relevant `SKILL.md`; see the [complete rule](./docs/ai-usage.md#ai-agents). Other agents can use [llms.txt](https://lomray-software.github.io/vite-ssr-boost/llms.txt) or [llms-full.txt](https://lomray-software.github.io/vite-ssr-boost/llms-full.txt).
|
|
186
|
+
|
|
164
187
|
## License
|
|
165
188
|
|
|
166
189
|
Made with 💚
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import e from"chalk";import t from"react";import
|
|
1
|
+
import e from"chalk";import t from"react";import r from"./create-request.js";import s from"../../constants/stream-error.js";import o from"../../core/early-hints.js";import{getSetCookieHeaders as n,getHeaderEntries 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 p from"../../node/write-early-hints.js";import m,{writeFetchHeaders as l}from"../../node/write-fetch-response.js";import h,{isDiagnosticsEnabled as u}from"../../services/diagnostics.js";import f from"../../services/ssr-manifest.js";const y=(e,t,s)=>{const o={signal:t};return s&&"GET"!==e.method&&"HEAD"!==e.method&&(o.body=s(e)??null),r(e,o)},g=(e,t,r)=>{if(!t.headersSent&&!t.writableEnded){e.response.status!==r.status&&t.status(e.response.status??200);const s=new Set([...r.headers.keys(),...e.response.headers.keys()]);for(const o of s)e.response.headers.get(o)!==r.headers.get(o)&&(e.response.headers.has(o)?t.setHeader(o,"set-cookie"===o?n(e.response.headers):e.response.headers.get(o)):t.removeHeader(o))}const s=new Headers(e.response.headers);s.delete("Set-Cookie");for(const[e,r]of Object.entries(t.getHeaders()))if("set-cookie"!==e.toLowerCase()&&void 0!==r)if(Array.isArray(r))for(const t of r)s.append(e,t);else s.set(e,"number"==typeof r?String(r):r);e.response.headers=s,e.response.status=t.statusCode};async function S({App:r,handler:S,policy:x,spaShell:w},v,E,{onRouterReady:b,onShellReady:C,onResponse:j,onShellError:R,onError:H,getBody:q,getState:k,hydration:A,nonce:P,bootstrapScriptContent:D,documentHeaders:L,sessionCookie:O,protectPrivate:T,abortDelay:B=15e3}){const{appProps:G,html:U,req:$,res:z}=E,F=v.getLogger(),I=c($,z);try{const c=Object.assign(E,{request:y($,I.signal,q),response:{headers:new Headers}}),J={appProps:G,diagnostics:u(!v.isProd)?new h(new URL(c.request.url).pathname,F):void 0,html:U,request:c.request,response:c.response};if(!v.isProd&&J.diagnostics){const{diagnostics:e}=J;for(const t of["req","res"]){let r=c[t];Object.defineProperty(c,t,{configurable:!0,enumerable:!0,get:()=>(e.deprecatedReqRes(),r),set:e=>{r=e}})}}const{response:K}=J;g(J,z,{headers:new Headers(K.headers),status:K.status}),200===K.status&&(K.status=void 0);const M=e=>(c.request=e.request,c.response=e.response,c.didError=e.didError,c.html=e.html,c.isStream=e.isStream,c.isSpa=e.isSpa,c.matches=e.matches,c.routerContext=e.routerContext,c.serverContext=e.serverContext,c.timeline=e.timeline,c),N=await i({createApp:(e,s)=>t.createElement(r,{server:{...s.appProps,req:$}},e),handler:S,policy:x,spaShell:w,renderToStream:d},J,{abortDelay:B,hydration:A,nonce:P,bootstrapScriptContent:D,documentHeaders:L,sessionCookie:O,protectPrivate:T,getState:k?({context:e})=>k({context:M(e)}):void 0,onError:({context:t,error:r})=>{const{code:o,message:n}=r;if(H?.({context:M(t),error:r}),F.info(e.red(`Stream error. Code: ${o}`)),[s.RenderAborted,s.RenderTimeout,s.RenderCancel].includes(o))return void F.info(e.dim(n));const{original:a}=r;F.error(a)},onResponse:j?({context:e,html:t,isEnd:r})=>j({context:M(e),html:t,isEnd:r}):void 0,onRouterReady:b?({context:e})=>b({context:M(e)}):void 0,onShellError:R?({context:e,error:t})=>R({context:M(e),error:t}):void 0,onShellReady:({context:e})=>{const t=M(e);((e,t)=>{if(t.headersSent||t.writableEnded)return;t.status(e.response.status??200),a(e.response.headers).forEach(([e,r])=>t.setHeader(e,r));const r=n(e.response.headers);r.length&&t.setHeader("Set-Cookie",r)})(e,z);const r={headers:new Headers(e.response.headers),status:e.response.status},s=C?.({context:t});return g(e,z,r),s??{}},prepare:async({context:e,executionContext:t})=>{const r=M(e),s=f.get(v),{matches:n,isSpa:a}=e;await s.prepareDevAssets(n,a);const i=s.injectAssets(r);r.hasEarlyHints&&await o(t,i)},routerRequestContext:c},{onEarlyHints:e=>p(z,e)});M(J),await(async(e,t)=>{const r=t.headers.get("Location");if(r&&t.status>=300&&t.status<400&&!e.headersSent&&!e.writableEnded&&!e.destroyed)return l(e,t),await(t.body?.cancel()),void e.redirect(t.status,r);await m(e,t)})(z,N)}finally{I.dispose()}}export{S 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":["createRenderRequest","req","signal","getBody","options","method","body","createFetchRequest","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","getState","hydration","nonce","bootstrapScriptContent","documentHeaders","sessionCookie","protectPrivate","abortDelay","appProps","html","shellHtml","Logger","getLogger","requestSignal","createRequestSignal","assign","request","coreContext","diagnostics","isDiagnosticsEnabled","isProd","Diagnostics","URL","url","pathname","defineProperty","configurable","enumerable","deprecatedReqRes","next","syncContext","updated","didError","isStream","isSpa","matches","routerContext","serverContext","timeline","coreRender","createApp","children","React","createElement","server","renderToStream","error","code","message","info","chalk","red","StreamError","RenderAborted","RenderTimeout","RenderCancel","includes","dim","original","isEnd","legacyContext","getHeaderEntries","forEach","cookies","length","prepareResponse","shell","prepare","executionContext","manifest","SsrManifest","prepareDevAssets","hints","injectAssets","hasEarlyHints","emitEarlyHints","routerRequestContext","onEarlyHints","writeEarlyHints","location","destroyed","writeFetchHeaders","cancel","redirect","writeFetchResponse","writeResponse","dispose"],"mappings":"omBA+FA,MAAMA,EAAsB,CAC1BC,EACAC,EACAC,KAEA,MAAMC,EAA2D,CAAEF,UAMnE,OAJIC,GAA0B,QAAfF,EAAII,QAAmC,SAAfJ,EAAII,SACzCD,EAAQE,KAAOH,EAAQF,IAAQ,MAG1BM,EAAmBN,EAAKG,IAwB3BI,EAAe,CACnBC,EACAC,EACAC,KAIA,IAAKD,EAAIE,cAAgBF,EAAIG,cAAe,CACtCJ,EAAQK,SAASC,SAAWJ,EAASI,QACvCL,EAAIK,OAAON,EAAQK,SAASC,QAAU,KAGxC,MAAMC,EAAQ,IAAIC,IAAI,IAAIN,EAASO,QAAQC,UAAWV,EAAQK,SAASI,QAAQC,SAE/E,IAAK,MAAMC,KAAQJ,EACbP,EAAQK,SAASI,QAAQG,IAAID,KAAUT,EAASO,QAAQG,IAAID,KAI3DX,EAAQK,SAASI,QAAQI,IAAIF,GAGhCV,EAAIa,UACFH,EACS,eAATA,EACII,EAAoBf,EAAQK,SAASI,SACrCT,EAAQK,SAASI,QAAQG,IAAID,IANnCV,EAAIe,aAAaL,GAUvB,CAEA,MAAMF,EAAU,IAAIQ,QAAQjB,EAAQK,SAASI,SAE7CA,EAAQS,OAAO,cAEf,IAAK,MAAOP,EAAMQ,KAAUC,OAAOC,QAAQpB,EAAIqB,cAC7C,GAA2B,eAAvBX,EAAKY,oBAA4CC,IAAVL,EAI3C,GAAIM,MAAMC,QAAQP,GAChB,IAAK,MAAMQ,KAAQR,EACjBV,EAAQmB,OAAOjB,EAAMgB,QAGvBlB,EAAQoB,IAAIlB,EAAuB,iBAAVQ,EAAqBW,OAAOX,GAASA,GAIlEnB,EAAQK,SAASI,QAAUA,EAC3BT,EAAQK,SAASC,OAASL,EAAI8B,YA8BhCC,eAAeC,GACbC,IAAEA,EAAGC,QAAEA,EAAOC,OAAEA,EAAMC,SAAEA,GACxBC,EACAC,GACAC,cACEA,EAAaC,aACbA,EAAYC,WACZA,EAAUC,aACVA,EAAYC,QACZA,EAAOlD,QACPA,EAAOmD,SACPA,EAAQC,UACRA,EAASC,MACTA,EAAKC,uBACLA,EAAsBC,gBACtBA,EAAeC,cACfA,EAAaC,eACbA,EAAcC,WACdA,EAAa,OAGf,MAAMC,SAAEA,EAAUC,KAAMC,EAAS/D,IAAEA,EAAGS,IAAEA,GAAQsC,EAC1CiB,EAASlB,EAAOmB,YAChBC,EAAgBC,EAAoBnE,EAAKS,GAC/C,IACE,MAAMD,EAA2BoB,OAAOwC,OAAOrB,EAAgB,CAC7DsB,QAAStE,EAAoBC,EAAKkE,EAAcjE,OAAQC,GACxDW,SAAU,CAAEI,QAAS,IAAIQ,WAErB6C,EAAkC,CACtCT,WACAU,YAAaC,GAAsB1B,EAAO2B,QACtC,IAAIC,EAAY,IAAIC,IAAInE,EAAQ6D,QAAQO,KAAKC,SAAUb,QACvDhC,EACJ8B,KAAMC,EACNM,QAAS7D,EAAQ6D,QACjBxD,SAAUL,EAAQK,UAKpB,IAAKiC,EAAO2B,QAAUH,EAAYC,YAAa,CAC7C,MAAMA,YAAEA,GAAgBD,EAExB,IAAK,MAAMnD,IAAQ,CAAC,MAAO,OAAiB,CAC1C,IAAIQ,EAAQnB,EAAQW,GAEpBS,OAAOkD,eAAetE,EAASW,EAAM,CACnC4D,cAAc,EACdC,YAAY,EACZ5D,IAAK,KACHmD,EAAYU,mBAELtD,GAETU,IAAM6C,IACJvD,EAAQuD,IAGd,CACF,
|
|
1
|
+
{"version":3,"file":"render.js","sources":["../../../src/adapters/express/render.tsx"],"sourcesContent":[null],"names":["createRenderRequest","req","signal","getBody","options","method","body","createFetchRequest","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","getState","hydration","nonce","bootstrapScriptContent","documentHeaders","sessionCookie","protectPrivate","abortDelay","appProps","html","shellHtml","Logger","getLogger","requestSignal","createRequestSignal","assign","request","coreContext","diagnostics","isDiagnosticsEnabled","isProd","Diagnostics","URL","url","pathname","defineProperty","configurable","enumerable","deprecatedReqRes","next","initialResponse","syncContext","updated","didError","isStream","isSpa","matches","routerContext","serverContext","timeline","coreRender","createApp","children","React","createElement","server","renderToStream","error","code","message","info","chalk","red","StreamError","RenderAborted","RenderTimeout","RenderCancel","includes","dim","original","isEnd","legacyContext","getHeaderEntries","forEach","cookies","length","prepareResponse","shell","prepare","executionContext","manifest","SsrManifest","prepareDevAssets","hints","injectAssets","hasEarlyHints","emitEarlyHints","routerRequestContext","onEarlyHints","writeEarlyHints","location","destroyed","writeFetchHeaders","cancel","redirect","writeFetchResponse","writeResponse","dispose"],"mappings":"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"}
|
package/browser/entry.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entry.js","sources":["../../src/browser/entry.tsx"],"sourcesContent":[null],"names":["async","entry","App","routes","init","routerOptions","createRouter","createBrowserRouter","rootId","stream","IS_SSR_MODE","receiveStream","undefined","documentReady","hydrationKey","document","readyState","Reflect","get","window","Promise","resolve","onReady","deleteProperty","addEventListener","once","Object","defineProperty","configurable","enumerable","set","value","writable","removeEventListener","waitForDocument","lazyMatches","matchRoutes","location","basename","filter","m","route","lazy","length","all","map","lazyResult","assign","hydration","__ssrBoostStream","ready","router","root","getElementById","isSSRMode","dataset","documentElement","dispatchEvent","CustomEvent","detail","appProps","AppComponent","React","createElement","client","RouterProvider","ReactDOM","hydrateRoot","createRoot","render"],"mappings":"6NA0EAA,eAAeC,EACbC,EACAC,GACAC,KACEA,EAAIC,cACJA,EAAaC,aACbA,EAAeC,EAAmBC,OAClCA,EAAS,QACyB,CAAA,GAEpC,MAAMC,EAASC,EAAcC,SAAkBC,EACzCC,EAvDgB,MACtB,MAAMC,EAAe,8BAErB,KAC0B,YAAxBC,SAASC,YACRN,QAAqDE,IAAtCK,QAAQC,IAAIC,OAAQL,IAKtC,OAAO,IAAIM,QAAeC,IACxB,MAAMC,EAAU,KACVZ,GACFO,QAAQM,eAAeJ,OAAQL,GAGjCO,KAGFN,SAASS,iBAAiB,mBAAoBF,EAAS,CAAEG,MAAM,IAE3Df,GACFgB,OAAOC,eAAeR,OAAQL,EAAc,CAC1Cc,cAAc,EACdC,YAAY,EACZX,IAAK,OACLY,IAAMC,IACJL,OAAOC,eAAeR,OAAQL,EAAc,CAC1Cc,cAAc,EACdC,YAAY,EACZG,UAAU,EACVD,UAEFhB,SAASkB,oBAAoB,mBAAoBX,GACjDD,UAqBca,GAChBC,EAAcC,EAClBjC,EACAgB,OAAOkB,SACPhC,GAAeiC,WACdC,OAAQC,GAAMA,EAAEC,MAAMC,OAIrB7B,GAAiBsB,GAAaQ,eAC1BvB,QAAQwB,IAAI,CAChB/B,MACIsB,GAAe,IAAIU,IAAI7C,MAAOwC,IAChC,MAAME,KAAEA,GAASF,EAAEC,MAEnB,GAAoB,mBAATC,EAAqB,CAC9B,MAAMI,QAAmBJ,IAErBI,GACFpB,OAAOqB,OAAOP,EAAEC,MAAO,IAClBK,EACHJ,UAAM9B,GAGZ,MAKN,MAAMoC,EAAY/B,QAAQC,IAAIC,OAAQ,+BAGlCV,GAAUuC,GAAWC,kBACvBhC,QAAQa,IAAIX,OAAQ,oCAAqCV,EAAOyC,OAGlE,MAAMC,EAAS7C,EAAaH,EAAyBE,GAC/C+C,EAAOrC,SAASsC,eAAe7C,
|
|
1
|
+
{"version":3,"file":"entry.js","sources":["../../src/browser/entry.tsx"],"sourcesContent":[null],"names":["async","entry","App","routes","init","routerOptions","createRouter","createBrowserRouter","rootId","stream","IS_SSR_MODE","receiveStream","undefined","documentReady","hydrationKey","document","readyState","Reflect","get","window","Promise","resolve","onReady","deleteProperty","addEventListener","once","Object","defineProperty","configurable","enumerable","set","value","writable","removeEventListener","waitForDocument","lazyMatches","matchRoutes","location","basename","filter","m","route","lazy","length","all","map","lazyResult","assign","hydration","__ssrBoostStream","ready","router","root","getElementById","isSSRMode","dataset","documentElement","dispatchEvent","CustomEvent","detail","appProps","AppComponent","React","createElement","client","RouterProvider","ReactDOM","hydrateRoot","createRoot","render"],"mappings":"6NA0EAA,eAAeC,EACbC,EACAC,GACAC,KACEA,EAAIC,cACJA,EAAaC,aACbA,EAAeC,EAAmBC,OAClCA,EAAS,QACyB,CAAA,GAEpC,MAAMC,EAASC,EAAcC,SAAkBC,EACzCC,EAvDgB,MACtB,MAAMC,EAAe,8BAErB,KAC0B,YAAxBC,SAASC,YACRN,QAAqDE,IAAtCK,QAAQC,IAAIC,OAAQL,IAKtC,OAAO,IAAIM,QAAeC,IACxB,MAAMC,EAAU,KACVZ,GACFO,QAAQM,eAAeJ,OAAQL,GAGjCO,KAGFN,SAASS,iBAAiB,mBAAoBF,EAAS,CAAEG,MAAM,IAE3Df,GACFgB,OAAOC,eAAeR,OAAQL,EAAc,CAC1Cc,cAAc,EACdC,YAAY,EACZX,IAAK,OACLY,IAAMC,IACJL,OAAOC,eAAeR,OAAQL,EAAc,CAC1Cc,cAAc,EACdC,YAAY,EACZG,UAAU,EACVD,UAEFhB,SAASkB,oBAAoB,mBAAoBX,GACjDD,UAqBca,GAChBC,EAAcC,EAClBjC,EACAgB,OAAOkB,SACPhC,GAAeiC,WACdC,OAAQC,GAAMA,EAAEC,MAAMC,OAIrB7B,GAAiBsB,GAAaQ,eAC1BvB,QAAQwB,IAAI,CAChB/B,MACIsB,GAAe,IAAIU,IAAI7C,MAAOwC,IAChC,MAAME,KAAEA,GAASF,EAAEC,MAEnB,GAAoB,mBAATC,EAAqB,CAC9B,MAAMI,QAAmBJ,IAErBI,GACFpB,OAAOqB,OAAOP,EAAEC,MAAO,IAClBK,EACHJ,UAAM9B,GAGZ,MAKN,MAAMoC,EAAY/B,QAAQC,IAAIC,OAAQ,+BAGlCV,GAAUuC,GAAWC,kBACvBhC,QAAQa,IAAIX,OAAQ,oCAAqCV,EAAOyC,OAGlE,MAAMC,EAAS7C,EAAaH,EAAyBE,GAC/C+C,EAAOrC,SAASsC,eAAe7C,GAK/B8C,EACJ5C,GAC6B,MAA7B0C,EAAKG,QAAkB,UAC0B,MAAjDxC,SAASyC,gBAAgBD,QAAkB,SAEzC7C,IACFO,QAAQM,eAAeJ,OAAQ,+BAE3BmC,GACFnC,OAAOsC,cAAc,IAAIC,YAAY,yBAA0B,CAAEC,OAAQ,CAAEnD,cAI/E,MAAMoD,QAAkBxD,IAAO,CAAEkD,YAAWH,YAEtCU,EAAmB,IACvBC,EAAAC,cAAC7D,EAAG,CAAC8D,OAAQJ,GACXE,EAAAC,cAACE,GAAed,OAAQA,KAI5B,OAAKG,EAIEY,EAASC,YAAYf,EAAMU,EAAAC,cAACF,EAAY,OAHtCK,EAASE,WAAWhB,GAAMiB,OAAOP,EAAAC,cAACF,EAAY,MAIzD"}
|
package/cloudflare.d.ts
CHANGED
|
@@ -28,7 +28,7 @@ type TWorkerHtml<TEnv> = {
|
|
|
28
28
|
indexHtml: string;
|
|
29
29
|
getHtml?: never;
|
|
30
30
|
};
|
|
31
|
-
|
|
31
|
+
type TWorkerHandlerOptions<TEnv = Record<string, unknown>, TAppProps = Record<string, any>> = Omit<ICreateHandlerOptions<TAppProps>, 'getHtml' | 'onRequest'> & TWorkerHtml<TEnv> & {
|
|
32
32
|
routes: TRouteObject[];
|
|
33
33
|
App: FC<PropsWithChildren<{
|
|
34
34
|
server: TAppProps;
|
|
@@ -36,7 +36,9 @@ export type IWorkerHandlerOptions<TEnv = Record<string, unknown>, TAppProps = Re
|
|
|
36
36
|
manifest: TRouteAssetsManifest;
|
|
37
37
|
/** Assets binding name, or false to delegate static delivery elsewhere. Default: ASSETS. */
|
|
38
38
|
assets?: string | false;
|
|
39
|
+
/** Emit module preload hints when enabled; defaults to false. */
|
|
39
40
|
modulePreload?: boolean;
|
|
41
|
+
/** HTML insertion marker; defaults to <!--ssr-outlet-->. */
|
|
40
42
|
outlet?: string;
|
|
41
43
|
routerOptions?: Parameters<typeof createStaticHandler>[1];
|
|
42
44
|
onRequest?: (params: {
|
|
@@ -52,6 +54,6 @@ export declare const getHtmlFromAssets: (env: object, indexPath?: string, bindin
|
|
|
52
54
|
/**
|
|
53
55
|
* Create a Fetch Worker with in-memory route assets and the Web stream renderer.
|
|
54
56
|
*/
|
|
55
|
-
export declare const createWorkerHandler: <TEnv extends object = Record<string, unknown>, TAppProps = Record<string, any>>({ routes, App, manifest, getHtml, indexHtml,
|
|
57
|
+
export declare const createWorkerHandler: <TEnv extends object = Record<string, unknown>, TAppProps = Record<string, any>>({ routes, App, manifest, getHtml, indexHtml, routerOptions, onRequest, onRouterReady, onShellReady, prepare, assets, modulePreload, outlet, ...options }: TWorkerHandlerOptions<TEnv, TAppProps>) => TWorkerHandler<TEnv>;
|
|
56
58
|
export { RouteAssets };
|
|
57
|
-
export type { TRouteAssetsManifest, IHtmlShell };
|
|
59
|
+
export type { TWorkerHandlerOptions as IWorkerHandlerOptions, TRouteAssetsManifest, IHtmlShell };
|
package/cloudflare.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{createElement as e}from"react";import{createStaticHandler as t}from"react-router";import s from"./core/handler.js";import r from"./core/head-response.js";import o from"./edge/render-to-stream.js";import{splitHtmlShell as n}from"./services/diagnostics.js";import a from"./services/route-asset-preparer.js";import i from"./services/route-assets-memory.js";const c="Cache-Control",d=new WeakMap,
|
|
1
|
+
import{createElement as e}from"react";import{createStaticHandler as t}from"react-router";import s from"./core/handler.js";import r from"./core/head-response.js";import o from"./edge/render-to-stream.js";import{splitHtmlShell as n}from"./services/diagnostics.js";import a from"./services/route-asset-preparer.js";import i from"./services/route-assets-memory.js";const c="Cache-Control",d=new WeakMap,m=(e,t)=>{const s=Reflect.get(e,t);if(!s||"function"!=typeof s.fetch)throw new Error(`[ssr-boost] Missing Workers assets binding "${t}".`);return s},l=async(e,t="/index.html",s="ASSETS",r="\x3c!--ssr-outlet--\x3e")=>{const o=m(e,s);let a=d.get(o);a||(a=new Map,d.set(o,a));const i=JSON.stringify([t,r]);let c=a.get(i);return c||(c=(async()=>{const e=await o.fetch(new Request(new URL(t,"https://assets.local"))),{ok:s,body:a,status:i}=e;if(!s)throw await(a?.cancel()),new Error(`[ssr-boost] Failed to load "${t}" from assets: ${i}.`);const[c,d]=n(await e.text(),t,r);return()=>({header:c,footer:d})})(),a.set(i,c),c.catch(()=>a.delete(i))),c},p=({routes:d,App:l,manifest:p,getHtml:u,indexHtml:f,routerOptions:w,onRequest:h,onRouterReady:g,onShellReady:x,prepare:y,assets:R="ASSETS",modulePreload:S=!1,outlet:b="\x3c!--ssr-outlet--\x3e",...v})=>{const E=t(d,w),A=a(new i(p,S)),j=void 0===f?void 0:n(f,"indexHtml",b);return async(t,n,a)=>{const{url:i,method:d,headers:p}=t,{pathname:f}=new URL(i);if(!1!==R&&["GET","HEAD"].includes(d)&&"/"!==f&&"/index.html"!==f){const e=await m(n,R).fetch(t),{status:s,ok:o,headers:a,body:i,statusText:d}=e;if(404!==s){if((o||304===s)&&/\/assets\/[^/]+-[\w-]{8,}\.[^/]+$/.test(f)){const e=new Headers(a);return e.set(c,"public, max-age=31536000, immutable"),r(t,new Response(i,{status:s,statusText:d,headers:e}))}return r(t,e)}await(i?.cancel())}const w={platform:{env:n,ctx:a},waitUntil:a.waitUntil.bind(a)};return s({handler:E,createApp:(t,s)=>e(l,{server:s.appProps},t),renderToStream:o},{diagnostics:!1,...v,getHtml:()=>u?u(t,n,a):{header:j[0],footer:j[1]},onRequest:h?()=>h({request:t,executionContext:w}):void 0,prepare:async e=>{await A(e),await(y?.(e))},onShellReady:e=>{const{context:t}=e,{isStream:s,response:r}=t,{headers:o}=r;return s&&!o.has("Content-Encoding")&&(o.set("Content-Encoding","identity"),o.get(c)?.includes("no-transform")||o.append(c,"no-transform")),x?.(e)??{}},onRouterReady:async e=>({isStream:!/bot|crawler|spider|slurp|bingpreview/i.test(p.get("User-Agent")??""),...await(g?.(e))})})(t,w)}};export{i as RouteAssets,p as createWorkerHandler,l as getHtmlFromAssets};
|
|
2
2
|
//# sourceMappingURL=cloudflare.js.map
|
package/cloudflare.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cloudflare.js","sources":["../src/cloudflare.ts"],"sourcesContent":[null],"names":["CACHE_CONTROL","htmlCache","WeakMap","getAssetsBinding","env","name","binding","Reflect","get","fetch","Error","getHtmlFromAssets","async","indexPath","bindingName","outlet","cache","Map","set","key","JSON","stringify","pending","response","Request","URL","ok","
|
|
1
|
+
{"version":3,"file":"cloudflare.js","sources":["../src/cloudflare.ts"],"sourcesContent":[null],"names":["CACHE_CONTROL","htmlCache","WeakMap","getAssetsBinding","env","name","binding","Reflect","get","fetch","Error","getHtmlFromAssets","async","indexPath","bindingName","outlet","cache","Map","set","key","JSON","stringify","pending","response","Request","URL","ok","isOk","body","status","cancel","header","footer","splitHtmlShell","text","catch","delete","createWorkerHandler","routes","App","manifest","getHtml","indexHtml","routerOptions","onRequest","onRouterReady","onShellReady","prepare","assets","modulePreload","options","handler","createStaticHandler","prepareAssets","createAssetPreparer","RouteAssets","shell","undefined","request","ctx","url","method","headers","requestHeaders","pathname","includes","responseHeaders","statusText","test","Headers","headResponse","Response","executionContext","platform","waitUntil","bind","createHandler","createApp","children","context","createElement","server","appProps","renderToStream","diagnostics","params","isStream","has","append","render"],"mappings":"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"}
|
package/core/cache-control.d.ts
CHANGED
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
export interface ICachePolicy {
|
|
2
2
|
public?: boolean;
|
|
3
3
|
private?: boolean;
|
|
4
|
+
/** Non-negative integer seconds of freshness in any cache. */
|
|
4
5
|
maxAge?: number;
|
|
6
|
+
/** Non-negative integer seconds of freshness in shared caches. */
|
|
5
7
|
sMaxAge?: number;
|
|
8
|
+
/** Non-negative integer seconds to serve stale content during revalidation. */
|
|
6
9
|
staleWhileRevalidate?: number;
|
|
10
|
+
/** Non-negative integer seconds to serve stale content after an error. */
|
|
7
11
|
staleIfError?: number;
|
|
8
12
|
noStore?: boolean;
|
|
9
13
|
noCache?: boolean;
|
package/core/cache-control.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const e={public:"public",private:"private",maxAge:"max-age",sMaxAge:"s-maxage",staleWhileRevalidate:"stale-while-revalidate",staleIfError:"stale-if-error",noStore:"no-store",noCache:"no-cache",mustRevalidate:"must-revalidate",immutable:"immutable"},a=new Set(["maxAge","sMaxAge","staleWhileRevalidate","staleIfError"]),t=t=>{if(!t||"object"!=typeof t||Array.isArray(t))throw new TypeError("Cache policy must be an object.");for(const[r,
|
|
1
|
+
const e={public:"public",private:"private",maxAge:"max-age",sMaxAge:"s-maxage",staleWhileRevalidate:"stale-while-revalidate",staleIfError:"stale-if-error",noStore:"no-store",noCache:"no-cache",mustRevalidate:"must-revalidate",immutable:"immutable"},a=new Set(["maxAge","sMaxAge","staleWhileRevalidate","staleIfError"]),t=t=>{if(!t||"object"!=typeof t||Array.isArray(t))throw new TypeError("Cache policy must be an object.");for(const[r,o]of Object.entries(t)){if(!Object.hasOwn(e,r))throw new TypeError(`Unknown cache directive: ${r}.`);if(void 0!==o&&(a.has(r)?"number"!=typeof o||!Number.isSafeInteger(o)||o<0:"boolean"!=typeof o))throw new TypeError(`Invalid cache directive: ${r}.`)}const{public:r,private:o,noStore:i,immutable:n,sMaxAge:c,noCache:l,mustRevalidate:s,staleWhileRevalidate:h,staleIfError:p}=t;if(r&&o)throw new TypeError("Cache policy cannot be both public and private.");if(i&&(r||n||[...a].some(e=>void 0!==t[e]))||o&&void 0!==c||n&&(l||s)||(l||s)&&(void 0!==h||void 0!==p))throw new TypeError("Cache policy contains conflicting directives.");return Object.entries(e).flatMap(([e,r])=>{const o=t[e];return void 0===o||!1===o?[]:[a.has(e)?`${r}=${o}`:r]}).join(", ")};export{t as default};
|
|
2
2
|
//# sourceMappingURL=cache-control.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache-control.js","sources":["../../src/core/cache-control.ts"],"sourcesContent":[null],"names":["directives","public","private","maxAge","sMaxAge","staleWhileRevalidate","staleIfError","noStore","noCache","mustRevalidate","immutable","seconds","Set","cacheControl","policy","Array","isArray","TypeError","name","value","Object","entries","hasOwn","undefined","has","Number","isSafeInteger","some","flatMap","directive","join"],"mappings":"
|
|
1
|
+
{"version":3,"file":"cache-control.js","sources":["../../src/core/cache-control.ts"],"sourcesContent":[null],"names":["directives","public","private","maxAge","sMaxAge","staleWhileRevalidate","staleIfError","noStore","noCache","mustRevalidate","immutable","seconds","Set","cacheControl","policy","Array","isArray","TypeError","name","value","Object","entries","hasOwn","undefined","has","Number","isSafeInteger","isPublic","isPrivate","isNoStore","isImmutable","isNoCache","shouldRevalidate","some","flatMap","directive","join"],"mappings":"AAwBA,MAAMA,EAAa,CACjBC,OAAQ,SACRC,QAAS,UACTC,OAAQ,UACRC,QAAS,WACTC,qBAAsB,yBACtBC,aAAc,iBACdC,QAAS,WACTC,QAAS,WACTC,eAAgB,kBAChBC,UAAW,aAMPC,EAAU,IAAIC,IAAI,CAAC,SAAU,UAAW,uBAAwB,iBAGhEC,EAAgBC,IACpB,IAAKA,GAA4B,iBAAXA,GAAuBC,MAAMC,QAAQF,GACzD,MAAM,IAAIG,UAAU,mCAGtB,IAAK,MAAOC,EAAMC,KAAUC,OAAOC,QAAQP,GAAS,CAClD,IAAKM,OAAOE,OAAOtB,EAAYkB,GAC7B,MAAM,IAAID,UAAU,4BAA4BC,MAGlD,QAAcK,IAAVJ,IAKFR,EAAQa,IAAIN,GACS,iBAAVC,IAAuBM,OAAOC,cAAcP,IAAUA,EAAQ,EACpD,kBAAVA,GAEX,MAAM,IAAIF,UAAU,4BAA4BC,KAEpD,CAEA,MACEjB,OAAQ0B,EACRzB,QAAS0B,EACTrB,QAASsB,EACTnB,UAAWoB,EAAW1B,QACtBA,EACAI,QAASuB,EACTtB,eAAgBuB,EAAgB3B,qBAChCA,EAAoBC,aACpBA,GACEQ,EAEJ,GAAIa,GAAYC,EACd,MAAM,IAAIX,UAAU,mDAGtB,GACGY,IACEF,GACCG,GACA,IAAInB,GAASsB,KAAMf,QAAgDK,IAAvCT,EAAOI,MACtCU,QAAyBL,IAAZnB,GACb0B,IAAgBC,GAAaC,KAC5BD,GAAaC,UACaT,IAAzBlB,QAAuDkB,IAAjBjB,GAEzC,MAAM,IAAIW,UAAU,iDAMtB,OAAOG,OAAOC,QAAQrB,GACnBkC,QAAQ,EAAEhB,EAAMiB,MACf,MAAMhB,EAAQL,EAAOI,GAErB,YAAcK,IAAVJ,IAAiC,IAAVA,EAClB,GAGF,CAACR,EAAQa,IAAIN,GAAQ,GAAGiB,KAAahB,IAAUgB,KAEvDC,KAAK"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export interface IConditionalValidators {
|
|
2
2
|
/** Quoted entity tag, optionally prefixed with W/. Must identify the selected representation. */
|
|
3
3
|
etag?: string;
|
|
4
|
+
/** Modification time of the selected representation; must parse as a valid date. */
|
|
4
5
|
lastModified?: string | Date;
|
|
5
6
|
}
|
|
6
7
|
/**
|
|
@@ -8,5 +9,5 @@ export interface IConditionalValidators {
|
|
|
8
9
|
* If-None-Match takes precedence, uses weak comparison, and may contain a list.
|
|
9
10
|
* Call before sending a buffered response; this helper never reads or hashes a stream.
|
|
10
11
|
*/
|
|
11
|
-
declare const conditionalRequest: (
|
|
12
|
+
declare const conditionalRequest: ({ method, headers: requestHeaders }: Request, { etag, lastModified }: IConditionalValidators) => Response | undefined;
|
|
12
13
|
export default conditionalRequest;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const e=/^(?:W\/)?"[\x21\x23-\x7e\x80-\xff]*"$/,t=/^(?:[A-Za-z]{3}, \d{2} [A-Za-z]{3} \d{4} \d{2}:\d{2}:\d{2} GMT|[A-Za-z]+, \d{2}-[A-Za-z]{3}-\d{2} \d{2}:\d{2}:\d{2} GMT|[A-Za-z]{3} [A-Za-z]{3} [ \d]\d \d{2}:\d{2}:\d{2} \d{4})$/,d=(d,{etag:a,lastModified:
|
|
1
|
+
const e=/^(?:W\/)?"[\x21\x23-\x7e\x80-\xff]*"$/,t=/^(?:[A-Za-z]{3}, \d{2} [A-Za-z]{3} \d{4} \d{2}:\d{2}:\d{2} GMT|[A-Za-z]+, \d{2}-[A-Za-z]{3}-\d{2} \d{2}:\d{2}:\d{2} GMT|[A-Za-z]{3} [A-Za-z]{3} [ \d]\d \d{2}:\d{2}:\d{2} \d{4})$/,d=({method:d,headers:i},{etag:a,lastModified:o})=>{if(void 0!==a&&!e.test(a))throw new TypeError("ETag must be a quoted entity tag, optionally prefixed with W/.");const s=void 0===o?void 0:new Date(o).getTime();if(void 0!==s&&!Number.isFinite(s))throw new TypeError("Last-Modified must be a valid date.");if(!["GET","HEAD"].includes(d))return;const n=i.get("If-None-Match");let r=!1;if(null!==n){const e=n.match(/(?:W\/)?"[\x21\x23-\x7e\x80-\xff]*"|\*/g)??[];r=/^(?:\*|(?:W\/)?"[\x21\x23-\x7e\x80-\xff]*"(?:\s*,\s*(?:W\/)?"[\x21\x23-\x7e\x80-\xff]*")*)$/.test(n)&&e.some(e=>"*"===e||a&&e.replace(/^W\//,"")===a.replace(/^W\//,""))}else if(void 0!==s){const e=i.get("If-Modified-Since"),d=null!==e&&t.test(e)?Date.parse(e):NaN;r=Number.isFinite(d)&&Math.floor(s/1e3)<=Math.floor(d/1e3)}if(!r)return;const f=new Headers;return void 0!==a&&f.set("ETag",a),void 0!==s&&f.set("Last-Modified",new Date(s).toUTCString()),new Response(null,{status:304,headers:f})};export{d as default};
|
|
2
2
|
//# sourceMappingURL=conditional-request.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conditional-request.js","sources":["../../src/core/conditional-request.ts"],"sourcesContent":[null],"names":["entityTag","httpDate","conditionalRequest","
|
|
1
|
+
{"version":3,"file":"conditional-request.js","sources":["../../src/core/conditional-request.ts"],"sourcesContent":[null],"names":["entityTag","httpDate","conditionalRequest","method","headers","requestHeaders","etag","lastModified","undefined","test","TypeError","modified","Date","getTime","Number","isFinite","includes","noneMatch","get","hasMatch","list","match","some","tag","replace","since","timestamp","parse","NaN","Math","floor","Headers","set","toUTCString","Response","status"],"mappings":"AAWA,MAAMA,EAAY,wCAKZC,EACJ,oLAOIC,EAAqB,EACvBC,SAAQC,QAASC,IACjBC,OAAMC,mBAER,QAAaC,IAATF,IAAuBN,EAAUS,KAAKH,GACxC,MAAM,IAAII,UAAU,kEAGtB,MAAMC,OAA4BH,IAAjBD,OAA6BC,EAAY,IAAII,KAAKL,GAAcM,UAEjF,QAAiBL,IAAbG,IAA2BG,OAAOC,SAASJ,GAC7C,MAAM,IAAID,UAAU,uCAGtB,IAAK,CAAC,MAAO,QAAQM,SAASb,GAC5B,OAGF,MAAMc,EAAYZ,EAAea,IAAI,iBACrC,IAAIC,GAAW,EAEf,GAAkB,OAAdF,EAAoB,CAItB,MAAMG,EAAiBH,EAAUI,MAAM,4CAA8C,GAMrFF,EAJE,8FAA8FV,KAC5FQ,IAKFG,EAAKE,KACFC,GAAgB,MAARA,GAAgBjB,GAAQiB,EAAIC,QAAQ,OAAQ,MAAQlB,EAAKkB,QAAQ,OAAQ,IAExF,MAAO,QAAiBhB,IAAbG,EAAwB,CACjC,MAAMc,EAAQpB,EAAea,IAAI,qBAC3BQ,EAAsB,OAAVD,GAAkBxB,EAASQ,KAAKgB,GAASb,KAAKe,MAAMF,GAASG,IAE/ET,EACEL,OAAOC,SAASW,IAAcG,KAAKC,MAAMnB,EAAW,MAASkB,KAAKC,MAAMJ,EAAY,IACxF,CAEA,IAAKP,EACH,OAGF,MAAMf,EAAU,IAAI2B,QAUpB,YARavB,IAATF,GACFF,EAAQ4B,IAAI,OAAQ1B,QAGLE,IAAbG,GACFP,EAAQ4B,IAAI,gBAAiB,IAAIpB,KAAKD,GAAUsB,eAG3C,IAAIC,SAAS,KAAM,CAAEC,OAAQ,IAAK/B"}
|
|
@@ -3,7 +3,7 @@ import type { StaticHandlerContext } from 'react-router';
|
|
|
3
3
|
* Copy only named fields, visiting matched routes root to leaf, loader before action.
|
|
4
4
|
* The first ordinary value wins (including Cache-Control); all cookies are appended.
|
|
5
5
|
*/
|
|
6
|
-
declare const copyLoaderHeaders: (
|
|
6
|
+
declare const copyLoaderHeaders: ({ matches, loaderHeaders, actionHeaders, }: Pick<StaticHandlerContext, "matches" | "loaderHeaders" | "actionHeaders">, { allow }: {
|
|
7
7
|
allow: readonly string[];
|
|
8
8
|
}) => Headers;
|
|
9
9
|
export default copyLoaderHeaders;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{getHeaderEntries as e,getSetCookieHeaders as o}from"./headers.js";const t=(t,{allow:
|
|
1
|
+
import{getHeaderEntries as e,getSetCookieHeaders as o}from"./headers.js";const t=({matches:t,loaderHeaders:a,actionHeaders:s},{allow:r})=>{const n=new Headers,c=new Set(r.map(e=>e.toLowerCase()));c.delete("content-type");for(const{route:{id:r}}of t)for(const t of[a[r],s[r]])t&&(e(t).forEach(([e,o])=>{c.has(e.toLowerCase())&&!n.has(e)&&n.set(e,o)}),c.has("set-cookie")&&o(t).forEach(e=>n.append("Set-Cookie",e)));return n};export{t as default};
|
|
2
2
|
//# sourceMappingURL=copy-loader-headers.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"copy-loader-headers.js","sources":["../../src/core/copy-loader-headers.ts"],"sourcesContent":[null],"names":["copyLoaderHeaders","
|
|
1
|
+
{"version":3,"file":"copy-loader-headers.js","sources":["../../src/core/copy-loader-headers.ts"],"sourcesContent":[null],"names":["copyLoaderHeaders","matches","loaderHeaders","actionHeaders","allow","headers","Headers","allowed","Set","map","name","toLowerCase","delete","route","id","source","getHeaderEntries","forEach","value","has","set","getSetCookieHeaders","cookie","append"],"mappings":"yEAOA,MAAMA,EAAoB,EAEtBC,UACAC,gBACAC,kBAEAC,YAEF,MAAMC,EAAU,IAAIC,QACdC,EAAU,IAAIC,IAAIJ,EAAMK,IAAKC,GAASA,EAAKC,gBAEjDJ,EAAQK,OAAO,gBAEf,IAAK,MACHC,OAAOC,GAAEA,MACNb,EACH,IAAK,MAAMc,IAAU,CAACb,EAAcY,GAAKX,EAAcW,IAChDC,IAOLC,EAAiBD,GAAQE,QAAQ,EAAEP,EAAMQ,MACnCX,EAAQY,IAAIT,EAAKC,iBAAmBN,EAAQc,IAAIT,IAClDL,EAAQe,IAAIV,EAAMQ,KAIlBX,EAAQY,IAAI,eACdE,EAAoBN,GAAQE,QAASK,GAAWjB,EAAQkB,OAAO,aAAcD,KAKnF,OAAOjB"}
|
package/core/document-headers.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{getHeaderEntries as e,getSetCookieHeaders as t}from"./headers.js";const o=(e,t)=>(e.headers.get("Cookie")??"").split(";").some(e=>{const o=e.indexOf("=");return-1!==o&&e.slice(0,o).trim()===t}),r=(r,{sessionCookie:s,protectPrivate:n=!0}={})=>({request:
|
|
1
|
+
import{getHeaderEntries as e,getSetCookieHeaders as t}from"./headers.js";const o=(e,t)=>(e.headers.get("Cookie")??"").split(";").some(e=>{const o=e.indexOf("=");return-1!==o&&e.slice(0,o).trim()===t}),r=(r,{sessionCookie:s,protectPrivate:n=!0}={})=>({request:i,routerContext:a,response:c})=>{const{url:h,headers:l}=i,d=new Headers(c.headers),p={request:i,url:new URL(h),isBot:/bot|crawler|spider|crawling/i.test(l.get("User-Agent")??""),hasCookie:e=>o(i,e),routerContext:a};for(const o of r){if(!o.when(p))continue;const r=new Headers(o.set);e(r).forEach(([e,t])=>d.set(e,t)),t(r).forEach(e=>d.append("Set-Cookie",e))}n&&(d.has("Set-Cookie")||l.has("Authorization")||s&&o(i,s))&&d.set("Cache-Control","private, no-store");const u=(d.get("Vary")??"").split(",").map(e=>e.trim()).filter(e=>e&&"cookie"!==e.toLowerCase());return u.length?d.set("Vary",u.join(", ")):d.delete("Vary"),d};export{r as default,o as hasCookie};
|
|
2
2
|
//# sourceMappingURL=document-headers.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"document-headers.js","sources":["../../src/core/document-headers.ts"],"sourcesContent":[null],"names":["hasCookie","request","name","headers","get","split","some","cookie","separator","indexOf","slice","trim","documentHeaders","rules","sessionCookie","protectPrivate","routerContext","response","
|
|
1
|
+
{"version":3,"file":"document-headers.js","sources":["../../src/core/document-headers.ts"],"sourcesContent":[null],"names":["hasCookie","request","name","headers","get","split","some","cookie","separator","indexOf","slice","trim","documentHeaders","rules","sessionCookie","protectPrivate","routerContext","response","url","requestHeaders","Headers","ruleContext","URL","isBot","test","rule","when","selected","set","getHeaderEntries","forEach","value","getSetCookieHeaders","append","has","vary","map","filter","toLowerCase","length","join","delete"],"mappings":"yEAiCO,MAAMA,EAAY,CAACC,EAAkBC,KACzCD,EAAQE,QAAQC,IAAI,WAAa,IAAIC,MAAM,KAAKC,KAAMC,IACrD,MAAMC,EAAYD,EAAOE,QAAQ,KAEjC,OAAqB,IAAdD,GAAoBD,EAAOG,MAAM,EAAGF,GAAWG,SAAWT,IAO/DU,EAAkB,CACtBC,GACEC,gBAAeC,kBAAiB,GAAkC,KAK7D,EAAGd,UAASe,gBAAeC,eAChC,MAAMC,IAAEA,EAAKf,QAASgB,GAAmBlB,EACnCE,EAAU,IAAIiB,QAAQH,EAASd,SAC/BkB,EAAoC,CACxCpB,UACAiB,IAAK,IAAII,IAAIJ,GACbK,MAAO,+BAA+BC,KAAKL,EAAef,IAAI,eAAiB,IAK/EJ,UAAYE,GAASF,EAAUC,EAASC,GACxCc,iBAGF,IAAK,MAAMS,KAAQZ,EAAO,CACxB,IAAKY,EAAKC,KAAKL,GACb,SAGF,MAAMM,EAAW,IAAIP,QAAQK,EAAKG,KAElCC,EAAiBF,GAAUG,QAAQ,EAAE5B,EAAM6B,KAAW5B,EAAQyB,IAAI1B,EAAM6B,IACxEC,EAAoBL,GAAUG,QAASvB,GAAWJ,EAAQ8B,OAAO,aAAc1B,GACjF,CAGEQ,IACCZ,EAAQ+B,IAAI,eACXf,EAAee,IAAI,kBAClBpB,GAAiBd,EAAUC,EAASa,KAEvCX,EAAQyB,IAAI,gBAAiB,qBAO/B,MAAMO,GAAQhC,EAAQC,IAAI,SAAW,IAClCC,MAAM,KACN+B,IAAKlC,GAASA,EAAKS,QACnB0B,OAAQnC,GAASA,GAA+B,WAAvBA,EAAKoC,eAQjC,OANIH,EAAKI,OACPpC,EAAQyB,IAAI,OAAQO,EAAKK,KAAK,OAE9BrC,EAAQsC,OAAO,QAGVtC"}
|
package/core/handler.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{hasCookie as e}from"./document-headers.js";import s from"./head-response.js";import t from"./render.js";import o from"./spa-shell.js";import r from"./ssr-policy.js";import n,{isDiagnosticsEnabled as a}from"../services/diagnostics.js";import{createTimeline as i}from"../services/request-timeline.js";const c=(c,{diagnostics:p,getHtml:m,onContext:d,onRequest:l,ssr:u,basename:h,...f})=>{const w=new r(u,c.handler.dataRoutes,h),j=o();return async(o,r)=>{const u=a(p),h=i(o,u);try{const a=await(l?.({executionContext:r,request:o})),i=a instanceof Response,p=i?void 0:a,x={appProps:p?.appProps??{},diagnostics:u?new n(new URL(o.url).pathname):void 0,executionContext:r,html:i?{header:"",footer:""}:await m(o),request:o,response:{headers:new Headers(p?.headers),status:p?.status},...h?{timeline:h}:{}};if(d?.({context:x}),i){x.diagnostics?.inspectCachePolicy(a.headers,Boolean(
|
|
1
|
+
import{hasCookie as e}from"./document-headers.js";import s from"./head-response.js";import t from"./render.js";import o from"./spa-shell.js";import r from"./ssr-policy.js";import n,{isDiagnosticsEnabled as a}from"../services/diagnostics.js";import{createTimeline as i}from"../services/request-timeline.js";const c=(c,{diagnostics:p,getHtml:m,onContext:d,onRequest:l,ssr:u,basename:h,...f})=>{const w=new r(u,c.handler.dataRoutes,h),j=o();return async(o,r)=>{const u=a(p),h=i(o,u);try{const a=await(l?.({executionContext:r,request:o})),i=a instanceof Response,p=i?void 0:a,x={appProps:p?.appProps??{},diagnostics:u?new n(new URL(o.url).pathname):void 0,executionContext:r,html:i?{header:"",footer:""}:await m(o),request:o,response:{headers:new Headers(p?.headers),status:p?.status},...h?{timeline:h}:{}};if(d?.({context:x}),i){const{sessionCookie:t}=f;x.diagnostics?.inspectCachePolicy(a.headers,Boolean(t&&e(o,t)));const r=await s(o,a);return h?.response(r)??r}return await t({...c,policy:w,spaShell:j},x,f,r)}catch(e){throw h?.abort(e),h?.end(),e}}};export{c as default};
|
|
2
2
|
//# sourceMappingURL=handler.js.map
|
package/core/handler.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handler.js","sources":["../../src/core/handler.ts"],"sourcesContent":[null],"names":["createHandler","params","diagnostics","getHtml","onContext","onRequest","ssr","basename","options","policy","SsrPolicy","handler","dataRoutes","spaShell","createSpaShell","async","request","executionContext","isEnabled","isDiagnosticsEnabled","timeline","createTimeline","requestInit","isBypass","Response","metadata","undefined","context","appProps","Diagnostics","URL","url","pathname","html","header","footer","response","headers","Headers","status","
|
|
1
|
+
{"version":3,"file":"handler.js","sources":["../../src/core/handler.ts"],"sourcesContent":[null],"names":["createHandler","params","diagnostics","getHtml","onContext","onRequest","ssr","basename","options","policy","SsrPolicy","handler","dataRoutes","spaShell","createSpaShell","async","request","executionContext","isEnabled","isDiagnosticsEnabled","timeline","createTimeline","requestInit","isBypass","Response","metadata","undefined","context","appProps","Diagnostics","URL","url","pathname","html","header","footer","response","headers","Headers","status","sessionCookie","inspectCachePolicy","Boolean","hasCookie","headResponse","render","error","abort","end"],"mappings":"kTAsDA,MAAMA,EAAgB,CACpBC,GAEEC,cACAC,UACAC,YACAC,YACAC,MACAC,cACGC,MAGL,MAAMC,EAAS,IAAIC,EAAUJ,EAAKL,EAAOU,QAAQC,WAAYL,GACvDM,EAAWC,IAKjB,OAAOC,MAAOC,EAASC,KACrB,MAAMC,EAAYC,EAAqBjB,GACjCkB,EAAWC,EAAeL,EAASE,GAEzC,IACE,MAAMI,QAAoBjB,IAAY,CAAEY,mBAAkBD,aACpDO,EAAWD,aAAuBE,SAClCC,EAAWF,OAAWG,EAAYJ,EAClCK,EAAyC,CAC7CC,SAAWH,GAAUG,UAAY,GACjC1B,YAAagB,EAAY,IAAIW,EAAY,IAAIC,IAAId,EAAQe,KAAKC,eAAYN,EAC1ET,mBACAgB,KAAMV,EAAW,CAAEW,OAAQ,GAAIC,OAAQ,UAAahC,EAAQa,GAC5DA,UACAoB,SAAU,CACRC,QAAS,IAAIC,QAAQb,GAAUY,SAC/BE,OAAQd,GAAUc,WAEhBnB,EAAW,CAAEA,YAAa,IAKhC,GAFAhB,IAAY,CAAEuB,YAEVJ,EAAU,CACZ,MAAMiB,cAAEA,GAAkBhC,EAE1BmB,EAAQzB,aAAauC,mBACnBnB,EAAYe,QACZK,QAAQF,GAAiBG,EAAU3B,EAASwB,KAG9C,MAAMJ,QAAiBQ,EAAa5B,EAASM,GAE7C,OAAOF,GAAUgB,SAASA,IAAaA,CACzC,CAEA,aAAaS,EAAO,IAAK5C,EAAQQ,SAAQI,YAAYc,EAASnB,EAASS,EACzE,CAAE,MAAO6B,GAGP,MAFA1B,GAAU2B,MAAMD,GAChB1B,GAAU4B,MACJF,CACR"}
|
package/core/render.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import e from"react";import{matchRoutes as t,createStaticRouter as r,StaticRouterProvider as s}from"react-router";import o from"../constants/stream-error.js";import{ServerProvider as a}from"../context/server.js";import n from"./compose-html.js";import i from"./data-stream.js";import c,{hasCookie as d}from"./document-headers.js";import l from"./head-response.js";import{mergeResponseHeaders as m}from"./headers.js";import h from"./transform-html.js";import u from"../helpers/build-custom-state.js";import p from"../helpers/obtain-stream-error.js";import{createTimeline as C}from"../services/request-timeline.js";const f="text/html",w="Content-Type",x=async({createApp:d,handler:C,renderToStream:x,policy:y,spaShell:R},S,{abortDelay:b=15e3,getState:q,hydration:v="footer",nonce:g,bootstrapScriptContent:E,onError:j,onResponse:k,onRouterReady:H,onShellError:P,onShellReady:T,prepare:A,routerRequestContext:B,documentHeaders:D,sessionCookie:L,protectPrivate:_},$)=>{const I=y?.select(S.request,S.diagnostics)??"ssr";if(y?.active&&!S.response.headers.has("Cache-Control")&&S.response.headers.set("Cache-Control","no-store"),"spa"===I)return S.isSpa=!0,S.isStream=!1,S.matches=t(C.dataRoutes,new URL(S.request.url),y?.basename)??[],S.html=R(S.html),await(A?.({context:S,executionContext:$})),D&&(S.response.headers=c(D,{sessionCookie:L,protectPrivate:_})(S)),S.response.status=200,S.response.headers.set(w,"text/html; charset=utf-8"),new Response("HEAD"===S.request.method?null:S.html.header+S.html.footer,{headers:S.response.headers,status:200});const U=await C.query(S.request,{requestContext:B??S});if(S.timeline?.record("router.query"),U instanceof Response)return l(S.request,m(U,S.response.headers));S.routerContext=U,S.matches=U.matches;const z=new i(U,S.diagnostics,g,S.timeline);try{await(A?.({context:S,executionContext:$})),S.timeline?.record("prepare")}catch(e){throw z.cancel(),e}const{isStream:F=!0}=await(H?.({context:S}))??{};S.isStream=F,S.serverContext={basename:S.routerContext.basename,isServer:!0,response:null};const G=r(C.dataRoutes,S.routerContext),J=e.createElement(a,{context:S.serverContext},d(e.createElement(s,{router:G,context:S.routerContext,hydrate:!1}),S)),K=new AbortController;let M,N,O=!1;const Q=()=>X(S.request.signal.reason),V=()=>clearTimeout(Y),W=()=>{V(),S.request.signal.removeEventListener("abort",Q)},X=e=>{O||(O=!0,M=e,S.timeline?.abort(e),W(),S.didError??=o.RenderCancel,z.abort(),K.abort(e),N?.abort(e))},Y=setTimeout(()=>{S.didError=o.RenderTimeout,S.timeline?.abort(new Error(`SSR render timed out after ${b}ms`)),X()},b);S.request.signal.aborted?X(S.request.signal.reason):S.request.signal.addEventListener("abort",Q,{once:!0});try{N=await x(J,{nonce:g,bootstrapScriptContent:"early"===v&&F?`(window.__ssrBoostStream = window.__ssrBoostStream || []).push(["shell"]);${E??""};document.currentScript?.remove();`:E,onError:e=>{const t=p(e);!O||t.code!==o.RenderAborted&&e!==K.signal.reason||(t.code=S.didError===o.RenderTimeout?o.RenderTimeout:o.RenderCancel);const{code:r}=t;S.didError??=r,j?.({context:S,error:t})},signal:K.signal}),O&&N.abort(M),Promise.all([N.allReady,z.done]).then(V,V),await N.shellReady,S.timeline?.record("shell.ready"),F||await Promise.all([N.allReady,z.done])}catch(e){return X(e),await(N?.stream.cancel(e).catch(()=>{})),((e,t,r)=>{const s=t instanceof Error?t:new Error(String(t)),o=r?.({context:e,error:s})||"<!doctype html><p>Internal Server Error</p>",a=new Headers(e.response.headers);return a.set(w,f),new Response("HEAD"===e.request.method?null:o,{headers:a,status:500})})(S,e,P)}try{const e=S.serverContext.response;if(e&&(Z=e,Boolean(Z&&Z.status>=300&&Z.status<400&&Z.headers.has("Location"))))return X(),await N.stream.cancel().catch(()=>{}),l(S.request,m(e,S.response.headers));const{header:t,footer:r,headers:s,status:o}=((e,{getState:t,onShellReady:r,hydration:s,nonce:o,documentHeaders:a,sessionCookie:n,protectPrivate:i},d)=>{const l=e.serverContext.response;e.response.status=l?.status??e.response.status??e.routerContext.statusCode??200,e.response.headers.has(w)||e.response.headers.set(w,f);const m=r?.({context:e})??{},h="early"===s&&e.isStream,p=u(t?.({context:e}),e.diagnostics,o,Boolean(h));let C=m.header||e.html.header;const x=m.footer||e.html.footer;e.diagnostics?.inspectShell({header:C,footer:x});let y=x;return h?C+=p+d.state(!0):y=p+d.state(!1)+d.take()+y,a&&(e.response.headers=c(a,{sessionCookie:n,protectPrivate:i})(e)),{header:C,footer:y,headers:new Headers(e.response.headers),status:e.response.status}})(S,{getState:q,onShellReady:T,hydration:v,nonce:g,documentHeaders:D,sessionCookie:L,protectPrivate:_},z);if("HEAD"===S.request.method||[204,205,304].includes(o))return X(),await N.stream.cancel().catch(()=>{}),new Response(null,{headers:s,status:o});const a=n(t,N.stream,r,X,W,z,S.timeline,"early"===v&&F),i=h(a,k?(e,t)=>k({context:S,html:e,isEnd:t}):void 0,S.diagnostics);return N.start(),new Response(i,{headers:s,status:o})}catch(e){throw X(e),N.stream.locked||await N.stream.cancel(e).catch(()=>{}),e}var Z},y=async(e,t,r,s)=>{const o=t.timeline??C(t.request,Boolean(t.diagnostics));o&&(t.timeline=o);try{const a=await x(e,t,r,s);return t.diagnostics?.inspectCachePolicy(a.headers,Boolean(
|
|
1
|
+
import e from"react";import{matchRoutes as t,createStaticRouter as r,StaticRouterProvider as s}from"react-router";import o from"../constants/stream-error.js";import{ServerProvider as a}from"../context/server.js";import n from"./compose-html.js";import i from"./data-stream.js";import c,{hasCookie as d}from"./document-headers.js";import l from"./head-response.js";import{mergeResponseHeaders as m}from"./headers.js";import h from"./transform-html.js";import u from"../helpers/build-custom-state.js";import p from"../helpers/obtain-stream-error.js";import{createTimeline as C}from"../services/request-timeline.js";const f="text/html",w="Content-Type",x=async({createApp:d,handler:C,renderToStream:x,policy:y,spaShell:R},S,{abortDelay:b=15e3,getState:q,hydration:v="footer",nonce:g,bootstrapScriptContent:E,onError:j,onResponse:k,onRouterReady:H,onShellError:P,onShellReady:T,prepare:A,routerRequestContext:B,documentHeaders:D,sessionCookie:L,protectPrivate:_},$)=>{const I=y?.select(S.request,S.diagnostics)??"ssr";if(y?.active&&!S.response.headers.has("Cache-Control")&&S.response.headers.set("Cache-Control","no-store"),"spa"===I)return S.isSpa=!0,S.isStream=!1,S.matches=t(C.dataRoutes,new URL(S.request.url),y?.basename)??[],S.html=R(S.html),await(A?.({context:S,executionContext:$})),D&&(S.response.headers=c(D,{sessionCookie:L,protectPrivate:_})(S)),S.response.status=200,S.response.headers.set(w,"text/html; charset=utf-8"),new Response("HEAD"===S.request.method?null:S.html.header+S.html.footer,{headers:S.response.headers,status:200});const U=await C.query(S.request,{requestContext:B??S});if(S.timeline?.record("router.query"),U instanceof Response)return l(S.request,m(U,S.response.headers));S.routerContext=U,S.matches=U.matches;const z=new i(U,S.diagnostics,g,S.timeline);try{await(A?.({context:S,executionContext:$})),S.timeline?.record("prepare")}catch(e){throw z.cancel(),e}const{isStream:F=!0}=await(H?.({context:S}))??{};S.isStream=F,S.serverContext={basename:S.routerContext.basename,isServer:!0,response:null};const G=r(C.dataRoutes,S.routerContext),J=e.createElement(a,{context:S.serverContext},d(e.createElement(s,{router:G,context:S.routerContext,hydrate:!1}),S)),K=new AbortController;let M,N,O=!1;const Q=()=>X(S.request.signal.reason),V=()=>clearTimeout(Y),W=()=>{V(),S.request.signal.removeEventListener("abort",Q)},X=e=>{O||(O=!0,M=e,S.timeline?.abort(e),W(),S.didError??=o.RenderCancel,z.abort(),K.abort(e),N?.abort(e))},Y=setTimeout(()=>{S.didError=o.RenderTimeout,S.timeline?.abort(new Error(`SSR render timed out after ${b}ms`)),X()},b);S.request.signal.aborted?X(S.request.signal.reason):S.request.signal.addEventListener("abort",Q,{once:!0});try{N=await x(J,{nonce:g,bootstrapScriptContent:"early"===v&&F?`(window.__ssrBoostStream = window.__ssrBoostStream || []).push(["shell"]);${E??""};document.currentScript?.remove();`:E,onError:e=>{const t=p(e);!O||t.code!==o.RenderAborted&&e!==K.signal.reason||(t.code=S.didError===o.RenderTimeout?o.RenderTimeout:o.RenderCancel);const{code:r}=t;S.didError??=r,j?.({context:S,error:t})},signal:K.signal}),O&&N.abort(M),Promise.all([N.allReady,z.done]).then(V,V),await N.shellReady,S.timeline?.record("shell.ready"),F||await Promise.all([N.allReady,z.done])}catch(e){return X(e),await(N?.stream.cancel(e).catch(()=>{})),((e,t,r)=>{const s=t instanceof Error?t:new Error(String(t)),o=r?.({context:e,error:s})||"<!doctype html><p>Internal Server Error</p>",a=new Headers(e.response.headers);return a.set(w,f),new Response("HEAD"===e.request.method?null:o,{headers:a,status:500})})(S,e,P)}try{const e=S.serverContext.response;if(e&&(Z=e,Boolean(Z&&Z.status>=300&&Z.status<400&&Z.headers.has("Location"))))return X(),await N.stream.cancel().catch(()=>{}),l(S.request,m(e,S.response.headers));const{header:t,footer:r,headers:s,status:o}=((e,{getState:t,onShellReady:r,hydration:s,nonce:o,documentHeaders:a,sessionCookie:n,protectPrivate:i},d)=>{const l=e.serverContext.response;e.response.status=l?.status??e.response.status??e.routerContext.statusCode??200,e.response.headers.has(w)||e.response.headers.set(w,f);const m=r?.({context:e})??{},h="early"===s&&e.isStream,p=u(t?.({context:e}),e.diagnostics,o,Boolean(h));let C=m.header||e.html.header;const x=m.footer||e.html.footer;e.diagnostics?.inspectShell({header:C,footer:x});let y=x;return h?C+=p+d.state(!0):y=p+d.state(!1)+d.take()+y,a&&(e.response.headers=c(a,{sessionCookie:n,protectPrivate:i})(e)),{header:C,footer:y,headers:new Headers(e.response.headers),status:e.response.status}})(S,{getState:q,onShellReady:T,hydration:v,nonce:g,documentHeaders:D,sessionCookie:L,protectPrivate:_},z);if("HEAD"===S.request.method||[204,205,304].includes(o))return X(),await N.stream.cancel().catch(()=>{}),new Response(null,{headers:s,status:o});const a=n(t,N.stream,r,X,W,z,S.timeline,"early"===v&&F),i=h(a,k?(e,t)=>k({context:S,html:e,isEnd:t}):void 0,S.diagnostics);return N.start(),new Response(i,{headers:s,status:o})}catch(e){throw X(e),N.stream.locked||await N.stream.cancel(e).catch(()=>{}),e}var Z},y=async(e,t,r,s)=>{const o=t.timeline??C(t.request,Boolean(t.diagnostics));o&&(t.timeline=o);try{const a=await x(e,t,r,s),{sessionCookie:n}=r;return t.diagnostics?.inspectCachePolicy(a.headers,Boolean(n&&d(t.request,n))),o?.response(a)??a}catch(e){throw o?.abort(e),o?.end(),e}};export{y as default};
|
|
2
2
|
//# sourceMappingURL=render.js.map
|
package/core/render.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render.js","sources":["../../src/core/render.tsx"],"sourcesContent":[null],"names":["HTML_CONTENT_TYPE","CONTENT_TYPE","renderResponse","async","createApp","handler","renderToStream","policy","spaShell","context","abortDelay","getState","hydration","nonce","bootstrapScriptContent","onError","onResponse","onRouterReady","onShellError","onShellReady","prepare","routerRequestContext","documentHeaders","rules","sessionCookie","protectPrivate","executionContext","mode","select","request","diagnostics","active","response","headers","has","set","isSpa","isStream","matches","matchRoutes","dataRoutes","URL","url","basename","html","status","Response","method","header","footer","queried","query","requestContext","timeline","record","headResponse","mergeResponseHeaders","routerContext","dataStream","DataStream","error","cancel","serverContext","isServer","router","createStaticRouter","node","React","createElement","ServerProvider","StaticRouterProvider","hydrate","renderController","AbortController","abortReason","output","hasAborted","onRequestAbort","abort","signal","reason","clearAbortTimer","clearTimeout","abortTimer","cleanup","removeEventListener","didError","StreamError","RenderCancel","setTimeout","RenderTimeout","Error","aborted","addEventListener","once","streamError","obtainStreamError","code","RenderAborted","Promise","all","allReady","done","then","shellReady","stream","catch","shellError","String","Headers","createShellErrorResponse","serverResponse","Boolean","statusCode","shell","isEarly","customState","buildCustomState","shellFooter","inspectShell","state","take","prepareHtmlResponse","includes","body","composeHtml","transformed","transformHtml","isEnd","undefined","start","locked","render","params","options","createTimeline","inspectCachePolicy","hasCookie","end"],"mappings":"
|
|
1
|
+
{"version":3,"file":"render.js","sources":["../../src/core/render.tsx"],"sourcesContent":[null],"names":["HTML_CONTENT_TYPE","CONTENT_TYPE","renderResponse","async","createApp","handler","renderToStream","policy","spaShell","context","abortDelay","getState","hydration","nonce","bootstrapScriptContent","onError","onResponse","onRouterReady","onShellError","onShellReady","prepare","routerRequestContext","documentHeaders","rules","sessionCookie","protectPrivate","executionContext","mode","select","request","diagnostics","active","response","headers","has","set","isSpa","isStream","matches","matchRoutes","dataRoutes","URL","url","basename","html","status","Response","method","header","footer","queried","query","requestContext","timeline","record","headResponse","mergeResponseHeaders","routerContext","dataStream","DataStream","error","cancel","serverContext","isServer","router","createStaticRouter","node","React","createElement","ServerProvider","StaticRouterProvider","hydrate","renderController","AbortController","abortReason","output","hasAborted","onRequestAbort","abort","signal","reason","clearAbortTimer","clearTimeout","abortTimer","cleanup","removeEventListener","didError","StreamError","RenderCancel","setTimeout","RenderTimeout","Error","aborted","addEventListener","once","streamError","obtainStreamError","code","RenderAborted","Promise","all","allReady","done","then","shellReady","stream","catch","shellError","String","Headers","createShellErrorResponse","serverResponse","Boolean","statusCode","shell","isEarly","customState","buildCustomState","shellFooter","inspectShell","state","take","prepareHtmlResponse","includes","body","composeHtml","transformed","transformHtml","isEnd","undefined","start","locked","render","params","options","createTimeline","inspectCachePolicy","hasCookie","end"],"mappings":"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"}
|
package/core/spa-html.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spa-html.js","sources":["../../src/core/spa-html.ts"],"sourcesContent":[null],"names":["createSpaHtml","html","rootId","isMarked","result","replace","tag","id","exec","test"],"mappings":"AAIA,MAAMA,EAAgB,CAACC,EAAcC,EAAS,UAC5C,IAAIC,GAAW,
|
|
1
|
+
{"version":3,"file":"spa-html.js","sources":["../../src/core/spa-html.ts"],"sourcesContent":[null],"names":["createSpaHtml","html","rootId","isMarked","result","replace","tag","id","exec","test"],"mappings":"AAIA,MAAMA,EAAgB,CAACC,EAAcC,EAAS,UAC5C,IAAIC,GAAW,EAKf,MAAMC,EAASH,EAAKI,QAAQ,iBAAmBC,IAC7C,MAAMC,EAAK,2BAA2BC,KAAKF,KAAO,GAElD,OAAIC,IAAOL,EACFI,GAGTH,GAAW,EAEJ,uBAAuBM,KAAKH,GAC/BA,EAAID,QAAQ,qCAAsC,sBAClDC,EAAID,QAAQ,2BAA4B,4BAM9C,OAAOF,EACHC,EACAA,EAAOC,QAAQ,iBAAmBC,GAChC,uBAAuBG,KAAKH,GACxBA,EAAID,QAAQ,qCAAsC,sBAClDC,EAAID,QAAQ,WAAY"}
|
package/core/spa-shell.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import e from"./spa-html.js";const r=()=>{let r,o;return
|
|
1
|
+
import e from"./spa-html.js";const r=()=>{let r,t;return o=>{const{header:a,footer:f}=o;return r?.header===a&&r?.footer===f||(r={...o},t={header:e(a),footer:f}),{...t}}};export{r as default};
|
|
2
2
|
//# sourceMappingURL=spa-shell.js.map
|
package/core/spa-shell.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spa-shell.js","sources":["../../src/core/spa-shell.ts"],"sourcesContent":[null],"names":["createSpaShell","source","shell","html","header","footer","createSpaHtml"],"mappings":"6BAOA,MAAMA,EAAiB,KACrB,IAAIC,EACAC,
|
|
1
|
+
{"version":3,"file":"spa-shell.js","sources":["../../src/core/spa-shell.ts"],"sourcesContent":[null],"names":["createSpaShell","source","shell","html","header","footer","createSpaHtml"],"mappings":"6BAOA,MAAMA,EAAiB,KACrB,IAAIC,EACAC,EAKJ,OAAQC,IACN,MAAMC,OAAEA,EAAMC,OAAEA,GAAWF,EAO3B,OALIF,GAAQG,SAAWA,GAAUH,GAAQI,SAAWA,IAClDJ,EAAS,IAAKE,GACdD,EAAQ,CAAEE,OAAQE,EAAcF,GAASC,WAGpC,IAAKH"}
|
package/core/ssr-policy.d.ts
CHANGED
|
@@ -2,9 +2,12 @@ import type { StaticHandler } from 'react-router';
|
|
|
2
2
|
import type Diagnostics from '../services/diagnostics.js';
|
|
3
3
|
type TRenderMode = 'ssr' | 'spa';
|
|
4
4
|
interface ISsrPolicy {
|
|
5
|
+
/** Select all routes by default. */
|
|
5
6
|
mode?: 'all' | 'include' | 'exclude';
|
|
6
7
|
routes?: (string | RegExp)[];
|
|
8
|
+
/** Render crawlers with SSR by default, regardless of route policy. */
|
|
7
9
|
bots?: 'ssr' | 'policy';
|
|
10
|
+
/** Return undefined to keep the matched policy decision. */
|
|
8
11
|
decide?: (params: {
|
|
9
12
|
request: Request;
|
|
10
13
|
url: URL;
|
|
@@ -27,25 +30,55 @@ declare const routePaths: (routes: StaticHandler["dataRoutes"], parent?: string)
|
|
|
27
30
|
* Snapshot environment policy when the application entry/handler is created at startup.
|
|
28
31
|
*/
|
|
29
32
|
declare class SsrPolicy {
|
|
33
|
+
/**
|
|
34
|
+
* Skip policy work when every request uses SSR.
|
|
35
|
+
*/
|
|
30
36
|
readonly active: boolean;
|
|
37
|
+
/**
|
|
38
|
+
* Keep policy paths aligned with the router's mount path.
|
|
39
|
+
*/
|
|
31
40
|
readonly basename: string;
|
|
41
|
+
/**
|
|
42
|
+
* Retain compiled inclusion and exclusion checks.
|
|
43
|
+
*/
|
|
32
44
|
protected readonly patterns: IPolicyPattern[];
|
|
45
|
+
/**
|
|
46
|
+
* Choose how unmatched requests are rendered.
|
|
47
|
+
*/
|
|
33
48
|
protected readonly mode: NonNullable<ISsrPolicy['mode']>;
|
|
49
|
+
/**
|
|
50
|
+
* Control whether crawlers bypass route policy.
|
|
51
|
+
*/
|
|
34
52
|
protected readonly bots: NonNullable<ISsrPolicy['bots']>;
|
|
53
|
+
/**
|
|
54
|
+
* Allow application decisions after route matching.
|
|
55
|
+
*/
|
|
35
56
|
protected readonly decide?: ISsrPolicy['decide'];
|
|
57
|
+
/**
|
|
58
|
+
* Identify the effective configuration in diagnostics.
|
|
59
|
+
*/
|
|
36
60
|
protected readonly source: string;
|
|
61
|
+
/**
|
|
62
|
+
* Retain declared paths for policy diagnostics.
|
|
63
|
+
*/
|
|
37
64
|
protected readonly paths: ReturnType<typeof routePaths>;
|
|
65
|
+
/**
|
|
66
|
+
* Inspect configured patterns only once per policy.
|
|
67
|
+
*/
|
|
38
68
|
protected hasInspected: boolean;
|
|
39
|
-
constructor({ mode, routes, bots, decide }?: ISsrPolicy, dataRoutes?: StaticHandler['dataRoutes'], basename?: string, env?: string | undefined);
|
|
40
69
|
/**
|
|
41
|
-
*
|
|
42
|
-
* A global 404 catch-all must not hide a misspelled policy.
|
|
70
|
+
* Compile the startup policy with environment overrides taking precedence.
|
|
43
71
|
*/
|
|
44
|
-
|
|
72
|
+
constructor({ mode, routes, bots, decide }?: ISsrPolicy, dataRoutes?: StaticHandler['dataRoutes'], basename?: string, env?: string | undefined);
|
|
45
73
|
/**
|
|
46
74
|
* Crawler protection wins over both runtime decisions and environment rollback rules.
|
|
47
75
|
*/
|
|
48
76
|
select(request: Request, diagnostics?: Diagnostics): TRenderMode;
|
|
77
|
+
/**
|
|
78
|
+
* Explain typos using declared paths, including concrete URLs for dynamic route ids.
|
|
79
|
+
* A global 404 catch-all must not hide a misspelled policy.
|
|
80
|
+
*/
|
|
81
|
+
protected inspect(diagnostics?: Diagnostics): void;
|
|
49
82
|
}
|
|
50
83
|
export type { ISsrPolicy, TRenderMode };
|
|
51
84
|
export default SsrPolicy;
|
package/core/ssr-policy.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{isbot as t}from"isbot";import{pathToRegexp as e}from"path-to-regexp";import{matchPath as s}from"react-router";const i=(t,s)=>{if(""===t)throw new Error("SSR route patterns cannot be empty.");const i="string"==typeof t?e(t).regexp:new RegExp(t.source,t.flags);return{pattern:t,exclude:s,test:t=>(i.lastIndex=0,i.test(t))}},r=(t,e="")=>t.flatMap(t=>{const
|
|
1
|
+
import{isbot as t}from"isbot";import{pathToRegexp as e}from"path-to-regexp";import{matchPath as s}from"react-router";const i=(t,s)=>{if(""===t)throw new Error("SSR route patterns cannot be empty.");const i="string"==typeof t?e(t).regexp:new RegExp(t.source,t.flags);return{pattern:t,exclude:s,test:t=>(i.lastIndex=0,i.test(t))}},r=(t,e="")=>t.flatMap(({id:t,path:s,children:i})=>{const a=(s?.startsWith("/")?s:`${e}/${s??""}`).replace(/\/+/g,"/").replace(/\/$/,"")||"/";return[{id:t,path:a},...r(i??[],a)]});class a{active;basename;patterns;mode;bots;decide;source;paths;hasInspected=!1;constructor({mode:t="all",routes:e=[],bots:s="ssr",decide:a}={},o=[],n="/",c=("undefined"==typeof process?void 0:process.env.SSR_BOOST_SSR_ROUTES)){if(this.basename=n,this.bots=s,this.paths=r(o).map(t=>({...t,path:`${n.replace(/\/$/,"")}${t.path}`})),void 0!==c){const t=c.split(",").map(t=>t.trim()).filter(Boolean);this.mode=t.length?t.some(t=>!t.startsWith("!"))?"include":"exclude":"all",this.patterns=t.map(t=>{const e=t.startsWith("!");return i(e?t.slice(1):t,e)}),this.source="SSR_BOOST_SSR_ROUTES"}else this.mode=t,this.patterns="all"===t?[]:e.map(e=>i(e,"exclude"===t)),this.decide=a,this.source="config";this.active="all"!==this.mode||Boolean(this.decide)}select(e,i){if(!this.active)return"ssr";this.inspect(i);const{url:r,headers:a}=e,o=new URL(r),n=t(a.get("user-agent")),c=this.patterns.filter(({test:t})=>t(o.pathname)),p=c.find(({exclude:t})=>t);let h=p||"include"===this.mode&&!c.length?"spa":"ssr",d=`${this.source} ${this.mode}`;if(n&&"ssr"===this.bots)h="ssr",d="bots: ssr";else{const t=this.decide?.({request:e,url:o,isBot:n});void 0!==t&&(h=t,d="config decide")}const l=p?.pattern??c[0]?.pattern??[...this.paths].reverse().find(({path:t})=>s(t,o.pathname))?.path??"(unmatched URL)";return i?.policyDecision(String(l),h,d),h}inspect(t){if(t&&!this.hasInspected){this.hasInspected=!0;for(const{pattern:e,test:i}of this.patterns){this.paths.some(({path:t})=>"/*"!==t&&(i(t)||"string"==typeof e&&Boolean(s(t,e))))||t.policyUnmatched(String(e))}}}}export{a as default};
|
|
2
2
|
//# sourceMappingURL=ssr-policy.js.map
|
package/core/ssr-policy.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ssr-policy.js","sources":["../../src/core/ssr-policy.ts"],"sourcesContent":[null],"names":["compilePattern","pattern","exclude","Error","regexp","pathToRegexp","RegExp","source","flags","test","pathname","lastIndex","routePaths","routes","parent","flatMap","
|
|
1
|
+
{"version":3,"file":"ssr-policy.js","sources":["../../src/core/ssr-policy.ts"],"sourcesContent":[null],"names":["compilePattern","pattern","exclude","Error","regexp","pathToRegexp","RegExp","source","flags","test","pathname","lastIndex","routePaths","routes","parent","flatMap","id","path","routePath","children","startsWith","replace","SsrPolicy","active","basename","patterns","mode","bots","decide","paths","hasInspected","constructor","dataRoutes","env","process","undefined","SSR_BOOST_SSR_ROUTES","this","map","route","values","split","value","trim","filter","Boolean","length","some","isExcluded","slice","select","request","diagnostics","inspect","url","requestUrl","headers","URL","isBot","isbot","get","matched","excluded","find","decision","reverse","matchPath","policyDecision","String","policyUnmatched"],"mappings":"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"}
|