@bdocs/ssg 0.3.0 → 0.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/bin/vite-react-ssg.js +1 -2
- package/dist/client/single-page.cjs +1 -1
- package/dist/client/single-page.d.cts +48 -8
- package/dist/client/single-page.d.ts +48 -8
- package/dist/client/single-page.js +1 -1
- package/dist/index.cjs +2 -2
- package/dist/index.d.cts +4 -26
- package/dist/index.d.mts +4 -26
- package/dist/index.mjs +2 -2
- package/dist/node.cjs +3 -2
- package/dist/node.d.cts +42 -3
- package/dist/node.d.mts +42 -3
- package/dist/node.mjs +3 -2
- package/dist/router-adapter-BukFH1uk.mjs +1 -0
- package/dist/router-adapter-DtnukOfG.cjs +1 -0
- package/dist/ssg-worker-payload-BHsJklNf.mjs +1 -0
- package/dist/ssg-worker-payload-B_9N9o5p.cjs +1 -0
- package/dist/ssg-worker-pool-CZPcmzdb.cjs +1 -0
- package/dist/ssg-worker-pool-DxzleN_R.mjs +1 -0
- package/dist/ssg-worker.cjs +1 -0
- package/dist/ssg-worker.d.cts +26 -0
- package/dist/ssg-worker.d.mts +27 -0
- package/dist/ssg-worker.mjs +1 -0
- package/dist/{types-BMIDte34.d.cts → types-ClSMhb8G.d.cts} +48 -8
- package/dist/{types-DefKqSqW.d.mts → types-Y1Rvl_Nv.d.mts} +48 -8
- package/package.json +8 -8
- package/dist/state-CAM2wH0H.cjs +0 -1
- package/dist/state-CkhLd6hN.mjs +0 -1
- /package/dist/{jsdomGlobal-u0wZKDvc.mjs → jsdomGlobal-RTx-0uYL.mjs} +0 -0
- /package/dist/{jsdomGlobal-B4hHTFBO.cjs → jsdomGlobal-TVNgh-Jn.cjs} +0 -0
package/dist/node.d.cts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { u as ViteReactSSGOptions } from "./types-ClSMhb8G.cjs";
|
|
2
2
|
import { InlineConfig, ViteDevServer } from "vite";
|
|
3
3
|
|
|
4
4
|
//#region src/node/build.d.ts
|
|
@@ -10,11 +10,50 @@ declare global {
|
|
|
10
10
|
}
|
|
11
11
|
/**
|
|
12
12
|
* Creates a customized Vite development server for SSG.
|
|
13
|
+
*
|
|
14
|
+
* When `skipResolveConfig` is set in ssgOptions, the expensive Vite
|
|
15
|
+
* `resolveConfig()` call is skipped — the caller is responsible for
|
|
16
|
+
* providing a fully-formed `InlineConfig`. Entry path resolution is
|
|
17
|
+
* performed manually (simple `join(root, entry)`) instead of going
|
|
18
|
+
* through Vite's resolver, which shaves ~100-200 ms off dev startup.
|
|
13
19
|
*/
|
|
14
|
-
declare function createServer(viteConfig?: InlineConfig, ssgOptions?: Partial<ViteReactSSGOptions>
|
|
20
|
+
declare function createServer(viteConfig?: InlineConfig, ssgOptions?: Partial<ViteReactSSGOptions> & {
|
|
21
|
+
skipResolveConfig?: boolean;
|
|
22
|
+
}): Promise<ViteDevServer>;
|
|
15
23
|
/**
|
|
16
24
|
* Top-level dev function that starts server and sets up interaction loop.
|
|
17
25
|
*/
|
|
18
26
|
declare function dev(ssgOptions?: Partial<ViteReactSSGOptions>, viteConfig?: InlineConfig, customOptions?: unknown): Promise<ViteDevServer>;
|
|
19
27
|
//#endregion
|
|
20
|
-
|
|
28
|
+
//#region src/node/shell-stitcher.d.ts
|
|
29
|
+
/**
|
|
30
|
+
* Shell Stitcher — Fast template interpolation engine for SSG Layout Shells.
|
|
31
|
+
*
|
|
32
|
+
* Replaces <!--BDOCS_SLOT:*--> markers in pre-rendered shell templates with
|
|
33
|
+
* page-specific fragments (MDX content, TOC, meta tags, breadcrumbs, page nav).
|
|
34
|
+
*
|
|
35
|
+
* This decouples the SSG build engine from specific React theme components,
|
|
36
|
+
* enabling headless theme extraction (e.g. moving ui-base/primitives to external themes).
|
|
37
|
+
*/
|
|
38
|
+
interface ShellSlots {
|
|
39
|
+
content: string;
|
|
40
|
+
toc?: string;
|
|
41
|
+
meta?: string;
|
|
42
|
+
breadcrumbs?: string;
|
|
43
|
+
pageNav?: string;
|
|
44
|
+
title?: string;
|
|
45
|
+
}
|
|
46
|
+
interface ShellStitcherOptions {
|
|
47
|
+
/** Pre-rendered HTML template with <!--BDOCS_SLOT:*--> markers */
|
|
48
|
+
template: string;
|
|
49
|
+
}
|
|
50
|
+
declare class ShellStitcher {
|
|
51
|
+
private readonly template;
|
|
52
|
+
constructor(options: ShellStitcherOptions);
|
|
53
|
+
/**
|
|
54
|
+
* Inject page fragments into template slot markers.
|
|
55
|
+
*/
|
|
56
|
+
stitch(slots: ShellSlots): string;
|
|
57
|
+
}
|
|
58
|
+
//#endregion
|
|
59
|
+
export { type ShellSlots, ShellStitcher, type ShellStitcherOptions, build, createServer, dev };
|
package/dist/node.d.mts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { u as ViteReactSSGOptions } from "./types-Y1Rvl_Nv.mjs";
|
|
2
2
|
import { InlineConfig, ViteDevServer } from "vite";
|
|
3
3
|
|
|
4
4
|
//#region src/node/build.d.ts
|
|
@@ -10,11 +10,50 @@ declare global {
|
|
|
10
10
|
}
|
|
11
11
|
/**
|
|
12
12
|
* Creates a customized Vite development server for SSG.
|
|
13
|
+
*
|
|
14
|
+
* When `skipResolveConfig` is set in ssgOptions, the expensive Vite
|
|
15
|
+
* `resolveConfig()` call is skipped — the caller is responsible for
|
|
16
|
+
* providing a fully-formed `InlineConfig`. Entry path resolution is
|
|
17
|
+
* performed manually (simple `join(root, entry)`) instead of going
|
|
18
|
+
* through Vite's resolver, which shaves ~100-200 ms off dev startup.
|
|
13
19
|
*/
|
|
14
|
-
declare function createServer(viteConfig?: InlineConfig, ssgOptions?: Partial<ViteReactSSGOptions>
|
|
20
|
+
declare function createServer(viteConfig?: InlineConfig, ssgOptions?: Partial<ViteReactSSGOptions> & {
|
|
21
|
+
skipResolveConfig?: boolean;
|
|
22
|
+
}): Promise<ViteDevServer>;
|
|
15
23
|
/**
|
|
16
24
|
* Top-level dev function that starts server and sets up interaction loop.
|
|
17
25
|
*/
|
|
18
26
|
declare function dev(ssgOptions?: Partial<ViteReactSSGOptions>, viteConfig?: InlineConfig, customOptions?: unknown): Promise<ViteDevServer>;
|
|
19
27
|
//#endregion
|
|
20
|
-
|
|
28
|
+
//#region src/node/shell-stitcher.d.ts
|
|
29
|
+
/**
|
|
30
|
+
* Shell Stitcher — Fast template interpolation engine for SSG Layout Shells.
|
|
31
|
+
*
|
|
32
|
+
* Replaces <!--BDOCS_SLOT:*--> markers in pre-rendered shell templates with
|
|
33
|
+
* page-specific fragments (MDX content, TOC, meta tags, breadcrumbs, page nav).
|
|
34
|
+
*
|
|
35
|
+
* This decouples the SSG build engine from specific React theme components,
|
|
36
|
+
* enabling headless theme extraction (e.g. moving ui-base/primitives to external themes).
|
|
37
|
+
*/
|
|
38
|
+
interface ShellSlots {
|
|
39
|
+
content: string;
|
|
40
|
+
toc?: string;
|
|
41
|
+
meta?: string;
|
|
42
|
+
breadcrumbs?: string;
|
|
43
|
+
pageNav?: string;
|
|
44
|
+
title?: string;
|
|
45
|
+
}
|
|
46
|
+
interface ShellStitcherOptions {
|
|
47
|
+
/** Pre-rendered HTML template with <!--BDOCS_SLOT:*--> markers */
|
|
48
|
+
template: string;
|
|
49
|
+
}
|
|
50
|
+
declare class ShellStitcher {
|
|
51
|
+
private readonly template;
|
|
52
|
+
constructor(options: ShellStitcherOptions);
|
|
53
|
+
/**
|
|
54
|
+
* Inject page fragments into template slot markers.
|
|
55
|
+
*/
|
|
56
|
+
stitch(slots: ShellSlots): string;
|
|
57
|
+
}
|
|
58
|
+
//#endregion
|
|
59
|
+
export { type ShellSlots, ShellStitcher, type ShellStitcherOptions, build, createServer, dev };
|
package/dist/node.mjs
CHANGED
|
@@ -1,2 +1,3 @@
|
|
|
1
|
-
import{a as e,c as t,i as n,n as r,o as i,r as a,s as o}from"./state-CkhLd6hN.mjs";import{createRequire as s}from"node:module";import{Fragment as c,jsx as l}from"react/jsx-runtime";import{colors as u,error as d,warn as f}from"@bdocs/dui";import p from"node:os";import m,{dirname as h,isAbsolute as g,join as _,relative as v}from"node:path";import y from"fs-extra";import{build as b,createLogger as x,createServer as S,mergeConfig as C,resolveConfig as w,send as T,version as E}from"vite";import D from"node:crypto";import{once as O}from"node:events";import{Readable as k}from"node:stream";import*as A from"react-dom/server";import j from"node:fs";import M from"node:fs/promises";var N=s(import.meta.url);const ee=/import\("([^)]+)"\)/g;let te=null;async function ne(){if(!te){let{matchRoutes:e}=await import(`react-router-dom`);te=e}return te}async function re({routes:e,locationArg:t,base:n,serverManifest:r,manifest:i,ssrManifest:a}){let o=(await ne())([...e],t,n),s=o?.map(e=>e.route.entry).filter(Boolean)??[],c=new Set;o?.forEach(e=>{let t=``;e.route.lazy&&(t+=e.route.lazy.toString()),e.route.Component?._payload?._result&&(t+=e.route.Component._payload._result.toString());let n=t.matchAll(ee);for(let e of n)c.add(e[1].split(`/`).at(-1)??``)});let l=new Set;s.forEach(e=>l.add(e));let u=[...Object.entries(r)];c.forEach(e=>{let t=u.find(([t,n])=>n.file.endsWith(e));t&&l.add(t[0])});let d=P(i,l),f=new Set;return Array.from(d).forEach(e=>{(a[e]||[]).forEach(e=>{f.add(e)})}),f}function P(e,t){let n=new Set;if(!t)return n;for(let r of t)F(e,r,n);return n}function F(e,t,n=new Set){return t?(n.add(t),e[t]?.dynamicImports?.forEach(t=>{F(e,t,n)}),n):n}async function I(e,t={}){try{let n=await import(`beasties`);return new(n.default||n)({path:e,logLevel:`warn`,external:!0,inlineFonts:!0,preloadFonts:!0,...t})}catch{return}}async function ie(){try{let e=await import(`@bdocs/zig-critters`),t=e.processHtml||e.default?.processHtml;return t?{processHtml:t}:void 0}catch{return}}const ae=`/* SCRIPT_COMMENT_PLACEHOLDER */`;async function oe({rootContainerId:e,indexHTML:t,appHTML:n,metaAttributes:r,bodyAttributes:i,htmlAttributes:a,initialState:o}){let s=o?`\n<script>window.__INITIAL_STATE__=${o}<\/script>`:``,c=`\n<script>${ae}<\/script>`,l=`<head>`,u=r.join(``);t=t.replace(l,l+u);let d=`<body`;t=t.replace(d,`${d} ${i}`);let f=`<html`;t=t.replace(f,`${f} ${a}`);let p=`<div id="${e}"></div>`;if(t.includes(p))return t.replace(p,`<div id="${e}" data-server-rendered="true">${n}</div>${s}${c}`);let m=await import(`html5parser`),h=m.parse(t),g;if(m.walk(h,{enter:r=>{if(!g&&r?.type===m.SyntaxKind.Tag&&Array.isArray(r.attributes)&&r.attributes.length>0&&r.attributes.some(t=>t.name.value===`id`&&t.value?.value===e)){let e=[...r.attributes.map(({name:{value:e},value:t})=>`${e}="${t.value}"`)].join(` `),i=t.slice(0,r.start),a=t.slice(r.end);g=`${i}<${r.name} ${e} data-server-rendered="true">${n}</${r.name}>${s}${c}${a}`}}}),!g)throw Error(`Could not find a tag with id="${e}" to replace it with server-side rendered HTML`);return g}async function se(e,t=`index.html`){let[,n]=[...(await y.readFile(_(e,t),`utf-8`)).matchAll(/<script(?:.*?)src=["'](.+?)["'](?!<)(?:.*)\>(?:[\n\r\s]*?)(?:<\/script>)/gim)].find(e=>{let[t]=e,[,n]=t.match(/.*\stype=(?:'|")?([^>'"\s]+)/i)||[];return n===`module`})||[];return n||`src/main.ts`}function ce(e){return`<link rel="stylesheet" href="${e}">`}function le(e){let t=new Set,n=[];return e&&e.forEach(e=>{if(!t.has(e)){t.add(e);let r=L(e);r&&n.push(r)}}),n.join(``)}function L(e){return e.endsWith(`.js`)?`<link rel="modulepreload" crossorigin href="${e}">`:e.endsWith(`.css`)?`<link rel="stylesheet" crossorigin href="${e}">`:e.endsWith(`.woff`)||e.endsWith(`.woff2`)||e.endsWith(`.ttf`)?`<link rel="preload" as="font" type="font/woff2" crossorigin href="${e}">`:e.endsWith(`.png`)||e.endsWith(`.jpg`)||e.endsWith(`.jpeg`)||e.endsWith(`.webp`)||e.endsWith(`.gif`)||e.endsWith(`.ico`)||e.endsWith(`.svg`)?`<link rel="preload" as="image" crossorigin href="${e}">`:null}function ue(e,t){if(e===!1||e==null)throw console.error(`The following error is a bug in Boltdocs SSG; please open an issue! https://github.com/bolt-docs/boltdocs/issues/new`),Error(t)}function de(e){let t=new Headers;for(let[n,r]of Object.entries(e))if(r)if(Array.isArray(r))for(let e of r)t.append(n,e);else t.set(n,r);return t}function fe(e){let t=e.headers.origin&&e.headers.origin!==`null`?e.headers.origin:`http://${e.headers.host}`;ue(e.originalUrl,"Expected `nodeReq.originalUrl` to be defined");let n=new URL(e.originalUrl,t),r={method:e.method,headers:de(e.headers)};return new Request(n.href,r)}async function pe(e,t){t.statusCode=e.status,t.statusMessage=e.statusText;for(let[n,r]of e.headers)t.setHeader(n,r);if(e.body){let n=e.body,r=k.from(n);r.pipe(t),await O(r,`end`)}else t.end()}function me(e){let t=new URL(e.url);t.searchParams.delete(`_data`);let n={method:e.method,body:e.body,headers:e.headers,signal:e.signal};return n.body&&(n.duplex=`half`),new Request(t.href,n)}async function R(e){return A.renderToString(l(c,{children:e}))}function he(e,t,n){let{helmet:r}=t,i=r.htmlAttributes.toString(),a=r.bodyAttributes.toString(),o=r.title.toString();o.split(`>`)[1]===`</title`&&(o=``);let s=[o,r.meta.toString(),r.link.toString(),r.script.toString()],c=n?.toString?.(e)??``;return{htmlAttributes:i,bodyAttributes:a,metaAttributes:s.filter(Boolean),styleTag:c}}let z=null;function B(){return z||(z=globalThis.__BOLTDOCS_HELMET_PROVIDER__||(()=>{let{createRequire:e}=N(`node:module`);return e(import.meta.url)(`react-helmet-async`).HelmetProvider})(),z)}let V=null;async function H(){return V||=await import(`react-router-dom`),V}var U=class{constructor(e){this._dataRoutes=null,this._staticHandler=null,this.handleLoader=async(e,t)=>{let{routes:n,base:r}=this.context,{matchRoutes:i}=await H(),o=fe(e),s=new URL(o.url),c=decodeURIComponent(s.searchParams.get(`_data`)),l=i(a([...n],e=>e),{pathname:s.pathname,search:s.search,hash:s.hash,state:null,key:`default`},r);if(!l){t.statusCode=404,t.end(`Route not found: ${c}`);return}let u=l.find(e=>e.route.id===c);if(!u){t.statusCode=404,t.end(`Route not found: ${c}`);return}let d=u.route.loader??await u.route.lazy?.().then(e=>e.loader);if(!d){t.statusCode=200,t.end(`There is no loader for the route: ${c}`);return}await pe(await W({loader:d,params:u.params,request:o,routeId:c}),t)},this.context=e}async render(e){let{base:t,routes:n,getStyleCollector:r,routerOptions:i}=this.context,s=o(e),c=s;if(t!==`/`){let e=o(t).replace(/\/$/,``);!s.startsWith(e+`/`)&&s!==e&&(c=`${e}${s}`)}let u=`http://localhost${c}`,d=new Request(u),f=r?await r():null,p={},m=null,{StaticRouterProvider:h,createStaticHandler:g,createStaticRouter:_}=await H(),v=this._dataRoutes??=a([...n],e=>e);this._staticHandler??=g(v,{basename:t});let{query:y}=this._staticHandler,b=await y(d),x=0;for(;b instanceof Response&&x<10;){let e=b.headers.get(`Location`);if(!e)break;let t;if(/^https?:\/\//i.test(e))try{let n=new URL(e);if(n.hostname===`localhost`||n.hostname===``)t=`http://localhost${o(n.pathname+n.search+n.hash)}`;else break}catch{break}else t=`http://localhost${o(e)}`;b=await y(new Request(t)),x++}if(b instanceof Response)throw b;m=b;let S=_(v,m,{future:i.future}),C=B(),w=C;w&&typeof w==`function`&&(w.canUseDOM=!1);let T=l(C,{context:p,children:l(h,{router:S,context:m})});f&&(T=f.collect(T));let E=await R(T),{htmlAttributes:D,bodyAttributes:O,metaAttributes:k,styleTag:A}=he(E,p,f);return{appHTML:E,htmlAttributes:D,bodyAttributes:O,metaAttributes:k,styleTag:A,routerContext:m}}};async function W({loader:e,params:t,request:n,routeId:r}){let{json:i}=await H(),a=await e({request:me(_e(n)),params:t});if(a===void 0)throw Error(`You defined a loader for route "${r}" but didn't return anything from your \`loader\` function. Please return a value or \`null\`.`);return ge(a)?a:i(a)}function ge(e){return e!=null&&typeof e.status==`number`&&typeof e.statusText==`string`&&typeof e.headers==`object`&&e.body!==void 0}function _e(e){let t=new URL(e.url),n=t.searchParams.getAll(`index`);t.searchParams.delete(`index`);let r=[];for(let e of n)e&&r.push(e);for(let e of r)t.searchParams.append(`index`,e);let i={method:e.method,body:e.body,headers:e.headers,signal:e.signal};return i.body&&(i.duplex=`half`),new Request(t.href,i)}function ve(e){return new U(e)}var G=`0.3.0`;async function ye(e){if(!e||e.length===0)return{paths:[`/`]};let t=new Set,n=async(e,i=``)=>{i=i.replace(/\/$/g,``);for(let a of e){if(a.lazy){let e=await a.lazy();e&&(a={...a,...e})}let e=a.path;if(e=r(e,i),a.getStaticPaths&&K(e)){let e=await a.getStaticPaths();for(let t of e)t=r(t,i),Array.isArray(a.children)&&await n(a.children,t)}a.index&&!e&&t.add(i||`/`),Array.isArray(a.children)&&await n(a.children,e)}};return await n(e),{paths:Array.from(t)};function r(e,n){if(e!=null){if(e===`.`){let e=n||`/`;return t.add(e),e}e=n&&!e.startsWith(`/`)?`${n}${e?`/${e}`:``}`:e,t.add(e)}return e}}async function be(e,t){return await e.createResolver()(t,e.root)||(t.startsWith(`virtual:`)||t.includes(`\0`)?t:_(e.root,t))}const xe=/[:*?]/;function K(e){return e?xe.test(e):!1}const Se=new Set([`.png`,`.jpg`,`.jpeg`,`.gif`,`.svg`,`.webp`,`.avif`,`.ico`]),Ce=new Set([`.woff`,`.woff2`,`.ttf`,`.otf`,`.eot`]);function q(e){try{return j.statSync(e).size}catch{return 0}}async function we(e,t){let n=_(e,`.vite`),r=_(e,`assets`),i={},a=_(n,`manifest.json`);j.existsSync(a)&&(i=JSON.parse(await j.readFileSync(a,`utf-8`)));let o=0,s=0;for(let[,t]of Object.entries(i)){let{file:n,css:r=[]}=t,i=q(_(e,n));o+=i;for(let t of r)s+=q(_(e,t))}let c=0,l=0;if(j.existsSync(r)){let e=j.readdirSync(r,{withFileTypes:!0});for(let t of e){if(!t.isFile())continue;let e=m.extname(t.name).toLowerCase(),n=_(r,t.name);Se.has(e)?c+=q(n):Ce.has(e)&&l++}}let u=_(e,`index.html`),d=0,f=[];if(j.existsSync(u)){let e=q(u);d+=e,f.push({route:`/`,htmlSize:e,htmlFile:`index.html`})}try{let t=j.readdirSync(e,{recursive:!0});for(let n of t){if(!n.endsWith(`.html`)||n===`index.html`)continue;let t=q(_(e,n));if(t>0){let e=`/`+n.replace(/\\/g,`/`).replace(/\/index\.html$/,``).replace(/\.html$/,``);d+=t,f.push({route:e,htmlSize:t,htmlFile:n})}}}catch{}return{buildTime:t,totalJSBundleSize:o,totalCSSBundleSize:s,totalImagesSize:c,totalHTMLSize:d,fontCount:l,pages:f}}function Te(e,t){let n=m.resolve(e,`..`,`.boltdocs`,`reports`);j.existsSync(n)||j.mkdirSync(n,{recursive:!0});let r=_(n,`performance.json`);j.writeFileSync(r,JSON.stringify(t,null,2))}const Ee=Number.parseInt(E)>=5?[`.vite`]:[];function De(e){return Number.parseInt(E)>=8?{rolldownOptions:e}:{rollupOptions:e}}const J=new Set([`.ts`,`.tsx`,`.js`,`.jsx`,`.css`,`.json`,`.md`,`.mdx`,`.html`,`.svg`,`.yaml`,`.yml`]),Oe=new Set([`node_modules`,`.git`,`.boltdocs`,`.turbo`,`dist`,`coverage`,`__tests__`,`test`,`tests`,`.next`,`.cache`,`public`]);function ke(e){let t=[];if(!y.existsSync(e))return t;let n=y.readdirSync(e,{withFileTypes:!0,recursive:!0});for(let e of n){if(!e.isFile()||e.name.startsWith(`.`))continue;let n=String(e.parentPath??e.path);if(n.split(`/`).slice(-1).some(e=>Oe.has(e)))continue;let r=`.`+e.name.split(`.`).pop()?.toLowerCase();J.has(r)&&t.push(_(n,e.name))}return t}let Ae=null,je=null;function Me(e,t,n,r){try{let n=[],i=_(e,t);y.existsSync(i)&&n.push(...ke(i));for(let t of[`boltdocs.config.ts`,`boltdocs.config.js`,`boltdocs.config.mjs`,`boltdocs.config.cjs`,`package.json`,`tsconfig.json`]){let r=_(e,t);y.existsSync(r)&&n.push(r)}n.sort();let a=`${n.length}:${n[0]}:${n[n.length-1]}`;if(Ae&&je===a)return Ae;let o=Array(n.length);for(let e=0;e<n.length;e++){let t=y.statSync(n[e]);o[e]={file:n[e],mtime:t.mtimeMs,size:t.size}}if(r){let e=_(r,`hash-meta.json`),t=_(r,`client-hash.txt`);try{if(y.existsSync(e)&&y.existsSync(t)){let r=JSON.parse(y.readFileSync(e,`utf-8`)),i=Math.max(...o.map(e=>e.mtime));if(r.fileCount===n.length&&r.lastMtime===i){let e=y.readFileSync(t,`utf-8`).trim();if(e)return Ae=e,je=a,e}}}catch{}}let s=D.createHash(`sha256`);for(let{file:t,mtime:n,size:r}of o)s.update(v(e,t).replace(/\\/g,`/`)),s.update(n.toString()),s.update(r.toString());let c=s.digest(`hex`);if(Ae=c,je=a,r)try{let e=Math.max(...o.map(e=>e.mtime)),t=_(r,`hash-meta.json`);y.mkdirSync(r,{recursive:!0}),y.writeFileSync(t,JSON.stringify({fileCount:n.length,lastMtime:e}))}catch{}return c}catch{return Math.random().toString(36).substring(2,12)}}function Ne(e,t){return`static-loader-data${o(e===`/`?`/index`:e.endsWith(`/`)?`${e}index`:e)}.${t}.json`}function Pe(e,t=`/`){let n=o(e),r=n;if(t!==`/`){let e=o(t).replace(/\/$/,``);!n.startsWith(e+`/`)&&n!==e&&(r=`${e}${n}`)}return r!==`/`&&r.endsWith(`/`)?r.slice(0,-1):r}function Fe(e,t){return e.filter(e=>!e.includes(`:`)&&!e.includes(`*`))}async function Ie(n={},i={}){let a=process.env.MODE||process.env.NODE_ENV||n.mode||`production`;a!==process.env.NODE_ENV&&(process.env.NODE_ENV=a);let c=await w(i,`build`,a,a),l=process.cwd(),u=c.root||l,d=c.build.outDir||`dist`,m=c.base,S=Object.assign({},c.ssgOptions||{},n),T=performance.now(),{script:E=`sync`,mock:O=!1,htmlEntry:k=`index.html`,entry:A=await se(u,k),formatting:j=`none`,includedRoutes:M=Fe,onBeforePageRender:ee,onPageRendered:te,onFinished:ne,onStep:P,dirStyle:F=`flat`,includeAllRoutes:ce=!1,format:L=`esm`,concurrency:ue=20,rootContainerId:de=`root`,routeToSourceFileMap:fe={},cacheDir:pe=`.boltdocs/build`}=S,me=S.beastiesOptions??{},R=S.turbo??!1,he=`docs`,z=Object.values(fe);if(z.length>0){let e=z[0],t=v(u,e).replace(/\\/g,`/`).split(`/`);t.length>0&&(he=t[0])}let B=g(d)?d:_(u,d),V=g(pe)?pe:_(u,pe),H=Me(u,he,d,V),U=H.substring(0,12),W=_(V,`ssr`,R?`turbo-ssr`:U),ge=_(V,`client-hash.txt`),_e=_(V,`template-index.html`),G=!1;try{y.existsSync(ge)&&y.existsSync(_e)&&y.existsSync(B)&&y.existsSync(_(B,`assets`))&&(await y.readFile(ge,`utf-8`)).trim()===H&&(G=!0)}catch{}function xe(e){return e.startsWith(`dist/`)||e.startsWith(`.boltdocs/build/ssr/`)||e.startsWith(`rendering chunks`)||e===`computing gzip size...`||e.includes(`built in`)&&e.includes(`s`)}let K=x(),Se=K.warn;K.warn=(e,t)=>{e.includes(`externalized for browser compatibility`)||e.includes(`can't be bundled without type`)||xe(e)||Se(e,t)};let Ce=K.info;if(K.info=(e,t)=>{xe(e)||Ce(e,t)},G)P?.({name:`Client build`,duration:0,success:!0,details:`Code unchanged, skipped`}),await y.ensureDir(B),await y.copy(_e,_(B,k));else{let e=performance.now();await b(C(i,{logLevel:`warn`,build:{manifest:!0,ssrManifest:!0,chunkSizeWarningLimit:2e3,...De({input:{app:_(u,k||`./index.html`)},onLog(e,t,n){t.message.includes(`react-helmet-async`)||xe(t.message)||n(e,t)}})},customLogger:K,mode:c.mode,plugins:[{name:`vite-react-ssg:get-oup-dir`,configResolved(e){d=e.build.outDir||`dist`}}]})),P?.({name:`Client build`,duration:performance.now()-e,success:!0,details:`Vite production build`}),await y.ensureDir(V),await y.copy(_(B,k),_e),await y.writeFile(ge,H,`utf-8`)}let q=()=>{};if(O){let{jsdomGlobal:e}=await import(`./jsdomGlobal-u0wZKDvc.mjs`);q=e()}let J=await be(c,A);if((R||G)&&y.existsSync(W)&&y.readdirSync(W).filter(e=>e.endsWith(`.mjs`)||e.endsWith(`.cjs`)).length>0)P?.({name:`Server build`,duration:0,success:!0,details:`SSR bundle unchanged, skipped`});else{y.existsSync(W)&&await y.remove(W),process.env.VITE_SSG=`true`;let e=performance.now();await b(C(i,{logLevel:`warn`,build:{ssr:J,manifest:!0,outDir:W,minify:!1,cssCodeSplit:!1,...De({output:L===`esm`?{entryFileNames:`[name].mjs`,format:`esm`}:{entryFileNames:`[name].cjs`,format:`cjs`},onLog(e,t,n){t.message.includes(`react-helmet-async`)||xe(t.message)||n(e,t)}})},customLogger:K,mode:c.mode})),P?.({name:`Server build`,duration:performance.now()-e,success:!0,details:`Vite SSR bundle`})}let Oe=L===`esm`&&process.platform===`win32`?`file://`:``,ke=L===`esm`?`.mjs`:`.cjs`,Ae=J.replace(/\0/g,``).replace(`virtual:`,``).replace(/[^a-zA-Z0-9-]/g,`_`),je=Oe+_(W,(J.includes(`/`)||J.includes(`\\`)?J.split(/[/\\]/).pop().replace(/\.[^/.]+$/,``).replace(ke,``):Ae)+ke).replace(/\\/g,`/`),Ie=JSON.parse(await y.readFile(_(W,...Ee,`manifest.json`),`utf-8`)),ze=N===void 0?s(import.meta.url):N,{createRoot:Be,includedRoutes:Ve}=L===`esm`?await import(je):ze(je),He=Ve||M,{routes:Ue}=await Be(!1),{paths:We}=await ye(Ue),Y=ce?We:await He(We,Ue||[]);Y=Fe(Y,Ue||[]),Y=Array.from(new Set(Y));let X;R&&(X=await ie(),X||f(`[zig-critters] WASM unavailable; falling back to beasties for critical CSS`));let Ge=me!==!1&&!X?await I(d,{publicPath:m,...me}):void 0,Ke=``;if(X){let e=_(B,`assets`);if(y.existsSync(e)){let t=y.readdirSync(e).filter(e=>e.endsWith(`.css`));for(let n of t)Ke+=y.readFileSync(_(e,n),`utf-8`)+`
|
|
2
|
-
`}}let qe=performance.now(),Je=JSON.parse(await y.readFile(_(B,...Ee,`ssr-manifest.json`),`utf-8`)),Ye=JSON.parse(await y.readFile(_(B,...Ee,`manifest.json`),`utf-8`)),Xe=await y.readFile(_(B,k),`utf-8`);y.rmSync(_(B,k)),Xe=Le(Xe,E);let Ze=(await import(`p-queue`)).default||await import(`p-queue`),Qe=new Ze({concurrency:ue}),$e=new Ze({concurrency:Math.min(p.cpus().length,4)}),et={},tt=0,nt=new Map,rt=0,it=0,at=0,ot=_(V,`ssg-cache.json`),Z=_(V,`ssg-pages`),Q={};if(!R)try{y.existsSync(ot)&&(Q=await y.readJson(ot))}catch{}let st={...Q},ct=new Set;ct.add(Z);for(let e of Y){let t=F===`nested`?_(e.replace(/^\//g,``),`index.html`):`${(e.endsWith(`/`)?`${e}index`:e).replace(/^\//g,``)}.html`;ct.add(_(B,h(t)));let n=e===`/`?`/index`:e.endsWith(`/`)?`${e}index`:e;ct.add(_(B,`static-loader-data`,h(n)))}ct.add(_(B,`static-loader-data`)),await Promise.all([...ct].map(e=>y.ensureDir(e)));for(let n of Y){let i=D.createHash(`md5`).update(n).digest(`hex`),a=_(Z,`${i}.html`),s=_(Z,`${i}.json`),c=`${(n.endsWith(`/`)?`${n}index`:n).replace(/^\//g,``)}.html`,l=F===`nested`?_(n.replace(/^\//g,``),`index.html`):c,u=_(B,l),d=o(n).replace(/\/$/,``),p=fe[d]||fe[n],h=!1,g=0;if(!R&&G&&p&&y.existsSync(p))try{if(g=Math.round(y.statSync(p).mtimeMs),y.existsSync(a)){let e=Q[d]||Q[n];e&&Math.round(e.mtime)===g&&(h=!0)}}catch{}if(h){Qe.add(async()=>{try{if(G)await y.copy(a,u);else{let e=await y.readFile(a,`utf-8`);e=e.replace(/window\.__VITE_REACT_SSG_HASH__\s*=\s*'[^']*'/,`window.__VITE_REACT_SSG_HASH__ = '${U}'`),await y.writeFile(u,e,`utf-8`)}let e=Q[d]||Q[n];if(e?.loaderDataFilePath&&y.existsSync(s)){let t=G?e.loaderDataFilePath:Ne(n,U);await y.copy(s,_(B,t)),et[Pe(n,m)]=t,tt++}it++}catch(e){throw Error(`Error on cached page: ${n}\n${e.stack}`)}});continue}Qe.add(async()=>{try{let i=await Be(!1,n),{base:c,routes:u,triggerOnSSRAppRendered:d,transformState:h=r,app:v,routerType:b}=i,x=await ee?.(n,Xe,i)||Xe,S=`${t(c)}${e(n)}`,C=ve(i),w;if(!v&&b===`remix`){let e=nt.get(n);e?w=e:(w=await re({routes:[...u],locationArg:S,base:c,serverManifest:Ie,manifest:Ye,ssrManifest:Je}),nt.set(n,w))}else w=new Set;let{appHTML:T,bodyAttributes:E,htmlAttributes:D,metaAttributes:O,styleTag:k,routerContext:A}=await C.render(n),M=A?.loaderData,N;if(M&&Object.keys(M).length>0){let e=Ne(n,U);N=e,await y.writeFile(_(B,e),JSON.stringify(M)),et[Pe(n,m)]=e,tt++}await d?.(n,T,i);let ne=await oe({rootContainerId:de,appHTML:T,indexHTML:x,metaAttributes:O,bodyAttributes:E,htmlAttributes:D,initialState:null}),P=le(w),F=ne.replace(/<script[^>]*>(?:(?!<\/script>)[\s\S])*__staticRouterHydrationData(?:(?!<\/script>)[\s\S])*<\/script>/g,``);P&&(F=F.replace(`<head>`,`<head>${P}`));let I=await te?.(n,F,i)||F,ie=``;if(M&&Object.keys(M).length>0){let e=JSON.stringify(M).replace(/</g,`\\u003c`);ie=`window.__VITE_REACT_SSG_STATIC_LOADER_DATA__ = { '${Pe(n,m)}': ${e} };`}let se=``;if(A){let e={loaderData:A.loaderData??{},actionData:A.actionData??null,errors:A.errors??null};se=`window.__staticRouterHydrationData = ${JSON.stringify(e).replace(/</g,`\\u003c`)};`}let ce=`<script>window.__VITE_REACT_SSG_HASH__ = '${U}';${ie}${se}<\/script>`;if(I=I.replace(`<head>`,`<head>${ce}`),I=I.replace(`<script>${ae}<\/script>`,``),X){try{Ke&&(I=await X.processHtml(I,Ke))}catch(e){f(`[zig-critters] Failed to inline CSS for "${n}": ${e instanceof Error?e.message:String(e)}`)}I=I.replace(/<link\srel="stylesheet"(?!.*\bcrossorigin\b)/g,`<link rel="stylesheet" crossorigin`)}else Ge&&(I=await $e.add(()=>Ge.process(I)),I=I.replace(/<link\srel="stylesheet"(?!.*\bcrossorigin\b)/g,`<link rel="stylesheet" crossorigin`));k&&(I=I.replace(`<head>`,`<head>${k}`));let L=await Re(I,j);if(await y.writeFile(_(B,l),L,`utf-8`),!R&&p&&y.existsSync(p)){await y.writeFile(a,L,`utf-8`);let e=o(n).replace(/\/$/,``),t=Math.round(g);M&&Object.keys(M).length>0&&N?(await y.writeFile(s,JSON.stringify(M),`utf-8`),st[e]={mtime:t,loaderDataFilePath:N}):st[e]={mtime:t}}rt++,at+=L.length}catch(e){throw Error(`Error on page: ${n}\n${e.stack}`)}})}await Qe.start().onIdle();let lt=rt+it,ut=(at/1024/1024).toFixed(2),dt=0;if(!R)try{if(await y.ensureDir(h(ot)),await y.writeJson(ot,st),y.existsSync(Z)){let e=await y.readdir(Z),t=new Set;for(let e of Object.keys(st)){let n=D.createHash(`md5`).update(e).digest(`hex`);t.add(`${n}.html`),t.add(`${n}.json`)}for(let n of e)(n.endsWith(`.html`)||n.endsWith(`.json`))&&(t.has(n)||(await y.remove(_(Z,n)),dt++))}}catch{}P?.({name:`Render pages`,duration:performance.now()-qe,success:!0,details:`${lt} pages (${rt} new, ${it} cached, ${ut} MB)`,metrics:{renderedCount:rt,cachedCount:it,renderedSize:at,totalPages:lt,prunedCount:dt}});let ft=performance.now(),pt=JSON.stringify(et,null,0);await y.writeFile(_(B,`static-loader-data-manifest-${U}.json`),pt),G||await y.remove(_(V,`ssr`)),q();let mt=c.plugins.find(e=>e.name===`vite-plugin-pwa`)?.api;mt&&!mt.disabled&&mt.generateSW&&await mt.generateSW();let ht=Math.round(performance.now()-T),$=await we(B,ht);Te(B,$),P?.({name:`Static loader data`,duration:performance.now()-ft,success:!0,details:`${tt} loader data files`,metrics:{loaderDataFileCount:tt}}),P?.({name:`Build metrics`,duration:0,success:!0,details:`Build time: ${(ht/1e3).toFixed(1)}s, JS: ${($.totalJSBundleSize/1024).toFixed(0)} kB, CSS: ${($.totalCSSBundleSize/1024).toFixed(0)} kB`,metrics:{buildTime:ht,totalPages:$.pages.length,jsSize:$.totalJSBundleSize,cssSize:$.totalCSSBundleSize}}),await ne?.(d),setTimeout(()=>{f(`Build process still running after 15s. There might be something misconfigured in your setup. Force exit.`),process.exit(0)},15*1e3).unref()}function Le(e,t){return!t||t===`sync`?e:e.replace(/<script type="module" /g,`<script type="module" ${t} `)}async function Re(e,t){if(t===`prettify`)try{let t=(await import(`prettier/esm/standalone.mjs`)).default,n=(await import(`prettier/esm/parser-html.mjs`)).default;return t.format(e,{semi:!1,parser:`html`,plugins:[n]})}catch(t){return d(`Error formatting html: ${t?.message}`),e}return e}function ze(e,t,n){if(e.url)try{let t=e.url,n=t.indexOf(`?`),r=n>=0?t.slice(0,n):t,i=n>=0?t.slice(n):``;if(/%[0-9A-Fa-f]{2}/.test(r)){let t=decodeURI(r);if(t!==r){let n=t+i;e.url=n,e.originalUrl&&=n}}}catch{}n()}function Be({template:e,ssrEntry:t,onBeforePageRender:r,entry:a,rootContainerId:o,onPageRendered:s}){return{name:`vite-react-ssg:dev-server`,configureServer(c){let l=async(l,u,f)=>{try{let d=l.originalUrl,f=await(await c.ssrLoadModule(t).then(e=>e.createRoot))(!1,d),p=ve(f),{app:m,base:h}=f,[g,_]=d.split(`?`),v=new URLSearchParams(_);if(!m&&v.has(`_data`))return p.handleLoader(l,u);let y=await c.transformIndexHtml(d,e),b=await r?.(d,y,f)||y,{appHTML:x,bodyAttributes:S,htmlAttributes:C,metaAttributes:w,styleTag:E}=await p.render(i(g,h));w.push(E);let D=await Promise.all([t,a].map(async e=>await c.moduleGraph.getModuleByUrl(e))),O=new Set,k=new Set,A=async e=>{if(!e||!e?.ssrTransformResult||k.has(e))return;k.add(e);let{deps:t=[],dynamicDeps:n=[]}=e?.ssrTransformResult,r=[...t,...n];for(let e of r)if(e.endsWith(`.css`)||e.endsWith(`.scss`)||e.endsWith(`.sass`)||e.endsWith(`.less`))O.add(e);else if(e.endsWith(`.ts`)||e.endsWith(`.tsx`)){let t=await c.moduleGraph.getModuleByUrl(e);t&&await A(t)}};await Promise.all(D.map(async e=>A(e)));let j=[...O].map(e=>ce(n(c.config.base,e)));w.push(...j);let M=await oe({rootContainerId:o,appHTML:x,indexHTML:b,metaAttributes:w,bodyAttributes:S,htmlAttributes:C,initialState:null}),N=await s?.(d,M,f)||M;u.statusCode=200,u.setHeader(`Content-Type`,`text/html`),T(l,u,N,`html`,{headers:`pluginContainer`in c?c.config.server.headers:c.config.preview.headers})}catch(e){c.ssrFixStacktrace(e),d(`SSR render error`,e),u.statusCode=500,u.end(e.stack)}};return c.middlewares.use(ze),()=>{c.middlewares.use(l)}}}}async function Ve(e={},t={}){try{let n=process.env.NODE_ENV||t.mode||`development`,r=await w(e,`serve`,n,n),i=process.cwd(),a=r.root||i,o={...r.ssgOptions,...t},{htmlEntry:s=`index.html`,onBeforePageRender:c,onPageRendered:l,rootContainerId:u=`root`,mock:d=!1}=o,f=o.entry||await se(a,s),[p,m]=await Promise.all([be(r,f),M.readFile(_(a,s),`utf-8`)]);if(process.env.__DEV_MODE_SSR=`true`,d){let{jsdomGlobal:e}=await import(`./jsdomGlobal-u0wZKDvc.mjs`);e()}return await S({...e,plugins:[...e.plugins??[],Be({template:m,ssrEntry:p,onBeforePageRender:c,onPageRendered:l,entry:f,rootContainerId:u})]})}catch(e){throw Error(`[vite-react-ssg] Failed to create dev server: ${e instanceof Error?e.message:String(e)}`,{cause:e})}}async function He(e={},t={},n){globalThis.__ssr_start_time=performance.now();try{let r=await Ve(t,e);return await r.listen(),Ue(r,!!n),r.bindCLIShortcuts({print:!0}),r}catch(e){d(`failed to start server: ${e?.message??e}`),process.exit(1)}}function Ue(e,t=!1){if(t){e.printUrls();return}let n=e.config.logger.info,r=` -- SSR`;if(globalThis.__ssr_start_time){let e=Math.round(performance.now()-globalThis.__ssr_start_time);r+=` ready in ${u.reset(u.bold(`${e}ms`))}`}n(`\n ${u.cyan(` VITE-REACT-SSG v${G} `)}`,{clear:!e.config.logger.hasWarned}),n(`${u.cyan(`\n VITE v${E}`)+u.dim(r)}\n`),n(u.green(` dev server running at:`)),e.printUrls()}export{Ie as build,Ve as createServer,He as dev};
|
|
1
|
+
import{a as e,i as t,n,o as r,r as i,s as a,t as o}from"./router-adapter-BukFH1uk.mjs";import{n as s,t as c}from"./ssg-worker-payload-BHsJklNf.mjs";import{createRequire as l}from"node:module";import{colors as u,error as d,warn as f}from"@bdocs/dui";import p from"node:os";import m,{basename as h,dirname as g,isAbsolute as _,join as v,relative as y,resolve as b,sep as x}from"node:path";import S from"fs-extra";import{build as ee,createLogger as te,createServer as ne,mergeConfig as C,resolveConfig as re,send as w,version as T}from"vite";import E,{createHash as D}from"node:crypto";import O,{readFile as k}from"node:fs/promises";import A from"node:fs";const ie=/import\("([^)]+)"\)/g;function j(e,t){let n=new Set;if(!t)return n;for(let r of t)M(e,r,n);return n}function M(e,t,n=new Set){return t?(n.add(t),e[t]?.dynamicImports?.forEach(t=>{M(e,t,n)}),n):n}function N(e,t,n,r){let i=e?.map(e=>e.route.entry).filter(Boolean)??[],a=new Set;e?.forEach(e=>{let t=``;e.route.lazy&&(t+=e.route.lazy.toString()),e.route.Component?._payload?._result&&(t+=e.route.Component._payload._result.toString());let n=t.matchAll(ie);for(let e of n)a.add(e[1].split(`/`).at(-1)??``)});let o=new Set(i);for(let e of a){let t=n.find(([t,n])=>n.file.endsWith(e));t&&o.add(t[0])}let s=new Set;for(let e of o){let n=r.get(e);if(!n){let i=j(t.manifest,new Set([e]));n=new Set;for(let e of i)for(let r of t.ssrManifest[e]||[])n.add(r);r.set(e,n)}for(let e of n)s.add(e)}return s}function P(e){let t=Object.entries(e.serverManifest),n=new Map,r=new Map;return i=>{let a=r.get(i);if(a)return a;let o=Promise.resolve().then(()=>{let r=N(e.matchRouteBranchWithParams([...e.routes],i,e.base),e,t,n);return new Set(r)});return r.set(i,o),o.catch(()=>{r.get(i)===o&&r.delete(i)}),o}}async function ae(e,t={}){try{let n=await import(`beasties`);return new(n.default||n)({path:e,logLevel:`warn`,external:!0,inlineFonts:!0,preloadFonts:!0,...t})}catch{return}}async function oe(){try{let e=await import(`@bdocs/zig-critters`),t=e.processHtml||e.default?.processHtml;return t?{processHtml:t}:void 0}catch{return}}function se(e,t,n){let r=e.replace(/<!--[\s\S]*?-->/g,``).replace(/>([^<]+)</g,`><`).replace(/\s+/g,` `).trim();return E.createHash(`sha256`).update(n).update(`\0`).update(r).update(`\0`).update(t).digest(`hex`)}function F(e){return e.match(/<style\b[^>]*>[\s\S]*?<\/style>/gi)??[]}function ce(e,t){let n=new Set(F(e)),r=F(t).filter(e=>!n.has(e));return r.length>0?r.join(`
|
|
2
|
+
`):null}var le=class{constructor(e=512){this.maxEntries=e,this.entries=new Map}getOrCreate(e,t){let n=this.entries.get(e);if(n)return n.promise;let r={promise:Promise.resolve(null),settled:!1},i=Promise.resolve().then(t).catch(t=>{throw this.entries.delete(e),t}).finally(()=>{r.settled=!0,this.evictSettledEntries()});return r.promise=i,this.entries.set(e,r),this.evictSettledEntries(),i}get size(){return this.entries.size}evictSettledEntries(){for(;this.entries.size>this.maxEntries;){let e=!1;for(let[t,n]of this.entries)if(n.settled){this.entries.delete(t),e=!0;break}if(!e)return}}};const I=new Set([`.js`,`.mjs`,`.css`]);function L(e){let t=m.extname(e).toLowerCase();return I.has(t)}function ue(e){let t=new Map,n=new Map;for(let r of Object.values(e))t.set(r.file,r),r.src&&n.set(r.src,r);return{byFile:t,bySrc:n}}function R(e,t,n){if(n.has(t))return;let r=e.get(t);if(r){n.add(t);for(let t of r.imports||[])L(t)&&R(e,t,n);for(let e of r.css||[])n.add(e);for(let t of r.dynamicImports||[])L(t)&&!n.has(t)&&R(e,t,n)}}async function de(e,t,n){if(n){let e=E.createHash(`md5`);for(let r of t){let t=n.get(r);t&&e.update(t)}return e.digest(`hex`)}let r=new Map;await Promise.all(t.map(async t=>{try{let n=await k(m.join(e,t));r.set(t,n)}catch{}}));let i=E.createHash(`md5`);for(let e of Array.from(r.keys()).sort()){let t=r.get(e);t&&i.update(t)}return i.digest(`hex`)}async function fe(e){let{outDir:t,indexes:n,manifest:r,ssrManifest:i,routeSourceFile:a,root:o,clientHash:s,assetHashes:c}=e,l=n;if(!l){if(!r)throw Error(`computeRouteClientAssetHash requires either indexes or manifest`);l=ue(r)}let{byFile:u,bySrc:d}=l,f=m.relative(o,a).replace(/\\/g,`/`),p=new Set,h=d.get(f);if(h)R(u,h.file,p);else{let e=[f,a.replace(/\\/g,`/`)];for(let t of e){let e=i[t];if(Array.isArray(e))for(let t of e)L(t)&&R(u,t,p)}}if(p.size===0){if(!s)throw Error(`No client chunk found for ${a} and no global client hash was provided`);return s}return de(t,Array.from(p).sort(),c)}const pe=`/* SCRIPT_COMMENT_PLACEHOLDER */`;function z(e,t,n){let r=n.trim();if(!r)return e;let i=RegExp(`<${t}\\b([^>]*)>`,`i`).exec(e);if(!i)return e;let a=[...r.matchAll(/(?:^|\s)([A-Za-z_:][\w:.-]*)\s*=/g)].map(e=>e[1]),o=i[1];for(let e of a){let t=e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`);o=o.replace(RegExp(`\\s+${t}\\s*=\\s*(?:"[^"]*"|'[^']*'|[^\\s>]*)`,`gi`),``)}let s=o.trim()?`${o.trim()} ${r}`:r;return e.replace(i[0],`<${t} ${s}>`)}function me({rootContainerId:e,indexHTML:t}){let n=[{token:`<html`,kind:`html`},{token:`<head>`,kind:`head`},{token:`<body`,kind:`body`},{token:`<div id="${e}"></div>`,kind:`container`}].map(({token:e,kind:n})=>({kind:n,token:e,index:t.indexOf(e),lastIndex:t.lastIndexOf(e)})).sort((e,t)=>e.index-t.index);if(n.some(e=>e.index<0||e.index!==e.lastIndex))return null;let r=[],i=0;for(let e of n)r.push({text:t.slice(i,e.index)}),r.push({kind:e.kind,text:``}),i=e.index+e.token.length;return r.push({text:t.slice(i)}),({appHTML:t,metaAttributes:n,bodyAttributes:i,htmlAttributes:a,initialState:o})=>{let s=o?`\n<script>window.__INITIAL_STATE__=${o}<\/script>`:``,c=`\n<script>${pe}<\/script>`,l=n.join(``),u=`<div id="${e}" data-server-rendered="true">${t}</div>${s}${c}`;return z(z(r.map(e=>{if(!e.kind)return e.text;switch(e.kind){case`html`:return`<html`;case`head`:return`<head>${l}`;case`body`:return`<body`;case`container`:return u;default:return e.text}}).join(``),`html`,a),`body`,i)}}async function he({rootContainerId:e,indexHTML:t,appHTML:n,metaAttributes:r,bodyAttributes:i,htmlAttributes:a,initialState:o}){let s=o?`\n<script>window.__INITIAL_STATE__=${o}<\/script>`:``,c=`\n<script>${pe}<\/script>`,l=r.join(``),u=`<div id="${e}"></div>`;if(t.includes(u))return z(z(t.replace(`<head>`,`<head>${l}`).replace(u,`<div id="${e}" data-server-rendered="true">${n}</div>${s}${c}`),`html`,a),`body`,i);let d=await import(`html5parser`),f=d.parse(t),p;if(d.walk(f,{enter:r=>{if(!p&&r?.type===d.SyntaxKind.Tag&&Array.isArray(r.attributes)&&r.attributes.length>0&&r.attributes.some(t=>t.name.value===`id`&&t.value?.value===e)){let e=[...r.attributes.map(({name:{value:e},value:t})=>`${e}="${t.value}"`)].join(` `),i=t.slice(0,r.start),a=t.slice(r.end);p=`${i}<${r.name} ${e} data-server-rendered="true">${n}</${r.name}>${s}${c}${a}`}}}),!p)throw Error(`Could not find a tag with id="${e}" to replace it with server-side rendered HTML`);return z(z(p,`html`,a),`body`,i)}async function ge(e,t=`index.html`){let[,n]=[...(await S.readFile(v(e,t),`utf-8`)).matchAll(/<script(?:.*?)src=["'](.+?)["'](?!<)(?:.*)>(?:[\n\r\s]*?)(?:<\/script>)/gim)].find(e=>{let[t]=e,[,n]=t.match(/.*\stype=(?:'|")?([^>'"\s]+)/i)||[];return n===`module`})||[];return n||`src/main.ts`}function _e(e){return`<link rel="stylesheet" href="${e}">`}function ve(e){let t=new Set,n=[];return e&&e.forEach(e=>{if(!t.has(e)){t.add(e);let r=ye(e);r&&n.push(r)}}),n.join(``)}function ye(e){return e.endsWith(`.js`)?`<link rel="modulepreload" crossorigin href="${e}">`:e.endsWith(`.css`)?`<link rel="stylesheet" crossorigin href="${e}">`:e.endsWith(`.woff`)||e.endsWith(`.woff2`)||e.endsWith(`.ttf`)?`<link rel="preload" as="font" type="font/woff2" crossorigin href="${e}">`:e.endsWith(`.png`)||e.endsWith(`.jpg`)||e.endsWith(`.jpeg`)||e.endsWith(`.webp`)||e.endsWith(`.gif`)||e.endsWith(`.ico`)||e.endsWith(`.svg`)?`<link rel="preload" as="image" crossorigin href="${e}">`:null}var B=`0.4.0`;async function be(e){if(!e||e.length===0)return{paths:[`/`]};let t=new Set,n=async(e,i=``)=>{i=i.replace(/\/$/g,``);for(let a of e){if(a.lazy){let e=await a.lazy();e&&(a={...a,...e})}let e=a.path;if(e=r(e,i),a.getStaticPaths&&H(e)){let e=await a.getStaticPaths();for(let t of e)t=r(t,i),Array.isArray(a.children)&&await n(a.children,t)}a.index&&!e&&t.add(i||`/`),Array.isArray(a.children)&&await n(a.children,e)}};return await n(e),{paths:Array.from(t)};function r(e,n){if(e!=null){if(e===`.`){let e=n||`/`;return t.add(e),e}e=n&&!e.startsWith(`/`)?`${n}${e?`/${e}`:``}`:e,t.add(e)}return e}}async function xe(e,t){return await e.createResolver()(t,e.root)||(t.startsWith(`virtual:`)||t.includes(`\0`)||t.includes(`boltdocs/entry`)||t.includes(`boltdocs-entry`)?t:v(e.root,t))}const V=/[:*?]/;function H(e){return e?V.test(e):!1}async function Se(e,t){if(e!==t){await S.ensureDir(g(t)),await S.remove(t);try{await S.link(e,t)}catch{await S.copy(e,t)}}}async function Ce(e){let t=new Set,n=[];for(let r of e)t.has(r.destination)||(t.add(r.destination),n.push(Se(r.source,r.destination)));await Promise.all(n)}function we({batchSize:e=64,maxBytes:t=8388608,writeFile:n}){let r=Math.max(1,Math.floor(e)),i=Math.max(1,Math.floor(t)),a=[],o=0,s=Promise.resolve(),c=0,l=()=>{if(a.length===0)return s;let e=a;return a=[],o=0,s=s.then(async()=>{let t=performance.now();await Promise.all(e.map(({filePath:e,content:t})=>n(e,t))),c+=performance.now()-t}),s};return{enqueue(e,t){let u=Buffer.byteLength(t,`utf8`);return u>i?(s=l().then(async()=>{let r=performance.now();await n(e,t),c+=performance.now()-r}),s):(a.push({filePath:e,content:t}),o+=u,a.length>=r||o>=i?l():Promise.resolve())},flush:l,pendingCount(){return a.length},writeTimeMs(){return c}}}function Te(e,t,n,r=[]){return{cacheHash:e,clientFiles:[...new Set(t)].sort(),pageFiles:[...new Set(n)].sort(),auxiliaryFiles:[...new Set(r)].sort()}}function Ee(e,t,n,r,i,a=e?.auxiliaryFiles||[]){if(!e||e.cacheHash!==t)return!1;let o=(e,t)=>e.length===t.length?e.every((e,n)=>e===t[n]):!1,s=[...new Set(r)].sort(),c=[...new Set(i)].sort(),l=[...new Set(a)].sort();if(!o(e.clientFiles,s)||!o(e.pageFiles,c)||!o(e.auxiliaryFiles||[],l))return!1;let u=[...s,...c,...l];return o(je(n),[...new Set(u)].sort())?u.every(e=>S.existsSync(`${n}/${e}`)):!1}function De(e,t,n){if(!e)return!1;let r=e.clientFiles.filter(e=>e!==n).sort(),i=t.filter(e=>e!==n).sort();return r.length===i.length&&r.every((e,t)=>e===i[t])}async function Oe(e){try{let t=await S.readJson(e);return!t||typeof t.cacheHash!=`string`||!Array.isArray(t.clientFiles)||!Array.isArray(t.pageFiles)||!Array.isArray(t.auxiliaryFiles)||t.clientFiles.some(e=>typeof e!=`string`)||t.pageFiles.some(e=>typeof e!=`string`)||t.auxiliaryFiles.some(e=>typeof e!=`string`)?void 0:Te(t.cacheHash,t.clientFiles,t.pageFiles,t.auxiliaryFiles)}catch{return}}async function ke(e,t,n,r,i=[],a){let o=a||je(n),s=new Set(r),c=new Set(i);return Pe(e,Te(t,i.length>0?[...c]:o.filter(e=>!s.has(e)),r,i.length>0?o.filter(e=>!s.has(e)&&!c.has(e)):[]))}function Ae(e,t,n){let r=[];for(let i of e){let e=i.replace(/^\/+/,``).replace(/\/+$/,``),a=n===`nested`?`${e?`${e}/`:``}index.html`:`${(i.endsWith(`/`)?`${i}index`:i).replace(/^\/+/,``)}.html`;r.push(a);let o=t[U(i)]?.loaderDataFilePath;o&&r.push(o)}return[...new Set(r)]}function je(e){let t=[],n=r=>{let i;try{i=S.readdirSync(r,{withFileTypes:!0})}catch{return}for(let a of i){if(a.name===`.vite`)continue;let i=`${r}/${a.name}`;a.isDirectory()?n(i):a.isFile()&&t.push(y(e,i).split(x).join(`/`))}};return n(e),t.sort()}function U(t){return!t||t===`/`?``:e(t).replace(/\/+$/,``)}function Me(e,t){let n=new Set(t.map(U)),r={};for(let[t,i]of Object.entries(e)){let e=U(t);n.has(e)&&(r[e]=i)}return r}async function Ne(e,t){try{if(await S.readFile(e,`utf8`)===t)return!1}catch{}return await S.ensureDir(g(e)),await S.writeFile(e,t,`utf8`),!0}async function Pe(e,t,n=2){try{let n=await S.readJson(e);if(JSON.stringify(n)===JSON.stringify(t))return!1}catch{}return await S.ensureDir(g(e)),await S.writeJson(e,t,{spaces:n}),!0}const Fe=new Set([`.png`,`.jpg`,`.jpeg`,`.gif`,`.svg`,`.webp`,`.avif`,`.ico`]),W=new Set([`.woff`,`.woff2`,`.ttf`,`.otf`,`.eot`]);function Ie(e){try{return A.statSync(e).size}catch{return 0}}const Le=`boltdocs-metrics.json`;function Re(e){if(!e)return null;try{let t=v(e,Le);return A.existsSync(t)?JSON.parse(A.readFileSync(t,`utf-8`)):null}catch{return null}}function ze(e,t){try{let n=m.resolve(e,`..`,`reports`);A.existsSync(n)||A.mkdirSync(n,{recursive:!0}),A.writeFileSync(v(e,Le),JSON.stringify(t))}catch{}}async function Be(e,t,n,r={}){if(!r.outputFiles&&!r.manifestPath){let e=Re(n);if(e)return e.buildTime=t,e}let i=v(e,`.vite`),a=v(e,`assets`),o={},s=r.manifestPath||v(i,`manifest.json`);A.existsSync(s)&&(o=JSON.parse(await A.readFileSync(s,`utf-8`)));let c=0,l=0;for(let[,t]of Object.entries(o)){let{file:n,css:r=[]}=t,i=Ie(v(e,n));c+=i;for(let t of r)l+=Ie(v(e,t))}let u=0,d=0;if(A.existsSync(a)){let e=A.readdirSync(a,{withFileTypes:!0});for(let t of e){if(!t.isFile())continue;let e=m.extname(t.name).toLowerCase(),n=v(a,t.name);Fe.has(e)?u+=Ie(n):W.has(e)&&d++}}let f=v(e,`index.html`),p=0,h=[];if(A.existsSync(f)){let e=Ie(f);p+=e,h.push({route:`/`,htmlSize:e,htmlFile:`index.html`})}let g=r.outputFiles?[...r.outputFiles]:(()=>{try{return A.readdirSync(e,{recursive:!0})}catch{return[]}})();for(let t of g){if(!t.endsWith(`.html`)||t===`index.html`)continue;let n=Ie(v(e,t));if(n>0){let e=`/`+t.replace(/\\/g,`/`).replace(/\/index\.html$/,``).replace(/\.html$/,``);p+=n,h.push({route:e,htmlSize:n,htmlFile:t})}}let _={buildTime:t,totalJSBundleSize:c,totalCSSBundleSize:l,totalImagesSize:u,totalHTMLSize:p,fontCount:d,pages:h};return n&&ze(n,_),_}function Ve(e,t){let n=m.resolve(e,`..`,`.boltdocs`,`reports`);A.existsSync(n)||A.mkdirSync(n,{recursive:!0});let r=v(n,`performance.json`);A.writeFileSync(r,JSON.stringify(t,null,2))}function He(e,t){try{if(!S.existsSync(e))return!1;let n=S.readFileSync(e);return t.update(n),!0}catch{return!1}}const Ue=new Set([`node_modules`,`.git`,`.boltdocs`,`.turbo`,`dist`,`coverage`,`__tests__`,`test`,`tests`,`.next`,`.cache`]),We=new Set([`.ts`,`.tsx`,`.js`,`.jsx`,`.css`,`.json`,`.md`,`.mdx`,`.html`,`.svg`,`.yaml`,`.yml`,`.webp`,`.png`,`.jpg`,`.jpeg`,`.gif`,`.ico`]);function Ge(e){let t=e.lastIndexOf(`.`);if(t===-1)return!1;let n=e.slice(t).toLowerCase();return We.has(n)}function Ke(e,t,n){let r;try{r=S.readdirSync(e)}catch{return}r.sort();for(let i of r){if(i.startsWith(`.`))continue;let r=v(e,i),a;try{a=S.statSync(r)}catch{continue}if(a.isDirectory()){if(Ue.has(i))continue;Ke(r,t,n)}else if(a.isFile()&&Ge(i)){let e=y(t,r).replace(/\\/g,`/`);n.update(`${e}:${a.mtimeMs}:${a.size}\n`)}}}function qe(e,t){let n=l(import.meta.url);for(let r of[`boltdocs`,`@bdocs/ssg`])try{let i=v(g(n.resolve(`${r}/package.json`,{paths:[e]})),`dist`);S.existsSync(i)&&Ke(i,e,t)}catch{}}function Je(e,t,n){let r=[v(e,t,`public`),v(e,t,`src`)];for(let t of r)try{S.existsSync(t)&&Ke(t,e,n)}catch{}}const Ye=[`boltdocs.config.ts`,`boltdocs.config.js`,`boltdocs.config.mjs`,`boltdocs.config.cjs`,`package.json`,`tsconfig.json`,`pnpm-lock.yaml`,`package-lock.json`,`yarn.lock`];function Xe(e,t){for(let n of Ye){let r=v(e,n);try{if(S.existsSync(r)){let e=S.statSync(r);t.update(`${n}:${e.mtimeMs}:${e.size}\n`)}}catch{}}}function Ze(e,t,n){try{S.removeSync(v(n,`hash-merkle.json`))}catch{}try{let n=D(`sha256`);if(qe(e,n),He(v(e,`.boltdocs`,`compiled`,`manifest.json`),n))Je(e,t,n);else{let r=v(e,t);S.existsSync(r)&&Ke(r,e,n)}return Xe(e,n),n.digest(`hex`)}catch(e){return f(`[client-hash] Failed to compute client code hash: ${e instanceof Error?e.message:String(e)}`),D(`sha256`).update(`__client_hash_error__`).digest(`hex`)}}function Qe(e){return E.createHash(`md5`).update(e).digest(`hex`)}function $e(e,t){return!!(e&&e.size===t.size&&e.mtimeMs===t.mtimeMs&&e.ctimeMs===t.ctimeMs&&e.ino===t.ino)}async function et(e){if(e)try{let t=await S.readJson(e);return!t||t.version!==1||typeof t.files!=`object`?void 0:t}catch{return}}async function tt(e,t){let n=`${e}.${process.pid}.${Date.now()}.tmp`;try{await S.ensureDir(g(e)),await S.writeJson(n,{version:1,files:t},{spaces:0}),await S.move(n,e,{overwrite:!0})}catch{await S.remove(n).catch(()=>{})}}async function G(e,t,n){let r=await et(n),i=new Map,a={};return await Promise.all([...new Set(t)].map(async t=>{let n=v(e,t);try{let e=await S.stat(n);if(!e.isFile())return;let o=r?.files[t];if($e(o,e)){i.set(t,o.hash),a[t]=o;return}let s=Qe(await S.readFile(n));i.set(t,s),a[t]={hash:s,size:e.size,mtimeMs:e.mtimeMs,ctimeMs:e.ctimeMs,ino:e.ino}}catch{}})),n&&await tt(n,a),i}function nt(e,t){if(e)try{let t=S.statSync(e);return`${t.mtimeMs}:${t.size}`}catch{}return t}function rt({routePath:e,cacheItem:t,sourceContentHash:n,expectedAssetHash:r,ssgPagesDir:i,requireAssetHash:a=!1}){if(!t||t.contentHash!==n||a&&!t.assetHash||r!==void 0&&t.assetHash!==r)return!1;let o=E.createHash(`md5`).update(e).digest(`hex`);return!(!S.existsSync(v(i,`${o}.html`))||t.loaderDataFilePath&&!S.existsSync(v(i,`${o}.json`)))}function it(e){return e===null?null:e.poolMetrics()}function at(e,t){return _(t)?t:v(e,t)}function ot(e,t={}){let n={};for(let[r,i]of Object.entries(t)){let t=U(r);n[t]=at(e,i)}return Object.freeze(n)}function st(e){return Object.freeze({root:e.root,outDir:e.outDir,cacheDir:e.cacheDir,base:e.base,mode:e.mode,entry:e.entry,htmlEntry:e.htmlEntry,docsDirName:e.docsDirName,clientHash:e.clientHash,sourceFiles:ot(e.root,e.routeToSourceFileMap)})}function ct(e,t,n={}){let r=ot(e,n),i=t.map(t=>{let i=U(t.path),a=n[t.path],o=a?at(e,a):r[i]||t.componentPath;return{path:t.path,key:i,sourceFile:o,componentPath:t.componentPath,locale:t.locale,version:t.version,collection:t.collection}}),a=new Map;for(let e of i)a.has(e.key)||a.set(e.key,e);return Object.freeze({routes:Object.freeze(i),byPath:a,sourceFiles:r})}function lt(e,t){return Object.freeze({...e,routeManifest:t})}const ut=[/^@bdocs\//,/^boltdocs(?:\/|$)/,/^react-helmet-async(?:\/|$)/],dt=[`react`,`react-dom`];function K(e){return Number.parseInt(T,10)>=8?{rolldownOptions:e}:{rollupOptions:e}}function q(){let e=`\0virtual:ssr-empty-css`;return{name:`vite-react-ssg:ssr-skip-css`,enforce:`pre`,resolveId(t){return t.endsWith(`.css`)&&!t.startsWith(`\0`)?e+t:null},load(t){return t.startsWith(e)?{code:`export default undefined`,map:null}:null}}}function ft(e,t){let n=[],r=i=>{let a;try{a=S.readdirSync(i,{withFileTypes:!0})}catch{return}for(let o of a){if(o.name===`.vite`)continue;let a=v(i,o.name);if(o.isDirectory())r(a);else if(o.isFile()){let r=y(e,a).split(x).join(`/`);r!==t&&n.push(r)}}};return r(e),n.sort()}function pt(e){return e.map(e=>{if(Array.isArray(e))return pt(e);if(e&&typeof e==`object`&&`name`in e){let t=e.name;if(t===`vite:react-babel`||t===`vite:react-refresh`||t===`vite:react-jsx`||typeof t==`string`&&t.includes(`tailwind`)||t===`vite-plugin-image-optimizer`||t===`vite-plugin-boltdocs-dev-server`)return null}return e}).filter(Boolean)}async function mt(e){let t=[],n=async r=>{let i;try{i=await S.readdir(r,{withFileTypes:!0})}catch{return}for(let a of i){let i=v(r,a.name);a.isDirectory()?await n(i):(a.isFile()||a.isSymbolicLink())&&t.push(y(e,i).split(x).join(`/`))}};return await n(e),t.sort()}async function J(e){try{let t=await S.readFile(e);return D(`sha256`).update(t.toString()).digest(`hex`)}catch{return}}function ht(e,t){if(!t||_(t))return;let n=b(e),r=b(n,t),i=y(n,r);if(!(!i||i===`..`||i.startsWith(`..${x}`)||_(i)))return r}async function gt(e,t){let n=v(b(t,`..`),`.boltdocs-public-assets.json`),r={};try{let e=await S.readJson(n);if(Array.isArray(e))for(let t of e)typeof t==`string`&&(r[t]=``);else if(e&&typeof e==`object`){let t=e.files;if(t&&typeof t==`object`)for(let[e,n]of Object.entries(t))typeof n==`string`&&(r[e]=n)}}catch{}let i=e&&S.existsSync(e)?await mt(e):[],a={};for(let t of i){let n=await J(v(e,t));n&&(a[t]=n)}for(let[e,n]of Object.entries(r)){if(a[e]!==void 0||!n)continue;let r=ht(t,e);r&&await J(r)===n&&await S.remove(r)}e&&S.existsSync(e)&&(await S.ensureDir(t),await S.copy(e,t,{overwrite:!0,errorOnExist:!1})),await S.ensureDir(b(t,`..`)),await S.writeJson(n,{version:1,files:a})}function _t(e){return C(e.viteConfig,{logLevel:`warn`,build:{manifest:!0,ssrManifest:!0,chunkSizeWarningLimit:2e3,reportCompressedSize:!1,sourcemap:!1,cssMinify:`esbuild`,...K({input:{app:v(e.root,e.htmlEntry||`./index.html`)},output:{manualChunks(e){if(!(!e.includes(`node_modules`)&&!e.includes(`.boltdocs`))){if(e.includes(`/node_modules/react/`)||e.includes(`/node_modules/react-dom/`)||e.includes(`/node_modules/scheduler/`))return`react-vendor`;if(e.includes(`/node_modules/react-router`))return`react-router`;if(e.includes(`/node_modules/lucide-react`))return`lucide-icons`;if(e.includes(`/node_modules/react-helmet-async`))return`react-helmet`}}},onLog(t,n,r){n.message.includes(`react-helmet-async`)||e.shouldSuppressLog(n.message)||r(t,n)}})},customLogger:e.customLogger,mode:e.resolvedMode,plugins:[{name:`vite-react-ssg:get-oup-dir`,configResolved(t){e.onResolvedOutputDir(_(t.build.outDir||``)?t.build.outDir||`dist`:b(e.root,t.build.outDir||`dist`))}}]})}function vt(e){return C(e.viteConfig,{logLevel:`warn`,build:{ssr:e.entry.includes(`boltdocs`)||e.entry.startsWith(`virtual:`)?`virtual:boltdocs-entry`:!e.canSkipSsrImport&&e.ssrEntry?e.ssrEntry:e.entry,manifest:!0,outDir:e.ssgOut,reportCompressedSize:!1,target:`es2022`,minify:!1,cssCodeSplit:!1,cssMinify:!1,...K({output:e.format===`esm`?{entryFileNames:`combined.mjs`,format:`esm`}:{entryFileNames:`combined.cjs`,format:`cjs`},platform:`node`,onLog(t,n,r){n.message.includes(`react-helmet-async`)||e.shouldSuppressLog(n.message)||r(t,n)}})},customLogger:e.customLogger,mode:e.resolvedMode,ssr:{noExternal:[...ut],external:[...dt]},plugins:[...pt(e.viteConfig.plugins||[]),q()]})}async function yt(e,t){let n=e.outDir,r=e.clientCacheDir,i=e.initialClientHash??t(),a=i,o=[],s=performance.now();if(e.canBypassClientBuild){e.onStep?.({name:`Client build`,duration:0,success:!0,details:`Code unchanged, restored from cache`}),S.existsSync(e.outDir)&&await S.remove(e.outDir);let t=v(e.clientCacheDir,`dist`);await gt(e.viteConfig.publicDir,t),Ct(t,e.outDir),o=ft(v(e.clientCacheDir,`dist`),e.htmlEntry)}else{await ee(_t({...e,onResolvedOutputDir:e=>{n=e}}));let c=performance.now()-s;e.onStep?.({name:`Client build`,duration:c,success:!0,details:`Vite production build`}),i=t(),a=i,r=v(e.finalCacheDir,`client-cache`,i);let l=v(r,`client-hash.txt`);await S.ensureDir(r);let u=v(r,`dist`);S.existsSync(u)&&await S.remove(u),await S.copy(n,u,{overwrite:!0,errorOnExist:!1}),await gt(e.viteConfig.publicDir,u),o=ft(u,e.htmlEntry),await S.writeFile(l,i,`utf-8`),await wt(v(e.finalCacheDir,`client-cache`))}return{outDir:n,durationMs:e.canBypassClientBuild?0:performance.now()-s,resolvedClientCacheDir:r,resolvedClientHash:i,pageContentFallbackHash:a,clientFiles:o}}async function bt(e){if(e.serverBuildSkipped)return e.onStep?.({name:`Server build`,duration:0,success:!0,details:`SSR bundle unchanged, skipped`}),{durationMs:0};S.existsSync(e.ssgOut)&&await S.remove(e.ssgOut),process.env.VITE_SSG=`true`;let t=performance.now();await ee(vt(e));let n=performance.now()-t;return e.onStep?.({name:`Server build`,duration:n,success:!0,details:`Vite SSR bundle`}),{durationMs:n}}function xt(e,t){if(!t||_(t))return;let n=b(e,t),r=y(b(e),n);if(!(r===`..`||r.startsWith(`..${x}`)||_(r)))try{let t=S.realpathSync(e),r=S.realpathSync(n),i=y(t,r);return i===`..`||i.startsWith(`..${x}`)||_(i)||!S.readdirSync(r).some(e=>e.endsWith(`.mjs`)||e.endsWith(`.cjs`))?void 0:r}catch{return}}function St(e){return e.startsWith(`dist/`)||e.startsWith(`.boltdocs/build/ssr/`)||e.startsWith(`rendering chunks`)||e===`computing gzip size...`||e.includes(`built in`)&&e.includes(`s`)}function Ct(e,t){let n=S.readdirSync(e,{withFileTypes:!0});S.mkdirSync(t,{recursive:!0});for(let r of n){let n=v(e,r.name),i=v(t,r.name);if(r.isDirectory())Ct(n,i);else if(r.isFile())try{S.linkSync(n,i)}catch{S.copyFileSync(n,i)}}}async function wt(e,t=5,n){try{if(!S.existsSync(e))return;let r=await S.readdir(e,{withFileTypes:!0}),i=[];for(let t of r){if(!t.isDirectory())continue;let n=v(e,t.name),r=await S.stat(n);i.push({name:t.name,mtime:r.mtimeMs})}i.sort((e,t)=>t.mtime-e.mtime);let a=new Set(i.slice(0,t).map(e=>e.name));for(let t of i)n&&t.name===n||a.has(t.name)||await S.remove(v(e,t.name))}catch{}}function Tt(e,t){let n=e.warn;e.warn=(e,r)=>{e.includes(`externalized for browser compatibility`)||e.includes(`can't be bundled without type`)||t(e)||n(e,r)};let r=e.info;return e.info=(e,n)=>{t(e)||r(e,n)},e}function Et(e,t){return t===`nested`?v(e.replace(/^\//g,``),`index.html`):`${(e.endsWith(`/`)?`${e}index`:e).replace(/^\//g,``)}.html`}function Dt(e){return Object.freeze(e)}function Ot(e){let t=new Map;for(let n of e.routes){let a=E.createHash(`md5`).update(n).digest(`hex`),o=U(n),s=e.routeToSourceFileMap[o]||e.routeToSourceFileMap[n],c=s?e.sourceMeta.get(s):void 0;t.set(n,Dt({path:n,pathHash:a,cachedHtmlFile:v(e.ssgPagesDir,`${a}.html`),cachedLoaderFile:v(e.ssgPagesDir,`${a}.json`),finalOutFile:v(e.outDir,Et(n,e.dirStyle)),normalizedKey:o,sourceContentHash:c?.hash||e.fallbackHash,sourceMtimeMs:c?.mtimeMs||0,routeAssetHash:e.routeToAssetHash[n]??e.fallbackHash,fetchUrl:`${r(e.contextBase)}${i(n)}`}))}return t}function kt(e,t){let n=e.get(t);if(!n)throw Error(`Missing render plan for route: ${t}`);return n}function At(e){return e.then(e=>({ok:!0,value:e}),e=>({ok:!1,error:e}))}function jt(e){return!Number.isFinite(e)||e<=0?2:Math.max(2,Math.min(32,Math.ceil(e)*2))}function Mt(e,t){return e>4&&!t}function Y(e,t){return!!e&&typeof e==`object`&&typeof e.path==`string`&&typeof e.error==`string`&&(t===void 0||e.path===t)}function Nt(e,t){if(!e||typeof e!=`object`)return!1;let n=e;return n.path===t&&typeof n.appHTML==`string`&&Array.isArray(n.metaAttributes)&&typeof n.bodyAttributes==`string`&&typeof n.htmlAttributes==`string`&&(n.routerContext===null||typeof n.routerContext==`object`&&!Array.isArray(n.routerContext))}async function Pt(e){let t=[],n=new Set,r=e.getPool(),i=jt(r?e.getWorkerCount?.()??0:0),a=0,o=0,s=!1,c=async()=>{if(t.length===0)return;let e=(await Promise.all(t)).find(e=>!e.ok);if(e&&!e.ok)throw e.error},l=e=>{let r;r=At(e).finally(()=>{n.delete(r)}),t.push(r),n.add(r)};try{if(Mt(e.routes.length,e.canBypassClientBuild)&&(await e.ensurePool(),r=e.getPool(),r&&(i=jt(e.getWorkerCount?.()??0))),r?.renderBatch){let t=[];for(let n of e.routes){let r=e.getPlan(n);await e.isCached(r)?(await e.onCacheHit(r),o++):(await e.prepareRoute?.(r),t.push({path:n,plan:r}))}let c=Math.max(2,e.batchSize??(e.getWorkerCount?.()??1)*2);for(let o=0;o<t.length;o+=c){let u=t.slice(o,o+c);if(!r){for(let{path:n,plan:r}of t.slice(o))e.scheduleMainThread(n,r),a++;break}s=!0;let d=r,f=performance.now(),p=async t=>{for(let{path:n,plan:r}of u){let i=await e.onWorkerFailure(n,r,t,d);if(!Nt(i,n))throw Error(`SSG fallback returned an invalid render result`);await e.onWorkerResult(n,r,i,performance.now()-f),a++}r=e.getPool()};l((async()=>{let t;try{t=await d.renderBatch(u.map(({path:e})=>e))}catch(e){await p(e);return}if(!Array.isArray(t)||t.length!==u.length){await p(Error(`SSG worker returned an invalid batch payload`));return}for(let n=0;n<u.length;n++){let{path:r,plan:i}=u[n],o=t[n],s;if(s=Y(o,r)?await e.onWorkerFailure(r,i,Error(o.error),d):Nt(o,r)?o:await e.onWorkerFailure(r,i,Error(`SSG worker returned an invalid batch item`),d),!Nt(s,r))throw Error(`SSG fallback returned an invalid render result`);await e.onWorkerResult(r,i,s,performance.now()-f),a++}r=e.getPool()})()),n.size>=i&&await Promise.race(n)}}else for(let t of e.routes){let c=e.getPlan(t);if(await e.isCached(c)){await e.onCacheHit(c),o++;continue}if(await e.prepareRoute?.(c),!r&&e.routes.length>4&&(await e.ensurePool(),r=e.getPool(),r&&(i=jt(e.getWorkerCount?.()??0))),r){s=!0;let o=r,u=performance.now();l(o.render(t).catch(async n=>{let i=await e.onWorkerFailure(t,c,n,o);return r=e.getPool(),i}).then(async n=>{if(!Nt(n,t))throw Error(`SSG worker returned an invalid render result`);await e.onWorkerResult(t,c,n,performance.now()-u),a++})),n.size>=i&&await Promise.race(n)}else e.scheduleMainThread(t,c),a++}return await c(),await e.drainFinalizers(),await e.drainMainThread(),await e.drainWrites(),{renderedCount:a,cachedCount:o,workerTaskCount:t.length,usedWorker:s}}catch(n){throw await Promise.all(t),await e.drainFinalizers(),await e.drainMainThread(),await e.drainWrites(),await e.cleanupAfterFailure(),n}finally{await e.destroyPool()}}const Ft=Number.parseInt(T)>=5?[`.vite`]:[];function It(e){let t=Object.fromEntries(Object.entries(e).sort(([e],[t])=>e<t?-1:+(e>t)));return JSON.stringify(t)}function Lt(t,n){return`static-loader-data${e(t===`/`?`/index`:t.endsWith(`/`)?`${t}index`:t)}.${n}.json`}function X(e){let t=e.slice(e.lastIndexOf(`.`)).toLowerCase();return t===`.js`||t===`.mjs`||t===`.css`}function Rt(e){let t=new Set;for(let n of Object.values(e)){X(n.file)&&t.add(n.file);for(let e of n.css||[])X(e)&&t.add(e);for(let e of n.imports||[])X(e)&&t.add(e);for(let e of n.dynamicImports||[])X(e)&&t.add(e)}return[...t]}async function zt(e,t,n){return G(e,Rt(t),n?v(n,`chunk-hashes.json`):void 0)}function Bt(t,n=`/`){let r=e(t);return r!==`/`&&r.endsWith(`/`)?r.slice(0,-1):r}function Vt(e,t,n){let r=t?.[n];if(r)return _(r)?r:v(e,r)}function Ht(e,t){return Object.fromEntries(Object.entries(t).map(([t,n])=>[t,_(n)?y(e,n):n]))}function Ut(e,t){return e.filter(e=>!e.includes(`:`)&&!e.includes(`*`))}async function Wt(t={},n={}){let r=process.env.MODE||process.env.NODE_ENV||t.mode||`production`;r!==process.env.NODE_ENV&&(process.env.NODE_ENV=r);let i=process.cwd(),u=n.root||i,d=n.build?.outDir||`dist`,m=n.base||`/`,b=performance.now(),x=0,ee=0,ne=0,{onFinished:C,onStep:w,routeToSourceFileMap:T={},cacheDir:D=`.boltdocs/build`,htmlEntry:O=`index.html`,entry:k=await ge(u,O)}=t,A=`docs`,ie=Object.values(T);if(ie.length>0){let e=ie[0],t=y(u,e).replace(/\\/g,`/`).split(`/`);t.length>0&&(A=t[0])}let j=_(d)?d:v(u,d),M=_(D)?D:v(u,D),N=Ze(u,A,M),F=st({root:u,outDir:j,cacheDir:M,base:m,mode:r,entry:k,htmlEntry:O,docsDirName:A,clientHash:N,routeToSourceFileMap:T}),I=F.clientHash.substring(0,12),L=v(F.cacheDir,`ssr`,I),R=v(F.cacheDir,`client-cache`,F.clientHash),de=R,z=N,_e=N,ye=v(R,`client-hash.txt`),B=!1;try{S.existsSync(ye)&&S.existsSync(v(R,`dist`))&&(B=(await S.readFile(ye,`utf-8`)).trim()===N)}catch{}let V=v(M,`ssg-pages`),H=v(M,`ssg-cache.json`),Se=v(M,`ssg-output.json`),Te=await Oe(Se),Fe=Te!==void 0&&Te.auxiliaryFiles.length===0;B&&(De(Te,je(v(R,`dist`)),O)||(B=!1));let W=[],Ie=!1,Le=(t.dirStyle||n.ssgOptions?.dirStyle)??`flat`;if(B&&Fe&&Le!==`nested`){let e=v(M,`routes-cache.json`);try{if(S.existsSync(e)&&S.existsSync(H)){let t=JSON.parse(S.readFileSync(e,`utf-8`)),n=Me(JSON.parse(S.readFileSync(H,`utf-8`)),t.paths);if(t.dirStyle===Le&&t.base===m){let e=t.paths.every(e=>{let r=U(e),i=n[r];return rt({routePath:e,cacheItem:i,sourceContentHash:nt(T[r]||T[e]||Vt(u,t.sourceFiles,r)||Vt(u,t.sourceFiles,e),_e),ssgPagesDir:V,requireAssetHash:!0})});t.paths.length>0&&e&&(W=t.paths,Ie=!0)}}}catch{}}if(Ie){let e=performance.now(),t={};try{S.existsSync(H)&&(t=Me(JSON.parse(S.readFileSync(H,`utf-8`)),W))}catch{}let r=[...Ae(W,t,Le===`nested`?`nested`:`flat`),`static-loader-data-manifest-${I}.json`],i=je(v(R,`dist`)).filter(e=>e!==O),a=await Oe(Se),o=a?.auxiliaryFiles.length===0&&Ee(a,N,j,i,r,[]),s={};if(!o){S.existsSync(j)&&await S.remove(j);let e=v(R,`dist`);await gt(n.publicDir,e),await S.copy(e,j);let r=[];for(let e of W){let n=E.createHash(`md5`).update(e).digest(`hex`),i=v(V,`${n}.html`),a=v(V,`${n}.json`),o=`${(e.endsWith(`/`)?`${e}index`:e).replace(/^\//g,``)}.html`;if(r.push({source:i,destination:v(j,o)}),S.existsSync(a)){let n=U(e),i=t[n];i?.loaderDataFilePath&&(r.push({source:a,destination:v(j,i.loaderDataFilePath)}),s[Bt(e,m)]=i.loaderDataFilePath)}}await Ce(r),await Ne(v(j,`static-loader-data-manifest-${I}.json`),It(s))}await Gt(V,t,W);let c=Math.round(performance.now()-b);w?.({name:`Client build`,duration:0,success:!0,details:`Code unchanged, restored from cache`}),w?.({name:`Server build`,duration:0,success:!0,details:`SSR bundle unchanged, skipped`}),w?.({name:`Render pages`,duration:0,success:!0,details:`${W.length} pages (all cached)`}),w?.({name:`Build metrics`,duration:0,success:!0,details:`Build time: ${(c/1e3).toFixed(1)}s, all cached`});let l=Math.round(performance.now()-e),u={renderedPageCount:0,cachedPageCount:W.length,clientBuildMs:0,serverBuildMs:0,ssrImportMs:0,workerPoolSetupMs:0,routePreparationMs:0,workerTransportMs:0,workerRoundTripMs:0,workerTransportAvgMs:0,finalizeP50Ms:0,finalizeP95Ms:0,assetCollectionMs:0,beforeHookMs:0,htmlAssemblyMs:0,onPageRenderedHookMs:0,criticalCssP50Ms:0,criticalCssP95Ms:0,cacheWriteMs:0,cachedOutputMs:l,renderQueueDrainMs:0,renderPipelineSettleMs:0,outputLinkMs:l};process.env.BOLTDOCS_BENCHMARK_PHASES===`true`&&console.log(`[boltdocs] ${JSON.stringify({name:`Render pages`,duration:0,success:!0,details:`${W.length} pages / 0 new / ${W.length} cached`,metrics:{renderedCount:0,cachedCount:W.length,renderedSize:0,totalPages:W.length,prunedCount:0,clientBuildMs:0,serverBuildMs:0,ssrImportMs:0,workerPoolSetupMs:0,workerUsed:!1,workerCount:0,fallbackMainThread:!1,ssrP50Ms:0,ssrP95Ms:0,ssrP99Ms:0,crittersP50Ms:0,crittersP95Ms:0,writeP50Ms:0,writeP95Ms:0,routerTimingCount:0,routerMatchAvgMs:0,routerResolveAvgMs:0,routerLoadersAvgMs:0,routerRenderAvgMs:0,routerHelmetAvgMs:0,routerTotalAvgMs:0,pagesPerSecond:0,pipeline:u}})}`),await C?.(d),await Kt(j),await ke(v(M,`ssg-output.json`),N,j,r,i);return}let Re=await re(n,`build`,r,r),ze=Object.assign({},Re.ssgOptions||{},t),{script:He=`sync`,mock:Ue=!1,formatting:We=`none`,includedRoutes:Ge=Ut,onBeforePageRender:Ke,onPageRendered:qe,dirStyle:Je=`flat`,includeAllRoutes:Ye=!1,format:Xe=`esm`,concurrency:Qe=20,rootContainerId:$e=`root`,beastiesOptions:et={}}=ze,tt=et,G=ze.turbo??!1,at=v(M,`ssr`),ot=v(M,`ssr-cache-index.json`);if(L=v(at,G?`turbo-ssr`:I),!G&&B)try{let e=(await S.readJson(ot))[N];if(typeof e==`string`){let t=xt(at,e);t&&(L=t)}}catch{}let ut=Tt(te(),St),dt=()=>{};if(Ue){let{jsdomGlobal:e}=await import(`./jsdomGlobal-RTx-0uYL.mjs`);dt=e()}let K={};try{if(S.existsSync(H)){let e=await S.readJson(H);K=Me(e,Object.keys(e))}}catch{}let q=!1;if(B)try{let e=v(M,`routes-cache.json`);if(S.existsSync(e)){let t=JSON.parse(S.readFileSync(e,`utf-8`));t.paths.length>0&&t.paths.every(e=>{let n=U(e),r=K[n];return rt({routePath:e,cacheItem:r,sourceContentHash:nt(T[n]||T[e]||Vt(u,t.sourceFiles,n)||Vt(u,t.sourceFiles,e),_e),ssgPagesDir:V,requireAssetHash:!0})})&&(W=t.paths,q=!0)}}catch{}let ft=q?``:await xe(Re,k),pt=(G||B)&&S.existsSync(L)&&S.readdirSync(L).filter(e=>e.endsWith(`.mjs`)||e.endsWith(`.cjs`)).length>0,mt=performance.now(),[J,ht]=await Promise.all([yt({viteConfig:n,resolvedMode:Re.mode,root:u,htmlEntry:O,outDir:j,clientCacheDir:R,finalCacheDir:M,docsDirName:A,initialClientHash:N,canBypassClientBuild:B,customLogger:ut,onStep:w,shouldSuppressLog:St},()=>Ze(u,A,M)),bt({viteConfig:n,resolvedMode:Re.mode,entry:k,ssrEntry:ft,ssgOut:L,format:Xe,canSkipSsrImport:q,serverBuildSkipped:pt,customLogger:ut,onStep:w,shouldSuppressLog:St})]);if(d=J.outDir,de=J.resolvedClientCacheDir,z=J.resolvedClientHash,_e=J.pageContentFallbackHash,I=z.substring(0,12),x=J.durationMs,ee=ht.durationMs,!G)try{let e={};try{e=await S.readJson(ot)}catch{}e[z]=y(at,L),await Pe(ot,e)}catch{}let _t=Xe===`esm`&&process.platform===`win32`?`file://`:``,vt=Xe===`esm`?`.mjs`:`.cjs`;ft.replace(/\0/g,``).replace(`virtual:`,``).replace(/[^a-zA-Z0-9-]/g,`_`);let Ct=`combined`+vt;try{if(S.existsSync(L)){let e=S.readdirSync(L).filter(e=>e.endsWith(vt));e.length>0&&(Ct=e[0])}}catch{}let Et=_t+v(L,Ct).replace(/\\/g,`/`),Dt=Ct.replace(/\.[^/.]+$/,``),At=JSON.parse(await S.readFile(v(L,...Ft,`manifest.json`),`utf-8`)),jt=null,Mt=null,Y=[],Nt,X=`/`,Rt,Wt=null,Yt,Xt=Ge;if(!q){let e=a===void 0?l(import.meta.url):a,t=performance.now(),n=Xe===`esm`?await import(Et):e(Et);ne=performance.now()-t,Nt=n.matchRouteBranchWithParams;let{createRoot:r,includedRoutes:i}=n;Xt=i||Ge,jt=await r(!1);let s=jt;if(Y=s.routes,X=s.base,Rt=s.triggerOnSSRAppRendered,Wt=s.app,Yt=s.routerType,Y&&Y.length>0)for(let e of Y)e.path&&(e.filePath||e.entry)&&!T[e.path]&&(T[e.path]=e.filePath||e.entry);F=lt(F,ct(u,Y,T)),Mt=o(s,n)}let Zt=``,Qt=0,Z=null,$t=null,en=null,tn=!1;async function nn(){if(en){await en;return}let e=$t;e&&(en=e.destroy(),await en)}if(!q){let e=performance.now(),{paths:t}=await be(Y);W=Ye?t:await Xt(t,Y||[]),W=Ut(W,Y||[]),W=Array.from(new Set(W)),Qt+=performance.now()-e;try{await Pe(v(M,`routes-cache.json`),{paths:W,dirStyle:Je,base:m,sourceFiles:Ht(u,T)},0)}catch{}Zt=v(L,Dt+vt)}async function rn(){if(Z||tn||W.length<=4)return;tn=!0;let e=performance.now();try{Zt=v(L,Dt+vt);let{SsgWorkerPool:t}=await import(`./ssg-worker-pool-DxzleN_R.mjs`);Z=new t({ssrEntryPath:Zt,format:Xe===`esm`?`esm`:`cjs`}),$t=Z,await Z.ready(),Hn=performance.now()-e}catch{Hn=performance.now()-e,Z=null}}let an=ze.criticalCss??!1,on,sn;an===`zig-critters`?(on=await oe(),on||f("[zig-critters] WASM unavailable; critical CSS disabled for this build. Set `criticalCss: 'beasties'` to enable JS-based critical CSS.")):an===`beasties`&&tt!==!1&&(sn=await ae(d,{publicPath:m,...tt}));let cn=``;if(on){let e=v(j,`assets`);if(S.existsSync(e)){let t=S.readdirSync(e).filter(e=>e.endsWith(`.css`));for(let n of t)cn+=S.readFileSync(v(e,n),`utf-8`)+`
|
|
3
|
+
`}}let ln={},un={},dn={},fn=null;if(q)for(let e of W){let t=U(e);dn[e]=K[t]?.assetHash||N}else{let[e,t]=await Promise.all([S.readFile(v(j,...Ft,`ssr-manifest.json`),`utf-8`),S.readFile(v(j,...Ft,`manifest.json`),`utf-8`)]);ln=JSON.parse(e),un=JSON.parse(t),fn=ue(un);let n=await zt(j,un,M);await Promise.all(Object.entries(T).map(async([e,t])=>{dn[e]=await fe({outDir:j,indexes:fn,ssrManifest:ln,routeSourceFile:t,root:u,clientHash:N,assetHashes:n})}));for(let e of W)dn[e]||(dn[e]=_e)}let pn=await S.readFile(v(j,O),`utf-8`);S.rmSync(v(j,O)),pn=qt(pn,He);let mn=Ke?null:me({rootContainerId:$e,indexHTML:pn}),hn=(await import(`p-queue`)).default||await import(`p-queue`),gn=new hn({concurrency:Qe}),_n=new hn({concurrency:Math.min(p.cpus().length,4)}),vn=new hn({concurrency:Math.max(2,Math.min(p.cpus().length,6))}),yn={},bn=0,xn=new Map,Sn=new Set;for(let t of W){let n=T[e(t).replace(/\/$/,``)]||T[t];n&&Sn.add(n)}for(let e of Sn)try{if(S.existsSync(e)){let t=S.statSync(e);xn.set(e,{hash:`${t.mtimeMs}:${t.size}`,mtimeMs:t.mtimeMs})}}catch{}let Cn=null;!q&&Nt&&(Cn=P({routes:[...Y],base:X,matchRouteBranchWithParams:Nt,serverManifest:At,manifest:un,ssrManifest:ln}));let wn=Ot({routes:W,outDir:j,ssgPagesDir:V,dirStyle:Je,contextBase:X,fallbackHash:_e,routeToSourceFileMap:T,sourceMeta:xn,routeToAssetHash:dn}),Tn=new le,En=[],Dn=[],On=[],kn=[],An=0,jn=0,Mn=0,Nn=0,Pn=0,Fn=0,In=0,Ln=0,Rn=0,zn=0,Bn=0,Q={count:0,matchMs:0,resolveMs:0,loadersMs:0,renderMs:0,helmetMs:0,totalMs:0};function Vn(e){e&&(Q.count++,Q.matchMs+=e.matchMs,Q.resolveMs+=e.resolveMs,Q.loadersMs+=e.loadersMs,Q.renderMs+=e.renderMs,Q.helmetMs+=e.helmetMs,Q.totalMs+=e.totalMs)}let Hn=0,Un=!1;function $(e,t){if(e.length===0)return 0;let n=[...e].sort((e,t)=>e-t),r=Math.ceil(t/100*n.length)-1;return n[Math.max(0,Math.min(r,n.length-1))]}let Wn=0,Gn=0,Kn=0,qn=new Set,Jn=new Set,Yn=[],Xn=we({writeFile:async(e,t)=>{await S.ensureDir(g(e)),await S.writeFile(e,t,`utf-8`)}}),Zn=JSON.stringify(K),Qn=Me(K,W),$n=new Map,er=new Set;er.add(V);for(let e of W){let t=Je===`nested`?v(e.replace(/^\//g,``),`index.html`):`${(e.endsWith(`/`)?`${e}index`:e).replace(/^\//g,``)}.html`;er.add(v(j,g(t)));let n=e===`/`?`/index`:e.endsWith(`/`)?`${e}index`:e;er.add(v(j,`static-loader-data`,g(n)))}er.add(v(j,`static-loader-data`)),await Promise.all([...er].map(e=>S.ensureDir(e)));async function tr(e,t,n,r,i,a,o,s,l,u,d,p,h,g,_){let y=performance.now(),{path:b,cachedHtmlFile:x,cachedLoaderFile:ee,normalizedKey:te,sourceContentHash:ne,sourceMtimeMs:C,fetchUrl:re}=e,w;if(!h&&g===`remix`){if(!Cn)throw Error(`The SSR entry must expose matchRouteBranchWithParams for asset collection`);let e=performance.now();w=new Set(await($n.get(b)||Cn(re))),An+=performance.now()-e}else w=new Set;let T;if(s&&Object.keys(s).length>0){let e=Lt(b,I);T=e,G&&await S.writeFile(v(j,e),JSON.stringify(s)),yn[Bt(b,m)]=e,bn++}await p?.(b,t,l);let E=performance.now(),D=mn&&_===pn?mn({appHTML:t,metaAttributes:n,bodyAttributes:r,htmlAttributes:i,initialState:null}):await he({rootContainerId:$e,appHTML:t,indexHTML:_,metaAttributes:n,bodyAttributes:r,htmlAttributes:i,initialState:null});Mn+=performance.now()-E;let O=h?``:ve(w),k=o?D.replace(/<script[^>]*>(?:(?!<\/script>)[\s\S])*__staticRouterHydrationData(?:(?!<\/script>)[\s\S])*<\/script>/g,``):D;O&&(k=k.replace(`<head>`,`<head>${O}`));let A=performance.now(),ie=await qe?.(b,k,l)||k;Nn+=performance.now()-A;let M=``;if(s&&Object.keys(s).length>0){let e=JSON.stringify(s).replace(/</g,`\\u003c`);M=`window.__VITE_REACT_SSG_STATIC_LOADER_DATA__ = { '${Bt(b,m)}': ${e} };`}let N=c(o),P=ie,ae=`<script>window.__VITE_REACT_SSG_HASH__ = '${I}';${M}${N}<\/script>`,oe=performance.now();if(P=P.replace(`<script>${pe}<\/script>`,``),on){if(cn){let e=se(P,cn,`zig-critters`);try{let t=await Tn.getOrCreate(e,async()=>(await on.processHtml(P,cn)).match(/<style[^>]*data-zig-critters[^>]*>[\s\S]*?<\/style>/g)?.join(`\\n`)||null);t&&!P.includes(`data-zig-critters`)&&(P=P.replace(`</head>`,`${t}</head>`))}catch(e){f(`[zig-critters] Failed to inline CSS for "${b}": ${e instanceof Error?e.message:String(e)}`)}}P=P.replace(/<link\srel="stylesheet"(?!.*\bcrossorigin\b)/g,`<link rel="stylesheet" crossorigin`)}else if(sn){let e=se(P,cn,`beasties`),t=await Tn.getOrCreate(e,async()=>{let e=await _n.add(()=>sn.process(P));return ce(P,e)});t&&!P.includes(t)&&(P=P.replace(`</head>`,`${t}</head>`)),P=P.replace(/<link\srel="stylesheet"(?!.*\bcrossorigin\b)/g,`<link rel="stylesheet" crossorigin`)}let F=ae+(a||``);F&&(P=P.replace(`<head>`,`<head>${F}`));let le=We===`none`?P:await Jt(P,We);On.push(Math.round(performance.now()-oe));let L=performance.now();G?s&&Object.keys(s).length>0&&T&&await Xn.enqueue(v(j,T),JSON.stringify(s)):(await Xn.enqueue(x,le),s&&Object.keys(s).length>0&&T?(await Xn.enqueue(ee,JSON.stringify(s)),Qn[te]={contentHash:ne,mtime:C?Math.round(C):0,loaderDataFilePath:T,assetHash:e.routeAssetHash}):Qn[te]={contentHash:ne,mtime:C?Math.round(C):0,assetHash:e.routeAssetHash});let ue=performance.now()-L;kn.push(Math.round(ue)),Dn.push(Math.round(performance.now()-y)),Wn++,Ln++,Kn+=le.length}let nr=performance.now(),rr=[];await Pt({routes:W,canBypassClientBuild:B,getPlan:e=>kt(wn,e),isCached:e=>{if(G||!B)return!1;try{return rt({routePath:e.path,cacheItem:K[e.normalizedKey],sourceContentHash:e.sourceContentHash,expectedAssetHash:e.routeAssetHash,ssgPagesDir:V})}catch{return!1}},onCacheHit:async e=>{let t=K[e.normalizedKey]?.loaderDataFilePath,n=t?v(j,t):void 0,r=!qn.has(e.finalOutFile),i=!!n&&!Jn.has(n);r&&qn.add(e.finalOutFile),i&&n&&Jn.add(n);let a=performance.now();try{r&&Yn.push({source:e.cachedHtmlFile,destination:e.finalOutFile}),n&&t&&S.existsSync(e.cachedLoaderFile)&&(i&&Yn.push({source:e.cachedLoaderFile,destination:n}),yn[Bt(e.path,m)]=t,bn++),Gn++,Rn++,Pn+=performance.now()-a}catch(t){throw r&&qn.delete(e.finalOutFile),i&&n&&Jn.delete(n),Error(`Error on cached page: ${e.path}\n${t.stack}`)}},prepareRoute:e=>{!Wt&&Yt===`remix`&&Cn&&$n.set(e.path,Cn(e.fetchUrl))},ensurePool:rn,getPool:()=>Z,getWorkerCount:()=>it(Z)?.totalWorkers??0,onWorkerFailure:async(e,t,n,r)=>{if(!Mt)throw Error(`Error on page: ${e}\n${String(n)}`);f(`[ssg-worker] Retrying ${e} on the main thread after worker failure`),Un=!0;try{await nn()}catch{}Z=null,tn=!0;let i=await Mt.render(e);return{path:e,appHTML:i.appHTML,metaAttributes:i.metaAttributes,bodyAttributes:i.bodyAttributes,htmlAttributes:i.htmlAttributes,styleTag:i.styleTag,timings:i.timings,routerContext:s(i.routerContext)}},onWorkerResult:async(e,t,n,r)=>{Fn+=Math.max(0,r-(n.timings?.totalMs??0)),In++,n.timings&&(En.push(Math.round(n.timings.totalMs)),Vn(n.timings));let i={...jt,routePath:e},a=performance.now(),o=await Ke?.(e,pn,i)||pn;jn+=performance.now()-a;let s=n.routerContext?.loaderData?n.routerContext.loaderData:null;await vn.add(()=>tr(t,n.appHTML,n.metaAttributes,n.bodyAttributes,n.htmlAttributes,n.styleTag,n.routerContext,s,i,X,Y,Rt,Wt,Yt??`remix`,o))},scheduleMainThread:(e,t)=>{rr.push(gn.add(async()=>{try{let n={...jt,routePath:e},r=performance.now(),i=await Ke?.(e,pn,n)||pn;jn+=performance.now()-r;let a=performance.now(),{appHTML:o,bodyAttributes:c,htmlAttributes:l,metaAttributes:u,styleTag:d,routerContext:f,timings:p}=await Mt.render(e);En.push(Math.round(performance.now()-a)),Vn(p);let m=f?.loaderData;await tr(t,o,u,c,l,d,s(f),m||null,n,X,Y,Rt,Wt,Yt??`remix`,i)}catch(t){throw Error(`Error on page: ${e}\n${t.stack}`)}}))},drainFinalizers:()=>vn.onIdle(),drainMainThread:async()=>{await Promise.all(rr),await gn.onIdle()},drainWrites:()=>Xn.flush(),cleanupAfterFailure:async()=>{try{S.existsSync(j)&&await S.remove(j)}catch{}},destroyPool:nn,onNoRenderer:e=>{f(`[ssg] No SSR context available for ${e}, skipping`)}}),Bn+=performance.now()-nr;let ir=performance.now();for(let e of W){if(G)continue;let t=wn.get(e);if(!t||!S.existsSync(t.cachedHtmlFile))continue;qn.has(t.finalOutFile)||Yn.push({source:t.cachedHtmlFile,destination:t.finalOutFile});let n=Qn[t.normalizedKey];if(!n?.loaderDataFilePath||!S.existsSync(t.cachedLoaderFile))continue;let r=v(j,n.loaderDataFilePath);Jn.has(r)||Yn.push({source:t.cachedLoaderFile,destination:r})}await Ce(Yn);let ar=Math.round(performance.now()-ir);zn+=ar;let or=Wn+Gn,sr=(Kn/1024/1024).toFixed(2),cr=0;if(!G)try{let e=JSON.stringify(Qn)!==Zn;e&&await Pe(H,Qn),cr=await Gt(V,Qn,W,e)}catch{}let lr=performance.now()-mt,ur=it($t),dr={renderedCount:Wn,cachedCount:Gn,renderedSize:Kn,totalPages:or,prunedCount:cr,clientBuildMs:Math.round(x),serverBuildMs:Math.round(ee),ssrImportMs:Math.round(ne),workerPoolSetupMs:Math.round(Hn),workerUsed:ur!==null&&!Un,workerCount:ur?.totalWorkers??0,fallbackMainThread:Un,ssrP50Ms:$(En,50),ssrP95Ms:$(En,95),ssrP99Ms:$(En,99),crittersP50Ms:$(On,50),crittersP95Ms:$(On,95),writeP50Ms:$(kn,50),writeP95Ms:$(kn,95),routerTimingCount:Q.count,routerMatchAvgMs:Q.count>0?Q.matchMs/Q.count:0,routerResolveAvgMs:Q.count>0?Q.resolveMs/Q.count:0,routerLoadersAvgMs:Q.count>0?Q.loadersMs/Q.count:0,routerRenderAvgMs:Q.count>0?Q.renderMs/Q.count:0,routerHelmetAvgMs:Q.count>0?Q.helmetMs/Q.count:0,routerTotalAvgMs:Q.count>0?Q.totalMs/Q.count:0,pagesPerSecond:or>0&&lr>0?Math.round(or/(lr/1e3)*10)/10:0,pipeline:{renderedPageCount:Ln,cachedPageCount:Rn,clientBuildMs:Math.round(x),serverBuildMs:Math.round(ee),ssrImportMs:Math.round(ne),workerPoolSetupMs:Math.round(Hn),routePreparationMs:Math.round(Qt),workerTransportMs:Math.round(Fn),workerRoundTripMs:Math.round(Fn),workerTransportAvgMs:In>0?Math.round(Fn/In):0,finalizeP50Ms:$(Dn,50),finalizeP95Ms:$(Dn,95),assetCollectionMs:Math.round(An),beforeHookMs:Math.round(jn),htmlAssemblyMs:Math.round(Mn),onPageRenderedHookMs:Math.round(Nn),criticalCssP50Ms:$(On,50),criticalCssP95Ms:$(On,95),cacheWriteMs:Math.round(0+Xn.writeTimeMs()),cachedOutputMs:Math.round(Pn),renderQueueDrainMs:Math.round(Bn),renderPipelineSettleMs:Math.round(Bn),outputLinkMs:Math.round(zn)}};w?.({name:`Render pages`,duration:lr,success:!0,details:`${or} pages (${Wn} new, ${Gn} cached, ${sr} MB)`,metrics:dr}),process.env.BOLTDOCS_BENCHMARK_PHASES===`true`&&console.log(`[boltdocs] ${JSON.stringify({name:`Render pages`,duration:Math.round(lr),success:!0,details:`${or} pages / ${Wn} new / ${Gn} cached / ${sr} MB`,metrics:dr})}`);let fr=performance.now(),pr=It(yn);await Ne(v(j,`static-loader-data-manifest-${I}.json`),pr),await wt(v(M,`ssr`),5,G?`turbo-ssr`:h(L)),dt();let mr=Re.plugins.find(e=>e.name===`vite-plugin-pwa`)?.api;mr&&!mr.disabled&&mr.generateSW&&await mr.generateSW();let hr=Math.round(performance.now()-b);w?.({name:`Static loader data`,duration:performance.now()-fr,success:!0,details:`${bn} loader data files`,metrics:{loaderDataFileCount:bn}}),await C?.(d),await Kt(j);let gr=je(j),_r=await Be(j,hr,M,{outputFiles:gr,manifestPath:v(de,`dist`,...Ft,`manifest.json`)});Ve(j,_r),w?.({name:`Build metrics`,duration:0,success:!0,details:`Build time: ${(hr/1e3).toFixed(1)}s, JS: ${(_r.totalJSBundleSize/1024).toFixed(0)} kB, CSS: ${(_r.totalCSSBundleSize/1024).toFixed(0)} kB`,metrics:{buildTime:hr,totalPages:_r.pages.length,jsSize:_r.totalJSBundleSize,cssSize:_r.totalCSSBundleSize}}),await ke(v(M,`ssg-output.json`),z,j,Ae(W,Qn,Je).concat(`static-loader-data-manifest-${I}.json`),J.clientFiles,gr)}async function Gt(e,t,n=[],r=!1){try{if(!S.existsSync(e))return 0;let i=v(e,`.prune-state`);if(!r)try{let e=await S.stat(i);if(Date.now()-e.mtimeMs<6e4)return 0}catch{}let a=await S.readdir(e),o=new Set,s=new Set([...Object.keys(t),...n]);for(let e of s){let t=E.createHash(`md5`).update(e).digest(`hex`);o.add(`${t}.html`),o.add(`${t}.json`)}let c=0;for(let t of a)(t.endsWith(`.html`)||t.endsWith(`.json`))&&!o.has(t)&&(await S.remove(v(e,t)),c++);return await S.writeFile(i,String(Date.now()),`utf8`),c}catch{return 0}}async function Kt(e){try{Ft.length>0?await S.remove(v(e,...Ft)):await Promise.all([S.remove(v(e,`manifest.json`)),S.remove(v(e,`ssr-manifest.json`))])}catch{}}function qt(e,t){return!t||t===`sync`?e:e.replace(/<script type="module" /g,`<script type="module" ${t} `)}async function Jt(e,t){if(t===`prettify`)try{let t=(await import(`prettier/esm/standalone.mjs`)).default,n=(await import(`prettier/esm/parser-html.mjs`)).default;return t.format(e,{semi:!1,parser:`html`,plugins:[n]})}catch(t){return d(`Error formatting html: ${t?.message}`),e}return e}function Yt(e,t,n){if(e.url)try{let t=e.url,n=t.indexOf(`?`),r=n>=0?t.slice(0,n):t,i=n>=0?t.slice(n):``;if(/%[0-9A-Fa-f]{2}/.test(r)){let t=decodeURI(r);if(t!==r){let n=t+i;e.url=n,e.originalUrl&&=n}}}catch{}n()}function Xt({template:e,ssrEntry:r,onBeforePageRender:i,entry:a,rootContainerId:s,onPageRendered:c}){return{name:`vite-react-ssg:dev-server`,configureServer(l){let u=async(u,f)=>{try{let d=u.originalUrl??u.url??`/`,p=await l.ssrLoadModule(r),m=p.createRoot,h=await m(!1,d),g=o(h,p),{app:_,base:v}=h,[y=`/`,b=``]=d.split(`?`),x=new URLSearchParams(b);if(!_&&x.has(`_data`))return g.handleLoader(u,f);let S=await l.transformIndexHtml(d,e),ee=await i?.(d,S,h)||S,{appHTML:te,bodyAttributes:ne,htmlAttributes:C,metaAttributes:re,styleTag:T}=await g.render(t(y,v));re.push(T);let E=await Promise.all([r,a].map(async e=>await l.moduleGraph.getModuleByUrl(e))),D=new Set,O=new Set,k=async e=>{if(!e?.ssrTransformResult||O.has(e))return;O.add(e);let{deps:t=[],dynamicDeps:n=[]}=e.ssrTransformResult,r=[...t,...n];for(let e of r)if(e.endsWith(`.css`)||e.endsWith(`.scss`)||e.endsWith(`.sass`)||e.endsWith(`.less`))D.add(e);else if(e.endsWith(`.ts`)||e.endsWith(`.tsx`)){let t=await l.moduleGraph.getModuleByUrl(e);t&&await k(t)}};await Promise.all(E.map(async e=>k(e)));let A=[...D].map(e=>_e(n(l.config.base,e)));re.push(...A);let ie=await he({rootContainerId:s,appHTML:te,indexHTML:ee,metaAttributes:re,bodyAttributes:ne,htmlAttributes:C,initialState:null}),j=await c?.(d,ie,h)||ie;f.statusCode=200,f.setHeader(`Content-Type`,`text/html`),w(u,f,j,`html`,{headers:`pluginContainer`in l?l.config.server.headers:l.config.preview.headers})}catch(e){let t=e instanceof Error?e:Error(String(e));l.ssrFixStacktrace(t),d(`SSR render error`,t),f.statusCode=500,f.end(t.stack??t.message)}};return l.middlewares.use(Yt),()=>{l.middlewares.use(u)}}}}async function Zt(e={},t={}){try{let n=process.env.NODE_ENV||t.mode||`development`,{skipResolveConfig:r,...i}=t,a=process.cwd(),o,s,c,l;if(r){o=e.root||a,s={...e.ssgOptions,...i};let{htmlEntry:t=`index.html`}=s,n=s.entry||await ge(o,t);c=n.startsWith(`virtual:`)||n.includes(`\0`)||n.includes(`boltdocs/entry`)||n.includes(`boltdocs-entry`)?n:v(o,n),l=await O.readFile(v(o,t),`utf-8`)}else{let t=await re(e,`serve`,n,n);o=t.root||a,s={...t.ssgOptions,...i};let{htmlEntry:r=`index.html`}=s,u=s.entry||await ge(o,r),[d,f]=await Promise.all([xe(t,u),O.readFile(v(o,r),`utf-8`)]);c=d,l=f}let{onBeforePageRender:u,onPageRendered:d,rootContainerId:f=`root`,mock:p=!1}=s;if(process.env.__DEV_MODE_SSR=`true`,p){let{jsdomGlobal:e}=await import(`./jsdomGlobal-RTx-0uYL.mjs`);e()}return await ne({...e,plugins:[...e.plugins??[],Xt({template:l,ssrEntry:c,onBeforePageRender:u,onPageRendered:d,entry:s.entry||`src/main.ts`,rootContainerId:f})]})}catch(e){throw Error(`[vite-react-ssg] Failed to create dev server: ${e instanceof Error?e.message:String(e)}`,{cause:e})}}async function Qt(e={},t={},n){globalThis.__ssr_start_time=performance.now();try{let r=await Zt(t,e);return await r.listen(),Z(r,!!n),r.bindCLIShortcuts({print:!0}),r}catch(e){d(`failed to start server: ${e?.message??e}`),process.exit(1)}}function Z(e,t=!1){if(t){e.printUrls();return}let n=e.config.logger.info,r=` -- SSR`;if(globalThis.__ssr_start_time){let e=Math.round(performance.now()-globalThis.__ssr_start_time);r+=` ready in ${u.bold(`${e}ms`)}`}n(`\n ${u.cyan(` VITE-REACT-SSG v${B} `)}`,{clear:!e.config.logger.hasWarned}),n(`${u.cyan(`\n VITE v${T}`)+u.dim(r)}\n`),n(u.green(` dev server running at:`)),e.printUrls()}var $t=class{constructor(e){this.template=e.template}stitch(e){let t=this.template;return e.content!==void 0&&(t=t.replace(/<!--BDOCS_SLOT:CONTENT-->/g,e.content)),e.toc!==void 0&&(t=t.replace(/<!--BDOCS_SLOT:TOC-->/g,e.toc)),e.meta!==void 0&&(t=t.replace(/<!--BDOCS_SLOT:META-->/g,e.meta)),e.breadcrumbs!==void 0&&(t=t.replace(/<!--BDOCS_SLOT:BREADCRUMBS-->/g,e.breadcrumbs)),e.pageNav!==void 0&&(t=t.replace(/<!--BDOCS_SLOT:PAGENAV-->/g,e.pageNav)),e.title!==void 0&&(t=t.replace(/<!--BDOCS_SLOT:TITLE-->/g,e.title)),t}};export{$t as ShellStitcher,Wt as build,Zt as createServer,Qt as dev};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{createRequire as e}from"node:module";import{Fragment as t,jsx as n}from"react/jsx-runtime";import{Fragment as r,createElement as i}from"react";import{once as a}from"node:events";import{Readable as o}from"node:stream";import*as s from"react-dom/server";var c=e(import.meta.url);function l(e,t){return!e||!t?e||t||``:(e[e.length-1]===`/`&&(e=e.substring(0,e.length-1)),t[0]!==`/`&&(t=`/${t}`),e+t)}function u(e){return e[0]===`/`?e.slice(1):e}function d(e,t){if(e===t)return`/`;let n=f(t);return e.startsWith(n)?e.slice(n.length-1):e}function f(e){return e[e.length-1]===`/`?e:`${e}/`}function p(e){return e[0]===`/`?e:`/${e}`}function m(e,t=``){return e.map((e,n)=>{let r=e.id||(t?`${t}-${n}`:String(n));return{...e,id:r,children:e.children?m(e.children,r):e.children}})}function h(e){if(!e?.RouteRenderer||!e.matchRouteBranchWithParams||!e.resolveRouteBranch)throw Error(`The SSR entry must expose RouteRenderer, matchRouteBranchWithParams, and resolveRouteBranch`);return{RouteRenderer:e.RouteRenderer,matchRouteBranchWithParams:e.matchRouteBranchWithParams,resolveRouteBranch:e.resolveRouteBranch}}function g(e,t){if(e===!1||e==null)throw console.error(`The following error is a bug in Boltdocs SSG; please open an issue! https://github.com/bolt-docs/boltdocs/issues/new`),Error(t)}function _(e){let t=new Headers;for(let[n,r]of Object.entries(e))if(r)if(Array.isArray(r))for(let e of r)t.append(n,e);else t.set(n,r);return t}function v(e){let t=e.headers.origin&&e.headers.origin!==`null`?e.headers.origin:`http://${e.headers.host}`;g(e.originalUrl,"Expected `nodeReq.originalUrl` to be defined");let n=new URL(e.originalUrl,t),r={method:e.method,headers:_(e.headers)};return new Request(n.href,r)}async function y(e,t){t.statusCode=e.status,t.statusMessage=e.statusText;for(let[n,r]of e.headers)t.setHeader(n,r);if(e.body){let n=e.body,r=o.from(n);r.pipe(t),await a(r,`end`)}else t.end()}function b(e){let t=new URL(e.url);t.searchParams.delete(`_data`);let n={method:e.method,body:e.body,headers:e.headers,signal:e.signal};return n.body&&(n.duplex=`half`),new Request(t.href,n)}const x=S();async function S(){try{let e=(await import(`react-dom/static`)).prerenderToNodeStream;return typeof e==`function`?e:void 0}catch{return}}async function C(e){let t=await x;if(!t)return s.renderToString(i(r,null,e));let{prelude:n}=await t(i(r,null,e)),a=new TextDecoder,o=``;for await(let e of n)typeof e==`string`?(o+=a.decode(),o+=e):o+=a.decode(new Uint8Array(e),{stream:!0});return o+a.decode()}function w(e,t,n){let{helmet:r}=t,i=r.htmlAttributes.toString(),a=r.bodyAttributes.toString(),o=r.title.toString();o.split(`>`)[1]===`</title`&&(o=``);let s=[o,r.meta.toString(),r.link.toString(),r.script.toString()],c=n?.toString?.(e)??``;return{htmlAttributes:i,bodyAttributes:a,metaAttributes:s.filter(Boolean),styleTag:c}}let T=null;function E(){if(T)return T;let e=globalThis.__BOLTDOCS_HELMET_PROVIDER__;if(e)T=e.HelmetProvider||e.default?.HelmetProvider||e;else try{let{createRequire:e}=c(`node:module`),t=e(import.meta.url)(`react-helmet-async`);T=t.HelmetProvider||t.default?.HelmetProvider||t.default||t}catch{T=({children:e})=>n(t,{children:e})}return typeof T!=`function`&&(T=({children:e})=>n(t,{children:e})),T}var D=class{constructor(e,t){this.matchedBranches=new Map,this.resolvedBranches=new Map,this.context=e,this.entryMod=t,this.routerApi=h(t),this.base=e.base,this.getStyleCollector=e.getStyleCollector;let n=e.app;this.coreRoutes=(n?.routes||(Array.isArray(n)?n:e.routes))??[],this.RouteRenderer=this.routerApi.RouteRenderer,this.matchRouteBranchWithParams=this.routerApi.matchRouteBranchWithParams,this.resolveRouteBranch=this.routerApi.resolveRouteBranch}getMatchedBranch(e){let t=`${this.base}\0${e}`,n=this.matchedBranches.get(t);if(n)return n;let r=this.matchRouteBranchWithParams(this.coreRoutes,e,this.base);return this.matchedBranches.set(t,r),r}async getResolvedBranch(e,t){let n=this.resolvedBranches.get(e);if(n)return n;let r=this.resolveRouteBranch(t).catch(t=>{throw this.resolvedBranches.delete(e),t});return this.resolvedBranches.set(e,r),r}async render(e){let t=performance.now(),r=p(e),i=`http://localhost${this.base===`/`||r.startsWith(`${p(this.base).replace(/\/$/,``)}/`)||r===p(this.base).replace(/\/$/,``)?r:`${p(this.base).replace(/\/$/,``)}${r}`}`,a=new Request(i),o=this.getStyleCollector?await this.getStyleCollector():null,s={},c=new URL(a.url).pathname,l=performance.now(),u=this.getMatchedBranch(c),d=performance.now()-l,f=u.map(e=>e.route),m={},h=!1,g=[],_=0,v=0;if(f.length>0){let e=performance.now();g=await this.getResolvedBranch(`${this.base}\0${c}`,f),_=performance.now()-e;let t=performance.now(),n=[];for(let[e,t]of u.entries()){let r=g[e];if(!(!r||typeof r.loader!=`function`))try{let e=await r.loader({request:a,params:{...t.params}});e&&typeof e==`object`&&`data`in e?(h=!0,n.push(e.data)):e&&typeof e==`object`&&(h=!0,n.push(e))}catch{}}m=n.reduce((e,t)=>({...e,...t}),{}),v=performance.now()-t}let y=E(),b=y;b&&typeof b==`function`&&(b.canUseDOM=!1);let x=this.RouteRenderer,S=performance.now(),T=n(y,{context:s,children:n(x,{routes:this.coreRoutes,pathname:c,loaderData:m,hasLoaderData:h,resolvedBranch:g,basename:this.base})});o&&(T=o.collect(T));let D=``;try{D=await C(T)}catch(e){throw console.error(`[SSG Render Error] routePath="${c}":`,e?.stack||e),e}let O=performance.now()-S,k=performance.now(),{htmlAttributes:A,bodyAttributes:j,metaAttributes:M,styleTag:N}=w(D,s,o),P=performance.now()-k;return{appHTML:D,htmlAttributes:A,bodyAttributes:j,metaAttributes:M,styleTag:N,timings:{matchMs:d,resolveMs:_,loadersMs:v,renderMs:O,helmetMs:P,totalMs:performance.now()-t},routerContext:{loaderData:{root:m}}}}async handleLoader(e,t){let{routes:n,base:r}=this.context,{matchRouteBranchWithParams:i,resolveRouteBranch:a}=this.routerApi,o=v(e),s=new URL(o.url),c=decodeURIComponent(s.searchParams.get(`_data`)||``),l=i(m([...n]),s.pathname,r);if(l.length===0){t.statusCode=404,t.end(`Route not found: ${c}`);return}let u=l.find((e,t)=>(e.route.id||String(t))===c);if(!u){t.statusCode=404,t.end(`Route not found: ${c}`);return}let d=((await a(l.map(e=>e.route)))[l.indexOf(u)]||u.route).loader;if(!d){t.statusCode=200,t.end(`There is no loader for the route: ${c}`);return}await y(await O({loader:d,params:u.params,request:o,routeId:c}),t)}};async function O({loader:e,params:t,request:n,routeId:r}){let i=await e({request:b(A(n)),params:t});if(i===void 0)throw Error(`You defined a loader for route "${r}" but didn't return anything from your \`loader\` function. Please return a value or \`null\`.`);return k(i)?i:new Response(JSON.stringify(i),{status:200,headers:{"Content-Type":`application/json`}})}function k(e){return e!=null&&typeof e.status==`number`&&typeof e.statusText==`string`&&typeof e.headers==`object`&&e.body!==void 0}function A(e){let t=new URL(e.url),n=t.searchParams.getAll(`index`);t.searchParams.delete(`index`);let r=[];for(let e of n)e&&r.push(e);for(let e of r)t.searchParams.append(`index`,e);let i={method:e.method,body:e.body,headers:e.headers,signal:e.signal};return i.body&&(i.duplex=`half`),new Request(t.href,i)}function j(e,t){return new D(e,t)}export{p as a,d as i,l as n,f as o,u as r,c as s,j as t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const e=require(`./chunk-Bmb41Sf3.cjs`);let t=require(`react/jsx-runtime`),n=require(`react`),r=require(`node:events`),i=require(`node:stream`),a=require(`react-dom/server`);a=e.t(a);function o(e,t){return!e||!t?e||t||``:(e[e.length-1]===`/`&&(e=e.substring(0,e.length-1)),t[0]!==`/`&&(t=`/${t}`),e+t)}function s(e){return e[0]===`/`?e.slice(1):e}function c(e,t){if(e===t)return`/`;let n=l(t);return e.startsWith(n)?e.slice(n.length-1):e}function l(e){return e[e.length-1]===`/`?e:`${e}/`}function u(e){return e[0]===`/`?e:`/${e}`}function d(e,t=``){return e.map((e,n)=>{let r=e.id||(t?`${t}-${n}`:String(n));return{...e,id:r,children:e.children?d(e.children,r):e.children}})}function f(e){if(!e?.RouteRenderer||!e.matchRouteBranchWithParams||!e.resolveRouteBranch)throw Error(`The SSR entry must expose RouteRenderer, matchRouteBranchWithParams, and resolveRouteBranch`);return{RouteRenderer:e.RouteRenderer,matchRouteBranchWithParams:e.matchRouteBranchWithParams,resolveRouteBranch:e.resolveRouteBranch}}function p(e,t){if(e===!1||e==null)throw console.error(`The following error is a bug in Boltdocs SSG; please open an issue! https://github.com/bolt-docs/boltdocs/issues/new`),Error(t)}function m(e){let t=new Headers;for(let[n,r]of Object.entries(e))if(r)if(Array.isArray(r))for(let e of r)t.append(n,e);else t.set(n,r);return t}function h(e){let t=e.headers.origin&&e.headers.origin!==`null`?e.headers.origin:`http://${e.headers.host}`;p(e.originalUrl,"Expected `nodeReq.originalUrl` to be defined");let n=new URL(e.originalUrl,t),r={method:e.method,headers:m(e.headers)};return new Request(n.href,r)}async function g(e,t){t.statusCode=e.status,t.statusMessage=e.statusText;for(let[n,r]of e.headers)t.setHeader(n,r);if(e.body){let n=e.body,a=i.Readable.from(n);a.pipe(t),await(0,r.once)(a,`end`)}else t.end()}function _(e){let t=new URL(e.url);t.searchParams.delete(`_data`);let n={method:e.method,body:e.body,headers:e.headers,signal:e.signal};return n.body&&(n.duplex=`half`),new Request(t.href,n)}const v=y();async function y(){try{let e=(await import(`react-dom/static`)).prerenderToNodeStream;return typeof e==`function`?e:void 0}catch{return}}async function b(e){let t=await v;if(!t)return a.renderToString((0,n.createElement)(n.Fragment,null,e));let{prelude:r}=await t((0,n.createElement)(n.Fragment,null,e)),i=new TextDecoder,o=``;for await(let e of r)typeof e==`string`?(o+=i.decode(),o+=e):o+=i.decode(new Uint8Array(e),{stream:!0});return o+i.decode()}function x(e,t,n){let{helmet:r}=t,i=r.htmlAttributes.toString(),a=r.bodyAttributes.toString(),o=r.title.toString();o.split(`>`)[1]===`</title`&&(o=``);let s=[o,r.meta.toString(),r.link.toString(),r.script.toString()],c=n?.toString?.(e)??``;return{htmlAttributes:i,bodyAttributes:a,metaAttributes:s.filter(Boolean),styleTag:c}}let S=null;function C(){if(S)return S;let e=globalThis.__BOLTDOCS_HELMET_PROVIDER__;if(e)S=e.HelmetProvider||e.default?.HelmetProvider||e;else try{let{createRequire:e}=require(`node:module`),t=e(require(`url`).pathToFileURL(__filename).href)(`react-helmet-async`);S=t.HelmetProvider||t.default?.HelmetProvider||t.default||t}catch{S=({children:e})=>(0,t.jsx)(t.Fragment,{children:e})}return typeof S!=`function`&&(S=({children:e})=>(0,t.jsx)(t.Fragment,{children:e})),S}var w=class{constructor(e,t){this.matchedBranches=new Map,this.resolvedBranches=new Map,this.context=e,this.entryMod=t,this.routerApi=f(t),this.base=e.base,this.getStyleCollector=e.getStyleCollector;let n=e.app;this.coreRoutes=(n?.routes||(Array.isArray(n)?n:e.routes))??[],this.RouteRenderer=this.routerApi.RouteRenderer,this.matchRouteBranchWithParams=this.routerApi.matchRouteBranchWithParams,this.resolveRouteBranch=this.routerApi.resolveRouteBranch}getMatchedBranch(e){let t=`${this.base}\0${e}`,n=this.matchedBranches.get(t);if(n)return n;let r=this.matchRouteBranchWithParams(this.coreRoutes,e,this.base);return this.matchedBranches.set(t,r),r}async getResolvedBranch(e,t){let n=this.resolvedBranches.get(e);if(n)return n;let r=this.resolveRouteBranch(t).catch(t=>{throw this.resolvedBranches.delete(e),t});return this.resolvedBranches.set(e,r),r}async render(e){let n=performance.now(),r=u(e),i=`http://localhost${this.base===`/`||r.startsWith(`${u(this.base).replace(/\/$/,``)}/`)||r===u(this.base).replace(/\/$/,``)?r:`${u(this.base).replace(/\/$/,``)}${r}`}`,a=new Request(i),o=this.getStyleCollector?await this.getStyleCollector():null,s={},c=new URL(a.url).pathname,l=performance.now(),d=this.getMatchedBranch(c),f=performance.now()-l,p=d.map(e=>e.route),m={},h=!1,g=[],_=0,v=0;if(p.length>0){let e=performance.now();g=await this.getResolvedBranch(`${this.base}\0${c}`,p),_=performance.now()-e;let t=performance.now(),n=[];for(let[e,t]of d.entries()){let r=g[e];if(!(!r||typeof r.loader!=`function`))try{let e=await r.loader({request:a,params:{...t.params}});e&&typeof e==`object`&&`data`in e?(h=!0,n.push(e.data)):e&&typeof e==`object`&&(h=!0,n.push(e))}catch{}}m=n.reduce((e,t)=>({...e,...t}),{}),v=performance.now()-t}let y=C(),S=y;S&&typeof S==`function`&&(S.canUseDOM=!1);let w=this.RouteRenderer,T=performance.now(),E=(0,t.jsx)(y,{context:s,children:(0,t.jsx)(w,{routes:this.coreRoutes,pathname:c,loaderData:m,hasLoaderData:h,resolvedBranch:g,basename:this.base})});o&&(E=o.collect(E));let D=``;try{D=await b(E)}catch(e){throw console.error(`[SSG Render Error] routePath="${c}":`,e?.stack||e),e}let O=performance.now()-T,k=performance.now(),{htmlAttributes:A,bodyAttributes:j,metaAttributes:M,styleTag:N}=x(D,s,o),P=performance.now()-k;return{appHTML:D,htmlAttributes:A,bodyAttributes:j,metaAttributes:M,styleTag:N,timings:{matchMs:f,resolveMs:_,loadersMs:v,renderMs:O,helmetMs:P,totalMs:performance.now()-n},routerContext:{loaderData:{root:m}}}}async handleLoader(e,t){let{routes:n,base:r}=this.context,{matchRouteBranchWithParams:i,resolveRouteBranch:a}=this.routerApi,o=h(e),s=new URL(o.url),c=decodeURIComponent(s.searchParams.get(`_data`)||``),l=i(d([...n]),s.pathname,r);if(l.length===0){t.statusCode=404,t.end(`Route not found: ${c}`);return}let u=l.find((e,t)=>(e.route.id||String(t))===c);if(!u){t.statusCode=404,t.end(`Route not found: ${c}`);return}let f=((await a(l.map(e=>e.route)))[l.indexOf(u)]||u.route).loader;if(!f){t.statusCode=200,t.end(`There is no loader for the route: ${c}`);return}await g(await T({loader:f,params:u.params,request:o,routeId:c}),t)}};async function T({loader:e,params:t,request:n,routeId:r}){let i=await e({request:_(D(n)),params:t});if(i===void 0)throw Error(`You defined a loader for route "${r}" but didn't return anything from your \`loader\` function. Please return a value or \`null\`.`);return E(i)?i:new Response(JSON.stringify(i),{status:200,headers:{"Content-Type":`application/json`}})}function E(e){return e!=null&&typeof e.status==`number`&&typeof e.statusText==`string`&&typeof e.headers==`object`&&e.body!==void 0}function D(e){let t=new URL(e.url),n=t.searchParams.getAll(`index`);t.searchParams.delete(`index`);let r=[];for(let e of n)e&&r.push(e);for(let e of r)t.searchParams.append(`index`,e);let i={method:e.method,body:e.body,headers:e.headers,signal:e.signal};return i.body&&(i.duplex=`half`),new Request(t.href,i)}function O(e,t){return new w(e,t)}Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return u}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return c}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return o}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return l}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return s}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return O}});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const e=new TextEncoder,t=new TextDecoder;function n(t){return e.encode(t).buffer}function r(e){return e instanceof ArrayBuffer?t.decode(e):t.decode(new Uint8Array(e.buffer,e.byteOffset,e.byteLength))}function i(e,t){try{let n=[],r=JSON.stringify(e,function(e,t){if(typeof t==`bigint`)return null;if(!(typeof t==`function`||typeof t==`symbol`)){if(typeof t==`object`&&t){for(;n.length>0&&n[n.length-1]!==this;)n.pop();if(n.includes(t))return;n.push(t)}return t}});return r===void 0?t:JSON.parse(r)}catch{return t}}function a(e){return e?{loaderData:i(e.loaderData??{},{}),actionData:i(e.actionData??null,null),errors:i(e.errors??null,null)}:null}function o(e){return e?`window.__staticRouterHydrationData = ${JSON.stringify(e).replace(/</g,`\\u003c`)};`:``}export{n as i,a as n,r,o as t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const e=new TextEncoder,t=new TextDecoder;function n(t){return e.encode(t).buffer}function r(e){return e instanceof ArrayBuffer?t.decode(e):t.decode(new Uint8Array(e.buffer,e.byteOffset,e.byteLength))}function i(e,t){try{let n=[],r=JSON.stringify(e,function(e,t){if(typeof t==`bigint`)return null;if(!(typeof t==`function`||typeof t==`symbol`)){if(typeof t==`object`&&t){for(;n.length>0&&n[n.length-1]!==this;)n.pop();if(n.includes(t))return;n.push(t)}return t}});return r===void 0?t:JSON.parse(r)}catch{return t}}function a(e){return e?{loaderData:i(e.loaderData??{},{}),actionData:i(e.actionData??null,null),errors:i(e.errors??null,null)}:null}function o(e){return e?`window.__staticRouterHydrationData = ${JSON.stringify(e).replace(/</g,`\\u003c`)};`:``}Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return n}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return a}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return r}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return o}});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const e=require(`./chunk-Bmb41Sf3.cjs`),t=require(`./ssg-worker-payload-B_9N9o5p.cjs`);let n=require(`node:os`),r=require(`node:path`),i=require(`piscina`);i=e.t(i,1);let a=require(`node:url`);function o({cpuCount:e,totalMemoryGB:t,freeMemoryGB:n,requestedWorkers:r,envWorkers:i}){let a=Math.max(1,e||4),o=Math.max(1,a-1),s=t>=4?Math.min(o,12):4,c=Math.max(2,Math.floor(t*.35/.256)),l=Math.max(2,Math.floor(n/.3)),u=Math.min(c,l),d=Number.parseInt(i||``,10),f=Math.max(2,Math.min(Math.floor(a/2),4));return Math.max(2,Math.min(r??(Number.isFinite(d)&&d>0?d:f),o,u,s))}const s=(0,r.dirname)((0,a.fileURLToPath)(require(`url`).pathToFileURL(__filename).href));function c(e){return!!e&&typeof e==`object`&&typeof e.path==`string`&&typeof e.error==`string`}var l=class{constructor(e){this.totalRendered=0,this.totalErrors=0,this.destroyPromise=null;let{ssrEntryPath:t,format:a=`esm`}=e,c=(0,n.freemem)()/1024/1024/1024,l=(0,n.totalmem)()/1024/1024/1024;this.totalWorkers=o({cpuCount:(0,n.cpus)().length||4,totalMemoryGB:l,freeMemoryGB:c,requestedWorkers:e.numWorkers,envWorkers:process.env.BOLTDOCS_SSG_WORKERS});let u=(0,r.join)(s,`ssg-worker.mjs`);this.startTime=performance.now(),this.piscina=new i.default({filename:u,workerData:{ssrEntryPath:t,format:a},maxThreads:this.totalWorkers,minThreads:0,idleTimeout:1e4}),process.env.BOLTDOCS_BENCHMARK_PHASES===`true`&&console.log(`[ssg-worker/piscina] Piscina pool initialized with ${this.totalWorkers} workers (RAM: ${l.toFixed(1)} GB total, ${c.toFixed(1)} GB free)`)}async ready(){return Promise.resolve()}decodeResult(e,n){if(!e||typeof e!=`object`||e.path!==n||(e.routerContext=e.routerContext??null,e._appHTMLBuffer&&(e.appHTML=t.r(e._appHTMLBuffer),delete e._appHTMLBuffer),e._routerContextBuffer||typeof e.appHTML!=`string`||!Array.isArray(e.metaAttributes)||typeof e.bodyAttributes!=`string`||typeof e.htmlAttributes!=`string`||e.routerContext!==null&&(typeof e.routerContext!=`object`||Array.isArray(e.routerContext))))throw Error(`SSG worker returned an invalid render payload`);return e}async render(e){try{let t=this.decodeResult(await this.piscina.run({type:`render`,path:e}),e);return this.totalRendered++,t}catch(e){throw this.totalErrors++,e}}async renderBatch(e){if(e.length===0)return[];try{let t=await this.piscina.run({type:`render-batch`,paths:[...e]});if(!Array.isArray(t)||t.length!==e.length)throw Error(`SSG worker returned an invalid batch payload`);let n=t.map((t,n)=>{if(c(t))return t;if(!t||typeof t!=`object`)throw Error(`SSG worker returned an invalid batch item`);return this.decodeResult(t,e[n])});return this.totalRendered+=n.filter(e=>!c(e)).length,this.totalErrors+=n.filter(c).length,n}catch(e){throw this.totalErrors++,e}}async destroy(){if(this.destroyPromise)return this.destroyPromise;this.destroyPromise=this.piscina.destroy(),await this.destroyPromise}poolMetrics(){return{totalWorkers:this.totalWorkers,readyCount:this.totalWorkers,busyCount:this.piscina.completed,pagesPerWorker:[],initTimesMs:[],totalRendered:this.totalRendered,totalErrors:this.totalErrors,allReadyMs:Math.round(performance.now()-this.startTime),failedCount:0}}};exports.SsgWorkerPool=l;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{r as e}from"./ssg-worker-payload-BHsJklNf.mjs";import{cpus as t,freemem as n,totalmem as r}from"node:os";import{dirname as i,join as a}from"node:path";import o from"piscina";import{fileURLToPath as s}from"node:url";function c({cpuCount:e,totalMemoryGB:t,freeMemoryGB:n,requestedWorkers:r,envWorkers:i}){let a=Math.max(1,e||4),o=Math.max(1,a-1),s=t>=4?Math.min(o,12):4,c=Math.max(2,Math.floor(t*.35/.256)),l=Math.max(2,Math.floor(n/.3)),u=Math.min(c,l),d=Number.parseInt(i||``,10),f=Math.max(2,Math.min(Math.floor(a/2),4));return Math.max(2,Math.min(r??(Number.isFinite(d)&&d>0?d:f),o,u,s))}const l=i(s(import.meta.url));function u(e){return!!e&&typeof e==`object`&&typeof e.path==`string`&&typeof e.error==`string`}var d=class{constructor(e){this.totalRendered=0,this.totalErrors=0,this.destroyPromise=null;let{ssrEntryPath:i,format:s=`esm`}=e,u=n()/1024/1024/1024,d=r()/1024/1024/1024;this.totalWorkers=c({cpuCount:t().length||4,totalMemoryGB:d,freeMemoryGB:u,requestedWorkers:e.numWorkers,envWorkers:process.env.BOLTDOCS_SSG_WORKERS});let f=a(l,`ssg-worker.mjs`);this.startTime=performance.now(),this.piscina=new o({filename:f,workerData:{ssrEntryPath:i,format:s},maxThreads:this.totalWorkers,minThreads:0,idleTimeout:1e4}),process.env.BOLTDOCS_BENCHMARK_PHASES===`true`&&console.log(`[ssg-worker/piscina] Piscina pool initialized with ${this.totalWorkers} workers (RAM: ${d.toFixed(1)} GB total, ${u.toFixed(1)} GB free)`)}async ready(){return Promise.resolve()}decodeResult(t,n){if(!t||typeof t!=`object`||t.path!==n||(t.routerContext=t.routerContext??null,t._appHTMLBuffer&&(t.appHTML=e(t._appHTMLBuffer),delete t._appHTMLBuffer),t._routerContextBuffer||typeof t.appHTML!=`string`||!Array.isArray(t.metaAttributes)||typeof t.bodyAttributes!=`string`||typeof t.htmlAttributes!=`string`||t.routerContext!==null&&(typeof t.routerContext!=`object`||Array.isArray(t.routerContext))))throw Error(`SSG worker returned an invalid render payload`);return t}async render(e){try{let t=this.decodeResult(await this.piscina.run({type:`render`,path:e}),e);return this.totalRendered++,t}catch(e){throw this.totalErrors++,e}}async renderBatch(e){if(e.length===0)return[];try{let t=await this.piscina.run({type:`render-batch`,paths:[...e]});if(!Array.isArray(t)||t.length!==e.length)throw Error(`SSG worker returned an invalid batch payload`);let n=t.map((t,n)=>{if(u(t))return t;if(!t||typeof t!=`object`)throw Error(`SSG worker returned an invalid batch item`);return this.decodeResult(t,e[n])});return this.totalRendered+=n.filter(e=>!u(e)).length,this.totalErrors+=n.filter(u).length,n}catch(e){throw this.totalErrors++,e}}async destroy(){if(this.destroyPromise)return this.destroyPromise;this.destroyPromise=this.piscina.destroy(),await this.destroyPromise}poolMetrics(){return{totalWorkers:this.totalWorkers,readyCount:this.totalWorkers,busyCount:this.piscina.completed,pagesPerWorker:[],initTimesMs:[],totalRendered:this.totalRendered,totalErrors:this.totalErrors,allReadyMs:Math.round(performance.now()-this.startTime),failedCount:0}}};export{d as SsgWorkerPool};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const e=require(`./chunk-Bmb41Sf3.cjs`),t=require(`./router-adapter-DtnukOfG.cjs`),n=require(`./ssg-worker-payload-B_9N9o5p.cjs`);let r=require(`node:module`),i=require(`piscina`);i=e.t(i,1);let a=require(`node:worker_threads`),o=null;async function s(e,s=!0){if(!e)throw Error(`Invalid render job payload`);if(!o){let{ssrEntryPath:e,format:n}=a.workerData,i=n===`esm`?await import(e):(0,r.createRequire)(require(`url`).pathToFileURL(__filename).href)(e);o=t.t(await i.createRoot(!1),i)}let{appHTML:c,bodyAttributes:l,htmlAttributes:u,metaAttributes:d,styleTag:f,routerContext:p,timings:m}=await o.render(e),h=n.n(p),g=n.i(c),_={path:e,_appHTMLBuffer:g,metaAttributes:d,bodyAttributes:l,htmlAttributes:u,styleTag:f,routerContext:h,timings:m},v={get[i.default.transferableSymbol](){return[g]},get[i.default.valueSymbol](){return _}};return s?i.default.move(v):_}async function c(e){if(e.type===`render`)return s(e.path||``);if(e.type===`render-batch`&&Array.isArray(e.paths)){let t=[],n=[];for(let r of e.paths)try{let e=await s(r,!1);t.push(e);let i=e._appHTMLBuffer;if(i instanceof ArrayBuffer)n.push(i);else if(i&&ArrayBuffer.isView(i)){let e=i.buffer;e instanceof ArrayBuffer&&n.push(e)}}catch(e){t.push({path:r,error:e instanceof Error?e.message:String(e)})}return i.default.move({get[i.default.transferableSymbol](){return n},get[i.default.valueSymbol](){return t}})}throw Error(`Invalid render job payload`)}module.exports=c;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import * as _$node_modules_piscina_dist_types0 from "node_modules/piscina/dist/types";
|
|
2
|
+
import * as _$worker_threads from "worker_threads";
|
|
3
|
+
|
|
4
|
+
//#region src/node/ssg-worker.d.ts
|
|
5
|
+
/**
|
|
6
|
+
* SSG Worker — runs in a Node.js worker_thread.
|
|
7
|
+
*
|
|
8
|
+
* Each worker loads the SSR entry once, then processes render jobs sent
|
|
9
|
+
* by the main thread. Multiple workers (one per CPU core) run in parallel
|
|
10
|
+
* so CPU-bound React.renderToString calls are distributed across cores.
|
|
11
|
+
*
|
|
12
|
+
* IMPORTANT: imports from this package must be STATIC (not dynamic) so
|
|
13
|
+
* tsdown bundles them into the worker file. A dynamic import like
|
|
14
|
+
* `await import('./router-adapter')` would try to resolve a separate
|
|
15
|
+
* file at runtime that doesn't exist.
|
|
16
|
+
*
|
|
17
|
+
* Cache the adapter after warm-up so per-page renders skip the
|
|
18
|
+
* expensive createRoot(false, path) call. Results use a plain structured-clone
|
|
19
|
+
* payload so the worker protocol stays compatible across ESM and CJS builds.
|
|
20
|
+
*/
|
|
21
|
+
declare function renderTask(msg: {
|
|
22
|
+
type: string;
|
|
23
|
+
path?: string;
|
|
24
|
+
paths?: string[];
|
|
25
|
+
}): Promise<_$node_modules_piscina_dist_types0.Transferable | _$worker_threads.MessagePort | ArrayBuffer | ArrayBufferView<ArrayBufferLike> | Record<string, unknown>>;
|
|
26
|
+
export = renderTask;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import * as _$node_modules_piscina_dist_types0 from "node_modules/piscina/dist/types";
|
|
2
|
+
import * as _$worker_threads from "worker_threads";
|
|
3
|
+
|
|
4
|
+
//#region src/node/ssg-worker.d.ts
|
|
5
|
+
/**
|
|
6
|
+
* SSG Worker — runs in a Node.js worker_thread.
|
|
7
|
+
*
|
|
8
|
+
* Each worker loads the SSR entry once, then processes render jobs sent
|
|
9
|
+
* by the main thread. Multiple workers (one per CPU core) run in parallel
|
|
10
|
+
* so CPU-bound React.renderToString calls are distributed across cores.
|
|
11
|
+
*
|
|
12
|
+
* IMPORTANT: imports from this package must be STATIC (not dynamic) so
|
|
13
|
+
* tsdown bundles them into the worker file. A dynamic import like
|
|
14
|
+
* `await import('./router-adapter')` would try to resolve a separate
|
|
15
|
+
* file at runtime that doesn't exist.
|
|
16
|
+
*
|
|
17
|
+
* Cache the adapter after warm-up so per-page renders skip the
|
|
18
|
+
* expensive createRoot(false, path) call. Results use a plain structured-clone
|
|
19
|
+
* payload so the worker protocol stays compatible across ESM and CJS builds.
|
|
20
|
+
*/
|
|
21
|
+
declare function renderTask(msg: {
|
|
22
|
+
type: string;
|
|
23
|
+
path?: string;
|
|
24
|
+
paths?: string[];
|
|
25
|
+
}): Promise<_$node_modules_piscina_dist_types0.Transferable | _$worker_threads.MessagePort | ArrayBuffer | ArrayBufferView<ArrayBufferLike> | Record<string, unknown>>;
|
|
26
|
+
//#endregion
|
|
27
|
+
export { renderTask as default };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{t as e}from"./router-adapter-BukFH1uk.mjs";import{i as t,n}from"./ssg-worker-payload-BHsJklNf.mjs";import{createRequire as r}from"node:module";import i from"piscina";import{workerData as a}from"node:worker_threads";let o=null;async function s(s,c=!0){if(!s)throw Error(`Invalid render job payload`);if(!o){let{ssrEntryPath:t,format:n}=a,i=n===`esm`?await import(t):r(import.meta.url)(t);o=e(await i.createRoot(!1),i)}let{appHTML:l,bodyAttributes:u,htmlAttributes:d,metaAttributes:f,styleTag:p,routerContext:m,timings:h}=await o.render(s),g=n(m),_=t(l),v={path:s,_appHTMLBuffer:_,metaAttributes:f,bodyAttributes:u,htmlAttributes:d,styleTag:p,routerContext:g,timings:h},y={get[i.transferableSymbol](){return[_]},get[i.valueSymbol](){return v}};return c?i.move(y):v}async function c(e){if(e.type===`render`)return s(e.path||``);if(e.type===`render-batch`&&Array.isArray(e.paths)){let t=[],n=[];for(let r of e.paths)try{let e=await s(r,!1);t.push(e);let i=e._appHTMLBuffer;if(i instanceof ArrayBuffer)n.push(i);else if(i&&ArrayBuffer.isView(i)){let e=i.buffer;e instanceof ArrayBuffer&&n.push(e)}}catch(e){t.push({path:r,error:e instanceof Error?e.message:String(e)})}return i.move({get[i.transferableSymbol](){return n},get[i.valueSymbol](){return t}})}throw Error(`Invalid render job payload`)}export{c as default};
|
|
@@ -1,9 +1,34 @@
|
|
|
1
|
+
import { ComponentType, ReactElement, ReactNode } from "react";
|
|
1
2
|
import { Options } from "beasties";
|
|
2
|
-
import { ReactElement, ReactNode } from "react";
|
|
3
|
-
import { FutureConfig, IndexRouteObject, NonIndexRouteObject, createBrowserRouter } from "react-router-dom";
|
|
4
3
|
|
|
4
|
+
//#region src/router-contract.d.ts
|
|
5
|
+
interface LoaderFunctionArgs {
|
|
6
|
+
request: Request;
|
|
7
|
+
params: Record<string, string>;
|
|
8
|
+
}
|
|
9
|
+
type LoaderFunction = (args: LoaderFunctionArgs) => Promise<unknown> | unknown;
|
|
10
|
+
interface RouterRouteRecord {
|
|
11
|
+
path?: string;
|
|
12
|
+
index?: boolean;
|
|
13
|
+
id?: string;
|
|
14
|
+
element?: ReactNode;
|
|
15
|
+
Component?: ComponentType<any>;
|
|
16
|
+
loader?: LoaderFunction;
|
|
17
|
+
action?: (...args: any[]) => unknown;
|
|
18
|
+
children?: RouterRouteRecord[];
|
|
19
|
+
lazy?: () => Promise<Record<string, unknown>>;
|
|
20
|
+
getStaticPaths?: () => string[] | Promise<string[]>;
|
|
21
|
+
entry?: string;
|
|
22
|
+
locale?: string;
|
|
23
|
+
}
|
|
24
|
+
//#endregion
|
|
5
25
|
//#region src/types.d.ts
|
|
6
|
-
|
|
26
|
+
/** Minimal router shape kept for the public SSG context without a DOM-router dependency. */
|
|
27
|
+
interface Router {
|
|
28
|
+
navigate?: (...args: any[]) => unknown;
|
|
29
|
+
state?: unknown;
|
|
30
|
+
[key: string]: unknown;
|
|
31
|
+
}
|
|
7
32
|
interface ViteReactSSGOptions<Context = ViteReactSSGContext> {
|
|
8
33
|
/**
|
|
9
34
|
* Set the scripts' loading mode. Only works for `type="module"`.
|
|
@@ -69,11 +94,23 @@ interface ViteReactSSGOptions<Context = ViteReactSSGContext> {
|
|
|
69
94
|
* @see https://github.com/danielroe/beasties
|
|
70
95
|
*/
|
|
71
96
|
beastiesOptions?: Options | false;
|
|
97
|
+
/**
|
|
98
|
+
* Critical CSS processing strategy.
|
|
99
|
+
*
|
|
100
|
+
* - `'zig-critters'` (default): Use zig-critters WASM for fast critical CSS inlining.
|
|
101
|
+
* Falls back to **no critical CSS** if WASM is unavailable (no beasties fallback).
|
|
102
|
+
* - `'beasties'`: Use beasties (JS-based) for critical CSS. Slower but always available.
|
|
103
|
+
* - `false`: Skip critical CSS entirely.
|
|
104
|
+
*
|
|
105
|
+
* @default 'zig-critters'
|
|
106
|
+
*/
|
|
107
|
+
criticalCss?: 'zig-critters' | 'beasties' | false;
|
|
72
108
|
/**
|
|
73
109
|
* Enable turbo mode: use zig-critters WASM instead of beasties JS for critical CSS.
|
|
74
110
|
* Falls back to beasties if the WASM binary is unavailable.
|
|
75
111
|
*
|
|
76
112
|
* @default false
|
|
113
|
+
* @deprecated Use `criticalCss` instead. `turbo=true` is equivalent to `criticalCss: 'zig-critters'`.
|
|
77
114
|
*/
|
|
78
115
|
turbo?: boolean;
|
|
79
116
|
/**
|
|
@@ -189,12 +226,15 @@ interface CommonRouteOptions {
|
|
|
189
226
|
*/
|
|
190
227
|
getStaticPaths?: () => string[] | Promise<string[]>;
|
|
191
228
|
}
|
|
192
|
-
type NonIndexRouteRecord = Omit<
|
|
229
|
+
type NonIndexRouteRecord = Omit<RouterRouteRecord, 'children'> & {
|
|
193
230
|
children?: RouteRecord[];
|
|
194
231
|
} & CommonRouteOptions;
|
|
195
|
-
type IndexRouteRecord =
|
|
232
|
+
type IndexRouteRecord = NonIndexRouteRecord & {
|
|
233
|
+
index: true;
|
|
234
|
+
};
|
|
196
235
|
type RouteRecord = NonIndexRouteRecord | IndexRouteRecord;
|
|
197
236
|
interface RouterFutureConfig {
|
|
237
|
+
[key: string]: boolean | undefined;
|
|
198
238
|
v7_fetcherPersist?: boolean;
|
|
199
239
|
v7_normalizeFormMethod?: boolean;
|
|
200
240
|
v7_partialHydration?: boolean;
|
|
@@ -204,8 +244,8 @@ interface RouterFutureConfig {
|
|
|
204
244
|
interface RouterOptions {
|
|
205
245
|
routes: RouteRecord[];
|
|
206
246
|
basename?: string;
|
|
207
|
-
future?: Partial<RouterFutureConfig
|
|
208
|
-
customCreateRouter?:
|
|
247
|
+
future?: Partial<RouterFutureConfig>;
|
|
248
|
+
customCreateRouter?: (...args: any[]) => Router;
|
|
209
249
|
}
|
|
210
250
|
interface StyleCollector {
|
|
211
251
|
collect: (app: ReactElement) => ReactElement;
|
|
@@ -218,4 +258,4 @@ declare module 'vite' {
|
|
|
218
258
|
}
|
|
219
259
|
}
|
|
220
260
|
//#endregion
|
|
221
|
-
export {
|
|
261
|
+
export { RouterFutureConfig as a, ViteReactSSGClientOptions as c, Router as i, ViteReactSSGContext as l, NonIndexRouteRecord as n, RouterOptions as o, RouteRecord as r, StyleCollector as s, IndexRouteRecord as t, ViteReactSSGOptions as u };
|