@fluixi/core 1.0.0-alpha.83 → 1.0.0-alpha.85
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/cdn/core.global.js +2 -1
- package/dist/cli/generate.cjs +4117 -292
- package/dist/cli/generate.mjs +4122 -292
- package/dist/cli/index.cjs +4117 -292
- package/dist/cli/index.mjs +4122 -292
- package/dist/cli/run.cjs +63 -1
- package/dist/cli/run.mjs +39 -1
- package/dist/src/cdn/chunk-MDJLC3PE.mjs +830 -0
- package/dist/src/cdn/core.cjs +1365 -1
- package/dist/src/cdn/core.d.ts +3 -3
- package/dist/src/cdn/core.js +3 -3
- package/dist/src/cdn/core.mjs +642 -1
- package/dist/src/cdn/router-JYFZP3EZ.mjs +70 -0
- package/dist/src/index.cjs +1280 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +1 -11
- package/dist/src/index.mjs +1393 -1
- package/dist/src/jsx-dev-runtime.cjs +26 -1
- package/dist/src/jsx-dev-runtime.mjs +24 -1
- package/dist/src/jsx-runtime.cjs +26 -1
- package/dist/src/jsx-runtime.js +0 -9
- package/dist/src/jsx-runtime.mjs +24 -1
- package/dist/src/lib/client/chunk-7IUN2FLI.mjs +133 -0
- package/dist/src/lib/client/index.cjs +956 -1
- package/dist/src/lib/client/index.d.ts +17 -6
- package/dist/src/lib/client/index.d.ts.map +1 -1
- package/dist/src/lib/client/index.js +26 -19
- package/dist/src/lib/client/index.mjs +222 -1
- package/dist/src/lib/client/router-NOFEMOEH.mjs +631 -0
- package/dist/src/lib/context/context.cjs +118 -1
- package/dist/src/lib/context/context.d.ts +19 -37
- package/dist/src/lib/context/context.d.ts.map +1 -1
- package/dist/src/lib/context/context.js +8 -45
- package/dist/src/lib/context/context.mjs +99 -1
- package/dist/src/lib/context/index.cjs +120 -1
- package/dist/src/lib/context/index.mjs +99 -1
- package/dist/src/lib/control-flow.cjs +35 -1
- package/dist/src/lib/control-flow.mjs +25 -1
- package/dist/src/lib/core.cjs +1279 -1
- package/dist/src/lib/core.d.ts +0 -2
- package/dist/src/lib/core.d.ts.map +1 -1
- package/dist/src/lib/core.js +14 -48
- package/dist/src/lib/core.mjs +1393 -1
- package/dist/src/lib/env/index.cjs +60 -1
- package/dist/src/lib/env/index.d.ts +5 -5
- package/dist/src/lib/env/index.js +5 -5
- package/dist/src/lib/env/index.mjs +39 -1
- package/dist/src/lib/i18n/index.cjs +108 -1
- package/dist/src/lib/i18n/index.d.ts +31 -10
- package/dist/src/lib/i18n/index.d.ts.map +1 -1
- package/dist/src/lib/i18n/index.js +31 -10
- package/dist/src/lib/i18n/index.mjs +88 -1
- package/dist/src/lib/index.cjs +633 -1
- package/dist/src/lib/index.d.ts +0 -2
- package/dist/src/lib/index.d.ts.map +1 -1
- package/dist/src/lib/index.js +5 -11
- package/dist/src/lib/index.mjs +721 -1
- package/dist/src/lib/isomorphic.cjs +85 -1
- package/dist/src/lib/isomorphic.d.ts +41 -8
- package/dist/src/lib/isomorphic.d.ts.map +1 -1
- package/dist/src/lib/isomorphic.js +38 -5
- package/dist/src/lib/isomorphic.mjs +64 -1
- package/dist/src/lib/jsx-runtime/index.cjs +21 -1
- package/dist/src/lib/jsx-runtime/index.d.ts +1 -1
- package/dist/src/lib/jsx-runtime/index.js +1 -11
- package/dist/src/lib/jsx-runtime/index.mjs +4 -1
- package/dist/src/lib/jsx-runtime/jsx-dev-runtime.cjs +21 -1
- package/dist/src/lib/jsx-runtime/jsx-dev-runtime.mjs +4 -1
- package/dist/src/lib/plugins/fluixi-routes-plugin.cjs +302 -8
- package/dist/src/lib/plugins/fluixi-routes-plugin.d.ts +15 -1
- package/dist/src/lib/plugins/fluixi-routes-plugin.d.ts.map +1 -1
- package/dist/src/lib/plugins/fluixi-routes-plugin.js +19 -5
- package/dist/src/lib/plugins/fluixi-routes-plugin.mjs +271 -8
- package/dist/src/lib/plugins/index.cjs +311 -8
- package/dist/src/lib/plugins/index.mjs +279 -8
- package/dist/src/lib/plugins/route-codegen.cjs +73 -8
- package/dist/src/lib/plugins/route-codegen.d.ts +0 -1
- package/dist/src/lib/plugins/route-codegen.d.ts.map +1 -1
- package/dist/src/lib/plugins/route-codegen.js +4 -5
- package/dist/src/lib/plugins/route-codegen.mjs +52 -8
- package/dist/src/lib/plugins/route-scanner.cjs +189 -1
- package/dist/src/lib/plugins/route-scanner.d.ts +1 -2
- package/dist/src/lib/plugins/route-scanner.d.ts.map +1 -1
- package/dist/src/lib/plugins/route-scanner.js +7 -8
- package/dist/src/lib/plugins/route-scanner.mjs +158 -1
- package/dist/src/lib/plugins/vite.cjs +27 -1
- package/dist/src/lib/plugins/vite.mjs +6 -1
- package/dist/src/lib/render/await.cjs +38 -1
- package/dist/src/lib/render/await.d.ts +18 -0
- package/dist/src/lib/render/await.d.ts.map +1 -1
- package/dist/src/lib/render/await.js +20 -2
- package/dist/src/lib/render/await.mjs +17 -1
- package/dist/src/lib/render/component.cjs +221 -1
- package/dist/src/lib/render/component.d.ts +3 -44
- package/dist/src/lib/render/component.d.ts.map +1 -1
- package/dist/src/lib/render/component.js +23 -55
- package/dist/src/lib/render/component.mjs +214 -1
- package/dist/src/lib/render/deferred.cjs +175 -1
- package/dist/src/lib/render/deferred.js +5 -5
- package/dist/src/lib/render/deferred.mjs +158 -1
- package/dist/src/lib/render/index.cjs +573 -1
- package/dist/src/lib/render/index.d.ts +3 -17
- package/dist/src/lib/render/index.d.ts.map +1 -1
- package/dist/src/lib/render/index.js +8 -22
- package/dist/src/lib/render/index.mjs +590 -1
- package/dist/src/lib/render/lazy.cjs +67 -1
- package/dist/src/lib/render/lazy.d.ts +22 -1
- package/dist/src/lib/render/lazy.d.ts.map +1 -1
- package/dist/src/lib/render/lazy.js +26 -5
- package/dist/src/lib/render/lazy.mjs +50 -1
- package/dist/src/lib/render/suspense.cjs +141 -1
- package/dist/src/lib/render/suspense.d.ts +40 -0
- package/dist/src/lib/render/suspense.d.ts.map +1 -1
- package/dist/src/lib/render/suspense.js +46 -6
- package/dist/src/lib/render/suspense.mjs +136 -1
- package/dist/src/lib/render/versions.cjs +35 -1
- package/dist/src/lib/render/versions.js +6 -6
- package/dist/src/lib/render/versions.mjs +14 -1
- package/dist/src/lib/router/data.cjs +230 -1
- package/dist/src/lib/router/data.d.ts +1 -13
- package/dist/src/lib/router/data.d.ts.map +1 -1
- package/dist/src/lib/router/data.js +0 -12
- package/dist/src/lib/router/data.mjs +214 -1
- package/dist/src/lib/router/index.cjs +709 -1
- package/dist/src/lib/router/index.d.ts +78 -23
- package/dist/src/lib/router/index.d.ts.map +1 -1
- package/dist/src/lib/router/index.js +161 -37
- package/dist/src/lib/router/index.mjs +722 -1
- package/dist/src/lib/router/transition.cjs +75 -0
- package/dist/src/lib/router/transition.d.ts +81 -0
- package/dist/src/lib/router/transition.d.ts.map +1 -0
- package/dist/src/lib/router/transition.js +136 -0
- package/dist/src/lib/router/transition.mjs +54 -0
- package/dist/src/lib/server/hydration.cjs +169 -1
- package/dist/src/lib/server/hydration.d.ts +15 -55
- package/dist/src/lib/server/hydration.d.ts.map +1 -1
- package/dist/src/lib/server/hydration.js +23 -62
- package/dist/src/lib/server/hydration.mjs +148 -1
- package/dist/src/lib/server/index.cjs +401 -11
- package/dist/src/lib/server/index.d.ts +30 -6
- package/dist/src/lib/server/index.d.ts.map +1 -1
- package/dist/src/lib/server/index.js +34 -11
- package/dist/src/lib/server/index.mjs +379 -11
- package/dist/src/lib/server/reactive.cjs +197 -1
- package/dist/src/lib/server/reactive.d.ts +18 -77
- package/dist/src/lib/server/reactive.d.ts.map +1 -1
- package/dist/src/lib/server/reactive.js +19 -78
- package/dist/src/lib/server/reactive.mjs +176 -1
- package/dist/src/lib/theme/index.cjs +110 -1
- package/dist/src/lib/theme/index.d.ts +19 -4
- package/dist/src/lib/theme/index.d.ts.map +1 -1
- package/dist/src/lib/theme/index.js +17 -2
- package/dist/src/lib/theme/index.mjs +89 -1
- package/dist/src/lib/utils/index.cjs +209 -1
- package/dist/src/lib/utils/index.d.ts +0 -93
- package/dist/src/lib/utils/index.d.ts.map +1 -1
- package/dist/src/lib/utils/index.js +0 -93
- package/dist/src/lib/utils/index.mjs +188 -1
- package/dist/src/routes.cjs +37 -1
- package/dist/src/routes.d.ts +1 -1
- package/dist/src/routes.js +2 -2
- package/dist/src/routes.mjs +17 -1
- package/dist/src/server.cjs +400 -11
- package/dist/src/server.d.ts +0 -1
- package/dist/src/server.d.ts.map +1 -1
- package/dist/src/server.js +0 -1
- package/dist/src/server.mjs +377 -11
- package/dist/src/utils.cjs +21 -1
- package/dist/src/utils.d.ts +1 -1
- package/dist/src/utils.js +1 -1
- package/dist/src/utils.mjs +4 -1
- package/dist/src/version.generated.cjs +26 -1
- package/dist/src/version.generated.d.ts +1 -1
- package/dist/src/version.generated.js +2 -2
- package/dist/src/version.generated.mjs +5 -1
- package/dist/tsconfig.lib.tsbuildinfo +1 -1
- package/package.json +17 -16
- package/src/index.ts +2 -14
- package/dist/src/cdn/chunk-55BT3H6E.mjs +0 -1
- package/dist/src/cdn/router-5JJZBK4E.mjs +0 -1
- package/dist/src/lib/client/chunk-SM4WHBOP.mjs +0 -1
- package/dist/src/lib/client/router-IBD4WPQT.mjs +0 -1
package/dist/src/cdn/core.cjs
CHANGED
|
@@ -1 +1,1365 @@
|
|
|
1
|
-
"use strict";var me=Object.defineProperty;var Dt=Object.getOwnPropertyDescriptor;var It=Object.getOwnPropertyNames;var Nt=Object.prototype.hasOwnProperty;var H=(e,t)=>()=>(e&&(t=e(e=0)),t);var Fe=(e,t)=>{for(var n in t)me(e,n,{get:t[n],enumerable:!0})},pe=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of It(t))!Nt.call(e,o)&&o!==n&&me(e,o,{get:()=>t[o],enumerable:!(r=Dt(t,o))||r.enumerable});return e},He=(e,t,n)=>(pe(e,t,"default"),n&&pe(n,t,"default"));var Ft=e=>pe(me({},"__esModule",{value:!0}),e);function ze(e){if(e!=null&&(typeof e=="object"||typeof e=="function"))try{e.$lazy=!0}catch{}return e}function L(e,t){let n,r,o;function s(){return r||(r=e().then(c=>n=c.default)),r}t?.preload&&s();let a=(c=>{if(n){let d=n;return ze((0,O.untrack)(()=>d(c)))}if(!o){let[d]=(0,O.createResource)(()=>s(),{transport:!1});if(o=d,d.error)throw d.error}return(0,O.createMemo)(()=>{let d=o();return d?ze((0,We.createComponent)(d,c)):void 0})});return a.preload=()=>s().then(()=>{}),a.$lazy=!0,a.loader=e,a}var We,O,ne=H(()=>{"use strict";We=require("@fluixi/dom"),O=require("@fluixi/reactive/signal")});function Wt(){Qe||(Qe=!0,!(typeof process<"u")&&console.warn("[fluixi] createProvider({ context, value, children }) reads `children` eagerly: the object literal materialises `children` BEFORE the context is stamped, so a routed <Outlet/> that has siblings inside the provider renders detached and its descendants see no context under SSR. Use the lazy form instead:\n createProvider(Context, value, props) // children stays a getter\n // or JSX: <Context.Provider value={…}>{props.children}</Context.Provider>"))}function se(e,t,n){let r=!!e?.Provider,o=r?e:e.context,s=r?t:e.value,a=r?!1:e.debug??!1;r||Wt();let c=typeof s=="function"?s():s,d=r?n:e;return o.Provider({value:c,get children(){return d?.children},debug:a})}function tt(e){let t=M(e);return[t,r=>se(t,r.value,r)]}function Ce(e,t){if(e.length===0)return(0,et.readChildren)(()=>t);let[n,r]=e[0],o=e.slice(1);return se(n,r,{get children(){return Ce(o,t)}})}function nt(e){return t=>{let n=D(e);return t.children(n)}}function rt(e,t){let n=D(e);return n===e.defaultValue?t():n}function M(e,t){let n=(0,oe.createContext)(e,t),r=o=>(o.debug,n.Provider({value:o.value,get children(){return o.children},debug:o.debug}));return typeof Symbol<"u"&&Symbol.for&&(r.$$typeof=Symbol.for("react.provider")),r.$$typeof=Symbol.for("react.provider"),{id:n.id,Provider:(0,Ze.asProvider)(r),defaultValue:e}}function D(e){let t=(0,oe.useContext)(e);return t!==void 0?t:e.defaultValue}var Ze,oe,et,Qe,be=H(()=>{"use strict";Ze=require("@fluixi/dom"),oe=require("@fluixi/reactive/signal"),et=require("@fluixi/reactive/signal"),Qe=!1});function ut(){return ct}function we(e){ct=e}function dt(e,t){ue.set(e,t)}function ft(e){return ue.get(e)}function Gt(){ue.clear()}function lt(){if(typeof window>"u")return!1;let e=document.getElementById("__FLUIXI_HYDRATION__");if(!e||e.getAttribute("type")!=="application/json")return!1;try{let t=e.textContent||"{}",n=JSON.parse(t);for(let[r,o]of Object.entries(n))ue.set(r,o);return!0}catch(t){return console.error("Failed to deserialize hydration data:",t),!1}}function Re(){if(typeof window>"u")return;let e=document.getElementById("__FLUIXI_HYDRATION__");e&&e.remove();let t=document.createTreeWalker(document.body,NodeFilter.SHOW_COMMENT,null),n=[],r;for(;r=t.nextNode();){let o=r,s=o.nodeValue||"";(s.startsWith("#")||s.startsWith("/"))&&n.push(o)}n.forEach(o=>o.remove()),Gt()}function pt(){return typeof window>"u"}var ct,ue,Pe=H(()=>{"use strict";ct=!1,ue=new Map;typeof window<"u"&&window.addEventListener("load",()=>{setTimeout(Re,100)})});function mt(e,t){return async(...n)=>{let r=t+":"+JSON.stringify(n);if(ut()||typeof window<"u"){let s=ft(r);if(s!==void 0)return s}if($.has(r))return $.get(r);if(U.has(r))return U.get(r);let o=Promise.resolve(e(...n)).then(s=>($.set(r,s),U.delete(r),pt()&&dt(r,s),s),s=>{throw U.delete(r),s});return U.set(r,o),o}}function yt(e){let t=typeof e=="string"?n=>n.startsWith(e):e;for(let n of $.keys())t(n)&&($.delete(n),Zt.add(n));Qt(n=>n+1)}function gt(e,t){let[n]=(0,z.createResource)(t||(()=>!0),e);return n}function ht(e){return Ae.has(e)||Ae.set(e,(0,z.createSignal)(void 0)),Ae.get(e)}function Ee(e,t){let n=t||e.name||"action",r=async o=>{let[,s]=ht(n),a=()=>s(void 0),c=()=>r(o);s({input:o,pending:!0,clear:a,retry:c});try{let d=await e(o);return s({input:o,result:d,pending:!1,clear:a,retry:c}),d}catch(d){throw s({input:o,error:d,pending:!1,clear:a,retry:c}),d}};return r.url=n,r.with=o=>Ee((...s)=>e(o,...s),t),r}function xt(e){let[t]=ht(e.url);return t}function vt(e){return e}var z,$,U,Cr,Qt,Zt,Ae,en,br,Tt=H(()=>{"use strict";z=require("@fluixi/reactive/signal");Pe();be();$=new Map,U=new Map;[Cr,Qt]=(0,z.createSignal)(0),Zt=new Set;Ae=new Map;en=M(void 0,"route-data"),br=en.Provider});var At={};Fe(At,{A:()=>Ie,Form:()=>ln,Link:()=>fe,Outlet:()=>Oe,Redirect:()=>Le,Router:()=>ke,action:()=>Ee,cache:()=>mt,createAsync:()=>gt,createBrowserHistory:()=>x.createBrowserHistory,createMemoryHistory:()=>x.createMemoryHistory,lazy:()=>L,matchPath:()=>x.matchPath,matchRoutes:()=>x.matchRoutes,preloadRoutes:()=>pn,revalidate:()=>yt,runWithOwner:()=>Et.runWithOwner,select:()=>cn,useAction:()=>vt,useLevelParams:()=>sn,useLinkNavigation:()=>un,useLocation:()=>q,useMatch:()=>Me,useNavigate:()=>de,useParam:()=>_e,useParamSelector:()=>an,useParams:()=>X,useRouteData:()=>dn,useRouter:()=>N,useSearchParams:()=>De,useSubmission:()=>xt});function tn(e,t,n){let r,o=e.route.data;if(typeof o=="function"){let R=!1;(0,u.onCleanup)(()=>{R=!0});let g=(0,u.getOwner)(),[F]=(0,u.createResource)(()=>o({params:n.params,location:n.location},g,()=>R));r=F}let s=()=>Rt.Provider({value:r,get children(){return wt.Provider({value:e.params,get children(){return St.Provider({value:{depth:t,...n},get children(){return(0,l.createComponent)(e.component,{})}})}})}});if(!r)return s();let a=r,c=()=>a.loading,[d,v]=(0,u.createSignal)((0,u.untrack)(()=>!c()));return(0,u.createEffect)(()=>v(!c())),(0,u.createMemo)(()=>d()?s():null)}function Pt(e){let t=e.depth+1,[n,r]=(0,u.createSignal)((0,u.untrack)(()=>e.matched()[t]?.component));return(0,u.createEffect)(()=>{let o=e.matched()[t]?.component;r(()=>o)}),(0,u.createMemo)(()=>{if(!n())return e.notFound?e.notFound():null;let s=(0,u.untrack)(()=>e.matched())[t];return tn(s,t,{matched:e.matched,params:e.params,location:e.location})})}function nn(e){return e==null?rn():typeof e=="function"?(0,l.createComponent)(e,{}):e}function rn(){let e=(0,l.createNativeElement)("div");(0,l.setAttribute)(e,"class","fx-not-found"),(0,l.setAttribute)(e,"role","main"),(0,l.setAttribute)(e,"style","min-height:60vh;display:grid;place-content:center;gap:.25rem;text-align:center;font-family:system-ui,-apple-system,sans-serif");let t=(0,l.createNativeElement)("h1");(0,l.setAttribute)(t,"style","margin:0;font-size:2.5rem;font-weight:700"),(0,l.insert)(t,"404");let n=(0,l.createNativeElement)("p");return(0,l.setAttribute)(n,"style","margin:0;opacity:.7"),(0,l.insert)(n,"This page could not be found."),e.appendChild(t),e.appendChild(n),e}function ke(e){let t=e.history??(0,S.createBrowserHistory)(),n=(0,S.createRouter)({routes:e.routes,base:e.base,history:t}),[r,o]=(0,u.createSignal)(n.state()),s=n.subscribe(o);(0,u.onCleanup)(()=>{s(),n.destroy()});let a=(0,u.createMemo)(()=>(r().match?.matched??[]).filter(R=>R.component)),c={router:n,location:(0,u.createMemo)(()=>r().location),params:(0,u.createMemo)(()=>r().match?.params??{})},d={depth:-1,matched:a,params:c.params,location:c.location,notFound:()=>nn(e.notFound)},v;return W.Provider({value:c,get children(){return v??=Pt(d)}})}function Oe(){let e=(0,h.useContext)(St);return e?Pt(e):null}function Le(e){let t=(0,h.useContext)(W);if(t&&typeof window<"u"){let n=!1;(0,u.onCleanup)(()=>n=!0),queueMicrotask(()=>{n||t.router.navigate(e.to,{replace:e.replace!==!1})})}return null}function N(){let e=(0,h.useContext)(W);if(e)return e;if(typeof window>"u")return on;throw new Error("[router] useRouter must be used within <Router>")}function X(){let e=N().params;return(0,u.createMemo)(()=>e(),{},{equals:(t,n)=>JSON.stringify(t)===JSON.stringify(n)})}function sn(){return(0,h.useContext)(wt)??{}}function _e(e){let t=X();return(0,u.createMemo)(()=>t()[e])}function an(e,t){let n=X();return(0,u.createMemo)(()=>e(n()),void 0,t?{equals:t}:void 0)}function Me(e){let t=q();return(0,u.createMemo)(()=>(0,S.matchPath)(typeof e=="function"?e():e,t.pathname))}function De(){let e=q(),t=de();return[(0,u.createMemo)(()=>e.query),(o,s)=>{let a=new URLSearchParams(e.search);for(let[d,v]of Object.entries(o))v===null?a.delete(d):a.set(d,v);let c=a.toString();t(e.pathname+(c?`?${c}`:""),s)}]}function cn(e,t){let n=(r,o)=>(0,bt.deepEqual)(r,o);return t!==void 0?(0,u.createMemo)(()=>(0,Ct.get)(e(),t),void 0,{equals:n}):(0,u.createMemo)(e,void 0,{equals:n})}function q(){let{location:e}=N();return new Proxy({},{get:(t,n)=>e()[n],has:(t,n)=>n in e(),ownKeys:()=>Reflect.ownKeys(e()),getOwnPropertyDescriptor:(t,n)=>Object.getOwnPropertyDescriptor(e(),n)})}function un(e={}){let t=(0,h.useContext)(W);return n=>{if(!t||n.defaultPrevented||n.button!==0||n.metaKey||n.ctrlKey||n.shiftKey||n.altKey)return;let o=n.target?.closest?.("a");if(!o||!o.getAttribute("href")||o.target&&o.target!=="_self"||o.hasAttribute("download")||/(^|\s)external(\s|$)/.test(o.getAttribute("rel")??""))return;let s=new URL(o.href);s.protocol!=="http:"&&s.protocol!=="https:"||s.origin===window.location.origin&&(s.hash&&s.pathname===window.location.pathname&&s.search===window.location.search||e.shouldNavigate&&!e.shouldNavigate(s,o)||(n.preventDefault(),t.router.navigate(s.pathname+s.search+s.hash,{replace:e.replace})))}}function de(){let{router:e}=N();return(t,n)=>e.navigate(t,n)}function dn(){return(0,h.useContext)(Rt)??(()=>{})}function fe(e){let t=(0,h.useContext)(W),n=()=>t?.router.navigate(C(e.href)??"",{replace:C(e.replace)}),r=(0,l.createNativeElement)("a");(0,l.setAttribute)(r,"href",C(e.href)??""),e.slot&&(0,l.setAttribute)(r,"slot",C(e.slot));for(let s of Object.keys(e)){if(fn.has(s))continue;let a=e[s];a!=null&&typeof a!="function"&&(0,l.setAttribute)(r,s,String(a))}if(typeof r.addEventListener=="function")r.addEventListener("click",s=>{s.metaKey||s.ctrlKey||s.shiftKey||s.altKey||(s.preventDefault(),n())});else{let s=C(e.className??e.class)??"";s&&(0,l.setAttribute)(r,"class",s)}typeof r.addEventListener=="function"&&(0,u.createEffect)(()=>{let s=C(e.href)??"";r.setAttribute("href",s);let a=C(e.className??e.class)??"",c=C(e.activeClass)??"",d=C(e.active)??t?.location().pathname===s;r.className=[a,d?c:""].filter(Boolean).join(" ")});let o=e.children;return o!=null&&(0,l.insert)(r,o),r}function ln(e){let t=e.action,n=e.className??e.class,r=t.url??"",o=(0,l.createNativeElement)("form");(0,l.setAttribute)(o,"method","post"),r&&(0,l.setAttribute)(o,"action",r),n&&(0,l.setAttribute)(o,"class",n);for(let a of Object.keys(e)){if(a==="action"||a==="children"||a==="class"||a==="className")continue;let c=e[a];c!=null&&typeof c!="function"&&(0,l.setAttribute)(o,a,String(c))}typeof o.addEventListener=="function"&&o.addEventListener("submit",a=>{a.preventDefault();let c={};new FormData(o).forEach((d,v)=>{c[v]=d}),Promise.resolve(t(c)).catch(()=>{})});let s=e.children;return s!=null&&(0,l.insert)(o,s),o}async function pn(e,t){let n=(0,S.matchRoutes)(e,t);if(!n)return;let r=[];for(let o of n.matched){let s=o.component;s&&typeof s.preload=="function"&&r.push(s.preload())}await Promise.all(r)}var u,l,h,Ct,bt,S,x,Et,W,St,wt,Rt,on,C,fn,Ie,Ne=H(()=>{"use strict";u=require("@fluixi/reactive/signal"),l=require("@fluixi/dom"),h=require("@fluixi/reactive/signal"),Ct=require("@fluixi/utils/object"),bt=require("@fluixi/utils/compare"),S=require("@fluixi/router"),x=require("@fluixi/router");Tt();ne();Et=require("@fluixi/reactive/signal"),W=(0,h.createContext)(void 0,"router"),St=(0,h.createContext)(void 0,"outlet"),wt=(0,h.createContext)(void 0,"route-params"),Rt=(0,h.createContext)(void 0,"route-data");on={router:{navigate:()=>{}},location:()=>({pathname:"",search:"",hash:"",query:{}}),params:()=>({})};C=e=>typeof e=="function"?e():e,fn=new Set(["href","slot","class","className","active","activeClass","replace","children"]);Ie=fe});var gn={};Fe(gn,{$component:()=>xe,A:()=>Ie,ClientOnly:()=>y.ClientOnly,DEV:()=>j,Dynamic:()=>y.Dynamic,ErrorBoundary:()=>y.ErrorBoundary,FRAMEWORK_NAME:()=>it,For:()=>y.For,Fragment:()=>T.Fragment,Index:()=>y.Index,Link:()=>fe,Match:()=>y.Match,NoSsr:()=>y.NoSsr,Outlet:()=>Oe,Portal:()=>y.Portal,Redirect:()=>Le,Router:()=>ke,Show:()=>y.Show,Store:()=>I.Store,Suspense:()=>K,Switch:()=>y.Switch,VERSION:()=>at,addClass:()=>p.addClass,batch:()=>f.batch,classMap:()=>ce.classMap,cleanupDelegation:()=>Ge,composeProviders:()=>Ce,createBrowserHistory:()=>x.createBrowserHistory,createComponent:()=>k,createComputed:()=>f.createComputed,createConsumer:()=>nt,createContext:()=>M,createContextWithProvider:()=>tt,createDebounce:()=>ae.createDebounce,createDeferred:()=>f.createDeferred,createEffect:()=>f.createEffect,createIsomorphicState:()=>st,createMemo:()=>f.createMemo,createMemoryHistory:()=>x.createMemoryHistory,createProvider:()=>se,createRenderEffect:()=>f.createRenderEffect,createResource:()=>f.createResource,createRoot:()=>f.createRoot,createSelector:()=>ae.createSelector,createSignal:()=>f.createSignal,createStore:()=>I.createStore,delegateEvents:()=>p.delegateEvents,devOnly:()=>Te,getFrameworkInfo:()=>Yt,getOwner:()=>f.getOwner,getSharedConfig:()=>he,hydrate:()=>p.hydrate,initDelegation:()=>Ye,insert:()=>p.insert,isDOMNode:()=>p.isDOMNode,isDev:()=>ve,isLitTemplateResult:()=>p.isLitTemplateResult,isRenderable:()=>Be,jsx:()=>T.jsx,jsxs:()=>T.jsxs,lazy:()=>L,mount:()=>Lt,onCleanup:()=>f.onCleanup,onMount:()=>B,onUnmount:()=>Y,portal:()=>Je,read:()=>ie.readSignal,reduce:()=>ie.reduceSignal,removeClass:()=>p.removeClass,render:()=>_,runWithOwner:()=>f.runWithOwner,setAttribute:()=>p.setAttribute,setOwner:()=>f.setOwner,setProperty:()=>p.setProperty,spread:()=>p.spread,startClient:()=>_t,styleMap:()=>ce.styleMap,toggleClass:()=>p.toggleClass,untrack:()=>f.untrack,untrackStore:()=>I.untrackStore,useCallback:()=>te,useContext:()=>D,useEffect:()=>V,useEventListener:()=>ee,useLocation:()=>q,useMatch:()=>Me,useMemo:()=>G,useNavigate:()=>de,useParam:()=>_e,useParams:()=>X,useProvide:()=>rt,useReducer:()=>Z,useRef:()=>Q,useRouter:()=>N,useSearchParams:()=>De});module.exports=Ft(gn);var f=require("@fluixi/reactive/signal"),ae=require("@fluixi/reactive/signal"),ie=require("@fluixi/reactive/operators"),I=require("@fluixi/reactive/store");var re=require("@fluixi/dom"),qe=require("@fluixi/reactive/signal");var Ve=require("@fluixi/dom");var je="1.0.0-alpha.83";var P=require("@fluixi/dom");(0,Ve.registerCoreVersion)(je);var A=require("@fluixi/dom");var ge=require("@fluixi/dom"),J=require("@fluixi/dom"),i=require("@fluixi/reactive/signal"),Ht={context:null,owner:null};function he(){return Ht}var j=typeof process<"u"&&!1,ye=Symbol.for("fluixi-lifecycle");function Ke(){let e=(0,i.getOwner)();if(!e)return null;if(!e[ye]){let t={mounts:[],effects:[],scheduled:!1};e[ye]=t}return e[ye]}function Ue(e){if(e.scheduled)return;if((0,ge.isServer)()){e.mounts=[],e.effects=[];return}e.scheduled=!0;let t=(0,i.getOwner)();queueMicrotask(()=>{if((0,i.isOwnerDisposed)(t)){e.mounts=[],e.effects=[];return}(0,i.runWithOwner)(t,()=>{for(let n of e.mounts)try{let r=n();typeof r=="function"&&(0,i.onCleanup)(r)}catch(r){console.error("Error in onMount callback:",r)}for(let n of e.effects){let r;(0,i.createEffect)(()=>{r&&r(),r=n()}),(0,i.onCleanup)(()=>{r&&r()})}e.mounts=[],e.effects=[]})})}function k(e,t){return(0,J.createComponent)(e,t)}function xe(e,t){let n=typeof e=="function"?(0,i.untrack)(()=>e(t)):e,r=n!=null&&(typeof n=="function"||typeof n=="object");if(r)try{n.$name=e.name}catch{}return r&&!(0,i.isSignal)(n)?(0,J.asComponent)(n):n}function B(e,t=!0){if((0,ge.isServer)())return;let n=Ke();if(n){if(!t){n.scheduled||e();return}n.mounts.push(e),Ue(n)}else{if(!t){e();return}(0,i.createEffect)(()=>{let r=(0,i.untrack)(e);typeof r=="function"&&(0,i.onCleanup)(r)})}}function Y(e){(0,i.onCleanup)(e)}function V(e){let t=Ke();if(t)t.effects.push(e),Ue(t);else{let n;(0,i.createEffect)(()=>{n&&n(),n=e()}),(0,i.onCleanup)(()=>{n&&n()})}}function G(e){return(0,i.createMemo)(e)}function Q(e){let t={current:e};return(0,i.onCleanup)(()=>{t.current=null}),t}function Z(e,t){let[n,r]=(0,i.createSignal)(t);return[n,s=>{r(e(n(),s))}]}function ee(e,t,n,r){V(()=>{let o=e&&"current"in e?e.current:e;if(o)return o.addEventListener(t,n,r),()=>{o.removeEventListener(t,n,r)}})}function te(e){return e}function ve(){return j}function Te(e){j&&e()}var m=require("@fluixi/reactive/signal"),b=require("@fluixi/dom");function $e(e){return!!(e&&typeof e=="object"&&typeof e.then=="function"||e instanceof Promise)}var jt=(0,m.createContext)(void 0,"suspense-list");function K(e){return(0,b.createComponent)(Vt,e)}function Vt(e){let t=(0,m.createSuspenseBoundary)(),n=(0,m.useContext)(jt),r=n?n.register(t.inFallback):void 0;function o(g){return g==null||typeof g=="boolean"?null:typeof g=="function"&&(0,b.isComponent)(g)&&!(0,m.isSignal)(g)?g():g}let s=(0,b.runWithoutHydration)(()=>o(e.fallback??null)),a=(0,m.provideSuspense)(t,()=>(0,m.readChildren)(()=>e.children)),c=(g,F)=>{if(!(F>8))if(Array.isArray(g))for(let Mt of g)c(Mt,F+1);else typeof g=="function"&&(0,m.isSignal)(g)&&c(g(),F+1)};(0,m.provideSuspense)(t,()=>{(0,m.createRenderEffect)(()=>c(a,0))});let[d,v]=(0,m.createSignal)(void 0),R=$e(a);return R&&(t.increment(),a.then(g=>{v(()=>g),t.decrement()},()=>t.decrement())),(0,m.createMemo)(()=>(r?r.showFallback():t.inFallback())?s:R?d():a)}(0,b.asSuspense)(K);Object.defineProperty(K,"__suspense",{value:!0,enumerable:!0});ne();var Kt=require("@fluixi/dom"),Xe=require("@fluixi/reactive/signal"),Ut=require("@fluixi/dom/utils");ne();var $t=require("@fluixi/reactive/signal");function _(e,t,n={}){if((0,A.delegateEvents)(["click","input","change","submit"]),(0,re.isServer)())throw new Error("render() is for client-side only. Use renderToString() on server.");if(!t)throw new Error("Container element is required");let r;return(0,qe.createRoot)(o=>{r=o;let s=typeof e=="function"?e():e;t.textContent="",(0,P.stampVersions)(t),(0,P.warnOnVersionSkew)(),(0,A.insert)(t,()=>s)}),()=>{r&&(r(),r=void 0)}}function zt(e){return e&&typeof e=="object"&&(e._$litType$!==void 0||e._$litDirective$!==void 0)}function Je(e,t,n={}){let r=document.createElement("div");r.setAttribute("data-portal","true"),t.appendChild(r);let o=_(e,r,n);return()=>{o(),t.contains(r)&&t.removeChild(r)}}function Be(e){return!!(e==null||typeof e=="function"||(0,A.isDOMNode)(e)||zt(e)||Array.isArray(e)||typeof e=="string"||typeof e=="number"||typeof e=="boolean")}function Ye(){(0,re.isServer)()||(0,A.delegateEvents)(["click","input","change","submit"])}function Ge(){(0,re.isServer)()}be();var Se=require("@fluixi/reactive/signal"),ot=require("@fluixi/dom"),Xt="__fluixi_iso_states__",qt="__iso:";function Jt(){return globalThis[Xt]??=new Map}function Bt(e){if(typeof window>"u")return;let t=(0,ot.getServerData)();return t?t[qt+e]:void 0}function st(e,t){let n=Bt(e),r=n!==void 0?n:typeof window<"u"&&t.client?t.client():t.fallback,[o,s]=(0,Se.createSignal)(r);return Jt().set(e,{server:t.server,set:s}),{value:o,set:s,key:e}}var ce=require("@fluixi/dom");var y=require("@fluixi/dom");var p=require("@fluixi/dom");var T={};He(T,require("@fluixi/jsx/jsx-runtime"));var E=require("@fluixi/reactive/signal");var at="0.0.1",it="Fluixi";function Yt(){return{name:it,version:at,features:{ssr:!0,hydration:!0,jsx:!0,litHtml:!0,signals:!0,fineGrained:!0,lazy:!0,hooks:!0,devMode:!0}}}var le=require("@fluixi/dom");Pe();var Ot=require("@fluixi/reactive/signal"),w=require("@fluixi/head"),yn=require("@fluixi/dom");function Lt(e,t){if(!t)throw new Error("Container element not found for mount()");(0,le.render)(()=>e(),t)}var kt=e=>(0,Ot.createMemo)(()=>k(e));async function _t(e,t={}){let n=typeof t.root=="string"?document.querySelector(t.root):t.root??document.querySelector("#app");if(!n)throw new Error(`[Fluixi] Mount container not found: ${t.root??"#app"}`);let r=!!document.getElementById("__FLUIXI_HYDRATION__")||!!t.routes&&n.firstElementChild!=null,o=t.hydrate??r,s=(0,w.createHead)();if((0,w.setActiveHead)(s),(0,w.stripHeadMarker)(n),o){if(t.routes&&t.routes.length){let{preloadRoutes:a}=await Promise.resolve().then(()=>(Ne(),At));await a(t.routes,window.location.pathname)}lt(),we(!0),(0,le.hydrate)(kt(e),n),mn(),setTimeout(()=>{we(!1),Re()},100)}else _(kt(e),n);(0,w.mountHead)(s)}function mn(){if(typeof window>"u")return;let e=window;typeof e.__FX_REPLAY_STOP__=="function"&&e.__FX_REPLAY_STOP__();let t=e.__FX_REPLAY__;if(e.__FX_REPLAY__=void 0,e.__FX_REPLAY_STOP__=void 0,!(!Array.isArray(t)||t.length===0))for(let n of t){let r=n&&n.target;if(!r||r.isConnected===!1||typeof r.dispatchEvent!="function")continue;let o=n.type,s=o==="click"?new MouseEvent(o,{bubbles:!0,cancelable:!0}):new Event(o,{bubbles:!0,cancelable:!0});r.dispatchEvent(s)}}Ne();
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __esm = (fn, res) => function __init() {
|
|
7
|
+
return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
|
|
8
|
+
};
|
|
9
|
+
var __export = (target, all) => {
|
|
10
|
+
for (var name in all)
|
|
11
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
12
|
+
};
|
|
13
|
+
var __copyProps = (to, from, except, desc) => {
|
|
14
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
15
|
+
for (let key of __getOwnPropNames(from))
|
|
16
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
17
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
18
|
+
}
|
|
19
|
+
return to;
|
|
20
|
+
};
|
|
21
|
+
var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
|
|
22
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
23
|
+
|
|
24
|
+
// src/lib/render/lazy.ts
|
|
25
|
+
function fromChunk(value) {
|
|
26
|
+
if (value != null && (typeof value === "object" || typeof value === "function")) {
|
|
27
|
+
try {
|
|
28
|
+
value["$lazy"] = true;
|
|
29
|
+
} catch {
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return value;
|
|
33
|
+
}
|
|
34
|
+
function lazy(loader, options) {
|
|
35
|
+
let resolved;
|
|
36
|
+
let promise;
|
|
37
|
+
let component;
|
|
38
|
+
function load() {
|
|
39
|
+
if (!promise) {
|
|
40
|
+
promise = loader().then((mod) => resolved = mod.default);
|
|
41
|
+
}
|
|
42
|
+
return promise;
|
|
43
|
+
}
|
|
44
|
+
if (options?.preload) load();
|
|
45
|
+
const LazyWrapper = ((props) => {
|
|
46
|
+
if (resolved) {
|
|
47
|
+
const C = resolved;
|
|
48
|
+
return fromChunk((0, import_signal3.untrack)(() => C(props)));
|
|
49
|
+
}
|
|
50
|
+
if (!component) {
|
|
51
|
+
const [resource] = (0, import_signal3.createResource)(() => load(), { transport: false });
|
|
52
|
+
component = resource;
|
|
53
|
+
if (resource.error) throw resource.error;
|
|
54
|
+
}
|
|
55
|
+
return (0, import_signal3.createMemo)(() => {
|
|
56
|
+
const C = component();
|
|
57
|
+
return C ? fromChunk((0, import_dom6.createComponent)(C, props)) : void 0;
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
LazyWrapper.preload = () => load().then(() => void 0);
|
|
61
|
+
LazyWrapper.$lazy = true;
|
|
62
|
+
LazyWrapper.loader = loader;
|
|
63
|
+
return LazyWrapper;
|
|
64
|
+
}
|
|
65
|
+
var import_dom6, import_signal3;
|
|
66
|
+
var init_lazy = __esm({
|
|
67
|
+
"src/lib/render/lazy.ts"() {
|
|
68
|
+
"use strict";
|
|
69
|
+
import_dom6 = require("@fluixi/dom");
|
|
70
|
+
import_signal3 = require("@fluixi/reactive/signal");
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
// src/lib/context/context.ts
|
|
75
|
+
function warnEagerProvider() {
|
|
76
|
+
if (_warnedEagerProvider) return;
|
|
77
|
+
_warnedEagerProvider = true;
|
|
78
|
+
if (typeof process !== "undefined" && true) return;
|
|
79
|
+
console.warn(
|
|
80
|
+
"[fluixi] createProvider({ context, value, children }) reads `children` eagerly: the object literal materialises `children` BEFORE the context is stamped, so a routed <Outlet/> that has siblings inside the provider renders detached and its descendants see no context under SSR. Use the lazy form instead:\n createProvider(Context, value, props) // children stays a getter\n // or JSX: <Context.Provider value={...}>{props.children}</Context.Provider>"
|
|
81
|
+
);
|
|
82
|
+
}
|
|
83
|
+
function createProvider(a, value, childProps) {
|
|
84
|
+
const isLazyForm = !!a?.Provider;
|
|
85
|
+
const context = isLazyForm ? a : a.context;
|
|
86
|
+
const rawValue = isLazyForm ? value : a.value;
|
|
87
|
+
const debug = isLazyForm ? false : a.debug ?? false;
|
|
88
|
+
if (!isLazyForm) warnEagerProvider();
|
|
89
|
+
const resolvedValue = typeof rawValue === "function" ? rawValue() : rawValue;
|
|
90
|
+
const sourceProps = isLazyForm ? childProps : a;
|
|
91
|
+
return context.Provider({
|
|
92
|
+
value: resolvedValue,
|
|
93
|
+
get children() {
|
|
94
|
+
return sourceProps?.children;
|
|
95
|
+
},
|
|
96
|
+
debug
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
function createContextWithProvider(defaultValue) {
|
|
100
|
+
const context = createContext3(defaultValue);
|
|
101
|
+
const provider = (props) => {
|
|
102
|
+
return createProvider(context, props.value, props);
|
|
103
|
+
};
|
|
104
|
+
return [context, provider];
|
|
105
|
+
}
|
|
106
|
+
function composeProviders(contexts, children) {
|
|
107
|
+
if (contexts.length === 0) {
|
|
108
|
+
return (0, import_signal8.readChildren)(() => children);
|
|
109
|
+
}
|
|
110
|
+
const [context, value] = contexts[0];
|
|
111
|
+
const remaining = contexts.slice(1);
|
|
112
|
+
return createProvider(context, value, {
|
|
113
|
+
get children() {
|
|
114
|
+
return composeProviders(remaining, children);
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
function createConsumer(context) {
|
|
119
|
+
return (props) => {
|
|
120
|
+
const value = useContext3(context);
|
|
121
|
+
return props.children(value);
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
function useProvide(context, factory) {
|
|
125
|
+
const existing = useContext3(context);
|
|
126
|
+
if (existing === context.defaultValue) {
|
|
127
|
+
return factory();
|
|
128
|
+
}
|
|
129
|
+
return existing;
|
|
130
|
+
}
|
|
131
|
+
function createContext3(defaultValue, name) {
|
|
132
|
+
const context = (0, import_signal7.createContext)(defaultValue, name);
|
|
133
|
+
const Provider = (props) => {
|
|
134
|
+
if (props.debug === true) {
|
|
135
|
+
}
|
|
136
|
+
return context.Provider({
|
|
137
|
+
value: props.value,
|
|
138
|
+
get children() {
|
|
139
|
+
return props.children;
|
|
140
|
+
},
|
|
141
|
+
debug: props.debug
|
|
142
|
+
});
|
|
143
|
+
};
|
|
144
|
+
if (typeof Symbol !== "undefined" && Symbol.for) {
|
|
145
|
+
Provider.$$typeof = /* @__PURE__ */ Symbol.for("react.provider");
|
|
146
|
+
}
|
|
147
|
+
Provider.$$typeof = /* @__PURE__ */ Symbol.for("react.provider");
|
|
148
|
+
return {
|
|
149
|
+
id: context.id,
|
|
150
|
+
Provider: (0, import_dom10.asProvider)(Provider),
|
|
151
|
+
defaultValue
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
function useContext3(context) {
|
|
155
|
+
const value = (0, import_signal7.useContext)(context);
|
|
156
|
+
return value !== void 0 ? value : context.defaultValue;
|
|
157
|
+
}
|
|
158
|
+
var import_dom10, import_signal7, import_signal8, _warnedEagerProvider;
|
|
159
|
+
var init_context = __esm({
|
|
160
|
+
"src/lib/context/context.ts"() {
|
|
161
|
+
"use strict";
|
|
162
|
+
import_dom10 = require("@fluixi/dom");
|
|
163
|
+
import_signal7 = require("@fluixi/reactive/signal");
|
|
164
|
+
import_signal8 = require("@fluixi/reactive/signal");
|
|
165
|
+
_warnedEagerProvider = false;
|
|
166
|
+
}
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
// src/lib/server/hydration.ts
|
|
170
|
+
function isHydrating() {
|
|
171
|
+
return hydrating;
|
|
172
|
+
}
|
|
173
|
+
function setHydrating(state) {
|
|
174
|
+
hydrating = state;
|
|
175
|
+
}
|
|
176
|
+
function setHydrationData(key, data) {
|
|
177
|
+
hydrationDataMap.set(key, data);
|
|
178
|
+
}
|
|
179
|
+
function getHydrationData(key) {
|
|
180
|
+
return hydrationDataMap.get(key);
|
|
181
|
+
}
|
|
182
|
+
function clearHydrationData() {
|
|
183
|
+
hydrationDataMap.clear();
|
|
184
|
+
}
|
|
185
|
+
function deserializeHydrationData() {
|
|
186
|
+
if (typeof window === "undefined") {
|
|
187
|
+
return false;
|
|
188
|
+
}
|
|
189
|
+
const script = document.getElementById("__FLUIXI_HYDRATION__");
|
|
190
|
+
if (!script || script.getAttribute("type") !== "application/json") {
|
|
191
|
+
return false;
|
|
192
|
+
}
|
|
193
|
+
try {
|
|
194
|
+
const json = script.textContent || "{}";
|
|
195
|
+
const data = JSON.parse(json);
|
|
196
|
+
for (const [key, value] of Object.entries(data)) {
|
|
197
|
+
hydrationDataMap.set(key, value);
|
|
198
|
+
}
|
|
199
|
+
return true;
|
|
200
|
+
} catch (error) {
|
|
201
|
+
console.error("Failed to deserialize hydration data:", error);
|
|
202
|
+
return false;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
function cleanupHydration() {
|
|
206
|
+
if (typeof window === "undefined") {
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
const script = document.getElementById("__FLUIXI_HYDRATION__");
|
|
210
|
+
if (script) {
|
|
211
|
+
script.remove();
|
|
212
|
+
}
|
|
213
|
+
const walker = document.createTreeWalker(
|
|
214
|
+
document.body,
|
|
215
|
+
NodeFilter.SHOW_COMMENT,
|
|
216
|
+
null
|
|
217
|
+
);
|
|
218
|
+
const comments = [];
|
|
219
|
+
let node;
|
|
220
|
+
while (node = walker.nextNode()) {
|
|
221
|
+
const comment = node;
|
|
222
|
+
const text = comment.nodeValue || "";
|
|
223
|
+
if (text.startsWith("#") || text.startsWith("/")) {
|
|
224
|
+
comments.push(comment);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
comments.forEach((comment) => comment.remove());
|
|
228
|
+
clearHydrationData();
|
|
229
|
+
}
|
|
230
|
+
function isServerEnvironment() {
|
|
231
|
+
return (0, import_dom15.isServer)();
|
|
232
|
+
}
|
|
233
|
+
var import_dom15, hydrating, hydrationDataMap;
|
|
234
|
+
var init_hydration = __esm({
|
|
235
|
+
"src/lib/server/hydration.ts"() {
|
|
236
|
+
"use strict";
|
|
237
|
+
import_dom15 = require("@fluixi/dom");
|
|
238
|
+
hydrating = false;
|
|
239
|
+
hydrationDataMap = /* @__PURE__ */ new Map();
|
|
240
|
+
if (typeof window !== "undefined") {
|
|
241
|
+
window.addEventListener("load", () => {
|
|
242
|
+
setTimeout(cleanupHydration, 100);
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
});
|
|
247
|
+
|
|
248
|
+
// src/lib/router/transition.ts
|
|
249
|
+
function supportsViewTransitions() {
|
|
250
|
+
return typeof document !== "undefined" && typeof document.startViewTransition === "function";
|
|
251
|
+
}
|
|
252
|
+
function prefersReducedMotion() {
|
|
253
|
+
if (typeof window === "undefined" || typeof window.matchMedia !== "function") {
|
|
254
|
+
return false;
|
|
255
|
+
}
|
|
256
|
+
try {
|
|
257
|
+
return window.matchMedia("(prefers-reduced-motion: reduce)").matches;
|
|
258
|
+
} catch {
|
|
259
|
+
return false;
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
function shouldAnimate(mode) {
|
|
263
|
+
return mode !== "none" && supportsViewTransitions() && !prefersReducedMotion();
|
|
264
|
+
}
|
|
265
|
+
function prepareComponents(components) {
|
|
266
|
+
const pending = [];
|
|
267
|
+
for (const component of components) {
|
|
268
|
+
const preload = component?.preload;
|
|
269
|
+
if (typeof preload === "function") {
|
|
270
|
+
try {
|
|
271
|
+
const result = preload();
|
|
272
|
+
if (result && typeof result.then === "function") {
|
|
273
|
+
pending.push(result.catch(() => void 0));
|
|
274
|
+
}
|
|
275
|
+
} catch {
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
return pending.length ? Promise.all(pending).then(() => void 0) : null;
|
|
280
|
+
}
|
|
281
|
+
function runTransition(mode, commit) {
|
|
282
|
+
if (!shouldAnimate(mode)) {
|
|
283
|
+
return Promise.resolve(commit()).then(() => void 0);
|
|
284
|
+
}
|
|
285
|
+
const start = document.startViewTransition;
|
|
286
|
+
try {
|
|
287
|
+
const transition = start.call(document, () => commit());
|
|
288
|
+
transition.finished?.catch(() => void 0);
|
|
289
|
+
transition.ready?.catch(() => void 0);
|
|
290
|
+
return transition.updateCallbackDone.catch(() => void 0);
|
|
291
|
+
} catch {
|
|
292
|
+
return Promise.resolve(commit()).then(() => void 0);
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
var init_transition = __esm({
|
|
296
|
+
"src/lib/router/transition.ts"() {
|
|
297
|
+
"use strict";
|
|
298
|
+
}
|
|
299
|
+
});
|
|
300
|
+
|
|
301
|
+
// src/lib/router/data.ts
|
|
302
|
+
function cache(fn, name) {
|
|
303
|
+
return async (...args) => {
|
|
304
|
+
const key = name + ":" + JSON.stringify(args);
|
|
305
|
+
if (isHydrating() || typeof window !== "undefined") {
|
|
306
|
+
const hydrated = getHydrationData(key);
|
|
307
|
+
if (hydrated !== void 0) {
|
|
308
|
+
return hydrated;
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
if (globalCache.has(key)) {
|
|
312
|
+
return globalCache.get(key);
|
|
313
|
+
}
|
|
314
|
+
if (inflightRequests.has(key)) {
|
|
315
|
+
return inflightRequests.get(key);
|
|
316
|
+
}
|
|
317
|
+
const promise = Promise.resolve(fn(...args)).then(
|
|
318
|
+
(val) => {
|
|
319
|
+
globalCache.set(key, val);
|
|
320
|
+
inflightRequests.delete(key);
|
|
321
|
+
if (isServerEnvironment()) {
|
|
322
|
+
setHydrationData(key, val);
|
|
323
|
+
}
|
|
324
|
+
return val;
|
|
325
|
+
},
|
|
326
|
+
(err) => {
|
|
327
|
+
inflightRequests.delete(key);
|
|
328
|
+
throw err;
|
|
329
|
+
}
|
|
330
|
+
);
|
|
331
|
+
inflightRequests.set(key, promise);
|
|
332
|
+
return promise;
|
|
333
|
+
};
|
|
334
|
+
}
|
|
335
|
+
function revalidate(key) {
|
|
336
|
+
const predicate = typeof key === "string" ? (k) => k.startsWith(key) : key;
|
|
337
|
+
for (const k of globalCache.keys()) {
|
|
338
|
+
if (predicate(k)) {
|
|
339
|
+
globalCache.delete(k);
|
|
340
|
+
revalidationKeys.add(k);
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
setRevalidationVersion((v) => v + 1);
|
|
344
|
+
}
|
|
345
|
+
function createAsync(fetcher, source) {
|
|
346
|
+
const [data] = (0, import_signal13.createResource)(source || (() => true), fetcher);
|
|
347
|
+
return data;
|
|
348
|
+
}
|
|
349
|
+
function getSubmissionSignal(url) {
|
|
350
|
+
if (!submissionState.has(url)) {
|
|
351
|
+
submissionState.set(
|
|
352
|
+
url,
|
|
353
|
+
(0, import_signal13.createSignal)(void 0)
|
|
354
|
+
);
|
|
355
|
+
}
|
|
356
|
+
return submissionState.get(url);
|
|
357
|
+
}
|
|
358
|
+
function action(fn, name) {
|
|
359
|
+
const actionUrl = name || fn.name || "action";
|
|
360
|
+
const submit = async (input) => {
|
|
361
|
+
const [, setSubmission] = getSubmissionSignal(actionUrl);
|
|
362
|
+
const clear = () => setSubmission(void 0);
|
|
363
|
+
const retry = () => submit(input);
|
|
364
|
+
setSubmission({
|
|
365
|
+
input,
|
|
366
|
+
// Approximate type for tracking
|
|
367
|
+
pending: true,
|
|
368
|
+
clear,
|
|
369
|
+
retry
|
|
370
|
+
});
|
|
371
|
+
try {
|
|
372
|
+
const result = await fn(input);
|
|
373
|
+
setSubmission({
|
|
374
|
+
input,
|
|
375
|
+
result,
|
|
376
|
+
pending: false,
|
|
377
|
+
clear,
|
|
378
|
+
retry
|
|
379
|
+
});
|
|
380
|
+
return result;
|
|
381
|
+
} catch (error) {
|
|
382
|
+
setSubmission({
|
|
383
|
+
input,
|
|
384
|
+
error,
|
|
385
|
+
pending: false,
|
|
386
|
+
clear,
|
|
387
|
+
retry
|
|
388
|
+
});
|
|
389
|
+
throw error;
|
|
390
|
+
}
|
|
391
|
+
};
|
|
392
|
+
submit.url = actionUrl;
|
|
393
|
+
submit.with = (args) => action((...a) => fn(args, ...a), name);
|
|
394
|
+
return submit;
|
|
395
|
+
}
|
|
396
|
+
function useSubmission(actionFn) {
|
|
397
|
+
const [submission] = getSubmissionSignal(actionFn.url);
|
|
398
|
+
return submission;
|
|
399
|
+
}
|
|
400
|
+
function useAction(actionFn) {
|
|
401
|
+
return actionFn;
|
|
402
|
+
}
|
|
403
|
+
var import_signal13, globalCache, inflightRequests, revalidationVersion, setRevalidationVersion, revalidationKeys, submissionState, RouteDataContext, RouteDataProvider;
|
|
404
|
+
var init_data = __esm({
|
|
405
|
+
"src/lib/router/data.ts"() {
|
|
406
|
+
"use strict";
|
|
407
|
+
import_signal13 = require("@fluixi/reactive/signal");
|
|
408
|
+
init_hydration();
|
|
409
|
+
init_context();
|
|
410
|
+
globalCache = /* @__PURE__ */ new Map();
|
|
411
|
+
inflightRequests = /* @__PURE__ */ new Map();
|
|
412
|
+
[revalidationVersion, setRevalidationVersion] = (0, import_signal13.createSignal)(0);
|
|
413
|
+
revalidationKeys = /* @__PURE__ */ new Set();
|
|
414
|
+
submissionState = /* @__PURE__ */ new Map();
|
|
415
|
+
RouteDataContext = createContext3(void 0, "route-data");
|
|
416
|
+
RouteDataProvider = RouteDataContext.Provider;
|
|
417
|
+
}
|
|
418
|
+
});
|
|
419
|
+
|
|
420
|
+
// src/lib/router/index.ts
|
|
421
|
+
var router_exports = {};
|
|
422
|
+
__export(router_exports, {
|
|
423
|
+
A: () => A,
|
|
424
|
+
Form: () => Form,
|
|
425
|
+
Link: () => Link,
|
|
426
|
+
Outlet: () => Outlet,
|
|
427
|
+
Redirect: () => Redirect,
|
|
428
|
+
Router: () => Router,
|
|
429
|
+
action: () => action,
|
|
430
|
+
cache: () => cache,
|
|
431
|
+
createAsync: () => createAsync,
|
|
432
|
+
createBrowserHistory: () => import_router2.createBrowserHistory,
|
|
433
|
+
createMemoryHistory: () => import_router2.createMemoryHistory,
|
|
434
|
+
lazy: () => lazy,
|
|
435
|
+
matchPath: () => import_router2.matchPath,
|
|
436
|
+
matchRoutes: () => import_router2.matchRoutes,
|
|
437
|
+
prefersReducedMotion: () => prefersReducedMotion,
|
|
438
|
+
preloadRoutes: () => preloadRoutes,
|
|
439
|
+
revalidate: () => revalidate,
|
|
440
|
+
runWithOwner: () => import_signal16.runWithOwner,
|
|
441
|
+
select: () => select,
|
|
442
|
+
supportsViewTransitions: () => supportsViewTransitions,
|
|
443
|
+
useAction: () => useAction,
|
|
444
|
+
useLevelParams: () => useLevelParams,
|
|
445
|
+
useLinkNavigation: () => useLinkNavigation,
|
|
446
|
+
useLocation: () => useLocation,
|
|
447
|
+
useMatch: () => useMatch,
|
|
448
|
+
useNavigate: () => useNavigate,
|
|
449
|
+
useParam: () => useParam,
|
|
450
|
+
useParamSelector: () => useParamSelector,
|
|
451
|
+
useParams: () => useParams,
|
|
452
|
+
useRouteData: () => useRouteData,
|
|
453
|
+
useRouter: () => useRouter,
|
|
454
|
+
useSearchParams: () => useSearchParams,
|
|
455
|
+
useSubmission: () => useSubmission
|
|
456
|
+
});
|
|
457
|
+
function renderLayer(m, depth, base) {
|
|
458
|
+
let data;
|
|
459
|
+
const loader = m.route.data;
|
|
460
|
+
if (typeof loader === "function") {
|
|
461
|
+
let cancelled = false;
|
|
462
|
+
(0, import_signal14.onCleanup)(() => {
|
|
463
|
+
cancelled = true;
|
|
464
|
+
});
|
|
465
|
+
const owner = (0, import_signal14.getOwner)();
|
|
466
|
+
const [resource] = (0, import_signal14.createResource)(
|
|
467
|
+
() => loader({ params: base.params, location: base.location }, owner, () => cancelled)
|
|
468
|
+
);
|
|
469
|
+
data = resource;
|
|
470
|
+
}
|
|
471
|
+
const buildPage = () => RouteDataContext2.Provider({
|
|
472
|
+
value: data,
|
|
473
|
+
get children() {
|
|
474
|
+
return LevelParamsContext.Provider({
|
|
475
|
+
value: m.params,
|
|
476
|
+
get children() {
|
|
477
|
+
return OutletContext.Provider({
|
|
478
|
+
value: { depth, ...base },
|
|
479
|
+
get children() {
|
|
480
|
+
return (0, import_dom16.createComponent)(m.component, {});
|
|
481
|
+
}
|
|
482
|
+
});
|
|
483
|
+
}
|
|
484
|
+
});
|
|
485
|
+
}
|
|
486
|
+
});
|
|
487
|
+
if (!data) return buildPage();
|
|
488
|
+
const res = data;
|
|
489
|
+
const isLoading = () => res.loading;
|
|
490
|
+
const [ready, setReady] = (0, import_signal14.createSignal)((0, import_signal14.untrack)(() => !isLoading()));
|
|
491
|
+
(0, import_signal14.createEffect)(() => setReady(!isLoading()));
|
|
492
|
+
return (0, import_signal14.createMemo)(() => ready() ? buildPage() : null);
|
|
493
|
+
}
|
|
494
|
+
function renderChild(ctx) {
|
|
495
|
+
const childIdx = ctx.depth + 1;
|
|
496
|
+
const [childComp, setChildComp] = (0, import_signal14.createSignal)(
|
|
497
|
+
(0, import_signal14.untrack)(() => ctx.matched()[childIdx]?.component)
|
|
498
|
+
);
|
|
499
|
+
(0, import_signal14.createEffect)(() => {
|
|
500
|
+
const c = ctx.matched()[childIdx]?.component;
|
|
501
|
+
if ((0, import_signal14.untrack)(childComp) !== c) setChildComp(() => c);
|
|
502
|
+
});
|
|
503
|
+
return (0, import_signal14.createMemo)(() => {
|
|
504
|
+
const component = childComp();
|
|
505
|
+
if (!component) {
|
|
506
|
+
return ctx.notFound ? ctx.notFound() : null;
|
|
507
|
+
}
|
|
508
|
+
const m = (0, import_signal14.untrack)(() => ctx.matched())[childIdx];
|
|
509
|
+
return renderLayer(m, childIdx, {
|
|
510
|
+
matched: ctx.matched,
|
|
511
|
+
params: ctx.params,
|
|
512
|
+
location: ctx.location
|
|
513
|
+
});
|
|
514
|
+
});
|
|
515
|
+
}
|
|
516
|
+
function renderNotFound(notFound) {
|
|
517
|
+
if (notFound == null) return buildDefaultNotFound();
|
|
518
|
+
return typeof notFound === "function" ? (0, import_dom16.createComponent)(notFound, {}) : notFound;
|
|
519
|
+
}
|
|
520
|
+
function buildDefaultNotFound() {
|
|
521
|
+
const el = (0, import_dom16.createNativeElement)("div");
|
|
522
|
+
(0, import_dom16.setAttribute)(el, "class", "fx-not-found");
|
|
523
|
+
(0, import_dom16.setAttribute)(el, "role", "main");
|
|
524
|
+
(0, import_dom16.setAttribute)(
|
|
525
|
+
el,
|
|
526
|
+
"style",
|
|
527
|
+
"min-height:60vh;display:grid;place-content:center;gap:.25rem;text-align:center;font-family:system-ui,-apple-system,sans-serif"
|
|
528
|
+
);
|
|
529
|
+
const h1 = (0, import_dom16.createNativeElement)("h1");
|
|
530
|
+
(0, import_dom16.setAttribute)(h1, "style", "margin:0;font-size:2.5rem;font-weight:700");
|
|
531
|
+
(0, import_dom16.insert)(h1, "404");
|
|
532
|
+
const p = (0, import_dom16.createNativeElement)("p");
|
|
533
|
+
(0, import_dom16.setAttribute)(p, "style", "margin:0;opacity:.7");
|
|
534
|
+
(0, import_dom16.insert)(p, "This page could not be found.");
|
|
535
|
+
el.appendChild(h1);
|
|
536
|
+
el.appendChild(p);
|
|
537
|
+
return el;
|
|
538
|
+
}
|
|
539
|
+
function Router(props) {
|
|
540
|
+
const history = props.history ?? (0, import_router.createBrowserHistory)();
|
|
541
|
+
const router = (0, import_router.createRouter)({
|
|
542
|
+
routes: props.routes,
|
|
543
|
+
base: props.base,
|
|
544
|
+
history
|
|
545
|
+
});
|
|
546
|
+
const [state, setState] = (0, import_signal14.createSignal)(router.state());
|
|
547
|
+
let navigationId = 0;
|
|
548
|
+
const takeMode = () => {
|
|
549
|
+
const mode = pendingTransitionMode ?? (props.transition ?? "auto");
|
|
550
|
+
pendingTransitionMode = void 0;
|
|
551
|
+
return mode;
|
|
552
|
+
};
|
|
553
|
+
const unsub = router.subscribe((next) => {
|
|
554
|
+
const id = ++navigationId;
|
|
555
|
+
const mode = takeMode();
|
|
556
|
+
const prepared = prepareComponents(
|
|
557
|
+
(next.match?.matched ?? []).map((m) => m.component).filter(Boolean)
|
|
558
|
+
);
|
|
559
|
+
const commit = () => {
|
|
560
|
+
setState(next);
|
|
561
|
+
return (0, import_signal14.flush)();
|
|
562
|
+
};
|
|
563
|
+
if (!prepared) {
|
|
564
|
+
void runTransition(mode, commit);
|
|
565
|
+
return;
|
|
566
|
+
}
|
|
567
|
+
void prepared.then(() => {
|
|
568
|
+
if (id !== navigationId) return;
|
|
569
|
+
return runTransition(mode, commit);
|
|
570
|
+
});
|
|
571
|
+
});
|
|
572
|
+
(0, import_signal14.onCleanup)(() => {
|
|
573
|
+
unsub();
|
|
574
|
+
router.destroy();
|
|
575
|
+
navigationId++;
|
|
576
|
+
});
|
|
577
|
+
const matched = (0, import_signal14.createMemo)(
|
|
578
|
+
() => (state().match?.matched ?? []).filter((m) => m.component)
|
|
579
|
+
);
|
|
580
|
+
const ctx = {
|
|
581
|
+
router,
|
|
582
|
+
location: (0, import_signal14.createMemo)(() => state().location),
|
|
583
|
+
params: (0, import_signal14.createMemo)(() => state().match?.params ?? {})
|
|
584
|
+
};
|
|
585
|
+
const root = {
|
|
586
|
+
depth: -1,
|
|
587
|
+
matched,
|
|
588
|
+
params: ctx.params,
|
|
589
|
+
location: ctx.location,
|
|
590
|
+
// Only the root carries this: renderChild shows it when the URL matched nothing.
|
|
591
|
+
notFound: () => renderNotFound(props.notFound)
|
|
592
|
+
};
|
|
593
|
+
let rootView;
|
|
594
|
+
return RouterContext.Provider({
|
|
595
|
+
value: ctx,
|
|
596
|
+
get children() {
|
|
597
|
+
return rootView ??= renderChild(root);
|
|
598
|
+
}
|
|
599
|
+
});
|
|
600
|
+
}
|
|
601
|
+
function Outlet() {
|
|
602
|
+
const ctx = (0, import_signal15.useContext)(OutletContext);
|
|
603
|
+
if (!ctx) return null;
|
|
604
|
+
return renderChild(ctx);
|
|
605
|
+
}
|
|
606
|
+
function Redirect(props) {
|
|
607
|
+
const ctx = (0, import_signal15.useContext)(RouterContext);
|
|
608
|
+
if (ctx && typeof window !== "undefined") {
|
|
609
|
+
let cancelled = false;
|
|
610
|
+
(0, import_signal14.onCleanup)(() => cancelled = true);
|
|
611
|
+
queueMicrotask(() => {
|
|
612
|
+
if (!cancelled) ctx.router.navigate(props.to, { replace: props.replace !== false });
|
|
613
|
+
});
|
|
614
|
+
}
|
|
615
|
+
return null;
|
|
616
|
+
}
|
|
617
|
+
function useRouter() {
|
|
618
|
+
const ctx = (0, import_signal15.useContext)(RouterContext);
|
|
619
|
+
if (ctx) return ctx;
|
|
620
|
+
if (typeof window === "undefined") return _ssrRouterStub;
|
|
621
|
+
throw new Error("[router] useRouter must be used within <Router>");
|
|
622
|
+
}
|
|
623
|
+
function useParams() {
|
|
624
|
+
const params = useRouter().params;
|
|
625
|
+
return (0, import_signal14.createMemo)(() => params(), {}, {
|
|
626
|
+
equals: (a, b) => JSON.stringify(a) === JSON.stringify(b)
|
|
627
|
+
});
|
|
628
|
+
}
|
|
629
|
+
function useLevelParams() {
|
|
630
|
+
return (0, import_signal15.useContext)(LevelParamsContext) ?? {};
|
|
631
|
+
}
|
|
632
|
+
function useParam(key) {
|
|
633
|
+
const params = useParams();
|
|
634
|
+
return (0, import_signal14.createMemo)(() => params()[key]);
|
|
635
|
+
}
|
|
636
|
+
function useParamSelector(selector, equals) {
|
|
637
|
+
const params = useParams();
|
|
638
|
+
return (0, import_signal14.createMemo)(
|
|
639
|
+
() => selector(params()),
|
|
640
|
+
void 0,
|
|
641
|
+
equals ? { equals } : void 0
|
|
642
|
+
);
|
|
643
|
+
}
|
|
644
|
+
function useMatch(path) {
|
|
645
|
+
const location = useLocation();
|
|
646
|
+
return (0, import_signal14.createMemo)(
|
|
647
|
+
() => (0, import_router.matchPath)(typeof path === "function" ? path() : path, location.pathname)
|
|
648
|
+
);
|
|
649
|
+
}
|
|
650
|
+
function useSearchParams() {
|
|
651
|
+
const location = useLocation();
|
|
652
|
+
const navigate = useNavigate();
|
|
653
|
+
const params = (0, import_signal14.createMemo)(() => location.query);
|
|
654
|
+
const setParams = (next, options) => {
|
|
655
|
+
const current = new URLSearchParams(location.search);
|
|
656
|
+
for (const [k, v] of Object.entries(next)) {
|
|
657
|
+
if (v === null) current.delete(k);
|
|
658
|
+
else current.set(k, v);
|
|
659
|
+
}
|
|
660
|
+
const search = current.toString();
|
|
661
|
+
navigate(location.pathname + (search ? `?${search}` : ""), options);
|
|
662
|
+
};
|
|
663
|
+
return [params, setParams];
|
|
664
|
+
}
|
|
665
|
+
function select(source, key) {
|
|
666
|
+
const equals = (a, b) => (0, import_compare.deepEqual)(a, b);
|
|
667
|
+
if (key !== void 0) {
|
|
668
|
+
return (0, import_signal14.createMemo)(
|
|
669
|
+
() => (0, import_object.get)(source(), key),
|
|
670
|
+
void 0,
|
|
671
|
+
{ equals }
|
|
672
|
+
);
|
|
673
|
+
}
|
|
674
|
+
return (0, import_signal14.createMemo)(source, void 0, { equals });
|
|
675
|
+
}
|
|
676
|
+
function useLocation() {
|
|
677
|
+
const { location } = useRouter();
|
|
678
|
+
return new Proxy({}, {
|
|
679
|
+
get: (_t, key) => location()[key],
|
|
680
|
+
has: (_t, key) => key in location(),
|
|
681
|
+
ownKeys: () => Reflect.ownKeys(location()),
|
|
682
|
+
getOwnPropertyDescriptor: (_t, key) => Object.getOwnPropertyDescriptor(location(), key)
|
|
683
|
+
});
|
|
684
|
+
}
|
|
685
|
+
function useLinkNavigation(options = {}) {
|
|
686
|
+
const ctx = (0, import_signal15.useContext)(RouterContext);
|
|
687
|
+
return (event) => {
|
|
688
|
+
if (!ctx || event.defaultPrevented || event.button !== 0) return;
|
|
689
|
+
if (event.metaKey || event.ctrlKey || event.shiftKey || event.altKey) return;
|
|
690
|
+
const target = event.target;
|
|
691
|
+
const anchor = target?.closest?.("a");
|
|
692
|
+
if (!anchor || !anchor.getAttribute("href")) return;
|
|
693
|
+
if (anchor.target && anchor.target !== "_self") return;
|
|
694
|
+
if (anchor.hasAttribute("download")) return;
|
|
695
|
+
if (/(^|\s)external(\s|$)/.test(anchor.getAttribute("rel") ?? "")) return;
|
|
696
|
+
const url = new URL(anchor.href);
|
|
697
|
+
if (url.protocol !== "http:" && url.protocol !== "https:") return;
|
|
698
|
+
if (url.origin !== window.location.origin) return;
|
|
699
|
+
if (url.hash && url.pathname === window.location.pathname && url.search === window.location.search) return;
|
|
700
|
+
if (options.shouldNavigate && !options.shouldNavigate(url, anchor)) return;
|
|
701
|
+
event.preventDefault();
|
|
702
|
+
pendingTransitionMode = options.transition;
|
|
703
|
+
ctx.router.navigate(url.pathname + url.search + url.hash, { replace: options.replace });
|
|
704
|
+
};
|
|
705
|
+
}
|
|
706
|
+
function useNavigate() {
|
|
707
|
+
const { router } = useRouter();
|
|
708
|
+
return (to, options) => {
|
|
709
|
+
pendingTransitionMode = options?.transition;
|
|
710
|
+
router.navigate(to, options);
|
|
711
|
+
};
|
|
712
|
+
}
|
|
713
|
+
function useRouteData() {
|
|
714
|
+
const acc = (0, import_signal15.useContext)(RouteDataContext2);
|
|
715
|
+
return acc ?? (() => void 0);
|
|
716
|
+
}
|
|
717
|
+
function Link(props) {
|
|
718
|
+
const ctx = (0, import_signal15.useContext)(RouterContext);
|
|
719
|
+
const navigate = () => ctx?.router.navigate(read(props.href) ?? "", { replace: read(props.replace) });
|
|
720
|
+
const a = (0, import_dom16.createNativeElement)("a");
|
|
721
|
+
(0, import_dom16.setAttribute)(a, "href", read(props.href) ?? "");
|
|
722
|
+
if (props.slot) (0, import_dom16.setAttribute)(a, "slot", read(props.slot));
|
|
723
|
+
for (const k of Object.keys(props)) {
|
|
724
|
+
if (LINK_OWN_PROPS.has(k)) continue;
|
|
725
|
+
const v = props[k];
|
|
726
|
+
if (v != null && typeof v !== "function") (0, import_dom16.setAttribute)(a, k, String(v));
|
|
727
|
+
}
|
|
728
|
+
if (typeof a.addEventListener === "function") {
|
|
729
|
+
a.addEventListener("click", (e) => {
|
|
730
|
+
if (e.metaKey || e.ctrlKey || e.shiftKey || e.altKey) return;
|
|
731
|
+
e.preventDefault();
|
|
732
|
+
navigate();
|
|
733
|
+
});
|
|
734
|
+
} else {
|
|
735
|
+
const base = read(props.className ?? props.class) ?? "";
|
|
736
|
+
if (base) (0, import_dom16.setAttribute)(a, "class", base);
|
|
737
|
+
}
|
|
738
|
+
if (typeof a.addEventListener === "function") {
|
|
739
|
+
(0, import_signal14.createEffect)(() => {
|
|
740
|
+
const href = read(props.href) ?? "";
|
|
741
|
+
a.setAttribute("href", href);
|
|
742
|
+
const base = read(props.className ?? props.class) ?? "";
|
|
743
|
+
const activeClass = read(props.activeClass) ?? "";
|
|
744
|
+
const active = read(props.active) ?? ctx?.location().pathname === href;
|
|
745
|
+
a.className = [base, active ? activeClass : ""].filter(Boolean).join(" ");
|
|
746
|
+
});
|
|
747
|
+
}
|
|
748
|
+
const linkChildren = props.children;
|
|
749
|
+
if (linkChildren != null) (0, import_dom16.insert)(a, linkChildren);
|
|
750
|
+
return a;
|
|
751
|
+
}
|
|
752
|
+
function Form(props) {
|
|
753
|
+
const action2 = props.action;
|
|
754
|
+
const cls = props.className ?? props.class;
|
|
755
|
+
const url = action2.url ?? "";
|
|
756
|
+
const form = (0, import_dom16.createNativeElement)("form");
|
|
757
|
+
(0, import_dom16.setAttribute)(form, "method", "post");
|
|
758
|
+
if (url) (0, import_dom16.setAttribute)(form, "action", url);
|
|
759
|
+
if (cls) (0, import_dom16.setAttribute)(form, "class", cls);
|
|
760
|
+
for (const k of Object.keys(props)) {
|
|
761
|
+
if (k === "action" || k === "children" || k === "class" || k === "className") continue;
|
|
762
|
+
const v = props[k];
|
|
763
|
+
if (v != null && typeof v !== "function") (0, import_dom16.setAttribute)(form, k, String(v));
|
|
764
|
+
}
|
|
765
|
+
if (typeof form.addEventListener === "function") {
|
|
766
|
+
form.addEventListener("submit", (e) => {
|
|
767
|
+
e.preventDefault();
|
|
768
|
+
const data = {};
|
|
769
|
+
new FormData(form).forEach((v, k) => {
|
|
770
|
+
data[k] = v;
|
|
771
|
+
});
|
|
772
|
+
Promise.resolve(action2(data)).catch(() => {
|
|
773
|
+
});
|
|
774
|
+
});
|
|
775
|
+
}
|
|
776
|
+
const children = props.children;
|
|
777
|
+
if (children != null) (0, import_dom16.insert)(form, children);
|
|
778
|
+
return form;
|
|
779
|
+
}
|
|
780
|
+
async function preloadRoutes(routes, pathname) {
|
|
781
|
+
const match = (0, import_router.matchRoutes)(routes, pathname);
|
|
782
|
+
if (!match) return;
|
|
783
|
+
const loads = [];
|
|
784
|
+
for (const m of match.matched) {
|
|
785
|
+
const c = m.component;
|
|
786
|
+
if (c && typeof c.preload === "function") loads.push(c.preload());
|
|
787
|
+
}
|
|
788
|
+
await Promise.all(loads);
|
|
789
|
+
}
|
|
790
|
+
var import_signal14, import_dom16, import_signal15, import_object, import_compare, import_router, import_router2, import_signal16, RouterContext, OutletContext, LevelParamsContext, RouteDataContext2, pendingTransitionMode, _ssrRouterStub, read, LINK_OWN_PROPS, A;
|
|
791
|
+
var init_router = __esm({
|
|
792
|
+
"src/lib/router/index.ts"() {
|
|
793
|
+
"use strict";
|
|
794
|
+
import_signal14 = require("@fluixi/reactive/signal");
|
|
795
|
+
init_transition();
|
|
796
|
+
import_dom16 = require("@fluixi/dom");
|
|
797
|
+
import_signal15 = require("@fluixi/reactive/signal");
|
|
798
|
+
import_object = require("@fluixi/utils/object");
|
|
799
|
+
import_compare = require("@fluixi/utils/compare");
|
|
800
|
+
import_router = require("@fluixi/router");
|
|
801
|
+
import_router2 = require("@fluixi/router");
|
|
802
|
+
init_data();
|
|
803
|
+
init_lazy();
|
|
804
|
+
init_transition();
|
|
805
|
+
import_signal16 = require("@fluixi/reactive/signal");
|
|
806
|
+
RouterContext = (0, import_signal15.createContext)(void 0, "router");
|
|
807
|
+
OutletContext = (0, import_signal15.createContext)(void 0, "outlet");
|
|
808
|
+
LevelParamsContext = (0, import_signal15.createContext)(void 0, "route-params");
|
|
809
|
+
RouteDataContext2 = (0, import_signal15.createContext)(void 0, "route-data");
|
|
810
|
+
_ssrRouterStub = {
|
|
811
|
+
router: { navigate: () => {
|
|
812
|
+
} },
|
|
813
|
+
location: () => ({ pathname: "", search: "", hash: "", query: {} }),
|
|
814
|
+
params: () => ({})
|
|
815
|
+
};
|
|
816
|
+
read = (v) => typeof v === "function" ? v() : v;
|
|
817
|
+
LINK_OWN_PROPS = /* @__PURE__ */ new Set([
|
|
818
|
+
"href",
|
|
819
|
+
"slot",
|
|
820
|
+
"class",
|
|
821
|
+
"className",
|
|
822
|
+
"active",
|
|
823
|
+
"activeClass",
|
|
824
|
+
"replace",
|
|
825
|
+
"children"
|
|
826
|
+
]);
|
|
827
|
+
A = Link;
|
|
828
|
+
}
|
|
829
|
+
});
|
|
830
|
+
|
|
831
|
+
// src/cdn/core.ts
|
|
832
|
+
var core_exports = {};
|
|
833
|
+
__export(core_exports, {
|
|
834
|
+
$component: () => $component,
|
|
835
|
+
A: () => A,
|
|
836
|
+
ClientOnly: () => import_dom12.ClientOnly,
|
|
837
|
+
DEV: () => DEV,
|
|
838
|
+
Dynamic: () => import_dom12.Dynamic,
|
|
839
|
+
ErrorBoundary: () => import_dom12.ErrorBoundary,
|
|
840
|
+
FRAMEWORK_NAME: () => FRAMEWORK_NAME,
|
|
841
|
+
For: () => import_dom12.For,
|
|
842
|
+
Fragment: () => jsx_runtime_exports.Fragment,
|
|
843
|
+
Index: () => import_dom12.Index,
|
|
844
|
+
Link: () => Link,
|
|
845
|
+
Match: () => import_dom12.Match,
|
|
846
|
+
NoSsr: () => import_dom12.NoSsr,
|
|
847
|
+
Outlet: () => Outlet,
|
|
848
|
+
Portal: () => import_dom12.Portal,
|
|
849
|
+
Redirect: () => Redirect,
|
|
850
|
+
Router: () => Router,
|
|
851
|
+
Show: () => import_dom12.Show,
|
|
852
|
+
Store: () => import_store.Store,
|
|
853
|
+
Suspense: () => Suspense,
|
|
854
|
+
Switch: () => import_dom12.Switch,
|
|
855
|
+
VERSION: () => VERSION2,
|
|
856
|
+
addClass: () => import_dom14.addClass,
|
|
857
|
+
batch: () => import_signal10.batch,
|
|
858
|
+
classMap: () => import_dom13.classMap,
|
|
859
|
+
cleanupDelegation: () => cleanupDelegation,
|
|
860
|
+
composeProviders: () => composeProviders,
|
|
861
|
+
createBrowserHistory: () => import_router2.createBrowserHistory,
|
|
862
|
+
createComponent: () => createComponent,
|
|
863
|
+
createComputed: () => import_signal10.createComputed,
|
|
864
|
+
createConsumer: () => createConsumer,
|
|
865
|
+
createContext: () => createContext3,
|
|
866
|
+
createContextWithProvider: () => createContextWithProvider,
|
|
867
|
+
createDebounce: () => import_signal11.createDebounce,
|
|
868
|
+
createDeferred: () => import_signal10.createDeferred,
|
|
869
|
+
createEffect: () => import_signal10.createEffect,
|
|
870
|
+
createIsomorphicState: () => createIsomorphicState,
|
|
871
|
+
createMemo: () => import_signal10.createMemo,
|
|
872
|
+
createMemoryHistory: () => import_router2.createMemoryHistory,
|
|
873
|
+
createProvider: () => createProvider,
|
|
874
|
+
createRenderEffect: () => import_signal10.createRenderEffect,
|
|
875
|
+
createResource: () => import_signal10.createResource,
|
|
876
|
+
createRoot: () => import_signal10.createRoot,
|
|
877
|
+
createSelector: () => import_signal11.createSelector,
|
|
878
|
+
createSignal: () => import_signal10.createSignal,
|
|
879
|
+
createStore: () => import_store.createStore,
|
|
880
|
+
delegateEvents: () => import_dom14.delegateEvents,
|
|
881
|
+
devOnly: () => devOnly,
|
|
882
|
+
getFrameworkInfo: () => getFrameworkInfo,
|
|
883
|
+
getOwner: () => import_signal10.getOwner,
|
|
884
|
+
getSharedConfig: () => getSharedConfig,
|
|
885
|
+
hydrate: () => import_dom14.hydrate,
|
|
886
|
+
initDelegation: () => initDelegation,
|
|
887
|
+
insert: () => import_dom14.insert,
|
|
888
|
+
isDOMNode: () => import_dom14.isDOMNode,
|
|
889
|
+
isDev: () => isDev,
|
|
890
|
+
isLitTemplateResult: () => import_dom14.isLitTemplateResult,
|
|
891
|
+
isRenderable: () => isRenderable,
|
|
892
|
+
jsx: () => jsx_runtime_exports.jsx,
|
|
893
|
+
jsxs: () => jsx_runtime_exports.jsxs,
|
|
894
|
+
lazy: () => lazy,
|
|
895
|
+
mount: () => mount,
|
|
896
|
+
onCleanup: () => import_signal10.onCleanup,
|
|
897
|
+
onMount: () => onMount,
|
|
898
|
+
onUnmount: () => onUnmount,
|
|
899
|
+
portal: () => portal,
|
|
900
|
+
read: () => import_operators.readSignal,
|
|
901
|
+
reduce: () => import_operators.reduceSignal,
|
|
902
|
+
removeClass: () => import_dom14.removeClass,
|
|
903
|
+
render: () => render,
|
|
904
|
+
runWithOwner: () => import_signal10.runWithOwner,
|
|
905
|
+
setAttribute: () => import_dom14.setAttribute,
|
|
906
|
+
setOwner: () => import_signal10.setOwner,
|
|
907
|
+
setProperty: () => import_dom14.setProperty,
|
|
908
|
+
spread: () => import_dom14.spread,
|
|
909
|
+
startClient: () => startClient,
|
|
910
|
+
styleMap: () => import_dom13.styleMap,
|
|
911
|
+
toggleClass: () => import_dom14.toggleClass,
|
|
912
|
+
untrack: () => import_signal10.untrack,
|
|
913
|
+
untrackStore: () => import_store.untrackStore,
|
|
914
|
+
useCallback: () => useCallback,
|
|
915
|
+
useContext: () => useContext3,
|
|
916
|
+
useEffect: () => useEffect,
|
|
917
|
+
useEventListener: () => useEventListener,
|
|
918
|
+
useLocation: () => useLocation,
|
|
919
|
+
useMatch: () => useMatch,
|
|
920
|
+
useMemo: () => useMemo,
|
|
921
|
+
useNavigate: () => useNavigate,
|
|
922
|
+
useParam: () => useParam,
|
|
923
|
+
useParams: () => useParams,
|
|
924
|
+
useProvide: () => useProvide,
|
|
925
|
+
useReducer: () => useReducer,
|
|
926
|
+
useRef: () => useRef,
|
|
927
|
+
useRouter: () => useRouter,
|
|
928
|
+
useSearchParams: () => useSearchParams
|
|
929
|
+
});
|
|
930
|
+
module.exports = __toCommonJS(core_exports);
|
|
931
|
+
|
|
932
|
+
// src/lib/index.ts
|
|
933
|
+
var import_signal10 = require("@fluixi/reactive/signal");
|
|
934
|
+
var import_signal11 = require("@fluixi/reactive/signal");
|
|
935
|
+
var import_operators = require("@fluixi/reactive/operators");
|
|
936
|
+
var import_store = require("@fluixi/reactive/store");
|
|
937
|
+
|
|
938
|
+
// src/lib/render/index.ts
|
|
939
|
+
var import_dom8 = require("@fluixi/dom");
|
|
940
|
+
var import_signal6 = require("@fluixi/reactive/signal");
|
|
941
|
+
|
|
942
|
+
// src/lib/render/versions.ts
|
|
943
|
+
var import_dom = require("@fluixi/dom");
|
|
944
|
+
|
|
945
|
+
// src/version.generated.ts
|
|
946
|
+
var VERSION = "1.0.0-alpha.85";
|
|
947
|
+
|
|
948
|
+
// src/lib/render/versions.ts
|
|
949
|
+
var import_dom2 = require("@fluixi/dom");
|
|
950
|
+
(0, import_dom.registerCoreVersion)(VERSION);
|
|
951
|
+
|
|
952
|
+
// src/lib/render/index.ts
|
|
953
|
+
var import_dom9 = require("@fluixi/dom");
|
|
954
|
+
|
|
955
|
+
// src/lib/render/component.ts
|
|
956
|
+
var import_dom3 = require("@fluixi/dom");
|
|
957
|
+
var import_dom4 = require("@fluixi/dom");
|
|
958
|
+
var import_signal = require("@fluixi/reactive/signal");
|
|
959
|
+
var sharedConfig = {
|
|
960
|
+
context: null,
|
|
961
|
+
owner: null
|
|
962
|
+
};
|
|
963
|
+
function getSharedConfig() {
|
|
964
|
+
return sharedConfig;
|
|
965
|
+
}
|
|
966
|
+
var DEV = typeof process !== "undefined" && false;
|
|
967
|
+
var _LIFECYCLE = /* @__PURE__ */ Symbol.for("fluixi-lifecycle");
|
|
968
|
+
function getOwnerLifecycle() {
|
|
969
|
+
const owner = (0, import_signal.getOwner)();
|
|
970
|
+
if (!owner) return null;
|
|
971
|
+
if (!owner[_LIFECYCLE]) {
|
|
972
|
+
const lc = { mounts: [], effects: [], scheduled: false };
|
|
973
|
+
owner[_LIFECYCLE] = lc;
|
|
974
|
+
}
|
|
975
|
+
return owner[_LIFECYCLE];
|
|
976
|
+
}
|
|
977
|
+
function scheduleLifecycleFlush(lc) {
|
|
978
|
+
if (lc.scheduled) return;
|
|
979
|
+
if ((0, import_dom3.isServer)()) {
|
|
980
|
+
lc.mounts = [];
|
|
981
|
+
lc.effects = [];
|
|
982
|
+
return;
|
|
983
|
+
}
|
|
984
|
+
lc.scheduled = true;
|
|
985
|
+
const owner = (0, import_signal.getOwner)();
|
|
986
|
+
queueMicrotask(() => {
|
|
987
|
+
if ((0, import_signal.isOwnerDisposed)(owner)) {
|
|
988
|
+
lc.mounts = [];
|
|
989
|
+
lc.effects = [];
|
|
990
|
+
return;
|
|
991
|
+
}
|
|
992
|
+
(0, import_signal.runWithOwner)(owner, () => {
|
|
993
|
+
for (const cb of lc.mounts) {
|
|
994
|
+
try {
|
|
995
|
+
const cleanup = cb();
|
|
996
|
+
if (typeof cleanup === "function") {
|
|
997
|
+
(0, import_signal.onCleanup)(cleanup);
|
|
998
|
+
}
|
|
999
|
+
} catch (e) {
|
|
1000
|
+
console.error("Error in onMount callback:", e);
|
|
1001
|
+
}
|
|
1002
|
+
}
|
|
1003
|
+
for (const cb of lc.effects) {
|
|
1004
|
+
let cleanup;
|
|
1005
|
+
(0, import_signal.createEffect)(() => {
|
|
1006
|
+
if (cleanup) cleanup();
|
|
1007
|
+
cleanup = cb();
|
|
1008
|
+
});
|
|
1009
|
+
(0, import_signal.onCleanup)(() => {
|
|
1010
|
+
if (cleanup) cleanup();
|
|
1011
|
+
});
|
|
1012
|
+
}
|
|
1013
|
+
lc.mounts = [];
|
|
1014
|
+
lc.effects = [];
|
|
1015
|
+
});
|
|
1016
|
+
});
|
|
1017
|
+
}
|
|
1018
|
+
function createComponent(Comp, props) {
|
|
1019
|
+
return (0, import_dom4.createComponent)(Comp, props);
|
|
1020
|
+
}
|
|
1021
|
+
function $component(value, props) {
|
|
1022
|
+
const component = typeof value === "function" ? (0, import_signal.untrack)(() => value(props)) : value;
|
|
1023
|
+
const nameable = component != null && (typeof component === "function" || typeof component === "object");
|
|
1024
|
+
if (nameable) {
|
|
1025
|
+
try {
|
|
1026
|
+
component["$name"] = value.name;
|
|
1027
|
+
} catch {
|
|
1028
|
+
}
|
|
1029
|
+
}
|
|
1030
|
+
if (nameable && !(0, import_signal.isSignal)(component)) {
|
|
1031
|
+
return (0, import_dom4.asComponent)(component);
|
|
1032
|
+
}
|
|
1033
|
+
return component;
|
|
1034
|
+
}
|
|
1035
|
+
function onMount(fn, reactive = true) {
|
|
1036
|
+
if ((0, import_dom3.isServer)()) return;
|
|
1037
|
+
const lc = getOwnerLifecycle();
|
|
1038
|
+
if (lc) {
|
|
1039
|
+
if (!reactive) {
|
|
1040
|
+
if (!lc.scheduled) {
|
|
1041
|
+
fn();
|
|
1042
|
+
}
|
|
1043
|
+
return;
|
|
1044
|
+
}
|
|
1045
|
+
lc.mounts.push(fn);
|
|
1046
|
+
scheduleLifecycleFlush(lc);
|
|
1047
|
+
} else {
|
|
1048
|
+
if (!reactive) {
|
|
1049
|
+
fn();
|
|
1050
|
+
return;
|
|
1051
|
+
}
|
|
1052
|
+
(0, import_signal.createEffect)(() => {
|
|
1053
|
+
const cleanup = (0, import_signal.untrack)(fn);
|
|
1054
|
+
if (typeof cleanup === "function") {
|
|
1055
|
+
(0, import_signal.onCleanup)(cleanup);
|
|
1056
|
+
}
|
|
1057
|
+
});
|
|
1058
|
+
}
|
|
1059
|
+
}
|
|
1060
|
+
function onUnmount(fn) {
|
|
1061
|
+
(0, import_signal.onCleanup)(fn);
|
|
1062
|
+
}
|
|
1063
|
+
function useEffect(callback) {
|
|
1064
|
+
const lc = getOwnerLifecycle();
|
|
1065
|
+
if (lc) {
|
|
1066
|
+
lc.effects.push(callback);
|
|
1067
|
+
scheduleLifecycleFlush(lc);
|
|
1068
|
+
} else {
|
|
1069
|
+
let cleanup;
|
|
1070
|
+
(0, import_signal.createEffect)(() => {
|
|
1071
|
+
if (cleanup) cleanup();
|
|
1072
|
+
cleanup = callback();
|
|
1073
|
+
});
|
|
1074
|
+
(0, import_signal.onCleanup)(() => {
|
|
1075
|
+
if (cleanup) cleanup();
|
|
1076
|
+
});
|
|
1077
|
+
}
|
|
1078
|
+
}
|
|
1079
|
+
function useMemo(fn) {
|
|
1080
|
+
return (0, import_signal.createMemo)(fn);
|
|
1081
|
+
}
|
|
1082
|
+
function useRef(initialValue) {
|
|
1083
|
+
const ref = { current: initialValue };
|
|
1084
|
+
(0, import_signal.onCleanup)(() => {
|
|
1085
|
+
ref.current = null;
|
|
1086
|
+
});
|
|
1087
|
+
return ref;
|
|
1088
|
+
}
|
|
1089
|
+
function useReducer(reducer, initialState) {
|
|
1090
|
+
const [state, setState] = (0, import_signal.createSignal)(initialState);
|
|
1091
|
+
const dispatch = (action2) => {
|
|
1092
|
+
setState(reducer(state(), action2));
|
|
1093
|
+
};
|
|
1094
|
+
return [state, dispatch];
|
|
1095
|
+
}
|
|
1096
|
+
function useEventListener(target, event, handler, options) {
|
|
1097
|
+
useEffect(() => {
|
|
1098
|
+
const element = target && "current" in target ? target.current : target;
|
|
1099
|
+
if (!element) return;
|
|
1100
|
+
element.addEventListener(event, handler, options);
|
|
1101
|
+
return () => {
|
|
1102
|
+
element.removeEventListener(event, handler, options);
|
|
1103
|
+
};
|
|
1104
|
+
});
|
|
1105
|
+
}
|
|
1106
|
+
function useCallback(callback) {
|
|
1107
|
+
return callback;
|
|
1108
|
+
}
|
|
1109
|
+
function isDev() {
|
|
1110
|
+
return DEV;
|
|
1111
|
+
}
|
|
1112
|
+
function devOnly(fn) {
|
|
1113
|
+
if (DEV) {
|
|
1114
|
+
fn();
|
|
1115
|
+
}
|
|
1116
|
+
}
|
|
1117
|
+
|
|
1118
|
+
// src/lib/render/suspense.ts
|
|
1119
|
+
var import_signal2 = require("@fluixi/reactive/signal");
|
|
1120
|
+
var import_dom5 = require("@fluixi/dom");
|
|
1121
|
+
function isPromise(value) {
|
|
1122
|
+
return !!(value && typeof value === "object" && typeof value.then === "function" || value instanceof Promise);
|
|
1123
|
+
}
|
|
1124
|
+
var SuspenseListContext = (0, import_signal2.createContext)(void 0, "suspense-list");
|
|
1125
|
+
function Suspense(props) {
|
|
1126
|
+
return (0, import_dom5.createComponent)(SuspenseImpl, props);
|
|
1127
|
+
}
|
|
1128
|
+
function SuspenseImpl(props) {
|
|
1129
|
+
const boundary = (0, import_signal2.createSuspenseBoundary)();
|
|
1130
|
+
const listCtx = (0, import_signal2.useContext)(SuspenseListContext);
|
|
1131
|
+
const listState = listCtx ? listCtx.register(boundary.inFallback) : void 0;
|
|
1132
|
+
function instantiateOnce(val) {
|
|
1133
|
+
if (val == null || typeof val === "boolean") return null;
|
|
1134
|
+
if (typeof val === "function" && (0, import_dom5.isComponent)(val) && !(0, import_signal2.isSignal)(val)) return val();
|
|
1135
|
+
return val;
|
|
1136
|
+
}
|
|
1137
|
+
const fallback = (0, import_dom5.runWithoutHydration)(() => instantiateOnce(props.fallback ?? null));
|
|
1138
|
+
const children = (0, import_signal2.provideSuspense)(boundary, () => (0, import_signal2.readChildren)(() => props.children));
|
|
1139
|
+
const track = (value, depth) => {
|
|
1140
|
+
if (depth > 8) return;
|
|
1141
|
+
if (Array.isArray(value)) {
|
|
1142
|
+
for (const x of value) track(x, depth + 1);
|
|
1143
|
+
} else if (typeof value === "function" && (0, import_signal2.isSignal)(value)) {
|
|
1144
|
+
track(value(), depth + 1);
|
|
1145
|
+
}
|
|
1146
|
+
};
|
|
1147
|
+
(0, import_signal2.provideSuspense)(boundary, () => {
|
|
1148
|
+
(0, import_signal2.createRenderEffect)(() => track(children, 0));
|
|
1149
|
+
});
|
|
1150
|
+
const [resolved, setResolved] = (0, import_signal2.createSignal)(void 0);
|
|
1151
|
+
const childIsPromise = isPromise(children);
|
|
1152
|
+
if (childIsPromise) {
|
|
1153
|
+
boundary.increment();
|
|
1154
|
+
children.then(
|
|
1155
|
+
(v) => {
|
|
1156
|
+
setResolved(() => v);
|
|
1157
|
+
boundary.decrement();
|
|
1158
|
+
},
|
|
1159
|
+
() => boundary.decrement()
|
|
1160
|
+
);
|
|
1161
|
+
}
|
|
1162
|
+
return (0, import_signal2.createMemo)(() => {
|
|
1163
|
+
const showFallback = listState ? listState.showFallback() : boundary.inFallback();
|
|
1164
|
+
if (showFallback) return fallback;
|
|
1165
|
+
if (childIsPromise) return resolved();
|
|
1166
|
+
return children;
|
|
1167
|
+
});
|
|
1168
|
+
}
|
|
1169
|
+
(0, import_dom5.asSuspense)(Suspense);
|
|
1170
|
+
Object.defineProperty(Suspense, "__suspense", { value: true, enumerable: true });
|
|
1171
|
+
|
|
1172
|
+
// src/lib/render/index.ts
|
|
1173
|
+
init_lazy();
|
|
1174
|
+
|
|
1175
|
+
// src/lib/render/deferred.ts
|
|
1176
|
+
var import_dom7 = require("@fluixi/dom");
|
|
1177
|
+
var import_signal4 = require("@fluixi/reactive/signal");
|
|
1178
|
+
var import_utils = require("@fluixi/dom/utils");
|
|
1179
|
+
init_lazy();
|
|
1180
|
+
|
|
1181
|
+
// src/lib/render/await.ts
|
|
1182
|
+
var import_signal5 = require("@fluixi/reactive/signal");
|
|
1183
|
+
|
|
1184
|
+
// src/lib/render/index.ts
|
|
1185
|
+
function render(code, container, options = {}) {
|
|
1186
|
+
(0, import_dom9.delegateEvents)(["click", "input", "change", "submit"]);
|
|
1187
|
+
if ((0, import_dom8.isServer)()) {
|
|
1188
|
+
throw new Error(
|
|
1189
|
+
"render() is for client-side only. Use renderToString() on server."
|
|
1190
|
+
);
|
|
1191
|
+
}
|
|
1192
|
+
if (!container) {
|
|
1193
|
+
throw new Error("Container element is required");
|
|
1194
|
+
}
|
|
1195
|
+
let disposer;
|
|
1196
|
+
(0, import_signal6.createRoot)((dispose) => {
|
|
1197
|
+
disposer = dispose;
|
|
1198
|
+
const result = typeof code === "function" ? code() : code;
|
|
1199
|
+
container.textContent = "";
|
|
1200
|
+
(0, import_dom2.stampVersions)(container);
|
|
1201
|
+
(0, import_dom2.warnOnVersionSkew)();
|
|
1202
|
+
(0, import_dom9.insert)(container, () => result);
|
|
1203
|
+
});
|
|
1204
|
+
return () => {
|
|
1205
|
+
if (disposer) {
|
|
1206
|
+
disposer();
|
|
1207
|
+
disposer = void 0;
|
|
1208
|
+
}
|
|
1209
|
+
};
|
|
1210
|
+
}
|
|
1211
|
+
function isLitTemplateResult(value) {
|
|
1212
|
+
return value && typeof value === "object" && (value["_$litType$"] !== void 0 || value["_$litDirective$"] !== void 0);
|
|
1213
|
+
}
|
|
1214
|
+
function portal(code, target, options = {}) {
|
|
1215
|
+
const container = document.createElement("div");
|
|
1216
|
+
container.setAttribute("data-portal", "true");
|
|
1217
|
+
target.appendChild(container);
|
|
1218
|
+
const dispose = render(code, container, options);
|
|
1219
|
+
return () => {
|
|
1220
|
+
dispose();
|
|
1221
|
+
if (target.contains(container)) {
|
|
1222
|
+
target.removeChild(container);
|
|
1223
|
+
}
|
|
1224
|
+
};
|
|
1225
|
+
}
|
|
1226
|
+
function isRenderable(value) {
|
|
1227
|
+
if (value == null) return true;
|
|
1228
|
+
if (typeof value === "function") return true;
|
|
1229
|
+
if ((0, import_dom9.isDOMNode)(value)) return true;
|
|
1230
|
+
if (isLitTemplateResult(value)) return true;
|
|
1231
|
+
if (Array.isArray(value)) return true;
|
|
1232
|
+
if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") {
|
|
1233
|
+
return true;
|
|
1234
|
+
}
|
|
1235
|
+
return false;
|
|
1236
|
+
}
|
|
1237
|
+
function initDelegation() {
|
|
1238
|
+
if ((0, import_dom8.isServer)()) return;
|
|
1239
|
+
(0, import_dom9.delegateEvents)(["click", "input", "change", "submit"]);
|
|
1240
|
+
}
|
|
1241
|
+
function cleanupDelegation() {
|
|
1242
|
+
if ((0, import_dom8.isServer)()) return;
|
|
1243
|
+
}
|
|
1244
|
+
|
|
1245
|
+
// src/lib/context/index.ts
|
|
1246
|
+
init_context();
|
|
1247
|
+
|
|
1248
|
+
// src/lib/isomorphic.ts
|
|
1249
|
+
var import_signal9 = require("@fluixi/reactive/signal");
|
|
1250
|
+
var import_dom11 = require("@fluixi/dom");
|
|
1251
|
+
var REGISTRY_KEY = "__fluixi_iso_states__";
|
|
1252
|
+
var SEED_PREFIX = "__iso:";
|
|
1253
|
+
function registry() {
|
|
1254
|
+
return globalThis[REGISTRY_KEY] ??= /* @__PURE__ */ new Map();
|
|
1255
|
+
}
|
|
1256
|
+
function readSeed(key) {
|
|
1257
|
+
if (typeof window === "undefined") return void 0;
|
|
1258
|
+
const data = (0, import_dom11.getServerData)();
|
|
1259
|
+
return data ? data[SEED_PREFIX + key] : void 0;
|
|
1260
|
+
}
|
|
1261
|
+
function createIsomorphicState(key, options) {
|
|
1262
|
+
const seed = readSeed(key);
|
|
1263
|
+
const initial = seed !== void 0 ? seed : typeof window !== "undefined" && options.client ? options.client() : options.fallback;
|
|
1264
|
+
const [value, set] = (0, import_signal9.createSignal)(initial);
|
|
1265
|
+
registry().set(key, { server: options.server, set });
|
|
1266
|
+
return { value, set, key };
|
|
1267
|
+
}
|
|
1268
|
+
|
|
1269
|
+
// src/lib/index.ts
|
|
1270
|
+
var import_dom13 = require("@fluixi/dom");
|
|
1271
|
+
|
|
1272
|
+
// src/lib/control-flow.ts
|
|
1273
|
+
var import_dom12 = require("@fluixi/dom");
|
|
1274
|
+
|
|
1275
|
+
// src/lib/index.ts
|
|
1276
|
+
var import_dom14 = require("@fluixi/dom");
|
|
1277
|
+
|
|
1278
|
+
// src/lib/jsx-runtime/index.ts
|
|
1279
|
+
var jsx_runtime_exports = {};
|
|
1280
|
+
__reExport(jsx_runtime_exports, require("@fluixi/jsx/jsx-runtime"));
|
|
1281
|
+
|
|
1282
|
+
// src/lib/index.ts
|
|
1283
|
+
var import_signal12 = require("@fluixi/reactive/signal");
|
|
1284
|
+
var VERSION2 = "0.0.1";
|
|
1285
|
+
var FRAMEWORK_NAME = "Fluixi";
|
|
1286
|
+
function getFrameworkInfo() {
|
|
1287
|
+
return {
|
|
1288
|
+
name: FRAMEWORK_NAME,
|
|
1289
|
+
version: VERSION2,
|
|
1290
|
+
features: {
|
|
1291
|
+
ssr: true,
|
|
1292
|
+
hydration: true,
|
|
1293
|
+
jsx: true,
|
|
1294
|
+
litHtml: true,
|
|
1295
|
+
signals: true,
|
|
1296
|
+
fineGrained: true,
|
|
1297
|
+
lazy: true,
|
|
1298
|
+
hooks: true,
|
|
1299
|
+
devMode: true
|
|
1300
|
+
}
|
|
1301
|
+
};
|
|
1302
|
+
}
|
|
1303
|
+
|
|
1304
|
+
// src/lib/client/index.ts
|
|
1305
|
+
var import_dom17 = require("@fluixi/dom");
|
|
1306
|
+
init_hydration();
|
|
1307
|
+
var import_signal17 = require("@fluixi/reactive/signal");
|
|
1308
|
+
var import_head = require("@fluixi/head");
|
|
1309
|
+
var import_dom18 = require("@fluixi/dom");
|
|
1310
|
+
function mount(App, container) {
|
|
1311
|
+
if (!container) {
|
|
1312
|
+
throw new Error("Container element not found for mount()");
|
|
1313
|
+
}
|
|
1314
|
+
(0, import_dom17.render)(() => App(), container);
|
|
1315
|
+
}
|
|
1316
|
+
var rootOf = (App) => (0, import_signal17.createMemo)(() => createComponent(App));
|
|
1317
|
+
async function startClient(App, options = {}) {
|
|
1318
|
+
const container = typeof options.root === "string" ? document.querySelector(options.root) : options.root ?? document.querySelector("#app");
|
|
1319
|
+
if (!container) {
|
|
1320
|
+
throw new Error(
|
|
1321
|
+
`[Fluixi] Mount container not found: ${options.root ?? "#app"}`
|
|
1322
|
+
);
|
|
1323
|
+
}
|
|
1324
|
+
const hasServerDom = !!document.getElementById("__FLUIXI_HYDRATION__") || !!options.routes && container.firstElementChild != null;
|
|
1325
|
+
const shouldHydrate = options.hydrate ?? hasServerDom;
|
|
1326
|
+
const head = (0, import_head.createHead)();
|
|
1327
|
+
(0, import_head.setActiveHead)(head);
|
|
1328
|
+
(0, import_head.stripHeadMarker)(container);
|
|
1329
|
+
if (shouldHydrate) {
|
|
1330
|
+
if (options.routes && options.routes.length) {
|
|
1331
|
+
const { preloadRoutes: preloadRoutes2 } = await Promise.resolve().then(() => (init_router(), router_exports));
|
|
1332
|
+
await preloadRoutes2(options.routes, window.location.pathname);
|
|
1333
|
+
}
|
|
1334
|
+
deserializeHydrationData();
|
|
1335
|
+
setHydrating(true);
|
|
1336
|
+
(0, import_dom17.hydrate)(rootOf(App), container);
|
|
1337
|
+
replayEvents();
|
|
1338
|
+
setTimeout(() => {
|
|
1339
|
+
setHydrating(false);
|
|
1340
|
+
cleanupHydration();
|
|
1341
|
+
}, 100);
|
|
1342
|
+
} else {
|
|
1343
|
+
render(rootOf(App), container);
|
|
1344
|
+
}
|
|
1345
|
+
(0, import_head.mountHead)(head);
|
|
1346
|
+
}
|
|
1347
|
+
function replayEvents() {
|
|
1348
|
+
if (typeof window === "undefined") return;
|
|
1349
|
+
const w = window;
|
|
1350
|
+
if (typeof w.__FX_REPLAY_STOP__ === "function") w.__FX_REPLAY_STOP__();
|
|
1351
|
+
const queue = w.__FX_REPLAY__;
|
|
1352
|
+
w.__FX_REPLAY__ = void 0;
|
|
1353
|
+
w.__FX_REPLAY_STOP__ = void 0;
|
|
1354
|
+
if (!Array.isArray(queue) || queue.length === 0) return;
|
|
1355
|
+
for (const rec of queue) {
|
|
1356
|
+
const target = rec && rec.target;
|
|
1357
|
+
if (!target || target.isConnected === false || typeof target.dispatchEvent !== "function") continue;
|
|
1358
|
+
const type = rec.type;
|
|
1359
|
+
const ev = type === "click" ? new MouseEvent(type, { bubbles: true, cancelable: true }) : new Event(type, { bubbles: true, cancelable: true });
|
|
1360
|
+
target.dispatchEvent(ev);
|
|
1361
|
+
}
|
|
1362
|
+
}
|
|
1363
|
+
|
|
1364
|
+
// src/cdn/core.ts
|
|
1365
|
+
init_router();
|