@lomray/vite-ssr-boost 8.4.0-beta.3 → 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 +59 -0
- package/cloudflare.js +2 -0
- package/cloudflare.js.map +1 -0
- 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.d.ts +1 -0
- 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/core/types.d.ts +5 -1
- package/http.d.ts +12 -0
- package/node/production.d.ts +10 -4
- package/node/production.js +1 -1
- package/node/production.js.map +1 -1
- package/package.json +10 -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.d.ts +7 -0
- package/services/route-asset-preparer.js +2 -0
- package/services/route-asset-preparer.js.map +1 -0
- package/services/route-assets-memory.d.ts +75 -0
- package/services/route-assets-memory.js +2 -0
- package/services/route-assets-memory.js.map +1 -0
- package/services/route-assets.d.ts +9 -55
- package/services/route-assets.js +1 -1
- package/services/route-assets.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
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
interface IBrowserTimelineEvent {
|
|
2
2
|
stage: 'shell' | 'router.ready' | 'init' | 'resolve' | 'reject' | 'response.end';
|
|
3
|
+
/** Monotonic milliseconds since the browser's time origin. */
|
|
3
4
|
at: number;
|
|
4
5
|
id?: number;
|
|
5
6
|
}
|
|
@@ -7,16 +8,11 @@ interface IBrowserObservation {
|
|
|
7
8
|
events: IBrowserTimelineEvent[];
|
|
8
9
|
errors: string[];
|
|
9
10
|
roots: Record<string, string>;
|
|
11
|
+
/** First visible observation of each element, in monotonic milliseconds. */
|
|
10
12
|
seen: WeakMap<Element, number>;
|
|
13
|
+
/** First visible shell observation, in monotonic milliseconds. */
|
|
11
14
|
shellAt?: number;
|
|
12
15
|
}
|
|
13
|
-
declare global {
|
|
14
|
-
interface Window {
|
|
15
|
-
__ssrBoostTest?: IBrowserObservation;
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
/** Serialized by addInitScript: keep every runtime dependency inside this function. */
|
|
19
|
-
declare const installBrowserObserver: () => void;
|
|
20
16
|
interface IHydrationInspection {
|
|
21
17
|
ready: boolean;
|
|
22
18
|
consumed: boolean;
|
|
@@ -24,6 +20,16 @@ interface IHydrationInspection {
|
|
|
24
20
|
duplicates: string[];
|
|
25
21
|
errors: string[];
|
|
26
22
|
}
|
|
23
|
+
declare global {
|
|
24
|
+
/**
|
|
25
|
+
* Browser global augmentation keeps the platform interface name.
|
|
26
|
+
*/
|
|
27
|
+
interface Window {
|
|
28
|
+
__ssrBoostTest?: IBrowserObservation;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
/** Serialized by addInitScript: keep every runtime dependency inside this function. */
|
|
32
|
+
declare const installBrowserObserver: () => void;
|
|
27
33
|
/** Compare server text multiplicities to the hydrated root, allowing existing repeats. */
|
|
28
34
|
declare const inspectHydration: (selector: string) => IHydrationInspection;
|
|
29
35
|
export { installBrowserObserver, inspectHydration };
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const e=()=>{if(window.__ssrBoostTest)return;const e={events:[],errors:[],roots:{},seen:new WeakMap};window.__ssrBoostTest=e;const
|
|
1
|
+
const e=()=>{if(window.__ssrBoostTest)return;const e={events:[],errors:[],roots:{},seen:new WeakMap},{events:t,errors:o,roots:r,seen:n}=e;window.__ssrBoostTest=e;const s=(e,o)=>{t.push({stage:e,at:performance.now(),...void 0===o?{}:{id:o}})},d=()=>{const t=performance.now();for(const o of document.querySelectorAll("body *")){const{width:r,height:d}=o.getBoundingClientRect();!o.closest("script, style, template, [hidden]")&&r>0&&d>0&&"hidden"!==getComputedStyle(o).visibility&&(void 0===e.shellAt&&(e.shellAt=t,s("shell")),n.has(o)||n.set(o,t))}};new MutationObserver(d).observe(document,{childList:!0,subtree:!0,attributes:!0});const i=console.error;console.error=(...e)=>{o.push(e.map(String).join(" ")),i(...e)},window.addEventListener("error",e=>o.push(e.message)),window.addEventListener("unhandledrejection",e=>o.push(String(e.reason))),window.addEventListener("ssr-boost:router-ready",e=>{const{rootId:t}=e.detail,o=document.getElementById(t);o&&(r[t]=o.innerHTML),d(),s("router.ready")}),window.addEventListener("load",()=>s("response.end"),{once:!0});const c=[];let l=Array.prototype.push;const a=new WeakSet;Object.defineProperty(c,"push",{configurable:!0,get:()=>(...e)=>{for(const t of e){if(a.has(t))continue;a.add(t);const[e,o]=t;"init"!==e&&"resolve"!==e&&"reject"!==e||s(e,"number"==typeof o?o:void 0)}return l.apply(c,e)},set:e=>{l=e}}),Reflect.set(window,"__ssrBoostStream",c)},t=e=>{const t=window.__ssrBoostTest,o=document.querySelector(e),r=o?t?.roots[o.id]:void 0,n=document.createElement("div");n.innerHTML=r??"";const s=e=>{const t=new Map;for(const o of[e,...e.querySelectorAll("*")]){if(o.closest("script, style, template, [hidden]"))continue;const e=[...o.childNodes].filter(e=>e.nodeType===Node.TEXT_NODE).map(e=>e.textContent).join("").replace(/\s+/g," ").trim();e&&t.set(e,(t.get(e)??0)+1)}return t},d=s(n),i=o?s(o):new Map,c=(e,t)=>{let o=0;for(const[r,n]of e){const e=r.length/t.length;Number.isInteger(e)&&t.repeat(e)===r&&(o+=e*n)}return o},l=[...d].filter(([e])=>c(i,e)>c(d,e)).map(([e])=>e),a=o?document.createTreeWalker(o,NodeFilter.SHOW_COMMENT):void 0;let u=0;for(;a?.nextNode();)"$?"===a.currentNode.textContent&&u++;return{ready:void 0!==r,consumed:void 0===Reflect.get(window,"__staticRouterHydrationData"),pending:u,duplicates:l,errors:t?.errors.filter(e=>/(?:#|errors\/)(418|423|425)\b|hydrat(?:ion|ing|e|ed)|server rendered HTML|did not match/i.test(e))??[]}};export{t as inspectHydration,e as installBrowserObserver};
|
|
2
2
|
//# sourceMappingURL=browser-observer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser-observer.js","sources":["../../src/testing/browser-observer.ts"],"sourcesContent":[null],"names":["installBrowserObserver","window","__ssrBoostTest","state","events","errors","roots","seen","WeakMap","record","stage","id","push","at","performance","now","undefined","scan","element","document","querySelectorAll","
|
|
1
|
+
{"version":3,"file":"browser-observer.js","sources":["../../src/testing/browser-observer.ts"],"sourcesContent":[null],"names":["installBrowserObserver","window","__ssrBoostTest","state","events","errors","roots","seen","WeakMap","record","stage","id","push","at","performance","now","undefined","scan","element","document","querySelectorAll","width","height","getBoundingClientRect","closest","getComputedStyle","visibility","shellAt","has","set","MutationObserver","observe","childList","subtree","attributes","originalError","console","error","args","map","String","join","addEventListener","event","message","reason","rootId","detail","root","getElementById","innerHTML","once","queue","downstream","Array","prototype","observed","WeakSet","Object","defineProperty","configurable","get","frames","frame","add","apply","replacement","Reflect","inspectHydration","selector","querySelector","html","server","createElement","texts","counts","Map","child","text","childNodes","filter","node","nodeType","Node","TEXT_NODE","textContent","replace","trim","before","after","multiplicity","total","candidate","count","copies","length","Number","isInteger","repeat","duplicates","walker","createTreeWalker","NodeFilter","SHOW_COMMENT","pending","nextNode","currentNode","ready","consumed","test"],"mappings":"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"}
|
|
@@ -20,6 +20,7 @@ interface ITestHandlerOptions<TAppProps> extends Omit<ICreateHandlerOptions<TApp
|
|
|
20
20
|
routerOptions?: Parameters<typeof createStaticHandler>[1];
|
|
21
21
|
renderToStream?: TRenderToStream;
|
|
22
22
|
signal?: AbortSignal;
|
|
23
|
+
/** Default whole-request deadline in milliseconds; omitted means no deadline. */
|
|
23
24
|
timeout?: number;
|
|
24
25
|
}
|
|
25
26
|
interface ITestHandler {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-handler.js","sources":["../../src/testing/create-handler.tsx"],"sourcesContent":[null],"names":["DEFAULT_SHELL","header","footer","testHandlerFactory","renderer","loadShell","routes","App","shell","routerOptions","renderToStream","signal","defaultSignal","timeout","defaultTimeout","onContext","onRouterReady","options","handler","createStaticHandler","fileShell","getHtml","async","fetch","input","isStream","init","started","performance","now","controller","AbortController","signals","Request","undefined","filter","item","Boolean","combined","AbortSignal","any","request","URL","TEST_ORIGIN","timer","timeline","rejectAbort","aborted","Promise","_","reject","onAbort","reason","cleanup","clearTimeout","removeEventListener","addEventListener","once","Number","isFinite","RangeError","setTimeout","abort","DOMException","throwIfAborted","pending","createHandler","createApp","children","context","React","createElement","server","appProps","params","result","then","response","body","cancel","catch","race","TestResponse","onComplete","error","end"],"mappings":"
|
|
1
|
+
{"version":3,"file":"create-handler.js","sources":["../../src/testing/create-handler.tsx"],"sourcesContent":[null],"names":["DEFAULT_SHELL","header","footer","testHandlerFactory","renderer","loadShell","routes","App","shell","routerOptions","renderToStream","signal","defaultSignal","timeout","defaultTimeout","onContext","onRouterReady","options","handler","createStaticHandler","fileShell","getHtml","async","fetch","input","isStream","init","started","performance","now","controller","AbortController","signals","Request","undefined","filter","item","Boolean","combined","AbortSignal","any","request","URL","TEST_ORIGIN","timer","timeline","rejectAbort","aborted","Promise","_","reject","onAbort","reason","cleanup","clearTimeout","removeEventListener","addEventListener","once","Number","isFinite","RangeError","setTimeout","abort","DOMException","throwIfAborted","pending","createHandler","createApp","children","context","React","createElement","server","appProps","params","result","then","response","body","cancel","catch","race","TestResponse","onComplete","error","end"],"mappings":"mLAyCA,MAAMA,EAA4B,CAChCC,OAAQ,0DACRC,OAAQ,gFAIJC,EACJ,CAACC,EAA2BC,IAC5B,EACEC,SACAC,MACAC,QAAQR,EACRS,gBACAC,iBAAiBN,EACjBO,OAAQC,EACRC,QAASC,EACTC,YACAC,mBACGC,MAEH,MAAMC,EAAUC,EAAoBb,EAAyBG,GAC7D,IAAIW,EAKJ,MAAMC,EAAUC,SACV,cAAed,GACjBY,IAAcf,EAAUG,UAEVY,MAGT,IAAKZ,GAGd,MAAO,CAILe,MAAOD,MAAOE,GAASC,WAAUZ,UAAUC,EAAgBH,YAAWe,GAAS,MAC7E,MAAMC,EAAUC,YAAYC,MACtBC,EAAa,IAAIC,gBACjBC,EAAU,CACdF,EAAWnB,OACXC,EACAD,EACAa,aAAiBS,QAAUT,EAAMb,YAASuB,GAC1CC,OAAQC,GAA8BC,QAAQD,IAC1CE,EAAWC,YAAYC,IAAIR,GAC3BS,EAAU,IAAIR,QACD,iBAAVT,EAAqB,IAAIkB,IAAIlB,EAAOmB,GAAenB,EAC1D,IACKE,EACHf,OAAQ2B,IAGZ,IAAIM,EACAC,EACAC,EAKJ,MAAMC,EAAU,IAAIC,QAAe,CAACC,EAAGC,KACrCJ,EAAcI,IAMVC,EAAU,IAAYL,EAAYR,EAASc,QAK3CC,EAAU,KACdC,aAAaV,GACbN,EAASiB,oBAAoB,QAASJ,IAKxC,GAFAb,EAASkB,iBAAiB,QAASL,EAAS,CAAEM,MAAM,SAEpCvB,IAAZrB,EAAuB,CACzB,IAAK6C,OAAOC,SAAS9C,IAAYA,EAAU,EAEzC,MADAwC,IACM,IAAIO,WAAW,kEAMvBhB,EAAQiB,WACN,IACE/B,EAAWgC,MACT,IAAIC,aAAa,4BAA4BlD,MAAa,iBAE9DA,EAEJ,CAEA,IACEyB,EAAS0B,iBACT,MAiCMC,EAjCQC,EACZ,CACEhD,UACAR,iBAKAyD,UAAW,CAACC,EAAUC,IACpB9D,EAAM+D,EAAAC,cAAChE,EAAG,CAACiE,OAAQH,EAAQI,UAAWL,GAAkBA,GAE5D,IACKnD,EACHI,UAKAN,UAAY2D,MACP7B,YAAa6B,EAAOL,SACvBtD,IAAY2D,IAMd1D,cAAeM,MAAOoD,IACpB,MAAMC,QAAe3D,IAAgB0D,IAErC,YAAoBxC,IAAbT,EAA0BkD,GAAU,CAAA,EAAM,IAAKA,EAAQlD,cAIpDF,CAAMkB,GAKjBwB,EACFW,KAAMC,IACL,GAAIvC,EAASS,QACX,OAAO8B,EAASC,MAAMC,OAAOzC,EAASc,UAKzC4B,MAAM,QAET,MAAMH,QAAiB7B,QAAQiC,KAAK,CAAChB,EAASlB,IAE9C,OAAO,IAAImC,EAAaL,EAAU,CAChClD,UACAkB,WACAlC,OAAQ2B,EACR6C,WAAY9B,GAEhB,CAAE,MAAO+B,GAIP,MAHA/B,IACAR,GAAUiB,MAAMsB,GAChBvC,GAAUwC,MACJD,CACR"}
|
package/testing/deferred.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deferred.js","sources":["../../src/testing/deferred.ts"],"sourcesContent":[null],"names":["createDeferred","resolve","reject","promise","Promise","
|
|
1
|
+
{"version":3,"file":"deferred.js","sources":["../../src/testing/deferred.ts"],"sourcesContent":[null],"names":["createDeferred","resolve","reject","promise","Promise","resolvePromise","rejectPromise","catch"],"mappings":"AAOA,MAAMA,EAAiB,KACrB,IAAIC,EACAC,EAKJ,MAAMC,EAAU,IAAIC,QAAW,CAACC,EAAgBC,KAC9CL,EAAUI,EACVH,EAASI,IAMX,OAFKH,EAAQI,MAAM,QAEZ,CAAEJ,UAASF,UAASC"}
|
package/testing/edge.d.ts
CHANGED
|
@@ -1,7 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Create edge route test handlers that require an in-memory shell.
|
|
3
|
+
*/
|
|
1
4
|
declare const createTestHandler: <TAppProps = Record<string, any>>({ routes, App, shell, routerOptions, renderToStream, signal: defaultSignal, timeout: defaultTimeout, onContext, onRouterReady, ...options }: import("./create-handler.js").ITestHandlerOptions<TAppProps>) => import("./create-handler.js").ITestHandler;
|
|
2
5
|
export { createTestHandler };
|
|
6
|
+
/**
|
|
7
|
+
* Expose manual control over deferred loader settlement.
|
|
8
|
+
*/
|
|
3
9
|
export { default as createDeferred } from './deferred.js';
|
|
10
|
+
/**
|
|
11
|
+
* Supply browser and crawler request identities for route tests.
|
|
12
|
+
*/
|
|
4
13
|
export { browserRequest, crawlerRequest } from './requests.js';
|
|
14
|
+
/**
|
|
15
|
+
* Expose repeatable response assertions for route tests.
|
|
16
|
+
*/
|
|
5
17
|
export { default as TestResponse } from './response.js';
|
|
6
18
|
export type { ITestHandler, ITestHandlerOptions, ITestRequestInit } from './create-handler.js';
|
|
7
19
|
export type { ITestChunk, ITestCookie, ITestResponseOptions } from './response.js';
|
package/testing/edge.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"edge.js","sources":["../../src/testing/edge.ts"],"sourcesContent":[null],"names":["createTestHandler","testHandlerFactory","renderToStream","Error"],"mappings":"+
|
|
1
|
+
{"version":3,"file":"edge.js","sources":["../../src/testing/edge.ts"],"sourcesContent":[null],"names":["createTestHandler","testHandlerFactory","renderToStream","Error"],"mappings":"+OAMA,MAAMA,EAAoBC,EAAmBC,EAAgB,KAC3D,MAAM,IAAIC,MAAM"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parse-response.js","sources":["../../src/testing/parse-response.ts"],"sourcesContent":[null],"names":["scripts","html","result","visit","node","tagName","push","childNodes","map","child","value","join","forEach","parse","streamFrames","frames","source","pattern","match","matchAll","frame","JSON","Array","isArray","length","includes","Number","isInteger","Error","Placeholder","id","constructor","this","payload","decode","SSRBPromise","SSRBObject","entries","Object","fromEntries","SSRBError","properties","error","assign","stack","SSRBUndefined","routerState","initial","filter","legacy","settlements","Map","rejected","Set","has","set","add","visited","WeakSet","resolving","resolved","resolve","item","get","delete","clear","key","keys","defineProperty","configurable","enumerable","writable","Reflect"],"mappings":"+
|
|
1
|
+
{"version":3,"file":"parse-response.js","sources":["../../src/testing/parse-response.ts"],"sourcesContent":[null],"names":["scripts","html","result","visit","node","tagName","push","childNodes","map","child","value","join","forEach","parse","streamFrames","frames","source","pattern","match","matchAll","frame","JSON","Array","isArray","length","includes","Number","isInteger","Error","Placeholder","id","constructor","this","payload","decode","SSRBPromise","SSRBObject","entries","Object","fromEntries","SSRBError","properties","error","assign","stack","SSRBUndefined","routerState","initial","filter","legacy","settlements","Map","rejected","Set","has","set","add","visited","WeakSet","resolving","resolved","resolve","item","get","delete","clear","key","keys","defineProperty","configurable","enumerable","writable","Reflect"],"mappings":"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"}
|
package/testing/playwright.d.ts
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import type { Page } from '@playwright/test';
|
|
2
2
|
import type { IBrowserTimelineEvent } from './browser-observer.js';
|
|
3
3
|
interface IHydratedOptions {
|
|
4
|
+
/** Hydration root selector; defaults to #root. */
|
|
4
5
|
root?: string;
|
|
6
|
+
/** Assertion deadline in milliseconds; defaults to 5,000. */
|
|
5
7
|
timeout?: number;
|
|
6
8
|
}
|
|
7
9
|
interface IStreamTimelineCollector {
|
package/testing/playwright.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{installBrowserObserver as e,inspectHydration as t}from"./browser-observer.js";const a=new WeakSet,o=async t=>(a.has(t)||(await t.addInitScript(e),a.add(t)),{read:()=>t.evaluate(()=>window.__ssrBoostTest?.events??[])}),s=async(e,{root:o="#root",timeout:s=5e3}={})=>{const{expect:r}=await(import("@playwright/test"));r(a.has(e),"Call collectStreamTimeline(page) before page.goto().").toBe(!0),await r.poll(async()=>(await e.evaluate(t,o)).ready,{timeout:s,message:`SSR router was not created for ${o}. Use the SSR Boost browser entry.`}).toBe(!0),await e.waitForLoadState("load",{timeout:s}),await r.poll(async()=>(await e.evaluate(t,o)).pending,{timeout:s,message:"Streamed Suspense boundaries did not settle."}).toBe(0),await e.evaluate(()=>new Promise(e=>{requestAnimationFrame(()=>requestAnimationFrame(()=>e()))}));const
|
|
1
|
+
import{installBrowserObserver as e,inspectHydration as t}from"./browser-observer.js";const a=new WeakSet,o=async t=>(a.has(t)||(await t.addInitScript(e),a.add(t)),{read:()=>t.evaluate(()=>window.__ssrBoostTest?.events??[])}),s=async(e,{root:o="#root",timeout:s=5e3}={})=>{const{expect:r}=await(import("@playwright/test"));r(a.has(e),"Call collectStreamTimeline(page) before page.goto().").toBe(!0),await r.poll(async()=>(await e.evaluate(t,o)).ready,{timeout:s,message:`SSR router was not created for ${o}. Use the SSR Boost browser entry.`}).toBe(!0),await e.waitForLoadState("load",{timeout:s}),await r.poll(async()=>(await e.evaluate(t,o)).pending,{timeout:s,message:"Streamed Suspense boundaries did not settle."}).toBe(0),await e.evaluate(()=>new Promise(e=>{requestAnimationFrame(()=>requestAnimationFrame(()=>e()))}));const{consumed:i,errors:n,duplicates:l}=await e.evaluate(t,o);r(i,"Router hydration state was not consumed.").toBe(!0),r(n,"React reported hydration errors.").toEqual([]),r(l,"Server text was duplicated during hydration.").toEqual([])},r=async(e,t)=>{const{expect:o}=await(import("@playwright/test"));o(a.has(e),"Call collectStreamTimeline(page) before page.goto().").toBe(!0);const s=e.locator(t);await o(s).toBeVisible();const{shell:r,element:i}=await s.evaluate(e=>({shell:window.__ssrBoostTest?.shellAt,element:window.__ssrBoostTest?.seen.get(e)}));o(r,"No server shell was observed.").toBeDefined(),o(i,"The element was not observed during this navigation.").toBeDefined(),o(i,"The element must appear after the shell.").toBeGreaterThan(r)};export{o as collectStreamTimeline,s as expectHydrated,r as expectStreamed};
|
|
2
2
|
//# sourceMappingURL=playwright.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"playwright.js","sources":["../../src/testing/playwright.ts"],"sourcesContent":[null],"names":["installed","WeakSet","collectStreamTimeline","async","page","has","addInitScript","installBrowserObserver","add","read","evaluate","window","__ssrBoostTest","events","expectHydrated","root","timeout","expect","toBe","poll","inspectHydration","ready","message","waitForLoadState","pending","Promise","resolve","requestAnimationFrame","
|
|
1
|
+
{"version":3,"file":"playwright.js","sources":["../../src/testing/playwright.ts"],"sourcesContent":[null],"names":["installed","WeakSet","collectStreamTimeline","async","page","has","addInitScript","installBrowserObserver","add","read","evaluate","window","__ssrBoostTest","events","expectHydrated","root","timeout","expect","toBe","poll","inspectHydration","ready","message","waitForLoadState","pending","Promise","resolve","requestAnimationFrame","consumed","isConsumed","errors","duplicates","toEqual","expectStreamed","selector","element","locator","toBeVisible","shell","elementAt","node","shellAt","seen","get","toBeDefined","toBeGreaterThan"],"mappings":"qFAmBA,MAAMA,EAAY,IAAIC,QAGhBC,EAAwBC,MAAOC,IAC9BJ,EAAUK,IAAID,WACXA,EAAKE,cAAcC,GACzBP,EAAUQ,IAAIJ,IAGT,CAILK,KAAM,IAAML,EAAKM,SAAS,IAAMC,OAAOC,gBAAgBC,QAAU,MAK/DC,EAAiBX,MACrBC,GACEW,OAAO,QAASC,UAAU,KAA4B,MAExD,MAAMC,OAAEA,gBAAwB,qBAEhCA,EAAOjB,EAAUK,IAAID,GAAO,wDAAwDc,MAAK,SAKnFD,EACHE,KAAKhB,gBAAmBC,EAAKM,SAASU,EAAkBL,IAAOM,MAAO,CACrEL,UACAM,QAAS,kCAAkCP,wCAE5CG,MAAK,SACFd,EAAKmB,iBAAiB,OAAQ,CAAEP,kBAKhCC,EACHE,KAAKhB,gBAAmBC,EAAKM,SAASU,EAAkBL,IAAOS,QAAS,CACvER,UACAM,QAAS,iDAEVJ,KAAK,SAKFd,EAAKM,SACT,IACE,IAAIe,QAAeC,IACjBC,sBAAsB,IAAMA,sBAAsB,IAAMD,SAG9D,MAAQE,SAAUC,EAAUC,OAAEA,EAAMC,WAAEA,SAAqB3B,EAAKM,SAASU,EAAkBL,GAE3FE,EAAOY,EAAY,4CAA4CX,MAAK,GACpED,EAAOa,EAAQ,oCAAoCE,QAAQ,IAC3Df,EAAOc,EAAY,gDAAgDC,QAAQ,KAIvEC,EAAiB9B,MAAOC,EAAY8B,KACxC,MAAMjB,OAAEA,gBAAwB,qBAEhCA,EAAOjB,EAAUK,IAAID,GAAO,wDAAwDc,MAAK,GACzF,MAAMiB,EAAU/B,EAAKgC,QAAQF,SAEvBjB,EAAOkB,GAASE,cAKtB,MAAMC,MAAEA,EAAOH,QAASI,SAAoBJ,EAAQzB,SAAU8B,IAAI,CAChEF,MAAO3B,OAAOC,gBAAgB6B,QAC9BN,QAASxB,OAAOC,gBAAgB8B,KAAKC,IAAIH,MAG3CvB,EAAOqB,EAAO,iCAAiCM,cAC/C3B,EAAOsB,EAAW,wDAAwDK,cAC1E3B,EAAOsB,EAAY,4CAA4CM,gBAAgBP"}
|
package/testing/requests.d.ts
CHANGED
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Give relative test URLs a stable origin without starting a server.
|
|
3
|
+
*/
|
|
1
4
|
declare const TEST_ORIGIN = "http://localhost";
|
|
2
5
|
/** Give relative test paths the same stable origin as createTestHandler.fetch. */
|
|
3
6
|
declare const browserRequest: (path: string) => Request;
|
package/testing/requests.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"requests.js","sources":["../../src/testing/requests.ts"],"sourcesContent":[null],"names":["TEST_ORIGIN","browserRequest","path","Request","URL","headers","crawlerRequest"],"mappings":"
|
|
1
|
+
{"version":3,"file":"requests.js","sources":["../../src/testing/requests.ts"],"sourcesContent":[null],"names":["TEST_ORIGIN","browserRequest","path","Request","URL","headers","crawlerRequest"],"mappings":"AAGA,MAAMA,EAAc,mBAGdC,EAAkBC,GACtB,IAAIC,QAAQ,IAAIC,IAAIF,EAAMF,GAAc,CACtCK,QAAS,CAAE,aAAc,wCAIvBC,EAAkBJ,GACtB,IAAIC,QAAQ,IAAIC,IAAIF,EAAMF,GAAc,CACtCK,QAAS,CACP,aAAc"}
|
package/testing/response.d.ts
CHANGED
|
@@ -3,6 +3,7 @@ import type RequestTimeline from '../services/request-timeline.js';
|
|
|
3
3
|
import type { IRouterState, TStreamFrame } from './parse-response.js';
|
|
4
4
|
interface ITestChunk {
|
|
5
5
|
text: string;
|
|
6
|
+
/** Milliseconds since request start when the decoded text became available. */
|
|
6
7
|
at: number;
|
|
7
8
|
}
|
|
8
9
|
interface ITestCookie {
|
|
@@ -12,6 +13,7 @@ interface ITestCookie {
|
|
|
12
13
|
attributes: Record<string, string | true>;
|
|
13
14
|
}
|
|
14
15
|
interface ITestResponseOptions {
|
|
16
|
+
/** Monotonic request start in milliseconds; defaults to construction time. */
|
|
15
17
|
started?: number;
|
|
16
18
|
timeline?: RequestTimeline;
|
|
17
19
|
signal?: AbortSignal;
|
|
@@ -19,28 +21,72 @@ interface ITestResponseOptions {
|
|
|
19
21
|
}
|
|
20
22
|
/** A single eager stream reader with repeatable, order-independent assertions. */
|
|
21
23
|
declare class TestResponse {
|
|
24
|
+
/**
|
|
25
|
+
* Expose the original response and its metadata.
|
|
26
|
+
*/
|
|
22
27
|
readonly response: Response;
|
|
28
|
+
/**
|
|
29
|
+
* Retain request timing, cancellation and completion hooks.
|
|
30
|
+
*/
|
|
23
31
|
protected readonly options: ITestResponseOptions;
|
|
32
|
+
/**
|
|
33
|
+
* Retain decoded chunks and their arrival offsets for repeatable assertions.
|
|
34
|
+
*/
|
|
24
35
|
protected readonly parts: ITestChunk[];
|
|
36
|
+
/**
|
|
37
|
+
* Share one body-consumption result across all asynchronous assertions.
|
|
38
|
+
*/
|
|
25
39
|
protected readonly completed: Promise<void>;
|
|
40
|
+
/**
|
|
41
|
+
* Anchor chunk timing to the start of the request.
|
|
42
|
+
*/
|
|
26
43
|
protected readonly started: number;
|
|
27
|
-
|
|
44
|
+
/**
|
|
45
|
+
* Begin consuming the response once and retain failures for later assertions.
|
|
46
|
+
*/
|
|
47
|
+
constructor(
|
|
48
|
+
/**
|
|
49
|
+
* Expose the original response and its metadata.
|
|
50
|
+
*/
|
|
51
|
+
response: Response,
|
|
52
|
+
/**
|
|
53
|
+
* Retain request timing, cancellation and completion hooks.
|
|
54
|
+
*/
|
|
55
|
+
options?: ITestResponseOptions);
|
|
56
|
+
/**
|
|
57
|
+
* Expose the committed HTTP status.
|
|
58
|
+
*/
|
|
28
59
|
get status(): number;
|
|
60
|
+
/**
|
|
61
|
+
* Expose the committed response headers.
|
|
62
|
+
*/
|
|
29
63
|
get headers(): Headers;
|
|
30
|
-
/**
|
|
31
|
-
|
|
64
|
+
/**
|
|
65
|
+
* Join the fully consumed response body for repeatable assertions.
|
|
66
|
+
*/
|
|
32
67
|
text(): Promise<string>;
|
|
33
68
|
/** The raw full document, including React boundary instructions and data scripts. */
|
|
34
69
|
html(): Promise<string>;
|
|
70
|
+
/**
|
|
71
|
+
* Return isolated chunk observations after body consumption completes.
|
|
72
|
+
*/
|
|
35
73
|
chunks(): Promise<ITestChunk[]>;
|
|
74
|
+
/**
|
|
75
|
+
* Reconstruct the loader and action state emitted in the document.
|
|
76
|
+
*/
|
|
36
77
|
routerState(): Promise<IRouterState | undefined>;
|
|
37
78
|
/** Count raw markers: streamed HTML retains them even after replacement scripts arrive. */
|
|
38
79
|
pendingBoundaries(): Promise<number>;
|
|
80
|
+
/**
|
|
81
|
+
* Read validated SSR Boost transport frames in emission order.
|
|
82
|
+
*/
|
|
39
83
|
streamFrames(): Promise<TStreamFrame[]>;
|
|
40
84
|
/** A failed/cancelled read still has a useful diagnostic timeline. */
|
|
41
85
|
timeline(): Promise<ITimelineEvent[]>;
|
|
42
86
|
/** Preserve separate cookies and commas in Expires, without running a browser cookie jar. */
|
|
43
87
|
cookies(): ITestCookie[];
|
|
88
|
+
/** Decode incrementally so multibyte characters survive arbitrary transport cuts. */
|
|
89
|
+
protected read(): Promise<void>;
|
|
44
90
|
}
|
|
45
91
|
export type { ITestChunk, ITestCookie, ITestResponseOptions };
|
|
46
92
|
export default TestResponse;
|
package/testing/response.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{routerState as t,streamFrames as e}from"./parse-response.js";class s{response;options;parts=[];completed;started;constructor(t,e={}){this.response=t,this.options=e,this.started=e.started??performance.now(),this.completed=this.read(),this.completed.catch(()=>{})}get status(){return this.response.status}get headers(){return this.response.headers}async
|
|
1
|
+
import{routerState as t,streamFrames as e}from"./parse-response.js";class s{response;options;parts=[];completed;started;constructor(t,e={}){this.response=t,this.options=e,this.started=e.started??performance.now(),this.completed=this.read(),this.completed.catch(()=>{})}get status(){return this.response.status}get headers(){return this.response.headers}async text(){return await this.completed,this.parts.map(t=>t.text).join("")}html(){return this.text()}async chunks(){return await this.completed,this.parts.map(t=>({...t}))}async routerState(){return t(await this.text())}async pendingBoundaries(){return(await this.text()).split("\x3c!--$?--\x3e").length-1}async streamFrames(){return e(await this.text())}async timeline(){return await this.completed.catch(()=>{}),this.options.timeline?.events.map(t=>({...t}))??[]}cookies(){const t=this.headers;return(t.getSetCookie?.()??t.get("set-cookie")?.split(/,(?=\s*[^=;,\s]+=)/)??[]).map(t=>{const[e,...s]=t.split(";"),r=e.indexOf("=");return{name:e.slice(0,r).trim(),value:e.slice(r+1).trim(),attributes:Object.fromEntries(s.map(t=>{const e=t.indexOf("=");return e<0?[t.trim().toLowerCase(),!0]:[t.slice(0,e).trim().toLowerCase(),t.slice(e+1).trim()]}))}})}async read(){const t=this.response.body?.getReader(),e=new TextDecoder,{signal:s,onComplete:r}=this.options,a=()=>{t?.cancel(s?.reason).catch(()=>{})};s?.addEventListener("abort",a,{once:!0});try{if(s?.throwIfAborted(),t)for(;;){const{done:r,value:a}=await t.read();s?.throwIfAborted();const i=r?e.decode():e.decode(a,{stream:!0});if(i&&this.parts.push({text:i,at:performance.now()-this.started}),r)break}}catch(e){throw await(t?.cancel(e).catch(()=>{})),e}finally{t?.releaseLock(),s?.removeEventListener("abort",a),r?.()}}}export{s as default};
|
|
2
2
|
//# sourceMappingURL=response.js.map
|
package/testing/response.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"response.js","sources":["../../src/testing/response.ts"],"sourcesContent":[null],"names":["TestResponse","response","options","parts","completed","started","constructor","this","performance","now","read","catch","status","headers","
|
|
1
|
+
{"version":3,"file":"response.js","sources":["../../src/testing/response.ts"],"sourcesContent":[null],"names":["TestResponse","response","options","parts","completed","started","constructor","this","performance","now","read","catch","status","headers","text","map","chunk","join","html","chunks","routerState","pendingBoundaries","split","length","streamFrames","timeline","events","event","cookies","getSetCookie","get","cookie","pair","attributes","separator","indexOf","name","slice","trim","value","Object","fromEntries","attribute","index","toLowerCase","reader","body","getReader","decoder","TextDecoder","signal","onComplete","onAbort","cancel","reason","addEventListener","once","throwIfAborted","done","isDone","decode","stream","push","at","error","releaseLock","removeEventListener"],"mappings":"oEA6BA,MAAMA,EAuBcC,SAKGC,QAxBFC,MAAsB,GAKtBC,UAKAC,QAKnB,WAAAC,CAIkBL,EAKGC,EAAgC,CAAA,GALnCK,KAAAN,SAAAA,EAKGM,KAAAL,QAAAA,EAEnBK,KAAKF,QAAUH,EAAQG,SAAWG,YAAYC,MAC9CF,KAAKH,UAAYG,KAAKG,OACjBH,KAAKH,UAAUO,MAAM,OAC5B,CAKA,UAAWC,GACT,OAAOL,KAAKN,SAASW,MACvB,CAKA,WAAWC,GACT,OAAON,KAAKN,SAASY,OACvB,CAKO,UAAMC,GAGX,aAFMP,KAAKH,UAEJG,KAAKJ,MAAMY,IAAKC,GAAUA,EAAMF,MAAMG,KAAK,GACpD,CAGO,IAAAC,GACL,OAAOX,KAAKO,MACd,CAKO,YAAMK,GAGX,aAFMZ,KAAKH,UAEJG,KAAKJ,MAAMY,IAAKC,QAAgBA,IACzC,CAKO,iBAAMI,GACX,OAAOA,QAAkBb,KAAKO,OAChC,CAGO,uBAAMO,GACX,aAAcd,KAAKO,QAAQQ,MAAM,mBAAaC,OAAS,CACzD,CAKO,kBAAMC,GACX,OAAOA,QAAmBjB,KAAKO,OACjC,CAGO,cAAMW,GAGX,aAFMlB,KAAKH,UAAUO,MAAM,QAEpBJ,KAAKL,QAAQuB,UAAUC,OAAOX,IAAKY,QAAgBA,MAAa,EACzE,CAGO,OAAAC,GACL,MAAMf,EAAUN,KAAKM,QAOrB,OALEA,EAAQgB,kBAAoBhB,EAAQiB,IAAI,eAAeR,MAAM,uBAAyB,IAK1EP,IAAKgB,IACjB,MAAOC,KAASC,GAAcF,EAAOT,MAAM,KACrCY,EAAYF,EAAKG,QAAQ,KAE/B,MAAO,CACLC,KAAMJ,EAAKK,MAAM,EAAGH,GAAWI,OAC/BC,MAAOP,EAAKK,MAAMH,EAAY,GAAGI,OAKjCL,WAAYO,OAAOC,YACjBR,EAAWlB,IAAK2B,IACd,MAAMC,EAAQD,EAAUP,QAAQ,KAEhC,OAAOQ,EAAQ,EACX,CAACD,EAAUJ,OAAOM,eAAe,GACjC,CAACF,EAAUL,MAAM,EAAGM,GAAOL,OAAOM,cAAeF,EAAUL,MAAMM,EAAQ,GAAGL,aAK1F,CAGU,UAAM5B,GACd,MAAMmC,EAAStC,KAAKN,SAAS6C,MAAMC,YAC7BC,EAAU,IAAIC,aACdC,OAAEA,EAAMC,WAAEA,GAAe5C,KAAKL,QAK9BkD,EAAU,KACTP,GAAQQ,OAAOH,GAAQI,QAAQ3C,MAAM,SAG5CuC,GAAQK,iBAAiB,QAASH,EAAS,CAAEI,MAAM,IAEnD,IAGE,GAFAN,GAAQO,iBAEJZ,EACF,OAAa,CACX,MAAQa,KAAMC,EAAMpB,MAAEA,SAAgBM,EAAOnC,OAE7CwC,GAAQO,iBAER,MAAM3C,EAAO6C,EAASX,EAAQY,SAAWZ,EAAQY,OAAOrB,EAAO,CAAEsB,QAAQ,IAMzE,GAJI/C,GACFP,KAAKJ,MAAM2D,KAAK,CAAEhD,OAAMiD,GAAIvD,YAAYC,MAAQF,KAAKF,UAGnDsD,EACF,KAEJ,CAEJ,CAAE,MAAOK,GAEP,YADMnB,GAAQQ,OAAOW,GAAOrD,MAAM,SAC5BqD,CACR,SACEnB,GAAQoB,cACRf,GAAQgB,oBAAoB,QAASd,GACrCD,KACF,CACF"}
|
package/testing.d.ts
CHANGED
|
@@ -1,7 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Create route test handlers with Node rendering and optional file-backed shells.
|
|
3
|
+
*/
|
|
1
4
|
declare const createTestHandler: <TAppProps = Record<string, any>>({ routes, App, shell, routerOptions, renderToStream, signal: defaultSignal, timeout: defaultTimeout, onContext, onRouterReady, ...options }: import("./testing.js").ITestHandlerOptions<TAppProps>) => import("./testing.js").ITestHandler;
|
|
2
5
|
export { createTestHandler };
|
|
6
|
+
/**
|
|
7
|
+
* Expose manual control over deferred loader settlement.
|
|
8
|
+
*/
|
|
3
9
|
export { default as createDeferred } from './testing/deferred.js';
|
|
10
|
+
/**
|
|
11
|
+
* Supply browser and crawler request identities for route tests.
|
|
12
|
+
*/
|
|
4
13
|
export { browserRequest, crawlerRequest } from './testing/requests.js';
|
|
14
|
+
/**
|
|
15
|
+
* Expose repeatable response assertions for route tests.
|
|
16
|
+
*/
|
|
5
17
|
export { default as TestResponse } from './testing/response.js';
|
|
6
18
|
export type { ITestHandler, ITestHandlerOptions, ITestRequestInit } from './testing/create-handler.js';
|
|
7
19
|
export type { ITestChunk, ITestCookie, ITestResponseOptions } from './testing/response.js';
|
package/testing.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testing.js","sources":["../src/testing.ts"],"sourcesContent":[null],"names":["createTestHandler","testHandlerFactory","renderToStream","async","options","loadHtmlShell"],"mappings":"
|
|
1
|
+
{"version":3,"file":"testing.js","sources":["../src/testing.ts"],"sourcesContent":[null],"names":["createTestHandler","testHandlerFactory","renderToStream","async","options","loadHtmlShell"],"mappings":"8QAMA,MAAMA,EAAoBC,EAAmBC,EAAgBC,MAAOC,iBACpD,0BAAqBC,cAAcD"}
|