@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.
Files changed (91) hide show
  1. package/README.md +23 -0
  2. package/adapters/express/prepare-server.js +1 -1
  3. package/adapters/express/prepare-server.js.map +1 -1
  4. package/adapters/express/render.js +1 -1
  5. package/adapters/express/render.js.map +1 -1
  6. package/adapters/express/route-assets.d.ts +8 -0
  7. package/adapters/express/route-assets.js +2 -0
  8. package/adapters/express/route-assets.js.map +1 -0
  9. package/browser/entry.js.map +1 -1
  10. package/cli/commands.d.ts +1 -0
  11. package/cli/commands.js +2 -0
  12. package/cli/commands.js.map +1 -0
  13. package/cli/helpers/enable-shortcuts.d.ts +5 -0
  14. package/cli/helpers/enable-shortcuts.js +2 -0
  15. package/cli/helpers/enable-shortcuts.js.map +1 -0
  16. package/cli/run-prod.js +1 -1
  17. package/cli/run-prod.js.map +1 -1
  18. package/cli/start.d.ts +10 -0
  19. package/cli/start.js +2 -0
  20. package/cli/start.js.map +1 -0
  21. package/cli.js +1 -1
  22. package/cli.js.map +1 -1
  23. package/cloudflare.d.ts +5 -3
  24. package/cloudflare.js +1 -1
  25. package/cloudflare.js.map +1 -1
  26. package/core/cache-control.d.ts +4 -0
  27. package/core/cache-control.js +1 -1
  28. package/core/cache-control.js.map +1 -1
  29. package/core/conditional-request.d.ts +2 -1
  30. package/core/conditional-request.js +1 -1
  31. package/core/conditional-request.js.map +1 -1
  32. package/core/copy-loader-headers.d.ts +1 -1
  33. package/core/copy-loader-headers.js +1 -1
  34. package/core/copy-loader-headers.js.map +1 -1
  35. package/core/document-headers.js +1 -1
  36. package/core/document-headers.js.map +1 -1
  37. package/core/handler.js +1 -1
  38. package/core/handler.js.map +1 -1
  39. package/core/render.js +1 -1
  40. package/core/render.js.map +1 -1
  41. package/core/spa-html.js.map +1 -1
  42. package/core/spa-shell.js +1 -1
  43. package/core/spa-shell.js.map +1 -1
  44. package/core/ssr-policy.d.ts +37 -4
  45. package/core/ssr-policy.js +1 -1
  46. package/core/ssr-policy.js.map +1 -1
  47. package/helpers/print-server-info.js +1 -1
  48. package/helpers/print-server-info.js.map +1 -1
  49. package/http.d.ts +12 -0
  50. package/node/production.d.ts +3 -3
  51. package/package.json +5 -3
  52. package/services/build.d.ts +4 -0
  53. package/services/build.js +1 -1
  54. package/services/build.js.map +1 -1
  55. package/services/diagnostics.d.ts +18 -1
  56. package/services/diagnostics.js.map +1 -1
  57. package/services/production-config.d.ts +15 -0
  58. package/services/production-config.js +2 -0
  59. package/services/production-config.js.map +1 -0
  60. package/services/request-timeline.d.ts +31 -2
  61. package/services/request-timeline.js +1 -1
  62. package/services/request-timeline.js.map +1 -1
  63. package/services/route-asset-preparer.js.map +1 -1
  64. package/services/route-assets-memory.d.ts +20 -8
  65. package/services/route-assets-memory.js +1 -1
  66. package/services/route-assets-memory.js.map +1 -1
  67. package/services/server-config.d.ts +1 -0
  68. package/services/server-config.js +1 -1
  69. package/services/server-config.js.map +1 -1
  70. package/services/ssr-manifest.d.ts +4 -4
  71. package/services/ssr-manifest.js +1 -1
  72. package/services/ssr-manifest.js.map +1 -1
  73. package/testing/browser-observer.d.ts +13 -7
  74. package/testing/browser-observer.js +1 -1
  75. package/testing/browser-observer.js.map +1 -1
  76. package/testing/create-handler.d.ts +1 -0
  77. package/testing/create-handler.js.map +1 -1
  78. package/testing/deferred.js.map +1 -1
  79. package/testing/edge.d.ts +12 -0
  80. package/testing/edge.js.map +1 -1
  81. package/testing/parse-response.js.map +1 -1
  82. package/testing/playwright.d.ts +2 -0
  83. package/testing/playwright.js +1 -1
  84. package/testing/playwright.js.map +1 -1
  85. package/testing/requests.d.ts +3 -0
  86. package/testing/requests.js.map +1 -1
  87. package/testing/response.d.ts +49 -3
  88. package/testing/response.js +1 -1
  89. package/testing/response.js.map +1 -1
  90. package/testing.d.ts +12 -0
  91. 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 t=class{modulePreload;routesAssets;constructor(e,t=!1){this.routesAssets=e,this.modulePreload=t}get isDev(){return!1}loadAssetsManifest(){return this.routesAssets??{}}sortAssets(e){return e.sort((e,t)=>e.weight===t.weight?Number(e.isNested)-Number(t.isNested):e.weight-t.weight)}getAssets(e,t){const s=e?.map(({route:e})=>e.id).filter(Boolean)??[];if(!s.length)return[];const r=this.loadAssetsManifest();return this.sortAssets(s.map(e=>r[e]).flat().filter(Boolean))}getEarlyHints(e){const t=new Headers;return e.forEach(({type:e,url:s})=>{e&&["style","script"].includes(e)&&t.append("Link",`<${s}>; rel=preload; as=${e}`)}),t}injectAssets({routerContext:e,matches:t,html:s,isSpa:r},i=!0){const l=this.getAssets(t??e?.matches,r),n=l.map(({type:e,url:t,isPreload:s,content:i=""})=>{switch(e){case"style":return this.isDev?`<style data-vite-dev-id="${t}">${i}</style>`:`<link rel="stylesheet" href="${t}">`;case"script":return s?this.modulePreload||r?`<link rel="modulepreload" as="script" crossorigin href="${t}">`:null:`<script async type="module" crossorigin src="${t}"><\/script>`}return null}).filter(Boolean);return s.header=s.header.replace("</head>",`${n.join("\n")}</head>`),i?this.getEarlyHints(l):new Headers}};export{e as AssetType,t as default};
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","loadAssetsManifest","sortAssets","assets","sort","a","b","weight","Number","isNested","getAssets","routes","_isSpa","routeIds","map","route","id","filter","Boolean","length","routeId","flat","getEarlyHints","headers","Headers","forEach","type","url","includes","append","injectAssets","routerContext","matches","html","isSpa","earlyHints","htmlAssets","isPreload","content","header","replace","join"],"mappings":"AAEA,IAAKA,GAAL,SAAKA,GACHA,EAAA,MAAA,QACAA,EAAA,OAAA,SACAA,EAAA,MAAA,QACAA,EAAA,KAAA,MACD,CALD,CAAKA,IAAAA,EAAS,CAAA,IAiCd,IAAAC,EAAA,MACqBC,cAETC,aAEV,WAAAC,CAAYC,EAAgCH,GAAgB,GAC1DI,KAAKH,aAAeE,EACpBC,KAAKJ,cAAgBA,CACvB,CAKA,SAAcK,GACZ,OAAO,CACT,CAKU,kBAAAC,GACR,OAAOF,KAAKH,cAAgB,CAAA,CAC9B,CAKU,UAAAM,CAAWC,GACnB,OAAOA,EAAOC,KAAK,CAACC,EAAGC,IACrBD,EAAEE,SAAWD,EAAEC,OAASC,OAAOH,EAAEI,UAAYD,OAAOF,EAAEG,UAAYJ,EAAEE,OAASD,EAAEC,OAEnF,CAOU,SAAAG,CAAUC,EAAiCC,GACnD,MAAMC,EAAWF,GAAQG,IAAI,EAAGC,WAAYA,EAAMC,IAAIC,OAAOC,UAAY,GAEzE,IAAKL,EAASM,OACZ,MAAO,GAGT,MAAMvB,EAAeG,KAAKE,qBAE1B,OAAOF,KAAKG,WACVW,EACGC,IAAKM,GAAYxB,EAAawB,IAC9BC,OACAJ,OAAOC,SAEd,CAKO,aAAAI,CAAcnB,GACnB,MAAMoB,EAAU,IAAIC,QAUpB,OARArB,EAAOsB,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,MAAMhC,EAASJ,KAAKW,UAAUsB,GAAWD,GAAeC,QAASE,GAC3DE,EAAajC,EAChBW,IAAI,EAAGY,OAAMC,MAAKU,YAAWC,UAAU,OACtC,OAAQZ,GACN,IAAK,QACH,OAAO3B,KAAKC,MACR,4BAA4B2B,MAAQW,YACpC,gCAAgCX,MAEtC,IAAK,SACH,OAAOU,EACHtC,KAAKJ,eAAiBuC,EAEpB,2DAA2DP,MAC3D,KACF,gDAAgDA,gBAGxD,OAAO,OAERV,OAAOC,SAIV,OAFAe,EAAKM,OAASN,EAAKM,OAAOC,QAAQ,UAAW,GAAGJ,EAAWK,KAAK,gBAEzDN,EAAapC,KAAKuB,cAAcnB,GAAU,IAAIqB,OACvD"}
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"}
@@ -11,6 +11,7 @@ interface IConfigOptions {
11
11
  }
12
12
  interface IConfigParams {
13
13
  root: string;
14
+ base: string;
14
15
  publicDir: string;
15
16
  pluginPath: string;
16
17
  isProd: boolean;
@@ -1,2 +1,2 @@
1
- import t from"node:fs";import i from"node:path";import e from"../helpers/plugin-config.js";import r from"./logger.js";class s{isProd;isHost;isModulePreload;mode;entrypointName;vite;app;params;defaultParams;logger;defaultBuildRoots=["./build","./dist"];constructor({entrypointName:t,isProd:i=!1,isHost:e=!1,isOnlyClient:r=!1,isModulePreload:s=!1,mode:o="production"},n){this.isProd=i,this.isHost=e,this.isModulePreload=s,this.mode=o,this.entrypointName=t,this.defaultParams={publicDir:"/client",indexFile:"/client/index.html",serverFile:"/server/server.js",host:"127.0.0.1",isSPA:r,...n},this.makeParams()}static init(t={},i={}){return new s(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:s,publicDir:o,indexFile:n,clientFile:l,serverFile:a,host:p,isSPA:h}=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??p,f=Number(e?.env.VITE_PORT??e?.server.port??this.defaultParams.port);this.params={root:e?.root??this.getBuildDir(s),publicDir:e?.publicDir??o,indexFile:t.indexFile??n,clientFile:t.clientFile??l,serverFile:t.serverFile??a,pluginPath:d,host:m,port:f,isSPA:u?"spa"===u.type:h,isProd:this.isProd},this.logger=this.vite?.config.logger??new r}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{s as default};
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":"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"}
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
  */
@@ -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}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))}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};
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","routes","index","forEach","route","position","String","filter","join","routeId","id","import","getAppPath","children","Object","assign","getRouteAssets","manifest","module","isNested","assets","css","file","reduce","res","asset","type","getAssetType","isEntry","filename","posix","normalize","modifiedFilename","ssr","hostId","hostType","split","at","toLowerCase","url","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","isSpa","getAssetsDev","getDevRouteIds","map","pathId","getDevModules","routeIds","pluginConfig","getPluginConfig","rootIds","clientFile","serverFile","modules","moduleId","ext","moduleGraph","getModuleById","push","prepareDevAssets","vite","Promise","all","async","findAppFile","transformRequest","visited","Set","visit","has","add","test","importedModules","getModuleAssets","scripts","flatMap","AssetType","script","skipModules","clientImportedModules","size","subModule","transformResult","includes","code","match","groups","style","content","console","warn","chalk","yellowBright","image","font"],"mappings":"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"}
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":"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"}
@@ -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 t=(t,o)=>{e.events.push({stage:t,at:performance.now(),...void 0===o?{}:{id:o}})},o=()=>{const o=performance.now();for(const r of document.querySelectorAll("body *")){const n=r.getBoundingClientRect();!r.closest("script, style, template, [hidden]")&&n.width>0&&n.height>0&&"hidden"!==getComputedStyle(r).visibility&&(void 0===e.shellAt&&(e.shellAt=o,t("shell")),e.seen.has(r)||e.seen.set(r,o))}};new MutationObserver(o).observe(document,{childList:!0,subtree:!0,attributes:!0});const r=console.error;console.error=(...t)=>{e.errors.push(t.map(String).join(" ")),r(...t)},window.addEventListener("error",t=>e.errors.push(t.message)),window.addEventListener("unhandledrejection",t=>e.errors.push(String(t.reason))),window.addEventListener("ssr-boost:router-ready",r=>{const{rootId:n}=r.detail,s=document.getElementById(n);s&&(e.roots[n]=s.innerHTML),o(),t("router.ready")}),window.addEventListener("load",()=>t("response.end"),{once:!0});const n=[];let s=Array.prototype.push;const d=new WeakSet;Object.defineProperty(n,"push",{configurable:!0,get:()=>(...e)=>{for(const o of e){if(d.has(o))continue;d.add(o);const[e,r]=o;"init"!==e&&"resolve"!==e&&"reject"!==e||t(e,"number"==typeof r?r:void 0)}return s.apply(n,e)},set:e=>{s=e}}),Reflect.set(window,"__ssrBoostStream",n)},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};
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","rect","getBoundingClientRect","closest","width","height","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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"}
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":"mLAmCA,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,EACJ,MAAMC,EAAUC,SACV,cAAed,GACjBY,IAAcf,EAAUG,UAEVY,MAGT,IAAKZ,GAGd,MAAO,CACLe,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,EACJ,MAAMC,EAAU,IAAIC,QAAe,CAACC,EAAGC,KACrCJ,EAAcI,IAEVC,EAAU,IAAYL,EAAYR,EAASc,QAC3CC,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,kEAGvBhB,EAAQiB,WACN,IACE/B,EAAWgC,MACT,IAAIC,aAAa,4BAA4BlD,MAAa,iBAE9DA,EAEJ,CAEA,IACEyB,EAAS0B,iBACT,MAqBMC,EArBQC,EACZ,CACEhD,UACAR,iBACAyD,UAAW,CAACC,EAAUC,IACpB9D,EAAM+D,EAAAC,cAAChE,EAAG,CAACiE,OAAQH,EAAQI,UAAWL,GAAkBA,GAE5D,IACKnD,EACHI,UACAN,UAAY2D,MACP7B,YAAa6B,EAAOL,SACvBtD,IAAY2D,IAEd1D,cAAeM,MAAOoD,IACpB,MAAMC,QAAe3D,IAAgB0D,IAErC,YAAoBxC,IAAbT,EAA0BkD,GAAU,CAAA,EAAM,IAAKA,EAAQlD,cAIpDF,CAAMkB,GAGjBwB,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"}
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"}
@@ -1 +1 @@
1
- {"version":3,"file":"deferred.js","sources":["../../src/testing/deferred.ts"],"sourcesContent":[null],"names":["createDeferred","resolve","reject","promise","Promise","res","rej","catch"],"mappings":"AAOA,MAAMA,EAAiB,KACrB,IAAIC,EACAC,EACJ,MAAMC,EAAU,IAAIC,QAAW,CAACC,EAAKC,KACnCL,EAAUI,EACVH,EAASI,IAMX,OAFKH,EAAQI,MAAM,QAEZ,CAAEJ,UAASF,UAASC"}
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';
@@ -1 +1 @@
1
- {"version":3,"file":"edge.js","sources":["../../src/testing/edge.ts"],"sourcesContent":[null],"names":["createTestHandler","testHandlerFactory","renderToStream","Error"],"mappings":"+OAGA,MAAMA,EAAoBC,EAAmBC,EAAgB,KAC3D,MAAM,IAAIC,MAAM"}
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":"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"}
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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"}
@@ -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 {
@@ -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 i=await e.evaluate(t,o);r(i.consumed,"Router hydration state was not consumed.").toBe(!0),r(i.errors,"React reported hydration errors.").toEqual([]),r(i.duplicates,"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 r=await s.evaluate(e=>({shell:window.__ssrBoostTest?.shellAt,element:window.__ssrBoostTest?.seen.get(e)}));o(r.shell,"No server shell was observed.").toBeDefined(),o(r.element,"The element was not observed during this navigation.").toBeDefined(),o(r.element,"The element must appear after the shell.").toBeGreaterThan(r.shell)};export{o as collectStreamTimeline,s as expectHydrated,r as expectStreamed};
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","result","consumed","errors","toEqual","duplicates","expectStreamed","selector","element","locator","toBeVisible","timing","node","shell","shellAt","seen","get","toBeDefined","toBeGreaterThan"],"mappings":"qFAaA,MAAMA,EAAY,IAAIC,QAGhBC,EAAwBC,MAAOC,IAC9BJ,EAAUK,IAAID,WACXA,EAAKE,cAAcC,GACzBP,EAAUQ,IAAIJ,IAGT,CACLK,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,SACnFD,EACHE,KAAKhB,gBAAmBC,EAAKM,SAASU,EAAkBL,IAAOM,MAAO,CACrEL,UACAM,QAAS,kCAAkCP,wCAE5CG,MAAK,SACFd,EAAKmB,iBAAiB,OAAQ,CAAEP,kBAChCC,EACHE,KAAKhB,gBAAmBC,EAAKM,SAASU,EAAkBL,IAAOS,QAAS,CACvER,UACAM,QAAS,iDAEVJ,KAAK,SACFd,EAAKM,SACT,IACE,IAAIe,QAAeC,IACjBC,sBAAsB,IAAMA,sBAAsB,IAAMD,SAG9D,MAAME,QAAexB,EAAKM,SAASU,EAAkBL,GAErDE,EAAOW,EAAOC,SAAU,4CAA4CX,MAAK,GACzED,EAAOW,EAAOE,OAAQ,oCAAoCC,QAAQ,IAClEd,EAAOW,EAAOI,WAAY,gDAAgDD,QAAQ,KAI9EE,EAAiB9B,MAAOC,EAAY8B,KACxC,MAAMjB,OAAEA,gBAAwB,qBAEhCA,EAAOjB,EAAUK,IAAID,GAAO,wDAAwDc,MAAK,GACzF,MAAMiB,EAAU/B,EAAKgC,QAAQF,SAEvBjB,EAAOkB,GAASE,cACtB,MAAMC,QAAeH,EAAQzB,SAAU6B,IAAI,CACzCC,MAAO7B,OAAOC,gBAAgB6B,QAC9BN,QAASxB,OAAOC,gBAAgB8B,KAAKC,IAAIJ,MAG3CtB,EAAOqB,EAAOE,MAAO,iCAAiCI,cACtD3B,EAAOqB,EAAOH,QAAS,wDAAwDS,cAC/E3B,EAAOqB,EAAOH,QAAU,4CAA4CU,gBAClEP,EAAOE"}
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"}
@@ -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;
@@ -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":"AAAA,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"}
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"}
@@ -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
- constructor(response: Response, options?: ITestResponseOptions);
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
- /** Decode incrementally so multibyte characters survive arbitrary transport cuts. */
31
- protected read(): Promise<void>;
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;
@@ -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 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 r=await t.read();s?.throwIfAborted();const a=r.done?e.decode():e.decode(r.value,{stream:!0});if(a&&this.parts.push({text:a,at:performance.now()-this.started}),r.done)break}}catch(e){throw await(t?.cancel(e).catch(()=>{})),e}finally{t?.releaseLock(),s?.removeEventListener("abort",a),r?.()}}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()]}))}})}}export{s as default};
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