@webtypen/webframez-react 0.0.32 → 0.0.34

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/client.cjs CHANGED
@@ -1 +1 @@
1
- var M=Object.create;var m=Object.defineProperty;var D=Object.getOwnPropertyDescriptor;var F=Object.getOwnPropertyNames;var q=Object.getPrototypeOf,G=Object.prototype.hasOwnProperty;var Y=(e,t)=>{for(var n in t)m(e,n,{get:t[n],enumerable:!0})},S=(e,t,n,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of F(t))!G.call(e,r)&&r!==n&&m(e,r,{get:()=>t[r],enumerable:!(o=D(t,r))||o.enumerable});return e};var Z=(e,t,n)=>(n=e!=null?M(q(e)):{},S(t||!e||!e.__esModule?m(n,"default",{value:e,enumerable:!0}):n,e)),j=e=>S(m({},"__esModule",{value:!0}),e);var ce={};Y(ce,{mountWebframezClient:()=>ue,useCookie:()=>ne,useRouter:()=>oe});module.exports=j(ce);var a=Z(require("react"),1),b=require("react-dom/client"),l=require("react-server-dom-webpack/client");var X=/^(?:[a-zA-Z][a-zA-Z\d+\-.]*:|\/\/|#)/;function u(e){if(typeof e!="string")return;let t=e.trim();return!t||t==="/"?"":t.replace(/\/+$/,"")}function y(e,t){let n=e.trim(),o=u(t);return!n||!o||X.test(n)||n.startsWith("/")||o!=="/"&&(n===o||n.startsWith(`${o}/`))?n:o==="/"?n.startsWith("/")?n:`/${n}`:n.startsWith("/")?`${o}${n}`:`${o}/${n}`}function v(e,t){if(!e)return;let n=u(e.basename)??u(t),o=u(e.routeBasePath),r=u(e.transportBasePath),i={...e,...n!==void 0?{basename:n}:{},...o!==void 0?{routeBasePath:o}:{},...r!==void 0?{transportBasePath:r}:{}};return i.favicon&&(i.favicon=y(i.favicon,n)),i.links&&(i.links=i.links.map(c=>({...c,href:y(c.href,n)}))),i}var d=require("react/jsx-runtime"),K={push:()=>{},replace:()=>{},refresh:()=>{}},p=typeof a.default.createContext=="function"?a.default.createContext(null):null,N="__WEBFRAMEZ_ROUTER__",V="[data-webframez-head='true']";function w(e){return u(e)??""}function J(e,t){return t?e===t?"/":e.startsWith(`${t}/`)?e.slice(t.length)||"/":e||"/":e||"/"}function k(e,t){let n=!t||t==="/"?"/":t.startsWith("/")?t:`/${t}`;return e?n==="/"?e:`${e}${n}`:n}function Q(){return w(typeof window>"u"?globalThis.__RSC_ROUTE_BASE_PATH:window.__RSC_ROUTE_BASE_PATH)}function H(e){if(typeof window>"u")return e||"/";let t=w(window.__RSC_BASENAME),n=Q(),o=J(e||"/",t);return k(n,o)}function U(e){if(typeof window>"u")return e;let t=window.__RSC_ENDPOINT;return typeof t=="string"&&t.trim()!==""?t:e}function ee(){return typeof window>"u"?null:window[N]??null}function te(e){typeof window>"u"||(window[N]=e)}function T(){let e={},t=typeof document>"u"?"":document.cookie;if(!t||t.trim()==="")return e;for(let n of t.split(";")){let o=n.trim();if(!o)continue;let r=o.indexOf("="),i=r>=0?o.slice(0,r).trim():o,c=r>=0?o.slice(r+1):"";i&&(e[i]=decodeURIComponent(c))}return e}function B(e,t,n={}){let o=[`${e}=${encodeURIComponent(t)}`];return n.path&&o.push(`Path=${n.path}`),n.domain&&o.push(`Domain=${n.domain}`),typeof n.maxAge=="number"&&o.push(`Max-Age=${Math.floor(n.maxAge)}`),n.expires&&o.push(`Expires=${n.expires.toUTCString()}`),n.sameSite&&o.push(`SameSite=${n.sameSite}`),n.secure&&o.push("Secure"),o.join("; ")}function ne(){return a.default.useMemo(()=>({all:()=>T(),get:e=>T()[e],set:(e,t,n)=>{typeof document>"u"||(document.cookie=B(e,t,n))},remove:(e,t)=>{typeof document>"u"||(document.cookie=B(e,"",{...t??{},maxAge:0}))}}),[])}function oe(){let e=p?a.default.useContext(p):null;if(!e){let t=ee();if(t)return t;if(typeof window>"u")return K;throw new Error("useRouter must be used inside mountWebframezClient()")}return e}function re({active:e}){return(0,d.jsx)("div",{style:{position:"fixed",top:0,left:0,width:"100%",height:3,zIndex:9999,transformOrigin:"left",transform:e?"scaleX(1)":"scaleX(0)",transition:"transform 180ms ease",background:"linear-gradient(90deg, #0ea5e9, #22c55e)"}})}function x(e){let t=document.createElement("meta");t.setAttribute("data-webframez-head","true");let n=Object.entries(e).filter(([,o])=>!!o);for(let[o,r]of n)t.setAttribute(o,String(r));document.head.appendChild(t)}function O(e){let t=document.createElement("link");t.setAttribute("data-webframez-head","true");let n=Object.entries(e).filter(([,o])=>!!o);for(let[o,r]of n)t.setAttribute(o,String(r));document.head.appendChild(t)}function I(e){if(typeof document>"u")return;let t=v(e)??e,n=u(t.basename),o=u(t.routeBasePath),r=u(t.transportBasePath);window.__RSC_BASENAME=n??"",window.__RSC_ROUTE_BASE_PATH=o??"",r!==void 0&&(window.__RSC_ENDPOINT=k(r,"/rsc")),document.title=t.title||"Webframez React";for(let i of document.head.querySelectorAll(V))i.remove();t.description&&x({name:"description",content:t.description}),t.favicon&&O({rel:"icon",href:t.favicon});for(let i of t.meta??[])x(i);for(let i of t.links??[])O(i)}function ie(e){let t=new TextEncoder;return new ReadableStream({start(n){n.enqueue(t.encode(e)),n.close()}})}function ae(){if(typeof window>"u")return null;let e=window.__RSC_INITIAL_PAYLOAD;return typeof e!="string"||e===""?null:(delete window.__RSC_INITIAL_PAYLOAD,(0,l.createFromReadableStream)(ie(e)))}function se(e){let t=U(e),n=H(window.location.pathname);return ae()??(0,l.createFromFetch)(fetch(`${t}?path=${encodeURIComponent(n)}&search=${encodeURIComponent(window.location.search)}`,{headers:{Accept:"text/x-component"}}))}function de(e,t){return function(){let o=a.default.use(e),[r,i]=(0,a.useState)(o.model),[c,R]=(0,a.useState)(o.head),[$,h]=(0,a.useState)(!1),[L,z]=(0,a.useState)(!1);async function f(s,E="push"){h(!0);try{let g=U(t),W=H(s.pathname),_=await(0,l.createFromFetch)(fetch(`${g}?path=${encodeURIComponent(W)}&search=${encodeURIComponent(s.search)}`,{headers:{Accept:"text/x-component"}}));I(_.head),R(_.head),i(_.model);let P=`${s.pathname}${s.search}`;E==="replace"?history.replaceState(null,"",P):E==="push"&&history.pushState(null,"",P)}catch(g){console.error("[webframez-react] Failed to render route",g),i((0,d.jsx)("p",{children:"Failed to load route."}))}finally{h(!1)}}(0,a.useEffect)(()=>{I(c)},[c]),(0,a.useEffect)(()=>{z(!0);let s=()=>{f(new URL(window.location.href),"none")};return window.addEventListener("popstate",s),()=>{window.removeEventListener("popstate",s)}},[]);let C=a.default.useMemo(()=>({push:s=>{f(new URL(s,window.location.origin),"push")},replace:s=>{f(new URL(s,window.location.origin),"replace")},refresh:()=>{f(new URL(window.location.href),"none")}}),[]);te(C);let A=(0,d.jsxs)(d.Fragment,{children:[L?(0,d.jsx)(re,{active:$}):null,r??(0,d.jsx)("p",{style:{padding:24},children:"Loading..."})]});return p?(0,d.jsx)(p.Provider,{value:C,children:A}):A}}function ue(e={}){let t=e.rootId??"root",n=document.getElementById(t);if(!n)throw new Error(`Missing #${t} element`);let o=typeof window<"u"&&window.__RSC_ENDPOINT,r=e.rscEndpoint??o??"/rsc",i=se(r),c=de(i,r);return(0,b.hydrateRoot)(n,(0,d.jsx)(c,{}))}
1
+ var ae=Object.create;var y=Object.defineProperty;var se=Object.getOwnPropertyDescriptor;var ce=Object.getOwnPropertyNames;var de=Object.getPrototypeOf,ue=Object.prototype.hasOwnProperty;var le=(e,t)=>{for(var n in t)y(e,n,{get:t[n],enumerable:!0})},L=(e,t,n,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of ce(t))!ue.call(e,r)&&r!==n&&y(e,r,{get:()=>t[r],enumerable:!(o=se(t,r))||o.enumerable});return e};var H=(e,t,n)=>(n=e!=null?ae(de(e)):{},L(t||!e||!e.__esModule?y(n,"default",{value:e,enumerable:!0}):n,e)),fe=e=>L(y({},"__esModule",{value:!0}),e);var ve={};le(ve,{mountWebframezClient:()=>xe,useCookie:()=>ye,useRouter:()=>Ee});module.exports=fe(ve);var s=H(require("react"),1),Y=require("react-dom/client"),g=require("react-server-dom-webpack/client"),Z=require("@webtypen/webframez-react/route-slot");var pe=/^(?:[a-zA-Z][a-zA-Z\d+\-.]*:|\/\/|#)/;function u(e){if(typeof e!="string")return;let t=e.trim();return!t||t==="/"?"":t.replace(/\/+$/,"")}function U(e,t){let n=e.trim(),o=u(t);return!n||!o||pe.test(n)||n.startsWith("/")||o!=="/"&&(n===o||n.startsWith(`${o}/`))?n:o==="/"?n.startsWith("/")?n:`/${n}`:n.startsWith("/")?`${o}${n}`:`${o}/${n}`}function S(e,t){if(!e)return;let n=u(e.basename)??u(t),o=u(e.routeBasePath),r=u(e.transportBasePath),a={...e,...n!==void 0?{basename:n}:{},...o!==void 0?{routeBasePath:o}:{},...r!==void 0?{transportBasePath:r}:{}};return a.favicon&&(a.favicon=U(a.favicon,n)),a.links&&(a.links=a.links.map(c=>({...c,href:U(c.href,n)}))),a}var R=H(require("react"),1),$="webframez-route-children",W="__webframezRouteChildren",D="WebframezRouteChildren",N=()=>R.default.createElement($);N.displayName=D;N[W]=!0;var me=N;function z(e){if(e===$||e===me)return!0;if(!e||typeof e!="function"&&typeof e!="object")return!1;try{let t=e;return t[W]===!0||t.displayName===D||t.name==="RouteChildren"}catch{return!1}}function M(e){if(!e||typeof e!="object")return!1;try{return"type"in e&&"props"in e}catch{return!1}}function E(e,t){if(e==null||typeof e=="boolean")return e;if(Array.isArray(e)){let m=!1,f=e.map(p=>{let h=E(p,t);return h!==p&&(m=!0),h});return m?f:e}if(M(e)&&z(e.type))return t;let n=R.default.isValidElement(e);if(!n&&!M(e))return e;if(n&&z(e.type))return t;let o=e.props??{};if(!("children"in o))return e;let r=E(o.children,t);if(r===o.children)return e;if(n)return Array.isArray(r)?R.default.cloneElement(e,void 0,...r):R.default.cloneElement(e,void 0,r);let a=e,c={...a.props??{},children:r,...a.key!==void 0&&a.key!==null?{key:a.key}:{}};return R.default.createElement(a.type,c)}var d=require("react/jsx-runtime"),Re={push:()=>{},replace:()=>{},refresh:()=>{},refreshContext:()=>{}},A=typeof s.default.createContext=="function"?s.default.createContext(null):null,K="__WEBFRAMEZ_ROUTER__",ge="[data-webframez-head='true']";function v(e){return u(e)??""}function he(e,t){return t?e===t?"/":e.startsWith(`${t}/`)?e.slice(t.length)||"/":e||"/":e||"/"}function V(e,t){let n=!t||t==="/"?"/":t.startsWith("/")?t:`/${t}`;return e?n==="/"?e:`${e}${n}`:n}function _e(){return v(typeof window>"u"?globalThis.__RSC_ROUTE_BASE_PATH:window.__RSC_ROUTE_BASE_PATH)}function X(e){if(typeof window>"u")return e||"/";let t=v(window.__RSC_BASENAME),n=_e(),o=he(e||"/",t);return V(n,o)}function J(e){if(typeof window>"u")return e;let t=window.__RSC_ENDPOINT;return typeof t=="string"&&t.trim()!==""?t:e}function we(){return typeof window>"u"?null:window[K]??null}function Ce(e){typeof window>"u"||(window[K]=e)}function F(){let e={},t=typeof document>"u"?"":document.cookie;if(!t||t.trim()==="")return e;for(let n of t.split(";")){let o=n.trim();if(!o)continue;let r=o.indexOf("="),a=r>=0?o.slice(0,r).trim():o,c=r>=0?o.slice(r+1):"";a&&(e[a]=decodeURIComponent(c))}return e}function j(e,t,n={}){let o=[`${e}=${encodeURIComponent(t)}`];return n.path&&o.push(`Path=${n.path}`),n.domain&&o.push(`Domain=${n.domain}`),typeof n.maxAge=="number"&&o.push(`Max-Age=${Math.floor(n.maxAge)}`),n.expires&&o.push(`Expires=${n.expires.toUTCString()}`),n.sameSite&&o.push(`SameSite=${n.sameSite}`),n.secure&&o.push("Secure"),o.join("; ")}function ye(){return s.default.useMemo(()=>({all:()=>F(),get:e=>F()[e],set:(e,t,n)=>{typeof document>"u"||(document.cookie=j(e,t,n))},remove:(e,t)=>{typeof document>"u"||(document.cookie=j(e,"",{...t??{},maxAge:0}))}}),[])}function Ee(){let e=A?s.default.useContext(A):null;if(!e){let t=we();if(t)return t;if(typeof window>"u")return Re;throw new Error("useRouter must be used inside mountWebframezClient()")}return e}function Ae({active:e}){return(0,d.jsx)("div",{style:{position:"fixed",top:0,left:0,width:"100%",height:3,zIndex:9999,transformOrigin:"left",transform:e?"scaleX(1)":"scaleX(0)",transition:"transform 180ms ease",background:"linear-gradient(90deg, #0ea5e9, #22c55e)"}})}function G(e){let t=document.createElement("meta");t.setAttribute("data-webframez-head","true");let n=Object.entries(e).filter(([,o])=>!!o);for(let[o,r]of n)t.setAttribute(o,String(r));document.head.appendChild(t)}function q(e){let t=document.createElement("link");t.setAttribute("data-webframez-head","true");let n=Object.entries(e).filter(([,o])=>!!o);for(let[o,r]of n)t.setAttribute(o,String(r));document.head.appendChild(t)}function x(e){if(typeof document>"u")return;let t=S(e)??e;Q(t),document.title=t.title||"Webframez React";for(let n of document.head.querySelectorAll(ge))n.remove();t.description&&G({name:"description",content:t.description}),t.favicon&&q({rel:"icon",href:t.favicon});for(let n of t.meta??[])G(n);for(let n of t.links??[])q(n)}function Q(e){if(typeof window>"u")return;let t=S(e)??e,n=u(t.basename),o=u(t.routeBasePath),r=u(t.transportBasePath);window.__RSC_BASENAME=n??"",window.__RSC_ROUTE_BASE_PATH=o??"",r!==void 0&&(window.__RSC_ENDPOINT=V(r,"/rsc"))}function Pe(e){let t=new TextEncoder;return new ReadableStream({start(n){n.enqueue(t.encode(e)),n.close()}})}function Te(){if(typeof window>"u")return null;let e=window.__RSC_INITIAL_PAYLOAD;return typeof e!="string"||e===""?null:(delete window.__RSC_INITIAL_PAYLOAD,(0,g.createFromReadableStream)(Pe(e)))}function Se(e){let t=J(e),n=X(window.location.pathname);return Te()??(0,g.createFromFetch)(fetch(`${t}?path=${encodeURIComponent(n)}&search=${encodeURIComponent(window.location.search)}`,{cache:"no-store",credentials:"same-origin",headers:{Accept:"text/x-component"}}))}function Ne(e,t){return function(){let o=s.default.use(e),r=typeof o.contextModel<"u"&&typeof o.pageModel<"u",[a,c]=(0,s.useState)(o.model),[m,f]=(0,s.useState)(o.contextModel),[p,h]=(0,s.useState)(o.pageModel),[I,b]=(0,s.useState)(o.head),[ee,_]=(0,s.useState)(!1),[te,ne]=(0,s.useState)(!1),[oe,P]=(0,s.useState)(r);async function O(i){let C=J(t),l=X(i.pathname);return await(0,g.createFromFetch)(fetch(`${C}?path=${encodeURIComponent(l)}&search=${encodeURIComponent(i.search)}`,{cache:"no-store",credentials:"same-origin",headers:{Accept:"text/x-component"}}))}async function w(i,C="push"){_(!0);try{let l=await O(i);x(l.head),b(l.head),c(l.model),f(l.contextModel),h(l.pageModel),P(!0);let T=`${i.pathname}${i.search}`;C==="replace"?history.replaceState(null,"",T):C==="push"&&history.pushState(null,"",T)}catch(l){console.error("[webframez-react] Failed to render route",l),c((0,d.jsx)("p",{children:"Failed to load route."}))}finally{_(!1)}}async function re(){_(!0);try{let i=await O(new URL(window.location.href));if(x(i.head),b(i.head),Object.prototype.hasOwnProperty.call(i,"contextModel")){f(i.contextModel),P(!0);return}c(i.model),P(!1)}catch(i){console.error("[webframez-react] Failed to refresh route context",i)}finally{_(!1)}}(0,s.useEffect)(()=>{x(I)},[I]),(0,s.useEffect)(()=>{ne(!0);let i=()=>{w(new URL(window.location.href),"none")};return window.addEventListener("popstate",i),()=>{window.removeEventListener("popstate",i)}},[]);let k=s.default.useMemo(()=>({push:i=>{w(new URL(i,window.location.origin),"push")},replace:i=>{w(new URL(i,window.location.origin),"replace")},refresh:()=>{w(new URL(window.location.href),"none")},refreshContext:()=>{re()}}),[]);Ce(k);let ie=oe&&typeof p<"u"?m?(0,d.jsx)(Z.RouteChildrenSlotProvider,{page:p,children:E(m,p)}):p:a,B=(0,d.jsxs)(d.Fragment,{children:[te?(0,d.jsx)(Ae,{active:ee}):null,ie??(0,d.jsx)("p",{style:{padding:24},children:"Loading..."})]});return A?(0,d.jsx)(A.Provider,{value:k,children:B}):B}}function xe(e={}){let t=e.rootId??"root",n=document.getElementById(t);if(!n)throw new Error(`Missing #${t} element`);let o=typeof window<"u"&&window.__RSC_ENDPOINT,r=e.rscEndpoint??o??"/rsc",a=Promise.resolve(Se(r)).then(f=>(f?.head&&Q(f.head),f)),c=Ne(a,r);return(0,Y.hydrateRoot)(n,(0,d.jsx)(c,{}))}
package/dist/client.d.ts CHANGED
@@ -9,6 +9,7 @@ export type RouterClient = {
9
9
  push: (href: string) => void;
10
10
  replace: (href: string) => void;
11
11
  refresh: () => void;
12
+ refreshContext: () => void;
12
13
  };
13
14
 
14
15
  export type CookieOptions = {
package/dist/client.js CHANGED
@@ -1 +1 @@
1
- import c,{useEffect as y,useState as f}from"react";import{hydrateRoot as M}from"react-dom/client";import{createFromFetch as I,createFromReadableStream as D}from"react-server-dom-webpack/client";var W=/^(?:[a-zA-Z][a-zA-Z\d+\-.]*:|\/\/|#)/;function s(e){if(typeof e!="string")return;let t=e.trim();return!t||t==="/"?"":t.replace(/\/+$/,"")}function P(e,t){let n=e.trim(),o=s(t);return!n||!o||W.test(n)||n.startsWith("/")||o!=="/"&&(n===o||n.startsWith(`${o}/`))?n:o==="/"?n.startsWith("/")?n:`/${n}`:n.startsWith("/")?`${o}${n}`:`${o}/${n}`}function S(e,t){if(!e)return;let n=s(e.basename)??s(t),o=s(e.routeBasePath),i=s(e.transportBasePath),r={...e,...n!==void 0?{basename:n}:{},...o!==void 0?{routeBasePath:o}:{},...i!==void 0?{transportBasePath:i}:{}};return r.favicon&&(r.favicon=P(r.favicon,n)),r.links&&(r.links=r.links.map(d=>({...d,href:P(d.href,n)}))),r}import{Fragment as ee,jsx as u,jsxs as te}from"react/jsx-runtime";var F={push:()=>{},replace:()=>{},refresh:()=>{}},m=typeof c.createContext=="function"?c.createContext(null):null,b="__WEBFRAMEZ_ROUTER__",q="[data-webframez-head='true']";function _(e){return s(e)??""}function G(e,t){return t?e===t?"/":e.startsWith(`${t}/`)?e.slice(t.length)||"/":e||"/":e||"/"}function N(e,t){let n=!t||t==="/"?"/":t.startsWith("/")?t:`/${t}`;return e?n==="/"?e:`${e}${n}`:n}function Y(){return _(typeof window>"u"?globalThis.__RSC_ROUTE_BASE_PATH:window.__RSC_ROUTE_BASE_PATH)}function k(e){if(typeof window>"u")return e||"/";let t=_(window.__RSC_BASENAME),n=Y(),o=G(e||"/",t);return N(n,o)}function H(e){if(typeof window>"u")return e;let t=window.__RSC_ENDPOINT;return typeof t=="string"&&t.trim()!==""?t:e}function Z(){return typeof window>"u"?null:window[b]??null}function j(e){typeof window>"u"||(window[b]=e)}function v(){let e={},t=typeof document>"u"?"":document.cookie;if(!t||t.trim()==="")return e;for(let n of t.split(";")){let o=n.trim();if(!o)continue;let i=o.indexOf("="),r=i>=0?o.slice(0,i).trim():o,d=i>=0?o.slice(i+1):"";r&&(e[r]=decodeURIComponent(d))}return e}function T(e,t,n={}){let o=[`${e}=${encodeURIComponent(t)}`];return n.path&&o.push(`Path=${n.path}`),n.domain&&o.push(`Domain=${n.domain}`),typeof n.maxAge=="number"&&o.push(`Max-Age=${Math.floor(n.maxAge)}`),n.expires&&o.push(`Expires=${n.expires.toUTCString()}`),n.sameSite&&o.push(`SameSite=${n.sameSite}`),n.secure&&o.push("Secure"),o.join("; ")}function de(){return c.useMemo(()=>({all:()=>v(),get:e=>v()[e],set:(e,t,n)=>{typeof document>"u"||(document.cookie=T(e,t,n))},remove:(e,t)=>{typeof document>"u"||(document.cookie=T(e,"",{...t??{},maxAge:0}))}}),[])}function ue(){let e=m?c.useContext(m):null;if(!e){let t=Z();if(t)return t;if(typeof window>"u")return F;throw new Error("useRouter must be used inside mountWebframezClient()")}return e}function X({active:e}){return u("div",{style:{position:"fixed",top:0,left:0,width:"100%",height:3,zIndex:9999,transformOrigin:"left",transform:e?"scaleX(1)":"scaleX(0)",transition:"transform 180ms ease",background:"linear-gradient(90deg, #0ea5e9, #22c55e)"}})}function B(e){let t=document.createElement("meta");t.setAttribute("data-webframez-head","true");let n=Object.entries(e).filter(([,o])=>!!o);for(let[o,i]of n)t.setAttribute(o,String(i));document.head.appendChild(t)}function x(e){let t=document.createElement("link");t.setAttribute("data-webframez-head","true");let n=Object.entries(e).filter(([,o])=>!!o);for(let[o,i]of n)t.setAttribute(o,String(i));document.head.appendChild(t)}function O(e){if(typeof document>"u")return;let t=S(e)??e,n=s(t.basename),o=s(t.routeBasePath),i=s(t.transportBasePath);window.__RSC_BASENAME=n??"",window.__RSC_ROUTE_BASE_PATH=o??"",i!==void 0&&(window.__RSC_ENDPOINT=N(i,"/rsc")),document.title=t.title||"Webframez React";for(let r of document.head.querySelectorAll(q))r.remove();t.description&&B({name:"description",content:t.description}),t.favicon&&x({rel:"icon",href:t.favicon});for(let r of t.meta??[])B(r);for(let r of t.links??[])x(r)}function K(e){let t=new TextEncoder;return new ReadableStream({start(n){n.enqueue(t.encode(e)),n.close()}})}function V(){if(typeof window>"u")return null;let e=window.__RSC_INITIAL_PAYLOAD;return typeof e!="string"||e===""?null:(delete window.__RSC_INITIAL_PAYLOAD,D(K(e)))}function J(e){let t=H(e),n=k(window.location.pathname);return V()??I(fetch(`${t}?path=${encodeURIComponent(n)}&search=${encodeURIComponent(window.location.search)}`,{headers:{Accept:"text/x-component"}}))}function Q(e,t){return function(){let o=c.use(e),[i,r]=f(o.model),[d,w]=f(o.head),[U,R]=f(!1),[$,L]=f(!1);async function l(a,A="push"){R(!0);try{let p=H(t),z=k(a.pathname),g=await I(fetch(`${p}?path=${encodeURIComponent(z)}&search=${encodeURIComponent(a.search)}`,{headers:{Accept:"text/x-component"}}));O(g.head),w(g.head),r(g.model);let E=`${a.pathname}${a.search}`;A==="replace"?history.replaceState(null,"",E):A==="push"&&history.pushState(null,"",E)}catch(p){console.error("[webframez-react] Failed to render route",p),r(u("p",{children:"Failed to load route."}))}finally{R(!1)}}y(()=>{O(d)},[d]),y(()=>{L(!0);let a=()=>{l(new URL(window.location.href),"none")};return window.addEventListener("popstate",a),()=>{window.removeEventListener("popstate",a)}},[]);let h=c.useMemo(()=>({push:a=>{l(new URL(a,window.location.origin),"push")},replace:a=>{l(new URL(a,window.location.origin),"replace")},refresh:()=>{l(new URL(window.location.href),"none")}}),[]);j(h);let C=te(ee,{children:[$?u(X,{active:U}):null,i??u("p",{style:{padding:24},children:"Loading..."})]});return m?u(m.Provider,{value:h,children:C}):C}}function ce(e={}){let t=e.rootId??"root",n=document.getElementById(t);if(!n)throw new Error(`Missing #${t} element`);let o=typeof window<"u"&&window.__RSC_ENDPOINT,i=e.rscEndpoint??o??"/rsc",r=J(i),d=Q(r,i);return M(n,u(d,{}))}export{ce as mountWebframezClient,de as useCookie,ue as useRouter};
1
+ import R,{useEffect as $,useState as f}from"react";import{hydrateRoot as ie}from"react-dom/client";import{createFromFetch as G,createFromReadableStream as ae}from"react-server-dom-webpack/client";import{RouteChildrenSlotProvider as se}from"@webtypen/webframez-react/route-slot";var oe=/^(?:[a-zA-Z][a-zA-Z\d+\-.]*:|\/\/|#)/;function c(e){if(typeof e!="string")return;let t=e.trim();return!t||t==="/"?"":t.replace(/\/+$/,"")}function B(e,t){let n=e.trim(),o=c(t);return!n||!o||oe.test(n)||n.startsWith("/")||o!=="/"&&(n===o||n.startsWith(`${o}/`))?n:o==="/"?n.startsWith("/")?n:`/${n}`:n.startsWith("/")?`${o}${n}`:`${o}/${n}`}function T(e,t){if(!e)return;let n=c(e.basename)??c(t),o=c(e.routeBasePath),r=c(e.transportBasePath),a={...e,...n!==void 0?{basename:n}:{},...o!==void 0?{routeBasePath:o}:{},...r!==void 0?{transportBasePath:r}:{}};return a.favicon&&(a.favicon=B(a.favicon,n)),a.links&&(a.links=a.links.map(s=>({...s,href:B(s.href,n)}))),a}import g from"react";var U="webframez-route-children",z="__webframezRouteChildren",M="WebframezRouteChildren",S=()=>g.createElement(U);S.displayName=M;S[z]=!0;var re=S;function L(e){if(e===U||e===re)return!0;if(!e||typeof e!="function"&&typeof e!="object")return!1;try{let t=e;return t[z]===!0||t.displayName===M||t.name==="RouteChildren"}catch{return!1}}function H(e){if(!e||typeof e!="object")return!1;try{return"type"in e&&"props"in e}catch{return!1}}function y(e,t){if(e==null||typeof e=="boolean")return e;if(Array.isArray(e)){let m=!1,u=e.map(l=>{let h=y(l,t);return h!==l&&(m=!0),h});return m?u:e}if(H(e)&&L(e.type))return t;let n=g.isValidElement(e);if(!n&&!H(e))return e;if(n&&L(e.type))return t;let o=e.props??{};if(!("children"in o))return e;let r=y(o.children,t);if(r===o.children)return e;if(n)return Array.isArray(r)?g.cloneElement(e,void 0,...r):g.cloneElement(e,void 0,r);let a=e,s={...a.props??{},children:r,...a.key!==void 0&&a.key!==null?{key:a.key}:{}};return g.createElement(a.type,s)}import{Fragment as we,jsx as p,jsxs as Ce}from"react/jsx-runtime";var ce={push:()=>{},replace:()=>{},refresh:()=>{},refreshContext:()=>{}},E=typeof R.createContext=="function"?R.createContext(null):null,q="__WEBFRAMEZ_ROUTER__",de="[data-webframez-head='true']";function x(e){return c(e)??""}function ue(e,t){return t?e===t?"/":e.startsWith(`${t}/`)?e.slice(t.length)||"/":e||"/":e||"/"}function Y(e,t){let n=!t||t==="/"?"/":t.startsWith("/")?t:`/${t}`;return e?n==="/"?e:`${e}${n}`:n}function le(){return x(typeof window>"u"?globalThis.__RSC_ROUTE_BASE_PATH:window.__RSC_ROUTE_BASE_PATH)}function Z(e){if(typeof window>"u")return e||"/";let t=x(window.__RSC_BASENAME),n=le(),o=ue(e||"/",t);return Y(n,o)}function K(e){if(typeof window>"u")return e;let t=window.__RSC_ENDPOINT;return typeof t=="string"&&t.trim()!==""?t:e}function fe(){return typeof window>"u"?null:window[q]??null}function pe(e){typeof window>"u"||(window[q]=e)}function W(){let e={},t=typeof document>"u"?"":document.cookie;if(!t||t.trim()==="")return e;for(let n of t.split(";")){let o=n.trim();if(!o)continue;let r=o.indexOf("="),a=r>=0?o.slice(0,r).trim():o,s=r>=0?o.slice(r+1):"";a&&(e[a]=decodeURIComponent(s))}return e}function D(e,t,n={}){let o=[`${e}=${encodeURIComponent(t)}`];return n.path&&o.push(`Path=${n.path}`),n.domain&&o.push(`Domain=${n.domain}`),typeof n.maxAge=="number"&&o.push(`Max-Age=${Math.floor(n.maxAge)}`),n.expires&&o.push(`Expires=${n.expires.toUTCString()}`),n.sameSite&&o.push(`SameSite=${n.sameSite}`),n.secure&&o.push("Secure"),o.join("; ")}function Ie(){return R.useMemo(()=>({all:()=>W(),get:e=>W()[e],set:(e,t,n)=>{typeof document>"u"||(document.cookie=D(e,t,n))},remove:(e,t)=>{typeof document>"u"||(document.cookie=D(e,"",{...t??{},maxAge:0}))}}),[])}function be(){let e=E?R.useContext(E):null;if(!e){let t=fe();if(t)return t;if(typeof window>"u")return ce;throw new Error("useRouter must be used inside mountWebframezClient()")}return e}function me({active:e}){return p("div",{style:{position:"fixed",top:0,left:0,width:"100%",height:3,zIndex:9999,transformOrigin:"left",transform:e?"scaleX(1)":"scaleX(0)",transition:"transform 180ms ease",background:"linear-gradient(90deg, #0ea5e9, #22c55e)"}})}function F(e){let t=document.createElement("meta");t.setAttribute("data-webframez-head","true");let n=Object.entries(e).filter(([,o])=>!!o);for(let[o,r]of n)t.setAttribute(o,String(r));document.head.appendChild(t)}function j(e){let t=document.createElement("link");t.setAttribute("data-webframez-head","true");let n=Object.entries(e).filter(([,o])=>!!o);for(let[o,r]of n)t.setAttribute(o,String(r));document.head.appendChild(t)}function N(e){if(typeof document>"u")return;let t=T(e)??e;V(t),document.title=t.title||"Webframez React";for(let n of document.head.querySelectorAll(de))n.remove();t.description&&F({name:"description",content:t.description}),t.favicon&&j({rel:"icon",href:t.favicon});for(let n of t.meta??[])F(n);for(let n of t.links??[])j(n)}function V(e){if(typeof window>"u")return;let t=T(e)??e,n=c(t.basename),o=c(t.routeBasePath),r=c(t.transportBasePath);window.__RSC_BASENAME=n??"",window.__RSC_ROUTE_BASE_PATH=o??"",r!==void 0&&(window.__RSC_ENDPOINT=Y(r,"/rsc"))}function Re(e){let t=new TextEncoder;return new ReadableStream({start(n){n.enqueue(t.encode(e)),n.close()}})}function ge(){if(typeof window>"u")return null;let e=window.__RSC_INITIAL_PAYLOAD;return typeof e!="string"||e===""?null:(delete window.__RSC_INITIAL_PAYLOAD,ae(Re(e)))}function he(e){let t=K(e),n=Z(window.location.pathname);return ge()??G(fetch(`${t}?path=${encodeURIComponent(n)}&search=${encodeURIComponent(window.location.search)}`,{cache:"no-store",credentials:"same-origin",headers:{Accept:"text/x-component"}}))}function _e(e,t){return function(){let o=R.use(e),r=typeof o.contextModel<"u"&&typeof o.pageModel<"u",[a,s]=f(o.model),[m,u]=f(o.contextModel),[l,h]=f(o.pageModel),[v,I]=f(o.head),[X,_]=f(!1),[J,Q]=f(!1),[ee,A]=f(r);async function b(i){let C=K(t),d=Z(i.pathname);return await G(fetch(`${C}?path=${encodeURIComponent(d)}&search=${encodeURIComponent(i.search)}`,{cache:"no-store",credentials:"same-origin",headers:{Accept:"text/x-component"}}))}async function w(i,C="push"){_(!0);try{let d=await b(i);N(d.head),I(d.head),s(d.model),u(d.contextModel),h(d.pageModel),A(!0);let P=`${i.pathname}${i.search}`;C==="replace"?history.replaceState(null,"",P):C==="push"&&history.pushState(null,"",P)}catch(d){console.error("[webframez-react] Failed to render route",d),s(p("p",{children:"Failed to load route."}))}finally{_(!1)}}async function te(){_(!0);try{let i=await b(new URL(window.location.href));if(N(i.head),I(i.head),Object.prototype.hasOwnProperty.call(i,"contextModel")){u(i.contextModel),A(!0);return}s(i.model),A(!1)}catch(i){console.error("[webframez-react] Failed to refresh route context",i)}finally{_(!1)}}$(()=>{N(v)},[v]),$(()=>{Q(!0);let i=()=>{w(new URL(window.location.href),"none")};return window.addEventListener("popstate",i),()=>{window.removeEventListener("popstate",i)}},[]);let O=R.useMemo(()=>({push:i=>{w(new URL(i,window.location.origin),"push")},replace:i=>{w(new URL(i,window.location.origin),"replace")},refresh:()=>{w(new URL(window.location.href),"none")},refreshContext:()=>{te()}}),[]);pe(O);let ne=ee&&typeof l<"u"?m?p(se,{page:l,children:y(m,l)}):l:a,k=Ce(we,{children:[J?p(me,{active:X}):null,ne??p("p",{style:{padding:24},children:"Loading..."})]});return E?p(E.Provider,{value:O,children:k}):k}}function Oe(e={}){let t=e.rootId??"root",n=document.getElementById(t);if(!n)throw new Error(`Missing #${t} element`);let o=typeof window<"u"&&window.__RSC_ENDPOINT,r=e.rscEndpoint??o??"/rsc",a=Promise.resolve(he(r)).then(u=>(u?.head&&V(u.head),u)),s=_e(a,r);return ie(n,p(s,{}))}export{Oe as mountWebframezClient,Ie as useCookie,be as useRouter};
package/dist/http.cjs CHANGED
@@ -142,6 +142,7 @@ function sendRSC(res, model, options = {}) {
142
142
  } = options;
143
143
  res.statusCode = statusCode;
144
144
  res.setHeader("Content-Type", contentType);
145
+ res.setHeader("Cache-Control", "no-store, no-cache, must-revalidate, proxy-revalidate");
145
146
  const stream = (0, import_server.renderToPipeableStream)(model, moduleMap, { onError });
146
147
  stream.pipe(res);
147
148
  return stream;
@@ -151,6 +152,7 @@ function sendRSC(res, model, options = {}) {
151
152
  var import_node_fs = __toESM(require("node:fs"), 1);
152
153
  var import_node_module2 = __toESM(require("node:module"), 1);
153
154
  var import_node_path2 = __toESM(require("node:path"), 1);
155
+ var import_route_slot = require("@webtypen/webframez-react/route-slot");
154
156
 
155
157
  // src/head.ts
156
158
  var ABSOLUTE_ASSET_URL_PATTERN = /^(?:[a-zA-Z][a-zA-Z\d+\-.]*:|\/\/|#)/;
@@ -240,6 +242,16 @@ function isRouteChildrenType(type) {
240
242
  return false;
241
243
  }
242
244
  }
245
+ function isReactElementLike(node) {
246
+ if (!node || typeof node !== "object") {
247
+ return false;
248
+ }
249
+ try {
250
+ return "type" in node && "props" in node;
251
+ } catch {
252
+ return false;
253
+ }
254
+ }
243
255
  function injectRouteChildren(node, routeChildren) {
244
256
  if (node === null || node === void 0 || typeof node === "boolean") {
245
257
  return node;
@@ -255,13 +267,17 @@ function injectRouteChildren(node, routeChildren) {
255
267
  });
256
268
  return changed ? next : node;
257
269
  }
258
- if (!import_react.default.isValidElement(node)) {
270
+ if (isReactElementLike(node) && isRouteChildrenType(node.type)) {
271
+ return routeChildren;
272
+ }
273
+ const isValidElement = import_react.default.isValidElement(node);
274
+ if (!isValidElement && !isReactElementLike(node)) {
259
275
  return node;
260
276
  }
261
- if (isRouteChildrenType(node.type)) {
277
+ if (isValidElement && isRouteChildrenType(node.type)) {
262
278
  return routeChildren;
263
279
  }
264
- const props = node.props;
280
+ const props = node.props ?? {};
265
281
  if (!("children" in props)) {
266
282
  return node;
267
283
  }
@@ -269,10 +285,19 @@ function injectRouteChildren(node, routeChildren) {
269
285
  if (nextChildren === props.children) {
270
286
  return node;
271
287
  }
272
- if (Array.isArray(nextChildren)) {
273
- return import_react.default.cloneElement(node, void 0, ...nextChildren);
288
+ if (isValidElement) {
289
+ if (Array.isArray(nextChildren)) {
290
+ return import_react.default.cloneElement(node, void 0, ...nextChildren);
291
+ }
292
+ return import_react.default.cloneElement(node, void 0, nextChildren);
274
293
  }
275
- return import_react.default.cloneElement(node, void 0, nextChildren);
294
+ const elementLike = node;
295
+ const nextProps = {
296
+ ...elementLike.props ?? {},
297
+ children: nextChildren,
298
+ ...elementLike.key !== void 0 && elementLike.key !== null ? { key: elementLike.key } : {}
299
+ };
300
+ return import_react.default.createElement(elementLike.type, nextProps);
276
301
  }
277
302
 
278
303
  // src/file-router.tsx
@@ -613,9 +638,12 @@ function createFileRouter(options) {
613
638
  const errorHead = await resolveHead(errorModule, errorProps);
614
639
  const layoutNode = layoutModule ? await layoutModule.default(context) : null;
615
640
  const model = layoutNode ? injectRouteChildren(layoutNode, errorNode) : errorNode;
641
+ const contextModel = layoutNode ? injectRouteChildren(layoutNode, /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_route_slot.RouteChildrenSlot, {})) : void 0;
616
642
  return {
617
643
  statusCode,
618
644
  model,
645
+ contextModel,
646
+ pageModel: errorNode,
619
647
  head: mergeHead(layoutHead, errorHead)
620
648
  };
621
649
  }
@@ -735,9 +763,12 @@ function createFileRouter(options) {
735
763
  const pageHead = await resolveHead(pageModule, pageContext);
736
764
  const layoutNode = layoutModule ? await layoutModule.default(pageContext) : null;
737
765
  const model = layoutNode ? injectRouteChildren(layoutNode, pageNode) : pageNode;
766
+ const contextModel = layoutNode ? injectRouteChildren(layoutNode, /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_route_slot.RouteChildrenSlot, {})) : void 0;
738
767
  return {
739
768
  statusCode: 200,
740
769
  model,
770
+ contextModel,
771
+ pageModel: pageNode,
741
772
  head: mergeHead(layoutHead, pageHead)
742
773
  };
743
774
  } catch (error) {
@@ -917,7 +948,21 @@ async function renderHtmlFromFlightData(flightData, moduleMap) {
917
948
  ? payload.model
918
949
  : payload;
919
950
 
920
- return renderHtml(model);
951
+ const basename =
952
+ payload &&
953
+ typeof payload === "object" &&
954
+ payload.head &&
955
+ typeof payload.head.basename === "string"
956
+ ? payload.head.basename
957
+ : "";
958
+
959
+ const previousBasename = globalThis.__RSC_BASENAME;
960
+ globalThis.__RSC_BASENAME = basename;
961
+ try {
962
+ return await renderHtml(model);
963
+ } finally {
964
+ globalThis.__RSC_BASENAME = previousBasename;
965
+ }
921
966
  }
922
967
 
923
968
  process.on("message", async (message) => {
@@ -1254,16 +1299,16 @@ function createServerConsumerManifest(manifest) {
1254
1299
  }
1255
1300
  return requestKey;
1256
1301
  };
1257
- const addReference = (lookupKey, reference) => {
1302
+ const addReference = (lookupKey, exportName, reference) => {
1258
1303
  if (!lookupKey || lookupKey.trim() === "") {
1259
1304
  return;
1260
1305
  }
1261
- if (lookupKey in consumerManifest) {
1306
+ const normalizedExportName = exportName || "*";
1307
+ consumerManifest[lookupKey] ??= {};
1308
+ if (normalizedExportName in consumerManifest[lookupKey]) {
1262
1309
  return;
1263
1310
  }
1264
- consumerManifest[lookupKey] = {
1265
- "*": reference
1266
- };
1311
+ consumerManifest[lookupKey][normalizedExportName] = reference;
1267
1312
  };
1268
1313
  for (const [key, value] of Object.entries(manifest)) {
1269
1314
  if (!value || typeof value !== "object") {
@@ -1280,9 +1325,35 @@ function createServerConsumerManifest(manifest) {
1280
1325
  name: entry.name ?? "*",
1281
1326
  ...entry.async ? { async: entry.async } : {}
1282
1327
  };
1283
- addReference(key, reference);
1328
+ const hashIndex = key.lastIndexOf("#");
1329
+ const keyWithoutExport = hashIndex > -1 ? key.slice(0, hashIndex) : key;
1330
+ const keyExportName = hashIndex > -1 ? key.slice(hashIndex + 1) : "";
1331
+ const manifestExportName = typeof entry.name === "string" && entry.name !== "*" ? entry.name : "";
1332
+ const exportNames = new Set(
1333
+ [keyExportName, manifestExportName].filter((name) => name.trim() !== "")
1334
+ );
1335
+ addReference(
1336
+ key,
1337
+ "*",
1338
+ keyExportName ? { ...reference, name: keyExportName } : reference
1339
+ );
1340
+ addReference(keyWithoutExport, "*", reference);
1341
+ for (const exportName of exportNames) {
1342
+ const exportReference = {
1343
+ ...reference,
1344
+ name: exportName
1345
+ };
1346
+ addReference(keyWithoutExport, exportName, exportReference);
1347
+ addReference(key, "*", exportReference);
1348
+ }
1284
1349
  if (typeof entry.id === "number" && Number.isFinite(entry.id)) {
1285
- addReference(String(entry.id), reference);
1350
+ addReference(String(entry.id), "*", reference);
1351
+ for (const exportName of exportNames) {
1352
+ addReference(String(entry.id), exportName, {
1353
+ ...reference,
1354
+ name: exportName
1355
+ });
1356
+ }
1286
1357
  }
1287
1358
  }
1288
1359
  return consumerManifest;
@@ -1384,6 +1455,8 @@ function createNodeRequestHandler(options) {
1384
1455
  );
1385
1456
  const payload = {
1386
1457
  model: resolved2.model,
1458
+ contextModel: resolved2.contextModel,
1459
+ pageModel: resolved2.pageModel,
1387
1460
  head: resolved2.head
1388
1461
  };
1389
1462
  sendRSC(res, payload, {
@@ -1406,6 +1479,7 @@ function createNodeRequestHandler(options) {
1406
1479
  } else if (ext === ".json") {
1407
1480
  res.setHeader("Content-Type", "application/json; charset=utf-8");
1408
1481
  }
1482
+ res.setHeader("Cache-Control", "no-store, no-cache, must-revalidate, proxy-revalidate");
1409
1483
  const stream = import_node_fs2.default.createReadStream(filePath);
1410
1484
  stream.on("error", () => {
1411
1485
  res.statusCode = 404;
@@ -1429,6 +1503,8 @@ function createNodeRequestHandler(options) {
1429
1503
  );
1430
1504
  const initialPayload = {
1431
1505
  model: resolved.model,
1506
+ contextModel: resolved.contextModel,
1507
+ pageModel: resolved.pageModel,
1432
1508
  head: resolved.head
1433
1509
  };
1434
1510
  const initialFlightData = await renderRSCToString(initialPayload, {
package/dist/http.js CHANGED
@@ -117,6 +117,7 @@ function sendRSC(res, model, options = {}) {
117
117
  } = options;
118
118
  res.statusCode = statusCode;
119
119
  res.setHeader("Content-Type", contentType);
120
+ res.setHeader("Cache-Control", "no-store, no-cache, must-revalidate, proxy-revalidate");
120
121
  const stream = renderToPipeableStream(model, moduleMap, { onError });
121
122
  stream.pipe(res);
122
123
  return stream;
@@ -126,6 +127,7 @@ function sendRSC(res, model, options = {}) {
126
127
  import fs from "node:fs";
127
128
  import Module from "node:module";
128
129
  import path2 from "node:path";
130
+ import { RouteChildrenSlot } from "@webtypen/webframez-react/route-slot";
129
131
 
130
132
  // src/head.ts
131
133
  var ABSOLUTE_ASSET_URL_PATTERN = /^(?:[a-zA-Z][a-zA-Z\d+\-.]*:|\/\/|#)/;
@@ -215,6 +217,16 @@ function isRouteChildrenType(type) {
215
217
  return false;
216
218
  }
217
219
  }
220
+ function isReactElementLike(node) {
221
+ if (!node || typeof node !== "object") {
222
+ return false;
223
+ }
224
+ try {
225
+ return "type" in node && "props" in node;
226
+ } catch {
227
+ return false;
228
+ }
229
+ }
218
230
  function injectRouteChildren(node, routeChildren) {
219
231
  if (node === null || node === void 0 || typeof node === "boolean") {
220
232
  return node;
@@ -230,13 +242,17 @@ function injectRouteChildren(node, routeChildren) {
230
242
  });
231
243
  return changed ? next : node;
232
244
  }
233
- if (!React.isValidElement(node)) {
245
+ if (isReactElementLike(node) && isRouteChildrenType(node.type)) {
246
+ return routeChildren;
247
+ }
248
+ const isValidElement = React.isValidElement(node);
249
+ if (!isValidElement && !isReactElementLike(node)) {
234
250
  return node;
235
251
  }
236
- if (isRouteChildrenType(node.type)) {
252
+ if (isValidElement && isRouteChildrenType(node.type)) {
237
253
  return routeChildren;
238
254
  }
239
- const props = node.props;
255
+ const props = node.props ?? {};
240
256
  if (!("children" in props)) {
241
257
  return node;
242
258
  }
@@ -244,10 +260,19 @@ function injectRouteChildren(node, routeChildren) {
244
260
  if (nextChildren === props.children) {
245
261
  return node;
246
262
  }
247
- if (Array.isArray(nextChildren)) {
248
- return React.cloneElement(node, void 0, ...nextChildren);
263
+ if (isValidElement) {
264
+ if (Array.isArray(nextChildren)) {
265
+ return React.cloneElement(node, void 0, ...nextChildren);
266
+ }
267
+ return React.cloneElement(node, void 0, nextChildren);
249
268
  }
250
- return React.cloneElement(node, void 0, nextChildren);
269
+ const elementLike = node;
270
+ const nextProps = {
271
+ ...elementLike.props ?? {},
272
+ children: nextChildren,
273
+ ...elementLike.key !== void 0 && elementLike.key !== null ? { key: elementLike.key } : {}
274
+ };
275
+ return React.createElement(elementLike.type, nextProps);
251
276
  }
252
277
 
253
278
  // src/file-router.tsx
@@ -588,9 +613,12 @@ function createFileRouter(options) {
588
613
  const errorHead = await resolveHead(errorModule, errorProps);
589
614
  const layoutNode = layoutModule ? await layoutModule.default(context) : null;
590
615
  const model = layoutNode ? injectRouteChildren(layoutNode, errorNode) : errorNode;
616
+ const contextModel = layoutNode ? injectRouteChildren(layoutNode, /* @__PURE__ */ jsx(RouteChildrenSlot, {})) : void 0;
591
617
  return {
592
618
  statusCode,
593
619
  model,
620
+ contextModel,
621
+ pageModel: errorNode,
594
622
  head: mergeHead(layoutHead, errorHead)
595
623
  };
596
624
  }
@@ -710,9 +738,12 @@ function createFileRouter(options) {
710
738
  const pageHead = await resolveHead(pageModule, pageContext);
711
739
  const layoutNode = layoutModule ? await layoutModule.default(pageContext) : null;
712
740
  const model = layoutNode ? injectRouteChildren(layoutNode, pageNode) : pageNode;
741
+ const contextModel = layoutNode ? injectRouteChildren(layoutNode, /* @__PURE__ */ jsx(RouteChildrenSlot, {})) : void 0;
713
742
  return {
714
743
  statusCode: 200,
715
744
  model,
745
+ contextModel,
746
+ pageModel: pageNode,
716
747
  head: mergeHead(layoutHead, pageHead)
717
748
  };
718
749
  } catch (error) {
@@ -892,7 +923,21 @@ async function renderHtmlFromFlightData(flightData, moduleMap) {
892
923
  ? payload.model
893
924
  : payload;
894
925
 
895
- return renderHtml(model);
926
+ const basename =
927
+ payload &&
928
+ typeof payload === "object" &&
929
+ payload.head &&
930
+ typeof payload.head.basename === "string"
931
+ ? payload.head.basename
932
+ : "";
933
+
934
+ const previousBasename = globalThis.__RSC_BASENAME;
935
+ globalThis.__RSC_BASENAME = basename;
936
+ try {
937
+ return await renderHtml(model);
938
+ } finally {
939
+ globalThis.__RSC_BASENAME = previousBasename;
940
+ }
896
941
  }
897
942
 
898
943
  process.on("message", async (message) => {
@@ -1229,16 +1274,16 @@ function createServerConsumerManifest(manifest) {
1229
1274
  }
1230
1275
  return requestKey;
1231
1276
  };
1232
- const addReference = (lookupKey, reference) => {
1277
+ const addReference = (lookupKey, exportName, reference) => {
1233
1278
  if (!lookupKey || lookupKey.trim() === "") {
1234
1279
  return;
1235
1280
  }
1236
- if (lookupKey in consumerManifest) {
1281
+ const normalizedExportName = exportName || "*";
1282
+ consumerManifest[lookupKey] ??= {};
1283
+ if (normalizedExportName in consumerManifest[lookupKey]) {
1237
1284
  return;
1238
1285
  }
1239
- consumerManifest[lookupKey] = {
1240
- "*": reference
1241
- };
1286
+ consumerManifest[lookupKey][normalizedExportName] = reference;
1242
1287
  };
1243
1288
  for (const [key, value] of Object.entries(manifest)) {
1244
1289
  if (!value || typeof value !== "object") {
@@ -1255,9 +1300,35 @@ function createServerConsumerManifest(manifest) {
1255
1300
  name: entry.name ?? "*",
1256
1301
  ...entry.async ? { async: entry.async } : {}
1257
1302
  };
1258
- addReference(key, reference);
1303
+ const hashIndex = key.lastIndexOf("#");
1304
+ const keyWithoutExport = hashIndex > -1 ? key.slice(0, hashIndex) : key;
1305
+ const keyExportName = hashIndex > -1 ? key.slice(hashIndex + 1) : "";
1306
+ const manifestExportName = typeof entry.name === "string" && entry.name !== "*" ? entry.name : "";
1307
+ const exportNames = new Set(
1308
+ [keyExportName, manifestExportName].filter((name) => name.trim() !== "")
1309
+ );
1310
+ addReference(
1311
+ key,
1312
+ "*",
1313
+ keyExportName ? { ...reference, name: keyExportName } : reference
1314
+ );
1315
+ addReference(keyWithoutExport, "*", reference);
1316
+ for (const exportName of exportNames) {
1317
+ const exportReference = {
1318
+ ...reference,
1319
+ name: exportName
1320
+ };
1321
+ addReference(keyWithoutExport, exportName, exportReference);
1322
+ addReference(key, "*", exportReference);
1323
+ }
1259
1324
  if (typeof entry.id === "number" && Number.isFinite(entry.id)) {
1260
- addReference(String(entry.id), reference);
1325
+ addReference(String(entry.id), "*", reference);
1326
+ for (const exportName of exportNames) {
1327
+ addReference(String(entry.id), exportName, {
1328
+ ...reference,
1329
+ name: exportName
1330
+ });
1331
+ }
1261
1332
  }
1262
1333
  }
1263
1334
  return consumerManifest;
@@ -1359,6 +1430,8 @@ function createNodeRequestHandler(options) {
1359
1430
  );
1360
1431
  const payload = {
1361
1432
  model: resolved2.model,
1433
+ contextModel: resolved2.contextModel,
1434
+ pageModel: resolved2.pageModel,
1362
1435
  head: resolved2.head
1363
1436
  };
1364
1437
  sendRSC(res, payload, {
@@ -1381,6 +1454,7 @@ function createNodeRequestHandler(options) {
1381
1454
  } else if (ext === ".json") {
1382
1455
  res.setHeader("Content-Type", "application/json; charset=utf-8");
1383
1456
  }
1457
+ res.setHeader("Cache-Control", "no-store, no-cache, must-revalidate, proxy-revalidate");
1384
1458
  const stream = fs2.createReadStream(filePath);
1385
1459
  stream.on("error", () => {
1386
1460
  res.statusCode = 404;
@@ -1404,6 +1478,8 @@ function createNodeRequestHandler(options) {
1404
1478
  );
1405
1479
  const initialPayload = {
1406
1480
  model: resolved.model,
1481
+ contextModel: resolved.contextModel,
1482
+ pageModel: resolved.pageModel,
1407
1483
  head: resolved.head
1408
1484
  };
1409
1485
  const initialFlightData = await renderRSCToString(initialPayload, {