@lomray/vite-ssr-boost 8.4.0-beta.4 → 8.4.1-beta.1
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/prepare-server.js +1 -1
- package/adapters/express/prepare-server.js.map +1 -1
- package/adapters/express/render.js +1 -1
- package/adapters/express/render.js.map +1 -1
- package/adapters/express/route-assets.d.ts +8 -0
- package/adapters/express/route-assets.js +2 -0
- package/adapters/express/route-assets.js.map +1 -0
- package/browser/entry.js.map +1 -1
- package/cli/commands.d.ts +1 -0
- package/cli/commands.js +2 -0
- package/cli/commands.js.map +1 -0
- package/cli/helpers/enable-shortcuts.d.ts +5 -0
- package/cli/helpers/enable-shortcuts.js +2 -0
- package/cli/helpers/enable-shortcuts.js.map +1 -0
- package/cli/run-prod.js +1 -1
- package/cli/run-prod.js.map +1 -1
- package/cli/start.d.ts +10 -0
- package/cli/start.js +2 -0
- package/cli/start.js.map +1 -0
- package/cli.js +1 -1
- package/cli.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/helpers/print-server-info.js +1 -1
- package/helpers/print-server-info.js.map +1 -1
- package/http.d.ts +12 -0
- package/node/production.d.ts +3 -3
- package/package.json +5 -3
- package/services/build.d.ts +4 -0
- package/services/build.js +1 -1
- package/services/build.js.map +1 -1
- package/services/diagnostics.d.ts +18 -1
- package/services/diagnostics.js.map +1 -1
- package/services/production-config.d.ts +15 -0
- package/services/production-config.js +2 -0
- package/services/production-config.js.map +1 -0
- 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/server-config.d.ts +1 -0
- package/services/server-config.js +1 -1
- package/services/server-config.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
|
@@ -8,7 +8,9 @@ declare enum AssetType {
|
|
|
8
8
|
interface IAsset {
|
|
9
9
|
type: string;
|
|
10
10
|
url: string;
|
|
11
|
+
/** Lower weights are injected first. */
|
|
11
12
|
weight: number;
|
|
13
|
+
/** Nested assets follow top-level assets with the same weight. */
|
|
12
14
|
isNested: boolean;
|
|
13
15
|
isPreload: boolean;
|
|
14
16
|
content?: string;
|
|
@@ -30,13 +32,30 @@ interface IInjectAssetsContext {
|
|
|
30
32
|
* Load and inject route assets with an independent cache for one build.
|
|
31
33
|
*/
|
|
32
34
|
declare class RouteAssets {
|
|
35
|
+
/**
|
|
36
|
+
* Control module preload hints for matched scripts.
|
|
37
|
+
*/
|
|
33
38
|
protected readonly modulePreload: boolean;
|
|
39
|
+
/**
|
|
40
|
+
* Keep the build's route assets isolated from other handler instances.
|
|
41
|
+
*/
|
|
34
42
|
protected routesAssets: TRouteAssetsManifest | null;
|
|
43
|
+
/**
|
|
44
|
+
* Retain the supplied manifest and preload preference.
|
|
45
|
+
*/
|
|
35
46
|
constructor(manifest: TRouteAssetsManifest, modulePreload?: boolean);
|
|
36
47
|
/**
|
|
37
48
|
* Development manifests override this to inject inline styles.
|
|
38
49
|
*/
|
|
39
50
|
protected get isDev(): boolean;
|
|
51
|
+
/**
|
|
52
|
+
* Build preload hints without depending on a particular HTTP transport.
|
|
53
|
+
*/
|
|
54
|
+
getEarlyHints(assets: IAsset[]): Headers;
|
|
55
|
+
/**
|
|
56
|
+
* Inject route assets to head html
|
|
57
|
+
*/
|
|
58
|
+
injectAssets({ routerContext, matches, html, isSpa }: IInjectAssetsContext, earlyHints?: boolean): Headers;
|
|
40
59
|
/**
|
|
41
60
|
* Read the manifest without requiring a filesystem.
|
|
42
61
|
*/
|
|
@@ -47,16 +66,9 @@ declare class RouteAssets {
|
|
|
47
66
|
protected sortAssets(assets: IAsset[]): IAsset[];
|
|
48
67
|
/**
|
|
49
68
|
* Get route assets
|
|
69
|
+
* The development manifest uses the SPA flag to preload unqueried lazy routes.
|
|
50
70
|
*/
|
|
51
71
|
protected getAssets(routes?: RouterState['matches'], _isSpa?: boolean): IAsset[];
|
|
52
|
-
/**
|
|
53
|
-
* Build preload hints without depending on a particular HTTP transport.
|
|
54
|
-
*/
|
|
55
|
-
getEarlyHints(assets: IAsset[]): Headers;
|
|
56
|
-
/**
|
|
57
|
-
* Inject route assets to head html
|
|
58
|
-
*/
|
|
59
|
-
injectAssets({ routerContext, matches, html, isSpa }: IInjectAssetsContext, earlyHints?: boolean): Headers;
|
|
60
72
|
}
|
|
61
73
|
export { AssetType };
|
|
62
74
|
export type { IAsset, TAssets, TRouteAssetsManifest };
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var e;!function(e){e.style="style",e.script="script",e.image="image",e.font="font"}(e||(e={}));let
|
|
1
|
+
var e;!function(e){e.style="style",e.script="script",e.image="image",e.font="font"}(e||(e={}));let s=class{modulePreload;routesAssets;constructor(e,s=!1){this.routesAssets=e,this.modulePreload=s}get isDev(){return!1}getEarlyHints(e){const s=new Headers;return e.forEach(({type:e,url:t})=>{e&&["style","script"].includes(e)&&s.append("Link",`<${t}>; rel=preload; as=${e}`)}),s}injectAssets({routerContext:e,matches:s,html:t,isSpa:r},i=!0){const l=this.getAssets(s??e?.matches,r),n=l.map(({type:e,url:s,isPreload:t,content:i=""})=>{switch(e){case"style":return this.isDev?`<style data-vite-dev-id="${s}">${i}</style>`:`<link rel="stylesheet" href="${s}">`;case"script":return t?this.modulePreload||r?`<link rel="modulepreload" as="script" crossorigin href="${s}">`:null:`<script async type="module" crossorigin src="${s}"><\/script>`}return null}).filter(Boolean);return t.header=t.header.replace("</head>",`${n.join("\n")}</head>`),i?this.getEarlyHints(l):new Headers}loadAssetsManifest(){return this.routesAssets??{}}sortAssets(e){return e.sort(({weight:e,isNested:s},{weight:t,isNested:r})=>e===t?Number(s)-Number(r):e-t)}getAssets(e,s){const t=e?.map(({route:e})=>e.id).filter(Boolean)??[];if(!t.length)return[];const r=this.loadAssetsManifest();return this.sortAssets(t.map(e=>r[e]).flat().filter(Boolean))}};export{e as AssetType,s as default};
|
|
2
2
|
//# sourceMappingURL=route-assets-memory.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"route-assets-memory.js","sources":["../../src/services/route-assets-memory.ts"],"sourcesContent":[null],"names":["AssetType","RouteAssets$1","modulePreload","routesAssets","constructor","manifest","this","isDev","
|
|
1
|
+
{"version":3,"file":"route-assets-memory.js","sources":["../../src/services/route-assets-memory.ts"],"sourcesContent":[null],"names":["AssetType","RouteAssets$1","modulePreload","routesAssets","constructor","manifest","this","isDev","getEarlyHints","assets","headers","Headers","forEach","type","url","includes","append","injectAssets","routerContext","matches","html","isSpa","earlyHints","getAssets","htmlAssets","map","isPreload","content","filter","Boolean","header","replace","join","loadAssetsManifest","sortAssets","sort","weight","isNested","nextWeight","isNextNested","Number","routes","_isSpa","routeIds","route","id","length","routeId","flat"],"mappings":"AAEA,IAAKA,GAAL,SAAKA,GACHA,EAAA,MAAA,QACAA,EAAA,OAAA,SACAA,EAAA,MAAA,QACAA,EAAA,KAAA,MACD,CALD,CAAKA,IAAAA,EAAS,CAAA,IAqCd,IAAAC,EAAA,MAIqBC,cAKTC,aAKV,WAAAC,CAAYC,EAAgCH,GAAgB,GAC1DI,KAAKH,aAAeE,EACpBC,KAAKJ,cAAgBA,CACvB,CAKA,SAAcK,GACZ,OAAO,CACT,CAKO,aAAAC,CAAcC,GACnB,MAAMC,EAAU,IAAIC,QAapB,OARAF,EAAOG,QAAQ,EAAGC,OAAMC,UACjBD,GAAS,CAAC,QAAS,UAAUE,SAASF,IAI3CH,EAAQM,OAAO,OAAQ,IAAIF,uBAAyBD,OAG/CH,CACT,CAKO,YAAAO,EACLC,cAAEA,EAAaC,QAAEA,EAAOC,KAAEA,EAAIC,MAAEA,GAChCC,GAAa,GAEb,MAAMb,EAASH,KAAKiB,UAAUJ,GAAWD,GAAeC,QAASE,GAK3DG,EAAaf,EAChBgB,IAAI,EAAGZ,OAAMC,MAAKY,YAAWC,UAAU,OACtC,OAAQd,GACN,IAAK,QACH,OAAOP,KAAKC,MACR,4BAA4BO,MAAQa,YACpC,gCAAgCb,MAEtC,IAAK,SACH,OAAOY,EACHpB,KAAKJ,eAAiBmB,EAEpB,2DAA2DP,MAC3D,KACF,gDAAgDA,gBAGxD,OAAO,OAERc,OAAOC,SAIV,OAFAT,EAAKU,OAASV,EAAKU,OAAOC,QAAQ,UAAW,GAAGP,EAAWQ,KAAK,gBAEzDV,EAAahB,KAAKE,cAAcC,GAAU,IAAIE,OACvD,CAKU,kBAAAsB,GACR,OAAO3B,KAAKH,cAAgB,CAAA,CAC9B,CAKU,UAAA+B,CAAWzB,GACnB,OAAOA,EAAO0B,KAAK,EAAGC,SAAQC,aAAcD,OAAQE,EAAYD,SAAUE,KACxEH,IAAWE,EAAaE,OAAOH,GAAYG,OAAOD,GAAgBH,EAASE,EAE/E,CAOU,SAAAf,CAAUkB,EAAiCC,GACnD,MAAMC,EAAWF,GAAQhB,IAAI,EAAGmB,WAAYA,EAAMC,IAAIjB,OAAOC,UAAY,GAEzE,IAAKc,EAASG,OACZ,MAAO,GAGT,MAAM3C,EAAeG,KAAK2B,qBAE1B,OAAO3B,KAAK4B,WACVS,EACGlB,IAAKsB,GAAY5C,EAAa4C,IAC9BC,OACApB,OAAOC,SAEd"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import t from"node:fs";import i from"node:path";import e from"../helpers/plugin-config.js";import
|
|
1
|
+
import t from"node:fs";import i from"node:path";import e from"../helpers/plugin-config.js";import s from"./logger.js";class r{isProd;isHost;isModulePreload;mode;entrypointName;vite;app;params;defaultParams;logger;defaultBuildRoots=["./build","./dist"];constructor({entrypointName:t,isProd:i=!1,isHost:e=!1,isOnlyClient:s=!1,isModulePreload:r=!1,mode:o="production"},n){this.isProd=i,this.isHost=e,this.isModulePreload=r,this.mode=o,this.entrypointName=t,this.defaultParams={base:"/",publicDir:"/client",indexFile:"/client/index.html",serverFile:"/server/server.js",host:"127.0.0.1",isSPA:s,...n},this.makeParams()}static init(t={},i={}){return new r(t,i)}getBuildDir(i){for(const e of[i,...this.defaultBuildRoots])if(e&&t.existsSync(e))return e;return i??this.defaultBuildRoots[0]}makeParams(){this.applyEntrypointConfig();const t=this.getPluginConfig()??{},{config:e}=this.vite??{},{root:r,publicDir:o,indexFile:n,clientFile:a,serverFile:l,host:h,isSPA:p}=this.defaultParams,g=new URL(import.meta.url),d=t.pluginPath??i.resolve(i.dirname(g.pathname),"../"),u=this.getEntrypoint(),m="boolean"==typeof e?.server.host||this.isHost?"0.0.0.0":e?.server.host??h,f=Number(e?.env.VITE_PORT??e?.server.port??this.defaultParams.port);this.params={root:e?.root??this.getBuildDir(r),base:e?.base??this.defaultParams.base,publicDir:e?.publicDir??o,indexFile:t.indexFile??n,clientFile:t.clientFile??a,serverFile:t.serverFile??l,pluginPath:d,host:m,port:f,isSPA:u?"spa"===u.type:p,isProd:this.isProd},this.logger=this.vite?.config.logger??new s}setVite(t){this.vite=t,this.makeParams()}setApp(t){this.app=t}getVite(){return this.vite}getApp(){return this.app}getPluginConfig(){return this.vite?e(this.vite.config):void 0}getParams(){return this.params}getLogger(){return this.logger}setLogger(t){this.logger=t}applyEntrypointConfig(){const t=this.getPluginConfig();if(!this.vite||!t||!this.entrypointName)return;const i=this.getEntrypoint();i&&["indexFile","clientFile","serverFile"].forEach(e=>{i[e]&&(t[e]=i[e])})}getEntrypoint(){const t=this.vite?e(this.vite.config):void 0;return t?.entrypoint?.find(({name:t})=>t===this.entrypointName)}}export{r as default};
|
|
2
2
|
//# sourceMappingURL=server-config.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server-config.js","sources":["../../src/services/server-config.ts"],"sourcesContent":[null],"names":["ServerConfig","isProd","isHost","isModulePreload","mode","entrypointName","vite","app","params","defaultParams","logger","defaultBuildRoots","constructor","isOnlyClient","prodParams","this","publicDir","indexFile","serverFile","host","isSPA","makeParams","init","options","prodOptions","getBuildDir","root","dir","fs","existsSync","applyEntrypointConfig","pluginConfig","getPluginConfig","config","clientFile","defaultHost","dirInfo","URL","url","pluginPath","path","resolve","dirname","pathname","entrypoint","getEntrypoint","server","port","Number","env","VITE_PORT","type","DefaultLogger","setVite","setApp","getVite","getApp","undefined","getParams","getLogger","setLogger","entrypointConfig","forEach","optName","find","name"],"mappings":"
|
|
1
|
+
{"version":3,"file":"server-config.js","sources":["../../src/services/server-config.ts"],"sourcesContent":[null],"names":["ServerConfig","isProd","isHost","isModulePreload","mode","entrypointName","vite","app","params","defaultParams","logger","defaultBuildRoots","constructor","isOnlyClient","prodParams","this","base","publicDir","indexFile","serverFile","host","isSPA","makeParams","init","options","prodOptions","getBuildDir","root","dir","fs","existsSync","applyEntrypointConfig","pluginConfig","getPluginConfig","config","clientFile","defaultHost","dirInfo","URL","url","pluginPath","path","resolve","dirname","pathname","entrypoint","getEntrypoint","server","port","Number","env","VITE_PORT","type","DefaultLogger","setVite","setApp","getVite","getApp","undefined","getParams","getLogger","setLogger","entrypointConfig","forEach","optName","find","name"],"mappings":"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"}
|
|
@@ -72,6 +72,10 @@ declare class SsrManifest extends RouteAssets {
|
|
|
72
72
|
* Use inline styles while the managed Vite server is running.
|
|
73
73
|
*/
|
|
74
74
|
protected get isDev(): boolean;
|
|
75
|
+
/**
|
|
76
|
+
* Compile SSR graph styles before the browser has populated the client graph.
|
|
77
|
+
*/
|
|
78
|
+
prepareDevAssets(routes?: RouterState['matches'], isSpa?: boolean): Promise<void>;
|
|
75
79
|
/**
|
|
76
80
|
* Get output dir.
|
|
77
81
|
*/
|
|
@@ -108,10 +112,6 @@ declare class SsrManifest extends RouteAssets {
|
|
|
108
112
|
* Get development route assets
|
|
109
113
|
*/
|
|
110
114
|
protected getDevModules(routes?: RouterState['matches']): ModuleNode[];
|
|
111
|
-
/**
|
|
112
|
-
* Compile SSR graph styles before the browser has populated the client graph.
|
|
113
|
-
*/
|
|
114
|
-
prepareDevAssets(routes?: RouterState['matches'], isSpa?: boolean): Promise<void>;
|
|
115
115
|
/**
|
|
116
116
|
* Collect development assets from the current server and client module graphs.
|
|
117
117
|
*/
|
package/services/ssr-manifest.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import e from"node:fs";import t from"node:path";import s from"chalk";import i from"./parse-routes.js";import r from"./path-normalize.js";import o from"./route-assets.js";import{AssetType as a}from"./route-assets-memory.js";class n extends o{static instance=null;config;pathNormalize;root;buildDir;manifestName="manifest.json";viteAliases;basename;renderBuiltUrl;constructor(e,{buildDir:s,viteAliases:i,basename:o,renderBuiltUrl:a}={}){super(t.resolve(e.getParams().root,s||""),e.isModulePreload),this.config=e,this.root=e.getParams().root,this.buildDir=s,this.viteAliases=i??e.getVite()?.config?.resolve.alias,this.pathNormalize=new r(e,i),this.basename=o,this.renderBuiltUrl=a}static get(e,t={}){return null===n.instance&&(n.instance=new n(e,t)),n.instance}get isDev(){return Boolean(this.config.getVite())}getOutDir(){return t.resolve(this.root,this.buildDir||"")}getAssetsManifestFile(){return`${this.getOutDir()}/server/assets-manifest.json`}loadClientManifest(){const s=t.resolve(this.root,`${this.buildDir||""}/client/.vite`),i=`${s}/${this.manifestName}`;if(!e.existsSync(i))return{};const r=JSON.parse(e.readFileSync(i,{encoding:"utf-8"}));return e.rmSync(i),0===e.readdirSync(s).length&&e.rmSync(s,{recursive:!0}),r}getRoutesTreeIds(e,t){const s={};return e.forEach(e=>{const i=[t,String(e.index)].filter(Boolean).join("-"),r=e.id??i;e.import&&(s[r]=this.pathNormalize.getAppPath(e.import)),e.children.length>0&&Object.assign(s,this.getRoutesTreeIds(e.children,i))}),s}getRouteAssets(e,s,i=!1){const r=[...s?.assets??[],...s?.css??[],s?.file].reduce((e,r)=>{if(r){const o=this.getAssetType(r),a=s.isEntry&&s.file===r;if(o){const s=t.posix.normalize(`${this.basename}/${r}`),n=this.renderBuiltUrl?.(s,{type:"asset",ssr:!0,hostId:"",hostType:s.split(".").at(-1)?.toLowerCase()});e[r]={url:"string"==typeof n?n:s,weight:a?1.9:this.getAssetWeight(r),type:o,isNested:i,isPreload:!a}}}return e},{});return s?.imports?.length&&s.imports.forEach(t=>{const s=e[t];s&&Object.assign(r,this.getRouteAssets(e,s,!0))}),r}buildRoutesManifest(){const s=this.loadClientManifest(),r=new i(this.config,this.viteAliases),o=this.getRoutesTreeIds(r.parse()),a=this.pathNormalize.getImportPostfix(),n={};Object.entries(o).forEach(([e,t])=>{const i=a.find(e=>void 0!==s[`${t}${e}`]),r=s[`${t}${i||""}`];n[e]=this.sortAssets(Object.values(this.getRouteAssets(s,r)))});const l=JSON.stringify(n,null,2);e.writeFileSync(this.getAssetsManifestFile(),l,{encoding:"utf-8"});const c=t.join(this.getOutDir(),"client");e.existsSync(c)&&e.writeFileSync(t.join(c,"assets-manifest.json"),l,{encoding:"utf-8"})}getAssets(e,t){return this.isDev?this.getAssetsDev(e,t):super.getAssets(e)}getDevRouteIds(e){return e?.map(({route:e})=>this.pathNormalize.getAppPath(e?.pathId,!0)).filter(Boolean)??[]}getDevModules(e){const s=this.getDevRouteIds(e),i=this.pathNormalize.getImportPostfix(),r=this.config.getPluginConfig(),o=[r?.clientFile??"client.ts",r?.serverFile??"server.ts"].map(e=>t.resolve(this.root,e)),a=[];return[...o,...s].forEach(e=>{for(const t of i){const s=this.config.getVite()?.moduleGraph.getModuleById(`${e}${t}`);if(s){a.push(s);break}}}),a}
|
|
1
|
+
import e from"node:fs";import t from"node:path";import s from"chalk";import i from"./parse-routes.js";import r from"./path-normalize.js";import o from"./route-assets.js";import{AssetType as a}from"./route-assets-memory.js";class n extends o{static instance=null;config;pathNormalize;root;buildDir;manifestName="manifest.json";viteAliases;basename;renderBuiltUrl;constructor(e,{buildDir:s,viteAliases:i,basename:o,renderBuiltUrl:a}={}){super(t.resolve(e.getParams().root,s||""),e.isModulePreload),this.config=e,this.root=e.getParams().root,this.buildDir=s,this.viteAliases=i??e.getVite()?.config?.resolve.alias,this.pathNormalize=new r(e,i),this.basename=o,this.renderBuiltUrl=a}static get(e,t={}){return null===n.instance&&(n.instance=new n(e,t)),n.instance}get isDev(){return Boolean(this.config.getVite())}async prepareDevAssets(e,t=!1){const s=this.config.getVite();if(!s)return;t&&await Promise.all(this.getDevRouteIds(e).map(async e=>{const t=this.pathNormalize.findAppFile(e);t&&await s.transformRequest(`/@fs/${t}`)}));const i=new Set,r=async e=>{i.has(e.url)||(i.add(e.url),e.file&&/\.(?:css|less|s[ac]ss|styl(?:us)?|pcss|postcss)$/.test(e.file)&&await s.transformRequest(e.url),await Promise.all([...e.importedModules].map(r)))};await Promise.all(this.getDevModules(e).map(r))}getOutDir(){return t.resolve(this.root,this.buildDir||"")}getAssetsManifestFile(){return`${this.getOutDir()}/server/assets-manifest.json`}loadClientManifest(){const s=t.resolve(this.root,`${this.buildDir||""}/client/.vite`),i=`${s}/${this.manifestName}`;if(!e.existsSync(i))return{};const r=JSON.parse(e.readFileSync(i,{encoding:"utf-8"}));return e.rmSync(i),0===e.readdirSync(s).length&&e.rmSync(s,{recursive:!0}),r}getRoutesTreeIds(e,t){const s={};return e.forEach(e=>{const i=[t,String(e.index)].filter(Boolean).join("-"),r=e.id??i;e.import&&(s[r]=this.pathNormalize.getAppPath(e.import)),e.children.length>0&&Object.assign(s,this.getRoutesTreeIds(e.children,i))}),s}getRouteAssets(e,s,i=!1){const r=[...s?.assets??[],...s?.css??[],s?.file].reduce((e,r)=>{if(r){const o=this.getAssetType(r),a=s.isEntry&&s.file===r;if(o){const s=t.posix.normalize(`${this.basename}/${r}`),n=this.renderBuiltUrl?.(s,{type:"asset",ssr:!0,hostId:"",hostType:s.split(".").at(-1)?.toLowerCase()});e[r]={url:"string"==typeof n?n:s,weight:a?1.9:this.getAssetWeight(r),type:o,isNested:i,isPreload:!a}}}return e},{});return s?.imports?.length&&s.imports.forEach(t=>{const s=e[t];s&&Object.assign(r,this.getRouteAssets(e,s,!0))}),r}buildRoutesManifest(){const s=this.loadClientManifest(),r=new i(this.config,this.viteAliases),o=this.getRoutesTreeIds(r.parse()),a=this.pathNormalize.getImportPostfix(),n={};Object.entries(o).forEach(([e,t])=>{const i=a.find(e=>void 0!==s[`${t}${e}`]),r=s[`${t}${i||""}`];n[e]=this.sortAssets(Object.values(this.getRouteAssets(s,r)))});const l=JSON.stringify(n,null,2);e.writeFileSync(this.getAssetsManifestFile(),l,{encoding:"utf-8"});const c=t.join(this.getOutDir(),"client");e.existsSync(c)&&e.writeFileSync(t.join(c,"assets-manifest.json"),l,{encoding:"utf-8"})}getAssets(e,t){return this.isDev?this.getAssetsDev(e,t):super.getAssets(e)}getDevRouteIds(e){return e?.map(({route:e})=>this.pathNormalize.getAppPath(e?.pathId,!0)).filter(Boolean)??[]}getDevModules(e){const s=this.getDevRouteIds(e),i=this.pathNormalize.getImportPostfix(),r=this.config.getPluginConfig(),o=[r?.clientFile??"client.ts",r?.serverFile??"server.ts"].map(e=>t.resolve(this.root,e)),a=[];return[...o,...s].forEach(e=>{for(const t of i){const s=this.config.getVite()?.moduleGraph.getModuleById(`${e}${t}`);if(s){a.push(s);break}}}),a}getAssetsDev(e,t=!1){const s=Object.assign({},...this.getDevModules(e).map(e=>this.getModuleAssets(e))),i=t?this.getDevRouteIds(e).flatMap(e=>{const t=this.pathNormalize.getImportPostfix().map(t=>this.config.getVite()?.moduleGraph.getModuleById(`${e}${t}`)).find(Boolean);return t?[{type:a.script,url:t.url,weight:2,isNested:!1,isPreload:!0}]:[]}):[];return[...Object.values(s),...i]}getModuleAssets(e,t=new Set){const i=e?.importedModules??e?.clientImportedModules;if(!i?.size||t.has(e.file))return{};let r={};return t.add(e.file),i.forEach(e=>{const{file:i,transformResult:o}=e,n=i?.split(".").at(-1);if(i&&n&&["css","scss","sass","less","styl","stylus","pcss","postcss"].includes(n)){const e=o?.code.match(/__vite__css\s+=\s+"(?<css>.+)"/)?.groups?.css;if(e)try{r[i]={type:a.style,url:i,weight:this.getAssetWeight(i),content:JSON.parse(`{"style": "${e}"}`).style,isNested:Boolean(t.size),isPreload:!1}}catch{console.warn(s.yellowBright("Failed to parse style: ",i))}}else r={...r,...this.getModuleAssets(e,t)}}),r}getAssetWeight(e){switch(this.getAssetType(e)){case a.style:return 1;case a.script:return 2;default:return 3}}getAssetType(e){const t=e.split(".").at(-1)?.toLowerCase();switch(t){case"css":case"scss":return a.style;case"js":return a.script;case"svg":case"jpg":case"jpeg":case"png":case"webp":case"gif":case"ico":return a.image;case"ttf":case"otf":case"woff":case"woff2":return a.font;default:return null}}}export{n as default};
|
|
2
2
|
//# sourceMappingURL=ssr-manifest.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ssr-manifest.js","sources":["../../src/services/ssr-manifest.ts"],"sourcesContent":[null],"names":["SsrManifest","RouteAssets","static","config","pathNormalize","root","buildDir","manifestName","viteAliases","basename","renderBuiltUrl","constructor","super","path","resolve","getParams","isModulePreload","this","getVite","alias","PathNormalize","get","params","instance","isDev","Boolean","getOutDir","getAssetsManifestFile","loadClientManifest","clientManifestDir","clientSsrManifest","fs","existsSync","result","JSON","parse","readFileSync","encoding","rmSync","readdirSync","length","recursive","getRoutesTreeIds","
|
|
1
|
+
{"version":3,"file":"ssr-manifest.js","sources":["../../src/services/ssr-manifest.ts"],"sourcesContent":[null],"names":["SsrManifest","RouteAssets","static","config","pathNormalize","root","buildDir","manifestName","viteAliases","basename","renderBuiltUrl","constructor","super","path","resolve","getParams","isModulePreload","this","getVite","alias","PathNormalize","get","params","instance","isDev","Boolean","prepareDevAssets","routes","isSpa","vite","Promise","all","getDevRouteIds","map","async","id","file","findAppFile","transformRequest","visited","Set","visit","module","has","url","add","test","importedModules","getDevModules","getOutDir","getAssetsManifestFile","loadClientManifest","clientManifestDir","clientSsrManifest","fs","existsSync","result","JSON","parse","readFileSync","encoding","rmSync","readdirSync","length","recursive","getRoutesTreeIds","index","forEach","route","position","String","filter","join","routeId","import","getAppPath","children","Object","assign","getRouteAssets","manifest","isNested","assets","css","reduce","res","asset","type","getAssetType","isEntry","filename","posix","normalize","modifiedFilename","ssr","hostId","hostType","split","at","toLowerCase","weight","getAssetWeight","isPreload","imports","nestedAsset","nestedModule","buildRoutesManifest","routesService","ParseRoutes","routesPaths","postfixes","getImportPostfix","entries","routePath","routePostfix","find","postfix","undefined","routeMeta","sortAssets","values","json","stringify","writeFileSync","clientDir","getAssets","getAssetsDev","pathId","routeIds","pluginConfig","getPluginConfig","rootIds","clientFile","serverFile","modules","moduleId","ext","moduleGraph","getModuleById","push","getModuleAssets","scripts","flatMap","AssetType","script","skipModules","clientImportedModules","size","subModule","transformResult","includes","code","match","groups","style","content","console","warn","chalk","yellowBright","image","font"],"mappings":"+NAiCA,MAAMA,UAAoBC,EAIdC,gBAAsC,KAK7BC,OAKAC,cAKAC,KAKAC,SAKAC,aAAe,gBAKfC,YAKAC,SAKAC,eAKnB,WAAAC,CACER,GACAG,SAAEA,EAAQE,YAAEA,EAAWC,SAAEA,EAAQC,eAAEA,GAAuC,IAE1EE,MAAMC,EAAKC,QAAQX,EAAOY,YAAYV,KAAMC,GAAY,IAAKH,EAAOa,iBAEpEC,KAAKd,OAASA,EACdc,KAAKZ,KAAOF,EAAOY,YAAYV,KAC/BY,KAAKX,SAAWA,EAChBW,KAAKT,YAAcA,GAAeL,EAAOe,WAAWf,QAAQW,QAAQK,MACpEF,KAAKb,cAAgB,IAAIgB,EAAcjB,EAAQK,GAC/CS,KAAKR,SAAWA,EAChBQ,KAAKP,eAAiBA,CACxB,CAKO,UAAOW,CAAIlB,EAAsBmB,EAA6B,IAKnE,OAJ6B,OAAzBtB,EAAYuB,WACdvB,EAAYuB,SAAW,IAAIvB,EAAYG,EAAQmB,IAG1CtB,EAAYuB,QACrB,CAKA,SAAcC,GACZ,OAAOC,QAAQR,KAAKd,OAAOe,UAC7B,CAKO,sBAAMQ,CAAiBC,EAAiCC,GAAQ,GACrE,MAAMC,EAAOZ,KAAKd,OAAOe,UAEzB,IAAKW,EACH,OAGED,SAIIE,QAAQC,IACZd,KAAKe,eAAeL,GAAQM,IAAIC,MAAOC,IACrC,MAAMC,EAAOnB,KAAKb,cAAciC,YAAYF,GAExCC,SACIP,EAAKS,iBAAiB,QAAQF,QAM5C,MAAMG,EAAU,IAAIC,IAKdC,EAAQP,MAAOQ,IACfH,EAAQI,IAAID,EAAOE,OAIvBL,EAAQM,IAAIH,EAAOE,KAEfF,EAAON,MAAQ,mDAAmDU,KAAKJ,EAAON,aAC1EP,EAAKS,iBAAiBI,EAAOE,WAG/Bd,QAAQC,IAAI,IAAIW,EAAOK,iBAAiBd,IAAIQ,YAG9CX,QAAQC,IAAId,KAAK+B,cAAcrB,GAAQM,IAAIQ,GACnD,CAKU,SAAAQ,GACR,OAAOpC,EAAKC,QAAQG,KAAKZ,KAAMY,KAAKX,UAAY,GAClD,CAKU,qBAAA4C,GACR,MAAO,GAAGjC,KAAKgC,yCACjB,CAKU,kBAAAE,GACR,MAAMC,EAAoBvC,EAAKC,QAAQG,KAAKZ,KAAM,GAAGY,KAAKX,UAAY,mBAChE+C,EAAoB,GAAGD,KAAqBnC,KAAKV,eAEvD,IAAK+C,EAAGC,WAAWF,GACjB,MAAO,CAAA,EAGT,MAAMG,EAASC,KAAKC,MAClBJ,EAAGK,aAAaN,EAAmB,CAAEO,SAAU,WAUjD,OAPAN,EAAGO,OAAOR,GAGuC,IAA7CC,EAAGQ,YAAYV,GAAmBW,QACpCT,EAAGO,OAAOT,EAAmB,CAAEY,WAAW,IAGrCR,CACT,CAKU,gBAAAS,CACRtC,EACAuC,GAEA,MAAMV,EAA6C,CAAA,EAenD,OAbA7B,EAAOwC,QAASC,IACd,MAAMC,EAAW,CAACH,EAAOI,OAAOF,EAAMF,QAAQK,OAAO9C,SAAS+C,KAAK,KAC7DC,EAAUL,EAAMjC,IAAMkC,EAExBD,EAAMM,SACRlB,EAAOiB,GAAWxD,KAAKb,cAAcuE,WAAWP,EAAMM,SAGpDN,EAAMQ,SAASb,OAAS,GAC1Bc,OAAOC,OAAOtB,EAAQvC,KAAKgD,iBAAiBG,EAAMQ,SAAUP,MAIzDb,CACT,CAKU,cAAAuB,CACRC,EACAtC,EACAuC,GAAW,GAEX,MAEMC,EAFa,IAAKxC,GAAQwC,QAAU,MAASxC,GAAQyC,KAAO,GAAKzC,GAAQN,MAErDgD,OACxB,CAACC,EAAKC,KACJ,GAAIA,EAAO,CACT,MAAMC,EAAOtE,KAAKuE,aAAaF,GACzBG,EAAU/C,EAAO+C,SAAW/C,EAAON,OAASkD,EAGlD,GAAIC,EAAM,CACR,MAAMG,EAAW7E,EAAK8E,MAAMC,UAAU,GAAG3E,KAAKR,YAAY6E,KACpDO,EAAmB5E,KAAKP,iBAAiBgF,EAAU,CACvDH,KAAM,QACNO,KAAK,EACLC,OAAQ,GACRC,SAAUN,EAASO,MAAM,KAAKC,IAAG,IAAKC,gBAGxCd,EAAIC,GAAS,CACX1C,IAAiC,iBAArBiD,EAAgCA,EAAmBH,EAC/DU,OAAQX,EAAU,IAAMxE,KAAKoF,eAAef,GAC5CC,OACAN,WACAqB,WAAYb,EAEhB,CACF,CAEA,OAAOJ,GAET,CAAA,GAcF,OAVI3C,GAAQ6D,SAASxC,QACnBrB,EAAO6D,QAAQpC,QAASqC,IACtB,MAAMC,EAAezB,EAASwB,GAE1BC,GACF5B,OAAOC,OAAOI,EAAQjE,KAAK8D,eAAeC,EAAUyB,GAAc,MAKjEvB,CACT,CAKO,mBAAAwB,GACL,MAAM1B,EAAW/D,KAAKkC,qBAChBwD,EAAgB,IAAIC,EAAY3F,KAAKd,OAAQc,KAAKT,aAClDqG,EAAc5F,KAAKgD,iBAAiB0C,EAAcjD,SAElDoD,EAAY7F,KAAKb,cAAc2G,mBAC/BvD,EAAmC,CAAA,EAGzCqB,OAAOmC,QAAQH,GAAa1C,QAAQ,EAAEM,EAASwC,MAC7C,MAAMC,EAAeJ,EAAUK,KAAMC,QAGLC,IAAvBrC,EAFU,GAAGiC,IAAYG,MAK5BE,EAAYtC,EADA,GAAGiC,IAAYC,GAAgB,MAGjD1D,EAAOiB,GAAWxD,KAAKsG,WAAW1C,OAAO2C,OAAOvG,KAAK8D,eAAeC,EAAUsC,OAGhF,MAAMG,EAAOhE,KAAKiE,UAAUlE,EAAQ,KAAM,GAE1CF,EAAGqE,cAAc1G,KAAKiC,wBAAyBuE,EAAM,CAAE7D,SAAU,UACjE,MAAMgE,EAAY/G,EAAK2D,KAAKvD,KAAKgC,YAAa,UAG1CK,EAAGC,WAAWqE,IAChBtE,EAAGqE,cAAc9G,EAAK2D,KAAKoD,EAAW,wBAAyBH,EAAM,CAAE7D,SAAU,SAErF,CAKU,SAAAiE,CAAUlG,EAAiCC,GACnD,OAAOX,KAAKO,MAAQP,KAAK6G,aAAanG,EAAQC,GAAShB,MAAMiH,UAAUlG,EACzE,CAKU,cAAAK,CAAeL,GACvB,OACGA,GACGM,IAAI,EAAGmC,WAAYnD,KAAKb,cAAcuE,WAAYP,GAAuB2D,QAAQ,IAClFxD,OAAO9C,UAAyB,EAEvC,CAKU,aAAAuB,CAAcrB,GACtB,MAAMqG,EAAW/G,KAAKe,eAAeL,GAE/BmF,EAAY7F,KAAKb,cAAc2G,mBAC/BkB,EAAehH,KAAKd,OAAO+H,kBAC3BC,EAAU,CACdF,GAAcG,YAAc,YAC5BH,GAAcI,YAAc,aAC5BpG,IAAKG,GAASvB,EAAKC,QAAQG,KAAKZ,KAAM+B,IAClCkG,EAAwB,GAa9B,MAXA,IAAIH,KAAYH,GAAU7D,QAASoE,IACjC,IAAK,MAAMC,KAAO1B,EAAW,CAC3B,MAAMpE,EAASzB,KAAKd,OAAOe,WAAWuH,YAAYC,cAAc,GAAGH,IAAWC,KAE9E,GAAI9F,EAAQ,CACV4F,EAAQK,KAAKjG,GACb,KACF,CACF,IAGK4F,CACT,CAKU,YAAAR,CAAanG,EAAiCC,GAAQ,GAC9D,MAAMsD,EAASL,OAAOC,OACpB,CAAA,KACG7D,KAAK+B,cAAcrB,GAAQM,IAAKS,GAAWzB,KAAK2H,gBAAgBlG,KAM/DmG,EAAoBjH,EACtBX,KAAKe,eAAeL,GAAQmH,QAAS3G,IACnC,MAAMO,EAASzB,KAAKb,cACjB2G,mBACA9E,IAAKuG,GAAQvH,KAAKd,OAAOe,WAAWuH,YAAYC,cAAc,GAAGvG,IAAKqG,MACtErB,KAAK1F,SAER,OAAOiB,EACH,CACE,CACE6C,KAAMwD,EAAUC,OAChBpG,IAAKF,EAAOE,IACZwD,OAAQ,EACRnB,UAAU,EACVqB,WAAW,IAGf,KAEN,GAEJ,MAAO,IAAIzB,OAAO2C,OAAOtC,MAAY2D,EACvC,CAKU,eAAAD,CAAgBlG,EAAqBuG,EAA2B,IAAIzG,KAC5E,MAAM+D,EAAU7D,GAAQK,iBAAmBL,GAAQwG,sBAEnD,IAAK3C,GAAS4C,MAAQF,EAAYtG,IAAID,EAAQN,MAC5C,MAAO,CAAA,EAGT,IAAI8C,EAAkB,CAAA,EAsCtB,OApCA+D,EAAYpG,IAAIH,EAAQN,MAExBmE,EAAQpC,QAASiF,IACf,MAAMhH,KAAEA,EAAIiH,gBAAEA,GAAoBD,EAC5BZ,EAAMpG,GAAM6D,MAAM,KAAKC,OAE7B,GACE9D,GACAoG,GACA,CAAC,MAAO,OAAQ,OAAQ,OAAQ,OAAQ,SAAU,OAAQ,WAAWc,SAASd,GAC9E,CAEA,MAAMe,EAAOF,GAAiBE,KAAKC,MAAM,mCAAmCC,QAAQtE,IAEpF,GAAIoE,EACF,IACErE,EAAO9C,GAAQ,CACbmD,KAAMwD,EAAUW,MAChB9G,IAAKR,EACLgE,OAAQnF,KAAKoF,eAAejE,GAC5BuH,QAAUlG,KAAKC,MAAM,cAAc6F,OAAgCG,MACnEzE,SAAUxD,QAAQwH,EAAYE,MAC9B7C,WAAW,EAEf,CAAE,MACAsD,QAAQC,KAAKC,EAAMC,aAAa,0BAA2B3H,GAC7D,CAEJ,MACE8C,EAAS,IACJA,KACAjE,KAAK2H,gBAAgBQ,EAAWH,MAKlC/D,CACT,CAKU,cAAAmB,CAAef,GAGvB,OAFarE,KAAKuE,aAAaF,IAG7B,KAAKyD,EAAUW,MACb,OAAO,EAET,KAAKX,EAAUC,OACb,OAAO,EAET,QACE,OAAO,EAEb,CAKU,YAAAxD,CAAaF,GACrB,MAAMkD,EAAMlD,EAAMW,MAAM,KAAKC,IAAG,IAAKC,cAErC,OAAQqC,GACN,IAAK,MACL,IAAK,OACH,OAAOO,EAAUW,MAEnB,IAAK,KACH,OAAOX,EAAUC,OAEnB,IAAK,MACL,IAAK,MACL,IAAK,OACL,IAAK,MACL,IAAK,OACL,IAAK,MACL,IAAK,MACH,OAAOD,EAAUiB,MAEnB,IAAK,MACL,IAAK,MACL,IAAK,OACL,IAAK,QACH,OAAOjB,EAAUkB,KAEnB,QACE,OAAO,KAEb"}
|
|
@@ -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":"AAuCA,MAAMA,EAAyB,KAC7B,GAAIC,OAAOC,eACT,OAGF,MAAMC,EAA6B,CACjCC,OAAQ,GACRC,OAAQ,GACRC,MAAO,CAAA,EACPC,KAAM,IAAIC,UAENJ,OAAEA,EAAMC,OAAEA,EAAMC,MAAEA,EAAKC,KAAEA,GAASJ,EAExCF,OAAOC,eAAiBC,EAKxB,MAAMM,EAAS,CAACC,EAAuCC,KACrDP,EAAOQ,KAAK,CAAEF,QAAOG,GAAIC,YAAYC,cAAkBC,IAAPL,EAAmB,CAAA,EAAK,CAAEA,SAMtEM,EAAO,KACX,MAAMJ,EAAKC,YAAYC,MAEvB,IAAK,MAAMG,KAAWC,SAASC,iBAAiB,UAAW,CACzD,MAAMC,MAAEA,EAAKC,OAAEA,GAAWJ,EAAQK,yBAG/BL,EAAQM,QAAQ,sCACjBH,EAAQ,GACRC,EAAS,GACgC,WAAzCG,iBAAiBP,GAASQ,kBAEJV,IAAlBb,EAAMwB,UACRxB,EAAMwB,QAAUd,EAChBJ,EAAO,UAGJF,EAAKqB,IAAIV,IACZX,EAAKsB,IAAIX,EAASL,GAGxB,GAEe,IAAIiB,iBAAiBb,GAE7Bc,QAAQZ,SAAU,CAAEa,WAAW,EAAMC,SAAS,EAAMC,YAAY,IAEzE,MAAMC,EAAgBC,QAAQC,MAK9BD,QAAQC,MAAQ,IAAIC,KAClBjC,EAAOO,KAAK0B,EAAKC,IAAIC,QAAQC,KAAK,MAClCN,KAAiBG,IAMnBrC,OAAOyC,iBAAiB,QAAUC,GAAUtC,EAAOO,KAAK+B,EAAMC,UAK9D3C,OAAOyC,iBAAiB,qBAAuBC,GAC7CtC,EAAOO,KAAK4B,OAAOG,EAAME,UAM3B5C,OAAOyC,iBAAiB,yBAA2BC,IACjD,MAAMG,OAAEA,GAAYH,EAA0CI,OACxDC,EAAO7B,SAAS8B,eAAeH,GAEjCE,IACF1C,EAAMwC,GAAUE,EAAKE,WAGvBjC,IACAR,EAAO,kBAMTR,OAAOyC,iBAAiB,OAAQ,IAAMjC,EAAO,gBAAiB,CAAE0C,MAAM,IAEtE,MAAMC,EAAqB,GAC3B,IAAIC,EAAaC,MAAMC,UAAU3C,KACjC,MAAM4C,EAAW,IAAIC,QAGrBC,OAAOC,eAAeP,EAAO,OAAQ,CACnCQ,cAAc,EAKdC,IACE,IACA,IAAIC,KACF,IAAK,MAAMC,KAASD,EAAQ,CAC1B,GAAIN,EAAS5B,IAAImC,GACf,SAGFP,EAASQ,IAAID,GACb,MAAOrD,EAAOC,GAAMoD,EAEN,SAAVrD,GAA8B,YAAVA,GAAiC,WAAVA,GAC7CD,EAAOC,EAAqB,iBAAPC,EAAkBA,OAAKK,EAEhD,CAEA,OAAOqC,EAAWY,MAAMb,EAAOU,IAMnCjC,IAAMqC,IACJb,EAAaa,KAGjBC,QAAQtC,IAAI5B,OAAQ,mBAAoBmD,IAIpCgB,EAAoBC,IACxB,MAAMlE,EAAQF,OAAOC,eACf8C,EAAO7B,SAASmD,cAAcD,GAC9BE,EAAOvB,EAAO7C,GAAOG,MAAM0C,EAAKrC,SAAMK,EACtCwD,EAASrD,SAASsD,cAAc,OAEtCD,EAAOtB,UAAYqB,GAAQ,GAK3B,MAAMG,EAASxD,IACb,MAAMyD,EAAS,IAAIC,IAEnB,IAAK,MAAMC,IAAS,CAAC3D,KAAYA,EAAQE,iBAAiB,MAAO,CAC/D,GAAIyD,EAAMrD,QAAQ,qCAChB,SAGF,MAAMsD,EAAO,IAAID,EAAME,YACpBC,OAAQC,GAASA,EAAKC,WAAaC,KAAKC,WACxC7C,IAAK0C,GAASA,EAAKI,aACnB5C,KAAK,IACL6C,QAAQ,OAAQ,KAChBC,OAECT,GACFH,EAAO9C,IAAIiD,GAAOH,EAAOd,IAAIiB,IAAS,GAAK,EAE/C,CAEA,OAAOH,GAEHa,EAASd,EAAMF,GACfiB,EAAQzC,EAAO0B,EAAM1B,GAAQ,IAAI4B,IAKjCc,EAAe,CAACf,EAA6BG,KACjD,IAAIa,EAAQ,EAEZ,IAAK,MAAOC,EAAWC,KAAUlB,EAAQ,CAKvC,MAAMmB,EAASF,EAAUG,OAASjB,EAAKiB,OAEnCC,OAAOC,UAAUH,IAAWhB,EAAKoB,OAAOJ,KAAYF,IACtDD,GAASG,EAASD,EAEtB,CAEA,OAAOF,GAEHQ,EAAa,IAAIX,GACpBR,OAAO,EAAEF,KAAUY,EAAaD,EAAOX,GAAQY,EAAaF,EAAQV,IACpEvC,IAAI,EAAEuC,KAAUA,GACbsB,EAASpD,EAAO7B,SAASkF,iBAAiBrD,EAAMsD,WAAWC,mBAAgBvF,EACjF,IAAIwF,EAAU,EAEd,KAAOJ,GAAQK,YAC0B,OAAnCL,EAAOM,YAAYrB,aACrBmB,IAIJ,MAAO,CACLG,WAAgB3F,IAATuD,EACPqC,cAAiE5F,IAAvDmD,QAAQN,IAAI5D,OAAQ,+BAC9BuG,UACAL,aAKA9F,OACEF,GAAOE,OAAO2E,OAAQ3C,GACpB,2FAA2FwE,KACzFxE,KAEC"}
|
|
@@ -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":"+DAaA,MAAMA,EAAWC,IACf,MAAMC,EAAmB,GAKnBC,EAASC,IACT,YAAaA,GAAyB,WAAjBA,EAAKC,QAC5BH,EAAOI,KAAKF,EAAKG,WAAWC,IAAKC,GAAW,UAAWA,EAAQA,EAAMC,MAAQ,IAAKC,KAAK,KAC9E,eAAgBP,GACzBA,EAAKG,WAAWK,QAAQT,IAM5B,OAFAA,EAAMU,EAAMZ,IAELC,GAIHY,EAAgBb,IACpB,MAAMc,EAAyB,GAE/B,IAAK,MAAMC,KAAUhB,EAAQC,GAAO,CAClC,MAAMgB,EACJ,4HAEF,IAAK,MAAMC,KAASF,EAAOG,SAASF,GAAU,CAC5C,MAAMG,EAAiBC,KAAKR,MAAMK,EAAM,IAExC,IACGI,MAAMC,QAAQH,MAEC,UAAbA,EAAM,IAAmC,IAAjBA,EAAMI,QACjB,SAAbJ,EAAM,IACY,IAAjBA,EAAMI,QACc,iBAAbJ,EAAM,IACO,kBAAbA,EAAM,IACd,CAAC,UAAW,UAAUK,SAASL,EAAM,KACnB,IAAjBA,EAAMI,QACNE,OAAOC,UAAUP,EAAM,KACH,iBAAbA,EAAM,IAGjB,MAAM,IAAIQ,MAAM,mCAGlBb,EAAOT,KAAKc,EACd,CACF,CAEA,OAAOL,GAIT,MAAMc,EAQcC,GAJlB,WAAAC,CAIkBD,GAAAE,KAAAF,GAAAA,CACf,EAIL,MAAMpB,EAASuB,GACbC,EAAOD,EAAS,CAIdE,YAAa,EAAEL,KAAkB,IAAID,EAAYC,GAKjDM,WAAaC,GAAiCC,OAAOC,YAAYF,GAKjEG,UAAYH,IACV,MAAMI,EAAaH,OAAOC,YAAYF,GAChCK,EAAQJ,OAAOK,OAAO,IAAIf,MAAM,oCAAqCa,GAM3E,OAJKA,EAAWG,cACPF,EAAME,MAGRF,GAMTG,cAAe,SAIbC,EAAe7C,IACnB,MAAMc,EAASD,EAAab,GACtB8C,EAAUhC,EAAOiC,OAAQ5B,GAAuB,SAAbA,EAAM,IAE/C,IAAK2B,EAAQvB,OAAQ,CACnB,IAAK,MAAMR,KAAUhB,EAAQC,GAAO,CAClC,MAAMgD,EAASjC,EAAOE,MACpB,gFAGF,GAAI+B,EACF,OAAO5B,KAAKR,MAAMQ,KAAKR,MAAMoC,EAAO,IAExC,CAEA,MACF,CAEA,GAAuB,IAAnBF,EAAQvB,OACV,MAAM,IAAII,MAAM,8CAGlB,MAAMsB,EAAc,IAAIC,IAClBC,EAAW,IAAIC,IAErB,IAAK,MAAMjC,KAASL,EAClB,GAAiB,YAAbK,EAAM,IAAiC,WAAbA,EAAM,GAAiB,CACnD,GAAI8B,EAAYI,IAAIlC,EAAM,IACxB,MAAM,IAAIQ,MAAM,wCAAwCR,EAAM,OAGhE8B,EAAYK,IAAInC,EAAM,GAAIV,EAAMU,EAAM,KAErB,WAAbA,EAAM,IACRgC,EAASI,IAAIpC,EAAM,GAEvB,CAGF,MAAMqC,EAAU,IAAIC,QACdC,EAAY,IAAIN,IAChBO,EAAW,IAAIT,IAKfU,EAAWC,IACf,GAAIA,aAAgBjC,EAAa,CAC/B,MAAMC,GAAEA,GAAOgC,EAEf,IAAKZ,EAAYI,IAAIxB,GACnB,MAAM,IAAIF,MAAM,sCAAsCE,MAGxD,GAAIsB,EAASE,IAAIxB,GACf,MAAMoB,EAAYa,IAAIjC,GAGxB,GAAI6B,EAAUL,IAAIxB,GAChB,MAAM,IAAIF,MAAM,wBAAwBE,MAS1C,OANK8B,EAASN,IAAIxB,KAChB6B,EAAUH,IAAI1B,GACd8B,EAASL,IAAIzB,EAAI+B,EAAQX,EAAYa,IAAIjC,KACzC6B,EAAUK,OAAOlC,IAGZ8B,EAASG,IAAIjC,EACtB,CAEA,IAAKgC,GAAwB,iBAATA,GAAqBL,EAAQH,IAAIQ,GACnD,OAAOA,EAKT,GAFAL,EAAQD,IAAIM,GAERA,aAAgBX,IAAK,CACvB,MAAMd,EAAU,IAAKyB,GAErBA,EAAKG,QAKL5B,EAAQzB,QAAQ,EAAEsD,EAAKzD,KAAWqD,EAAKP,IAAIM,EAAQK,GAAML,EAAQpD,IACnE,MAAO,GAAIqD,aAAgBT,IAAK,CAC9B,MAAMhB,EAAU,IAAKyB,GAErBA,EAAKG,QAKL5B,EAAQzB,QAASH,GAAUqD,EAAKN,IAAIK,EAAQpD,IAC9C,MACE,IAAK,MAAMyD,KAAO5B,OAAO6B,KAAKL,GAC5BxB,OAAO8B,eAAeN,EAAMI,EAAK,CAC/BG,cAAc,EACdC,YAAY,EACZC,UAAU,EACV7D,MAAOmD,EAAQW,QAAQT,IAAID,EAAMI,MAKvC,OAAOJ,GAGT,OAAOD,EAAQnD,EAAMqC,EAAQ,GAAG"}
|
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
|