@lomray/vite-ssr-boost 8.4.0-beta.3 → 8.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +23 -0
- package/adapters/express/render.js +1 -1
- package/adapters/express/render.js.map +1 -1
- package/browser/entry.js.map +1 -1
- package/cloudflare.d.ts +59 -0
- package/cloudflare.js +2 -0
- package/cloudflare.js.map +1 -0
- package/core/cache-control.d.ts +4 -0
- package/core/cache-control.js +1 -1
- package/core/cache-control.js.map +1 -1
- package/core/conditional-request.d.ts +2 -1
- package/core/conditional-request.js +1 -1
- package/core/conditional-request.js.map +1 -1
- package/core/copy-loader-headers.d.ts +1 -1
- package/core/copy-loader-headers.js +1 -1
- package/core/copy-loader-headers.js.map +1 -1
- package/core/document-headers.js +1 -1
- package/core/document-headers.js.map +1 -1
- package/core/handler.js +1 -1
- package/core/handler.js.map +1 -1
- package/core/render.d.ts +1 -0
- package/core/render.js +1 -1
- package/core/render.js.map +1 -1
- package/core/spa-html.js.map +1 -1
- package/core/spa-shell.js +1 -1
- package/core/spa-shell.js.map +1 -1
- package/core/ssr-policy.d.ts +37 -4
- package/core/ssr-policy.js +1 -1
- package/core/ssr-policy.js.map +1 -1
- package/core/types.d.ts +5 -1
- package/http.d.ts +12 -0
- package/node/production.d.ts +10 -4
- package/node/production.js +1 -1
- package/node/production.js.map +1 -1
- package/package.json +10 -3
- package/services/diagnostics.d.ts +18 -1
- package/services/diagnostics.js.map +1 -1
- package/services/request-timeline.d.ts +31 -2
- package/services/request-timeline.js +1 -1
- package/services/request-timeline.js.map +1 -1
- package/services/route-asset-preparer.d.ts +7 -0
- package/services/route-asset-preparer.js +2 -0
- package/services/route-asset-preparer.js.map +1 -0
- package/services/route-assets-memory.d.ts +75 -0
- package/services/route-assets-memory.js +2 -0
- package/services/route-assets-memory.js.map +1 -0
- package/services/route-assets.d.ts +9 -55
- package/services/route-assets.js +1 -1
- package/services/route-assets.js.map +1 -1
- package/services/ssr-manifest.d.ts +4 -4
- package/services/ssr-manifest.js +1 -1
- package/services/ssr-manifest.js.map +1 -1
- package/testing/browser-observer.d.ts +13 -7
- package/testing/browser-observer.js +1 -1
- package/testing/browser-observer.js.map +1 -1
- package/testing/create-handler.d.ts +1 -0
- package/testing/create-handler.js.map +1 -1
- package/testing/deferred.js.map +1 -1
- package/testing/edge.d.ts +12 -0
- package/testing/edge.js.map +1 -1
- package/testing/parse-response.js.map +1 -1
- package/testing/playwright.d.ts +2 -0
- package/testing/playwright.js +1 -1
- package/testing/playwright.js.map +1 -1
- package/testing/requests.d.ts +3 -0
- package/testing/requests.js.map +1 -1
- package/testing/response.d.ts +49 -3
- package/testing/response.js +1 -1
- package/testing/response.js.map +1 -1
- package/testing.d.ts +12 -0
- package/testing.js.map +1 -1
package/core/types.d.ts
CHANGED
|
@@ -1,4 +1,8 @@
|
|
|
1
|
-
export interface ISsrExecutionContext {
|
|
1
|
+
export interface ISsrExecutionContext<TPlatform = unknown> {
|
|
2
|
+
/** Runtime bindings and the native execution context, supplied by an adapter. */
|
|
3
|
+
platform?: TPlatform;
|
|
4
|
+
/** Extend request lifetime for background work supported by the runtime. */
|
|
5
|
+
waitUntil?: (promise: Promise<unknown>) => void;
|
|
2
6
|
/**
|
|
3
7
|
* Deliver informational headers outside the final Fetch response when supported.
|
|
4
8
|
*/
|
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
|
@@ -1,12 +1,18 @@
|
|
|
1
1
|
import type { ICreateHandlerOptions, IHtmlShell } from '../core/handler.js';
|
|
2
|
+
import type { TRouteAssetsManifest } from '../services/route-assets.js';
|
|
2
3
|
interface ILoadHtmlShellOptions {
|
|
3
4
|
indexFile: string;
|
|
4
5
|
outlet?: string;
|
|
5
6
|
}
|
|
6
|
-
|
|
7
|
+
type TRouteAssetPreparerOptions = ({
|
|
7
8
|
buildDir: string;
|
|
9
|
+
manifest?: never;
|
|
10
|
+
} | {
|
|
11
|
+
manifest: TRouteAssetsManifest;
|
|
12
|
+
buildDir?: never;
|
|
13
|
+
}) & {
|
|
8
14
|
modulePreload?: boolean;
|
|
9
|
-
}
|
|
15
|
+
};
|
|
10
16
|
/**
|
|
11
17
|
* Read a built document once and supply a fresh shell for each request.
|
|
12
18
|
*/
|
|
@@ -14,6 +20,6 @@ declare const loadHtmlShell: ({ indexFile, outlet, }: ILoadHtmlShellOptions) =>
|
|
|
14
20
|
/**
|
|
15
21
|
* Inject matched route assets using a manifest cache owned by this preparer.
|
|
16
22
|
*/
|
|
17
|
-
declare const createRouteAssetPreparer: <TAppProps = Record<string, any>>({ buildDir, modulePreload, }:
|
|
23
|
+
declare const createRouteAssetPreparer: <TAppProps = Record<string, any>>({ buildDir, manifest, modulePreload, }: TRouteAssetPreparerOptions) => NonNullable<ICreateHandlerOptions<TAppProps>["prepare"]>;
|
|
18
24
|
export { createRouteAssetPreparer, loadHtmlShell };
|
|
19
|
-
export type { IHtmlShell, ILoadHtmlShellOptions, IRouteAssetPreparerOptions };
|
|
25
|
+
export type { IHtmlShell, ILoadHtmlShellOptions, TRouteAssetPreparerOptions as IRouteAssetPreparerOptions, TRouteAssetsManifest, };
|
package/node/production.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{readFile as
|
|
1
|
+
import{readFile as e}from"node:fs/promises";import{splitHtmlShell as r}from"../services/diagnostics.js";import s from"../services/route-asset-preparer.js";import o from"../services/route-assets.js";const t=async({indexFile:s,outlet:o="\x3c!--ssr-outlet--\x3e"})=>{const t=await e(s,"utf8"),[i,m]=r(t,s,o);return()=>({header:i,footer:m})},i=({buildDir:e,manifest:r,modulePreload:t=!1})=>s(new o(r??e,t));export{i as createRouteAssetPreparer,t as loadHtmlShell};
|
|
2
2
|
//# sourceMappingURL=production.js.map
|
package/node/production.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"production.js","sources":["../../src/node/production.ts"],"sourcesContent":[null],"names":["loadHtmlShell","async","indexFile","outlet","html","readFile","header","footer","splitHtmlShell","createRouteAssetPreparer","buildDir","
|
|
1
|
+
{"version":3,"file":"production.js","sources":["../../src/node/production.ts"],"sourcesContent":[null],"names":["loadHtmlShell","async","indexFile","outlet","html","readFile","header","footer","splitHtmlShell","createRouteAssetPreparer","buildDir","manifest","modulePreload","createAssetPreparer","RouteAssets"],"mappings":"sMAmBA,MAAMA,EAAgBC,OACpBC,YACAC,SAAS,8BAET,MAAMC,QAAaC,EAASH,EAAW,SAChCI,EAAQC,GAAUC,EAAeJ,EAAMF,EAAWC,GAEzD,MAAO,KAAA,CAASG,SAAQC,YAMpBE,EAA2B,EAC/BC,WACAC,WACAC,iBAAgB,KAETC,EAAoB,IAAIC,EAAYH,GAAYD,EAAUE"}
|
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": {
|
|
@@ -93,7 +93,10 @@
|
|
|
93
93
|
"test:bun": "bun scripts/test-bun.mjs",
|
|
94
94
|
"test:template": "npm run build && node scripts/test-template.mjs",
|
|
95
95
|
"test:coverage": "vitest run --coverage",
|
|
96
|
-
"test:browser": "playwright test --config playwright.config.mjs"
|
|
96
|
+
"test:browser": "playwright test --config playwright.config.mjs",
|
|
97
|
+
"test:worker:packed": "node scripts/test-packed-worker.mjs",
|
|
98
|
+
"test:worker:browser": "playwright test --config playwright.worker.config.mjs",
|
|
99
|
+
"test:skills": "node scripts/test-skills.mjs"
|
|
97
100
|
},
|
|
98
101
|
"dependencies": {
|
|
99
102
|
"chalk": "^6.0.0",
|
|
@@ -116,6 +119,8 @@
|
|
|
116
119
|
"@babel/parser": "^8.0.4",
|
|
117
120
|
"@babel/traverse": "^8.0.4",
|
|
118
121
|
"@babel/types": "^8.0.4",
|
|
122
|
+
"@cloudflare/vite-plugin": "^1.54.4",
|
|
123
|
+
"@cloudflare/workers-types": "^5.20260906.1",
|
|
119
124
|
"@commitlint/cli": "^21.2.2",
|
|
120
125
|
"@commitlint/config-conventional": "^21.2.2",
|
|
121
126
|
"@lomray/eslint-config": "^7.0.0",
|
|
@@ -163,7 +168,9 @@
|
|
|
163
168
|
"typescript-eslint": "^8.69.0",
|
|
164
169
|
"vite": "^8.2.2",
|
|
165
170
|
"vitepress": "^1.6.4",
|
|
166
|
-
"vitest": "^5.0.0"
|
|
171
|
+
"vitest": "^5.0.0",
|
|
172
|
+
"wrangler": "^4.129.0",
|
|
173
|
+
"yaml": "^2.9.0"
|
|
167
174
|
},
|
|
168
175
|
"peerDependencies": {
|
|
169
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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { ICreateHandlerOptions } from '../core/handler.js';
|
|
2
|
+
import type RouteAssets from './route-assets-memory.js';
|
|
3
|
+
/**
|
|
4
|
+
* Share route injection across runtimes, computing hints only for supported transports.
|
|
5
|
+
*/
|
|
6
|
+
declare const createAssetPreparer: <TAppProps = Record<string, any>>(assets: RouteAssets) => NonNullable<ICreateHandlerOptions<TAppProps>["prepare"]>;
|
|
7
|
+
export default createAssetPreparer;
|
|
@@ -0,0 +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,GAKOC,OAASC,UAASC,uBACvB,MAAMC,EAAQJ,EAAOK,aAAaH,EAASI,QAAQH,GAAkBI,eAEjEH,EAAMI,IAAI,eACNL,GAAkBI,eAAeH"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import type { RouterState, StaticHandlerContext } from 'react-router';
|
|
2
|
+
declare enum AssetType {
|
|
3
|
+
style = "style",
|
|
4
|
+
script = "script",
|
|
5
|
+
image = "image",
|
|
6
|
+
font = "font"
|
|
7
|
+
}
|
|
8
|
+
interface IAsset {
|
|
9
|
+
type: string;
|
|
10
|
+
url: string;
|
|
11
|
+
/** Lower weights are injected first. */
|
|
12
|
+
weight: number;
|
|
13
|
+
/** Nested assets follow top-level assets with the same weight. */
|
|
14
|
+
isNested: boolean;
|
|
15
|
+
isPreload: boolean;
|
|
16
|
+
content?: string;
|
|
17
|
+
}
|
|
18
|
+
type TAssets = {
|
|
19
|
+
[id: string]: IAsset;
|
|
20
|
+
};
|
|
21
|
+
/** Parsed build/client/assets-manifest.json; accepts a JSON module directly. */
|
|
22
|
+
type TRouteAssetsManifest = Readonly<Record<string, readonly IAsset[]>>;
|
|
23
|
+
interface IInjectAssetsContext {
|
|
24
|
+
html: {
|
|
25
|
+
header: string;
|
|
26
|
+
};
|
|
27
|
+
routerContext?: StaticHandlerContext;
|
|
28
|
+
matches?: RouterState['matches'];
|
|
29
|
+
isSpa?: boolean;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Load and inject route assets with an independent cache for one build.
|
|
33
|
+
*/
|
|
34
|
+
declare class RouteAssets {
|
|
35
|
+
/**
|
|
36
|
+
* Control module preload hints for matched scripts.
|
|
37
|
+
*/
|
|
38
|
+
protected readonly modulePreload: boolean;
|
|
39
|
+
/**
|
|
40
|
+
* Keep the build's route assets isolated from other handler instances.
|
|
41
|
+
*/
|
|
42
|
+
protected routesAssets: TRouteAssetsManifest | null;
|
|
43
|
+
/**
|
|
44
|
+
* Retain the supplied manifest and preload preference.
|
|
45
|
+
*/
|
|
46
|
+
constructor(manifest: TRouteAssetsManifest, modulePreload?: boolean);
|
|
47
|
+
/**
|
|
48
|
+
* Development manifests override this to inject inline styles.
|
|
49
|
+
*/
|
|
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;
|
|
59
|
+
/**
|
|
60
|
+
* Read the manifest without requiring a filesystem.
|
|
61
|
+
*/
|
|
62
|
+
protected loadAssetsManifest(): TRouteAssetsManifest;
|
|
63
|
+
/**
|
|
64
|
+
* Sort assets
|
|
65
|
+
*/
|
|
66
|
+
protected sortAssets(assets: IAsset[]): IAsset[];
|
|
67
|
+
/**
|
|
68
|
+
* Get route assets
|
|
69
|
+
* The development manifest uses the SPA flag to preload unqueried lazy routes.
|
|
70
|
+
*/
|
|
71
|
+
protected getAssets(routes?: RouterState['matches'], _isSpa?: boolean): IAsset[];
|
|
72
|
+
}
|
|
73
|
+
export { AssetType };
|
|
74
|
+
export type { IAsset, TAssets, TRouteAssetsManifest };
|
|
75
|
+
export default RouteAssets;
|
|
@@ -0,0 +1,2 @@
|
|
|
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
|
+
//# sourceMappingURL=route-assets-memory.js.map
|
|
@@ -0,0 +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","getEarlyHints","assets","headers","Headers","forEach","type","url","includes","append","injectAssets","routerContext","matches","html","isSpa","earlyHints","getAssets","htmlAssets","map","isPreload","content","filter","Boolean","header","replace","join","loadAssetsManifest","sortAssets","sort","weight","isNested","nextWeight","isNextNested","Number","routes","_isSpa","routeIds","route","id","length","routeId","flat"],"mappings":"AAEA,IAAKA,GAAL,SAAKA,GACHA,EAAA,MAAA,QACAA,EAAA,OAAA,SACAA,EAAA,MAAA,QACAA,EAAA,KAAA,MACD,CALD,CAAKA,IAAAA,EAAS,CAAA,IAqCd,IAAAC,EAAA,MAIqBC,cAKTC,aAKV,WAAAC,CAAYC,EAAgCH,GAAgB,GAC1DI,KAAKH,aAAeE,EACpBC,KAAKJ,cAAgBA,CACvB,CAKA,SAAcK,GACZ,OAAO,CACT,CAKO,aAAAC,CAAcC,GACnB,MAAMC,EAAU,IAAIC,QAapB,OARAF,EAAOG,QAAQ,EAAGC,OAAMC,UACjBD,GAAS,CAAC,QAAS,UAAUE,SAASF,IAI3CH,EAAQM,OAAO,OAAQ,IAAIF,uBAAyBD,OAG/CH,CACT,CAKO,YAAAO,EACLC,cAAEA,EAAaC,QAAEA,EAAOC,KAAEA,EAAIC,MAAEA,GAChCC,GAAa,GAEb,MAAMb,EAASH,KAAKiB,UAAUJ,GAAWD,GAAeC,QAASE,GAK3DG,EAAaf,EAChBgB,IAAI,EAAGZ,OAAMC,MAAKY,YAAWC,UAAU,OACtC,OAAQd,GACN,IAAK,QACH,OAAOP,KAAKC,MACR,4BAA4BO,MAAQa,YACpC,gCAAgCb,MAEtC,IAAK,SACH,OAAOY,EACHpB,KAAKJ,eAAiBmB,EAEpB,2DAA2DP,MAC3D,KACF,gDAAgDA,gBAGxD,OAAO,OAERc,OAAOC,SAIV,OAFAT,EAAKU,OAASV,EAAKU,OAAOC,QAAQ,UAAW,GAAGP,EAAWQ,KAAK,gBAEzDV,EAAahB,KAAKE,cAAcC,GAAU,IAAIE,OACvD,CAKU,kBAAAsB,GACR,OAAO3B,KAAKH,cAAgB,CAAA,CAC9B,CAKU,UAAA+B,CAAWzB,GACnB,OAAOA,EAAO0B,KAAK,EAAGC,SAAQC,aAAcD,OAAQE,EAAYD,SAAUE,KACxEH,IAAWE,EAAaE,OAAOH,GAAYG,OAAOD,GAAgBH,EAASE,EAE/E,CAOU,SAAAf,CAAUkB,EAAiCC,GACnD,MAAMC,EAAWF,GAAQhB,IAAI,EAAGmB,WAAYA,EAAMC,IAAIjB,OAAOC,UAAY,GAEzE,IAAKc,EAASG,OACZ,MAAO,GAGT,MAAM3C,EAAeG,KAAK2B,qBAE1B,OAAO3B,KAAK4B,WACVS,EACGlB,IAAKsB,GAAY5C,EAAa4C,IAC9BC,OACApB,OAAOC,SAEd"}
|
|
@@ -1,66 +1,20 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
style = "style",
|
|
4
|
-
script = "script",
|
|
5
|
-
image = "image",
|
|
6
|
-
font = "font"
|
|
7
|
-
}
|
|
8
|
-
interface IAsset {
|
|
9
|
-
type: AssetType;
|
|
10
|
-
url: string;
|
|
11
|
-
weight: number;
|
|
12
|
-
isNested: boolean;
|
|
13
|
-
isPreload: boolean;
|
|
14
|
-
content?: string;
|
|
15
|
-
}
|
|
16
|
-
type TAssets = {
|
|
17
|
-
[id: string]: IAsset;
|
|
18
|
-
};
|
|
19
|
-
interface IInjectAssetsContext {
|
|
20
|
-
html: {
|
|
21
|
-
header: string;
|
|
22
|
-
};
|
|
23
|
-
routerContext?: StaticHandlerContext;
|
|
24
|
-
matches?: RouterState['matches'];
|
|
25
|
-
isSpa?: boolean;
|
|
26
|
-
}
|
|
1
|
+
import MemoryRouteAssets from './route-assets-memory.js';
|
|
2
|
+
import type { TRouteAssetsManifest } from './route-assets-memory.js';
|
|
27
3
|
/**
|
|
28
|
-
*
|
|
4
|
+
* Keep the Node manifest cache while also accepting a parsed JSON manifest.
|
|
29
5
|
*/
|
|
30
|
-
declare class RouteAssets {
|
|
6
|
+
declare class RouteAssets extends MemoryRouteAssets {
|
|
31
7
|
protected readonly outputDir: string;
|
|
32
|
-
|
|
33
|
-
protected routesAssets: Record<string, IAsset[]> | null;
|
|
34
|
-
constructor(buildDir: string, modulePreload?: boolean);
|
|
35
|
-
/**
|
|
36
|
-
* Development manifests override this to inject inline styles.
|
|
37
|
-
*/
|
|
38
|
-
protected get isDev(): boolean;
|
|
8
|
+
constructor(buildDir: string | TRouteAssetsManifest, modulePreload?: boolean);
|
|
39
9
|
/**
|
|
40
10
|
* Get assets manifest file name.
|
|
41
11
|
*/
|
|
42
12
|
protected getAssetsManifestFile(): string;
|
|
43
13
|
/**
|
|
44
|
-
* Load
|
|
45
|
-
*/
|
|
46
|
-
protected loadAssetsManifest(): Record<string, IAsset[]>;
|
|
47
|
-
/**
|
|
48
|
-
* Sort assets
|
|
49
|
-
*/
|
|
50
|
-
protected sortAssets(assets: IAsset[]): IAsset[];
|
|
51
|
-
/**
|
|
52
|
-
* Get route assets
|
|
53
|
-
*/
|
|
54
|
-
protected getAssets(routes?: RouterState['matches'], _isSpa?: boolean): IAsset[];
|
|
55
|
-
/**
|
|
56
|
-
* Build preload hints without depending on a particular HTTP transport.
|
|
57
|
-
*/
|
|
58
|
-
getEarlyHints(assets: IAsset[]): Headers;
|
|
59
|
-
/**
|
|
60
|
-
* Inject route assets to head html
|
|
14
|
+
* Load and cache the Node manifest on first use.
|
|
61
15
|
*/
|
|
62
|
-
|
|
16
|
+
protected loadAssetsManifest(): TRouteAssetsManifest;
|
|
63
17
|
}
|
|
64
|
-
export { AssetType };
|
|
65
|
-
export type { IAsset, TAssets };
|
|
18
|
+
export { AssetType } from './route-assets-memory.js';
|
|
19
|
+
export type { IAsset, TAssets, TRouteAssetsManifest } from './route-assets-memory.js';
|
|
66
20
|
export default RouteAssets;
|
package/services/route-assets.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import
|
|
1
|
+
import s from"node:fs";import t from"node:path";import e from"./route-assets-memory.js";export{AssetType}from"./route-assets-memory.js";class r extends e{outputDir;constructor(s,e=!1){super("string"==typeof s?{}:s,e),this.outputDir="string"==typeof s?t.resolve(s):"",this.routesAssets="string"==typeof s?null:s}getAssetsManifestFile(){return t.join(this.outputDir,"server","assets-manifest.json")}loadAssetsManifest(){if(null!==this.routesAssets)return this.routesAssets;const t=this.getAssetsManifestFile();return s.existsSync(t)?(this.routesAssets=JSON.parse(s.readFileSync(t,"utf8")),this.routesAssets):{}}}export{r as default};
|
|
2
2
|
//# sourceMappingURL=route-assets.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"route-assets.js","sources":["../../src/services/route-assets.ts"],"sourcesContent":[null],"names":["
|
|
1
|
+
{"version":3,"file":"route-assets.js","sources":["../../src/services/route-assets.ts"],"sourcesContent":[null],"names":["RouteAssets","MemoryRouteAssets","outputDir","constructor","buildDir","modulePreload","super","this","path","resolve","routesAssets","getAssetsManifestFile","join","loadAssetsManifest","manifestFile","fs","existsSync","JSON","parse","readFileSync"],"mappings":"wIAQA,MAAMA,UAAoBC,EACLC,UAEnB,WAAAC,CAAYC,EAAyCC,GAAgB,GACnEC,MAA0B,iBAAbF,EAAwB,CAAA,EAAKA,EAAUC,GACpDE,KAAKL,UAAgC,iBAAbE,EAAwBI,EAAKC,QAAQL,GAAY,GACzEG,KAAKG,aAAmC,iBAAbN,EAAwB,KAAOA,CAC5D,CAKU,qBAAAO,GACR,OAAOH,EAAKI,KAAKL,KAAKL,UAAW,SAAU,uBAC7C,CAKU,kBAAAW,GACR,GAA0B,OAAtBN,KAAKG,aACP,OAAOH,KAAKG,aAGd,MAAMI,EAAeP,KAAKI,wBAE1B,OAAKI,EAAGC,WAAWF,IAInBP,KAAKG,aAAeO,KAAKC,MAAMH,EAAGI,aAAaL,EAAc,SAEtDP,KAAKG,cALH,CAAA,CAMX"}
|
|
@@ -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
|
|
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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"}
|