@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 +1 -1
- package/dist/client.d.ts +1 -0
- package/dist/client.js +1 -1
- package/dist/http.cjs +90 -14
- package/dist/http.js +90 -14
- package/dist/index.cjs +90 -14
- package/dist/index.js +90 -14
- package/dist/route-slot.cjs +53 -0
- package/dist/route-slot.d.ts +7 -0
- package/dist/route-slot.js +19 -0
- package/dist/router.cjs +36 -6
- package/dist/router.d.ts +2 -0
- package/dist/router.js +36 -6
- package/dist/types.d.ts +2 -0
- package/dist/webframez-core.cjs +90 -14
- package/dist/webframez-core.js +90 -14
- package/package.json +6 -1
package/dist/client.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var
|
|
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
package/dist/client.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import
|
|
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 (
|
|
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 (
|
|
273
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 (
|
|
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 (
|
|
248
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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, {
|