@bdocs/ssg 0.0.1 → 0.0.2

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.
@@ -1,2 +1,2 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},s=(n,r,a)=>(a=n==null?{}:e(i(n)),o(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));let c=require(`react-helmet-async`);c=s(c);let l=require(`react/jsx-runtime`),u=require(`react-dom`);u=s(u,1);let d=require(`react`);d=s(d,1);const f={...u},{version:p,render:m,hydrate:h}=f,g=Number((p||``).split(`.`)[0])>17,_=Number((p||``).split(`.`)[0])>18;function v(e,t,n={}){let{useLegacyRender:r}=n;if(r||!g)m(e,t);else if(_)import(`react-dom/client`).then(({default:{createRoot:n}})=>{let r=n(t);d.startTransition(()=>{r.render(e)})});else{f.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.usingClientEntryPoint=!0;let{createRoot:n}=f;if(!n)throw Error(`createRoot not found`);let r=n(t);f.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.usingClientEntryPoint=!1,d.startTransition(()=>{r.render(e)})}}function y(e,t,n={}){let{useLegacyRender:r}=n;if(r||!g)h(e,t);else if(_)import(`react-dom/client`).then(({default:{hydrateRoot:n}})=>{d.startTransition(()=>{n(t,e)})});else{f.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.usingClientEntryPoint=!0;let{hydrateRoot:n}=f;if(!n)throw Error(`hydrateRoot not found`);d.startTransition(()=>{n(t,e),f.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.usingClientEntryPoint=!1})}}function b(e){return document.readyState===`loading`?new Promise(t=>{document.addEventListener(`DOMContentLoaded`,()=>t(e))}):Promise.resolve(e)}function x(e){try{return JSON.parse(e||`{}`)}catch(t){return console.error(`[SSG] On state deserialization -`,t,e),{}}}function S(){let[e,t]=(0,d.useState)(!1);return(0,d.useEffect)(()=>{t(!0)},[]),e}function C({children:e,fallback:t}){if(S()){if(typeof e!=`function`&&process.env.NODE_ENV===`development`)throw Error(`vite-react-ssg error: The children of <ClientOnly> must be a "render function", e.g. <ClientOnly>{() => <span>{window.location.href}</span>}</ClientOnly>.
2
- Current type: ${(0,d.isValidElement)(e)?`React element`:typeof e}`);return(0,l.jsx)(l.Fragment,{children:e?.()})}return t??null}function w(e){return(0,l.jsx)(c.Helmet,{...e})}const{HelmetProvider:T}=c;function E(e,t,n={}){let{transformState:r,rootContainer:i=`#root`,ssrWhenDev:a,getStyleCollector:o=null}=n;process.env.NODE_ENV===`development`&&a!==void 0&&console.warn("[vite-react-ssg] `ssrWhenDev` option is no longer needed. If you want to use csr, just replace `vite-react-ssg dev` with `vite`.");let s=typeof window<`u`;async function c(n=!1,i){let a=[],c={isClient:s,onSSRAppRendered:n?()=>{}:e=>a.push(e),triggerOnSSRAppRendered:()=>Promise.all(a.map(e=>e())),initialState:{},transformState:r,routePath:i,getStyleCollector:o,routes:void 0,routerOptions:void 0,base:`/`,app:e,routerType:`single-page`};n&&(await b(),c.initialState=r?.(window.__INITIAL_STATE__||{})||x(window.__INITIAL_STATE__)),await t?.(c);let l=c.initialState;return{...c,initialState:l}}return s&&(async()=>{let t=typeof i==`string`?document.querySelector(i):i;if(!t){typeof $jsdom>`u`&&console.warn(`[vite-react-ssg] Root container not found.`);return}let r=await c(!0);window.__VITE_REACT_SSG_CONTEXT__=r;let a=(0,l.jsx)(T,{children:e});document.querySelector(`[data-server-rendered=true]`)===null&&process.env.NODE_ENV===`development`?v(a,t,n):y(a,t,n)})(),c}exports.ClientOnly=C,exports.Head=w,exports.ViteReactSSG=E;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},s=(n,r,a)=>(a=n==null?{}:e(i(n)),o(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));let c=require(`react-helmet-async`);c=s(c);let l=require(`react/jsx-runtime`),u=require(`react-dom`);u=s(u,1);let d=require(`react`);const f={...u},{version:p,render:m,hydrate:h}=f,g=Number((p||``).split(`.`)[0])>17,_=Number((p||``).split(`.`)[0])>18;function v(e,t,n={}){let{useLegacyRender:r}=n;if(r||!g)m(e,t);else if(_)import(`react-dom/client`).then(({createRoot:n})=>{n(t).render(e)});else{f.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.usingClientEntryPoint=!0;let{createRoot:n}=f;if(!n)throw Error(`createRoot not found`);let r=n(t);f.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.usingClientEntryPoint=!1,r.render(e)}}function y(e,t,n={}){let{useLegacyRender:r}=n;if(r||!g)h(e,t);else if(_)import(`react-dom/client`).then(({hydrateRoot:n})=>{n(t,e)});else{f.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.usingClientEntryPoint=!0;let{hydrateRoot:n}=f;if(!n)throw Error(`hydrateRoot not found`);n(t,e),f.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.usingClientEntryPoint=!1}}function b(e){return document.readyState===`loading`?new Promise(t=>{document.addEventListener(`DOMContentLoaded`,()=>t(e))}):Promise.resolve(e)}function x(e){try{return JSON.parse(e||`{}`)}catch(t){return console.error(`[SSG] On state deserialization -`,t,e),{}}}function S(){let[e,t]=(0,d.useState)(!1);return(0,d.useEffect)(()=>{t(!0)},[]),e}function C({children:e,fallback:t}){if(S()){if(typeof e!=`function`&&process.env.NODE_ENV===`development`)throw Error(`vite-react-ssg error: The children of <ClientOnly> must be a "render function", e.g. <ClientOnly>{() => <span>{window.location.href}</span>}</ClientOnly>.
2
+ Current type: ${(0,d.isValidElement)(e)?`React element`:typeof e}`);return(0,l.jsx)(l.Fragment,{children:e?.()})}return t??null}const w=c,T=w.Helmet||w.default?.Helmet||(()=>null);function E(e){return(0,l.jsx)(T,{...e})}const{HelmetProvider:D}=c;function O(e,t,n={}){let{transformState:r,rootContainer:i=`#root`,ssrWhenDev:a,getStyleCollector:o=null}=n;process.env.NODE_ENV===`development`&&a!==void 0&&console.warn("[vite-react-ssg] `ssrWhenDev` option is no longer needed. If you want to use csr, just replace `vite-react-ssg dev` with `vite`.");let s=typeof window<`u`;async function c(n=!1,i){let a=[],c={isClient:s,onSSRAppRendered:n?()=>{}:e=>a.push(e),triggerOnSSRAppRendered:()=>Promise.all(a.map(e=>e())),initialState:{},transformState:r,routePath:i,getStyleCollector:o,routes:void 0,routerOptions:void 0,base:`/`,app:e,routerType:`single-page`};n&&(await b(),c.initialState=r?.(window.__INITIAL_STATE__||{})||x(window.__INITIAL_STATE__)),await t?.(c);let l=c.initialState;return{...c,initialState:l}}return s&&(async()=>{let t=typeof i==`string`?document.querySelector(i):i;if(!t){typeof $jsdom>`u`&&console.warn(`[vite-react-ssg] Root container not found.`);return}let r=await c(!0);window.__VITE_REACT_SSG_CONTEXT__=r;let a=(0,l.jsx)(D,{children:e});document.querySelector(`[data-server-rendered=true]`)===null&&process.env.NODE_ENV===`development`?v(a,t,n):y(a,t,n)})(),c}exports.ClientOnly=C,exports.Head=E,exports.ViteReactSSG=O;
@@ -5,25 +5,6 @@ import { HelmetProps } from "react-helmet-async";
5
5
 
6
6
  //#region src/types.d.ts
7
7
  type Router = ReturnType<typeof createBrowserRouter>;
8
- interface CrittersOptions {
9
- path?: string;
10
- publicPath?: string;
11
- external?: boolean;
12
- inlineThreshold?: number;
13
- minimumExternalSize?: number;
14
- pruneSource?: boolean;
15
- mergeStylesheets?: boolean;
16
- additionalStylesheets?: string[];
17
- preload?: 'body' | 'media' | 'swap' | 'js' | 'js-lazy';
18
- noscriptFallback?: boolean;
19
- inlineFonts?: boolean;
20
- preloadFonts?: boolean;
21
- fonts?: boolean;
22
- keyframes?: string;
23
- compress?: boolean;
24
- logLevel?: 'info' | 'warn' | 'error' | 'trace' | 'debug' | 'silent';
25
- reduceInlineStyles?: boolean;
26
- }
27
8
  interface ViteReactSSGOptions<Context = ViteReactSSGContext> {
28
9
  /**
29
10
  * Set the scripts' loading mode. Only works for `type="module"`.
@@ -83,13 +64,6 @@ interface ViteReactSSGOptions<Context = ViteReactSSGContext> {
83
64
  * @default false
84
65
  */
85
66
  includeAllRoutes?: boolean;
86
- /**
87
- * Options for the critters packages.
88
- *
89
- * @deprecated Use `beastiesOptions` instead.
90
- * @see https://github.com/GoogleChromeLabs/critters
91
- */
92
- crittersOptions?: CrittersOptions | false;
93
67
  /**
94
68
  * Options for the beasties package.
95
69
  *
@@ -136,6 +110,14 @@ interface ViteReactSSGOptions<Context = ViteReactSSGContext> {
136
110
  * @default 20
137
111
  */
138
112
  concurrency?: number;
113
+ /**
114
+ * A mapping of route paths to their corresponding source file paths.
115
+ */
116
+ routeToSourceFileMap?: Record<string, string>;
117
+ /**
118
+ * The directory where SSG build cache is stored.
119
+ */
120
+ cacheDir?: string;
139
121
  }
140
122
  interface ViteReactSSGContext<HasRouter extends boolean = true> {
141
123
  router?: HasRouter extends true ? Router : undefined;
@@ -238,4 +220,4 @@ declare function Head(props: Props): React.ReactNode;
238
220
  //#region src/client/single-page.d.ts
239
221
  declare function ViteReactSSG(App: ReactNode, fn?: (context: ViteReactSSGContext<false>) => Promise<void> | void, options?: ViteReactSSGClientOptions): (client?: boolean, routePath?: string) => Promise<ViteReactSSGContext<false>>;
240
222
  //#endregion
241
- export { ClientOnly, CrittersOptions, Head, IndexRouteRecord, NonIndexRouteRecord, RouteRecord, RouterFutureConfig, RouterOptions, StyleCollector, ViteReactSSG, ViteReactSSGClientOptions, ViteReactSSGContext, ViteReactSSGOptions };
223
+ export { ClientOnly, Head, IndexRouteRecord, NonIndexRouteRecord, RouteRecord, RouterFutureConfig, RouterOptions, StyleCollector, ViteReactSSG, ViteReactSSGClientOptions, ViteReactSSGContext, ViteReactSSGOptions };
@@ -5,25 +5,6 @@ import { FutureConfig, IndexRouteObject, NonIndexRouteObject, createBrowserRoute
5
5
 
6
6
  //#region src/types.d.ts
7
7
  type Router = ReturnType<typeof createBrowserRouter>;
8
- interface CrittersOptions {
9
- path?: string;
10
- publicPath?: string;
11
- external?: boolean;
12
- inlineThreshold?: number;
13
- minimumExternalSize?: number;
14
- pruneSource?: boolean;
15
- mergeStylesheets?: boolean;
16
- additionalStylesheets?: string[];
17
- preload?: 'body' | 'media' | 'swap' | 'js' | 'js-lazy';
18
- noscriptFallback?: boolean;
19
- inlineFonts?: boolean;
20
- preloadFonts?: boolean;
21
- fonts?: boolean;
22
- keyframes?: string;
23
- compress?: boolean;
24
- logLevel?: 'info' | 'warn' | 'error' | 'trace' | 'debug' | 'silent';
25
- reduceInlineStyles?: boolean;
26
- }
27
8
  interface ViteReactSSGOptions<Context = ViteReactSSGContext> {
28
9
  /**
29
10
  * Set the scripts' loading mode. Only works for `type="module"`.
@@ -83,13 +64,6 @@ interface ViteReactSSGOptions<Context = ViteReactSSGContext> {
83
64
  * @default false
84
65
  */
85
66
  includeAllRoutes?: boolean;
86
- /**
87
- * Options for the critters packages.
88
- *
89
- * @deprecated Use `beastiesOptions` instead.
90
- * @see https://github.com/GoogleChromeLabs/critters
91
- */
92
- crittersOptions?: CrittersOptions | false;
93
67
  /**
94
68
  * Options for the beasties package.
95
69
  *
@@ -136,6 +110,14 @@ interface ViteReactSSGOptions<Context = ViteReactSSGContext> {
136
110
  * @default 20
137
111
  */
138
112
  concurrency?: number;
113
+ /**
114
+ * A mapping of route paths to their corresponding source file paths.
115
+ */
116
+ routeToSourceFileMap?: Record<string, string>;
117
+ /**
118
+ * The directory where SSG build cache is stored.
119
+ */
120
+ cacheDir?: string;
139
121
  }
140
122
  interface ViteReactSSGContext<HasRouter extends boolean = true> {
141
123
  router?: HasRouter extends true ? Router : undefined;
@@ -238,4 +220,4 @@ declare function Head(props: Props): React.ReactNode;
238
220
  //#region src/client/single-page.d.ts
239
221
  declare function ViteReactSSG(App: ReactNode, fn?: (context: ViteReactSSGContext<false>) => Promise<void> | void, options?: ViteReactSSGClientOptions): (client?: boolean, routePath?: string) => Promise<ViteReactSSGContext<false>>;
240
222
  //#endregion
241
- export { ClientOnly, CrittersOptions, Head, IndexRouteRecord, NonIndexRouteRecord, RouteRecord, RouterFutureConfig, RouterOptions, StyleCollector, ViteReactSSG, ViteReactSSGClientOptions, ViteReactSSGContext, ViteReactSSGOptions };
223
+ export { ClientOnly, Head, IndexRouteRecord, NonIndexRouteRecord, RouteRecord, RouterFutureConfig, RouterOptions, StyleCollector, ViteReactSSG, ViteReactSSGClientOptions, ViteReactSSGContext, ViteReactSSGOptions };
@@ -1 +1 @@
1
- import*as e from"react-helmet-async";import{Helmet as t}from"react-helmet-async";import{Fragment as n,jsx as r}from"react/jsx-runtime";import*as i from"react-dom";import*as a from"react";import{useEffect as o,useState as s}from"react";const c={...i},{version:l,render:u,hydrate:d}=c,f=Number((l||``).split(`.`)[0])>17,p=Number((l||``).split(`.`)[0])>18;function m(e,t,n={}){let{useLegacyRender:r}=n;if(r||!f)d(e,t);else if(p)import(`react-dom/client`).then(({default:{hydrateRoot:n}})=>{a.startTransition(()=>{n(t,e)})});else{c.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.usingClientEntryPoint=!0;let{hydrateRoot:n}=c;if(!n)throw Error(`hydrateRoot not found`);a.startTransition(()=>{n(t,e),c.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.usingClientEntryPoint=!1})}}function h(e){return document.readyState===`loading`?new Promise(t=>{document.addEventListener(`DOMContentLoaded`,()=>t(e))}):Promise.resolve(e)}function g(e){try{return JSON.parse(e||`{}`)}catch(t){return console.error(`[SSG] On state deserialization -`,t,e),{}}}function _(){let[e,t]=s(!1);return o(()=>{t(!0)},[]),e}function v({children:e,fallback:t}){return _()?r(n,{children:e?.()}):t??null}function y(e){return r(t,{...e})}const{HelmetProvider:b}=e;function x(e,t,n={}){let{transformState:i,rootContainer:a=`#root`,ssrWhenDev:o,getStyleCollector:s=null}=n,c=typeof window<`u`;async function l(n=!1,r){let a=[],o={isClient:c,onSSRAppRendered:n?()=>{}:e=>a.push(e),triggerOnSSRAppRendered:()=>Promise.all(a.map(e=>e())),initialState:{},transformState:i,routePath:r,getStyleCollector:s,routes:void 0,routerOptions:void 0,base:`/`,app:e,routerType:`single-page`};n&&(await h(),o.initialState=i?.(window.__INITIAL_STATE__||{})||g(window.__INITIAL_STATE__)),await t?.(o);let l=o.initialState;return{...o,initialState:l}}return c&&(async()=>{let t=typeof a==`string`?document.querySelector(a):a;if(!t){typeof $jsdom>`u`&&console.warn(`[vite-react-ssg] Root container not found.`);return}let i=await l(!0);window.__VITE_REACT_SSG_CONTEXT__=i;let o=r(b,{children:e});document.querySelector(`[data-server-rendered=true]`),m(o,t,n)})(),l}export{v as ClientOnly,y as Head,x as ViteReactSSG};
1
+ import*as e from"react-helmet-async";import{Fragment as t,jsx as n}from"react/jsx-runtime";import*as r from"react-dom";import{useEffect as i,useState as a}from"react";const o={...r},{version:s,render:c,hydrate:l}=o,u=Number((s||``).split(`.`)[0])>17,d=Number((s||``).split(`.`)[0])>18;function f(e,t,n={}){let{useLegacyRender:r}=n;if(r||!u)l(e,t);else if(d)import(`react-dom/client`).then(({hydrateRoot:n})=>{n(t,e)});else{o.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.usingClientEntryPoint=!0;let{hydrateRoot:n}=o;if(!n)throw Error(`hydrateRoot not found`);n(t,e),o.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.usingClientEntryPoint=!1}}function p(e){return document.readyState===`loading`?new Promise(t=>{document.addEventListener(`DOMContentLoaded`,()=>t(e))}):Promise.resolve(e)}function m(e){try{return JSON.parse(e||`{}`)}catch(t){return console.error(`[SSG] On state deserialization -`,t,e),{}}}function h(){let[e,t]=a(!1);return i(()=>{t(!0)},[]),e}function g({children:e,fallback:r}){return h()?n(t,{children:e?.()}):r??null}const _=e,v=_.Helmet||_.default?.Helmet||(()=>null);function y(e){return n(v,{...e})}const{HelmetProvider:b}=e;function x(e,t,r={}){let{transformState:i,rootContainer:a=`#root`,ssrWhenDev:o,getStyleCollector:s=null}=r,c=typeof window<`u`;async function l(n=!1,r){let a=[],o={isClient:c,onSSRAppRendered:n?()=>{}:e=>a.push(e),triggerOnSSRAppRendered:()=>Promise.all(a.map(e=>e())),initialState:{},transformState:i,routePath:r,getStyleCollector:s,routes:void 0,routerOptions:void 0,base:`/`,app:e,routerType:`single-page`};n&&(await p(),o.initialState=i?.(window.__INITIAL_STATE__||{})||m(window.__INITIAL_STATE__)),await t?.(o);let l=o.initialState;return{...o,initialState:l}}return c&&(async()=>{let t=typeof a==`string`?document.querySelector(a):a;if(!t){typeof $jsdom>`u`&&console.warn(`[vite-react-ssg] Root container not found.`);return}let i=await l(!0);window.__VITE_REACT_SSG_CONTEXT__=i;let o=n(b,{children:e});document.querySelector(`[data-server-rendered=true]`),f(o,t,r)})(),l}export{g as ClientOnly,y as Head,x as ViteReactSSG};
package/dist/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./chunk-Bmb41Sf3.cjs`),t=require(`./state-OWuAHBHy.cjs`);let n=require(`react-helmet-async`);n=e.t(n);let r=require(`react/jsx-runtime`),i=require(`react-router-dom`),a=require(`react-dom`);a=e.t(a,1);let o=require(`react`);o=e.t(o,1);const s={...a},{version:c,render:l,hydrate:u}=s,d=Number((c||``).split(`.`)[0])>17,f=Number((c||``).split(`.`)[0])>18;function p(e,t,n={}){let{useLegacyRender:r}=n;if(r||!d)l(e,t);else if(f)import(`react-dom/client`).then(({default:{createRoot:n}})=>{let r=n(t);o.startTransition(()=>{r.render(e)})});else{s.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.usingClientEntryPoint=!0;let{createRoot:n}=s;if(!n)throw Error(`createRoot not found`);let r=n(t);s.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.usingClientEntryPoint=!1,o.startTransition(()=>{r.render(e)})}}function m(e,t,n={}){let{useLegacyRender:r}=n;if(r||!d)u(e,t);else if(f)import(`react-dom/client`).then(({default:{hydrateRoot:n}})=>{o.startTransition(()=>{n(t,e)})});else{s.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.usingClientEntryPoint=!0;let{hydrateRoot:n}=s;if(!n)throw Error(`hydrateRoot not found`);o.startTransition(()=>{n(t,e),s.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.usingClientEntryPoint=!1})}}function h(e){return document.readyState===`loading`?new Promise(t=>{document.addEventListener(`DOMContentLoaded`,()=>t(e))}):Promise.resolve(e)}function g(){let[e,t]=(0,o.useState)(!1);return(0,o.useEffect)(()=>{t(!0)},[]),e}function _({children:e,fallback:t}){if(g()){if(typeof e!=`function`&&process.env.NODE_ENV===`development`)throw Error(`vite-react-ssg error: The children of <ClientOnly> must be a "render function", e.g. <ClientOnly>{() => <span>{window.location.href}</span>}</ClientOnly>.
2
- Current type: ${(0,o.isValidElement)(e)?`React element`:typeof e}`);return(0,r.jsx)(r.Fragment,{children:e?.()})}return t??null}function v(e){return(0,r.jsx)(n.Helmet,{...e})}const{HelmetProvider:y}=n;function b(e,n,a={}){let{transformState:o,rootContainer:s=`#root`,ssrWhenDev:c,getStyleCollector:l=null}=a;process.env.NODE_ENV===`development`&&c!==void 0&&console.warn("[vite-react-ssg] `ssrWhenDev` option is no longer needed. If you want to use csr, just replace `vite-react-ssg dev` with `vite`.");let u=typeof window<`u`,d=e.basename??`/`,{v7_startTransition:f=!0,...g}=e.future??{};async function _(r=!1,a){let s=e.customCreateRouter??i.createBrowserRouter,c=r?s(t.r(e.routes,v),{future:g}):void 0,f=[],p=r?()=>{}:e=>f.push(e),m={isClient:u,routes:e.routes,router:c,routerOptions:e,onSSRAppRendered:p,triggerOnSSRAppRendered:()=>Promise.all(f.map(e=>e())),initialState:{},transformState:o,routePath:a,base:d,getStyleCollector:l,routerType:`remix`};r&&(await h(),m.initialState=o?.(window.__INITIAL_STATE__||{})||t.t(window.__INITIAL_STATE__)),await n?.(m);let _=m.initialState;return{...m,initialState:_}}return u&&(async()=>{let t=typeof s==`string`?document.querySelector(s):s;if(!t){typeof $jsdom>`u`&&console.warn(`[vite-react-ssg] Root container not found.`);return}let n=(0,i.matchRoutes)(e.routes,window.location)?.filter(e=>e.route.lazy);n&&n?.length>0&&await Promise.all(n.map(async e=>{let t=await e.route.lazy();Object.assign(e.route,{...t,lazy:void 0})}));let o=await _(!0);window.__VITE_REACT_SSG_CONTEXT__=o;let{router:c}=o,l=(0,r.jsx)(y,{children:(0,r.jsx)(i.RouterProvider,{router:c})});document.querySelector(`[data-server-rendered=true]`)===null&&process.env.NODE_ENV===`development`?p(l,t,a):m(l,t,a)})(),_;function v(e){return document.querySelector(`[data-server-rendered=true]`)===null||(e.loader=async({request:n})=>{if(process.env.NODE_ENV===`development`){let t=`_data=${encodeURIComponent(e.id)}`,r=n.url.includes(`?`)?`${n.url}&${t}`:`${n.url}?${t}`;return fetch(r)}else{if(!window.__VITE_REACT_SSG_STATIC_LOADER_MANIFEST__){let e=t.i(d,`static-loader-data-manifest-${window.__VITE_REACT_SSG_HASH__}.json`);window.__VITE_REACT_SSG_STATIC_LOADER_MANIFEST__=await(await fetch(t.s(e))).json()}let{url:r}=n,{pathname:i}=new URL(r),a=window.__VITE_REACT_SSG_STATIC_LOADER_MANIFEST__?.[i];if(!a)return null;if(window.__VITE_REACT_SSG_STATIC_LOADER_DATA__||(window.__VITE_REACT_SSG_STATIC_LOADER_DATA__={}),!window.__VITE_REACT_SSG_STATIC_LOADER_DATA__[i]){let e=t.i(d,a);window.__VITE_REACT_SSG_STATIC_LOADER_DATA__[i]=await(await fetch(t.s(e))).json()}return window.__VITE_REACT_SSG_STATIC_LOADER_DATA__[i]?.[e.id]??null}}),e}}exports.ClientOnly=_,exports.Head=v,exports.ViteReactSSG=b;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./chunk-Bmb41Sf3.cjs`),t=require(`./state-OWuAHBHy.cjs`);let n=require(`react-helmet-async`);n=e.t(n);let r=require(`react/jsx-runtime`),i=require(`react-router-dom`),a=require(`react-dom`);a=e.t(a,1);let o=require(`react`);const s={...a},{version:c,render:l,hydrate:u}=s,d=Number((c||``).split(`.`)[0])>17,f=Number((c||``).split(`.`)[0])>18;function p(e,t,n={}){let{useLegacyRender:r}=n;if(r||!d)l(e,t);else if(f)import(`react-dom/client`).then(({createRoot:n})=>{n(t).render(e)});else{s.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.usingClientEntryPoint=!0;let{createRoot:n}=s;if(!n)throw Error(`createRoot not found`);let r=n(t);s.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.usingClientEntryPoint=!1,r.render(e)}}function m(e,t,n={}){let{useLegacyRender:r}=n;if(r||!d)u(e,t);else if(f)import(`react-dom/client`).then(({hydrateRoot:n})=>{n(t,e)});else{s.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.usingClientEntryPoint=!0;let{hydrateRoot:n}=s;if(!n)throw Error(`hydrateRoot not found`);n(t,e),s.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.usingClientEntryPoint=!1}}function h(e){return document.readyState===`loading`?new Promise(t=>{document.addEventListener(`DOMContentLoaded`,()=>t(e))}):Promise.resolve(e)}function g(){let[e,t]=(0,o.useState)(!1);return(0,o.useEffect)(()=>{t(!0)},[]),e}function _({children:e,fallback:t}){if(g()){if(typeof e!=`function`&&process.env.NODE_ENV===`development`)throw Error(`vite-react-ssg error: The children of <ClientOnly> must be a "render function", e.g. <ClientOnly>{() => <span>{window.location.href}</span>}</ClientOnly>.
2
+ Current type: ${(0,o.isValidElement)(e)?`React element`:typeof e}`);return(0,r.jsx)(r.Fragment,{children:e?.()})}return t??null}const v=n,y=v.Helmet||v.default?.Helmet||(()=>null);function b(e){return(0,r.jsx)(y,{...e})}const{HelmetProvider:x}=n;function S(e,n,a={}){let{transformState:o,rootContainer:s=`#root`,ssrWhenDev:c,getStyleCollector:l=null}=a;process.env.NODE_ENV===`development`&&c!==void 0&&console.warn("[vite-react-ssg] `ssrWhenDev` option is no longer needed. If you want to use csr, just replace `vite-react-ssg dev` with `vite`.");let u=typeof window<`u`,d=e.basename??`/`,{v7_startTransition:f=!0,...g}=e.future??{};async function _(r=!1,a){let s=e.customCreateRouter??i.createBrowserRouter,c=r?s(t.r(e.routes,v),{future:g}):void 0,f=[],p=r?()=>{}:e=>f.push(e),m={isClient:u,routes:e.routes,router:c,routerOptions:e,onSSRAppRendered:p,triggerOnSSRAppRendered:()=>Promise.all(f.map(e=>e())),initialState:{},transformState:o,routePath:a,base:d,getStyleCollector:l,routerType:`remix`};r&&(await h(),m.initialState=o?.(window.__INITIAL_STATE__||{})||t.t(window.__INITIAL_STATE__)),await n?.(m);let _=m.initialState;return{...m,initialState:_}}return u&&(async()=>{let t=typeof s==`string`?document.querySelector(s):s;if(!t){typeof $jsdom>`u`&&console.warn(`[vite-react-ssg] Root container not found.`);return}let n=(0,i.matchRoutes)(e.routes,window.location)?.filter(e=>e.route.lazy);n&&n?.length>0&&await Promise.all(n.map(async e=>{let t=await e.route.lazy();Object.assign(e.route,{...t,lazy:void 0})}));let o=await _(!0);window.__VITE_REACT_SSG_CONTEXT__=o;let{router:c}=o,l=(0,r.jsx)(x,{children:(0,r.jsx)(i.RouterProvider,{router:c})});document.querySelector(`[data-server-rendered=true]`)===null&&process.env.NODE_ENV===`development`?p(l,t,a):m(l,t,a)})(),_;function v(e){return document.querySelector(`[data-server-rendered=true]`)===null||(e.loader=async({request:n})=>{if(process.env.NODE_ENV===`development`){let t=`_data=${encodeURIComponent(e.id)}`,r=n.url.includes(`?`)?`${n.url}&${t}`:`${n.url}?${t}`;return fetch(r)}else{if(!window.__VITE_REACT_SSG_STATIC_LOADER_MANIFEST__){let e=t.i(d,`static-loader-data-manifest-${window.__VITE_REACT_SSG_HASH__}.json`);window.__VITE_REACT_SSG_STATIC_LOADER_MANIFEST__=await(await fetch(t.s(e))).json()}let{url:r}=n,{pathname:i}=new URL(r),a=window.__VITE_REACT_SSG_STATIC_LOADER_MANIFEST__?.[i];if(!a)return null;if(window.__VITE_REACT_SSG_STATIC_LOADER_DATA__||(window.__VITE_REACT_SSG_STATIC_LOADER_DATA__={}),!window.__VITE_REACT_SSG_STATIC_LOADER_DATA__[i]){let e=t.i(d,a);window.__VITE_REACT_SSG_STATIC_LOADER_DATA__[i]=await(await fetch(t.s(e))).json()}return window.__VITE_REACT_SSG_STATIC_LOADER_DATA__[i]?.[e.id]??null}}),e}}exports.ClientOnly=_,exports.Head=b,exports.ViteReactSSG=S;
package/dist/index.d.cts CHANGED
@@ -1,4 +1,4 @@
1
- import { a as RouterFutureConfig, c as ViteReactSSGClientOptions, i as RouteRecord, l as ViteReactSSGContext, n as IndexRouteRecord, o as RouterOptions, r as NonIndexRouteRecord, s as StyleCollector, t as CrittersOptions, u as ViteReactSSGOptions } from "./types-DfHnCTVN.cjs";
1
+ import { a as RouterOptions, c as ViteReactSSGContext, i as RouterFutureConfig, l as ViteReactSSGOptions, n as NonIndexRouteRecord, o as StyleCollector, r as RouteRecord, s as ViteReactSSGClientOptions, t as IndexRouteRecord } from "./types-DqcL3sh6.cjs";
2
2
  import { ReactNode } from "react";
3
3
  import { HelmetProps } from "react-helmet-async";
4
4
 
@@ -31,4 +31,4 @@ declare global {
31
31
  }
32
32
  }
33
33
  //#endregion
34
- export { ClientOnly, CrittersOptions, Head, IndexRouteRecord, NonIndexRouteRecord, RouteRecord, RouterFutureConfig, RouterOptions, StyleCollector, ViteReactSSG, ViteReactSSGClientOptions, ViteReactSSGContext, ViteReactSSGOptions };
34
+ export { ClientOnly, Head, IndexRouteRecord, NonIndexRouteRecord, RouteRecord, RouterFutureConfig, RouterOptions, StyleCollector, ViteReactSSG, ViteReactSSGClientOptions, ViteReactSSGContext, ViteReactSSGOptions };
package/dist/index.d.mts CHANGED
@@ -1,4 +1,4 @@
1
- import { a as RouterFutureConfig, c as ViteReactSSGClientOptions, i as RouteRecord, l as ViteReactSSGContext, n as IndexRouteRecord, o as RouterOptions, r as NonIndexRouteRecord, s as StyleCollector, t as CrittersOptions, u as ViteReactSSGOptions } from "./types-D9xYNy8A.mjs";
1
+ import { a as RouterOptions, c as ViteReactSSGContext, i as RouterFutureConfig, l as ViteReactSSGOptions, n as NonIndexRouteRecord, o as StyleCollector, r as RouteRecord, s as ViteReactSSGClientOptions, t as IndexRouteRecord } from "./types-CZ2WOXHQ.mjs";
2
2
  import { HelmetProps } from "react-helmet-async";
3
3
  import { ReactNode } from "react";
4
4
 
@@ -31,4 +31,4 @@ declare global {
31
31
  }
32
32
  }
33
33
  //#endregion
34
- export { ClientOnly, CrittersOptions, Head, IndexRouteRecord, NonIndexRouteRecord, RouteRecord, RouterFutureConfig, RouterOptions, StyleCollector, ViteReactSSG, ViteReactSSGClientOptions, ViteReactSSGContext, ViteReactSSGOptions };
34
+ export { ClientOnly, Head, IndexRouteRecord, NonIndexRouteRecord, RouteRecord, RouterFutureConfig, RouterOptions, StyleCollector, ViteReactSSG, ViteReactSSGClientOptions, ViteReactSSGContext, ViteReactSSGOptions };
package/dist/index.mjs CHANGED
@@ -1,2 +1,2 @@
1
- import{i as e,r as t,s as n,t as r}from"./state-BLI6QppB.mjs";import*as i from"react-helmet-async";import{Helmet as a}from"react-helmet-async";import{Fragment as o,jsx as s}from"react/jsx-runtime";import{RouterProvider as c,createBrowserRouter as l,matchRoutes as u}from"react-router-dom";import*as d from"react-dom";import*as f from"react";import{isValidElement as p,useEffect as m,useState as h}from"react";const g={...d},{version:_,render:v,hydrate:y}=g,b=Number((_||``).split(`.`)[0])>17,x=Number((_||``).split(`.`)[0])>18;function S(e,t,n={}){let{useLegacyRender:r}=n;if(r||!b)v(e,t);else if(x)import(`react-dom/client`).then(({default:{createRoot:n}})=>{let r=n(t);f.startTransition(()=>{r.render(e)})});else{g.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.usingClientEntryPoint=!0;let{createRoot:n}=g;if(!n)throw Error(`createRoot not found`);let r=n(t);g.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.usingClientEntryPoint=!1,f.startTransition(()=>{r.render(e)})}}function C(e,t,n={}){let{useLegacyRender:r}=n;if(r||!b)y(e,t);else if(x)import(`react-dom/client`).then(({default:{hydrateRoot:n}})=>{f.startTransition(()=>{n(t,e)})});else{g.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.usingClientEntryPoint=!0;let{hydrateRoot:n}=g;if(!n)throw Error(`hydrateRoot not found`);f.startTransition(()=>{n(t,e),g.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.usingClientEntryPoint=!1})}}function w(e){return document.readyState===`loading`?new Promise(t=>{document.addEventListener(`DOMContentLoaded`,()=>t(e))}):Promise.resolve(e)}function T(){let[e,t]=h(!1);return m(()=>{t(!0)},[]),e}function E({children:e,fallback:t}){if(T()){if(typeof e!=`function`&&process.env.NODE_ENV===`development`)throw Error(`vite-react-ssg error: The children of <ClientOnly> must be a "render function", e.g. <ClientOnly>{() => <span>{window.location.href}</span>}</ClientOnly>.
2
- Current type: ${p(e)?`React element`:typeof e}`);return s(o,{children:e?.()})}return t??null}function D(e){return s(a,{...e})}const{HelmetProvider:O}=i;function k(i,a,o={}){let{transformState:d,rootContainer:f=`#root`,ssrWhenDev:p,getStyleCollector:m=null}=o;process.env.NODE_ENV===`development`&&p!==void 0&&console.warn("[vite-react-ssg] `ssrWhenDev` option is no longer needed. If you want to use csr, just replace `vite-react-ssg dev` with `vite`.");let h=typeof window<`u`,g=i.basename??`/`,{v7_startTransition:_=!0,...v}=i.future??{};async function y(e=!1,n){let o=i.customCreateRouter??l,s=e?o(t(i.routes,b),{future:v}):void 0,c=[],u=e?()=>{}:e=>c.push(e),f={isClient:h,routes:i.routes,router:s,routerOptions:i,onSSRAppRendered:u,triggerOnSSRAppRendered:()=>Promise.all(c.map(e=>e())),initialState:{},transformState:d,routePath:n,base:g,getStyleCollector:m,routerType:`remix`};e&&(await w(),f.initialState=d?.(window.__INITIAL_STATE__||{})||r(window.__INITIAL_STATE__)),await a?.(f);let p=f.initialState;return{...f,initialState:p}}return h&&(async()=>{let e=typeof f==`string`?document.querySelector(f):f;if(!e){typeof $jsdom>`u`&&console.warn(`[vite-react-ssg] Root container not found.`);return}let t=u(i.routes,window.location)?.filter(e=>e.route.lazy);t&&t?.length>0&&await Promise.all(t.map(async e=>{let t=await e.route.lazy();Object.assign(e.route,{...t,lazy:void 0})}));let n=await y(!0);window.__VITE_REACT_SSG_CONTEXT__=n;let{router:r}=n,a=s(O,{children:s(c,{router:r})});document.querySelector(`[data-server-rendered=true]`)===null&&process.env.NODE_ENV===`development`?S(a,e,o):C(a,e,o)})(),y;function b(t){return document.querySelector(`[data-server-rendered=true]`)===null||(t.loader=async({request:r})=>{if(process.env.NODE_ENV===`development`){let e=`_data=${encodeURIComponent(t.id)}`,n=r.url.includes(`?`)?`${r.url}&${e}`:`${r.url}?${e}`;return fetch(n)}else{if(!window.__VITE_REACT_SSG_STATIC_LOADER_MANIFEST__){let t=e(g,`static-loader-data-manifest-${window.__VITE_REACT_SSG_HASH__}.json`);window.__VITE_REACT_SSG_STATIC_LOADER_MANIFEST__=await(await fetch(n(t))).json()}let{url:i}=r,{pathname:a}=new URL(i),o=window.__VITE_REACT_SSG_STATIC_LOADER_MANIFEST__?.[a];if(!o)return null;if(window.__VITE_REACT_SSG_STATIC_LOADER_DATA__||(window.__VITE_REACT_SSG_STATIC_LOADER_DATA__={}),!window.__VITE_REACT_SSG_STATIC_LOADER_DATA__[a]){let t=e(g,o);window.__VITE_REACT_SSG_STATIC_LOADER_DATA__[a]=await(await fetch(n(t))).json()}return window.__VITE_REACT_SSG_STATIC_LOADER_DATA__[a]?.[t.id]??null}}),t}}export{E as ClientOnly,D as Head,k as ViteReactSSG};
1
+ import{i as e,r as t,s as n,t as r}from"./state-BLI6QppB.mjs";import*as i from"react-helmet-async";import{Fragment as a,jsx as o}from"react/jsx-runtime";import{RouterProvider as s,createBrowserRouter as c,matchRoutes as l}from"react-router-dom";import*as u from"react-dom";import{isValidElement as d,useEffect as f,useState as p}from"react";const m={...u},{version:h,render:g,hydrate:_}=m,v=Number((h||``).split(`.`)[0])>17,y=Number((h||``).split(`.`)[0])>18;function b(e,t,n={}){let{useLegacyRender:r}=n;if(r||!v)g(e,t);else if(y)import(`react-dom/client`).then(({createRoot:n})=>{n(t).render(e)});else{m.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.usingClientEntryPoint=!0;let{createRoot:n}=m;if(!n)throw Error(`createRoot not found`);let r=n(t);m.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.usingClientEntryPoint=!1,r.render(e)}}function x(e,t,n={}){let{useLegacyRender:r}=n;if(r||!v)_(e,t);else if(y)import(`react-dom/client`).then(({hydrateRoot:n})=>{n(t,e)});else{m.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.usingClientEntryPoint=!0;let{hydrateRoot:n}=m;if(!n)throw Error(`hydrateRoot not found`);n(t,e),m.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.usingClientEntryPoint=!1}}function S(e){return document.readyState===`loading`?new Promise(t=>{document.addEventListener(`DOMContentLoaded`,()=>t(e))}):Promise.resolve(e)}function C(){let[e,t]=p(!1);return f(()=>{t(!0)},[]),e}function w({children:e,fallback:t}){if(C()){if(typeof e!=`function`&&process.env.NODE_ENV===`development`)throw Error(`vite-react-ssg error: The children of <ClientOnly> must be a "render function", e.g. <ClientOnly>{() => <span>{window.location.href}</span>}</ClientOnly>.
2
+ Current type: ${d(e)?`React element`:typeof e}`);return o(a,{children:e?.()})}return t??null}const T=i,E=T.Helmet||T.default?.Helmet||(()=>null);function D(e){return o(E,{...e})}const{HelmetProvider:O}=i;function k(i,a,u={}){let{transformState:d,rootContainer:f=`#root`,ssrWhenDev:p,getStyleCollector:m=null}=u;process.env.NODE_ENV===`development`&&p!==void 0&&console.warn("[vite-react-ssg] `ssrWhenDev` option is no longer needed. If you want to use csr, just replace `vite-react-ssg dev` with `vite`.");let h=typeof window<`u`,g=i.basename??`/`,{v7_startTransition:_=!0,...v}=i.future??{};async function y(e=!1,n){let o=i.customCreateRouter??c,s=e?o(t(i.routes,C),{future:v}):void 0,l=[],u=e?()=>{}:e=>l.push(e),f={isClient:h,routes:i.routes,router:s,routerOptions:i,onSSRAppRendered:u,triggerOnSSRAppRendered:()=>Promise.all(l.map(e=>e())),initialState:{},transformState:d,routePath:n,base:g,getStyleCollector:m,routerType:`remix`};e&&(await S(),f.initialState=d?.(window.__INITIAL_STATE__||{})||r(window.__INITIAL_STATE__)),await a?.(f);let p=f.initialState;return{...f,initialState:p}}return h&&(async()=>{let e=typeof f==`string`?document.querySelector(f):f;if(!e){typeof $jsdom>`u`&&console.warn(`[vite-react-ssg] Root container not found.`);return}let t=l(i.routes,window.location)?.filter(e=>e.route.lazy);t&&t?.length>0&&await Promise.all(t.map(async e=>{let t=await e.route.lazy();Object.assign(e.route,{...t,lazy:void 0})}));let n=await y(!0);window.__VITE_REACT_SSG_CONTEXT__=n;let{router:r}=n,a=o(O,{children:o(s,{router:r})});document.querySelector(`[data-server-rendered=true]`)===null&&process.env.NODE_ENV===`development`?b(a,e,u):x(a,e,u)})(),y;function C(t){return document.querySelector(`[data-server-rendered=true]`)===null||(t.loader=async({request:r})=>{if(process.env.NODE_ENV===`development`){let e=`_data=${encodeURIComponent(t.id)}`,n=r.url.includes(`?`)?`${r.url}&${e}`:`${r.url}?${e}`;return fetch(n)}else{if(!window.__VITE_REACT_SSG_STATIC_LOADER_MANIFEST__){let t=e(g,`static-loader-data-manifest-${window.__VITE_REACT_SSG_HASH__}.json`);window.__VITE_REACT_SSG_STATIC_LOADER_MANIFEST__=await(await fetch(n(t))).json()}let{url:i}=r,{pathname:a}=new URL(i),o=window.__VITE_REACT_SSG_STATIC_LOADER_MANIFEST__?.[a];if(!o)return null;if(window.__VITE_REACT_SSG_STATIC_LOADER_DATA__||(window.__VITE_REACT_SSG_STATIC_LOADER_DATA__={}),!window.__VITE_REACT_SSG_STATIC_LOADER_DATA__[a]){let t=e(g,o);window.__VITE_REACT_SSG_STATIC_LOADER_DATA__[a]=await(await fetch(n(t))).json()}return window.__VITE_REACT_SSG_STATIC_LOADER_DATA__[a]?.[t.id]??null}}),t}}export{w as ClientOnly,D as Head,k as ViteReactSSG};
@@ -1 +1 @@
1
- const e=require(`./chunk-Bmb41Sf3.cjs`);let t=require(`jsdom`);t=e.t(t,1);const n=[];function r(e=`<!doctype html><html><head><meta charset="utf-8"></head><body></body></html>`,r={}){if(global.navigator&&global.navigator.userAgent&&global.navigator.userAgent.includes(`Node.js`)&&global.document&&typeof global.document.destroy==`function`)return global.document.destroy;`url`in r||Object.assign(r,{url:`http://localhost:3000`}),`pretendToBeVisual`in r||Object.assign(r,{pretendToBeVisual:!0});let i=new t.default.JSDOM(e,r),{window:a}=i,{document:o}=a;n.length===0&&(n.push(...Object.getOwnPropertyNames(a).filter(e=>!e.startsWith(`_`)).filter(e=>!(e in global))),n.push(`$jsdom`)),n.forEach(e=>global[e]=a[e]),global.document=o,global.window=a,a.console=global.console,global.$jsdom=i;let s=()=>n.forEach(e=>delete global[e]);return o.destroy=s,s}exports.jsdomGlobal=r;
1
+ const e=require(`./chunk-Bmb41Sf3.cjs`);let t=require(`jsdom`);t=e.t(t,1);const n=[];function r(e=`<!doctype html><html><head><meta charset="utf-8"></head><body></body></html>`,r={}){if(global.navigator&&global.navigator.userAgent&&global.navigator.userAgent.includes(`Node.js`)&&global.document&&typeof global.document.destroy==`function`)return global.document.destroy;`url`in r||Object.assign(r,{url:`http://localhost:3000`}),`pretendToBeVisual`in r||Object.assign(r,{pretendToBeVisual:!0});let i=new t.default.JSDOM(e,r),{window:a}=i,{document:o}=a;n.length===0&&(n.push(...Object.getOwnPropertyNames(a).filter(e=>!e.startsWith(`_`)).filter(e=>!(e in global))),n.push(`$jsdom`)),n.forEach(e=>global[e]=a[e]),global.document=o,global.window=a,a.console=global.console,global.$jsdom=i;let s=()=>{n.forEach(e=>delete global[e]);try{a.close()}catch{}};return o.destroy=s,s}exports.jsdomGlobal=r;
@@ -1 +1 @@
1
- import e from"jsdom";const t=[];function n(n=`<!doctype html><html><head><meta charset="utf-8"></head><body></body></html>`,r={}){if(global.navigator&&global.navigator.userAgent&&global.navigator.userAgent.includes(`Node.js`)&&global.document&&typeof global.document.destroy==`function`)return global.document.destroy;`url`in r||Object.assign(r,{url:`http://localhost:3000`}),`pretendToBeVisual`in r||Object.assign(r,{pretendToBeVisual:!0});let i=new e.JSDOM(n,r),{window:a}=i,{document:o}=a;t.length===0&&(t.push(...Object.getOwnPropertyNames(a).filter(e=>!e.startsWith(`_`)).filter(e=>!(e in global))),t.push(`$jsdom`)),t.forEach(e=>global[e]=a[e]),global.document=o,global.window=a,a.console=global.console,global.$jsdom=i;let s=()=>t.forEach(e=>delete global[e]);return o.destroy=s,s}export{n as jsdomGlobal};
1
+ import e from"jsdom";const t=[];function n(n=`<!doctype html><html><head><meta charset="utf-8"></head><body></body></html>`,r={}){if(global.navigator&&global.navigator.userAgent&&global.navigator.userAgent.includes(`Node.js`)&&global.document&&typeof global.document.destroy==`function`)return global.document.destroy;`url`in r||Object.assign(r,{url:`http://localhost:3000`}),`pretendToBeVisual`in r||Object.assign(r,{pretendToBeVisual:!0});let i=new e.JSDOM(n,r),{window:a}=i,{document:o}=a;t.length===0&&(t.push(...Object.getOwnPropertyNames(a).filter(e=>!e.startsWith(`_`)).filter(e=>!(e in global))),t.push(`$jsdom`)),t.forEach(e=>global[e]=a[e]),global.document=o,global.window=a,a.console=global.console,global.$jsdom=i;let s=()=>{t.forEach(e=>delete global[e]);try{a.close()}catch{}};return o.destroy=s,s}export{n as jsdomGlobal};
package/dist/node.cjs CHANGED
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./chunk-Bmb41Sf3.cjs`),t=require(`./state-OWuAHBHy.cjs`);let n=require(`react/jsx-runtime`),r=require(`node:module`),i=require(`node:path`),a=require(`fs-extra`);a=e.t(a,1);let o=require(`jsdom`),s=require(`kolorist`),c=require(`vite`),l=require(`node:events`),u=require(`node:stream`),d=require(`react-dom/server`);d=e.t(d);const f=/import\("([^)]+)"\)/g;async function p({routes:e,locationArg:t,base:n,serverManifest:r,manifest:i,ssrManifest:a}){let{matchRoutes:o}=await import(`react-router-dom`),s=o([...e],t,n),c=s?.map(e=>e.route.entry).filter(Boolean)??[],l=new Set;s?.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(f);for(let e of n)l.add(e[1].split(`/`).at(-1)??``)});let u=new Set;c.forEach(e=>u.add(e));let d=[...Object.entries(r)];l.forEach(e=>{let t=d.find(([t,n])=>n.file.endsWith(e));t&&u.add(t[0])});let p=m(i,u),h=new Set;return Array.from(p).forEach(e=>{(a[e]||[]).forEach(e=>{h.add(e)})}),h}function m(e,t){let n=new Set;if(!t)return n;for(let r of t)h(e,r,n);return n}function h(e,t,n=new Set){return t?(n.add(t),e[t]?.dynamicImports?.forEach(t=>{h(e,t,n)}),n):n}async function g(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{}try{let n=await import(`critters`),r=n.default||n;return console.warn("`critters` is deprecated. Please use `beasties` instead."),new r({path:e,logLevel:`warn`,external:!0,inlineFonts:!0,preloadFonts:!0,...t})}catch{return}}const _=`/* SCRIPT_COMMENT_PLACEHOLDER */`;async function v({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>${_}<\/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 y(e,t=`index.html`){let[,n]=[...(await a.default.readFile((0,i.join)(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 b(e){return`<link rel="stylesheet" href="${e}">`}function x(e,t){let n=new Set;t&&t.forEach(t=>{n.has(t)||(n.add(t),S(e,t))})}function S(e,t){t.endsWith(`.js`)?T(e,{rel:`modulepreload`,crossOrigin:``,href:t}):t.endsWith(`.css`)?T(e,{rel:`stylesheet`,href:t,crossOrigin:``}):t.endsWith(`.woff`)||t.endsWith(`.woff2`)||t.endsWith(`.ttf`)?T(e,{rel:`preload`,as:`font`,type:`font/woff2`,href:t,crossOrigin:``}):(t.endsWith(`.png`)||t.endsWith(`.jpg`)||t.endsWith(`.jpeg`)||t.endsWith(`.webp`)||t.endsWith(`.gif`)||t.endsWith(`.ico`)||t.endsWith(`.svg`))&&T(e,{rel:`preload`,as:`image`,href:t,crossOrigin:``})}function C(e){return e.createElement(`link`)}function w(e,t){let n=Object.keys(t);for(let r of n)e.setAttribute(r,t[r])}function T(e,t){if(e.head.querySelector(`link[href='${t.file}']`))return;let n=C(e);w(n,t),e.head.appendChild(n)}function E(e,t){if(e===!1||e==null)throw console.error(`The following error is a bug in Vite-react-ssg; please open an issue! https://github.com/Daydreamer-riri/vite-react-ssg/issues/new`),Error(t)}function D(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 O(e){let t=e.headers.origin&&e.headers.origin!==`null`?e.headers.origin:`http://${e.headers.host}`;E(e.originalUrl,"Expected `nodeReq.originalUrl` to be defined");let n=new URL(e.originalUrl,t),r={method:e.method,headers:D(e.headers)};return new Request(n.href,r)}async function k(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=u.Readable.from(n);r.pipe(t),await(0,l.once)(r,`end`)}else t.end()}function A(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 j(e){if(!d.renderToPipeableStream)return d.renderToString((0,n.jsx)(n.Fragment,{children:e}));let t=new M,{pipe:r}=d.renderToPipeableStream(e,{onError(e){t.destroy(e)},onAllReady(){r(t)}});return t.getPromise()}var M=class extends u.Writable{constructor(){super(),this._output=``,this._deferred={promise:null,resolve:()=>null,reject:()=>null},this._deferred.promise=new Promise((e,t)=>{this._deferred.resolve=e,this._deferred.reject=t})}_write(e,t,n){this._output+=e.toString(),n()}_destroy(e,t){e instanceof Error?this._deferred.reject(e):t()}end(){return this._deferred.resolve(this._output),this.destroy()}getPromise(){return this._deferred.promise}};function N(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}}const{HelmetProvider:P}=(0,r.createRequire)(require(`url`).pathToFileURL(__filename).href)(`react-helmet-async`);var F=class{constructor(e){this.handleLoader=async(e,n)=>{let{routes:r,base:i}=this.context,{matchRoutes:a}=await import(`react-router-dom`),o=O(e),s=new URL(o.url),c=decodeURIComponent(s.searchParams.get(`_data`)),l=a(t.r([...r],e=>e),{pathname:s.pathname,search:s.search,hash:s.hash,state:null,key:`default`},i);if(!l){n.statusCode=404,n.end(`Route not found: ${c}`);return}let u=l.find(e=>e.route.id===c);if(!u){n.statusCode=404,n.end(`Route not found: ${c}`);return}let d=u.route.loader??await u.route.lazy?.().then(e=>e.loader);if(!d){n.statusCode=200,n.end(`There is no loader for the route: ${c}`);return}await k(await I({loader:d,params:u.params,request:o,routeId:c}),n)},this.context=e}async render(e){let{base:r,routes:i,getStyleCollector:a,routerOptions:o}=this.context,s=`http://localhost${t.s(e)}`,c=new Request(s),l=a?await a():null,u={},d=null,{StaticRouterProvider:f,createStaticHandler:p,createStaticRouter:m}=await import(`react-router-dom`),h=t.r([...i],e=>e),{query:g}=p(h),_=await g(c);if(_ instanceof Response)throw _;d=_;let v=(0,n.jsx)(P,{context:u,children:(0,n.jsx)(f,{router:m(h,d,{future:o.future}),context:d})});l&&(v=l.collect(v));let y=await j(v),{htmlAttributes:b,bodyAttributes:x,metaAttributes:S,styleTag:C}=N(y,u,l);return{appHTML:y,htmlAttributes:b,bodyAttributes:x,metaAttributes:S,styleTag:C,routerContext:d}}};async function I({loader:e,params:t,request:n,routeId:r}){let{json:i}=await import(`react-router-dom`),a=await e({request:A(R(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 L(a)?a:i(a)}function L(e){return e!=null&&typeof e.status==`number`&&typeof e.statusText==`string`&&typeof e.headers==`object`&&e.body!==void 0}function R(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 ee(e){return new F(e)}var z=`0.0.1`;function B(e,t){console.log(`\n${(0,s.gray)(`[vite-react-ssg]`)} ${(0,s.yellow)(e)}${t?(0,s.blue)(` (${t})`):``}`)}function te(e){return`${(e.length/1024).toFixed(2)} KiB`}async function V(e){if(!e||e.length===0)return{paths:[`/`]};let t=new Set,n=async(e,i=``)=>{i=i.replace(/\/$/g,``);for(let a of e){if(a.lazy){let e=await a.lazy();e&&(a={...a,...e})}let e=a.path;if(e=r(e,i),a.getStaticPaths&&H(e)){let e=await a.getStaticPaths();for(let t of e)t=r(t,i),Array.isArray(a.children)&&await n(a.children,t)}a.index&&!e&&t.add(`/`),Array.isArray(a.children)&&await n(a.children,e)}};return await n(e),{paths:Array.from(t)};function r(e,n){return e!=null&&(e=n&&!e.startsWith(`/`)?`${n}${e?`/${e}`:``}`:e,t.add(e)),e}}async function ne(e,t){return await e.createResolver()(t,e.root)||(t.startsWith(`virtual:`)||t.includes(`\0`)?t:(0,i.join)(e.root,t))}const re=/[:*?]/;function H(e){return e?re.test(e):!1}const U=Number.parseInt(c.version)>=5?[`.vite`]:[];function ie(e){return Number.parseInt(c.version)>=8?{rolldownOptions:e}:{rollupOptions:e}}function ae(e,n){return`static-loader-data${t.s(e===`/`?`/index`:e.endsWith(`/`)?`${e}index`:e)}.${n}.json`}function oe(e,t){return e.filter(e=>!e.includes(`:`)&&!e.includes(`*`))}async function W(e={},n={}){let l=process.env.MODE||process.env.NODE_ENV||e.mode||`production`,u=await(0,c.resolveConfig)(n,`build`,l,l),d=process.cwd(),f=u.root||d,m=Math.random().toString(36).substring(2,12),h=(0,i.join)(f,`.vite-react-ssg-temp`,m),b=u.build.outDir||`dist`,S=u.base,C=Object.assign({},u.ssgOptions||{},e),{script:w=`sync`,mock:T=!1,htmlEntry:E=`index.html`,entry:D=await y(f,E),formatting:O=`none`,includedRoutes:k=oe,onBeforePageRender:A,onPageRendered:j,onFinished:M,dirStyle:N=`flat`,includeAllRoutes:P=!1,format:F=`esm`,concurrency:I=20,rootContainerId:L=`root`}=C,R=C.beastiesOptions??C.crittersOptions??{};a.default.existsSync(h)&&await a.default.remove(h);let z=(0,c.createLogger)(),re=z.warn;z.warn=(e,t)=>{e.includes(`vite:resolve`)&&e.includes(`externalized for browser compatibility`)||re(e,t)},B(`Build for client...`),await(0,c.build)((0,c.mergeConfig)(n,{build:{manifest:!0,ssrManifest:!0,...ie({input:{app:(0,i.join)(f,E||`./index.html`)},onLog(e,t,n){t.message.includes(`react-helmet-async`)||n(e,t)}})},customLogger:z,mode:u.mode,plugins:[{name:`vite-react-ssg:get-oup-dir`,configResolved(e){b=e.build.outDir||`dist`}}]}));let H=()=>{};if(T){let{jsdomGlobal:e}=await Promise.resolve().then(()=>require(`./jsdomGlobal-DIW81D0t.cjs`));H=e()}B(`Build for server...`),process.env.VITE_SSG=`true`;let W=await ne(u,D);await(0,c.build)((0,c.mergeConfig)(n,{build:{ssr:W,manifest:!0,outDir:h,minify:!1,cssCodeSplit:!1,...ie({output:F===`esm`?{entryFileNames:`[name].mjs`,format:`esm`}:{entryFileNames:`[name].cjs`,format:`cjs`},onLog(e,t,n){t.message.includes(`react-helmet-async`)||n(e,t)}})},mode:u.mode}));let le=F===`esm`&&process.platform===`win32`?`file://`:``,G=F===`esm`?`.mjs`:`.cjs`,ue=W.replace(/\0/g,``).replace(`virtual:`,``).replace(/[^a-zA-Z0-9-]/g,`_`),K=le+(0,i.join)(h,(W.includes(`/`)||W.includes(`\\`)?W.split(/[/\\]/).pop().replace(G,``):ue)+G).replace(/\\/g,`/`),de=JSON.parse(await a.default.readFile((0,i.join)(h,...U,`manifest.json`),`utf-8`)),fe=typeof require<`u`?require:(0,r.createRequire)(require(`url`).pathToFileURL(__filename).href),{createRoot:pe,includedRoutes:me}=F===`esm`?await import(K):fe(K),he=me||k,{routes:q}=await pe(!1),{paths:ge}=await V(q),J=P?ge:await he(ge,q||[]);J=oe(J,q||[]),J=Array.from(new Set(J)),B(`Rendering Pages...`,J.length);let Y=R===!1?void 0:await g(b,{publicPath:S,...R});Y&&console.log(`${(0,s.gray)(`[vite-react-ssg]`)} ${(0,s.blue)("Critical CSS generation enabled via `beasties`")}`);let X=(0,i.isAbsolute)(b)?b:(0,i.join)(f,b),_e=JSON.parse(await a.default.readFile((0,i.join)(X,...U,`ssr-manifest.json`),`utf-8`)),ve=JSON.parse(await a.default.readFile((0,i.join)(X,...U,`manifest.json`),`utf-8`)),Z=await a.default.readFile((0,i.join)(X,E),`utf-8`);a.default.rmSync((0,i.join)(X,E)),Z=se(Z,w);let Q=(await import(`p-queue`)).default||await import(`p-queue`),ye=new Q({concurrency:I}),be=new Q({concurrency:1}),xe={},Se=0;for(let e of J)ye.add(async()=>{try{let n=await pe(!1,e),{base:r,routes:c,triggerOnSSRAppRendered:l,transformState:d=t.n,app:f,routerType:h}=n,g=await A?.(e,Z,n)||Z,y=`${t.c(r)}${t.a(e)}`,S=ee(n),C=!f&&h===`remix`?await p({routes:[...c],locationArg:y,base:r,serverManifest:de,manifest:ve,ssrManifest:_e}):new Set,{appHTML:w,bodyAttributes:T,htmlAttributes:E,metaAttributes:D,styleTag:k,routerContext:M}=await S.render(e),P=M?.loaderData;if(P&&Object.keys(P).length>0){let n=ae(e,m);await a.default.ensureDir((0,i.join)(X,(0,i.dirname)(n))),await a.default.writeFile((0,i.join)(X,n),JSON.stringify(P)),xe[t.s(e)]=n,Se++}await l?.(e,w,n);let F=new o.JSDOM(await v({rootContainerId:L,appHTML:w,indexHTML:g,metaAttributes:D,bodyAttributes:T,htmlAttributes:E,initialState:null}));x(F.window.document,C);let I=F.serialize(),R=await j?.(e,I,n)||I;R=R.replace(_,`window.__VITE_REACT_SSG_HASH__ = '${m}'`),Y&&(R=await be.add(()=>Y.process(R)),R=R.replace(/<link\srel="stylesheet"/g,`<link rel="stylesheet" crossorigin`)),k&&(R=R.replace(`<head>`,`<head>${k}`));let z=await ce(R,O),B=`${(e.endsWith(`/`)?`${e}index`:e).replace(/^\//g,``)}.html`,V=N===`nested`?(0,i.join)(e.replace(/^\//g,``),`index.html`):B;await a.default.ensureDir((0,i.join)(X,(0,i.dirname)(V))),await a.default.writeFile((0,i.join)(X,V),z,`utf-8`),u.logger.info(`${(0,s.dim)(`${b}/`)}${(0,s.cyan)(V.padEnd(15,` `))} ${(0,s.dim)(te(z))}`)}catch(t){throw Error(`${(0,s.gray)(`[vite-react-ssg]`)} ${(0,s.red)(`Error on page: ${(0,s.cyan)(e)}`)}\n${t.stack}`)}});await ye.start().onIdle(),B(`Generating static loader data...`,Se);let Ce=JSON.stringify(xe,null,0);await a.default.writeFile((0,i.join)(X,`static-loader-data-manifest-${m}.json`),Ce),u.logger.info(`${(0,s.dim)(`${b}/`)}${(0,s.cyan)(`static-loader-data-manifest-${m}.json`.padEnd(15,` `))} ${(0,s.dim)(te(Ce))}`),await a.default.remove((0,i.join)(f,`.vite-react-ssg-temp`)),H();let $=u.plugins.find(e=>e.name===`vite-plugin-pwa`)?.api;$&&!$.disabled&&$.generateSW&&(B(`Regenerate PWA...`),await $.generateSW()),console.log(`\n${(0,s.gray)(`[vite-react-ssg]`)} ${(0,s.green)(`Build finished.`)}`),await M?.(b),setTimeout(()=>{console.log(`${(0,s.gray)(`[vite-react-ssg]`)} ${(0,s.yellow)(`Build process still running after 15s`)}. There might be something misconfigured in your setup. Force exit.`),process.exit(0)},15*1e3).unref()}function se(e,t){return!t||t===`sync`?e:e.replace(/<script type="module" /g,`<script type="module" ${t} `)}async function ce(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 console.error(`${(0,s.gray)(`[vite-react-ssg]`)} ${(0,s.red)(`Error formatting html: ${t?.message}`)}`),e}return e}function le({template:e,ssrEntry:n,onBeforePageRender:r,entry:i,rootContainerId:a,onPageRendered:o}){return{name:`vite-react-ssg:dev-server`,configureServer(s){let l=async(l,u,d)=>{try{let d=l.originalUrl,f=await(await s.ssrLoadModule(n).then(e=>e.createRoot))(!1,d),p=ee(f),{app:m,base:h}=f,[g,_]=d.split(`?`),y=new URLSearchParams(_);if(!m&&y.has(`_data`))return p.handleLoader(l,u);let x=await s.transformIndexHtml(d,e),S=await r?.(d,x,f)||x,{appHTML:C,bodyAttributes:w,htmlAttributes:T,metaAttributes:E,styleTag:D}=await p.render(t.o(g,h));E.push(D);let O=await Promise.all([n,i].map(async e=>await s.moduleGraph.getModuleByUrl(e))),k=new Set,A=new Set,j=async e=>{if(!e||!e?.ssrTransformResult||A.has(e))return;A.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`))k.add(e);else if(e.endsWith(`.ts`)||e.endsWith(`.tsx`)){let t=await s.moduleGraph.getModuleByUrl(e);t&&await j(t)}};await Promise.all(O.map(async e=>j(e)));let M=[...k].map(e=>b(t.i(s.config.base,e)));E.push(...M);let N=await v({rootContainerId:a,appHTML:C,indexHTML:S,metaAttributes:E,bodyAttributes:w,htmlAttributes:T,initialState:null}),P=await o?.(d,N,f)||N;u.statusCode=200,u.setHeader(`Content-Type`,`text/html`),(0,c.send)(l,u,P,`html`,{headers:`pluginContainer`in s?s.config.server.headers:s.config.preview.headers})}catch(e){s.ssrFixStacktrace(e),console.error(`[vite-react-ssg] error: ${e.stack}`),u.statusCode=500,u.end(e.stack)}};return()=>{s.middlewares.use(l)}}}}async function G(e={},t={}){let n=process.env.MODE||process.env.NODE_ENV||t.mode||`development`,r=await(0,c.resolveConfig)(e,`serve`,n,n),o=process.cwd(),s=r.root||o,{htmlEntry:l=`index.html`,entry:u=await y(s,l),onBeforePageRender:d,onPageRendered:f,rootContainerId:p=`root`,mock:m=!1}=Object.assign({},r.ssgOptions||{},t),h=await ne(r,u),g=await a.default.readFile((0,i.join)(s,l),`utf-8`);if(process.env.__DEV_MODE_SSR=`true`,m){let{jsdomGlobal:e}=await Promise.resolve().then(()=>require(`./jsdomGlobal-DIW81D0t.cjs`));e()}return await(0,c.createServer)((0,c.mergeConfig)({...e,plugins:[...e.plugins??[],le({template:g,ssrEntry:h,onBeforePageRender:d,onPageRendered:f,entry:u,rootContainerId:p})]},{}))}async function ue(e={},t={},n){globalThis.__ssr_start_time=performance.now();try{let r=await G(t,e);return await r.listen(),K(r,!!n),r.bindCLIShortcuts({print:!0}),r}catch(e){console.error(`${(0,s.red)(`failed to start server. error:`)}\n${e.stack}`),process.exit(1)}}async function K(e,t=!1){if(t)return e.printUrls();let n=e.config.logger.info,r=` -- SSR`;globalThis.__ssr_start_time&&(r+=` ready in ${(0,s.reset)((0,s.bold)(`${Math.round(performance.now()-globalThis.__ssr_start_time)}ms`))}`),n(`\n ${(0,s.bgLightCyan)(` VITE-REACT-SSG v${z} `)}`,{clear:!e.config.logger.hasWarned}),n(`${(0,s.cyan)(`\n VITE v${c.version}`)+(0,s.dim)(r)}\n`),n((0,s.green)(` dev server running at:`)),e.printUrls()}exports.build=W,exports.createServer=G,exports.dev=ue;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./chunk-Bmb41Sf3.cjs`),t=require(`./state-OWuAHBHy.cjs`);let n=require(`react/jsx-runtime`),r=require(`node:module`),i=require(`node:path`),a=require(`fs-extra`);a=e.t(a,1);let o=require(`jsdom`),s=require(`kolorist`),c=require(`vite`),l=require(`node:crypto`);l=e.t(l,1);let u=require(`node:events`),d=require(`node:stream`),f=require(`react-dom/server`);f=e.t(f);let p=require(`node:fs/promises`);p=e.t(p,1);const m=/import\("([^)]+)"\)/g;async function h({routes:e,locationArg:t,base:n,serverManifest:r,manifest:i,ssrManifest:a}){let{matchRoutes:o}=await import(`react-router-dom`),s=o([...e],t,n),c=s?.map(e=>e.route.entry).filter(Boolean)??[],l=new Set;s?.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(m);for(let e of n)l.add(e[1].split(`/`).at(-1)??``)});let u=new Set;c.forEach(e=>u.add(e));let d=[...Object.entries(r)];l.forEach(e=>{let t=d.find(([t,n])=>n.file.endsWith(e));t&&u.add(t[0])});let f=g(i,u),p=new Set;return Array.from(f).forEach(e=>{(a[e]||[]).forEach(e=>{p.add(e)})}),p}function g(e,t){let n=new Set;if(!t)return n;for(let r of t)_(e,r,n);return n}function _(e,t,n=new Set){return t?(n.add(t),e[t]?.dynamicImports?.forEach(t=>{_(e,t,n)}),n):n}async function v(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}}const y=`/* SCRIPT_COMMENT_PLACEHOLDER */`;async function b({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>${y}<\/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 x(e,t=`index.html`){let[,n]=[...(await a.default.readFile((0,i.join)(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 S(e){return`<link rel="stylesheet" href="${e}">`}function ee(e,t){let n=new Set;t&&t.forEach(t=>{n.has(t)||(n.add(t),C(e,t))})}function C(e,t){t.endsWith(`.js`)?E(e,{rel:`modulepreload`,crossOrigin:``,href:t}):t.endsWith(`.css`)?E(e,{rel:`stylesheet`,href:t,crossOrigin:``}):t.endsWith(`.woff`)||t.endsWith(`.woff2`)||t.endsWith(`.ttf`)?E(e,{rel:`preload`,as:`font`,type:`font/woff2`,href:t,crossOrigin:``}):(t.endsWith(`.png`)||t.endsWith(`.jpg`)||t.endsWith(`.jpeg`)||t.endsWith(`.webp`)||t.endsWith(`.gif`)||t.endsWith(`.ico`)||t.endsWith(`.svg`))&&E(e,{rel:`preload`,as:`image`,href:t,crossOrigin:``})}function w(e){return e.createElement(`link`)}function T(e,t){let n=Object.keys(t);for(let r of n)e.setAttribute(r,t[r])}function E(e,t){if(e.head.querySelector(`link[href='${t.file}']`))return;let n=w(e);T(n,t),e.head.appendChild(n)}function D(e,t){if(e===!1||e==null)throw console.error(`The following error is a bug in Vite-react-ssg; please open an issue! https://github.com/Daydreamer-riri/vite-react-ssg/issues/new`),Error(t)}function O(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 k(e){let t=e.headers.origin&&e.headers.origin!==`null`?e.headers.origin:`http://${e.headers.host}`;D(e.originalUrl,"Expected `nodeReq.originalUrl` to be defined");let n=new URL(e.originalUrl,t),r={method:e.method,headers:O(e.headers)};return new Request(n.href,r)}async function A(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=d.Readable.from(n);r.pipe(t),await(0,u.once)(r,`end`)}else t.end()}function te(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 j(e){if(!f.renderToPipeableStream)return f.renderToString((0,n.jsx)(n.Fragment,{children:e}));let t=new M,{pipe:r}=f.renderToPipeableStream(e,{onError(e){t.destroy(e)},onAllReady(){r(t)}});return t.getPromise()}var M=class extends d.Writable{constructor(){super(),this._output=``,this._deferred={promise:null,resolve:()=>null,reject:()=>null},this._deferred.promise=new Promise((e,t)=>{this._deferred.resolve=e,this._deferred.reject=t})}_write(e,t,n){this._output+=e.toString(),n()}_destroy(e,t){e instanceof Error?this._deferred.reject(e):t()}end(){return this._deferred.resolve(this._output),this.destroy()}getPromise(){return this._deferred.promise}};function ne(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}}const{HelmetProvider:N}=(0,r.createRequire)(require(`url`).pathToFileURL(__filename).href)(`react-helmet-async`);var re=class{constructor(e){this.handleLoader=async(e,n)=>{let{routes:r,base:i}=this.context,{matchRoutes:a}=await import(`react-router-dom`),o=k(e),s=new URL(o.url),c=decodeURIComponent(s.searchParams.get(`_data`)),l=a(t.r([...r],e=>e),{pathname:s.pathname,search:s.search,hash:s.hash,state:null,key:`default`},i);if(!l){n.statusCode=404,n.end(`Route not found: ${c}`);return}let u=l.find(e=>e.route.id===c);if(!u){n.statusCode=404,n.end(`Route not found: ${c}`);return}let d=u.route.loader??await u.route.lazy?.().then(e=>e.loader);if(!d){n.statusCode=200,n.end(`There is no loader for the route: ${c}`);return}await A(await ie({loader:d,params:u.params,request:o,routeId:c}),n)},this.context=e}async render(e){let{base:r,routes:i,getStyleCollector:a,routerOptions:o}=this.context,s=`http://localhost${t.s(e)}`,c=new Request(s),l=a?await a():null,u={},d=null,{StaticRouterProvider:f,createStaticHandler:p,createStaticRouter:m}=await import(`react-router-dom`),h=t.r([...i],e=>e),{query:g}=p(h),_=await g(c);if(_ instanceof Response)throw _;d=_;let v=(0,n.jsx)(N,{context:u,children:(0,n.jsx)(f,{router:m(h,d,{future:o.future}),context:d})});l&&(v=l.collect(v));let y=await j(v),{htmlAttributes:b,bodyAttributes:x,metaAttributes:S,styleTag:ee}=ne(y,u,l);return{appHTML:y,htmlAttributes:b,bodyAttributes:x,metaAttributes:S,styleTag:ee,routerContext:d}}};async function ie({loader:e,params:t,request:n,routeId:r}){let{json:i}=await import(`react-router-dom`),a=await e({request:te(F(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 P(a)?a:i(a)}function P(e){return e!=null&&typeof e.status==`number`&&typeof e.statusText==`string`&&typeof e.headers==`object`&&e.body!==void 0}function F(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 ae(e){return new re(e)}var I=`0.0.2`;function L(e,t){console.log(`\n${(0,s.gray)(`[vite-react-ssg]`)} ${(0,s.yellow)(e)}${t?(0,s.blue)(` (${t})`):``}`)}function oe(e){return`${(e.length/1024).toFixed(2)} KiB`}async function R(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&&V(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(`/`),Array.isArray(a.children)&&await n(a.children,e)}};return await n(e),{paths:Array.from(t)};function r(e,n){return e!=null&&(e=n&&!e.startsWith(`/`)?`${n}${e?`/${e}`:``}`:e,t.add(e)),e}}async function z(e,t){return await e.createResolver()(t,e.root)||(t.startsWith(`virtual:`)||t.includes(`\0`)?t:(0,i.join)(e.root,t))}const B=/[:*?]/;function V(e){return e?B.test(e):!1}const se=Number.parseInt(c.version)>=5?[`.vite`]:[];function ce(e){return Number.parseInt(c.version)>=8?{rolldownOptions:e}:{rollupOptions:e}}function H(e,t,n,r){let o=[];if(!a.default.existsSync(e))return o;let s=a.default.readdirSync(e);for(let c of s){let s=(0,i.join)(e,c),l=(0,i.relative)(t,s).replace(/\\/g,`/`),u=a.default.statSync(s);l.startsWith(`node_modules/`)||l===`node_modules`||l.startsWith(`.git/`)||l===`.git`||l.startsWith(`.boltdocs/`)||l===`.boltdocs`||l.startsWith(`.turbo/`)||l===`.turbo`||l.startsWith(`${r}/`)||l===r||l.startsWith(`${n}/`)||l===n||(u.isDirectory()?o.push(...H(s,t,n,r)):o.push(s))}return o}function le(e,t,n){try{let r=H(e,e,t,n);r.sort();let o=l.default.createHash(`sha256`);for(let t of r){let n=a.default.statSync(t),r=(0,i.relative)(e,t).replace(/\\/g,`/`);o.update(r),o.update(n.mtimeMs.toString()),o.update(n.size.toString())}return o.digest(`hex`)}catch{return Math.random().toString(36).substring(2,12)}}function ue(e,n){return`static-loader-data${t.s(e===`/`?`/index`:e.endsWith(`/`)?`${e}index`:e)}.${n}.json`}function de(e,t){return e.filter(e=>!e.includes(`:`)&&!e.includes(`*`))}async function U(e={},n={}){let u=process.env.MODE||process.env.NODE_ENV||e.mode||`production`,d=await(0,c.resolveConfig)(n,`build`,u,u),f=process.cwd(),p=d.root||f,m=Math.random().toString(36).substring(2,12),g=(0,i.join)(p,`.vite-react-ssg-temp`,m),_=d.build.outDir||`dist`,S=d.base,C=Object.assign({},d.ssgOptions||{},e),{script:w=`sync`,mock:T=!1,htmlEntry:E=`index.html`,entry:D=await x(p,E),formatting:O=`none`,includedRoutes:k=de,onBeforePageRender:A,onPageRendered:te,onFinished:j,dirStyle:M=`flat`,includeAllRoutes:ne=!1,format:N=`esm`,concurrency:re=20,rootContainerId:ie=`root`,routeToSourceFileMap:P={},cacheDir:F=`.boltdocs`}=C,I=C.beastiesOptions??{};a.default.existsSync(g)&&await a.default.remove(g);let B=(0,i.isAbsolute)(F)?F:(0,i.join)(p,F),V=(0,i.join)(B,`client-hash.txt`),H=(0,i.join)(B,`template-index.html`),U=`docs`,W=Object.values(P);if(W.length>0){let e=W[0],t=(0,i.relative)(p,e).replace(/\\/g,`/`).split(`/`);t.length>0&&(U=t[0])}let G=(0,i.isAbsolute)(_)?_:(0,i.join)(p,_),me=le(p,U,_),he=!1;try{a.default.existsSync(V)&&a.default.existsSync(H)&&a.default.existsSync(G)&&(await a.default.readFile(V,`utf-8`)).trim()===me&&(he=!0)}catch{}let ge=(0,c.createLogger)(),_e=ge.warn;ge.warn=(e,t)=>{e.includes(`vite:resolve`)&&e.includes(`externalized for browser compatibility`)||_e(e,t)},he?(L(`Client code unchanged. Bypassing client build...`),await a.default.ensureDir(G),await a.default.copy(H,(0,i.join)(G,E))):(L(`Build for client...`),await(0,c.build)((0,c.mergeConfig)(n,{build:{manifest:!0,ssrManifest:!0,...ce({input:{app:(0,i.join)(p,E||`./index.html`)},onLog(e,t,n){t.message.includes(`react-helmet-async`)||n(e,t)}})},customLogger:ge,mode:d.mode,plugins:[{name:`vite-react-ssg:get-oup-dir`,configResolved(e){_=e.build.outDir||`dist`}}]})),await a.default.ensureDir(B),await a.default.copy((0,i.join)(G,E),H),await a.default.writeFile(V,me,`utf-8`));let ve=()=>{};if(T){let{jsdomGlobal:e}=await Promise.resolve().then(()=>require(`./jsdomGlobal-B4hHTFBO.cjs`));ve=e()}L(`Build for server...`),process.env.VITE_SSG=`true`;let K=await z(d,D);await(0,c.build)((0,c.mergeConfig)(n,{build:{ssr:K,manifest:!0,outDir:g,minify:!1,cssCodeSplit:!1,...ce({output:N===`esm`?{entryFileNames:`[name].mjs`,format:`esm`}:{entryFileNames:`[name].cjs`,format:`cjs`},onLog(e,t,n){t.message.includes(`react-helmet-async`)||n(e,t)}})},mode:d.mode}));let ye=N===`esm`&&process.platform===`win32`?`file://`:``,be=N===`esm`?`.mjs`:`.cjs`,xe=K.replace(/\0/g,``).replace(`virtual:`,``).replace(/[^a-zA-Z0-9-]/g,`_`),Se=ye+(0,i.join)(g,(K.includes(`/`)||K.includes(`\\`)?K.split(/[/\\]/).pop().replace(/\.[^/.]+$/,``).replace(be,``):xe)+be).replace(/\\/g,`/`),Ce=JSON.parse(await a.default.readFile((0,i.join)(g,...se,`manifest.json`),`utf-8`)),we=typeof require<`u`?require:(0,r.createRequire)(require(`url`).pathToFileURL(__filename).href),{createRoot:Te,includedRoutes:Ee}=N===`esm`?await import(Se):we(Se),De=Ee||k,{routes:Oe}=await Te(!1),{paths:ke}=await R(Oe),q=ne?ke:await De(ke,Oe||[]);q=de(q,Oe||[]),q=Array.from(new Set(q)),L(`Rendering Pages...`,q.length);let Ae=I===!1?void 0:await v(_,{publicPath:S,...I});Ae&&console.log(`${(0,s.gray)(`[vite-react-ssg]`)} ${(0,s.blue)("Critical CSS generation enabled via `beasties`")}`);let je=JSON.parse(await a.default.readFile((0,i.join)(G,...se,`ssr-manifest.json`),`utf-8`)),Me=JSON.parse(await a.default.readFile((0,i.join)(G,...se,`manifest.json`),`utf-8`)),J=await a.default.readFile((0,i.join)(G,E),`utf-8`);a.default.rmSync((0,i.join)(G,E)),J=fe(J,w);let Ne=(await import(`p-queue`)).default||await import(`p-queue`),Pe=new Ne({concurrency:re}),Fe=new Ne({concurrency:1}),Ie={},Le=0,Y=(0,i.join)(B,`ssg-cache.json`),X=(0,i.join)(B,`ssg-pages`),Z={};try{a.default.existsSync(Y)&&(Z=await a.default.readJson(Y))}catch{}let Q={...Z};for(let e of q){let n=l.default.createHash(`md5`).update(e).digest(`hex`),r=(0,i.join)(X,`${n}.html`),c=(0,i.join)(X,`${n}.json`),u=`${(e.endsWith(`/`)?`${e}index`:e).replace(/^\//g,``)}.html`,f=M===`nested`?(0,i.join)(e.replace(/^\//g,``),`index.html`):u,p=(0,i.join)(G,f),g=t.s(e).replace(/\/$/,``),v=P[g]||P[e],x=!1,S=0;if(v&&a.default.existsSync(v))try{if(S=Math.round(a.default.statSync(v).mtimeMs),a.default.existsSync(r)){let t=Z[g]||Z[e];t&&Math.round(t.mtime)===S&&(x=!0)}}catch{}if(x){Pe.add(async()=>{try{await a.default.ensureDir((0,i.dirname)(p)),await a.default.copy(r,p);let n=Z[g]||Z[e];if(n?.loaderDataFilePath&&a.default.existsSync(c)){let r=n.loaderDataFilePath;await a.default.ensureDir((0,i.join)(G,(0,i.dirname)(r))),await a.default.copy(c,(0,i.join)(G,r)),Ie[t.s(e)]=r,Le++}d.logger.info(`${(0,s.dim)(`${_}/`)}${(0,s.cyan)(f.padEnd(15,` `))} ${(0,s.green)(`(cached)`)}`)}catch(t){throw Error(`${(0,s.gray)(`[vite-react-ssg]`)} Error on cached page: ${(0,s.cyan)(e)}\n${t.stack}`)}});continue}Pe.add(async()=>{try{let n=await Te(!1,e),{base:l,routes:u,triggerOnSSRAppRendered:p,transformState:g=t.n,app:x,routerType:C}=n,w=await A?.(e,J,n)||J,T=`${t.c(l)}${t.a(e)}`,E=ae(n),D=!x&&C===`remix`?await h({routes:[...u],locationArg:T,base:l,serverManifest:Ce,manifest:Me,ssrManifest:je}):new Set,{appHTML:k,bodyAttributes:j,htmlAttributes:M,metaAttributes:ne,styleTag:N,routerContext:re}=await E.render(e),P=re?.loaderData,F;if(P&&Object.keys(P).length>0){let n=ue(e,m);F=n,await a.default.ensureDir((0,i.join)(G,(0,i.dirname)(n))),await a.default.writeFile((0,i.join)(G,n),JSON.stringify(P)),Ie[t.s(e)]=n,Le++}await p?.(e,k,n);let I=new o.JSDOM(await b({rootContainerId:ie,appHTML:k,indexHTML:w,metaAttributes:ne,bodyAttributes:j,htmlAttributes:M,initialState:null}));ee(I.window.document,D);let L=I.serialize();I.window.close();let R=await te?.(e,L,n)||L;R=R.replace(y,`window.__VITE_REACT_SSG_HASH__ = '${m}'`),Ae&&(R=await Fe.add(()=>Ae.process(R)),R=R.replace(/<link\srel="stylesheet"/g,`<link rel="stylesheet" crossorigin`)),N&&(R=R.replace(`<head>`,`<head>${N}`));let z=await pe(R,O);if(await a.default.ensureDir((0,i.join)(G,(0,i.dirname)(f))),await a.default.writeFile((0,i.join)(G,f),z,`utf-8`),v&&a.default.existsSync(v)){await a.default.ensureDir(X),await a.default.writeFile(r,z,`utf-8`);let n=t.s(e).replace(/\/$/,``),i=Math.round(S);P&&Object.keys(P).length>0&&F?(await a.default.writeFile(c,JSON.stringify(P),`utf-8`),Q[n]={mtime:i,loaderDataFilePath:F}):Q[n]={mtime:i}}d.logger.info(`${(0,s.dim)(`${_}/`)}${(0,s.cyan)(f.padEnd(15,` `))} ${(0,s.dim)(oe(z))}`)}catch(t){throw Error(`${(0,s.gray)(`[vite-react-ssg]`)} ${(0,s.red)(`Error on page: ${(0,s.cyan)(e)}`)}\n${t.stack}`)}})}await Pe.start().onIdle();try{if(await a.default.ensureDir((0,i.dirname)(Y)),await a.default.writeJson(Y,Q),a.default.existsSync(X)){let e=await a.default.readdir(X),t=new Set;for(let e of Object.keys(Q)){let n=l.default.createHash(`md5`).update(e).digest(`hex`);t.add(`${n}.html`),t.add(`${n}.json`)}let n=0;for(let r of e)(r.endsWith(`.html`)||r.endsWith(`.json`))&&(t.has(r)||(await a.default.remove((0,i.join)(X,r)),n++));n>0&&L(`Pruned ${n} obsolete files from SSG cache.`)}}catch{}L(`Generating static loader data...`,Le);let Re=JSON.stringify(Ie,null,0);await a.default.writeFile((0,i.join)(G,`static-loader-data-manifest-${m}.json`),Re),d.logger.info(`${(0,s.dim)(`${_}/`)}${(0,s.cyan)(`static-loader-data-manifest-${m}.json`.padEnd(15,` `))} ${(0,s.dim)(oe(Re))}`),await a.default.remove((0,i.join)(p,`.vite-react-ssg-temp`)),ve();let $=d.plugins.find(e=>e.name===`vite-plugin-pwa`)?.api;$&&!$.disabled&&$.generateSW&&(L(`Regenerate PWA...`),await $.generateSW()),console.log(`\n${(0,s.gray)(`[vite-react-ssg]`)} ${(0,s.green)(`Build finished.`)}`),await j?.(_),setTimeout(()=>{console.log(`${(0,s.gray)(`[vite-react-ssg]`)} ${(0,s.yellow)(`Build process still running after 15s`)}. There might be something misconfigured in your setup. Force exit.`),process.exit(0)},15*1e3).unref()}function fe(e,t){return!t||t===`sync`?e:e.replace(/<script type="module" /g,`<script type="module" ${t} `)}async function pe(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 console.error(`${(0,s.gray)(`[vite-react-ssg]`)} ${(0,s.red)(`Error formatting html: ${t?.message}`)}`),e}return e}function W({template:e,ssrEntry:n,onBeforePageRender:r,entry:i,rootContainerId:a,onPageRendered:o}){return{name:`vite-react-ssg:dev-server`,configureServer(s){let l=async(l,u,d)=>{try{let d=l.originalUrl,f=await(await s.ssrLoadModule(n).then(e=>e.createRoot))(!1,d),p=ae(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 s.transformIndexHtml(d,e),x=await r?.(d,y,f)||y,{appHTML:ee,bodyAttributes:C,htmlAttributes:w,metaAttributes:T,styleTag:E}=await p.render(t.o(g,h));T.push(E);let D=await Promise.all([n,i].map(async e=>await s.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 s.moduleGraph.getModuleByUrl(e);t&&await A(t)}};await Promise.all(D.map(async e=>A(e)));let te=[...O].map(e=>S(t.i(s.config.base,e)));T.push(...te);let j=await b({rootContainerId:a,appHTML:ee,indexHTML:x,metaAttributes:T,bodyAttributes:C,htmlAttributes:w,initialState:null}),M=await o?.(d,j,f)||j;u.statusCode=200,u.setHeader(`Content-Type`,`text/html`),(0,c.send)(l,u,M,`html`,{headers:`pluginContainer`in s?s.config.server.headers:s.config.preview.headers})}catch(e){s.ssrFixStacktrace(e),console.error(`[vite-react-ssg] error: ${e.stack}`),u.statusCode=500,u.end(e.stack)}};return()=>{s.middlewares.use(l)}}}}async function G(e={},t={}){try{let n=process.env.NODE_ENV||t.mode||`development`,r=await(0,c.resolveConfig)(e,`serve`,n,n),a=process.cwd(),o=r.root||a,s={...r.ssgOptions,...t},{htmlEntry:l=`index.html`,onBeforePageRender:u,onPageRendered:d,rootContainerId:f=`root`,mock:m=!1}=s,h=s.entry||await x(o,l),[g,_]=await Promise.all([z(r,h),p.default.readFile((0,i.join)(o,l),`utf-8`)]);if(process.env.__DEV_MODE_SSR=`true`,m){let{jsdomGlobal:e}=await Promise.resolve().then(()=>require(`./jsdomGlobal-B4hHTFBO.cjs`));e()}return await(0,c.createServer)({...e,plugins:[...e.plugins??[],W({template:_,ssrEntry:g,onBeforePageRender:u,onPageRendered:d,entry:h,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 me(e={},t={},n){globalThis.__ssr_start_time=performance.now();try{let r=await G(t,e);return await r.listen(),he(r,!!n),r.bindCLIShortcuts({print:!0}),r}catch(e){console.error(`${(0,s.red)(`failed to start server. error:`)}\n${e.stack}`),process.exit(1)}}function he(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 ${(0,s.reset)((0,s.bold)(`${e}ms`))}`}n(`\n ${(0,s.bgLightCyan)(` VITE-REACT-SSG v${I} `)}`,{clear:!e.config.logger.hasWarned}),n(`${(0,s.cyan)(`\n VITE v${c.version}`)+(0,s.dim)(r)}\n`),n((0,s.green)(` dev server running at:`)),e.printUrls()}exports.build=U,exports.createServer=G,exports.dev=me;
package/dist/node.d.cts CHANGED
@@ -1,11 +1,20 @@
1
- import { u as ViteReactSSGOptions } from "./types-DfHnCTVN.cjs";
1
+ import { l as ViteReactSSGOptions } from "./types-DqcL3sh6.cjs";
2
2
  import { InlineConfig, ViteDevServer } from "vite";
3
3
 
4
4
  //#region src/node/build.d.ts
5
5
  declare function build(ssgOptions?: Partial<ViteReactSSGOptions>, viteConfig?: InlineConfig): Promise<void>;
6
6
  //#endregion
7
7
  //#region src/node/dev.d.ts
8
+ declare global {
9
+ var __ssr_start_time: number | undefined;
10
+ }
11
+ /**
12
+ * Creates a customized Vite development server for SSG.
13
+ */
8
14
  declare function createServer(viteConfig?: InlineConfig, ssgOptions?: Partial<ViteReactSSGOptions>): Promise<ViteDevServer>;
15
+ /**
16
+ * Top-level dev function that starts server and sets up interaction loop.
17
+ */
9
18
  declare function dev(ssgOptions?: Partial<ViteReactSSGOptions>, viteConfig?: InlineConfig, customOptions?: unknown): Promise<ViteDevServer>;
10
19
  //#endregion
11
20
  export { build, createServer, dev };
package/dist/node.d.mts CHANGED
@@ -1,11 +1,20 @@
1
- import { u as ViteReactSSGOptions } from "./types-D9xYNy8A.mjs";
1
+ import { l as ViteReactSSGOptions } from "./types-CZ2WOXHQ.mjs";
2
2
  import { InlineConfig, ViteDevServer } from "vite";
3
3
 
4
4
  //#region src/node/build.d.ts
5
5
  declare function build(ssgOptions?: Partial<ViteReactSSGOptions>, viteConfig?: InlineConfig): Promise<void>;
6
6
  //#endregion
7
7
  //#region src/node/dev.d.ts
8
+ declare global {
9
+ var __ssr_start_time: number | undefined;
10
+ }
11
+ /**
12
+ * Creates a customized Vite development server for SSG.
13
+ */
8
14
  declare function createServer(viteConfig?: InlineConfig, ssgOptions?: Partial<ViteReactSSGOptions>): Promise<ViteDevServer>;
15
+ /**
16
+ * Top-level dev function that starts server and sets up interaction loop.
17
+ */
9
18
  declare function dev(ssgOptions?: Partial<ViteReactSSGOptions>, viteConfig?: InlineConfig, customOptions?: unknown): Promise<ViteDevServer>;
10
19
  //#endregion
11
20
  export { build, createServer, dev };
package/dist/node.mjs CHANGED
@@ -1 +1 @@
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-BLI6QppB.mjs";import{createRequire as s}from"node:module";import{Fragment as c,jsx as l}from"react/jsx-runtime";import{dirname as u,isAbsolute as d,join as f}from"node:path";import p from"fs-extra";import{JSDOM as m}from"jsdom";import{bgLightCyan as h,blue as g,bold as _,cyan as v,dim as y,gray as b,green as x,red as S,reset as C,yellow as w}from"kolorist";import{build as T,createLogger as E,createServer as D,mergeConfig as O,resolveConfig as k,send as ee,version as A}from"vite";import{once as j}from"node:events";import{Readable as M,Writable as N}from"node:stream";import*as P from"react-dom/server";var F=s(import.meta.url);const te=/import\("([^)]+)"\)/g;async function ne({routes:e,locationArg:t,base:n,serverManifest:r,manifest:i,ssrManifest:a}){let{matchRoutes:o}=await import(`react-router-dom`),s=o([...e],t,n),c=s?.map(e=>e.route.entry).filter(Boolean)??[],l=new Set;s?.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(te);for(let e of n)l.add(e[1].split(`/`).at(-1)??``)});let u=new Set;c.forEach(e=>u.add(e));let d=[...Object.entries(r)];l.forEach(e=>{let t=d.find(([t,n])=>n.file.endsWith(e));t&&u.add(t[0])});let f=I(i,u),p=new Set;return Array.from(f).forEach(e=>{(a[e]||[]).forEach(e=>{p.add(e)})}),p}function I(e,t){let n=new Set;if(!t)return n;for(let r of t)L(e,r,n);return n}function L(e,t,n=new Set){return t?(n.add(t),e[t]?.dynamicImports?.forEach(t=>{L(e,t,n)}),n):n}async function re(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{}try{let n=await import(`critters`),r=n.default||n;return console.warn("`critters` is deprecated. Please use `beasties` instead."),new r({path:e,logLevel:`warn`,external:!0,inlineFonts:!0,preloadFonts:!0,...t})}catch{return}}const ie=`/* SCRIPT_COMMENT_PLACEHOLDER */`;async function ae({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>${ie}<\/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 oe(e,t=`index.html`){let[,n]=[...(await p.readFile(f(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 se(e){return`<link rel="stylesheet" href="${e}">`}function ce(e,t){let n=new Set;t&&t.forEach(t=>{n.has(t)||(n.add(t),le(e,t))})}function le(e,t){t.endsWith(`.js`)?R(e,{rel:`modulepreload`,crossOrigin:``,href:t}):t.endsWith(`.css`)?R(e,{rel:`stylesheet`,href:t,crossOrigin:``}):t.endsWith(`.woff`)||t.endsWith(`.woff2`)||t.endsWith(`.ttf`)?R(e,{rel:`preload`,as:`font`,type:`font/woff2`,href:t,crossOrigin:``}):(t.endsWith(`.png`)||t.endsWith(`.jpg`)||t.endsWith(`.jpeg`)||t.endsWith(`.webp`)||t.endsWith(`.gif`)||t.endsWith(`.ico`)||t.endsWith(`.svg`))&&R(e,{rel:`preload`,as:`image`,href:t,crossOrigin:``})}function ue(e){return e.createElement(`link`)}function de(e,t){let n=Object.keys(t);for(let r of n)e.setAttribute(r,t[r])}function R(e,t){if(e.head.querySelector(`link[href='${t.file}']`))return;let n=ue(e);de(n,t),e.head.appendChild(n)}function fe(e,t){if(e===!1||e==null)throw console.error(`The following error is a bug in Vite-react-ssg; please open an issue! https://github.com/Daydreamer-riri/vite-react-ssg/issues/new`),Error(t)}function pe(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 z(e){let t=e.headers.origin&&e.headers.origin!==`null`?e.headers.origin:`http://${e.headers.host}`;fe(e.originalUrl,"Expected `nodeReq.originalUrl` to be defined");let n=new URL(e.originalUrl,t),r={method:e.method,headers:pe(e.headers)};return new Request(n.href,r)}async function B(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=M.from(n);r.pipe(t),await j(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 V(e){if(!P.renderToPipeableStream)return P.renderToString(l(c,{children:e}));let t=new H,{pipe:n}=P.renderToPipeableStream(e,{onError(e){t.destroy(e)},onAllReady(){n(t)}});return t.getPromise()}var H=class extends N{constructor(){super(),this._output=``,this._deferred={promise:null,resolve:()=>null,reject:()=>null},this._deferred.promise=new Promise((e,t)=>{this._deferred.resolve=e,this._deferred.reject=t})}_write(e,t,n){this._output+=e.toString(),n()}_destroy(e,t){e instanceof Error?this._deferred.reject(e):t()}end(){return this._deferred.resolve(this._output),this.destroy()}getPromise(){return this._deferred.promise}};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}}const{HelmetProvider:U}=s(import.meta.url)(`react-helmet-async`);var ge=class{constructor(e){this.handleLoader=async(e,t)=>{let{routes:n,base:r}=this.context,{matchRoutes:i}=await import(`react-router-dom`),o=z(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 B(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=`http://localhost${o(e)}`,c=new Request(s),u=r?await r():null,d={},f=null,{StaticRouterProvider:p,createStaticHandler:m,createStaticRouter:h}=await import(`react-router-dom`),g=a([...n],e=>e),{query:_}=m(g),v=await _(c);if(v instanceof Response)throw v;f=v;let y=l(U,{context:d,children:l(p,{router:h(g,f,{future:i.future}),context:f})});u&&(y=u.collect(y));let b=await V(y),{htmlAttributes:x,bodyAttributes:S,metaAttributes:C,styleTag:w}=he(b,d,u);return{appHTML:b,htmlAttributes:x,bodyAttributes:S,metaAttributes:C,styleTag:w,routerContext:f}}};async function W({loader:e,params:t,request:n,routeId:r}){let{json:i}=await import(`react-router-dom`),a=await e({request:me(ve(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 _e(a)?a:i(a)}function _e(e){return e!=null&&typeof e.status==`number`&&typeof e.statusText==`string`&&typeof e.headers==`object`&&e.body!==void 0}function ve(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 ye(e){return new ge(e)}var G=`0.0.1`;function K(e,t){console.log(`\n${b(`[vite-react-ssg]`)} ${w(e)}${t?g(` (${t})`):``}`)}function be(e){return`${(e.length/1024).toFixed(2)} KiB`}async function xe(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&&we(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(`/`),Array.isArray(a.children)&&await n(a.children,e)}};return await n(e),{paths:Array.from(t)};function r(e,n){return e!=null&&(e=n&&!e.startsWith(`/`)?`${n}${e?`/${e}`:``}`:e,t.add(e)),e}}async function Se(e,t){return await e.createResolver()(t,e.root)||(t.startsWith(`virtual:`)||t.includes(`\0`)?t:f(e.root,t))}const Ce=/[:*?]/;function we(e){return e?Ce.test(e):!1}const q=Number.parseInt(A)>=5?[`.vite`]:[];function Te(e){return Number.parseInt(A)>=8?{rolldownOptions:e}:{rollupOptions:e}}function Ee(e,t){return`static-loader-data${o(e===`/`?`/index`:e.endsWith(`/`)?`${e}index`:e)}.${t}.json`}function De(e,t){return e.filter(e=>!e.includes(`:`)&&!e.includes(`*`))}async function J(n={},i={}){let a=process.env.MODE||process.env.NODE_ENV||n.mode||`production`,c=await k(i,`build`,a,a),l=process.cwd(),h=c.root||l,_=Math.random().toString(36).substring(2,12),C=f(h,`.vite-react-ssg-temp`,_),D=c.build.outDir||`dist`,ee=c.base,A=Object.assign({},c.ssgOptions||{},n),{script:j=`sync`,mock:M=!1,htmlEntry:N=`index.html`,entry:P=await oe(h,N),formatting:te=`none`,includedRoutes:I=De,onBeforePageRender:L,onPageRendered:se,onFinished:le,dirStyle:ue=`flat`,includeAllRoutes:de=!1,format:R=`esm`,concurrency:fe=20,rootContainerId:pe=`root`}=A,z=A.beastiesOptions??A.crittersOptions??{};p.existsSync(C)&&await p.remove(C);let B=E(),me=B.warn;B.warn=(e,t)=>{e.includes(`vite:resolve`)&&e.includes(`externalized for browser compatibility`)||me(e,t)},K(`Build for client...`),await T(O(i,{build:{manifest:!0,ssrManifest:!0,...Te({input:{app:f(h,N||`./index.html`)},onLog(e,t,n){t.message.includes(`react-helmet-async`)||n(e,t)}})},customLogger:B,mode:c.mode,plugins:[{name:`vite-react-ssg:get-oup-dir`,configResolved(e){D=e.build.outDir||`dist`}}]}));let V=()=>{};if(M){let{jsdomGlobal:e}=await import(`./jsdomGlobal-DuvGNWb6.mjs`);V=e()}K(`Build for server...`),process.env.VITE_SSG=`true`;let H=await Se(c,P);await T(O(i,{build:{ssr:H,manifest:!0,outDir:C,minify:!1,cssCodeSplit:!1,...Te({output:R===`esm`?{entryFileNames:`[name].mjs`,format:`esm`}:{entryFileNames:`[name].cjs`,format:`cjs`},onLog(e,t,n){t.message.includes(`react-helmet-async`)||n(e,t)}})},mode:c.mode}));let he=R===`esm`&&process.platform===`win32`?`file://`:``,U=R===`esm`?`.mjs`:`.cjs`,ge=H.replace(/\0/g,``).replace(`virtual:`,``).replace(/[^a-zA-Z0-9-]/g,`_`),W=he+f(C,(H.includes(`/`)||H.includes(`\\`)?H.split(/[/\\]/).pop().replace(U,``):ge)+U).replace(/\\/g,`/`),_e=JSON.parse(await p.readFile(f(C,...q,`manifest.json`),`utf-8`)),ve=F===void 0?s(import.meta.url):F,{createRoot:G,includedRoutes:Ce}=R===`esm`?await import(W):ve(W),we=Ce||I,{routes:J}=await G(!1),{paths:Ae}=await xe(J),Y=de?Ae:await we(Ae,J||[]);Y=De(Y,J||[]),Y=Array.from(new Set(Y)),K(`Rendering Pages...`,Y.length);let X=z===!1?void 0:await re(D,{publicPath:ee,...z});X&&console.log(`${b(`[vite-react-ssg]`)} ${g("Critical CSS generation enabled via `beasties`")}`);let Z=d(D)?D:f(h,D),je=JSON.parse(await p.readFile(f(Z,...q,`ssr-manifest.json`),`utf-8`)),Me=JSON.parse(await p.readFile(f(Z,...q,`manifest.json`),`utf-8`)),Q=await p.readFile(f(Z,N),`utf-8`);p.rmSync(f(Z,N)),Q=Oe(Q,j);let Ne=(await import(`p-queue`)).default||await import(`p-queue`),Pe=new Ne({concurrency:fe}),Fe=new Ne({concurrency:1}),Ie={},Le=0;for(let n of Y)Pe.add(async()=>{try{let i=await G(!1,n),{base:a,routes:s,triggerOnSSRAppRendered:l,transformState:d=r,app:h,routerType:g}=i,b=await L?.(n,Q,i)||Q,x=`${t(a)}${e(n)}`,S=ye(i),C=!h&&g===`remix`?await ne({routes:[...s],locationArg:x,base:a,serverManifest:_e,manifest:Me,ssrManifest:je}):new Set,{appHTML:w,bodyAttributes:T,htmlAttributes:E,metaAttributes:O,styleTag:k,routerContext:ee}=await S.render(n),A=ee?.loaderData;if(A&&Object.keys(A).length>0){let e=Ee(n,_);await p.ensureDir(f(Z,u(e))),await p.writeFile(f(Z,e),JSON.stringify(A)),Ie[o(n)]=e,Le++}await l?.(n,w,i);let j=new m(await ae({rootContainerId:pe,appHTML:w,indexHTML:b,metaAttributes:O,bodyAttributes:T,htmlAttributes:E,initialState:null}));ce(j.window.document,C);let M=j.serialize(),N=await se?.(n,M,i)||M;N=N.replace(ie,`window.__VITE_REACT_SSG_HASH__ = '${_}'`),X&&(N=await Fe.add(()=>X.process(N)),N=N.replace(/<link\srel="stylesheet"/g,`<link rel="stylesheet" crossorigin`)),k&&(N=N.replace(`<head>`,`<head>${k}`));let P=await ke(N,te),F=`${(n.endsWith(`/`)?`${n}index`:n).replace(/^\//g,``)}.html`,I=ue===`nested`?f(n.replace(/^\//g,``),`index.html`):F;await p.ensureDir(f(Z,u(I))),await p.writeFile(f(Z,I),P,`utf-8`),c.logger.info(`${y(`${D}/`)}${v(I.padEnd(15,` `))} ${y(be(P))}`)}catch(e){throw Error(`${b(`[vite-react-ssg]`)} ${S(`Error on page: ${v(n)}`)}\n${e.stack}`)}});await Pe.start().onIdle(),K(`Generating static loader data...`,Le);let Re=JSON.stringify(Ie,null,0);await p.writeFile(f(Z,`static-loader-data-manifest-${_}.json`),Re),c.logger.info(`${y(`${D}/`)}${v(`static-loader-data-manifest-${_}.json`.padEnd(15,` `))} ${y(be(Re))}`),await p.remove(f(h,`.vite-react-ssg-temp`)),V();let $=c.plugins.find(e=>e.name===`vite-plugin-pwa`)?.api;$&&!$.disabled&&$.generateSW&&(K(`Regenerate PWA...`),await $.generateSW()),console.log(`\n${b(`[vite-react-ssg]`)} ${x(`Build finished.`)}`),await le?.(D),setTimeout(()=>{console.log(`${b(`[vite-react-ssg]`)} ${w(`Build process still running after 15s`)}. There might be something misconfigured in your setup. Force exit.`),process.exit(0)},15*1e3).unref()}function Oe(e,t){return!t||t===`sync`?e:e.replace(/<script type="module" /g,`<script type="module" ${t} `)}async function ke(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 console.error(`${b(`[vite-react-ssg]`)} ${S(`Error formatting html: ${t?.message}`)}`),e}return e}function Ae({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,d)=>{try{let d=l.originalUrl,f=await(await c.ssrLoadModule(t).then(e=>e.createRoot))(!1,d),p=ye(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:T}=await p.render(i(g,h));w.push(T);let E=await Promise.all([t,a].map(async e=>await c.moduleGraph.getModuleByUrl(e))),D=new Set,O=new Set,k=async e=>{if(!e||!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 c.moduleGraph.getModuleByUrl(e);t&&await k(t)}};await Promise.all(E.map(async e=>k(e)));let A=[...D].map(e=>se(n(c.config.base,e)));w.push(...A);let j=await ae({rootContainerId:o,appHTML:x,indexHTML:b,metaAttributes:w,bodyAttributes:S,htmlAttributes:C,initialState:null}),M=await s?.(d,j,f)||j;u.statusCode=200,u.setHeader(`Content-Type`,`text/html`),ee(l,u,M,`html`,{headers:`pluginContainer`in c?c.config.server.headers:c.config.preview.headers})}catch(e){c.ssrFixStacktrace(e),console.error(`[vite-react-ssg] error: ${e.stack}`),u.statusCode=500,u.end(e.stack)}};return()=>{c.middlewares.use(l)}}}}async function Y(e={},t={}){let n=process.env.MODE||process.env.NODE_ENV||t.mode||`development`,r=await k(e,`serve`,n,n),i=process.cwd(),a=r.root||i,{htmlEntry:o=`index.html`,entry:s=await oe(a,o),onBeforePageRender:c,onPageRendered:l,rootContainerId:u=`root`,mock:d=!1}=Object.assign({},r.ssgOptions||{},t),m=await Se(r,s),h=await p.readFile(f(a,o),`utf-8`);if(process.env.__DEV_MODE_SSR=`true`,d){let{jsdomGlobal:e}=await import(`./jsdomGlobal-DuvGNWb6.mjs`);e()}return await D(O({...e,plugins:[...e.plugins??[],Ae({template:h,ssrEntry:m,onBeforePageRender:c,onPageRendered:l,entry:s,rootContainerId:u})]},{}))}async function X(e={},t={},n){globalThis.__ssr_start_time=performance.now();try{let r=await Y(t,e);return await r.listen(),Z(r,!!n),r.bindCLIShortcuts({print:!0}),r}catch(e){console.error(`${S(`failed to start server. error:`)}\n${e.stack}`),process.exit(1)}}async function Z(e,t=!1){if(t)return e.printUrls();let n=e.config.logger.info,r=` -- SSR`;globalThis.__ssr_start_time&&(r+=` ready in ${C(_(`${Math.round(performance.now()-globalThis.__ssr_start_time)}ms`))}`),n(`\n ${h(` VITE-REACT-SSG v${G} `)}`,{clear:!e.config.logger.hasWarned}),n(`${v(`\n VITE v${A}`)+y(r)}\n`),n(x(` dev server running at:`)),e.printUrls()}export{J as build,Y as createServer,X as dev};
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-BLI6QppB.mjs";import{createRequire as s}from"node:module";import{Fragment as c,jsx as l}from"react/jsx-runtime";import{dirname as u,isAbsolute as d,join as f,relative as p}from"node:path";import m from"fs-extra";import{JSDOM as h}from"jsdom";import{bgLightCyan as g,blue as _,bold as v,cyan as y,dim as b,gray as x,green as S,red as C,reset as w,yellow as T}from"kolorist";import{build as E,createLogger as D,createServer as O,mergeConfig as k,resolveConfig as A,send as ee,version as j}from"vite";import M from"node:crypto";import{once as te}from"node:events";import{Readable as ne,Writable as N}from"node:stream";import*as P from"react-dom/server";import re from"node:fs/promises";var F=s(import.meta.url);const I=/import\("([^)]+)"\)/g;async function ie({routes:e,locationArg:t,base:n,serverManifest:r,manifest:i,ssrManifest:a}){let{matchRoutes:o}=await import(`react-router-dom`),s=o([...e],t,n),c=s?.map(e=>e.route.entry).filter(Boolean)??[],l=new Set;s?.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(I);for(let e of n)l.add(e[1].split(`/`).at(-1)??``)});let u=new Set;c.forEach(e=>u.add(e));let d=[...Object.entries(r)];l.forEach(e=>{let t=d.find(([t,n])=>n.file.endsWith(e));t&&u.add(t[0])});let f=ae(i,u),p=new Set;return Array.from(f).forEach(e=>{(a[e]||[]).forEach(e=>{p.add(e)})}),p}function ae(e,t){let n=new Set;if(!t)return n;for(let r of t)oe(e,r,n);return n}function oe(e,t,n=new Set){return t?(n.add(t),e[t]?.dynamicImports?.forEach(t=>{oe(e,t,n)}),n):n}async function L(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}}const se=`/* SCRIPT_COMMENT_PLACEHOLDER */`;async function ce({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>${se}<\/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 R(e,t=`index.html`){let[,n]=[...(await m.readFile(f(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 le(e){return`<link rel="stylesheet" href="${e}">`}function ue(e,t){let n=new Set;t&&t.forEach(t=>{n.has(t)||(n.add(t),de(e,t))})}function de(e,t){t.endsWith(`.js`)?B(e,{rel:`modulepreload`,crossOrigin:``,href:t}):t.endsWith(`.css`)?B(e,{rel:`stylesheet`,href:t,crossOrigin:``}):t.endsWith(`.woff`)||t.endsWith(`.woff2`)||t.endsWith(`.ttf`)?B(e,{rel:`preload`,as:`font`,type:`font/woff2`,href:t,crossOrigin:``}):(t.endsWith(`.png`)||t.endsWith(`.jpg`)||t.endsWith(`.jpeg`)||t.endsWith(`.webp`)||t.endsWith(`.gif`)||t.endsWith(`.ico`)||t.endsWith(`.svg`))&&B(e,{rel:`preload`,as:`image`,href:t,crossOrigin:``})}function fe(e){return e.createElement(`link`)}function z(e,t){let n=Object.keys(t);for(let r of n)e.setAttribute(r,t[r])}function B(e,t){if(e.head.querySelector(`link[href='${t.file}']`))return;let n=fe(e);z(n,t),e.head.appendChild(n)}function pe(e,t){if(e===!1||e==null)throw console.error(`The following error is a bug in Vite-react-ssg; please open an issue! https://github.com/Daydreamer-riri/vite-react-ssg/issues/new`),Error(t)}function V(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}`;pe(e.originalUrl,"Expected `nodeReq.originalUrl` to be defined");let n=new URL(e.originalUrl,t),r={method:e.method,headers:V(e.headers)};return new Request(n.href,r)}async function me(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=ne.from(n);r.pipe(t),await te(r,`end`)}else t.end()}function U(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 W(e){if(!P.renderToPipeableStream)return P.renderToString(l(c,{children:e}));let t=new G,{pipe:n}=P.renderToPipeableStream(e,{onError(e){t.destroy(e)},onAllReady(){n(t)}});return t.getPromise()}var G=class extends N{constructor(){super(),this._output=``,this._deferred={promise:null,resolve:()=>null,reject:()=>null},this._deferred.promise=new Promise((e,t)=>{this._deferred.resolve=e,this._deferred.reject=t})}_write(e,t,n){this._output+=e.toString(),n()}_destroy(e,t){e instanceof Error?this._deferred.reject(e):t()}end(){return this._deferred.resolve(this._output),this.destroy()}getPromise(){return this._deferred.promise}};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}}const{HelmetProvider:ge}=s(import.meta.url)(`react-helmet-async`);var K=class{constructor(e){this.handleLoader=async(e,t)=>{let{routes:n,base:r}=this.context,{matchRoutes:i}=await import(`react-router-dom`),o=H(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 me(await _e({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=`http://localhost${o(e)}`,c=new Request(s),u=r?await r():null,d={},f=null,{StaticRouterProvider:p,createStaticHandler:m,createStaticRouter:h}=await import(`react-router-dom`),g=a([...n],e=>e),{query:_}=m(g),v=await _(c);if(v instanceof Response)throw v;f=v;let y=l(ge,{context:d,children:l(p,{router:h(g,f,{future:i.future}),context:f})});u&&(y=u.collect(y));let b=await W(y),{htmlAttributes:x,bodyAttributes:S,metaAttributes:C,styleTag:w}=he(b,d,u);return{appHTML:b,htmlAttributes:x,bodyAttributes:S,metaAttributes:C,styleTag:w,routerContext:f}}};async function _e({loader:e,params:t,request:n,routeId:r}){let{json:i}=await import(`react-router-dom`),a=await e({request:U(q(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 ve(a)?a:i(a)}function ve(e){return e!=null&&typeof e.status==`number`&&typeof e.statusText==`string`&&typeof e.headers==`object`&&e.body!==void 0}function q(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 ye(e){return new K(e)}var be=`0.0.2`;function J(e,t){console.log(`\n${x(`[vite-react-ssg]`)} ${T(e)}${t?_(` (${t})`):``}`)}function xe(e){return`${(e.length/1024).toFixed(2)} KiB`}async function Se(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&&Y(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(`/`),Array.isArray(a.children)&&await n(a.children,e)}};return await n(e),{paths:Array.from(t)};function r(e,n){return e!=null&&(e=n&&!e.startsWith(`/`)?`${n}${e?`/${e}`:``}`:e,t.add(e)),e}}async function Ce(e,t){return await e.createResolver()(t,e.root)||(t.startsWith(`virtual:`)||t.includes(`\0`)?t:f(e.root,t))}const we=/[:*?]/;function Y(e){return e?we.test(e):!1}const Te=Number.parseInt(j)>=5?[`.vite`]:[];function Ee(e){return Number.parseInt(j)>=8?{rolldownOptions:e}:{rollupOptions:e}}function De(e,t,n,r){let i=[];if(!m.existsSync(e))return i;let a=m.readdirSync(e);for(let o of a){let a=f(e,o),s=p(t,a).replace(/\\/g,`/`),c=m.statSync(a);s.startsWith(`node_modules/`)||s===`node_modules`||s.startsWith(`.git/`)||s===`.git`||s.startsWith(`.boltdocs/`)||s===`.boltdocs`||s.startsWith(`.turbo/`)||s===`.turbo`||s.startsWith(`${r}/`)||s===r||s.startsWith(`${n}/`)||s===n||(c.isDirectory()?i.push(...De(a,t,n,r)):i.push(a))}return i}function Oe(e,t,n){try{let r=De(e,e,t,n);r.sort();let i=M.createHash(`sha256`);for(let t of r){let n=m.statSync(t),r=p(e,t).replace(/\\/g,`/`);i.update(r),i.update(n.mtimeMs.toString()),i.update(n.size.toString())}return i.digest(`hex`)}catch{return Math.random().toString(36).substring(2,12)}}function ke(e,t){return`static-loader-data${o(e===`/`?`/index`:e.endsWith(`/`)?`${e}index`:e)}.${t}.json`}function Ae(e,t){return e.filter(e=>!e.includes(`:`)&&!e.includes(`*`))}async function je(n={},i={}){let a=process.env.MODE||process.env.NODE_ENV||n.mode||`production`,c=await A(i,`build`,a,a),l=process.cwd(),g=c.root||l,v=Math.random().toString(36).substring(2,12),w=f(g,`.vite-react-ssg-temp`,v),O=c.build.outDir||`dist`,ee=c.base,j=Object.assign({},c.ssgOptions||{},n),{script:te=`sync`,mock:ne=!1,htmlEntry:N=`index.html`,entry:P=await R(g,N),formatting:re=`none`,includedRoutes:I=Ae,onBeforePageRender:ae,onPageRendered:oe,onFinished:le,dirStyle:de=`flat`,includeAllRoutes:fe=!1,format:z=`esm`,concurrency:B=20,rootContainerId:pe=`root`,routeToSourceFileMap:V={},cacheDir:H=`.boltdocs`}=j,me=j.beastiesOptions??{};m.existsSync(w)&&await m.remove(w);let U=d(H)?H:f(g,H),W=f(U,`client-hash.txt`),G=f(U,`template-index.html`),he=`docs`,ge=Object.values(V);if(ge.length>0){let e=ge[0],t=p(g,e).replace(/\\/g,`/`).split(`/`);t.length>0&&(he=t[0])}let K=d(O)?O:f(g,O),_e=Oe(g,he,O),ve=!1;try{m.existsSync(W)&&m.existsSync(G)&&m.existsSync(K)&&(await m.readFile(W,`utf-8`)).trim()===_e&&(ve=!0)}catch{}let q=D(),be=q.warn;q.warn=(e,t)=>{e.includes(`vite:resolve`)&&e.includes(`externalized for browser compatibility`)||be(e,t)},ve?(J(`Client code unchanged. Bypassing client build...`),await m.ensureDir(K),await m.copy(G,f(K,N))):(J(`Build for client...`),await E(k(i,{build:{manifest:!0,ssrManifest:!0,...Ee({input:{app:f(g,N||`./index.html`)},onLog(e,t,n){t.message.includes(`react-helmet-async`)||n(e,t)}})},customLogger:q,mode:c.mode,plugins:[{name:`vite-react-ssg:get-oup-dir`,configResolved(e){O=e.build.outDir||`dist`}}]})),await m.ensureDir(U),await m.copy(f(K,N),G),await m.writeFile(W,_e,`utf-8`));let we=()=>{};if(ne){let{jsdomGlobal:e}=await import(`./jsdomGlobal-u0wZKDvc.mjs`);we=e()}J(`Build for server...`),process.env.VITE_SSG=`true`;let Y=await Ce(c,P);await E(k(i,{build:{ssr:Y,manifest:!0,outDir:w,minify:!1,cssCodeSplit:!1,...Ee({output:z===`esm`?{entryFileNames:`[name].mjs`,format:`esm`}:{entryFileNames:`[name].cjs`,format:`cjs`},onLog(e,t,n){t.message.includes(`react-helmet-async`)||n(e,t)}})},mode:c.mode}));let De=z===`esm`&&process.platform===`win32`?`file://`:``,je=z===`esm`?`.mjs`:`.cjs`,Pe=Y.replace(/\0/g,``).replace(`virtual:`,``).replace(/[^a-zA-Z0-9-]/g,`_`),X=De+f(w,(Y.includes(`/`)||Y.includes(`\\`)?Y.split(/[/\\]/).pop().replace(/\.[^/.]+$/,``).replace(je,``):Pe)+je).replace(/\\/g,`/`),Fe=JSON.parse(await m.readFile(f(w,...Te,`manifest.json`),`utf-8`)),Ie=F===void 0?s(import.meta.url):F,{createRoot:Le,includedRoutes:Re}=z===`esm`?await import(X):Ie(X),ze=Re||I,{routes:Be}=await Le(!1),{paths:Ve}=await Se(Be),Z=fe?Ve:await ze(Ve,Be||[]);Z=Ae(Z,Be||[]),Z=Array.from(new Set(Z)),J(`Rendering Pages...`,Z.length);let He=me===!1?void 0:await L(O,{publicPath:ee,...me});He&&console.log(`${x(`[vite-react-ssg]`)} ${_("Critical CSS generation enabled via `beasties`")}`);let Ue=JSON.parse(await m.readFile(f(K,...Te,`ssr-manifest.json`),`utf-8`)),We=JSON.parse(await m.readFile(f(K,...Te,`manifest.json`),`utf-8`)),Ge=await m.readFile(f(K,N),`utf-8`);m.rmSync(f(K,N)),Ge=Me(Ge,te);let Ke=(await import(`p-queue`)).default||await import(`p-queue`),qe=new Ke({concurrency:B}),Je=new Ke({concurrency:1}),Ye={},Xe=0,Ze=f(U,`ssg-cache.json`),Q=f(U,`ssg-pages`),$={};try{m.existsSync(Ze)&&($=await m.readJson(Ze))}catch{}let Qe={...$};for(let n of Z){let i=M.createHash(`md5`).update(n).digest(`hex`),a=f(Q,`${i}.html`),s=f(Q,`${i}.json`),l=`${(n.endsWith(`/`)?`${n}index`:n).replace(/^\//g,``)}.html`,d=de===`nested`?f(n.replace(/^\//g,``),`index.html`):l,p=f(K,d),g=o(n).replace(/\/$/,``),_=V[g]||V[n],w=!1,T=0;if(_&&m.existsSync(_))try{if(T=Math.round(m.statSync(_).mtimeMs),m.existsSync(a)){let e=$[g]||$[n];e&&Math.round(e.mtime)===T&&(w=!0)}}catch{}if(w){qe.add(async()=>{try{await m.ensureDir(u(p)),await m.copy(a,p);let e=$[g]||$[n];if(e?.loaderDataFilePath&&m.existsSync(s)){let t=e.loaderDataFilePath;await m.ensureDir(f(K,u(t))),await m.copy(s,f(K,t)),Ye[o(n)]=t,Xe++}c.logger.info(`${b(`${O}/`)}${y(d.padEnd(15,` `))} ${S(`(cached)`)}`)}catch(e){throw Error(`${x(`[vite-react-ssg]`)} Error on cached page: ${y(n)}\n${e.stack}`)}});continue}qe.add(async()=>{try{let i=await Le(!1,n),{base:l,routes:p,triggerOnSSRAppRendered:g,transformState:x=r,app:S,routerType:C}=i,w=await ae?.(n,Ge,i)||Ge,E=`${t(l)}${e(n)}`,D=ye(i),k=!S&&C===`remix`?await ie({routes:[...p],locationArg:E,base:l,serverManifest:Fe,manifest:We,ssrManifest:Ue}):new Set,{appHTML:A,bodyAttributes:ee,htmlAttributes:j,metaAttributes:M,styleTag:te,routerContext:ne}=await D.render(n),N=ne?.loaderData,P;if(N&&Object.keys(N).length>0){let e=ke(n,v);P=e,await m.ensureDir(f(K,u(e))),await m.writeFile(f(K,e),JSON.stringify(N)),Ye[o(n)]=e,Xe++}await g?.(n,A,i);let F=new h(await ce({rootContainerId:pe,appHTML:A,indexHTML:w,metaAttributes:M,bodyAttributes:ee,htmlAttributes:j,initialState:null}));ue(F.window.document,k);let I=F.serialize();F.window.close();let L=await oe?.(n,I,i)||I;L=L.replace(se,`window.__VITE_REACT_SSG_HASH__ = '${v}'`),He&&(L=await Je.add(()=>He.process(L)),L=L.replace(/<link\srel="stylesheet"/g,`<link rel="stylesheet" crossorigin`)),te&&(L=L.replace(`<head>`,`<head>${te}`));let R=await Ne(L,re);if(await m.ensureDir(f(K,u(d))),await m.writeFile(f(K,d),R,`utf-8`),_&&m.existsSync(_)){await m.ensureDir(Q),await m.writeFile(a,R,`utf-8`);let e=o(n).replace(/\/$/,``),t=Math.round(T);N&&Object.keys(N).length>0&&P?(await m.writeFile(s,JSON.stringify(N),`utf-8`),Qe[e]={mtime:t,loaderDataFilePath:P}):Qe[e]={mtime:t}}c.logger.info(`${b(`${O}/`)}${y(d.padEnd(15,` `))} ${b(xe(R))}`)}catch(e){throw Error(`${x(`[vite-react-ssg]`)} ${C(`Error on page: ${y(n)}`)}\n${e.stack}`)}})}await qe.start().onIdle();try{if(await m.ensureDir(u(Ze)),await m.writeJson(Ze,Qe),m.existsSync(Q)){let e=await m.readdir(Q),t=new Set;for(let e of Object.keys(Qe)){let n=M.createHash(`md5`).update(e).digest(`hex`);t.add(`${n}.html`),t.add(`${n}.json`)}let n=0;for(let r of e)(r.endsWith(`.html`)||r.endsWith(`.json`))&&(t.has(r)||(await m.remove(f(Q,r)),n++));n>0&&J(`Pruned ${n} obsolete files from SSG cache.`)}}catch{}J(`Generating static loader data...`,Xe);let $e=JSON.stringify(Ye,null,0);await m.writeFile(f(K,`static-loader-data-manifest-${v}.json`),$e),c.logger.info(`${b(`${O}/`)}${y(`static-loader-data-manifest-${v}.json`.padEnd(15,` `))} ${b(xe($e))}`),await m.remove(f(g,`.vite-react-ssg-temp`)),we();let et=c.plugins.find(e=>e.name===`vite-plugin-pwa`)?.api;et&&!et.disabled&&et.generateSW&&(J(`Regenerate PWA...`),await et.generateSW()),console.log(`\n${x(`[vite-react-ssg]`)} ${S(`Build finished.`)}`),await le?.(O),setTimeout(()=>{console.log(`${x(`[vite-react-ssg]`)} ${T(`Build process still running after 15s`)}. There might be something misconfigured in your setup. Force exit.`),process.exit(0)},15*1e3).unref()}function Me(e,t){return!t||t===`sync`?e:e.replace(/<script type="module" /g,`<script type="module" ${t} `)}async function Ne(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 console.error(`${x(`[vite-react-ssg]`)} ${C(`Error formatting html: ${t?.message}`)}`),e}return e}function Pe({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,d)=>{try{let d=l.originalUrl,f=await(await c.ssrLoadModule(t).then(e=>e.createRoot))(!1,d),p=ye(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:T}=await p.render(i(g,h));w.push(T);let E=await Promise.all([t,a].map(async e=>await c.moduleGraph.getModuleByUrl(e))),D=new Set,O=new Set,k=async e=>{if(!e||!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 c.moduleGraph.getModuleByUrl(e);t&&await k(t)}};await Promise.all(E.map(async e=>k(e)));let A=[...D].map(e=>le(n(c.config.base,e)));w.push(...A);let j=await ce({rootContainerId:o,appHTML:x,indexHTML:b,metaAttributes:w,bodyAttributes:S,htmlAttributes:C,initialState:null}),M=await s?.(d,j,f)||j;u.statusCode=200,u.setHeader(`Content-Type`,`text/html`),ee(l,u,M,`html`,{headers:`pluginContainer`in c?c.config.server.headers:c.config.preview.headers})}catch(e){c.ssrFixStacktrace(e),console.error(`[vite-react-ssg] error: ${e.stack}`),u.statusCode=500,u.end(e.stack)}};return()=>{c.middlewares.use(l)}}}}async function X(e={},t={}){try{let n=process.env.NODE_ENV||t.mode||`development`,r=await A(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,p=o.entry||await R(a,s),[m,h]=await Promise.all([Ce(r,p),re.readFile(f(a,s),`utf-8`)]);if(process.env.__DEV_MODE_SSR=`true`,d){let{jsdomGlobal:e}=await import(`./jsdomGlobal-u0wZKDvc.mjs`);e()}return await O({...e,plugins:[...e.plugins??[],Pe({template:h,ssrEntry:m,onBeforePageRender:c,onPageRendered:l,entry:p,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 Fe(e={},t={},n){globalThis.__ssr_start_time=performance.now();try{let r=await X(t,e);return await r.listen(),Ie(r,!!n),r.bindCLIShortcuts({print:!0}),r}catch(e){console.error(`${C(`failed to start server. error:`)}\n${e.stack}`),process.exit(1)}}function Ie(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 ${w(v(`${e}ms`))}`}n(`\n ${g(` VITE-REACT-SSG v${be} `)}`,{clear:!e.config.logger.hasWarned}),n(`${y(`\n VITE v${j}`)+b(r)}\n`),n(S(` dev server running at:`)),e.printUrls()}export{je as build,X as createServer,Fe as dev};
@@ -4,25 +4,6 @@ import { Options } from "beasties";
4
4
 
5
5
  //#region src/types.d.ts
6
6
  type Router = ReturnType<typeof createBrowserRouter>;
7
- interface CrittersOptions {
8
- path?: string;
9
- publicPath?: string;
10
- external?: boolean;
11
- inlineThreshold?: number;
12
- minimumExternalSize?: number;
13
- pruneSource?: boolean;
14
- mergeStylesheets?: boolean;
15
- additionalStylesheets?: string[];
16
- preload?: 'body' | 'media' | 'swap' | 'js' | 'js-lazy';
17
- noscriptFallback?: boolean;
18
- inlineFonts?: boolean;
19
- preloadFonts?: boolean;
20
- fonts?: boolean;
21
- keyframes?: string;
22
- compress?: boolean;
23
- logLevel?: 'info' | 'warn' | 'error' | 'trace' | 'debug' | 'silent';
24
- reduceInlineStyles?: boolean;
25
- }
26
7
  interface ViteReactSSGOptions<Context = ViteReactSSGContext> {
27
8
  /**
28
9
  * Set the scripts' loading mode. Only works for `type="module"`.
@@ -82,13 +63,6 @@ interface ViteReactSSGOptions<Context = ViteReactSSGContext> {
82
63
  * @default false
83
64
  */
84
65
  includeAllRoutes?: boolean;
85
- /**
86
- * Options for the critters packages.
87
- *
88
- * @deprecated Use `beastiesOptions` instead.
89
- * @see https://github.com/GoogleChromeLabs/critters
90
- */
91
- crittersOptions?: CrittersOptions | false;
92
66
  /**
93
67
  * Options for the beasties package.
94
68
  *
@@ -135,6 +109,14 @@ interface ViteReactSSGOptions<Context = ViteReactSSGContext> {
135
109
  * @default 20
136
110
  */
137
111
  concurrency?: number;
112
+ /**
113
+ * A mapping of route paths to their corresponding source file paths.
114
+ */
115
+ routeToSourceFileMap?: Record<string, string>;
116
+ /**
117
+ * The directory where SSG build cache is stored.
118
+ */
119
+ cacheDir?: string;
138
120
  }
139
121
  interface ViteReactSSGContext<HasRouter extends boolean = true> {
140
122
  router?: HasRouter extends true ? Router : undefined;
@@ -218,4 +200,4 @@ declare module 'vite' {
218
200
  }
219
201
  }
220
202
  //#endregion
221
- export { RouterFutureConfig as a, ViteReactSSGClientOptions as c, RouteRecord as i, ViteReactSSGContext as l, IndexRouteRecord as n, RouterOptions as o, NonIndexRouteRecord as r, StyleCollector as s, CrittersOptions as t, ViteReactSSGOptions as u };
203
+ export { RouterOptions as a, ViteReactSSGContext as c, RouterFutureConfig as i, ViteReactSSGOptions as l, NonIndexRouteRecord as n, StyleCollector as o, RouteRecord as r, ViteReactSSGClientOptions as s, IndexRouteRecord as t };
@@ -4,25 +4,6 @@ import { FutureConfig, IndexRouteObject, NonIndexRouteObject, createBrowserRoute
4
4
 
5
5
  //#region src/types.d.ts
6
6
  type Router = ReturnType<typeof createBrowserRouter>;
7
- interface CrittersOptions {
8
- path?: string;
9
- publicPath?: string;
10
- external?: boolean;
11
- inlineThreshold?: number;
12
- minimumExternalSize?: number;
13
- pruneSource?: boolean;
14
- mergeStylesheets?: boolean;
15
- additionalStylesheets?: string[];
16
- preload?: 'body' | 'media' | 'swap' | 'js' | 'js-lazy';
17
- noscriptFallback?: boolean;
18
- inlineFonts?: boolean;
19
- preloadFonts?: boolean;
20
- fonts?: boolean;
21
- keyframes?: string;
22
- compress?: boolean;
23
- logLevel?: 'info' | 'warn' | 'error' | 'trace' | 'debug' | 'silent';
24
- reduceInlineStyles?: boolean;
25
- }
26
7
  interface ViteReactSSGOptions<Context = ViteReactSSGContext> {
27
8
  /**
28
9
  * Set the scripts' loading mode. Only works for `type="module"`.
@@ -82,13 +63,6 @@ interface ViteReactSSGOptions<Context = ViteReactSSGContext> {
82
63
  * @default false
83
64
  */
84
65
  includeAllRoutes?: boolean;
85
- /**
86
- * Options for the critters packages.
87
- *
88
- * @deprecated Use `beastiesOptions` instead.
89
- * @see https://github.com/GoogleChromeLabs/critters
90
- */
91
- crittersOptions?: CrittersOptions | false;
92
66
  /**
93
67
  * Options for the beasties package.
94
68
  *
@@ -135,6 +109,14 @@ interface ViteReactSSGOptions<Context = ViteReactSSGContext> {
135
109
  * @default 20
136
110
  */
137
111
  concurrency?: number;
112
+ /**
113
+ * A mapping of route paths to their corresponding source file paths.
114
+ */
115
+ routeToSourceFileMap?: Record<string, string>;
116
+ /**
117
+ * The directory where SSG build cache is stored.
118
+ */
119
+ cacheDir?: string;
138
120
  }
139
121
  interface ViteReactSSGContext<HasRouter extends boolean = true> {
140
122
  router?: HasRouter extends true ? Router : undefined;
@@ -218,4 +200,4 @@ declare module 'vite' {
218
200
  }
219
201
  }
220
202
  //#endregion
221
- export { RouterFutureConfig as a, ViteReactSSGClientOptions as c, RouteRecord as i, ViteReactSSGContext as l, IndexRouteRecord as n, RouterOptions as o, NonIndexRouteRecord as r, StyleCollector as s, CrittersOptions as t, ViteReactSSGOptions as u };
203
+ export { RouterOptions as a, ViteReactSSGContext as c, RouterFutureConfig as i, ViteReactSSGOptions as l, NonIndexRouteRecord as n, StyleCollector as o, RouteRecord as r, ViteReactSSGClientOptions as s, IndexRouteRecord as t };
package/package.json CHANGED
@@ -1,9 +1,12 @@
1
1
  {
2
2
  "name": "@bdocs/ssg",
3
3
  "type": "module",
4
- "version": "0.0.1",
4
+ "version": "0.0.2",
5
5
  "description": "A Vite plugin for static site generation (SSG) with React.",
6
6
  "license": "MIT",
7
+ "publishConfig": {
8
+ "access": "public"
9
+ },
7
10
  "keywords": [
8
11
  "vite",
9
12
  "vite-plugin",
@@ -58,7 +61,6 @@
58
61
  ],
59
62
  "peerDependencies": {
60
63
  "beasties": "^0.4.2",
61
- "critters": "^0.0.24",
62
64
  "react": "^19.0.0",
63
65
  "react-dom": "^19.0.0",
64
66
  "react-router-dom": "^7.0.0",
@@ -69,9 +71,6 @@
69
71
  "beasties": {
70
72
  "optional": true
71
73
  },
72
- "critters": {
73
- "optional": true
74
- },
75
74
  "prettier": {
76
75
  "optional": true
77
76
  },
@@ -98,15 +97,11 @@
98
97
  "@types/node": "^22.0.0",
99
98
  "@types/react": "^19.0.0",
100
99
  "@types/react-dom": "^19.0.0",
101
- "@types/react-router-dom": "^5.3.3",
102
100
  "@types/yargs": "^17.0.35",
103
- "@vitejs/plugin-react-swc": "^3.11.0",
104
101
  "beasties": "^0.4.2",
105
102
  "bumpp": "^10.4.1",
106
- "critters": "^0.0.25",
107
103
  "eslint": "^9.39.4",
108
104
  "esno": "^4.8.0",
109
- "fast-glob": "^3.3.2",
110
105
  "prettier": "^3.8.2",
111
106
  "react": "^19.0.0",
112
107
  "react-dom": "^19.0.0",