@lomray/vite-ssr-boost 8.4.0-beta.4 → 8.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +23 -0
- package/adapters/express/render.js +1 -1
- package/adapters/express/render.js.map +1 -1
- package/browser/entry.js.map +1 -1
- package/cloudflare.d.ts +5 -3
- package/cloudflare.js +1 -1
- package/cloudflare.js.map +1 -1
- package/core/cache-control.d.ts +4 -0
- package/core/cache-control.js +1 -1
- package/core/cache-control.js.map +1 -1
- package/core/conditional-request.d.ts +2 -1
- package/core/conditional-request.js +1 -1
- package/core/conditional-request.js.map +1 -1
- package/core/copy-loader-headers.d.ts +1 -1
- package/core/copy-loader-headers.js +1 -1
- package/core/copy-loader-headers.js.map +1 -1
- package/core/document-headers.js +1 -1
- package/core/document-headers.js.map +1 -1
- package/core/handler.js +1 -1
- package/core/handler.js.map +1 -1
- package/core/render.js +1 -1
- package/core/render.js.map +1 -1
- package/core/spa-html.js.map +1 -1
- package/core/spa-shell.js +1 -1
- package/core/spa-shell.js.map +1 -1
- package/core/ssr-policy.d.ts +37 -4
- package/core/ssr-policy.js +1 -1
- package/core/ssr-policy.js.map +1 -1
- package/http.d.ts +12 -0
- package/node/production.d.ts +3 -3
- package/package.json +5 -3
- package/services/diagnostics.d.ts +18 -1
- package/services/diagnostics.js.map +1 -1
- package/services/request-timeline.d.ts +31 -2
- package/services/request-timeline.js +1 -1
- package/services/request-timeline.js.map +1 -1
- package/services/route-asset-preparer.js.map +1 -1
- package/services/route-assets-memory.d.ts +20 -8
- package/services/route-assets-memory.js +1 -1
- package/services/route-assets-memory.js.map +1 -1
- package/services/ssr-manifest.d.ts +4 -4
- package/services/ssr-manifest.js +1 -1
- package/services/ssr-manifest.js.map +1 -1
- package/testing/browser-observer.d.ts +13 -7
- package/testing/browser-observer.js +1 -1
- package/testing/browser-observer.js.map +1 -1
- package/testing/create-handler.d.ts +1 -0
- package/testing/create-handler.js.map +1 -1
- package/testing/deferred.js.map +1 -1
- package/testing/edge.d.ts +12 -0
- package/testing/edge.js.map +1 -1
- package/testing/parse-response.js.map +1 -1
- package/testing/playwright.d.ts +2 -0
- package/testing/playwright.js +1 -1
- package/testing/playwright.js.map +1 -1
- package/testing/requests.d.ts +3 -0
- package/testing/requests.js.map +1 -1
- package/testing/response.d.ts +49 -3
- package/testing/response.js +1 -1
- package/testing/response.js.map +1 -1
- package/testing.d.ts +12 -0
- package/testing.js.map +1 -1
package/http.d.ts
CHANGED
|
@@ -1,7 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Server-only HTTP helpers use Fetch primitives and can also run on the edge.
|
|
3
|
+
*/
|
|
1
4
|
export { default as cacheControl } from './core/cache-control.js';
|
|
2
5
|
export type { ICachePolicy } from './core/cache-control.js';
|
|
6
|
+
/**
|
|
7
|
+
* Evaluate conditional requests against application-supplied validators.
|
|
8
|
+
*/
|
|
3
9
|
export { default as conditionalRequest } from './core/conditional-request.js';
|
|
4
10
|
export type { IConditionalValidators } from './core/conditional-request.js';
|
|
11
|
+
/**
|
|
12
|
+
* Copy explicitly allowed loader and action headers to a document response.
|
|
13
|
+
*/
|
|
5
14
|
export { default as copyLoaderHeaders } from './core/copy-loader-headers.js';
|
|
15
|
+
/**
|
|
16
|
+
* Apply document header rules with credential protection.
|
|
17
|
+
*/
|
|
6
18
|
export { default as documentHeaders } from './core/document-headers.js';
|
|
7
19
|
export type { IDocumentHeaderContext, IDocumentHeaderRule, IDocumentHeadersOptions, IDocumentRuleContext, } from './core/document-headers.js';
|
package/node/production.d.ts
CHANGED
|
@@ -4,7 +4,7 @@ interface ILoadHtmlShellOptions {
|
|
|
4
4
|
indexFile: string;
|
|
5
5
|
outlet?: string;
|
|
6
6
|
}
|
|
7
|
-
type
|
|
7
|
+
type TRouteAssetPreparerOptions = ({
|
|
8
8
|
buildDir: string;
|
|
9
9
|
manifest?: never;
|
|
10
10
|
} | {
|
|
@@ -20,6 +20,6 @@ declare const loadHtmlShell: ({ indexFile, outlet, }: ILoadHtmlShellOptions) =>
|
|
|
20
20
|
/**
|
|
21
21
|
* Inject matched route assets using a manifest cache owned by this preparer.
|
|
22
22
|
*/
|
|
23
|
-
declare const createRouteAssetPreparer: <TAppProps = Record<string, any>>({ buildDir, manifest, modulePreload, }:
|
|
23
|
+
declare const createRouteAssetPreparer: <TAppProps = Record<string, any>>({ buildDir, manifest, modulePreload, }: TRouteAssetPreparerOptions) => NonNullable<ICreateHandlerOptions<TAppProps>["prepare"]>;
|
|
24
24
|
export { createRouteAssetPreparer, loadHtmlShell };
|
|
25
|
-
export type { IHtmlShell, ILoadHtmlShellOptions, IRouteAssetPreparerOptions, TRouteAssetsManifest };
|
|
25
|
+
export type { IHtmlShell, ILoadHtmlShellOptions, TRouteAssetPreparerOptions as IRouteAssetPreparerOptions, TRouteAssetsManifest, };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lomray/vite-ssr-boost",
|
|
3
|
-
"version": "8.4.0
|
|
3
|
+
"version": "8.4.0",
|
|
4
4
|
"description": "SSR and streaming for existing Vite + React Router apps in Data mode, without Framework mode",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
@@ -95,7 +95,8 @@
|
|
|
95
95
|
"test:coverage": "vitest run --coverage",
|
|
96
96
|
"test:browser": "playwright test --config playwright.config.mjs",
|
|
97
97
|
"test:worker:packed": "node scripts/test-packed-worker.mjs",
|
|
98
|
-
"test:worker:browser": "playwright test --config playwright.worker.config.mjs"
|
|
98
|
+
"test:worker:browser": "playwright test --config playwright.worker.config.mjs",
|
|
99
|
+
"test:skills": "node scripts/test-skills.mjs"
|
|
99
100
|
},
|
|
100
101
|
"dependencies": {
|
|
101
102
|
"chalk": "^6.0.0",
|
|
@@ -168,7 +169,8 @@
|
|
|
168
169
|
"vite": "^8.2.2",
|
|
169
170
|
"vitepress": "^1.6.4",
|
|
170
171
|
"vitest": "^5.0.0",
|
|
171
|
-
"wrangler": "^4.129.0"
|
|
172
|
+
"wrangler": "^4.129.0",
|
|
173
|
+
"yaml": "^2.9.0"
|
|
172
174
|
},
|
|
173
175
|
"peerDependencies": {
|
|
174
176
|
"@babel/generator": ">=7.23.0",
|
|
@@ -26,10 +26,27 @@ declare const walkSerializable: (value: unknown, report: (issue: ISerializationI
|
|
|
26
26
|
* Inspect one development response while allowing every chunk to stream immediately.
|
|
27
27
|
*/
|
|
28
28
|
declare class Diagnostics {
|
|
29
|
+
/**
|
|
30
|
+
* Identify the route in request diagnostics.
|
|
31
|
+
*/
|
|
29
32
|
protected readonly route: string;
|
|
33
|
+
/**
|
|
34
|
+
* Deliver warnings and optional policy decisions through the runtime logger.
|
|
35
|
+
*/
|
|
30
36
|
protected readonly logger: Pick<Logger, 'warn'> & Partial<Pick<Logger, 'info'>>;
|
|
31
37
|
protected chunks: string[];
|
|
32
|
-
|
|
38
|
+
/**
|
|
39
|
+
* Attach route context and the logger used for request diagnostics.
|
|
40
|
+
*/
|
|
41
|
+
constructor(
|
|
42
|
+
/**
|
|
43
|
+
* Identify the route in request diagnostics.
|
|
44
|
+
*/
|
|
45
|
+
route: string,
|
|
46
|
+
/**
|
|
47
|
+
* Deliver warnings and optional policy decisions through the runtime logger.
|
|
48
|
+
*/
|
|
49
|
+
logger?: Pick<Logger, 'warn'> & Partial<Pick<Logger, 'info'>>);
|
|
33
50
|
/**
|
|
34
51
|
* Emit each concrete message once per process, including across handler instances.
|
|
35
52
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diagnostics.js","sources":["../../src/services/diagnostics.ts"],"sourcesContent":[null],"names":["OUTLET","HYDRATION","warnedKey","Symbol","for","registry","globalThis","isDiagnosticsEnabled","enabled","env","process","undefined","SSR_BOOST_DIAGNOSTICS","NODE_ENV","formatDiagnostic","code","sentence","toLowerCase","splitHtmlShell","html","file","outlet","parts","split","length","Error","JSON","stringify","valueType","value","bigint","symbol","prototype","Object","getPrototypeOf","name","constructor","walkSerializable","report","path","ancestors","Set","streamed","type","Promise","Date","RegExp","reason","object","Map","Array","isArray","has","add","entries","flatMap","key","child","index","map","String","suffix","test","delete","Diagnostics","route","logger","chunks","Logger","this","warn","detail","message","warned","deprecatedReqRes","policyDecision","pattern","mode","source","reported","info","policyUnmatched","inspectShell","header","footer","includes","inspectCachePolicy","headers","hasSessionCookie","get","inspectRouterState","loaderData","actionData","kind","data","streamAborted","count","inspectStreamValue","id","inspectState","state","inspectOnResponse","append","push","complete","join","markers","marker","set","markup","replace","_tag","opening","content","match","matchAll","attribute","total"],"mappings":"2BAqBA,MAAMA,EAAS,0BACTC,EAAY,qCACZC,EAAYC,OAAOC,IAAI,sCAEvBC,EAAWC,WAKXC,EAAwBC,IAC5B,MAAMC,EAAyB,oBAAZC,aAA0BC,EAAYD,QAAQD,IAEjE,MAAmC,MAA/BA,GAAKG,uBAAgE,MAA/BH,GAAKG,sBACR,MAA9BH,EAAIG,sBAGNJ,GAA6B,eAAlBC,GAAKI,UAMnBC,EAAmB,CAACC,EAAuBC,IAC/C,eAAeD,MAASC,gFAAuFD,EAAKE,gBAKhHC,EAAiB,CAACC,EAAcC,EAAcC,EAASrB,KAC3D,MAAMsB,EAAQH,EAAKI,MAAMF,GAEzB,IAAKA,GAA2B,IAAjBC,EAAME,OACnB,MAAM,IAAIC,MACRX,EACE,2BACA,yBAAyBY,KAAKC,UAAUP,6CAAgDM,KAAKC,UAAUN,QAK7G,OAAOC,GAMHM,EAAaC,IACjB,GAAc,OAAVA,EACF,MAAO,OAGT,GAAqB,iBAAVA,EAAoB,CAG7B,MAFsC,CAAEC,OAAQ,SAAUC,OAAQ,iBAE9CF,WAAiBA,CACvC,CAEA,MAAMG,EAAYC,OAAOC,eAAeL,GAClCM,EAAOH,GAAWI,aAAaD,KAErC,MAAuB,iBAATA,GAAqBA,EAAOA,EAAO,UAO7CE,EAAmB,CACvBR,EACAS,EACAC,EAAO,IACPC,EAAY,IAAIC,IAChBC,GAAW,KAEX,MAAMC,SAAcd,EAEpB,GACEa,IACCb,aAAiBe,SAChBf,aAAiBgB,MACjBhB,aAAiBiB,QACR,WAATH,GAEF,OAGF,GAAa,aAATA,GAAgC,WAATA,GAA8B,WAATA,EAG9C,YAFAL,EAAO,CAAEC,OAAMQ,OAAQ,GAAGnB,EAAUC,gCAKtC,GAAc,OAAVA,GAA2B,WAATc,EACpB,OAGF,MAAMK,EAASnB,EACTG,EAAqBC,OAAOC,eAAec,GAEjD,KACIN,IAAaM,aAAkBC,KAAOD,aAAkBP,MAC1DT,IAAcC,OAAOD,WACP,OAAdA,GACEkB,MAAMC,QAAQH,IAAWhB,IAAckB,MAAMlB,WAC/C,CACA,MAAMG,EAAOP,EAAUoB,GAOvB,YALAV,EAAO,CACLC,OACAQ,OAAiB,SAATZ,EAAkB,4BAA8B,GAAGA,8BAI/D,CAEA,GAAIK,EAAUY,IAAIJ,GAGhB,YAFAV,EAAO,CAAEC,OAAMQ,OAAQ,kDAKzBP,EAAUa,IAAIL,GAEd,MAAMM,EACJZ,GAAYM,aAAkBC,IAC1B,IAAKD,GAAkCO,QAAQ,EAAEC,EAAKC,GAAQC,IAAU,CACtE,CAAC,GAAGA,QAAaF,GACjB,CAAC,GAAGE,UAAeD,KAErBf,GAAYM,aAAkBP,IAC5B,IAAKO,GAAyBW,IAAI,CAACF,EAAOC,IAAU,CAACE,OAAOF,GAAQD,IACpExB,OAAOqB,QAAQN,GAEvB,IAAK,MAAOQ,EAAKC,KAAUH,EAAgC,CACzD,MAAMO,EACJX,MAAMC,QAAQH,IAAW,iBAAiBc,KAAKN,GAC3C,IAAIA,KACJ,qBAAqBM,KAAKN,GACxB,IAAIA,IACJ,IAAI9B,KAAKC,UAAU6B,MAE3BnB,EAAiBoB,EAAOnB,EAAQC,EAAOsB,EAAQrB,EAAWE,EAC5D,CAEAF,EAAUuB,OAAOf,IAMnB,MAAMgB,
|
|
1
|
+
{"version":3,"file":"diagnostics.js","sources":["../../src/services/diagnostics.ts"],"sourcesContent":[null],"names":["OUTLET","HYDRATION","warnedKey","Symbol","for","registry","globalThis","isDiagnosticsEnabled","enabled","env","process","undefined","SSR_BOOST_DIAGNOSTICS","NODE_ENV","formatDiagnostic","code","sentence","toLowerCase","splitHtmlShell","html","file","outlet","parts","split","length","Error","JSON","stringify","valueType","value","bigint","symbol","prototype","Object","getPrototypeOf","name","constructor","walkSerializable","report","path","ancestors","Set","streamed","type","Promise","Date","RegExp","reason","object","Map","Array","isArray","has","add","entries","flatMap","key","child","index","map","String","suffix","test","delete","Diagnostics","route","logger","chunks","Logger","this","warn","detail","message","warned","deprecatedReqRes","policyDecision","pattern","mode","source","reported","info","policyUnmatched","inspectShell","header","footer","includes","inspectCachePolicy","headers","hasSessionCookie","get","inspectRouterState","loaderData","actionData","kind","data","streamAborted","count","inspectStreamValue","id","inspectState","state","inspectOnResponse","append","push","complete","join","markers","marker","set","markup","replace","_tag","opening","content","match","matchAll","attribute","total"],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
type TRequestStage = 'router.query' | 'prepare' | 'shell.ready' | 'state.emitted' | 'stream.resolve' | 'stream.reject' | 'body.end' | 'response.end' | 'abort';
|
|
2
2
|
interface ITimelineEvent {
|
|
3
3
|
stage: TRequestStage;
|
|
4
|
+
/** Milliseconds since the request timeline started. */
|
|
4
5
|
at: number;
|
|
5
6
|
id?: number;
|
|
6
7
|
placement?: 'early' | 'footer';
|
|
@@ -8,20 +9,48 @@ interface ITimelineEvent {
|
|
|
8
9
|
}
|
|
9
10
|
/** Request-local observations; never constructed on the disabled path. */
|
|
10
11
|
declare class RequestTimeline {
|
|
12
|
+
/**
|
|
13
|
+
* Retain request metadata and its cancellation signal.
|
|
14
|
+
*/
|
|
11
15
|
protected readonly request: Request;
|
|
16
|
+
/**
|
|
17
|
+
* Retain observations in emission order.
|
|
18
|
+
*/
|
|
12
19
|
readonly events: ITimelineEvent[];
|
|
20
|
+
/**
|
|
21
|
+
* Anchor event offsets to a monotonic clock.
|
|
22
|
+
*/
|
|
13
23
|
readonly started: number;
|
|
24
|
+
/**
|
|
25
|
+
* Prevent observations after response completion.
|
|
26
|
+
*/
|
|
14
27
|
protected ended: boolean;
|
|
28
|
+
/**
|
|
29
|
+
* Record only the first cancellation reason.
|
|
30
|
+
*/
|
|
15
31
|
protected aborted: boolean;
|
|
16
|
-
|
|
17
|
-
|
|
32
|
+
/**
|
|
33
|
+
* Observe cancellation from the request's signal.
|
|
34
|
+
*/
|
|
35
|
+
constructor(
|
|
36
|
+
/**
|
|
37
|
+
* Retain request metadata and its cancellation signal.
|
|
38
|
+
*/
|
|
39
|
+
request: Request);
|
|
18
40
|
/** Offsets mark completion/emission, not the beginning of a stage. */
|
|
19
41
|
record(stage: TRequestStage, detail?: Omit<ITimelineEvent, 'stage' | 'at'>): void;
|
|
42
|
+
/**
|
|
43
|
+
* Attach the first cancellation reason to the timeline.
|
|
44
|
+
*/
|
|
20
45
|
abort(reason?: unknown): void;
|
|
21
46
|
/** Emit one JSON line only when explicitly requested in development. */
|
|
22
47
|
end(): void;
|
|
23
48
|
/** Observe final transformed bytes without reading ahead of the consumer. */
|
|
24
49
|
response(response: Response): Response;
|
|
50
|
+
/**
|
|
51
|
+
* Forward request cancellation without losing the timeline receiver.
|
|
52
|
+
*/
|
|
53
|
+
protected onAbort: () => void;
|
|
25
54
|
}
|
|
26
55
|
/** Keep the constructor, event array and clock reads behind the enablement check. */
|
|
27
56
|
declare const createTimeline: (request: Request, diagnostics: boolean) => RequestTimeline | undefined;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const e=e=>{if(e instanceof Error)return e.message;if("string"==typeof e)return e;try{return JSON.stringify(e)??"Render cancelled"}catch{return"Unserializable abort reason"}};class t{request;events=[];started=performance.now();ended=!1;aborted=!1;constructor(e){this.request=e
|
|
1
|
+
const e=e=>{if(e instanceof Error)return e.message;if("string"==typeof e)return e;try{return JSON.stringify(e)??"Render cancelled"}catch{return"Unserializable abort reason"}};class t{request;events=[];started=performance.now();ended=!1;aborted=!1;constructor(e){this.request=e;const{signal:t}=e;t.aborted?this.onAbort():t.addEventListener("abort",this.onAbort,{once:!0})}record(e,t){this.ended||this.events.push({stage:e,at:performance.now()-this.started,...t})}abort(t){this.aborted||(this.aborted=!0,this.record("abort",{reason:e(t)}))}end(){this.ended||(this.record("response.end"),this.ended=!0,this.request.signal.removeEventListener("abort",this.onAbort),"undefined"!=typeof process&&"1"===process.env.SSR_BOOST_TIMELINE&&"production"!==process.env.NODE_ENV&&console.info(JSON.stringify({type:"SSR_BOOST_TIMELINE",method:this.request.method,path:new URL(this.request.url).pathname,timeline:this.events})))}response(e){const{body:t}=e;if(!t)return this.end(),e;const r=t.getReader();let s=!1;const n=()=>{s=!0,r.releaseLock(),this.end()},o=new ReadableStream({cancel:async e=>{s=!0,this.abort(e);try{await r.cancel(e)}finally{n()}},pull:async e=>{try{const{done:t,value:o}=await r.read();if(s)return;t?(n(),e.close()):e.enqueue(o)}catch(t){s||(this.abort(t),n(),e.error(t))}}},{highWaterMark:0});return new Response(o,e)}onAbort=()=>this.abort(this.request.signal.reason)}const r=(e,r)=>r||"undefined"!=typeof process&&"1"===process.env.SSR_BOOST_TIMELINE?new t(e):void 0;export{r as createTimeline,t as default};
|
|
2
2
|
//# sourceMappingURL=request-timeline.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"request-timeline.js","sources":["../../src/services/request-timeline.ts"],"sourcesContent":[null],"names":["describeReason","reason","Error","message","JSON","stringify","RequestTimeline","request","events","started","performance","now","ended","aborted","constructor","this","signal","onAbort","addEventListener","once","
|
|
1
|
+
{"version":3,"file":"request-timeline.js","sources":["../../src/services/request-timeline.ts"],"sourcesContent":[null],"names":["describeReason","reason","Error","message","JSON","stringify","RequestTimeline","request","events","started","performance","now","ended","aborted","constructor","this","signal","onAbort","addEventListener","once","record","stage","detail","push","at","abort","end","removeEventListener","process","env","SSR_BOOST_TIMELINE","NODE_ENV","console","info","type","method","path","URL","url","pathname","timeline","response","body","responseBody","reader","getReader","isStopped","finish","releaseLock","ReadableStream","cancel","async","pull","controller","done","isDone","value","read","close","enqueue","error","highWaterMark","Response","createTimeline","diagnostics","undefined"],"mappings":"AAsBA,MAAMA,EAAkBC,IACtB,GAAIA,aAAkBC,MACpB,OAAOD,EAAOE,QAGhB,GAAsB,iBAAXF,EACT,OAAOA,EAGT,IACE,OAAOG,KAAKC,UAAUJ,IAAW,kBACnC,CAAE,MACA,MAAO,6BACT,GAIF,MAAMK,EA4BiBC,QAxBLC,OAA2B,GAK3BC,QAAUC,YAAYC,MAK5BC,OAAQ,EAKRC,SAAU,EAKpB,WAAAC,CAIqBP,GAAAQ,KAAAR,QAAAA,EAEnB,MAAMS,OAAEA,GAAWT,EAEfS,EAAOH,QACTE,KAAKE,UAELD,EAAOE,iBAAiB,QAASH,KAAKE,QAAS,CAAEE,MAAM,GAE3D,CAGO,MAAAC,CAAOC,EAAsBC,GAC7BP,KAAKH,OACRG,KAAKP,OAAOe,KAAK,CAAEF,QAAOG,GAAId,YAAYC,MAAQI,KAAKN,WAAYa,GAEvE,CAKO,KAAAG,CAAMxB,GACNc,KAAKF,UACRE,KAAKF,SAAU,EACfE,KAAKK,OAAO,QAAS,CAAEnB,OAAQD,EAAeC,KAElD,CAGO,GAAAyB,GACDX,KAAKH,QAITG,KAAKK,OAAO,gBACZL,KAAKH,OAAQ,EACbG,KAAKR,QAAQS,OAAOW,oBAAoB,QAASZ,KAAKE,SAGjC,oBAAZW,SAC4B,MAAnCA,QAAQC,IAAIC,oBACa,eAAzBF,QAAQC,IAAIE,UAEZC,QAAQC,KACN7B,KAAKC,UAAU,CACb6B,KAAM,qBACNC,OAAQpB,KAAKR,QAAQ4B,OACrBC,KAAM,IAAIC,IAAItB,KAAKR,QAAQ+B,KAAKC,SAChCC,SAAUzB,KAAKP,UAIvB,CAGO,QAAAiC,CAASA,GACd,MAAQC,KAAMC,GAAiBF,EAE/B,IAAKE,EAGH,OAFA5B,KAAKW,MAEEe,EAGT,MAAMG,EAASD,EAAaE,YAC5B,IAAIC,GAAY,EAKhB,MAAMC,EAAS,KACbD,GAAY,EACZF,EAAOI,cACPjC,KAAKW,OAEDgB,EAAO,IAAIO,eACf,CAIEC,OAAQC,MAAOlD,IACb6C,GAAY,EACZ/B,KAAKU,MAAMxB,GAEX,UACQ2C,EAAOM,OAAOjD,EACtB,SACE8C,GACF,GAMFK,KAAMD,MAAOE,IACX,IACE,MAAQC,KAAMC,EAAMC,MAAEA,SAAgBZ,EAAOa,OAE7C,GAAIX,EACF,OAGES,GACFR,IACAM,EAAWK,SAEXL,EAAWM,QAAQH,EAEvB,CAAE,MAAOI,GACFd,IACH/B,KAAKU,MAAMmC,GACXb,IACAM,EAAWO,MAAMA,GAErB,IAGJ,CAAEC,cAAe,IAGnB,OAAO,IAAIC,SAASpB,EAAMD,EAC5B,CAKUxB,QAAU,IAAYF,KAAKU,MAAMV,KAAKR,QAAQS,OAAOf,QAIjE,MAAM8D,EAAiB,CAACxD,EAAkByD,IACxCA,GAAmC,oBAAZpC,SAA8D,MAAnCA,QAAQC,IAAIC,mBAC1D,IAAIxB,EAAgBC,QACpB0D"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"route-asset-preparer.js","sources":["../../src/services/route-asset-preparer.ts"],"sourcesContent":[null],"names":["createAssetPreparer","assets","async","context","executionContext","hints","injectAssets","Boolean","onEarlyHints","has"],"mappings":"AAMA,MAAMA,EACJC,
|
|
1
|
+
{"version":3,"file":"route-asset-preparer.js","sources":["../../src/services/route-asset-preparer.ts"],"sourcesContent":[null],"names":["createAssetPreparer","assets","async","context","executionContext","hints","injectAssets","Boolean","onEarlyHints","has"],"mappings":"AAMA,MAAMA,EACJC,GAKOC,OAASC,UAASC,uBACvB,MAAMC,EAAQJ,EAAOK,aAAaH,EAASI,QAAQH,GAAkBI,eAEjEH,EAAMI,IAAI,eACNL,GAAkBI,eAAeH"}
|
|
@@ -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"}
|
|
@@ -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":"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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
|
|
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"}
|