@bdocs/ssg 0.3.1 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/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-5bBDTafc.d.mts} +48 -8
- package/dist/{types-DefKqSqW.d.mts → types-ClSMhb8G.d.cts} +48 -8
- package/dist/zig-pool-Cpw16nuK.cjs +1 -0
- package/dist/zig-pool-lU4VVJjc.mjs +1 -0
- package/package.json +7 -9
- 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-5bBDTafc.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.1`;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 F(){try{let e=await import(`@bdocs/zig-critters`),t=e.extractCriticalCss||e.default?.extractCriticalCss;return t?{extractCriticalCss:t}:void 0}catch{return}}async function oe(e={}){try{let{createZigCrittersPool:t}=await import(`./zig-pool-lU4VVJjc.mjs`),n=await t(e);if(n)return{extractCriticalCss:(e,t,r)=>n.extractCriticalCss(e,t,r),dispose:()=>n.dispose()}}catch{}return F()}function se(e,t,n,r){let i=e.replace(/<!--[\s\S]*?-->/g,``).replace(/>([^<]+)</g,`><`).replace(/\s+/g,` `).trim();return E.createHash(`sha256`).update(r).update(`\0`).update(i).update(`\0`).update(t||n).digest(`hex`)}function I(e){return e.match(/<style\b[^>]*>[\s\S]*?<\/style>/gi)??[]}function ce(e,t){let n=new Set(I(e)),r=I(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 L=new Set([`.js`,`.mjs`,`.css`]);function R(e){let t=m.extname(e).toLowerCase();return L.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 de(e,t,n){if(n.has(t))return;let r=e.get(t);if(r){n.add(t);for(let t of r.imports||[])R(t)&&de(e,t,n);for(let e of r.css||[])n.add(e);for(let t of r.dynamicImports||[])R(t)&&!n.has(t)&&de(e,t,n)}}async function fe(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 pe(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)de(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)R(t)&&de(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 fe(t,Array.from(p).sort(),c)}const me=`/* 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 he({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>${me}<\/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 ge({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>${me}<\/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 _e(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 ve(e){return`<link rel="stylesheet" href="${e}">`}function ye(e){let t=new Set,n=[];return e&&e.forEach(e=>{if(!t.has(e)){t.add(e);let r=B(e);r&&n.push(r)}}),n.join(``)}function B(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 V=`0.4.1`;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&&Ce(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 Se=/[:*?]/;function Ce(e){return e?Se.test(e):!1}async function we(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 Te(e){let t=new Set,n=[];for(let r of e)t.has(r.destination)||(t.add(r.destination),n.push(we(r.source,r.destination)));await Promise.all(n)}function Ee({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 De(e,t,n,r=[]){return{cacheHash:e,clientFiles:[...new Set(t)].sort(),pageFiles:[...new Set(n)].sort(),auxiliaryFiles:[...new Set(r)].sort()}}function Oe(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(Ne(n),[...new Set(u)].sort())?u.every(e=>S.existsSync(`${n}/${e}`)):!1}function ke(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 Ae(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:De(t.cacheHash,t.clientFiles,t.pageFiles,t.auxiliaryFiles)}catch{return}}async function je(e,t,n,r,i=[],a){let o=a||Ne(n),s=new Set(r),c=new Set(i);return Ie(e,De(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 Me(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[H(i)]?.loaderDataFilePath;o&&r.push(o)}return[...new Set(r)]}function Ne(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 H(t){return!t||t===`/`?``:e(t).replace(/\/+$/,``)}function Pe(e,t){let n=new Set(t.map(H)),r={};for(let[t,i]of Object.entries(e)){let e=H(t);n.has(e)&&(r[e]=i)}return r}async function Fe(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 Ie(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 U=new Set([`.png`,`.jpg`,`.jpeg`,`.gif`,`.svg`,`.webp`,`.avif`,`.ico`]),Le=new Set([`.woff`,`.woff2`,`.ttf`,`.otf`,`.eot`]);function W(e){try{return A.statSync(e).size}catch{return 0}}const Re=`boltdocs-metrics.json`;function ze(e){if(!e)return null;try{let t=v(e,Re);return A.existsSync(t)?JSON.parse(A.readFileSync(t,`utf-8`)):null}catch{return null}}function Be(e,t){try{let n=m.resolve(e,`..`,`reports`);A.existsSync(n)||A.mkdirSync(n,{recursive:!0}),A.writeFileSync(v(e,Re),JSON.stringify(t))}catch{}}async function Ve(e,t,n,r={}){if(!r.outputFiles&&!r.manifestPath){let e=ze(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=W(v(e,n));c+=i;for(let t of r)l+=W(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);U.has(e)?u+=W(n):Le.has(e)&&d++}}let f=v(e,`index.html`),p=0,h=[];if(A.existsSync(f)){let e=W(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=W(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&&Be(n,_),_}function He(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 Ue(e,t){try{if(!S.existsSync(e))return!1;let n=S.readFileSync(e);return t.update(n),!0}catch{return!1}}const We=new Set([`node_modules`,`.git`,`.boltdocs`,`.turbo`,`dist`,`coverage`,`__tests__`,`test`,`tests`,`.next`,`.cache`]),Ge=new Set([`.ts`,`.tsx`,`.js`,`.jsx`,`.css`,`.json`,`.md`,`.mdx`,`.html`,`.svg`,`.yaml`,`.yml`,`.webp`,`.png`,`.jpg`,`.jpeg`,`.gif`,`.ico`]);function Ke(e){let t=e.lastIndexOf(`.`);if(t===-1)return!1;let n=e.slice(t).toLowerCase();return Ge.has(n)}function qe(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(We.has(i))continue;qe(r,t,n)}else if(a.isFile()&&Ke(i)){let e=y(t,r).replace(/\\/g,`/`);n.update(`${e}:${a.mtimeMs}:${a.size}\n`)}}}function Je(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)&&qe(i,e,t)}catch{}}function Ye(e,t,n){let r=[v(e,t,`public`),v(e,t,`src`)];for(let t of r)try{S.existsSync(t)&&qe(t,e,n)}catch{}}const Xe=[`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 Ze(e,t){for(let n of Xe){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 Qe(e,t,n){try{S.removeSync(v(n,`hash-merkle.json`))}catch{}try{let n=D(`sha256`);if(Je(e,n),Ue(v(e,`.boltdocs`,`compiled`,`manifest.json`),n))Ye(e,t,n);else{let r=v(e,t);S.existsSync(r)&&qe(r,e,n)}return Ze(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 $e(e){return E.createHash(`md5`).update(e).digest(`hex`)}function et(e,t){return!!(e&&e.size===t.size&&e.mtimeMs===t.mtimeMs&&e.ctimeMs===t.ctimeMs&&e.ino===t.ino)}async function tt(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 G(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 nt(e,t,n){let r=await tt(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(et(o,e)){i.set(t,o.hash),a[t]=o;return}let s=$e(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 G(n,a),i}function rt(e,t){if(e)try{let t=S.statSync(e);return`${t.mtimeMs}:${t.size}`}catch{}return t}function it({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 at(e){return e===null?null:e.poolMetrics()}function ot(e,t){return _(t)?t:v(e,t)}function st(e,t={}){let n={};for(let[r,i]of Object.entries(t)){let t=H(r);n[t]=ot(e,i)}return Object.freeze(n)}function ct(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:st(e.root,e.routeToSourceFileMap)})}function lt(e,t,n={}){let r=st(e,n),i=t.map(t=>{let i=H(t.path),a=n[t.path],o=a?ot(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 ut(e,t){return Object.freeze({...e,routeManifest:t})}const dt=[/^@bdocs\//,/^boltdocs(?:\/|$)/,/^react-helmet-async(?:\/|$)/],K=[`react`,`react-dom`];function q(e){return Number.parseInt(T,10)>=8?{rolldownOptions:e}:{rollupOptions:e}}function ft(){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 pt(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 mt(e){return e.map(e=>{if(Array.isArray(e))return mt(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 ht(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 gt(e){try{let t=await S.readFile(e);return D(`sha256`).update(t.toString()).digest(`hex`)}catch{return}}function _t(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 vt(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 ht(e):[],a={};for(let t of i){let n=await gt(v(e,t));n&&(a[t]=n)}for(let[e,n]of Object.entries(r)){if(a[e]!==void 0||!n)continue;let r=_t(t,e);r&&await gt(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 yt(e){return C(e.viteConfig,{logLevel:`warn`,build:{manifest:!0,ssrManifest:!0,chunkSizeWarningLimit:2e3,reportCompressedSize:!1,sourcemap:!1,cssMinify:`esbuild`,...q({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 bt(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,...q({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:[...dt],external:[...K]},plugins:[...mt(e.viteConfig.plugins||[]),ft()]})}async function xt(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 vt(e.viteConfig.publicDir,t),Tt(t,e.outDir),o=pt(v(e.clientCacheDir,`dist`),e.htmlEntry)}else{await ee(yt({...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 vt(e.viteConfig.publicDir,u),o=pt(u,e.htmlEntry),await S.writeFile(l,i,`utf-8`),await Et(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 St(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(bt(e));let n=performance.now()-t;return e.onStep?.({name:`Server build`,duration:n,success:!0,details:`Vite SSR bundle`}),{durationMs:n}}function Ct(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 wt(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 Tt(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())Tt(n,i);else if(r.isFile())try{S.linkSync(n,i)}catch{S.copyFileSync(n,i)}}}async function Et(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 Dt(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 Ot(e,t){return t===`nested`?v(e.replace(/^\//g,``),`index.html`):`${(e.endsWith(`/`)?`${e}index`:e).replace(/^\//g,``)}.html`}function kt(e){return Object.freeze(e)}function At(e){let t=new Map;for(let n of e.routes){let a=E.createHash(`md5`).update(n).digest(`hex`),o=H(n),s=e.routeToSourceFileMap[o]||e.routeToSourceFileMap[n],c=s?e.sourceMeta.get(s):void 0;t.set(n,kt({path:n,pathHash:a,cachedHtmlFile:v(e.ssgPagesDir,`${a}.html`),cachedLoaderFile:v(e.ssgPagesDir,`${a}.json`),finalOutFile:v(e.outDir,Ot(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 jt(e,t){let n=e.get(t);if(!n)throw Error(`Missing render plan for route: ${t}`);return n}function Mt(e){return e.then(e=>({ok:!0,value:e}),e=>({ok:!1,error:e}))}function Nt(e){return!Number.isFinite(e)||e<=0?2:Math.max(2,Math.min(32,Math.ceil(e)*2))}function J(e,t){return e>4&&!t}function Pt(e,t){return!!e&&typeof e==`object`&&typeof e.path==`string`&&typeof e.error==`string`&&(t===void 0||e.path===t)}function Y(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 Ft(e){let t=[],n=new Set,r=e.getPool(),i=Nt(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=Mt(e).finally(()=>{n.delete(r)}),t.push(r),n.add(r)};try{if(J(e.routes.length,e.canBypassClientBuild)&&(await e.ensurePool(),r=e.getPool(),r&&(i=Nt(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(!Y(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=Pt(o,r)?await e.onWorkerFailure(r,i,Error(o.error),d):Y(o,r)?o:await e.onWorkerFailure(r,i,Error(`SSG worker returned an invalid batch item`),d),!Y(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=Nt(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(!Y(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 It=Number.parseInt(T)>=5?[`.vite`]:[];function Lt(e){let t=Object.fromEntries(Object.entries(e).sort(([e],[t])=>e<t?-1:+(e>t)));return JSON.stringify(t)}function Rt(t,n){return`static-loader-data${e(t===`/`?`/index`:t.endsWith(`/`)?`${t}index`:t)}.${n}.json`}function zt(e){let t=e.slice(e.lastIndexOf(`.`)).toLowerCase();return t===`.js`||t===`.mjs`||t===`.css`}function Bt(e){let t=new Set;for(let n of Object.values(e)){zt(n.file)&&t.add(n.file);for(let e of n.css||[])zt(e)&&t.add(e);for(let e of n.imports||[])zt(e)&&t.add(e);for(let e of n.dynamicImports||[])zt(e)&&t.add(e)}return[...t]}async function Vt(e,t,n){return nt(e,Bt(t),n?v(n,`chunk-hashes.json`):void 0)}function Ht(t,n=`/`){let r=e(t);return r!==`/`&&r.endsWith(`/`)?r.slice(0,-1):r}function Ut(e,t,n){let r=t?.[n];if(r)return _(r)?r:v(e,r)}function Wt(e,t){return Object.fromEntries(Object.entries(t).map(([t,n])=>[t,_(n)?y(e,n):n]))}function Gt(e,t){return e.filter(e=>!e.includes(`:`)&&!e.includes(`*`))}async function Kt(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 _e(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=Qe(u,A,M),F=ct({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,fe=N,z=N,ve=v(R,`client-hash.txt`),B=!1;try{S.existsSync(ve)&&S.existsSync(v(R,`dist`))&&(B=(await S.readFile(ve,`utf-8`)).trim()===N)}catch{}let V=v(M,`ssg-pages`),Se=v(M,`ssg-cache.json`),Ce=v(M,`ssg-output.json`),we=await Ae(Ce),De=we!==void 0&&we.auxiliaryFiles.length===0;B&&(ke(we,Ne(v(R,`dist`)),O)||(B=!1));let U=[],Le=!1,W=(t.dirStyle||n.ssgOptions?.dirStyle)??`flat`;if(B&&De&&W!==`nested`){let e=v(M,`routes-cache.json`);try{if(S.existsSync(e)&&S.existsSync(Se)){let t=JSON.parse(S.readFileSync(e,`utf-8`)),n=Pe(JSON.parse(S.readFileSync(Se,`utf-8`)),t.paths);if(t.dirStyle===W&&t.base===m){let e=t.paths.every(e=>{let r=H(e),i=n[r];return it({routePath:e,cacheItem:i,sourceContentHash:rt(T[r]||T[e]||Ut(u,t.sourceFiles,r)||Ut(u,t.sourceFiles,e),z),ssgPagesDir:V,requireAssetHash:!0})});t.paths.length>0&&e&&(U=t.paths,Le=!0)}}}catch{}}if(Le){let e=performance.now(),t={};try{S.existsSync(Se)&&(t=Pe(JSON.parse(S.readFileSync(Se,`utf-8`)),U))}catch{}let r=[...Me(U,t,W===`nested`?`nested`:`flat`),`static-loader-data-manifest-${I}.json`],i=Ne(v(R,`dist`)).filter(e=>e!==O),a=await Ae(Ce),o=a?.auxiliaryFiles.length===0&&Oe(a,N,j,i,r,[]),s={};if(!o){S.existsSync(j)&&await S.remove(j);let e=v(R,`dist`);await vt(n.publicDir,e),await S.copy(e,j);let r=[];for(let e of U){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=H(e),i=t[n];i?.loaderDataFilePath&&(r.push({source:a,destination:v(j,i.loaderDataFilePath)}),s[Ht(e,m)]=i.loaderDataFilePath)}}await Te(r),await Fe(v(j,`static-loader-data-manifest-${I}.json`),Lt(s))}await qt(V,t,U);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:`${U.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:U.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:`${U.length} pages / 0 new / ${U.length} cached`,metrics:{renderedCount:0,cachedCount:U.length,renderedSize:0,totalPages:U.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 Jt(j),await je(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:Be=`sync`,mock:Ue=!1,formatting:We=`none`,includedRoutes:Ge=Gt,onBeforePageRender:Ke,onPageRendered:qe,dirStyle:Je=`flat`,includeAllRoutes:Ye=!1,format:Xe=`esm`,concurrency:Ze=20,rootContainerId:$e=`root`,beastiesOptions:et={}}=ze,tt=et,G=ze.turbo??!1,nt=v(M,`ssr`),ot=v(M,`ssr-cache-index.json`);if(L=v(nt,G?`turbo-ssr`:I),!G&&B)try{let e=(await S.readJson(ot))[N];if(typeof e==`string`){let t=Ct(nt,e);t&&(L=t)}}catch{}let st=Dt(te(),wt),dt=()=>{};if(Ue){let{jsdomGlobal:e}=await import(`./jsdomGlobal-RTx-0uYL.mjs`);dt=e()}let K={};try{if(S.existsSync(Se)){let e=await S.readJson(Se);K=Pe(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=H(e),r=K[n];return it({routePath:e,cacheItem:r,sourceContentHash:rt(T[n]||T[e]||Ut(u,t.sourceFiles,n)||Ut(u,t.sourceFiles,e),z),ssgPagesDir:V,requireAssetHash:!0})})&&(U=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(),[ht,gt]=await Promise.all([xt({viteConfig:n,resolvedMode:Re.mode,root:u,htmlEntry:O,outDir:j,clientCacheDir:R,finalCacheDir:M,docsDirName:A,initialClientHash:N,canBypassClientBuild:B,customLogger:st,onStep:w,shouldSuppressLog:wt},()=>Qe(u,A,M)),St({viteConfig:n,resolvedMode:Re.mode,entry:k,ssrEntry:ft,ssgOut:L,format:Xe,canSkipSsrImport:q,serverBuildSkipped:pt,customLogger:st,onStep:w,shouldSuppressLog:wt})]);if(d=ht.outDir,de=ht.resolvedClientCacheDir,fe=ht.resolvedClientHash,z=ht.pageContentFallbackHash,I=fe.substring(0,12),x=ht.durationMs,ee=gt.durationMs,!G)try{let e={};try{e=await S.readJson(ot)}catch{}e[fe]=y(nt,L),await Ie(ot,e)}catch{}let _t=Xe===`esm`&&process.platform===`win32`?`file://`:``,yt=Xe===`esm`?`.mjs`:`.cjs`;ft.replace(/\0/g,``).replace(`virtual:`,``).replace(/[^a-zA-Z0-9-]/g,`_`);let bt=`combined`+yt;try{if(S.existsSync(L)){let e=S.readdirSync(L).filter(e=>e.endsWith(yt));e.length>0&&(bt=e[0])}}catch{}let Tt=_t+v(L,bt).replace(/\\/g,`/`),Ot=bt.replace(/\.[^/.]+$/,``),kt=JSON.parse(await S.readFile(v(L,...It,`manifest.json`),`utf-8`)),Mt=null,Nt=null,J=[],Pt,Y=`/`,zt,Bt=null,Kt,Zt=Ge;if(!q){let e=a===void 0?l(import.meta.url):a,t=performance.now(),n=Xe===`esm`?await import(Tt):e(Tt);ne=performance.now()-t,Pt=n.matchRouteBranchWithParams;let{createRoot:r,includedRoutes:i}=n;Zt=i||Ge,Mt=await r(!1);let s=Mt;if(J=s.routes,Y=s.base,zt=s.triggerOnSSRAppRendered,Bt=s.app,Kt=s.routerType,J&&J.length>0)for(let e of J)e.path&&(e.filePath||e.entry)&&!T[e.path]&&(T[e.path]=e.filePath||e.entry);F=ut(F,lt(u,J,T)),Nt=o(s,n)}let Qt=``,$t=0,X=null,en=null,tn=null,nn=!1;async function rn(){if(tn){await tn;return}let e=en;e&&(tn=e.destroy(),await tn)}if(!q){let e=performance.now(),{paths:t}=await be(J);U=Ye?t:await Zt(t,J||[]),U=Gt(U,J||[]),U=Array.from(new Set(U)),$t+=performance.now()-e;try{await Ie(v(M,`routes-cache.json`),{paths:U,dirStyle:Je,base:m,sourceFiles:Wt(u,T)},0)}catch{}Qt=v(L,Ot+yt)}async function an(){if(X||nn||U.length<=4)return;nn=!0;let e=performance.now();try{Qt=v(L,Ot+yt);let{SsgWorkerPool:t}=await import(`./ssg-worker-pool-DxzleN_R.mjs`);X=new t({ssrEntryPath:Qt,format:Xe===`esm`?`esm`:`cjs`}),en=X,await X.ready(),Un=performance.now()-e}catch{Un=performance.now()-e,X=null}}let on=ze.criticalCss??`zig-critters`,sn,cn;on===`zig-critters`?(sn=await oe({concurrency:Math.max(1,Math.min(Ze,p.cpus().length,8))}),sn||f("[zig-critters] WASM unavailable; critical CSS disabled for this build. Set `criticalCss: 'beasties'` to enable JS-based critical CSS.")):on===`beasties`&&tt!==!1&&(cn=await ae(d,{publicPath:m,...tt}));let ln=``,un=``;if(sn){let e=v(j,`assets`);if(S.existsSync(e)){let t=S.readdirSync(e).filter(e=>e.endsWith(`.css`));for(let n of t)ln+=S.readFileSync(v(e,n),`utf-8`)+`
|
|
3
|
+
`}ln&&(un=E.createHash(`sha256`).update(ln).digest())}let dn={},fn={},pn={},mn=null;if(q)for(let e of U){let t=H(e);pn[e]=K[t]?.assetHash||N}else{let[e,t]=await Promise.all([S.readFile(v(j,...It,`ssr-manifest.json`),`utf-8`),S.readFile(v(j,...It,`manifest.json`),`utf-8`)]);dn=JSON.parse(e),fn=JSON.parse(t),mn=ue(fn);let n=await Vt(j,fn,M);await Promise.all(Object.entries(T).map(async([e,t])=>{pn[e]=await pe({outDir:j,indexes:mn,ssrManifest:dn,routeSourceFile:t,root:u,clientHash:N,assetHashes:n})}));for(let e of U)pn[e]||(pn[e]=z)}let Z=await S.readFile(v(j,O),`utf-8`);S.rmSync(v(j,O)),Z=Yt(Z,Be);let hn=Ke?null:he({rootContainerId:$e,indexHTML:Z}),gn=(await import(`p-queue`)).default||await import(`p-queue`),_n=new gn({concurrency:Ze}),vn=new gn({concurrency:Math.min(p.cpus().length,4)}),yn=new gn({concurrency:Math.max(2,Math.min(p.cpus().length,6))}),bn={},xn=0,Sn=new Map,Cn=new Set;for(let t of U){let n=T[e(t).replace(/\/$/,``)]||T[t];n&&Cn.add(n)}for(let e of Cn)try{if(S.existsSync(e)){let t=S.statSync(e);Sn.set(e,{hash:`${t.mtimeMs}:${t.size}`,mtimeMs:t.mtimeMs})}}catch{}let wn=null;!q&&Pt&&(wn=P({routes:[...J],base:Y,matchRouteBranchWithParams:Pt,serverManifest:kt,manifest:fn,ssrManifest:dn}));let Tn=At({routes:U,outDir:j,ssgPagesDir:V,dirStyle:Je,contextBase:Y,fallbackHash:z,routeToSourceFileMap:T,sourceMeta:Sn,routeToAssetHash:pn}),En=new le,Dn=[],On=[],kn=[],An=[],jn=0,Mn=0,Nn=0,Pn=0,Fn=0,In=0,Ln=0,Rn=0,zn=0,Bn=0,Vn=0,Q={count:0,matchMs:0,resolveMs:0,loadersMs:0,renderMs:0,helmetMs:0,totalMs:0};function Hn(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 Un=0,Wn=!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 Gn=0,Kn=0,qn=0,Jn=new Set,Yn=new Set,Xn=[],Zn=Ee({writeFile:async(e,t)=>{await S.ensureDir(g(e)),await S.writeFile(e,t,`utf-8`)}}),Qn=JSON.stringify(K),$n=Pe(K,U),er=new Map,tr=new Set;tr.add(V);for(let e of U){let t=Je===`nested`?v(e.replace(/^\//g,``),`index.html`):`${(e.endsWith(`/`)?`${e}index`:e).replace(/^\//g,``)}.html`;tr.add(v(j,g(t)));let n=e===`/`?`/index`:e.endsWith(`/`)?`${e}index`:e;tr.add(v(j,`static-loader-data`,g(n)))}tr.add(v(j,`static-loader-data`)),await Promise.all([...tr].map(e=>S.ensureDir(e)));async function nr(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(!wn)throw Error(`The SSR entry must expose matchRouteBranchWithParams for asset collection`);let e=performance.now();w=new Set(await(er.get(b)||wn(re))),jn+=performance.now()-e}else w=new Set;let T;if(s&&Object.keys(s).length>0){let e=Rt(b,I);T=e,G&&await S.writeFile(v(j,e),JSON.stringify(s)),bn[Ht(b,m)]=e,xn++}await p?.(b,t,l);let E=performance.now(),D=hn&&_===Z?hn({appHTML:t,metaAttributes:n,bodyAttributes:r,htmlAttributes:i,initialState:null}):await ge({rootContainerId:$e,appHTML:t,indexHTML:_,metaAttributes:n,bodyAttributes:r,htmlAttributes:i,initialState:null});Nn+=performance.now()-E;let O=h?``:ye(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;Pn+=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__ = { '${Ht(b,m)}': ${e} };`}let N=c(o),P=ie,ae=`<script>window.__VITE_REACT_SSG_HASH__ = '${I}';${M}${N}<\/script>`,F=performance.now();if(P=P.replace(`<script>${me}<\/script>`,``),sn){if(ln){let e=se(P,un,ln,`zig-critters`);try{let t=await En.getOrCreate(e,async()=>{let{criticalCss:e,stats:t}=await sn.extractCriticalCss(P,ln);return e?`<style data-zig-critters>${e}</style>`:(t.truncated&&f(`[zig-critters] Critical CSS for "${b}" exceeded maxSize (${t.originalSize} bytes) and was skipped.`),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(cn){let e=se(P,un,ln,`beasties`),t=await En.getOrCreate(e,async()=>{let e=await vn.add(()=>cn.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 oe=ae+(a||``);oe&&(P=P.replace(`<head>`,`<head>${oe}`));let le=We===`none`?P:await Xt(P,We);kn.push(Math.round(performance.now()-F));let L=performance.now();G?s&&Object.keys(s).length>0&&T&&await Zn.enqueue(v(j,T),JSON.stringify(s)):(await Zn.enqueue(x,le),s&&Object.keys(s).length>0&&T?(await Zn.enqueue(ee,JSON.stringify(s)),$n[te]={contentHash:ne,mtime:C?Math.round(C):0,loaderDataFilePath:T,assetHash:e.routeAssetHash}):$n[te]={contentHash:ne,mtime:C?Math.round(C):0,assetHash:e.routeAssetHash});let R=performance.now()-L;An.push(Math.round(R)),On.push(Math.round(performance.now()-y)),Gn++,Rn++,qn+=le.length}let rr=performance.now(),ir=[];await Ft({routes:U,canBypassClientBuild:B,getPlan:e=>jt(Tn,e),isCached:e=>{if(G||!B)return!1;try{return it({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=!Jn.has(e.finalOutFile),i=!!n&&!Yn.has(n);r&&Jn.add(e.finalOutFile),i&&n&&Yn.add(n);let a=performance.now();try{r&&Xn.push({source:e.cachedHtmlFile,destination:e.finalOutFile}),n&&t&&S.existsSync(e.cachedLoaderFile)&&(i&&Xn.push({source:e.cachedLoaderFile,destination:n}),bn[Ht(e.path,m)]=t,xn++),Kn++,zn++,Fn+=performance.now()-a}catch(t){throw r&&Jn.delete(e.finalOutFile),i&&n&&Yn.delete(n),Error(`Error on cached page: ${e.path}\n${t.stack}`)}},prepareRoute:e=>{!Bt&&Kt===`remix`&&wn&&er.set(e.path,wn(e.fetchUrl))},ensurePool:an,getPool:()=>X,getWorkerCount:()=>at(X)?.totalWorkers??0,onWorkerFailure:async(e,t,n,r)=>{if(!Nt)throw Error(`Error on page: ${e}\n${String(n)}`);f(`[ssg-worker] Retrying ${e} on the main thread after worker failure`),Wn=!0;try{await rn()}catch{}X=null,nn=!0;let i=await Nt.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)=>{In+=Math.max(0,r-(n.timings?.totalMs??0)),Ln++,n.timings&&(Dn.push(Math.round(n.timings.totalMs)),Hn(n.timings));let i={...Mt,routePath:e},a=performance.now(),o=await Ke?.(e,Z,i)||Z;Mn+=performance.now()-a;let s=n.routerContext?.loaderData?n.routerContext.loaderData:null;await yn.add(()=>nr(t,n.appHTML,n.metaAttributes,n.bodyAttributes,n.htmlAttributes,n.styleTag,n.routerContext,s,i,Y,J,zt,Bt,Kt??`remix`,o))},scheduleMainThread:(e,t)=>{ir.push(_n.add(async()=>{try{let n={...Mt,routePath:e},r=performance.now(),i=await Ke?.(e,Z,n)||Z;Mn+=performance.now()-r;let a=performance.now(),{appHTML:o,bodyAttributes:c,htmlAttributes:l,metaAttributes:u,styleTag:d,routerContext:f,timings:p}=await Nt.render(e);Dn.push(Math.round(performance.now()-a)),Hn(p);let m=f?.loaderData;await nr(t,o,u,c,l,d,s(f),m||null,n,Y,J,zt,Bt,Kt??`remix`,i)}catch(t){throw Error(`Error on page: ${e}\n${t.stack}`)}}))},drainFinalizers:()=>yn.onIdle(),drainMainThread:async()=>{await Promise.all(ir),await _n.onIdle()},drainWrites:()=>Zn.flush(),cleanupAfterFailure:async()=>{try{S.existsSync(j)&&await S.remove(j)}catch{}},destroyPool:rn,onNoRenderer:e=>{f(`[ssg] No SSR context available for ${e}, skipping`)}}),Vn+=performance.now()-rr;let ar=performance.now();for(let e of U){if(G)continue;let t=Tn.get(e);if(!t||!S.existsSync(t.cachedHtmlFile))continue;Jn.has(t.finalOutFile)||Xn.push({source:t.cachedHtmlFile,destination:t.finalOutFile});let n=$n[t.normalizedKey];if(!n?.loaderDataFilePath||!S.existsSync(t.cachedLoaderFile))continue;let r=v(j,n.loaderDataFilePath);Yn.has(r)||Xn.push({source:t.cachedLoaderFile,destination:r})}await Te(Xn);let or=Math.round(performance.now()-ar);Bn+=or;let sr=Gn+Kn,cr=(qn/1024/1024).toFixed(2),lr=0;if(!G)try{let e=JSON.stringify($n)!==Qn;e&&await Ie(Se,$n),lr=await qt(V,$n,U,e)}catch{}let ur=performance.now()-mt,dr=at(en),fr={renderedCount:Gn,cachedCount:Kn,renderedSize:qn,totalPages:sr,prunedCount:lr,clientBuildMs:Math.round(x),serverBuildMs:Math.round(ee),ssrImportMs:Math.round(ne),workerPoolSetupMs:Math.round(Un),workerUsed:dr!==null&&!Wn,workerCount:dr?.totalWorkers??0,fallbackMainThread:Wn,ssrP50Ms:$(Dn,50),ssrP95Ms:$(Dn,95),ssrP99Ms:$(Dn,99),crittersP50Ms:$(kn,50),crittersP95Ms:$(kn,95),writeP50Ms:$(An,50),writeP95Ms:$(An,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:sr>0&&ur>0?Math.round(sr/(ur/1e3)*10)/10:0,pipeline:{renderedPageCount:Rn,cachedPageCount:zn,clientBuildMs:Math.round(x),serverBuildMs:Math.round(ee),ssrImportMs:Math.round(ne),workerPoolSetupMs:Math.round(Un),routePreparationMs:Math.round($t),workerTransportMs:Math.round(In),workerRoundTripMs:Math.round(In),workerTransportAvgMs:Ln>0?Math.round(In/Ln):0,finalizeP50Ms:$(On,50),finalizeP95Ms:$(On,95),assetCollectionMs:Math.round(jn),beforeHookMs:Math.round(Mn),htmlAssemblyMs:Math.round(Nn),onPageRenderedHookMs:Math.round(Pn),criticalCssP50Ms:$(kn,50),criticalCssP95Ms:$(kn,95),cacheWriteMs:Math.round(0+Zn.writeTimeMs()),cachedOutputMs:Math.round(Fn),renderQueueDrainMs:Math.round(Vn),renderPipelineSettleMs:Math.round(Vn),outputLinkMs:Math.round(Bn)}};w?.({name:`Render pages`,duration:ur,success:!0,details:`${sr} pages (${Gn} new, ${Kn} cached, ${cr} MB)`,metrics:fr}),process.env.BOLTDOCS_BENCHMARK_PHASES===`true`&&console.log(`[boltdocs] ${JSON.stringify({name:`Render pages`,duration:Math.round(ur),success:!0,details:`${sr} pages / ${Gn} new / ${Kn} cached / ${cr} MB`,metrics:fr})}`);let pr=performance.now(),mr=Lt(bn);if(await Fe(v(j,`static-loader-data-manifest-${I}.json`),mr),await Et(v(M,`ssr`),5,G?`turbo-ssr`:h(L)),dt(),sn?.dispose)try{await sn.dispose()}catch{}let hr=Re.plugins.find(e=>e.name===`vite-plugin-pwa`)?.api;hr&&!hr.disabled&&hr.generateSW&&await hr.generateSW();let gr=Math.round(performance.now()-b);w?.({name:`Static loader data`,duration:performance.now()-pr,success:!0,details:`${xn} loader data files`,metrics:{loaderDataFileCount:xn}}),await C?.(d),await Jt(j);let _r=Ne(j),vr=await Ve(j,gr,M,{outputFiles:_r,manifestPath:v(de,`dist`,...It,`manifest.json`)});He(j,vr),w?.({name:`Build metrics`,duration:0,success:!0,details:`Build time: ${(gr/1e3).toFixed(1)}s, JS: ${(vr.totalJSBundleSize/1024).toFixed(0)} kB, CSS: ${(vr.totalCSSBundleSize/1024).toFixed(0)} kB`,metrics:{buildTime:gr,totalPages:vr.pages.length,jsSize:vr.totalJSBundleSize,cssSize:vr.totalCSSBundleSize}}),await je(v(M,`ssg-output.json`),fe,j,Me(U,$n,Je).concat(`static-loader-data-manifest-${I}.json`),ht.clientFiles,_r)}async function qt(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 Jt(e){try{It.length>0?await S.remove(v(e,...It)):await Promise.all([S.remove(v(e,`manifest.json`)),S.remove(v(e,`ssr-manifest.json`))])}catch{}}function Yt(e,t){return!t||t===`sync`?e:e.replace(/<script type="module" /g,`<script type="module" ${t} `)}async function Xt(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 Zt(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 Qt({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=>ve(n(l.config.base,e)));re.push(...A);let ie=await ge({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(Zt),()=>{l.middlewares.use(u)}}}}async function $t(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 _e(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 _e(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??[],Qt({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 X(e={},t={},n){globalThis.__ssr_start_time=performance.now();try{let r=await $t(t,e);return await r.listen(),en(r,!!n),r.bindCLIShortcuts({print:!0}),r}catch(e){d(`failed to start server: ${e?.message??e}`),process.exit(1)}}function en(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${V} `)}`,{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 tn=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{tn as ShellStitcher,Kt as build,$t as createServer,X 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 };
|