@fluixi/core 1.0.0-alpha.75 → 1.0.0-alpha.76

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.
Files changed (39) hide show
  1. package/dist/cdn/core.global.js +1 -1
  2. package/dist/src/cdn/chunk-MYXLT5LG.mjs +1 -0
  3. package/dist/src/cdn/core.cjs +1 -1
  4. package/dist/src/cdn/core.mjs +1 -1
  5. package/dist/src/cdn/router-next-YWV2KJP4.mjs +1 -0
  6. package/dist/src/index.cjs +1 -1
  7. package/dist/src/index.mjs +1 -1
  8. package/dist/src/lib/client/index.cjs +1 -1
  9. package/dist/src/lib/client/index.mjs +1 -1
  10. package/dist/src/lib/client/router-next-2FH6DRYT.mjs +1 -0
  11. package/dist/src/lib/core.cjs +1 -1
  12. package/dist/src/lib/core.d.ts +2 -2
  13. package/dist/src/lib/core.d.ts.map +1 -1
  14. package/dist/src/lib/core.js +4 -2
  15. package/dist/src/lib/core.mjs +1 -1
  16. package/dist/src/lib/index.cjs +1 -1
  17. package/dist/src/lib/index.mjs +1 -1
  18. package/dist/src/lib/render/index.cjs +1 -1
  19. package/dist/src/lib/render/index.mjs +1 -1
  20. package/dist/src/lib/render/suspense.cjs +1 -1
  21. package/dist/src/lib/render/suspense.d.ts.map +1 -1
  22. package/dist/src/lib/render/suspense.js +32 -13
  23. package/dist/src/lib/render/suspense.mjs +1 -1
  24. package/dist/src/lib/render/versions.cjs +1 -1
  25. package/dist/src/lib/render/versions.mjs +1 -1
  26. package/dist/src/lib/router-next/index.cjs +1 -1
  27. package/dist/src/lib/router-next/index.d.ts +33 -0
  28. package/dist/src/lib/router-next/index.d.ts.map +1 -1
  29. package/dist/src/lib/router-next/index.js +54 -0
  30. package/dist/src/lib/router-next/index.mjs +1 -1
  31. package/dist/src/version.generated.cjs +1 -1
  32. package/dist/src/version.generated.d.ts +1 -1
  33. package/dist/src/version.generated.js +1 -1
  34. package/dist/src/version.generated.mjs +1 -1
  35. package/dist/tsconfig.lib.tsbuildinfo +1 -1
  36. package/package.json +11 -11
  37. package/dist/src/cdn/chunk-77RTVCS5.mjs +0 -1
  38. package/dist/src/cdn/router-next-32ZDQIFJ.mjs +0 -1
  39. package/dist/src/lib/client/router-next-NL65GSYA.mjs +0 -1
@@ -4,7 +4,7 @@
4
4
  * SuspenseContext on this component's owner), which flips inFallback. The output
5
5
  * memo swaps between fallback and children on that signal.
6
6
  */
7
- import { createSignal, createMemo, createEffect, createRenderEffect, isSignal, useContext, createContext, createSuspenseBoundary, provideSuspense, } from '@fluixi/reactive/signal';
7
+ import { createSignal, createMemo, createEffect, createRenderEffect, isSignal, readChildren, useContext, createContext, createSuspenseBoundary, provideSuspense, } from '@fluixi/reactive/signal';
8
8
  import { asSuspense, isComponent, createComponent, runWithoutHydration, } from '@fluixi/dom';
9
9
  export const $SUSPENSE = Symbol.for('suspense');
10
10
  function isNode(value) {
@@ -49,24 +49,41 @@ function SuspenseImpl(props) {
49
49
  const fallback = runWithoutHydration(() => instantiateOnce(props.fallback ?? null));
50
50
  // Read the children under the boundary so the memos they create capture its owner;
51
51
  // then a suspended resource read inside them throws to THIS boundary, not the parent.
52
- const children = provideSuspense(boundary, () => props.children);
52
+ //
53
+ // `readChildren`, not a bare `props.children` read: a component child arrives as a THUNK
54
+ // that instantiates when called, so reading the prop alone hands back a function and the
55
+ // component never runs here. It would then be instantiated later, downstream of the output
56
+ // memo, where a suspend has no boundary that can re-run it — the failure that produced an
57
+ // empty node on a client navigation into a not-yet-loaded lazy route: no fallback, no
58
+ // content, no error. `readChildren` unwraps the thunks (so the lazy component runs under
59
+ // this boundary), stops at signals so dynamic children stay reactive, and memoises the
60
+ // result so the tracking effect below and the output render the same instantiation.
61
+ const children = provideSuspense(boundary, () => readChildren(() => props.children));
53
62
  // Instantiate the children now, in their own effect under the boundary. A suspended
54
63
  // resource read inside them throws here synchronously — a sibling of the output memo
55
64
  // below — so the increment reschedules the output cleanly (matching the canary). If we
56
65
  // only rendered children through the output's return, the resource read would be nested
57
66
  // inside the output's own insert effect, which then never re-runs to show the fallback.
67
+ //
68
+ // Follow NESTED accessors, not just the outer one: the compiler wraps a dynamic child in
69
+ // its own memo, and `readChildren` stops at signals on purpose so they stay reactive. Stop
70
+ // at the outer read and a lazy component behind a condition is never instantiated here —
71
+ // it runs later, downstream, where its suspend reaches no boundary. Reading a memo is
72
+ // idempotent (it caches, and the output reads the same one), so following the chain costs
73
+ // nothing and cannot duplicate the subtree.
74
+ const track = (value, depth) => {
75
+ if (depth > 8)
76
+ return;
77
+ if (Array.isArray(value)) {
78
+ for (const x of value)
79
+ track(x, depth + 1);
80
+ }
81
+ else if (typeof value === 'function' && isSignal(value)) {
82
+ track(value(), depth + 1);
83
+ }
84
+ };
58
85
  provideSuspense(boundary, () => {
59
- createRenderEffect(() => {
60
- const c = children;
61
- if (Array.isArray(c)) {
62
- for (const x of c)
63
- if (typeof x === 'function' && isSignal(x))
64
- x();
65
- }
66
- else if (typeof c === 'function' && isSignal(c)) {
67
- c();
68
- }
69
- });
86
+ createRenderEffect(() => track(children, 0));
70
87
  });
71
88
  // A raw promise child: track it directly on the boundary.
72
89
  const [resolved, setResolved] = createSignal(undefined);
@@ -80,6 +97,8 @@ function SuspenseImpl(props) {
80
97
  }
81
98
  return createMemo(() => {
82
99
  const showFallback = listState ? listState.showFallback() : boundary.inFallback();
100
+ if (process.env.FX_DEBUG)
101
+ console.log('[s] output; showFallback:', showFallback);
83
102
  if (showFallback)
84
103
  return fallback;
85
104
  if (childIsPromise)
@@ -1 +1 @@
1
- import{createSignal as d,createMemo as m,createEffect as w,createRenderEffect as k,isSignal as p,useContext as C,createContext as F,createSuspenseBoundary as P,provideSuspense as y}from"@fluixi/reactive/signal";import{asSuspense as g,isComponent as A,createComponent as b,runWithoutHydration as L}from"@fluixi/dom";var $=Symbol.for("suspense");function O(e){return typeof window>"u"?!1:typeof Node=="function"&&e instanceof Node?!0:!!(e&&typeof e=="object"&&typeof e.nodeType=="number")}function T(e){return!e||typeof e!="object"?!1:!!(typeof e._$litType$<"u"||typeof e._$litDirective$<"u"||Array.isArray(e.strings)&&Array.isArray(e.values))}function x(e){return!!(e&&typeof e=="object"&&typeof e.then=="function"||e instanceof Promise)}function _(e){return!!(e&&typeof e=="object"&&"type"in e&&"props"in e)}var S=F();function h(e){return b(R,e)}function R(e){let s=P(),a=C(S),i=a?a.register(s.inFallback):void 0;function l(n){return n==null||typeof n=="boolean"?null:typeof n=="function"&&A(n)&&!p(n)?n():n}let f=L(()=>l(e.fallback??null)),t=y(s,()=>e.children);y(s,()=>{k(()=>{let n=t;if(Array.isArray(n))for(let u of n)typeof u=="function"&&p(u)&&u();else typeof n=="function"&&p(n)&&n()})});let[o,r]=d(void 0),c=x(t);return c&&(s.increment(),t.then(n=>{r(()=>n),s.decrement()},()=>s.decrement())),m(()=>(i?i.showFallback():s.inFallback())?f:c?o():t)}function B(e){return b(E,e)}function E(e){let{revealOrder:s="together",tail:a}=e,i=[];function l(){if(s==="together"){let t=i.every(o=>!o.inFallback());i.forEach(o=>{o.setShowContent(t),o.setShowFallback(!t)})}else{let t=s==="backwards"?[...i].reverse():i,o=!1;for(let r of t)o||r.inFallback()?(o=!0,r.setShowContent(!1),r.setShowFallback(a!=="hidden")):(r.setShowContent(!0),r.setShowFallback(!1))}}let f={register:t=>{let[o,r]=d(!0),[c,n]=d(!1);return i.push({inFallback:t,setShowContent:r,setShowFallback:n}),w(()=>{t(),l()}),{showContent:o,showFallback:c}}};return S.Provider({value:f,children:e.children})}g(h);Object.defineProperty(h,"__suspense",{value:!0,enumerable:!0});export{$ as $SUSPENSE,h as Suspense,B as SuspenseList,_ as isJSXElement,T as isLitResult,O as isNode,x as isPromise};
1
+ import{createSignal as d,createMemo as w,createEffect as C,createRenderEffect as F,isSignal as y,readChildren as g,useContext as P,createContext as A,createSuspenseBoundary as L,provideSuspense as b}from"@fluixi/reactive/signal";import{asSuspense as x,isComponent as E,createComponent as S,runWithoutHydration as R}from"@fluixi/dom";var O=Symbol.for("suspense");function T(e){return typeof window>"u"?!1:typeof Node=="function"&&e instanceof Node?!0:!!(e&&typeof e=="object"&&typeof e.nodeType=="number")}function I(e){return!e||typeof e!="object"?!1:!!(typeof e._$litType$<"u"||typeof e._$litDirective$<"u"||Array.isArray(e.strings)&&Array.isArray(e.values))}function j(e){return!!(e&&typeof e=="object"&&typeof e.then=="function"||e instanceof Promise)}function D(e){return!!(e&&typeof e=="object"&&"type"in e&&"props"in e)}var h=A();function m(e){return S(N,e)}function N(e){let s=L(),a=P(h),i=a?a.register(s.inFallback):void 0;function l(n){return n==null||typeof n=="boolean"?null:typeof n=="function"&&E(n)&&!y(n)?n():n}let f=R(()=>l(e.fallback??null)),o=b(s,()=>g(()=>e.children)),t=(n,p)=>{if(!(p>8))if(Array.isArray(n))for(let k of n)t(k,p+1);else typeof n=="function"&&y(n)&&t(n(),p+1)};b(s,()=>{F(()=>t(o,0))});let[r,u]=d(void 0),c=j(o);return c&&(s.increment(),o.then(n=>{u(()=>n),s.decrement()},()=>s.decrement())),w(()=>{let n=i?i.showFallback():s.inFallback();return process.env.FX_DEBUG&&console.log("[s] output; showFallback:",n),n?f:c?r():o})}function U(e){return S(_,e)}function _(e){let{revealOrder:s="together",tail:a}=e,i=[];function l(){if(s==="together"){let o=i.every(t=>!t.inFallback());i.forEach(t=>{t.setShowContent(o),t.setShowFallback(!o)})}else{let o=s==="backwards"?[...i].reverse():i,t=!1;for(let r of o)t||r.inFallback()?(t=!0,r.setShowContent(!1),r.setShowFallback(a!=="hidden")):(r.setShowContent(!0),r.setShowFallback(!1))}}let f={register:o=>{let[t,r]=d(!0),[u,c]=d(!1);return i.push({inFallback:o,setShowContent:r,setShowFallback:c}),C(()=>{o(),l()}),{showContent:t,showFallback:u}}};return h.Provider({value:f,children:e.children})}x(m);Object.defineProperty(m,"__suspense",{value:!0,enumerable:!0});export{O as $SUSPENSE,m as Suspense,U as SuspenseList,D as isJSXElement,I as isLitResult,T as isNode,j as isPromise};
@@ -1 +1 @@
1
- "use strict";var n=Object.defineProperty;var V=Object.getOwnPropertyDescriptor;var a=Object.getOwnPropertyNames;var O=Object.prototype.hasOwnProperty;var f=(o,r)=>{for(var i in r)n(o,i,{get:r[i],enumerable:!0})},x=(o,r,i,t)=>{if(r&&typeof r=="object"||typeof r=="function")for(let s of a(r))!O.call(o,s)&&s!==i&&n(o,s,{get:()=>r[s],enumerable:!(t=V(r,s))||t.enumerable});return o};var E=o=>x(n({},"__esModule",{value:!0}),o);var R={};f(R,{stampVersions:()=>e.stampVersions,versions:()=>e.versions,warnOnVersionSkew:()=>e.warnOnVersionSkew});module.exports=E(R);var m=require("@fluixi/dom");var p="1.0.0-alpha.75";var e=require("@fluixi/dom");(0,m.registerCoreVersion)(p);
1
+ "use strict";var n=Object.defineProperty;var V=Object.getOwnPropertyDescriptor;var a=Object.getOwnPropertyNames;var O=Object.prototype.hasOwnProperty;var f=(o,r)=>{for(var i in r)n(o,i,{get:r[i],enumerable:!0})},x=(o,r,i,t)=>{if(r&&typeof r=="object"||typeof r=="function")for(let s of a(r))!O.call(o,s)&&s!==i&&n(o,s,{get:()=>r[s],enumerable:!(t=V(r,s))||t.enumerable});return o};var E=o=>x(n({},"__esModule",{value:!0}),o);var R={};f(R,{stampVersions:()=>e.stampVersions,versions:()=>e.versions,warnOnVersionSkew:()=>e.warnOnVersionSkew});module.exports=E(R);var m=require("@fluixi/dom");var p="1.0.0-alpha.76";var e=require("@fluixi/dom");(0,m.registerCoreVersion)(p);
@@ -1 +1 @@
1
- import{registerCoreVersion as o}from"@fluixi/dom";var r="1.0.0-alpha.75";import{stampVersions as p,warnOnVersionSkew as m,versions as V}from"@fluixi/dom";o(r);export{p as stampVersions,V as versions,m as warnOnVersionSkew};
1
+ import{registerCoreVersion as o}from"@fluixi/dom";var r="1.0.0-alpha.76";import{stampVersions as p,warnOnVersionSkew as m,versions as V}from"@fluixi/dom";o(r);export{p as stampVersions,V as versions,m as warnOnVersionSkew};
@@ -1 +1 @@
1
- "use strict";var P=Object.defineProperty;var re=Object.getOwnPropertyDescriptor;var oe=Object.getOwnPropertyNames;var ae=Object.prototype.hasOwnProperty;var ie=(e,n)=>{for(var t in n)P(e,t,{get:n[t],enumerable:!0})},se=(e,n,t,o)=>{if(n&&typeof n=="object"||typeof n=="function")for(let r of oe(n))!ae.call(e,r)&&r!==t&&P(e,r,{get:()=>n[r],enumerable:!(o=re(n,r))||o.enumerable});return e};var ce=e=>se(P({},"__esModule",{value:!0}),e);var He={};ie(He,{A:()=>Me,Form:()=>Ne,Link:()=>Z,Outlet:()=>Re,Redirect:()=>be,Router:()=>Ce,action:()=>E,cache:()=>F,createAsync:()=>I,createBrowserHistory:()=>g.createBrowserHistory,createMemoryHistory:()=>g.createMemoryHistory,lazy:()=>$,matchPath:()=>g.matchPath,matchRoutes:()=>g.matchRoutes,preloadRoutes:()=>_e,revalidate:()=>U,runWithOwner:()=>ee.runWithOwner,select:()=>Le,useAction:()=>W,useLevelParams:()=>Pe,useLocation:()=>D,useMatch:()=>Oe,useNavigate:()=>Q,useParam:()=>Ae,useParamSelector:()=>Se,useParams:()=>L,useRouteData:()=>De,useRouter:()=>w,useSearchParams:()=>Ee,useSubmission:()=>z});module.exports=ce(He);var s=require("@fluixi/reactive/signal"),u=require("@fluixi/dom"),l=require("@fluixi/reactive/signal"),q=require("@fluixi/utils/object"),B=require("@fluixi/utils/compare"),m=require("@fluixi/router"),g=require("@fluixi/router");var T=require("@fluixi/reactive/signal");var ue=!1,A=new Map;function k(){return ue}function M(e,n){A.set(e,n)}function N(e){return A.get(e)}function de(){A.clear()}function fe(){if(typeof window>"u")return;let e=document.getElementById("__FLUIXI_HYDRATION__");e&&e.remove();let n=document.createTreeWalker(document.body,NodeFilter.SHOW_COMMENT,null),t=[],o;for(;o=n.nextNode();){let r=o,a=r.nodeValue||"";(a.startsWith("#")||a.startsWith("/"))&&t.push(r)}t.forEach(r=>r.remove()),de()}typeof window<"u"&&window.addEventListener("load",()=>{setTimeout(fe,100)});function _(){return typeof window>"u"}var V=require("@fluixi/dom"),S=require("@fluixi/reactive/signal"),ye=require("@fluixi/reactive/signal");var R=require("@fluixi/dom"),f=require("@fluixi/reactive/signal");function H(e){(0,R.registerCreateComponent)(le)}function le(e,n){return pe(e,n)}function pe(e,n){let t=typeof e=="function"?(0,f.untrack)(()=>e(n)):e;if(t!=null&&(typeof t=="function"||typeof t=="object")&&!(0,f.isSignal)(t)){try{t.$name=e.name}catch{}return(0,R.asComponent)(t)}return t}H("index");function j(e){let n=(0,S.createContext)(e),t=o=>(o.debug,n.Provider({value:o.value,get children(){return o.children},debug:o.debug}));return typeof Symbol<"u"&&Symbol.for&&(t.$$typeof=Symbol.for("react.provider")),t.$$typeof=Symbol.for("react.provider"),{id:n.id,Provider:(0,V.asProvider)(t),defaultValue:e}}var v=new Map,h=new Map;function F(e,n){return async(...t)=>{let o=n+":"+JSON.stringify(t);if(k()||typeof window<"u"){let a=N(o);if(a!==void 0)return a}if(v.has(o))return v.get(o);if(h.has(o))return h.get(o);let r=Promise.resolve(e(...t)).then(a=>(v.set(o,a),h.delete(o),_()&&M(o,a),a),a=>{throw h.delete(o),a});return h.set(o,r),r}}var[rt,me]=(0,T.createSignal)(0),ge=new Set;function U(e){let n=typeof e=="string"?t=>t.startsWith(e):e;for(let t of v.keys())n(t)&&(v.delete(t),ge.add(t));me(t=>t+1)}function I(e,n){let[t]=(0,T.createResource)(n||(()=>!0),e);return t}var O=new Map;function K(e){return O.has(e)||O.set(e,(0,T.createSignal)(void 0)),O.get(e)}function E(e,n){let t=n||e.name||"action",o=async r=>{let[,a]=K(t),i=()=>a(void 0),c=()=>o(r);a({input:r,pending:!0,clear:i,retry:c});try{let d=await e(r);return a({input:r,result:d,pending:!1,clear:i,retry:c}),d}catch(d){throw a({input:r,error:d,pending:!1,clear:i,retry:c}),d}};return o.url=t,o.with=r=>E((...a)=>e(r,...a),n),o}function z(e){let[n]=K(e.url);return n}function W(e){return e}var xe=j(),ot=xe.Provider;var x=require("@fluixi/reactive/signal");function $(e,n){let t,o,r;function a(){return o||(o=e().then(c=>t=c.default)),o}n?.preload&&a();let i=(c=>{if(t){let d=t;return(0,x.untrack)(()=>d(c))}if(!r){let[d]=(0,x.createResource)(()=>a(),{transport:!1});if(r=d,d.error)throw d.error}return(0,x.createMemo)(()=>{let d=r();return d?(0,x.untrack)(()=>d(c)):void 0},void 0,{name:"lazy"})});return i.preload=()=>a().then(()=>{}),i.$lazy=!0,i.loader=e,i}var ee=require("@fluixi/reactive/signal"),b=(0,l.createContext)(),J=(0,l.createContext)(),X=(0,l.createContext)(),Y=(0,l.createContext)();function he(e,n,t){let o,r=e.route.data;if(typeof r=="function"){let C=!1;(0,s.onCleanup)(()=>{C=!0});let te=(0,s.getOwner)(),[ne]=(0,s.createResource)(()=>r({params:t.params,location:t.location},te,()=>C));o=ne}let a=()=>Y.Provider({value:o,get children(){return X.Provider({value:e.params,get children(){return J.Provider({value:{depth:n,...t},get children(){return(0,u.createComponent)(e.component,{})}})}})}});if(!o)return a();let i=o,c=()=>i.loading,[d,p]=(0,s.createSignal)((0,s.untrack)(()=>!c()));return(0,s.createEffect)(()=>p(!c())),(0,s.createMemo)(()=>d()?a():null)}function G(e){let n=e.depth+1,[t,o]=(0,s.createSignal)((0,s.untrack)(()=>e.matched()[n]?.component));return(0,s.createEffect)(()=>{let r=e.matched()[n]?.component;o(()=>r)}),(0,s.createMemo)(()=>{if(!t())return e.notFound?e.notFound():null;let a=(0,s.untrack)(()=>e.matched())[n];return he(a,n,{matched:e.matched,params:e.params,location:e.location})})}function ve(e){return e==null?Te():typeof e=="function"?(0,u.createComponent)(e,{}):e}function Te(){let e=(0,u.createNativeElement)("div");(0,u.setAttribute)(e,"class","fx-not-found"),(0,u.setAttribute)(e,"role","main"),(0,u.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 n=(0,u.createNativeElement)("h1");(0,u.setAttribute)(n,"style","margin:0;font-size:2.5rem;font-weight:700"),(0,u.insert)(n,"404");let t=(0,u.createNativeElement)("p");return(0,u.setAttribute)(t,"style","margin:0;opacity:.7"),(0,u.insert)(t,"This page could not be found."),e.appendChild(n),e.appendChild(t),e}function Ce(e){let n=e.history??(0,m.createBrowserHistory)(),t=(0,m.createRouter)({routes:e.routes,base:e.base,history:n}),[o,r]=(0,s.createSignal)(t.state()),a=t.subscribe(r);(0,s.onCleanup)(()=>{a(),t.destroy()});let i=(0,s.createMemo)(()=>(o().match?.matched??[]).filter(C=>C.component)),c={router:t,location:(0,s.createMemo)(()=>o().location),params:(0,s.createMemo)(()=>o().match?.params??{})},d={depth:-1,matched:i,params:c.params,location:c.location,notFound:()=>ve(e.notFound)},p;return b.Provider({value:c,get children(){return p??=G(d)}})}function Re(){let e=(0,l.useContext)(J);return e?G(e):null}function be(e){let n=(0,l.useContext)(b);if(!n||typeof window>"u")return null;let t=!1;return(0,s.onCleanup)(()=>t=!0),queueMicrotask(()=>{t||n.router.navigate(e.to,{replace:e.replace!==!1})}),null}var we={router:{navigate:()=>{}},location:()=>({pathname:"",search:"",hash:"",query:{}}),params:()=>({})};function w(){let e=(0,l.useContext)(b);if(e)return e;if(typeof window>"u")return we;throw new Error("[router-next] useRouter must be used within <Router>")}function L(){let e=w().params;return(0,s.createMemo)(()=>e(),{},{equals:(n,t)=>JSON.stringify(n)===JSON.stringify(t)})}function Pe(){return(0,l.useContext)(X)??{}}function Ae(e){let n=L();return(0,s.createMemo)(()=>n()[e])}function Se(e,n){let t=L();return(0,s.createMemo)(()=>e(t()),void 0,n?{equals:n}:void 0)}function Oe(e){let n=D();return(0,s.createMemo)(()=>(0,m.matchPath)(typeof e=="function"?e():e,n.pathname))}function Ee(){let e=D(),n=Q();return[(0,s.createMemo)(()=>e.query),(r,a)=>{let i=new URLSearchParams(e.search);for(let[d,p]of Object.entries(r))p===null?i.delete(d):i.set(d,p);let c=i.toString();n(e.pathname+(c?`?${c}`:""),a)}]}function Le(e,n){let t=(o,r)=>(0,B.deepEqual)(o,r);return n!==void 0?(0,s.createMemo)(()=>(0,q.get)(e(),n),void 0,{equals:t}):(0,s.createMemo)(e,void 0,{equals:t})}function D(){let{location:e}=w();return new Proxy({},{get:(n,t)=>e()[t],has:(n,t)=>t in e(),ownKeys:()=>Reflect.ownKeys(e()),getOwnPropertyDescriptor:(n,t)=>Object.getOwnPropertyDescriptor(e(),t)})}function Q(){let{router:e}=w();return(n,t)=>e.navigate(n,t)}function De(){return(0,l.useContext)(Y)??(()=>{})}var y=e=>typeof e=="function"?e():e,ke=new Set(["href","slot","class","className","active","activeClass","replace","children"]);function Z(e){let n=(0,l.useContext)(b),t=typeof document>"u",o=()=>n?.router.navigate(y(e.href)??"",{replace:y(e.replace)}),r=(0,u.createNativeElement)("a");(0,u.setAttribute)(r,"href",y(e.href)??""),e.slot&&(0,u.setAttribute)(r,"slot",y(e.slot));for(let i of Object.keys(e)){if(ke.has(i))continue;let c=e[i];c!=null&&typeof c!="function"&&(0,u.setAttribute)(r,i,String(c))}if(typeof r.addEventListener=="function")r.addEventListener("click",i=>{i.metaKey||i.ctrlKey||i.shiftKey||i.altKey||(i.preventDefault(),o())});else{let i=y(e.className??e.class)??"";i&&(0,u.setAttribute)(r,"class",i)}typeof r.addEventListener=="function"&&(0,s.createEffect)(()=>{let i=y(e.href)??"";r.setAttribute("href",i);let c=y(e.className??e.class)??"",d=y(e.activeClass)??"",p=y(e.active)??n?.location().pathname===i;r.className=[c,p?d:""].filter(Boolean).join(" ")});let a=e.children;return a!=null&&(0,u.insert)(r,a),r}var Me=Z;function Ne(e){let n=e.action,t=e.className??e.class,o=n.url??"",r=(0,u.createNativeElement)("form");(0,u.setAttribute)(r,"method","post"),o&&(0,u.setAttribute)(r,"action",o),t&&(0,u.setAttribute)(r,"class",t);for(let i of Object.keys(e)){if(i==="action"||i==="children"||i==="class"||i==="className")continue;let c=e[i];c!=null&&typeof c!="function"&&(0,u.setAttribute)(r,i,String(c))}typeof r.addEventListener=="function"&&r.addEventListener("submit",i=>{i.preventDefault();let c={};new FormData(r).forEach((d,p)=>{c[p]=d}),Promise.resolve(n(c)).catch(()=>{})});let a=e.children;return a!=null&&(0,u.insert)(r,a),r}async function _e(e,n){let t=(0,m.matchRoutes)(e,n);if(!t)return;let o=[];for(let r of t.matched){let a=r.component;a&&typeof a.preload=="function"&&o.push(a.preload())}await Promise.all(o)}
1
+ "use strict";var P=Object.defineProperty;var re=Object.getOwnPropertyDescriptor;var oe=Object.getOwnPropertyNames;var ae=Object.prototype.hasOwnProperty;var ie=(e,n)=>{for(var t in n)P(e,t,{get:n[t],enumerable:!0})},se=(e,n,t,o)=>{if(n&&typeof n=="object"||typeof n=="function")for(let r of oe(n))!ae.call(e,r)&&r!==t&&P(e,r,{get:()=>n[r],enumerable:!(o=re(n,r))||o.enumerable});return e};var ce=e=>se(P({},"__esModule",{value:!0}),e);var Ve={};ie(Ve,{A:()=>Ne,Form:()=>_e,Link:()=>Z,Outlet:()=>be,Redirect:()=>Re,Router:()=>Ce,action:()=>L,cache:()=>F,createAsync:()=>K,createBrowserHistory:()=>g.createBrowserHistory,createMemoryHistory:()=>g.createMemoryHistory,lazy:()=>$,matchPath:()=>g.matchPath,matchRoutes:()=>g.matchRoutes,preloadRoutes:()=>He,revalidate:()=>U,runWithOwner:()=>ee.runWithOwner,select:()=>Ee,useAction:()=>W,useLevelParams:()=>Pe,useLinkNavigation:()=>ke,useLocation:()=>k,useMatch:()=>Oe,useNavigate:()=>Q,useParam:()=>Ae,useParamSelector:()=>Se,useParams:()=>E,useRouteData:()=>De,useRouter:()=>w,useSearchParams:()=>Le,useSubmission:()=>z});module.exports=ce(Ve);var s=require("@fluixi/reactive/signal"),u=require("@fluixi/dom"),l=require("@fluixi/reactive/signal"),q=require("@fluixi/utils/object"),B=require("@fluixi/utils/compare"),m=require("@fluixi/router"),g=require("@fluixi/router");var T=require("@fluixi/reactive/signal");var ue=!1,A=new Map;function D(){return ue}function M(e,n){A.set(e,n)}function N(e){return A.get(e)}function de(){A.clear()}function le(){if(typeof window>"u")return;let e=document.getElementById("__FLUIXI_HYDRATION__");e&&e.remove();let n=document.createTreeWalker(document.body,NodeFilter.SHOW_COMMENT,null),t=[],o;for(;o=n.nextNode();){let r=o,a=r.nodeValue||"";(a.startsWith("#")||a.startsWith("/"))&&t.push(r)}t.forEach(r=>r.remove()),de()}typeof window<"u"&&window.addEventListener("load",()=>{setTimeout(le,100)});function _(){return typeof window>"u"}var V=require("@fluixi/dom"),S=require("@fluixi/reactive/signal"),ye=require("@fluixi/reactive/signal");var R=require("@fluixi/dom"),f=require("@fluixi/reactive/signal");function H(e){(0,R.registerCreateComponent)(fe)}function fe(e,n){return pe(e,n)}function pe(e,n){let t=typeof e=="function"?(0,f.untrack)(()=>e(n)):e;if(t!=null&&(typeof t=="function"||typeof t=="object")&&!(0,f.isSignal)(t)){try{t.$name=e.name}catch{}return(0,R.asComponent)(t)}return t}H("index");function j(e){let n=(0,S.createContext)(e),t=o=>(o.debug,n.Provider({value:o.value,get children(){return o.children},debug:o.debug}));return typeof Symbol<"u"&&Symbol.for&&(t.$$typeof=Symbol.for("react.provider")),t.$$typeof=Symbol.for("react.provider"),{id:n.id,Provider:(0,V.asProvider)(t),defaultValue:e}}var v=new Map,x=new Map;function F(e,n){return async(...t)=>{let o=n+":"+JSON.stringify(t);if(D()||typeof window<"u"){let a=N(o);if(a!==void 0)return a}if(v.has(o))return v.get(o);if(x.has(o))return x.get(o);let r=Promise.resolve(e(...t)).then(a=>(v.set(o,a),x.delete(o),_()&&M(o,a),a),a=>{throw x.delete(o),a});return x.set(o,r),r}}var[ot,me]=(0,T.createSignal)(0),ge=new Set;function U(e){let n=typeof e=="string"?t=>t.startsWith(e):e;for(let t of v.keys())n(t)&&(v.delete(t),ge.add(t));me(t=>t+1)}function K(e,n){let[t]=(0,T.createResource)(n||(()=>!0),e);return t}var O=new Map;function I(e){return O.has(e)||O.set(e,(0,T.createSignal)(void 0)),O.get(e)}function L(e,n){let t=n||e.name||"action",o=async r=>{let[,a]=I(t),i=()=>a(void 0),c=()=>o(r);a({input:r,pending:!0,clear:i,retry:c});try{let d=await e(r);return a({input:r,result:d,pending:!1,clear:i,retry:c}),d}catch(d){throw a({input:r,error:d,pending:!1,clear:i,retry:c}),d}};return o.url=t,o.with=r=>L((...a)=>e(r,...a),n),o}function z(e){let[n]=I(e.url);return n}function W(e){return e}var he=j(),at=he.Provider;var h=require("@fluixi/reactive/signal");function $(e,n){let t,o,r;function a(){return o||(o=e().then(c=>t=c.default)),o}n?.preload&&a();let i=(c=>{if(t){let d=t;return(0,h.untrack)(()=>d(c))}if(!r){let[d]=(0,h.createResource)(()=>a(),{transport:!1});if(r=d,d.error)throw d.error}return(0,h.createMemo)(()=>{let d=r();return d?(0,h.untrack)(()=>d(c)):void 0},void 0,{name:"lazy"})});return i.preload=()=>a().then(()=>{}),i.$lazy=!0,i.loader=e,i}var ee=require("@fluixi/reactive/signal"),C=(0,l.createContext)(),J=(0,l.createContext)(),X=(0,l.createContext)(),Y=(0,l.createContext)();function xe(e,n,t){let o,r=e.route.data;if(typeof r=="function"){let b=!1;(0,s.onCleanup)(()=>{b=!0});let te=(0,s.getOwner)(),[ne]=(0,s.createResource)(()=>r({params:t.params,location:t.location},te,()=>b));o=ne}let a=()=>Y.Provider({value:o,get children(){return X.Provider({value:e.params,get children(){return J.Provider({value:{depth:n,...t},get children(){return(0,u.createComponent)(e.component,{})}})}})}});if(!o)return a();let i=o,c=()=>i.loading,[d,p]=(0,s.createSignal)((0,s.untrack)(()=>!c()));return(0,s.createEffect)(()=>p(!c())),(0,s.createMemo)(()=>d()?a():null)}function G(e){let n=e.depth+1,[t,o]=(0,s.createSignal)((0,s.untrack)(()=>e.matched()[n]?.component));return(0,s.createEffect)(()=>{let r=e.matched()[n]?.component;o(()=>r)}),(0,s.createMemo)(()=>{if(!t())return e.notFound?e.notFound():null;let a=(0,s.untrack)(()=>e.matched())[n];return xe(a,n,{matched:e.matched,params:e.params,location:e.location})})}function ve(e){return e==null?Te():typeof e=="function"?(0,u.createComponent)(e,{}):e}function Te(){let e=(0,u.createNativeElement)("div");(0,u.setAttribute)(e,"class","fx-not-found"),(0,u.setAttribute)(e,"role","main"),(0,u.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 n=(0,u.createNativeElement)("h1");(0,u.setAttribute)(n,"style","margin:0;font-size:2.5rem;font-weight:700"),(0,u.insert)(n,"404");let t=(0,u.createNativeElement)("p");return(0,u.setAttribute)(t,"style","margin:0;opacity:.7"),(0,u.insert)(t,"This page could not be found."),e.appendChild(n),e.appendChild(t),e}function Ce(e){let n=e.history??(0,m.createBrowserHistory)(),t=(0,m.createRouter)({routes:e.routes,base:e.base,history:n}),[o,r]=(0,s.createSignal)(t.state()),a=t.subscribe(r);(0,s.onCleanup)(()=>{a(),t.destroy()});let i=(0,s.createMemo)(()=>(o().match?.matched??[]).filter(b=>b.component)),c={router:t,location:(0,s.createMemo)(()=>o().location),params:(0,s.createMemo)(()=>o().match?.params??{})},d={depth:-1,matched:i,params:c.params,location:c.location,notFound:()=>ve(e.notFound)},p;return C.Provider({value:c,get children(){return p??=G(d)}})}function be(){let e=(0,l.useContext)(J);return e?G(e):null}function Re(e){let n=(0,l.useContext)(C);if(!n||typeof window>"u")return null;let t=!1;return(0,s.onCleanup)(()=>t=!0),queueMicrotask(()=>{t||n.router.navigate(e.to,{replace:e.replace!==!1})}),null}var we={router:{navigate:()=>{}},location:()=>({pathname:"",search:"",hash:"",query:{}}),params:()=>({})};function w(){let e=(0,l.useContext)(C);if(e)return e;if(typeof window>"u")return we;throw new Error("[router-next] useRouter must be used within <Router>")}function E(){let e=w().params;return(0,s.createMemo)(()=>e(),{},{equals:(n,t)=>JSON.stringify(n)===JSON.stringify(t)})}function Pe(){return(0,l.useContext)(X)??{}}function Ae(e){let n=E();return(0,s.createMemo)(()=>n()[e])}function Se(e,n){let t=E();return(0,s.createMemo)(()=>e(t()),void 0,n?{equals:n}:void 0)}function Oe(e){let n=k();return(0,s.createMemo)(()=>(0,m.matchPath)(typeof e=="function"?e():e,n.pathname))}function Le(){let e=k(),n=Q();return[(0,s.createMemo)(()=>e.query),(r,a)=>{let i=new URLSearchParams(e.search);for(let[d,p]of Object.entries(r))p===null?i.delete(d):i.set(d,p);let c=i.toString();n(e.pathname+(c?`?${c}`:""),a)}]}function Ee(e,n){let t=(o,r)=>(0,B.deepEqual)(o,r);return n!==void 0?(0,s.createMemo)(()=>(0,q.get)(e(),n),void 0,{equals:t}):(0,s.createMemo)(e,void 0,{equals:t})}function k(){let{location:e}=w();return new Proxy({},{get:(n,t)=>e()[t],has:(n,t)=>t in e(),ownKeys:()=>Reflect.ownKeys(e()),getOwnPropertyDescriptor:(n,t)=>Object.getOwnPropertyDescriptor(e(),t)})}function ke(e={}){let n=(0,l.useContext)(C);return t=>{if(!n||t.defaultPrevented||t.button!==0||t.metaKey||t.ctrlKey||t.shiftKey||t.altKey)return;let r=t.target?.closest?.("a");if(!r||!r.getAttribute("href")||r.target&&r.target!=="_self"||r.hasAttribute("download")||/(^|\s)external(\s|$)/.test(r.getAttribute("rel")??""))return;let a=new URL(r.href);a.protocol!=="http:"&&a.protocol!=="https:"||a.origin===window.location.origin&&(a.hash&&a.pathname===window.location.pathname&&a.search===window.location.search||e.shouldNavigate&&!e.shouldNavigate(a,r)||(t.preventDefault(),n.router.navigate(a.pathname+a.search+a.hash,{replace:e.replace})))}}function Q(){let{router:e}=w();return(n,t)=>e.navigate(n,t)}function De(){return(0,l.useContext)(Y)??(()=>{})}var y=e=>typeof e=="function"?e():e,Me=new Set(["href","slot","class","className","active","activeClass","replace","children"]);function Z(e){let n=(0,l.useContext)(C),t=typeof document>"u",o=()=>n?.router.navigate(y(e.href)??"",{replace:y(e.replace)}),r=(0,u.createNativeElement)("a");(0,u.setAttribute)(r,"href",y(e.href)??""),e.slot&&(0,u.setAttribute)(r,"slot",y(e.slot));for(let i of Object.keys(e)){if(Me.has(i))continue;let c=e[i];c!=null&&typeof c!="function"&&(0,u.setAttribute)(r,i,String(c))}if(typeof r.addEventListener=="function")r.addEventListener("click",i=>{i.metaKey||i.ctrlKey||i.shiftKey||i.altKey||(i.preventDefault(),o())});else{let i=y(e.className??e.class)??"";i&&(0,u.setAttribute)(r,"class",i)}typeof r.addEventListener=="function"&&(0,s.createEffect)(()=>{let i=y(e.href)??"";r.setAttribute("href",i);let c=y(e.className??e.class)??"",d=y(e.activeClass)??"",p=y(e.active)??n?.location().pathname===i;r.className=[c,p?d:""].filter(Boolean).join(" ")});let a=e.children;return a!=null&&(0,u.insert)(r,a),r}var Ne=Z;function _e(e){let n=e.action,t=e.className??e.class,o=n.url??"",r=(0,u.createNativeElement)("form");(0,u.setAttribute)(r,"method","post"),o&&(0,u.setAttribute)(r,"action",o),t&&(0,u.setAttribute)(r,"class",t);for(let i of Object.keys(e)){if(i==="action"||i==="children"||i==="class"||i==="className")continue;let c=e[i];c!=null&&typeof c!="function"&&(0,u.setAttribute)(r,i,String(c))}typeof r.addEventListener=="function"&&r.addEventListener("submit",i=>{i.preventDefault();let c={};new FormData(r).forEach((d,p)=>{c[p]=d}),Promise.resolve(n(c)).catch(()=>{})});let a=e.children;return a!=null&&(0,u.insert)(r,a),r}async function He(e,n){let t=(0,m.matchRoutes)(e,n);if(!t)return;let o=[];for(let r of t.matched){let a=r.component;a&&typeof a.preload=="function"&&o.push(a.preload())}await Promise.all(o)}
@@ -94,6 +94,39 @@ export declare function select<T, K extends string = never>(source: () => T, key
94
94
  * subscribes to location changes. Matches the old router's useLocation().
95
95
  */
96
96
  export declare function useLocation(): RouterLocation;
97
+ export interface LinkNavigationOptions {
98
+ /** Replace the current history entry instead of pushing a new one. */
99
+ replace?: boolean;
100
+ /**
101
+ * Called with the resolved URL before navigating. Return false to leave the click
102
+ * alone — for a section of the app that must load as a document (a different
103
+ * bundle, a server-rendered admin area, a file route).
104
+ */
105
+ shouldNavigate?: (url: URL, anchor: HTMLAnchorElement) => boolean;
106
+ }
107
+ /**
108
+ * A delegated click handler that turns plain `<a>` elements into client-side navigations.
109
+ *
110
+ * `<Link>` covers the links an app writes as JSX. This covers the ones it doesn't own:
111
+ * markdown or CMS HTML dropped in through `innerHTML`, where there is no component to
112
+ * bind to and the anchors arrive as prerendered text. Put it on the container and every
113
+ * link inside it navigates without reloading the document:
114
+ *
115
+ * ```tsx
116
+ * const onClick = useLinkNavigation();
117
+ * <article onClick={onClick} innerHTML={doc.html} />
118
+ * ```
119
+ *
120
+ * The anchors stay real anchors — middle-click, right-click → open in new tab, "copy
121
+ * link address" and crawlers all keep working, because the element is untouched and only
122
+ * a plain left-click is intercepted.
123
+ *
124
+ * Left alone: modified clicks, anything but the primary button, an already-prevented
125
+ * event, `target`, `download`, `rel="external"`, a non-http scheme (`mailto:`, `tel:`),
126
+ * another origin, and a hash pointing inside the current page — that last one is the
127
+ * browser's scroll, and hijacking it breaks in-page anchors.
128
+ */
129
+ export declare function useLinkNavigation(options?: LinkNavigationOptions): (event: MouseEvent) => void;
97
130
  export declare function useNavigate(): (to: string, options?: NavigateOptions) => void;
98
131
  /**
99
132
  * The resolved data for the nearest route that declared a `data` loader. Always
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/lib/router-next/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/lib/router-next/index.ts"],"names":[],"mappings":"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"}
@@ -317,6 +317,60 @@ export function useLocation() {
317
317
  getOwnPropertyDescriptor: (_t, key) => Object.getOwnPropertyDescriptor(location(), key),
318
318
  });
319
319
  }
320
+ /**
321
+ * A delegated click handler that turns plain `<a>` elements into client-side navigations.
322
+ *
323
+ * `<Link>` covers the links an app writes as JSX. This covers the ones it doesn't own:
324
+ * markdown or CMS HTML dropped in through `innerHTML`, where there is no component to
325
+ * bind to and the anchors arrive as prerendered text. Put it on the container and every
326
+ * link inside it navigates without reloading the document:
327
+ *
328
+ * ```tsx
329
+ * const onClick = useLinkNavigation();
330
+ * <article onClick={onClick} innerHTML={doc.html} />
331
+ * ```
332
+ *
333
+ * The anchors stay real anchors — middle-click, right-click → open in new tab, "copy
334
+ * link address" and crawlers all keep working, because the element is untouched and only
335
+ * a plain left-click is intercepted.
336
+ *
337
+ * Left alone: modified clicks, anything but the primary button, an already-prevented
338
+ * event, `target`, `download`, `rel="external"`, a non-http scheme (`mailto:`, `tel:`),
339
+ * another origin, and a hash pointing inside the current page — that last one is the
340
+ * browser's scroll, and hijacking it breaks in-page anchors.
341
+ */
342
+ export function useLinkNavigation(options = {}) {
343
+ const ctx = useContext(RouterContext);
344
+ return (event) => {
345
+ if (!ctx || event.defaultPrevented || event.button !== 0)
346
+ return;
347
+ if (event.metaKey || event.ctrlKey || event.shiftKey || event.altKey)
348
+ return;
349
+ const target = event.target;
350
+ const anchor = target?.closest?.('a');
351
+ if (!anchor || !anchor.getAttribute('href'))
352
+ return;
353
+ if (anchor.target && anchor.target !== '_self')
354
+ return;
355
+ if (anchor.hasAttribute('download'))
356
+ return;
357
+ if (/(^|\s)external(\s|$)/.test(anchor.getAttribute('rel') ?? ''))
358
+ return;
359
+ // `anchor.href` is resolved against the document, so a relative `./guide` from
360
+ // prerendered markdown lands on the right absolute path.
361
+ const url = new URL(anchor.href);
362
+ if (url.protocol !== 'http:' && url.protocol !== 'https:')
363
+ return;
364
+ if (url.origin !== window.location.origin)
365
+ return;
366
+ if (url.hash && url.pathname === window.location.pathname && url.search === window.location.search)
367
+ return;
368
+ if (options.shouldNavigate && !options.shouldNavigate(url, anchor))
369
+ return;
370
+ event.preventDefault();
371
+ ctx.router.navigate(url.pathname + url.search + url.hash, { replace: options.replace });
372
+ };
373
+ }
320
374
  export function useNavigate() {
321
375
  // useRouter is SSR-safe (returns a no-op stub on the server when the context is
322
376
  // detached), so navigation degrades to a no-op during SSR and only throws on
@@ -1 +1 @@
1
- import{createSignal as w,createMemo as d,createResource as ge,createEffect as P,getOwner as xe,onCleanup as A,untrack as b}from"@fluixi/reactive/signal";import{insert as h,createComponent as j,createNativeElement as g,setAttribute as u}from"@fluixi/dom";import{createContext as v,useContext as p}from"@fluixi/reactive/signal";import{get as he}from"@fluixi/utils/object";import{deepEqual as ve}from"@fluixi/utils/compare";import{createRouter as Te,createBrowserHistory as Ce,matchRoutes as Re,matchPath as be}from"@fluixi/router";import{createMemoryHistory as Ft,createBrowserHistory as Ut,matchRoutes as It,matchPath as Kt}from"@fluixi/router";import{createResource as oe,createSignal as N}from"@fluixi/reactive/signal";var B=!1,C=new Map;function O(){return B}function E(e,n){C.set(e,n)}function L(e){return C.get(e)}function J(){C.clear()}function X(){if(typeof window>"u")return;let e=document.getElementById("__FLUIXI_HYDRATION__");e&&e.remove();let n=document.createTreeWalker(document.body,NodeFilter.SHOW_COMMENT,null),t=[],o;for(;o=n.nextNode();){let r=o,a=r.nodeValue||"";(a.startsWith("#")||a.startsWith("/"))&&t.push(r)}t.forEach(r=>r.remove()),J()}typeof window<"u"&&window.addEventListener("load",()=>{setTimeout(X,100)});function D(){return typeof window>"u"}import{asProvider as ne}from"@fluixi/dom";import{createContext as re,useContext as et}from"@fluixi/reactive/signal";import{readChildren as ot}from"@fluixi/reactive/signal";import{registerCreateComponent as Y,asComponent as G}from"@fluixi/dom";import{untrack as Q,onCleanup as _e,getOwner as He,createEffect as Ve,createMemo as je,createSignal as Fe,isSignal as Z,batch as Ue,runWithOwner as Ke,isOwnerDisposed as ze}from"@fluixi/reactive/signal";function k(e){Y(ee)}function ee(e,n){return te(e,n)}function te(e,n){let t=typeof e=="function"?Q(()=>e(n)):e;if(t!=null&&(typeof t=="function"||typeof t=="object")&&!Z(t)){try{t.$name=e.name}catch{}return G(t)}return t}k("index");function M(e){let n=re(e),t=o=>(o.debug,n.Provider({value:o.value,get children(){return o.children},debug:o.debug}));return typeof Symbol<"u"&&Symbol.for&&(t.$$typeof=Symbol.for("react.provider")),t.$$typeof=Symbol.for("react.provider"),{id:n.id,Provider:ne(t),defaultValue:e}}var m=new Map,y=new Map;function ae(e,n){return async(...t)=>{let o=n+":"+JSON.stringify(t);if(O()||typeof window<"u"){let a=L(o);if(a!==void 0)return a}if(m.has(o))return m.get(o);if(y.has(o))return y.get(o);let r=Promise.resolve(e(...t)).then(a=>(m.set(o,a),y.delete(o),D()&&E(o,a),a),a=>{throw y.delete(o),a});return y.set(o,r),r}}var[lt,ie]=N(0),se=new Set;function ce(e){let n=typeof e=="string"?t=>t.startsWith(e):e;for(let t of m.keys())n(t)&&(m.delete(t),se.add(t));ie(t=>t+1)}function ue(e,n){let[t]=oe(n||(()=>!0),e);return t}var R=new Map;function _(e){return R.has(e)||R.set(e,N(void 0)),R.get(e)}function H(e,n){let t=n||e.name||"action",o=async r=>{let[,a]=_(t),i=()=>a(void 0),s=()=>o(r);a({input:r,pending:!0,clear:i,retry:s});try{let c=await e(r);return a({input:r,result:c,pending:!1,clear:i,retry:s}),c}catch(c){throw a({input:r,error:c,pending:!1,clear:i,retry:s}),c}};return o.url=t,o.with=r=>H((...a)=>e(r,...a),n),o}function de(e){let[n]=_(e.url);return n}function fe(e){return e}var le=M(),pt=le.Provider;import{untrack as V,createMemo as pe,createResource as ye}from"@fluixi/reactive/signal";function me(e,n){let t,o,r;function a(){return o||(o=e().then(s=>t=s.default)),o}n?.preload&&a();let i=(s=>{if(t){let c=t;return V(()=>c(s))}if(!r){let[c]=ye(()=>a(),{transport:!1});if(r=c,c.error)throw c.error}return pe(()=>{let c=r();return c?V(()=>c(s)):void 0},void 0,{name:"lazy"})});return i.preload=()=>a().then(()=>{}),i.$lazy=!0,i.loader=e,i}import{runWithOwner as qt}from"@fluixi/reactive/signal";var T=v(),F=v(),U=v(),I=v();function we(e,n,t){let o,r=e.route.data;if(typeof r=="function"){let x=!1;A(()=>{x=!0});let $=xe(),[q]=ge(()=>r({params:t.params,location:t.location},$,()=>x));o=q}let a=()=>I.Provider({value:o,get children(){return U.Provider({value:e.params,get children(){return F.Provider({value:{depth:n,...t},get children(){return j(e.component,{})}})}})}});if(!o)return a();let i=o,s=()=>i.loading,[c,f]=w(b(()=>!s()));return P(()=>f(!s())),d(()=>c()?a():null)}function K(e){let n=e.depth+1,[t,o]=w(b(()=>e.matched()[n]?.component));return P(()=>{let r=e.matched()[n]?.component;o(()=>r)}),d(()=>{if(!t())return e.notFound?e.notFound():null;let a=b(()=>e.matched())[n];return we(a,n,{matched:e.matched,params:e.params,location:e.location})})}function Pe(e){return e==null?Ae():typeof e=="function"?j(e,{}):e}function Ae(){let e=g("div");u(e,"class","fx-not-found"),u(e,"role","main"),u(e,"style","min-height:60vh;display:grid;place-content:center;gap:.25rem;text-align:center;font-family:system-ui,-apple-system,sans-serif");let n=g("h1");u(n,"style","margin:0;font-size:2.5rem;font-weight:700"),h(n,"404");let t=g("p");return u(t,"style","margin:0;opacity:.7"),h(t,"This page could not be found."),e.appendChild(n),e.appendChild(t),e}function wt(e){let n=e.history??Ce(),t=Te({routes:e.routes,base:e.base,history:n}),[o,r]=w(t.state()),a=t.subscribe(r);A(()=>{a(),t.destroy()});let i=d(()=>(o().match?.matched??[]).filter(x=>x.component)),s={router:t,location:d(()=>o().location),params:d(()=>o().match?.params??{})},c={depth:-1,matched:i,params:s.params,location:s.location,notFound:()=>Pe(e.notFound)},f;return T.Provider({value:s,get children(){return f??=K(c)}})}function Pt(){let e=p(F);return e?K(e):null}function At(e){let n=p(T);if(!n||typeof window>"u")return null;let t=!1;return A(()=>t=!0),queueMicrotask(()=>{t||n.router.navigate(e.to,{replace:e.replace!==!1})}),null}var Se={router:{navigate:()=>{}},location:()=>({pathname:"",search:"",hash:"",query:{}}),params:()=>({})};function S(){let e=p(T);if(e)return e;if(typeof window>"u")return Se;throw new Error("[router-next] useRouter must be used within <Router>")}function z(){let e=S().params;return d(()=>e(),{},{equals:(n,t)=>JSON.stringify(n)===JSON.stringify(t)})}function St(){return p(U)??{}}function Ot(e){let n=z();return d(()=>n()[e])}function Et(e,n){let t=z();return d(()=>e(t()),void 0,n?{equals:n}:void 0)}function Lt(e){let n=W();return d(()=>be(typeof e=="function"?e():e,n.pathname))}function Dt(){let e=W(),n=Oe();return[d(()=>e.query),(r,a)=>{let i=new URLSearchParams(e.search);for(let[c,f]of Object.entries(r))f===null?i.delete(c):i.set(c,f);let s=i.toString();n(e.pathname+(s?`?${s}`:""),a)}]}function kt(e,n){let t=(o,r)=>ve(o,r);return n!==void 0?d(()=>he(e(),n),void 0,{equals:t}):d(e,void 0,{equals:t})}function W(){let{location:e}=S();return new Proxy({},{get:(n,t)=>e()[t],has:(n,t)=>t in e(),ownKeys:()=>Reflect.ownKeys(e()),getOwnPropertyDescriptor:(n,t)=>Object.getOwnPropertyDescriptor(e(),t)})}function Oe(){let{router:e}=S();return(n,t)=>e.navigate(n,t)}function Mt(){return p(I)??(()=>{})}var l=e=>typeof e=="function"?e():e,Ee=new Set(["href","slot","class","className","active","activeClass","replace","children"]);function Le(e){let n=p(T),t=typeof document>"u",o=()=>n?.router.navigate(l(e.href)??"",{replace:l(e.replace)}),r=g("a");u(r,"href",l(e.href)??""),e.slot&&u(r,"slot",l(e.slot));for(let i of Object.keys(e)){if(Ee.has(i))continue;let s=e[i];s!=null&&typeof s!="function"&&u(r,i,String(s))}if(typeof r.addEventListener=="function")r.addEventListener("click",i=>{i.metaKey||i.ctrlKey||i.shiftKey||i.altKey||(i.preventDefault(),o())});else{let i=l(e.className??e.class)??"";i&&u(r,"class",i)}typeof r.addEventListener=="function"&&P(()=>{let i=l(e.href)??"";r.setAttribute("href",i);let s=l(e.className??e.class)??"",c=l(e.activeClass)??"",f=l(e.active)??n?.location().pathname===i;r.className=[s,f?c:""].filter(Boolean).join(" ")});let a=e.children;return a!=null&&h(r,a),r}var Nt=Le;function _t(e){let n=e.action,t=e.className??e.class,o=n.url??"",r=g("form");u(r,"method","post"),o&&u(r,"action",o),t&&u(r,"class",t);for(let i of Object.keys(e)){if(i==="action"||i==="children"||i==="class"||i==="className")continue;let s=e[i];s!=null&&typeof s!="function"&&u(r,i,String(s))}typeof r.addEventListener=="function"&&r.addEventListener("submit",i=>{i.preventDefault();let s={};new FormData(r).forEach((c,f)=>{s[f]=c}),Promise.resolve(n(s)).catch(()=>{})});let a=e.children;return a!=null&&h(r,a),r}async function Ht(e,n){let t=Re(e,n);if(!t)return;let o=[];for(let r of t.matched){let a=r.component;a&&typeof a.preload=="function"&&o.push(a.preload())}await Promise.all(o)}export{Nt as A,_t as Form,Le as Link,Pt as Outlet,At as Redirect,wt as Router,H as action,ae as cache,ue as createAsync,Ut as createBrowserHistory,Ft as createMemoryHistory,me as lazy,Kt as matchPath,It as matchRoutes,Ht as preloadRoutes,ce as revalidate,qt as runWithOwner,kt as select,fe as useAction,St as useLevelParams,W as useLocation,Lt as useMatch,Oe as useNavigate,Ot as useParam,Et as useParamSelector,z as useParams,Mt as useRouteData,S as useRouter,Dt as useSearchParams,de as useSubmission};
1
+ import{createSignal as w,createMemo as d,createResource as ge,createEffect as P,getOwner as he,onCleanup as A,untrack as R}from"@fluixi/reactive/signal";import{insert as v,createComponent as j,createNativeElement as g,setAttribute as u}from"@fluixi/dom";import{createContext as T,useContext as p}from"@fluixi/reactive/signal";import{get as xe}from"@fluixi/utils/object";import{deepEqual as ve}from"@fluixi/utils/compare";import{createRouter as Te,createBrowserHistory as Ce,matchRoutes as be,matchPath as Re}from"@fluixi/router";import{createMemoryHistory as Ut,createBrowserHistory as Kt,matchRoutes as It,matchPath as zt}from"@fluixi/router";import{createResource as oe,createSignal as N}from"@fluixi/reactive/signal";var B=!1,C=new Map;function O(){return B}function L(e,n){C.set(e,n)}function E(e){return C.get(e)}function J(){C.clear()}function X(){if(typeof window>"u")return;let e=document.getElementById("__FLUIXI_HYDRATION__");e&&e.remove();let n=document.createTreeWalker(document.body,NodeFilter.SHOW_COMMENT,null),t=[],a;for(;a=n.nextNode();){let r=a,o=r.nodeValue||"";(o.startsWith("#")||o.startsWith("/"))&&t.push(r)}t.forEach(r=>r.remove()),J()}typeof window<"u"&&window.addEventListener("load",()=>{setTimeout(X,100)});function k(){return typeof window>"u"}import{asProvider as ne}from"@fluixi/dom";import{createContext as re,useContext as et}from"@fluixi/reactive/signal";import{readChildren as ot}from"@fluixi/reactive/signal";import{registerCreateComponent as Y,asComponent as G}from"@fluixi/dom";import{untrack as Q,onCleanup as _e,getOwner as He,createEffect as Ve,createMemo as je,createSignal as Fe,isSignal as Z,batch as Ue,runWithOwner as Ie,isOwnerDisposed as ze}from"@fluixi/reactive/signal";function D(e){Y(ee)}function ee(e,n){return te(e,n)}function te(e,n){let t=typeof e=="function"?Q(()=>e(n)):e;if(t!=null&&(typeof t=="function"||typeof t=="object")&&!Z(t)){try{t.$name=e.name}catch{}return G(t)}return t}D("index");function M(e){let n=re(e),t=a=>(a.debug,n.Provider({value:a.value,get children(){return a.children},debug:a.debug}));return typeof Symbol<"u"&&Symbol.for&&(t.$$typeof=Symbol.for("react.provider")),t.$$typeof=Symbol.for("react.provider"),{id:n.id,Provider:ne(t),defaultValue:e}}var m=new Map,y=new Map;function ae(e,n){return async(...t)=>{let a=n+":"+JSON.stringify(t);if(O()||typeof window<"u"){let o=E(a);if(o!==void 0)return o}if(m.has(a))return m.get(a);if(y.has(a))return y.get(a);let r=Promise.resolve(e(...t)).then(o=>(m.set(a,o),y.delete(a),k()&&L(a,o),o),o=>{throw y.delete(a),o});return y.set(a,r),r}}var[ft,ie]=N(0),se=new Set;function ce(e){let n=typeof e=="string"?t=>t.startsWith(e):e;for(let t of m.keys())n(t)&&(m.delete(t),se.add(t));ie(t=>t+1)}function ue(e,n){let[t]=oe(n||(()=>!0),e);return t}var b=new Map;function _(e){return b.has(e)||b.set(e,N(void 0)),b.get(e)}function H(e,n){let t=n||e.name||"action",a=async r=>{let[,o]=_(t),i=()=>o(void 0),s=()=>a(r);o({input:r,pending:!0,clear:i,retry:s});try{let c=await e(r);return o({input:r,result:c,pending:!1,clear:i,retry:s}),c}catch(c){throw o({input:r,error:c,pending:!1,clear:i,retry:s}),c}};return a.url=t,a.with=r=>H((...o)=>e(r,...o),n),a}function de(e){let[n]=_(e.url);return n}function le(e){return e}var fe=M(),pt=fe.Provider;import{untrack as V,createMemo as pe,createResource as ye}from"@fluixi/reactive/signal";function me(e,n){let t,a,r;function o(){return a||(a=e().then(s=>t=s.default)),a}n?.preload&&o();let i=(s=>{if(t){let c=t;return V(()=>c(s))}if(!r){let[c]=ye(()=>o(),{transport:!1});if(r=c,c.error)throw c.error}return pe(()=>{let c=r();return c?V(()=>c(s)):void 0},void 0,{name:"lazy"})});return i.preload=()=>o().then(()=>{}),i.$lazy=!0,i.loader=e,i}import{runWithOwner as Bt}from"@fluixi/reactive/signal";var h=T(),F=T(),U=T(),K=T();function we(e,n,t){let a,r=e.route.data;if(typeof r=="function"){let x=!1;A(()=>{x=!0});let $=he(),[q]=ge(()=>r({params:t.params,location:t.location},$,()=>x));a=q}let o=()=>K.Provider({value:a,get children(){return U.Provider({value:e.params,get children(){return F.Provider({value:{depth:n,...t},get children(){return j(e.component,{})}})}})}});if(!a)return o();let i=a,s=()=>i.loading,[c,l]=w(R(()=>!s()));return P(()=>l(!s())),d(()=>c()?o():null)}function I(e){let n=e.depth+1,[t,a]=w(R(()=>e.matched()[n]?.component));return P(()=>{let r=e.matched()[n]?.component;a(()=>r)}),d(()=>{if(!t())return e.notFound?e.notFound():null;let o=R(()=>e.matched())[n];return we(o,n,{matched:e.matched,params:e.params,location:e.location})})}function Pe(e){return e==null?Ae():typeof e=="function"?j(e,{}):e}function Ae(){let e=g("div");u(e,"class","fx-not-found"),u(e,"role","main"),u(e,"style","min-height:60vh;display:grid;place-content:center;gap:.25rem;text-align:center;font-family:system-ui,-apple-system,sans-serif");let n=g("h1");u(n,"style","margin:0;font-size:2.5rem;font-weight:700"),v(n,"404");let t=g("p");return u(t,"style","margin:0;opacity:.7"),v(t,"This page could not be found."),e.appendChild(n),e.appendChild(t),e}function wt(e){let n=e.history??Ce(),t=Te({routes:e.routes,base:e.base,history:n}),[a,r]=w(t.state()),o=t.subscribe(r);A(()=>{o(),t.destroy()});let i=d(()=>(a().match?.matched??[]).filter(x=>x.component)),s={router:t,location:d(()=>a().location),params:d(()=>a().match?.params??{})},c={depth:-1,matched:i,params:s.params,location:s.location,notFound:()=>Pe(e.notFound)},l;return h.Provider({value:s,get children(){return l??=I(c)}})}function Pt(){let e=p(F);return e?I(e):null}function At(e){let n=p(h);if(!n||typeof window>"u")return null;let t=!1;return A(()=>t=!0),queueMicrotask(()=>{t||n.router.navigate(e.to,{replace:e.replace!==!1})}),null}var Se={router:{navigate:()=>{}},location:()=>({pathname:"",search:"",hash:"",query:{}}),params:()=>({})};function S(){let e=p(h);if(e)return e;if(typeof window>"u")return Se;throw new Error("[router-next] useRouter must be used within <Router>")}function z(){let e=S().params;return d(()=>e(),{},{equals:(n,t)=>JSON.stringify(n)===JSON.stringify(t)})}function St(){return p(U)??{}}function Ot(e){let n=z();return d(()=>n()[e])}function Lt(e,n){let t=z();return d(()=>e(t()),void 0,n?{equals:n}:void 0)}function Et(e){let n=W();return d(()=>Re(typeof e=="function"?e():e,n.pathname))}function kt(){let e=W(),n=Oe();return[d(()=>e.query),(r,o)=>{let i=new URLSearchParams(e.search);for(let[c,l]of Object.entries(r))l===null?i.delete(c):i.set(c,l);let s=i.toString();n(e.pathname+(s?`?${s}`:""),o)}]}function Dt(e,n){let t=(a,r)=>ve(a,r);return n!==void 0?d(()=>xe(e(),n),void 0,{equals:t}):d(e,void 0,{equals:t})}function W(){let{location:e}=S();return new Proxy({},{get:(n,t)=>e()[t],has:(n,t)=>t in e(),ownKeys:()=>Reflect.ownKeys(e()),getOwnPropertyDescriptor:(n,t)=>Object.getOwnPropertyDescriptor(e(),t)})}function Mt(e={}){let n=p(h);return t=>{if(!n||t.defaultPrevented||t.button!==0||t.metaKey||t.ctrlKey||t.shiftKey||t.altKey)return;let r=t.target?.closest?.("a");if(!r||!r.getAttribute("href")||r.target&&r.target!=="_self"||r.hasAttribute("download")||/(^|\s)external(\s|$)/.test(r.getAttribute("rel")??""))return;let o=new URL(r.href);o.protocol!=="http:"&&o.protocol!=="https:"||o.origin===window.location.origin&&(o.hash&&o.pathname===window.location.pathname&&o.search===window.location.search||e.shouldNavigate&&!e.shouldNavigate(o,r)||(t.preventDefault(),n.router.navigate(o.pathname+o.search+o.hash,{replace:e.replace})))}}function Oe(){let{router:e}=S();return(n,t)=>e.navigate(n,t)}function Nt(){return p(K)??(()=>{})}var f=e=>typeof e=="function"?e():e,Le=new Set(["href","slot","class","className","active","activeClass","replace","children"]);function Ee(e){let n=p(h),t=typeof document>"u",a=()=>n?.router.navigate(f(e.href)??"",{replace:f(e.replace)}),r=g("a");u(r,"href",f(e.href)??""),e.slot&&u(r,"slot",f(e.slot));for(let i of Object.keys(e)){if(Le.has(i))continue;let s=e[i];s!=null&&typeof s!="function"&&u(r,i,String(s))}if(typeof r.addEventListener=="function")r.addEventListener("click",i=>{i.metaKey||i.ctrlKey||i.shiftKey||i.altKey||(i.preventDefault(),a())});else{let i=f(e.className??e.class)??"";i&&u(r,"class",i)}typeof r.addEventListener=="function"&&P(()=>{let i=f(e.href)??"";r.setAttribute("href",i);let s=f(e.className??e.class)??"",c=f(e.activeClass)??"",l=f(e.active)??n?.location().pathname===i;r.className=[s,l?c:""].filter(Boolean).join(" ")});let o=e.children;return o!=null&&v(r,o),r}var _t=Ee;function Ht(e){let n=e.action,t=e.className??e.class,a=n.url??"",r=g("form");u(r,"method","post"),a&&u(r,"action",a),t&&u(r,"class",t);for(let i of Object.keys(e)){if(i==="action"||i==="children"||i==="class"||i==="className")continue;let s=e[i];s!=null&&typeof s!="function"&&u(r,i,String(s))}typeof r.addEventListener=="function"&&r.addEventListener("submit",i=>{i.preventDefault();let s={};new FormData(r).forEach((c,l)=>{s[l]=c}),Promise.resolve(n(s)).catch(()=>{})});let o=e.children;return o!=null&&v(r,o),r}async function Vt(e,n){let t=be(e,n);if(!t)return;let a=[];for(let r of t.matched){let o=r.component;o&&typeof o.preload=="function"&&a.push(o.preload())}await Promise.all(a)}export{_t as A,Ht as Form,Ee as Link,Pt as Outlet,At as Redirect,wt as Router,H as action,ae as cache,ue as createAsync,Kt as createBrowserHistory,Ut as createMemoryHistory,me as lazy,zt as matchPath,It as matchRoutes,Vt as preloadRoutes,ce as revalidate,Bt as runWithOwner,Dt as select,le as useAction,St as useLevelParams,Mt as useLinkNavigation,W as useLocation,Et as useMatch,Oe as useNavigate,Ot as useParam,Lt as useParamSelector,z as useParams,Nt as useRouteData,S as useRouter,kt as useSearchParams,de as useSubmission};
@@ -1 +1 @@
1
- "use strict";var c=Object.defineProperty;var h=Object.getOwnPropertyDescriptor;var l=Object.getOwnPropertyNames;var n=Object.prototype.hasOwnProperty;var r=(o,a)=>{for(var t in a)c(o,t,{get:a[t],enumerable:!0})},s=(o,a,t,e)=>{if(a&&typeof a=="object"||typeof a=="function")for(let p of l(a))!n.call(o,p)&&p!==t&&c(o,p,{get:()=>a[p],enumerable:!(e=h(a,p))||e.enumerable});return o};var x=o=>s(c({},"__esModule",{value:!0}),o);var I={};r(I,{VERSION:()=>E});module.exports=x(I);var E="1.0.0-alpha.75";
1
+ "use strict";var c=Object.defineProperty;var h=Object.getOwnPropertyDescriptor;var l=Object.getOwnPropertyNames;var n=Object.prototype.hasOwnProperty;var r=(o,a)=>{for(var t in a)c(o,t,{get:a[t],enumerable:!0})},s=(o,a,t,e)=>{if(a&&typeof a=="object"||typeof a=="function")for(let p of l(a))!n.call(o,p)&&p!==t&&c(o,p,{get:()=>a[p],enumerable:!(e=h(a,p))||e.enumerable});return o};var x=o=>s(c({},"__esModule",{value:!0}),o);var I={};r(I,{VERSION:()=>E});module.exports=x(I);var E="1.0.0-alpha.76";
@@ -1,3 +1,3 @@
1
1
  /** The published version of @fluixi/core that this build came from. */
2
- export declare const VERSION = "1.0.0-alpha.75";
2
+ export declare const VERSION = "1.0.0-alpha.76";
3
3
  //# sourceMappingURL=version.generated.d.ts.map
@@ -1,3 +1,3 @@
1
1
  // GENERATED by scripts/gen-version.mjs — do not edit.
2
2
  /** The published version of @fluixi/core that this build came from. */
3
- export const VERSION = '1.0.0-alpha.75';
3
+ export const VERSION = '1.0.0-alpha.76';
@@ -1 +1 @@
1
- var a="1.0.0-alpha.75";export{a as VERSION};
1
+ var a="1.0.0-alpha.76";export{a as VERSION};