@fluixi/reactive 1.0.0-alpha.83 → 1.0.0-alpha.84
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/reactive.cjs +2673 -1
- package/dist/cdn/reactive.global.js +2 -1
- package/dist/cdn/reactive.mjs +2657 -1
- package/dist/cdn/signal.cjs +299 -1
- package/dist/cdn/signal.d.ts +1 -1
- package/dist/cdn/signal.global.js +2 -1
- package/dist/cdn/signal.js +1 -1
- package/dist/cdn/signal.mjs +276 -1
- package/dist/index.cjs +2673 -1
- package/dist/index.mjs +2657 -1
- package/dist/lib/index.cjs +2674 -1
- package/dist/lib/index.js +1 -1
- package/dist/lib/index.mjs +2659 -1
- package/dist/lib/observable/index.cjs +386 -1
- package/dist/lib/observable/index.mjs +364 -1
- package/dist/lib/observable/observable.cjs +384 -1
- package/dist/lib/observable/observable.d.ts +0 -137
- package/dist/lib/observable/observable.d.ts.map +1 -1
- package/dist/lib/observable/observable.js +0 -71
- package/dist/lib/observable/observable.mjs +361 -1
- package/dist/lib/observable/subscription.cjs +180 -1
- package/dist/lib/observable/subscription.d.ts +0 -12
- package/dist/lib/observable/subscription.d.ts.map +1 -1
- package/dist/lib/observable/subscription.js +0 -12
- package/dist/lib/observable/subscription.mjs +157 -1
- package/dist/lib/observable/types.cjs +18 -1
- package/dist/lib/observable/types.d.ts.map +1 -1
- package/dist/lib/predicates.cjs +44 -1
- package/dist/lib/predicates.d.ts +2 -2
- package/dist/lib/predicates.js +2 -2
- package/dist/lib/predicates.mjs +23 -1
- package/dist/lib/signal/api.cjs +571 -1
- package/dist/lib/signal/api.d.ts +211 -1
- package/dist/lib/signal/api.d.ts.map +1 -1
- package/dist/lib/signal/api.js +207 -12
- package/dist/lib/signal/api.mjs +548 -1
- package/dist/lib/signal/cached-resource.cjs +672 -1
- package/dist/lib/signal/cached-resource.d.ts +28 -16
- package/dist/lib/signal/cached-resource.d.ts.map +1 -1
- package/dist/lib/signal/cached-resource.js +35 -29
- package/dist/lib/signal/cached-resource.mjs +650 -1
- package/dist/lib/signal/graph/children.cjs +325 -1
- package/dist/lib/signal/graph/children.js +1 -1
- package/dist/lib/signal/graph/children.mjs +302 -1
- package/dist/lib/signal/graph/compat.cjs +578 -1
- package/dist/lib/signal/graph/compat.d.ts +13 -13
- package/dist/lib/signal/graph/compat.d.ts.map +1 -1
- package/dist/lib/signal/graph/compat.js +33 -31
- package/dist/lib/signal/graph/compat.mjs +556 -1
- package/dist/lib/signal/graph/core.cjs +295 -1
- package/dist/lib/signal/graph/core.d.ts +28 -24
- package/dist/lib/signal/graph/core.d.ts.map +1 -1
- package/dist/lib/signal/graph/core.js +38 -31
- package/dist/lib/signal/graph/core.mjs +273 -1
- package/dist/lib/signal/graph/debounced.cjs +668 -1
- package/dist/lib/signal/graph/debounced.d.ts +5 -5
- package/dist/lib/signal/graph/debounced.d.ts.map +1 -1
- package/dist/lib/signal/graph/debounced.js +5 -5
- package/dist/lib/signal/graph/debounced.mjs +645 -1
- package/dist/lib/signal/graph/derived.cjs +496 -1
- package/dist/lib/signal/graph/derived.d.ts +1 -1
- package/dist/lib/signal/graph/derived.js +1 -1
- package/dist/lib/signal/graph/derived.mjs +473 -1
- package/dist/lib/signal/graph/detect.cjs +66 -1
- package/dist/lib/signal/graph/detect.mjs +45 -1
- package/dist/lib/signal/graph/error-boundary.cjs +301 -1
- package/dist/lib/signal/graph/error-boundary.js +3 -3
- package/dist/lib/signal/graph/error-boundary.mjs +278 -1
- package/dist/lib/signal/graph/index.cjs +305 -1
- package/dist/lib/signal/graph/index.d.ts +7 -6
- package/dist/lib/signal/graph/index.d.ts.map +1 -1
- package/dist/lib/signal/graph/index.js +7 -6
- package/dist/lib/signal/graph/index.mjs +283 -1
- package/dist/lib/signal/graph/observe.cjs +163 -1
- package/dist/lib/signal/graph/observe.d.ts +8 -8
- package/dist/lib/signal/graph/observe.js +5 -5
- package/dist/lib/signal/graph/observe.mjs +140 -1
- package/dist/lib/signal/graph/resource.cjs +620 -1
- package/dist/lib/signal/graph/resource.d.ts +1 -1
- package/dist/lib/signal/graph/resource.js +7 -8
- package/dist/lib/signal/graph/resource.mjs +597 -1
- package/dist/lib/signal/graph/runtime.cjs +501 -1
- package/dist/lib/signal/graph/runtime.d.ts +7 -7
- package/dist/lib/signal/graph/runtime.d.ts.map +1 -1
- package/dist/lib/signal/graph/runtime.js +34 -30
- package/dist/lib/signal/graph/runtime.mjs +478 -1
- package/dist/lib/signal/graph/signal-next.cjs +1208 -1
- package/dist/lib/signal/graph/signal-next.d.ts +5 -5
- package/dist/lib/signal/graph/signal-next.d.ts.map +1 -1
- package/dist/lib/signal/graph/signal-next.js +14 -12
- package/dist/lib/signal/graph/signal-next.mjs +1186 -1
- package/dist/lib/signal/graph/ssr-hooks.cjs +60 -1
- package/dist/lib/signal/graph/ssr-hooks.d.ts +6 -7
- package/dist/lib/signal/graph/ssr-hooks.d.ts.map +1 -1
- package/dist/lib/signal/graph/ssr-hooks.js +6 -7
- package/dist/lib/signal/graph/ssr-hooks.mjs +39 -1
- package/dist/lib/signal/graph/state.cjs +72 -1
- package/dist/lib/signal/graph/state.d.ts +41 -10
- package/dist/lib/signal/graph/state.d.ts.map +1 -1
- package/dist/lib/signal/graph/state.js +83 -22
- package/dist/lib/signal/graph/state.mjs +49 -1
- package/dist/lib/signal/graph/suspense.cjs +301 -1
- package/dist/lib/signal/graph/suspense.js +4 -4
- package/dist/lib/signal/graph/suspense.mjs +278 -1
- package/dist/lib/signal/index-legacy.cjs +2540 -1
- package/dist/lib/signal/index-legacy.d.ts +1 -1
- package/dist/lib/signal/index-legacy.js +1 -1
- package/dist/lib/signal/index-legacy.mjs +2518 -1
- package/dist/lib/signal/index.cjs +1275 -1
- package/dist/lib/signal/index.d.ts +3 -2
- package/dist/lib/signal/index.d.ts.map +1 -1
- package/dist/lib/signal/index.js +7 -4
- package/dist/lib/signal/index.mjs +1253 -1
- package/dist/lib/signal/list.cjs +549 -1
- package/dist/lib/signal/list.d.ts +5 -5
- package/dist/lib/signal/list.js +5 -5
- package/dist/lib/signal/list.mjs +526 -1
- package/dist/lib/signal/resource-api.cjs +626 -1
- package/dist/lib/signal/resource-api.d.ts +5 -5
- package/dist/lib/signal/resource-api.js +5 -5
- package/dist/lib/signal/resource-api.mjs +603 -1
- package/dist/lib/signal/signal.cjs +2023 -1
- package/dist/lib/signal/signal.d.ts +4 -4
- package/dist/lib/signal/signal.d.ts.map +1 -1
- package/dist/lib/signal/signal.js +22 -23
- package/dist/lib/signal/signal.mjs +2000 -1
- package/dist/lib/signal/types.cjs +38 -1
- package/dist/lib/signal/types.d.ts.map +1 -1
- package/dist/lib/signal/types.js +2 -2
- package/dist/lib/signal/types.mjs +17 -1
- package/dist/lib/signal/utilities.cjs +1012 -1
- package/dist/lib/signal/utilities.d.ts +0 -108
- package/dist/lib/signal/utilities.d.ts.map +1 -1
- package/dist/lib/signal/utilities.js +0 -158
- package/dist/lib/signal/utilities.mjs +990 -1
- package/dist/lib/store/api.cjs +612 -1
- package/dist/lib/store/api.d.ts +33 -0
- package/dist/lib/store/api.d.ts.map +1 -1
- package/dist/lib/store/api.js +41 -8
- package/dist/lib/store/api.mjs +596 -1
- package/dist/lib/store/index.cjs +691 -1
- package/dist/lib/store/index.js +1 -1
- package/dist/lib/store/index.mjs +676 -1
- package/dist/lib/store/setter.types.cjs +18 -1
- package/dist/lib/store/setter.types.d.ts +43 -3
- package/dist/lib/store/setter.types.d.ts.map +1 -1
- package/dist/lib/store/store.cjs +658 -1
- package/dist/lib/store/store.d.ts +72 -0
- package/dist/lib/store/store.d.ts.map +1 -1
- package/dist/lib/store/store.js +148 -5
- package/dist/lib/store/store.mjs +644 -1
- package/dist/lib/store/types.cjs +18 -1
- package/dist/lib/store/types.d.ts +1 -1
- package/dist/lib/store/types.d.ts.map +1 -1
- package/dist/lib/store/utils.cjs +43 -1
- package/dist/lib/store/utils.d.ts +1 -1
- package/dist/lib/store/utils.js +1 -1
- package/dist/lib/store/utils.mjs +22 -1
- package/dist/lib/subject.cjs +450 -1
- package/dist/lib/subject.js +3 -91
- package/dist/lib/subject.mjs +427 -1
- package/dist/tsconfig.lib.tsbuildinfo +1 -1
- package/dist/version.generated.cjs +27 -1
- package/dist/version.generated.d.ts +1 -1
- package/dist/version.generated.js +2 -2
- package/dist/version.generated.mjs +7 -1
- package/package.json +5 -4
|
@@ -1 +1,1275 @@
|
|
|
1
|
-
"use strict";var de=Object.defineProperty;var Rn=Object.getOwnPropertyDescriptor;var kn=Object.getOwnPropertyNames;var On=Object.prototype.hasOwnProperty;var _n=(e,n)=>{for(var r in n)de(e,r,{get:n[r],enumerable:!0})},Cn=(e,n,r,t)=>{if(n&&typeof n=="object"||typeof n=="function")for(let s of kn(n))!On.call(e,s)&&s!==r&&de(e,s,{get:()=>n[s],enumerable:!(t=Rn(n,s))||t.enumerable});return e};var An=e=>Cn(de({},"__esModule",{value:!0}),e);var Jn={};_n(Jn,{$PROXY:()=>$n,$SIGNAL:()=>zn,Signal:()=>bn,SuspenseContext:()=>ce,__DEV__:()=>re,batch:()=>R,createChildOwner:()=>je,createComputed:()=>Xe,createContext:()=>N,createDebounce:()=>pn,createDebouncedResource:()=>vn,createDebouncedSignal:()=>Re,createDeferred:()=>fn,createEffect:()=>S,createErrorBoundary:()=>wn,createMemo:()=>x,createRenderEffect:()=>Qe,createResource:()=>B,createRoot:()=>A,createSelector:()=>ln,createSignal:()=>f,createSuspenseBoundary:()=>mn,disposeScope:()=>Ve,effect:()=>Qn,flush:()=>Ze,getOwner:()=>z,getServerData:()=>se,indexArray:()=>jn,isComponent:()=>tn,isMemo:()=>nn,isOwnerDisposed:()=>He,isProvider:()=>sn,isResource:()=>rn,isSignal:()=>te,isSuspense:()=>on,keyArray:()=>Fn,makeArrayFlat:()=>Te,mapArray:()=>Bn,memo:()=>Xn,nextResourceId:()=>ie,observeReactiveNodes:()=>le,on:()=>en,onCleanup:()=>m,provide:()=>M,provideErrorBoundary:()=>xn,provideSuspense:()=>yn,readChildren:()=>hn,reportReactiveBinding:()=>Ie,reportReactiveContext:()=>P,reportReactiveContextCreated:()=>J,reportReactiveDirective:()=>Ne,reportReactiveProps:()=>qe,reportResourceData:()=>ue,resource:()=>gn,runWithOwner:()=>U,setOwner:()=>he,setResourceDataSink:()=>dn,setResourceIdSource:()=>cn,setResourceTracker:()=>un,setServerDataGetter:()=>an,signal:()=>Yn,startTransition:()=>ye,trackResourcePromise:()=>oe,untrack:()=>b,useContext:()=>Le,useTransition:()=>Je});module.exports=An(Jn);var En="__fluixi_signal_next_state__",Dn=e=>{typeof queueMicrotask=="function"?queueMicrotask(e):Promise.resolve().then(e)},o=globalThis[En]??={consumer:null,untracked:!1,owner:null,queue:[],scheduled:!1,flushing:!1,batchDepth:0,hostSchedule:Dn,onSuspend:null,onError:null,observer:null};var _e="1.0.0-alpha.83";function le(e){return o.observer=e,()=>{o.observer===e&&(o.observer=null)}}var y=[],Pn;function V(e){let n=o.observer;n&&n.created(e.parents===void 0?{...e,parents:y,origin:e.origin??Pn}:e)}function Ae(e){return o.observer?(y.push(e),!0):!1}function Ee(){y.pop()}function De(e){o.observer?.ran?.(e)}function Pe(e,n){o.observer?.wrote?.(e,n)}function Ie(e,n,r,t){let s=o.observer;!s?.bound||!y.length||s.bound(y[y.length-1],e,n,r,t)}function qe(e){let n=o.observer;!n?.props||!y.length||!e||n.props(y[y.length-1],e)}function Ne(e,n,r,t){let s=o.observer;!s?.directive||!y.length||s.directive(y[y.length-1],e,n,r,t)}function J(e){o.observer?.contextCreated?.(e)}function P(e,n,r){let t=o.observer;!t?.context||!y.length||t.context(y[y.length-1],e,n,r)}function H(e){o.observer?.disposed?.(e)}var In="__FLUIXI_DEVTOOLS_HOOK__",Ce=globalThis[In];if(typeof Ce?.inject=="function")try{Ce.inject({observeReactiveNodes:le,version:_e})}catch{}function fe(){return o.observer!=null}var Me=0,Ue=1,L=2,Z=class{constructor(){this.observers=null;this.watchers=null;this.version=0}updateIfNecessary(){}track(){if(o.untracked)return;let n=o.consumer;n&&((this.observers??=new Set).add(n),(n.sources??=new Set).add(this))}},I=class extends Z{constructor(n,r){super(),this._value=n,this._equals=r?.equals===!1?()=>!1:r?.equals??Object.is}get(){return this.track(),this._value}set(n){if(!this._equals(this._value,n)){if(this._value=n,this.version++,Pe(this,o.consumer),this.observers)for(let r of[...this.observers])r.markDirty(L);pe(this)}}peek(){return this._value}},O=class extends Z{constructor(r,t){super();this._threw=!1;this._initialized=!1;this.state=L;this.sources=null;this._fn=r,this._equals=t?.equals===!1?()=>!1:t?.equals??Object.is}get(){if(o.consumer===this)throw new Error("Signal.Computed cannot read itself");if(this.track(),this.updateIfNecessary(),this._threw)throw this._error;return this._value}updateIfNecessary(){if(this.state===Ue&&this.sources){for(let r of this.sources)if(r.updateIfNecessary(),this.state===L)break}(this.state===L||!this._initialized)&&this.recompute(),this.state=Me}recompute(){if(this.sources){for(let l of this.sources)l.observers?.delete(this);this.sources.clear()}let r=o.consumer,t=o.untracked,s=Ae(this);o.consumer=this,o.untracked=!1;let a,u=!1,c;try{a=this._fn()}catch(l){u=!0,c=l,a=this._value}finally{o.consumer=r,o.untracked=t,s&&Ee()}let i=!this._initialized||this._threw!==u||(u?c!==this._error:!this._equals(this._value,a));if(this._initialized=!0,this._threw=u,this._error=c,this._value=a,De(this),i){if(this.version++,this.observers)for(let l of[...this.observers])l.markDirty(L);pe(this)}}markDirty(r){if(this.state>=r)return;let t=this.state===Me;if(this.state=r,t){if(this.observers)for(let s of[...this.observers])s.markDirty(Ue);pe(this)}}peek(){if(this.updateIfNecessary(),this._threw)throw this._error;return this._value}};function pe(e){if(e.watchers)for(let n of[...e.watchers])n._notify(e)}var q=class{constructor(n){this._watched=new Set;this._pending=new Set;this._notifyFn=n}watch(...n){for(let r of n)this._watched.add(r),(r.watchers??=new Set).add(this)}unwatch(...n){for(let r of n)this._watched.delete(r),r.watchers?.delete(this),this._pending.delete(r)}getPending(){let n=[...this._pending];return this._pending.clear(),n}_notify(n){if(!this._watched.has(n)||this._pending.has(n))return;let r=this._pending.size===0;this._pending.add(n),r&&this._notifyFn()}};function W(e){if(o.untracked)return e();o.untracked=!0;try{return e()}finally{o.untracked=!1}}function Be(){return o.consumer}function Fe(e){return!!(e.observers&&e.observers.size)||!!(e.watchers&&e.watchers.size)}function je(e){let n=K(e);return e&&(e.owned??=[]).push(n),n}function Ve(e,n=!0){G(e,n)}function He(e){return!!e&&e.disposed===!0}function K(e){return{cleanups:null,owned:null,parent:e,contexts:null}}function N(e,n){let r=Symbol(n??"context");return J(r),{id:r,defaultValue:e,Provider:s=>{P(r,"provide",s.value);let a=o.owner,u=K(a);(u.contexts=new Map).set(r,s.value),a&&(a.owned??=[]).push(u),o.owner=u;try{return s.children}finally{o.owner=a}}}}function Le(e){let n=o.owner;for(;n;){if(n.contexts&&n.contexts.has(e.id)){let r=n.contexts.get(e.id);return P(e.id,"read",r),r}n=n.parent}return P(e.id,"read",e.defaultValue),e.defaultValue}function ee(e,n){let r=e;for(;r;){if(r.contexts&&r.contexts.has(n.id))return r.contexts.get(n.id);r=r.parent}return n.defaultValue}function M(e,n,r){let t=K(o.owner);(t.contexts=new Map).set(e.id,n),o.owner&&(o.owner.owned??=[]).push(t);let s=o.owner;o.owner=t;try{return r()}finally{o.owner=s}}function We(e){o.onSuspend=e}function Ge(e){return o.onSuspend?(o.onSuspend(e,o.owner),!0):!1}function Ke(e){o.onError=e}function z(){return o.owner}function he(e){let n=o.owner;return o.owner=e,n}function U(e,n){let r=o.owner;o.owner=e;try{return n()}finally{o.owner=r}}function m(e){if(o.owner){if(o.owner.disposed){e();return}(o.owner.cleanups??=[]).push(e)}}function G(e,n=!0){if(!e.disposed){if(e.owned){for(let r=e.owned.length-1;r>=0;r--)G(e.owned[r]);e.owned=null}if(e.cleanups){for(let r=e.cleanups.length-1;r>=0;r--)e.cleanups[r]();e.cleanups=null}n&&(e.disposed=!0)}}function A(e){let n=K(o.owner);o.owner&&(o.owner.owned??=[]).push(n);let r=o.owner;o.owner=n;try{return e(()=>G(n))}finally{o.owner=r}}function ze(e){o.hostSchedule=e??(n=>{Promise.resolve().then(n)})}function qn(e){e.queued||(e.queued=!0,o.queue.push(e),!o.scheduled&&o.batchDepth===0&&(o.scheduled=!0,o.hostSchedule($)))}function $(){if(o.scheduled=!1,o.flushing)return;o.flushing=!0;let e=0;try{for(;o.queue.length;){if(++e>1e5)throw new Error("[fluixi] effect flush did not settle (cycle?)");let n=o.queue;o.queue=[];for(let r of n)r.queued=!1,r.disposed||r.run()}}finally{o.flushing=!1}}function $e(){o.batchDepth===0&&$()}function me(e){o.batchDepth++;try{return e()}finally{--o.batchDepth===0&&$()}}var ve=class{constructor(n,r=!1){this.queued=!1;this.disposed=!1;this.owner=K(o.owner),o.owner&&(o.owner.cleanups??=[]).push(()=>this.dispose()),this.computed=new O(()=>{G(this.owner,!1),U(this.owner,()=>{let t=n();typeof t=="function"&&(this.owner.cleanups??=[]).push(t)})}),V({kind:"effect",node:this.computed,handle:this,internal:!r}),this.watcher=new q(()=>qn(this)),this.run(),this.watcher.watch(this.computed)}run(){if(!this.disposed){this.watcher.getPending();try{this.computed.get()}catch(n){if(n&&typeof n.then=="function"&&o.onSuspend){o.onSuspend(n,this.owner);return}if(o.onError&&o.onError(n,this.owner))return;throw n}}}dispose(){this.disposed||(this.disposed=!0,H(this.computed),this.watcher.unwatch(this.computed),G(this.owner))}};function ne(e,n=!1){let r=new ve(e,n);return()=>r.dispose()}function Nn(e){return!!e&&typeof e.then=="function"}ze(()=>{});var Ye=Symbol.for("signal"),Mn=Symbol.for("memo"),Un=Symbol.for("signal-node");function f(e,n){let r=new I(e,{equals:n?.equals}),t=(()=>r.get()),s=(a=>{let u=typeof a=="function"?a(r.peek()):a;return r.set(u),$e(),u});return Object.defineProperty(t,Ye,{value:!0,enumerable:!0}),Object.defineProperty(t,Un,{value:{get value(){return r.peek()},get version(){return r.version}},enumerable:!1}),V({kind:"signal",node:r,handle:t,name:n?.name,set:s}),fe()&&m(()=>H(r)),[t,s]}function x(e,n,r){let t=n,s=z(),a=new O(()=>U(s,()=>{try{return t=e(t)}catch(c){if(Nn(c))return Ge(c),t;throw c}}),{equals:r?.equals}),u=(()=>a.get());return Object.defineProperty(u,Ye,{value:!0,enumerable:!0}),Object.defineProperty(u,Mn,{value:!0,enumerable:!0}),V({kind:"memo",node:a,handle:u,name:r?.name}),fe()&&m(()=>H(a)),u}function S(e,n){let r=n;return ne(()=>{r=e(r)},!0)}function Xe(e,n){let r=n;ne(()=>{r=e(r)})}function Qe(e,n){let r=n;return ne(()=>{r=e(r)})}function R(e){return me(e)}function b(e){return W(e)}function ye(e){return me(e),Promise.resolve()}function Je(){return[()=>!1,ye]}function Ze(){return $(),Promise.resolve()}function en(e,n,r){let t=Array.isArray(e),s,a=r?.defer??!1;return u=>{let c=t?e.map(l=>l()):e();if(a){a=!1,s=c;return}let i=W(()=>n(c,s,u));return s=c,i}}function Bn(e,n,r){let t=[];return m(()=>{for(let s of t)s.dispose();t=[]}),x(()=>{let s=e()||[];return b(()=>{if(s.length===0){for(let i of t)i.dispose();return t=[],r?.fallback?r.fallback():[]}let a=new Map;for(let i of t)a.has(i.item)||a.set(i.item,i);let u=[],c=new Set;for(let i=0;i<s.length;i++){let l=s[i],v=a.get(l);if(v&&!c.has(v))v.setIndex(i),u.push(v),c.add(v);else{let d,p,h;A(T=>{h=T;let[E,F]=f(i,{name:"row index"});p=F,d=n(l,E)});let g={item:l,rendered:d,dispose:h,setIndex:p};u.push(g),c.add(g)}}for(let i of t)c.has(i)||i.dispose();return t=u,u.map(i=>i.rendered)})},void 0,{name:"mapArray"})}function Fn(e,n,r,t){let s=[],a=[];return m(()=>{for(let u of a)u.dispose();s=[],a=[]}),x(()=>{let u=e()||[];return b(()=>{if(u.length===0){for(let d of a)d.dispose();return s=[],a=[],t?.fallback?t.fallback():[]}let c=new Map;for(let d=0;d<s.length;d++)c.set(s[d],a[d]);let i=[],l=[],v=new Set;for(let d=0;d<u.length;d++){let p=n(u[d]),h=c.get(p);if(h&&!v.has(p))h.setIndex(d),i.push(h);else{let g,T,E;A(F=>{E=F;let[_,j]=f(d,{name:"row index"});T=j;let Y=x(D=>{let k=(e()||[])[_()];return k??D},u[d]);g=r(Y,_)}),i.push({rendered:g,dispose:E,setIndex:T})}l.push(p),v.add(p)}for(let[d,p]of c)v.has(d)||p.dispose();return s=l,a=i,i.map(d=>d.rendered)})},void 0,{name:"keyArray"})}function jn(e,n,r){let t=[];return m(()=>{for(let s of t)s.dispose();t=[]}),x(()=>{let s=e()||[];return b(()=>{if(s.length===0){for(let i of t)i.dispose();return t=[],r?.fallback?r.fallback():[]}let a=t.length,u=s.length;for(let i=a;i<u;i++){let l,v,d,p=s[i];A(h=>{d=h;let[g,T]=f(p);v=T,l=n(g,i)}),t.push({rendered:l,setItem:v,dispose:d})}for(let i=u;i<a;i++)t[i].dispose();u<a&&(t=t.slice(0,u));let c=Math.min(a,u);for(let i=0;i<c;i++)t[i].setItem(s[i]);return t.map(i=>i.rendered)})},void 0,{name:"indexArray"})}var Vn=typeof window>"u"?!1:window.__FLUIXI_PROD__===!0,re=typeof process>"u"?Vn:!1,Hn=Symbol.for("signal"),Ln=Symbol.for("memo"),Wn=Symbol.for("resource");function te(e){return typeof e=="function"&&e[Hn]===!0}function nn(e){return typeof e=="function"&&e[Ln]===!0}function rn(e){return typeof e=="function"&&e[Wn]===!0}function tn(e){return typeof e=="function"&&e[Symbol.for("fluixi-component")]===!0}function on(e){return typeof e=="function"&&e[Symbol.for("fluixi-suspense")]===!0}function sn(e){return typeof e=="function"&&e[Symbol.for("fluixi-provider")]===!0}function Te(e){return Array.isArray(e)?e.length===2&&e[1]===" "?Array.isArray(e[0])?Te(e[0]):(typeof e[0]=="function",e[0]):e.length===1&&typeof e[0]=="function"?e[0]:e:e}var we=null;function un(e){we=e}function oe(e){we&&we(e)}var xe=null;function an(e){xe=e}function se(e){return xe?xe(e):void 0}var be=null;function cn(e){be=e}function ie(){return be?be():void 0}var ge=null;function dn(e){ge=e}function ue(e,n){ge&&ge(e,n)}function ln(e,n=(r,t)=>r===t){let r=new Map;return S(()=>{let t=e();for(let[s,a]of r){let[u,c]=a,i=n(s,t);u()!==i&&c(i)}}),t=>{let s=r.get(t);if(!s){let[a,u]=f(!1);s=[a,u],r.set(t,s);let c=e();u(n(t,c))}return s[0]()}}function fn(e,n){let[r,t]=f(e(),n);return S(()=>{let s=e();n?.timeoutMs?setTimeout(()=>t(()=>s),n.timeoutMs):typeof requestIdleCallback=="function"?requestIdleCallback(()=>t(()=>s)):Promise.resolve().then(()=>t(()=>s))}),r}function pn(e,n){let r,t=(...s)=>{r!==void 0&&clearTimeout(r),r=setTimeout(()=>{r=void 0,e(...s)},n)};return m(()=>{r!==void 0&&clearTimeout(r)}),t}function Gn(e){return!!e&&typeof e.then=="function"}var Se=Symbol();function B(e,n,r={}){let t,s;typeof n=="function"?(t=typeof e=="function"?e:()=>e,s=n):(t=()=>!0,s=e,n&&typeof n=="object"&&(r=n));let a=r.transport===!1?void 0:ie(),u=a!==void 0?se(a):void 0,c=u!==void 0,[i,l]=f(u!==void 0?u.value:r.initialValue,{equals:!1}),[v,d]=f(void 0,{equals:!1}),[p,h]=f(u!==void 0||r.initialValue!==void 0?"ready":"unresolved",{equals:!1}),[g,T]=f(void 0,{equals:!1}),[E,F]=f(void 0,{equals:!1}),_=Se,j=!1;S(()=>{let w=t();if(E(),w===!1||w===null||w===void 0){_=Se,R(()=>{h("unresolved"),T(void 0),d(void 0)});return}let k=j;if(j=!1,_!==Se&&w===_&&!k)return;if(_=w,c){c=!1;return}let X=!1;m(()=>X=!0);let ke=b(p),Sn=b(i),Oe=ke==="ready"||ke==="refreshing";R(()=>{h(Oe?"refreshing":"pending"),d(void 0)});try{let C=s(w,{value:Sn,refetching:Oe});Gn(C)?(T(C),oe(C),C.then(Q=>{X||(a!==void 0&&ue(a,Q),R(()=>{l(()=>Q),h("ready"),T(void 0)}))},Q=>{X||R(()=>{d(Q),h("errored"),T(void 0)})})):R(()=>{l(()=>C),h("ready"),T(void 0)})}catch(C){if(X)return;R(()=>{d(C),h("errored"),T(void 0)})}});let Y=()=>{let w=p();return w==="pending"||w==="refreshing"},D=(()=>{let w=v();if(w)throw w;if(Y()){let k=g();if(k)throw k}return i()});return Object.defineProperties(D,{state:{get:p},loading:{get:Y},error:{get:v},latest:{get:i}}),Object.defineProperty(D,Symbol.for("resource"),{value:!0,enumerable:!0}),Object.defineProperty(D,Symbol.for("signal"),{value:!0,enumerable:!0}),[D,{mutate:l,refetch:()=>{j=!0,F(void 0)}}]}function Re(e,n=300){let[r,t]=f(e),[s,a]=f(e),[u,c]=f(!1),i,l=()=>{i!==void 0&&(clearTimeout(i),i=void 0)},v=()=>{l();let p=b(r);return a(()=>p),c(!1),p},d=(p=>{let h=typeof p=="function"?p(b(r)):p;return t(()=>h),c(!0),l(),i=setTimeout(v,n),h});return m(l),[s,d,{immediate:r,pending:u,flush:v,cancel:()=>{l(),c(!1)}}]}function Kn(e){return e!=null&&e!==""}function vn(e,n,r={}){let{delay:t=300,initialValue:s,shouldFetch:a=Kn}=r,[u,c,i]=Re(e,t),l=()=>a(u())?u():!1,[v,{refetch:d}]=B(l,n,s===void 0?{}:{initialValue:s});return[v,{...i,query:u,setQuery:c,refetch:d}]}function ae(e){if(typeof e=="function"&&!e.length){let n=e();return te(n)?n:ae(n)}if(Array.isArray(e)){let n=[];for(let r=0;r<e.length;r++){let t=ae(e[r]);Array.isArray(t)?n.push.apply(n,t):n.push(t)}return n}return e}function hn(e){let n=x(e);return re?x(()=>ae(n()),void 0,{name:"children"}):x(()=>ae(n()))}var ce=N();We((e,n)=>{let r=ee(n,ce);r&&(r.increment(),e.finally(()=>r.decrement()))});function mn(){let[e,n]=f(0),r=0;return{increment:()=>n(r+=1),decrement:()=>n(r-=1),inFallback:()=>e()>0}}function yn(e,n){return M(ce,e,n)}var Tn=N();Ke((e,n)=>{let r=ee(n,Tn);return r?(r.setError(e),!0):!1});function wn(){let[e,n]=f(void 0,{equals:!1});return{error:e,reset:()=>n(()=>{}),setError:t=>n(()=>t)}}function xn(e,n){return M(Tn,e,n)}var bn={State:I,Computed:O,subtle:{Watcher:q,untrack:W,currentComputed:Be,hasSinks:Fe}};var zn=Symbol.for("signal"),$n=Symbol.for("fluixi-proxy");function Yn(e,n){let[r,t]=f(e,n);return Object.assign(r,{set:t})}function Xn(e,n,r){return x(e,n,r)}function Qn(e,n){return S(e,n)}function gn(...e){let[n,r]=B(...e);return Object.assign(n,r)}
|
|
1
|
+
/*! @fluixi/reactive v1.0.0-alpha.84 | (c) 2026 Ibrahima Touré and Fluixi contributors | MIT */
|
|
2
|
+
"use strict";
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
var __export = (target, all) => {
|
|
8
|
+
for (var name in all)
|
|
9
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
10
|
+
};
|
|
11
|
+
var __copyProps = (to, from, except, desc) => {
|
|
12
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
13
|
+
for (let key of __getOwnPropNames(from))
|
|
14
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
15
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
16
|
+
}
|
|
17
|
+
return to;
|
|
18
|
+
};
|
|
19
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
20
|
+
|
|
21
|
+
// src/lib/signal/index.ts
|
|
22
|
+
var index_exports = {};
|
|
23
|
+
__export(index_exports, {
|
|
24
|
+
$PROXY: () => $PROXY,
|
|
25
|
+
$SIGNAL: () => $SIGNAL3,
|
|
26
|
+
Signal: () => Signal,
|
|
27
|
+
SuspenseContext: () => SuspenseContext,
|
|
28
|
+
__DEV__: () => __DEV__,
|
|
29
|
+
batch: () => batch2,
|
|
30
|
+
childOwner: () => childOwner,
|
|
31
|
+
computed: () => computed,
|
|
32
|
+
context: () => context,
|
|
33
|
+
createChildOwner: () => createChildOwner,
|
|
34
|
+
createComputed: () => createComputed,
|
|
35
|
+
createContext: () => createContext,
|
|
36
|
+
createDebounce: () => createDebounce,
|
|
37
|
+
createDebouncedResource: () => createDebouncedResource,
|
|
38
|
+
createDebouncedSignal: () => createDebouncedSignal,
|
|
39
|
+
createDeferred: () => createDeferred,
|
|
40
|
+
createEffect: () => createEffect,
|
|
41
|
+
createErrorBoundary: () => createErrorBoundary,
|
|
42
|
+
createMemo: () => createMemo,
|
|
43
|
+
createRenderEffect: () => createRenderEffect,
|
|
44
|
+
createResource: () => createResource,
|
|
45
|
+
createRoot: () => createRoot,
|
|
46
|
+
createSelector: () => createSelector,
|
|
47
|
+
createSignal: () => createSignal,
|
|
48
|
+
createSuspenseBoundary: () => createSuspenseBoundary,
|
|
49
|
+
disposeScope: () => disposeScope,
|
|
50
|
+
effect: () => effect2,
|
|
51
|
+
flush: () => flush,
|
|
52
|
+
getOwner: () => getOwner,
|
|
53
|
+
getServerData: () => getServerData,
|
|
54
|
+
indexArray: () => indexArray,
|
|
55
|
+
isComponent: () => isComponent,
|
|
56
|
+
isMemo: () => isMemo,
|
|
57
|
+
isOwnerDisposed: () => isOwnerDisposed,
|
|
58
|
+
isProvider: () => isProvider,
|
|
59
|
+
isResource: () => isResource,
|
|
60
|
+
isSignal: () => isSignal,
|
|
61
|
+
isSuspense: () => isSuspense,
|
|
62
|
+
joinedVersions: () => joinedVersions,
|
|
63
|
+
keyArray: () => keyArray,
|
|
64
|
+
makeArrayFlat: () => makeArrayFlat,
|
|
65
|
+
mapArray: () => mapArray,
|
|
66
|
+
memo: () => memo,
|
|
67
|
+
nextResourceId: () => nextResourceId,
|
|
68
|
+
observeReactiveNodes: () => observeReactiveNodes,
|
|
69
|
+
on: () => on,
|
|
70
|
+
onCleanup: () => onCleanup,
|
|
71
|
+
provide: () => provide,
|
|
72
|
+
provideErrorBoundary: () => provideErrorBoundary,
|
|
73
|
+
provideSuspense: () => provideSuspense,
|
|
74
|
+
readChildren: () => readChildren,
|
|
75
|
+
renderEffect: () => renderEffect,
|
|
76
|
+
reportReactiveBinding: () => reportReactiveBinding,
|
|
77
|
+
reportReactiveContext: () => reportReactiveContext,
|
|
78
|
+
reportReactiveContextCreated: () => reportReactiveContextCreated,
|
|
79
|
+
reportReactiveDirective: () => reportReactiveDirective,
|
|
80
|
+
reportReactiveProps: () => reportReactiveProps,
|
|
81
|
+
reportResourceData: () => reportResourceData,
|
|
82
|
+
resource: () => resource,
|
|
83
|
+
root: () => root,
|
|
84
|
+
runWithOwner: () => runWithOwner,
|
|
85
|
+
setOwner: () => setOwner,
|
|
86
|
+
setResourceDataSink: () => setResourceDataSink,
|
|
87
|
+
setResourceIdSource: () => setResourceIdSource,
|
|
88
|
+
setResourceTracker: () => setResourceTracker,
|
|
89
|
+
setServerDataGetter: () => setServerDataGetter,
|
|
90
|
+
signal: () => signal,
|
|
91
|
+
startTransition: () => startTransition,
|
|
92
|
+
trackResourcePromise: () => trackResourcePromise,
|
|
93
|
+
untrack: () => untrack2,
|
|
94
|
+
useContext: () => useContext,
|
|
95
|
+
useTransition: () => useTransition
|
|
96
|
+
});
|
|
97
|
+
module.exports = __toCommonJS(index_exports);
|
|
98
|
+
|
|
99
|
+
// src/version.generated.ts
|
|
100
|
+
var VERSION = "1.0.0-alpha.84";
|
|
101
|
+
|
|
102
|
+
// src/lib/signal/graph/state.ts
|
|
103
|
+
var MAJOR = VERSION.split(".")[0];
|
|
104
|
+
var KEY = `__fluixi_signal_state_v${MAJOR}__`;
|
|
105
|
+
var VERSIONS_KEY = `__fluixi_signal_builds_v${MAJOR}__`;
|
|
106
|
+
var defaultSchedule = (run) => {
|
|
107
|
+
if (typeof queueMicrotask === "function") queueMicrotask(run);
|
|
108
|
+
else void Promise.resolve().then(run);
|
|
109
|
+
};
|
|
110
|
+
function defaults() {
|
|
111
|
+
return {
|
|
112
|
+
consumer: null,
|
|
113
|
+
untracked: false,
|
|
114
|
+
owner: null,
|
|
115
|
+
queue: [],
|
|
116
|
+
scheduled: false,
|
|
117
|
+
flushing: false,
|
|
118
|
+
batchDepth: 0,
|
|
119
|
+
hostSchedule: defaultSchedule,
|
|
120
|
+
onSuspend: null,
|
|
121
|
+
onError: null,
|
|
122
|
+
observer: null
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
var realm = globalThis;
|
|
126
|
+
function backfillState(existing) {
|
|
127
|
+
const fresh = defaults();
|
|
128
|
+
const target = existing;
|
|
129
|
+
for (const field of Object.keys(fresh)) {
|
|
130
|
+
if (!(field in existing)) target[field] = fresh[field];
|
|
131
|
+
}
|
|
132
|
+
return existing;
|
|
133
|
+
}
|
|
134
|
+
function claim() {
|
|
135
|
+
const existing = realm[KEY];
|
|
136
|
+
return existing ? backfillState(existing) : realm[KEY] = defaults();
|
|
137
|
+
}
|
|
138
|
+
var G = claim();
|
|
139
|
+
(realm[VERSIONS_KEY] ??= []).push(VERSION);
|
|
140
|
+
function joinedVersions() {
|
|
141
|
+
return [...new Set(realm[VERSIONS_KEY] ?? [])];
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
// src/lib/signal/graph/observe.ts
|
|
145
|
+
function observeReactiveNodes(next) {
|
|
146
|
+
G.observer = next;
|
|
147
|
+
return () => {
|
|
148
|
+
if (G.observer === next) G.observer = null;
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
var running = [];
|
|
152
|
+
var origin;
|
|
153
|
+
function reportReactiveNode(report) {
|
|
154
|
+
const observer = G.observer;
|
|
155
|
+
if (observer) {
|
|
156
|
+
observer.created(
|
|
157
|
+
report.parents === void 0 ? { ...report, parents: running, origin: report.origin ?? origin } : report
|
|
158
|
+
);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
function enterReactiveRun(node) {
|
|
162
|
+
if (!G.observer) return false;
|
|
163
|
+
running.push(node);
|
|
164
|
+
return true;
|
|
165
|
+
}
|
|
166
|
+
function exitReactiveRun() {
|
|
167
|
+
running.pop();
|
|
168
|
+
}
|
|
169
|
+
function reportReactiveRun(node) {
|
|
170
|
+
G.observer?.ran?.(node);
|
|
171
|
+
}
|
|
172
|
+
function reportReactiveWrite(node, by) {
|
|
173
|
+
G.observer?.wrote?.(node, by);
|
|
174
|
+
}
|
|
175
|
+
function reportReactiveBinding(target, kind, name, accessor) {
|
|
176
|
+
const observer = G.observer;
|
|
177
|
+
if (!observer?.bound || !running.length) return;
|
|
178
|
+
observer.bound(running[running.length - 1], target, kind, name, accessor);
|
|
179
|
+
}
|
|
180
|
+
function reportReactiveProps(props) {
|
|
181
|
+
const observer = G.observer;
|
|
182
|
+
if (!observer?.props || !running.length || !props) return;
|
|
183
|
+
observer.props(running[running.length - 1], props);
|
|
184
|
+
}
|
|
185
|
+
function reportReactiveDirective(target, kind, name, accessor) {
|
|
186
|
+
const observer = G.observer;
|
|
187
|
+
if (!observer?.directive || !running.length) return;
|
|
188
|
+
observer.directive(running[running.length - 1], target, kind, name, accessor);
|
|
189
|
+
}
|
|
190
|
+
function reportReactiveContextCreated(id) {
|
|
191
|
+
G.observer?.contextCreated?.(id);
|
|
192
|
+
}
|
|
193
|
+
function reportReactiveContext(id, kind, value) {
|
|
194
|
+
const observer = G.observer;
|
|
195
|
+
if (!observer?.context || !running.length) return;
|
|
196
|
+
observer.context(running[running.length - 1], id, kind, value);
|
|
197
|
+
}
|
|
198
|
+
function reportReactiveDispose(node) {
|
|
199
|
+
G.observer?.disposed?.(node);
|
|
200
|
+
}
|
|
201
|
+
var HOOK = "__FLUIXI_DEVTOOLS_HOOK__";
|
|
202
|
+
var hook = globalThis[HOOK];
|
|
203
|
+
if (typeof hook?.inject === "function") {
|
|
204
|
+
try {
|
|
205
|
+
hook.inject({ observeReactiveNodes, version: VERSION });
|
|
206
|
+
} catch {
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
function isObserved() {
|
|
210
|
+
return G.observer != null;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
// src/lib/signal/graph/core.ts
|
|
214
|
+
var CLEAN = 0;
|
|
215
|
+
var CHECK = 1;
|
|
216
|
+
var DIRTY = 2;
|
|
217
|
+
var Source = class {
|
|
218
|
+
constructor() {
|
|
219
|
+
/** Computeds, and watched leaves, that read this node. */
|
|
220
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
221
|
+
this.observers = null;
|
|
222
|
+
/** Watchers eagerly observing this node, which is how `runtime.ts` schedules effects. */
|
|
223
|
+
this.watchers = null;
|
|
224
|
+
/** Bumped whenever this node's value actually changes (equality-gated). */
|
|
225
|
+
this.version = 0;
|
|
226
|
+
}
|
|
227
|
+
/** Settle this node so a reader sees a current value/version. Overridden by Computed. */
|
|
228
|
+
updateIfNecessary() {
|
|
229
|
+
}
|
|
230
|
+
/** Link the current consumer (if any) as an observer of this node. */
|
|
231
|
+
track() {
|
|
232
|
+
if (G.untracked) return;
|
|
233
|
+
const consumer = G.consumer;
|
|
234
|
+
if (!consumer) return;
|
|
235
|
+
(this.observers ??= /* @__PURE__ */ new Set()).add(consumer);
|
|
236
|
+
(consumer.sources ??= /* @__PURE__ */ new Set()).add(this);
|
|
237
|
+
}
|
|
238
|
+
};
|
|
239
|
+
var State = class extends Source {
|
|
240
|
+
constructor(value, options) {
|
|
241
|
+
super();
|
|
242
|
+
this._value = value;
|
|
243
|
+
this._equals = options?.equals === false ? () => false : options?.equals ?? Object.is;
|
|
244
|
+
}
|
|
245
|
+
get() {
|
|
246
|
+
this.track();
|
|
247
|
+
return this._value;
|
|
248
|
+
}
|
|
249
|
+
set(next) {
|
|
250
|
+
if (this._equals(this._value, next)) return;
|
|
251
|
+
this._value = next;
|
|
252
|
+
this.version++;
|
|
253
|
+
reportReactiveWrite(this, G.consumer);
|
|
254
|
+
if (this.observers) for (const o of [...this.observers]) o.markDirty(DIRTY);
|
|
255
|
+
notifyWatchers(this);
|
|
256
|
+
}
|
|
257
|
+
/** Read without subscribing (peek). */
|
|
258
|
+
peek() {
|
|
259
|
+
return this._value;
|
|
260
|
+
}
|
|
261
|
+
};
|
|
262
|
+
var Computed = class extends Source {
|
|
263
|
+
constructor(fn, options) {
|
|
264
|
+
super();
|
|
265
|
+
this._threw = false;
|
|
266
|
+
this._initialized = false;
|
|
267
|
+
this.state = DIRTY;
|
|
268
|
+
/** Nodes this computation read on its last run. Rebuilt on every run. */
|
|
269
|
+
this.sources = null;
|
|
270
|
+
this._fn = fn;
|
|
271
|
+
this._equals = options?.equals === false ? () => false : options?.equals ?? Object.is;
|
|
272
|
+
}
|
|
273
|
+
get() {
|
|
274
|
+
if (G.consumer === this) {
|
|
275
|
+
throw new Error("Signal.Computed cannot read itself");
|
|
276
|
+
}
|
|
277
|
+
this.track();
|
|
278
|
+
this.updateIfNecessary();
|
|
279
|
+
if (this._threw) throw this._error;
|
|
280
|
+
return this._value;
|
|
281
|
+
}
|
|
282
|
+
/** Settle, if CHECK, verify sources; if DIRTY (or never run), recompute. */
|
|
283
|
+
updateIfNecessary() {
|
|
284
|
+
if (this.state === CHECK) {
|
|
285
|
+
if (this.sources) {
|
|
286
|
+
for (const s of this.sources) {
|
|
287
|
+
s.updateIfNecessary();
|
|
288
|
+
if (this.state === DIRTY) break;
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
if (this.state === DIRTY || !this._initialized) this.recompute();
|
|
293
|
+
this.state = CLEAN;
|
|
294
|
+
}
|
|
295
|
+
recompute() {
|
|
296
|
+
if (this.sources) {
|
|
297
|
+
for (const s of this.sources) s.observers?.delete(this);
|
|
298
|
+
this.sources.clear();
|
|
299
|
+
}
|
|
300
|
+
const prevConsumer = G.consumer;
|
|
301
|
+
const prevUntracked = G.untracked;
|
|
302
|
+
const watched = enterReactiveRun(this);
|
|
303
|
+
G.consumer = this;
|
|
304
|
+
G.untracked = false;
|
|
305
|
+
let next;
|
|
306
|
+
let threw = false;
|
|
307
|
+
let err;
|
|
308
|
+
try {
|
|
309
|
+
next = this._fn();
|
|
310
|
+
} catch (e) {
|
|
311
|
+
threw = true;
|
|
312
|
+
err = e;
|
|
313
|
+
next = this._value;
|
|
314
|
+
} finally {
|
|
315
|
+
G.consumer = prevConsumer;
|
|
316
|
+
G.untracked = prevUntracked;
|
|
317
|
+
if (watched) exitReactiveRun();
|
|
318
|
+
}
|
|
319
|
+
const changed = !this._initialized || this._threw !== threw || (threw ? err !== this._error : !this._equals(this._value, next));
|
|
320
|
+
this._initialized = true;
|
|
321
|
+
this._threw = threw;
|
|
322
|
+
this._error = err;
|
|
323
|
+
this._value = next;
|
|
324
|
+
reportReactiveRun(this);
|
|
325
|
+
if (changed) {
|
|
326
|
+
this.version++;
|
|
327
|
+
if (this.observers) for (const o of [...this.observers]) o.markDirty(DIRTY);
|
|
328
|
+
notifyWatchers(this);
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
/**
|
|
332
|
+
* Push a maybe-dirty mark. A direct observer of a changed node gets DIRTY; its
|
|
333
|
+
* own observers get CHECK (recurse), stopping where already marked, so the
|
|
334
|
+
* push is O(newly-dirtied) and never recomputes.
|
|
335
|
+
*/
|
|
336
|
+
markDirty(level) {
|
|
337
|
+
if (this.state >= level) return;
|
|
338
|
+
const wasClean = this.state === CLEAN;
|
|
339
|
+
this.state = level;
|
|
340
|
+
if (wasClean) {
|
|
341
|
+
if (this.observers) for (const o of [...this.observers]) o.markDirty(CHECK);
|
|
342
|
+
notifyWatchers(this);
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
peek() {
|
|
346
|
+
this.updateIfNecessary();
|
|
347
|
+
if (this._threw) throw this._error;
|
|
348
|
+
return this._value;
|
|
349
|
+
}
|
|
350
|
+
};
|
|
351
|
+
function notifyWatchers(node) {
|
|
352
|
+
if (!node.watchers) return;
|
|
353
|
+
for (const w of [...node.watchers]) w._notify(node);
|
|
354
|
+
}
|
|
355
|
+
var Watcher = class {
|
|
356
|
+
constructor(notify) {
|
|
357
|
+
this._watched = /* @__PURE__ */ new Set();
|
|
358
|
+
this._pending = /* @__PURE__ */ new Set();
|
|
359
|
+
this._notifyFn = notify;
|
|
360
|
+
}
|
|
361
|
+
watch(...nodes) {
|
|
362
|
+
for (const n of nodes) {
|
|
363
|
+
this._watched.add(n);
|
|
364
|
+
(n.watchers ??= /* @__PURE__ */ new Set()).add(this);
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
unwatch(...nodes) {
|
|
368
|
+
for (const n of nodes) {
|
|
369
|
+
this._watched.delete(n);
|
|
370
|
+
n.watchers?.delete(this);
|
|
371
|
+
this._pending.delete(n);
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
/** Watched nodes that may have changed since the last getPending(). */
|
|
375
|
+
getPending() {
|
|
376
|
+
const out = [...this._pending];
|
|
377
|
+
this._pending.clear();
|
|
378
|
+
return out;
|
|
379
|
+
}
|
|
380
|
+
/** @internal, a watched node became non-clean. Edge-triggered: notify once. */
|
|
381
|
+
_notify(node) {
|
|
382
|
+
if (!this._watched.has(node) || this._pending.has(node)) return;
|
|
383
|
+
const wasEmpty = this._pending.size === 0;
|
|
384
|
+
this._pending.add(node);
|
|
385
|
+
if (wasEmpty) this._notifyFn();
|
|
386
|
+
}
|
|
387
|
+
};
|
|
388
|
+
function untrack(fn) {
|
|
389
|
+
if (G.untracked) return fn();
|
|
390
|
+
G.untracked = true;
|
|
391
|
+
try {
|
|
392
|
+
return fn();
|
|
393
|
+
} finally {
|
|
394
|
+
G.untracked = false;
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
function currentComputed() {
|
|
398
|
+
return G.consumer;
|
|
399
|
+
}
|
|
400
|
+
function hasSinks(node) {
|
|
401
|
+
return !!(node.observers && node.observers.size) || !!(node.watchers && node.watchers.size);
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
// src/lib/signal/graph/runtime.ts
|
|
405
|
+
function createChildOwner(parent) {
|
|
406
|
+
const owner = makeOwner(parent);
|
|
407
|
+
if (parent) (parent.owned ??= []).push(owner);
|
|
408
|
+
return owner;
|
|
409
|
+
}
|
|
410
|
+
function disposeScope(owner, final = true) {
|
|
411
|
+
disposeOwner(owner, final);
|
|
412
|
+
}
|
|
413
|
+
function isOwnerDisposed(owner) {
|
|
414
|
+
return !!owner && owner.disposed === true;
|
|
415
|
+
}
|
|
416
|
+
function makeOwner(parent) {
|
|
417
|
+
return { cleanups: null, owned: null, parent, contexts: null };
|
|
418
|
+
}
|
|
419
|
+
function createContext(defaultValue, name) {
|
|
420
|
+
const id = Symbol(name ?? "context");
|
|
421
|
+
reportReactiveContextCreated(id);
|
|
422
|
+
const Provider = (props) => {
|
|
423
|
+
reportReactiveContext(id, "provide", props.value);
|
|
424
|
+
const parent = G.owner;
|
|
425
|
+
const owner = makeOwner(parent);
|
|
426
|
+
(owner.contexts = /* @__PURE__ */ new Map()).set(id, props.value);
|
|
427
|
+
if (parent) (parent.owned ??= []).push(owner);
|
|
428
|
+
G.owner = owner;
|
|
429
|
+
try {
|
|
430
|
+
return props.children;
|
|
431
|
+
} finally {
|
|
432
|
+
G.owner = parent;
|
|
433
|
+
}
|
|
434
|
+
};
|
|
435
|
+
return { id, defaultValue, Provider };
|
|
436
|
+
}
|
|
437
|
+
function useContext(context2) {
|
|
438
|
+
let o = G.owner;
|
|
439
|
+
while (o) {
|
|
440
|
+
if (o.contexts && o.contexts.has(context2.id)) {
|
|
441
|
+
const found = o.contexts.get(context2.id);
|
|
442
|
+
reportReactiveContext(context2.id, "read", found);
|
|
443
|
+
return found;
|
|
444
|
+
}
|
|
445
|
+
o = o.parent;
|
|
446
|
+
}
|
|
447
|
+
reportReactiveContext(context2.id, "read", context2.defaultValue);
|
|
448
|
+
return context2.defaultValue;
|
|
449
|
+
}
|
|
450
|
+
function readContextFrom(owner, context2) {
|
|
451
|
+
let o = owner;
|
|
452
|
+
while (o) {
|
|
453
|
+
if (o.contexts && o.contexts.has(context2.id)) return o.contexts.get(context2.id);
|
|
454
|
+
o = o.parent;
|
|
455
|
+
}
|
|
456
|
+
return context2.defaultValue;
|
|
457
|
+
}
|
|
458
|
+
function provide(context2, value, fn) {
|
|
459
|
+
const owner = makeOwner(G.owner);
|
|
460
|
+
(owner.contexts = /* @__PURE__ */ new Map()).set(context2.id, value);
|
|
461
|
+
if (G.owner) (G.owner.owned ??= []).push(owner);
|
|
462
|
+
const prev = G.owner;
|
|
463
|
+
G.owner = owner;
|
|
464
|
+
try {
|
|
465
|
+
return fn();
|
|
466
|
+
} finally {
|
|
467
|
+
G.owner = prev;
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
function setSuspendHandler(fn) {
|
|
471
|
+
G.onSuspend = fn;
|
|
472
|
+
}
|
|
473
|
+
function reportSuspend(promise) {
|
|
474
|
+
if (G.onSuspend) {
|
|
475
|
+
G.onSuspend(promise, G.owner);
|
|
476
|
+
return true;
|
|
477
|
+
}
|
|
478
|
+
return false;
|
|
479
|
+
}
|
|
480
|
+
function setErrorHandler(fn) {
|
|
481
|
+
G.onError = fn;
|
|
482
|
+
}
|
|
483
|
+
function getOwner() {
|
|
484
|
+
return G.owner;
|
|
485
|
+
}
|
|
486
|
+
function setOwner(owner) {
|
|
487
|
+
const prev = G.owner;
|
|
488
|
+
G.owner = owner;
|
|
489
|
+
return prev;
|
|
490
|
+
}
|
|
491
|
+
function runWithOwner(owner, fn) {
|
|
492
|
+
const prev = G.owner;
|
|
493
|
+
G.owner = owner;
|
|
494
|
+
try {
|
|
495
|
+
return fn();
|
|
496
|
+
} finally {
|
|
497
|
+
G.owner = prev;
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
function onCleanup(fn) {
|
|
501
|
+
if (!G.owner) return;
|
|
502
|
+
if (G.owner.disposed) {
|
|
503
|
+
fn();
|
|
504
|
+
return;
|
|
505
|
+
}
|
|
506
|
+
(G.owner.cleanups ??= []).push(fn);
|
|
507
|
+
}
|
|
508
|
+
function disposeOwner(owner, final = true) {
|
|
509
|
+
if (owner.disposed) return;
|
|
510
|
+
if (owner.owned) {
|
|
511
|
+
for (let i = owner.owned.length - 1; i >= 0; i--) disposeOwner(owner.owned[i]);
|
|
512
|
+
owner.owned = null;
|
|
513
|
+
}
|
|
514
|
+
if (owner.cleanups) {
|
|
515
|
+
for (let i = owner.cleanups.length - 1; i >= 0; i--) owner.cleanups[i]();
|
|
516
|
+
owner.cleanups = null;
|
|
517
|
+
}
|
|
518
|
+
if (final) owner.disposed = true;
|
|
519
|
+
}
|
|
520
|
+
function createRoot(fn) {
|
|
521
|
+
const owner = makeOwner(G.owner);
|
|
522
|
+
if (G.owner) (G.owner.owned ??= []).push(owner);
|
|
523
|
+
const prev = G.owner;
|
|
524
|
+
G.owner = owner;
|
|
525
|
+
try {
|
|
526
|
+
return fn(() => disposeOwner(owner));
|
|
527
|
+
} finally {
|
|
528
|
+
G.owner = prev;
|
|
529
|
+
}
|
|
530
|
+
}
|
|
531
|
+
function setScheduler(fn) {
|
|
532
|
+
G.hostSchedule = fn ?? ((run) => void Promise.resolve().then(run));
|
|
533
|
+
}
|
|
534
|
+
function enqueue(e) {
|
|
535
|
+
if (e.queued) return;
|
|
536
|
+
e.queued = true;
|
|
537
|
+
G.queue.push(e);
|
|
538
|
+
if (!G.scheduled && G.batchDepth === 0) {
|
|
539
|
+
G.scheduled = true;
|
|
540
|
+
G.hostSchedule(flushSync);
|
|
541
|
+
}
|
|
542
|
+
}
|
|
543
|
+
function flushSync() {
|
|
544
|
+
G.scheduled = false;
|
|
545
|
+
if (G.flushing) return;
|
|
546
|
+
G.flushing = true;
|
|
547
|
+
let guard = 0;
|
|
548
|
+
try {
|
|
549
|
+
while (G.queue.length) {
|
|
550
|
+
if (++guard > 1e5) throw new Error("[fluixi] effect flush did not settle (cycle?)");
|
|
551
|
+
const batchOf = G.queue;
|
|
552
|
+
G.queue = [];
|
|
553
|
+
for (const e of batchOf) {
|
|
554
|
+
e.queued = false;
|
|
555
|
+
if (!e.disposed) e.run();
|
|
556
|
+
}
|
|
557
|
+
}
|
|
558
|
+
} finally {
|
|
559
|
+
G.flushing = false;
|
|
560
|
+
}
|
|
561
|
+
}
|
|
562
|
+
function afterWrite() {
|
|
563
|
+
if (G.batchDepth === 0) flushSync();
|
|
564
|
+
}
|
|
565
|
+
function batch(fn) {
|
|
566
|
+
G.batchDepth++;
|
|
567
|
+
try {
|
|
568
|
+
return fn();
|
|
569
|
+
} finally {
|
|
570
|
+
if (--G.batchDepth === 0) flushSync();
|
|
571
|
+
}
|
|
572
|
+
}
|
|
573
|
+
var EffectNode = class {
|
|
574
|
+
constructor(fn, report = false) {
|
|
575
|
+
this.queued = false;
|
|
576
|
+
this.disposed = false;
|
|
577
|
+
this.owner = makeOwner(G.owner);
|
|
578
|
+
if (G.owner) (G.owner.cleanups ??= []).push(() => this.dispose());
|
|
579
|
+
this.computed = new Computed(() => {
|
|
580
|
+
disposeOwner(this.owner, false);
|
|
581
|
+
runWithOwner(this.owner, () => {
|
|
582
|
+
const r = fn();
|
|
583
|
+
if (typeof r === "function") (this.owner.cleanups ??= []).push(r);
|
|
584
|
+
});
|
|
585
|
+
});
|
|
586
|
+
reportReactiveNode({ kind: "effect", node: this.computed, handle: this, internal: !report });
|
|
587
|
+
this.watcher = new Watcher(() => enqueue(this));
|
|
588
|
+
this.run();
|
|
589
|
+
this.watcher.watch(this.computed);
|
|
590
|
+
}
|
|
591
|
+
run() {
|
|
592
|
+
if (this.disposed) return;
|
|
593
|
+
this.watcher.getPending();
|
|
594
|
+
try {
|
|
595
|
+
this.computed.get();
|
|
596
|
+
} catch (e) {
|
|
597
|
+
if (e && typeof e.then === "function" && G.onSuspend) {
|
|
598
|
+
G.onSuspend(e, this.owner);
|
|
599
|
+
return;
|
|
600
|
+
}
|
|
601
|
+
if (G.onError && G.onError(e, this.owner)) return;
|
|
602
|
+
throw e;
|
|
603
|
+
}
|
|
604
|
+
}
|
|
605
|
+
dispose() {
|
|
606
|
+
if (this.disposed) return;
|
|
607
|
+
this.disposed = true;
|
|
608
|
+
reportReactiveDispose(this.computed);
|
|
609
|
+
this.watcher.unwatch(this.computed);
|
|
610
|
+
disposeOwner(this.owner);
|
|
611
|
+
}
|
|
612
|
+
};
|
|
613
|
+
function effect(fn, report = false) {
|
|
614
|
+
const node = new EffectNode(fn, report);
|
|
615
|
+
return () => node.dispose();
|
|
616
|
+
}
|
|
617
|
+
|
|
618
|
+
// src/lib/signal/graph/compat.ts
|
|
619
|
+
function isThenable(v) {
|
|
620
|
+
return !!v && typeof v.then === "function";
|
|
621
|
+
}
|
|
622
|
+
setScheduler(() => {
|
|
623
|
+
});
|
|
624
|
+
var $SIGNAL = /* @__PURE__ */ Symbol.for("signal");
|
|
625
|
+
var $MEMO = /* @__PURE__ */ Symbol.for("memo");
|
|
626
|
+
var $NODE = /* @__PURE__ */ Symbol.for("signal-node");
|
|
627
|
+
function createSignal(value, options) {
|
|
628
|
+
const state = new State(value, { equals: options?.equals });
|
|
629
|
+
const read = (() => state.get());
|
|
630
|
+
const write = ((next) => {
|
|
631
|
+
const v = typeof next === "function" ? next(state.peek()) : next;
|
|
632
|
+
state.set(v);
|
|
633
|
+
afterWrite();
|
|
634
|
+
return v;
|
|
635
|
+
});
|
|
636
|
+
Object.defineProperty(read, $SIGNAL, { value: true, enumerable: true });
|
|
637
|
+
Object.defineProperty(read, $NODE, {
|
|
638
|
+
value: {
|
|
639
|
+
get value() {
|
|
640
|
+
return state.peek();
|
|
641
|
+
},
|
|
642
|
+
get version() {
|
|
643
|
+
return state.version;
|
|
644
|
+
}
|
|
645
|
+
},
|
|
646
|
+
enumerable: false
|
|
647
|
+
});
|
|
648
|
+
reportReactiveNode({
|
|
649
|
+
kind: "signal",
|
|
650
|
+
node: state,
|
|
651
|
+
handle: read,
|
|
652
|
+
name: options?.name,
|
|
653
|
+
set: write
|
|
654
|
+
});
|
|
655
|
+
if (isObserved()) onCleanup(() => reportReactiveDispose(state));
|
|
656
|
+
return [read, write];
|
|
657
|
+
}
|
|
658
|
+
function createMemo(fn, value, options) {
|
|
659
|
+
let prev = value;
|
|
660
|
+
const owner = getOwner();
|
|
661
|
+
const c = new Computed(
|
|
662
|
+
() => runWithOwner(owner, () => {
|
|
663
|
+
try {
|
|
664
|
+
return prev = fn(prev);
|
|
665
|
+
} catch (e) {
|
|
666
|
+
if (isThenable(e)) {
|
|
667
|
+
reportSuspend(e);
|
|
668
|
+
return prev;
|
|
669
|
+
}
|
|
670
|
+
throw e;
|
|
671
|
+
}
|
|
672
|
+
}),
|
|
673
|
+
{ equals: options?.equals }
|
|
674
|
+
);
|
|
675
|
+
const read = (() => c.get());
|
|
676
|
+
Object.defineProperty(read, $SIGNAL, { value: true, enumerable: true });
|
|
677
|
+
Object.defineProperty(read, $MEMO, { value: true, enumerable: true });
|
|
678
|
+
reportReactiveNode({ kind: "memo", node: c, handle: read, name: options?.name });
|
|
679
|
+
if (isObserved()) onCleanup(() => reportReactiveDispose(c));
|
|
680
|
+
return read;
|
|
681
|
+
}
|
|
682
|
+
function createEffect(fn, value) {
|
|
683
|
+
let prev = value;
|
|
684
|
+
return effect(() => {
|
|
685
|
+
const r = fn(prev);
|
|
686
|
+
prev = r;
|
|
687
|
+
}, true);
|
|
688
|
+
}
|
|
689
|
+
function createComputed(fn, value) {
|
|
690
|
+
let prev = value;
|
|
691
|
+
effect(() => {
|
|
692
|
+
prev = fn(prev);
|
|
693
|
+
});
|
|
694
|
+
}
|
|
695
|
+
function createRenderEffect(fn, value) {
|
|
696
|
+
let prev = value;
|
|
697
|
+
return effect(() => {
|
|
698
|
+
prev = fn(prev);
|
|
699
|
+
});
|
|
700
|
+
}
|
|
701
|
+
function batch2(fn) {
|
|
702
|
+
return batch(fn);
|
|
703
|
+
}
|
|
704
|
+
function untrack2(fn) {
|
|
705
|
+
return untrack(fn);
|
|
706
|
+
}
|
|
707
|
+
function startTransition(fn) {
|
|
708
|
+
batch(fn);
|
|
709
|
+
return Promise.resolve();
|
|
710
|
+
}
|
|
711
|
+
function useTransition() {
|
|
712
|
+
return [() => false, startTransition];
|
|
713
|
+
}
|
|
714
|
+
function flush() {
|
|
715
|
+
flushSync();
|
|
716
|
+
return Promise.resolve();
|
|
717
|
+
}
|
|
718
|
+
function on(deps, fn, options) {
|
|
719
|
+
const isArray = Array.isArray(deps);
|
|
720
|
+
let prevValue;
|
|
721
|
+
let defer = options?.defer ?? false;
|
|
722
|
+
return (prevResult) => {
|
|
723
|
+
const value = isArray ? deps.map((d) => d()) : deps();
|
|
724
|
+
if (defer) {
|
|
725
|
+
defer = false;
|
|
726
|
+
prevValue = value;
|
|
727
|
+
return void 0;
|
|
728
|
+
}
|
|
729
|
+
const result = untrack(() => fn(value, prevValue, prevResult));
|
|
730
|
+
prevValue = value;
|
|
731
|
+
return result;
|
|
732
|
+
};
|
|
733
|
+
}
|
|
734
|
+
|
|
735
|
+
// src/lib/signal/list.ts
|
|
736
|
+
function mapArray(list, mapFn, options) {
|
|
737
|
+
let items = [];
|
|
738
|
+
onCleanup(() => {
|
|
739
|
+
for (const e of items) e.dispose();
|
|
740
|
+
items = [];
|
|
741
|
+
});
|
|
742
|
+
return createMemo(() => {
|
|
743
|
+
const next = list() || [];
|
|
744
|
+
return untrack2(() => {
|
|
745
|
+
if (next.length === 0) {
|
|
746
|
+
for (const e of items) e.dispose();
|
|
747
|
+
items = [];
|
|
748
|
+
return options?.fallback ? options.fallback() : [];
|
|
749
|
+
}
|
|
750
|
+
const prevByItem = /* @__PURE__ */ new Map();
|
|
751
|
+
for (const e of items) if (!prevByItem.has(e.item)) prevByItem.set(e.item, e);
|
|
752
|
+
const result = [];
|
|
753
|
+
const used = /* @__PURE__ */ new Set();
|
|
754
|
+
for (let i = 0; i < next.length; i++) {
|
|
755
|
+
const value = next[i];
|
|
756
|
+
const reuse = prevByItem.get(value);
|
|
757
|
+
if (reuse && !used.has(reuse)) {
|
|
758
|
+
reuse.setIndex(i);
|
|
759
|
+
result.push(reuse);
|
|
760
|
+
used.add(reuse);
|
|
761
|
+
} else {
|
|
762
|
+
let rendered, setIndex, dispose;
|
|
763
|
+
createRoot((d) => {
|
|
764
|
+
dispose = d;
|
|
765
|
+
const [index, setIdx] = createSignal(i, { name: "row index" });
|
|
766
|
+
setIndex = setIdx;
|
|
767
|
+
rendered = mapFn(value, index);
|
|
768
|
+
});
|
|
769
|
+
const entry = { item: value, rendered, dispose, setIndex };
|
|
770
|
+
result.push(entry);
|
|
771
|
+
used.add(entry);
|
|
772
|
+
}
|
|
773
|
+
}
|
|
774
|
+
for (const e of items) if (!used.has(e)) e.dispose();
|
|
775
|
+
items = result;
|
|
776
|
+
return result.map((e) => e.rendered);
|
|
777
|
+
});
|
|
778
|
+
}, void 0, { name: "mapArray" });
|
|
779
|
+
}
|
|
780
|
+
function keyArray(list, keyFn, mapFn, options) {
|
|
781
|
+
let keys = [];
|
|
782
|
+
let entries = [];
|
|
783
|
+
onCleanup(() => {
|
|
784
|
+
for (const e of entries) e.dispose();
|
|
785
|
+
keys = [];
|
|
786
|
+
entries = [];
|
|
787
|
+
});
|
|
788
|
+
return createMemo(() => {
|
|
789
|
+
const next = list() || [];
|
|
790
|
+
return untrack2(() => {
|
|
791
|
+
if (next.length === 0) {
|
|
792
|
+
for (const e of entries) e.dispose();
|
|
793
|
+
keys = [];
|
|
794
|
+
entries = [];
|
|
795
|
+
return options?.fallback ? options.fallback() : [];
|
|
796
|
+
}
|
|
797
|
+
const prevByKey = /* @__PURE__ */ new Map();
|
|
798
|
+
for (let i = 0; i < keys.length; i++) prevByKey.set(keys[i], entries[i]);
|
|
799
|
+
const resultEntries = [];
|
|
800
|
+
const resultKeys = [];
|
|
801
|
+
const usedKeys = /* @__PURE__ */ new Set();
|
|
802
|
+
for (let i = 0; i < next.length; i++) {
|
|
803
|
+
const key = keyFn(next[i]);
|
|
804
|
+
const reuse = prevByKey.get(key);
|
|
805
|
+
if (reuse && !usedKeys.has(key)) {
|
|
806
|
+
reuse.setIndex(i);
|
|
807
|
+
resultEntries.push(reuse);
|
|
808
|
+
} else {
|
|
809
|
+
let rendered, setIndex, dispose;
|
|
810
|
+
createRoot((d) => {
|
|
811
|
+
dispose = d;
|
|
812
|
+
const [index, setIdx] = createSignal(i, { name: "row index" });
|
|
813
|
+
setIndex = setIdx;
|
|
814
|
+
const item = createMemo((prev) => {
|
|
815
|
+
const cur = list() || [];
|
|
816
|
+
const v = cur[index()];
|
|
817
|
+
return v !== void 0 && v !== null ? v : prev;
|
|
818
|
+
}, next[i]);
|
|
819
|
+
rendered = mapFn(item, index);
|
|
820
|
+
});
|
|
821
|
+
resultEntries.push({ rendered, dispose, setIndex });
|
|
822
|
+
}
|
|
823
|
+
resultKeys.push(key);
|
|
824
|
+
usedKeys.add(key);
|
|
825
|
+
}
|
|
826
|
+
for (const [key, e] of prevByKey) if (!usedKeys.has(key)) e.dispose();
|
|
827
|
+
keys = resultKeys;
|
|
828
|
+
entries = resultEntries;
|
|
829
|
+
return resultEntries.map((e) => e.rendered);
|
|
830
|
+
});
|
|
831
|
+
}, void 0, { name: "keyArray" });
|
|
832
|
+
}
|
|
833
|
+
function indexArray(list, mapFn, options) {
|
|
834
|
+
let slots = [];
|
|
835
|
+
onCleanup(() => {
|
|
836
|
+
for (const s of slots) s.dispose();
|
|
837
|
+
slots = [];
|
|
838
|
+
});
|
|
839
|
+
return createMemo(() => {
|
|
840
|
+
const next = list() || [];
|
|
841
|
+
return untrack2(() => {
|
|
842
|
+
if (next.length === 0) {
|
|
843
|
+
for (const s of slots) s.dispose();
|
|
844
|
+
slots = [];
|
|
845
|
+
return options?.fallback ? options.fallback() : [];
|
|
846
|
+
}
|
|
847
|
+
const prevLen = slots.length;
|
|
848
|
+
const nextLen = next.length;
|
|
849
|
+
for (let i = prevLen; i < nextLen; i++) {
|
|
850
|
+
let rendered, setItem, dispose;
|
|
851
|
+
const value = next[i];
|
|
852
|
+
createRoot((d) => {
|
|
853
|
+
dispose = d;
|
|
854
|
+
const [item, setVal] = createSignal(value);
|
|
855
|
+
setItem = setVal;
|
|
856
|
+
rendered = mapFn(item, i);
|
|
857
|
+
});
|
|
858
|
+
slots.push({ rendered, setItem, dispose });
|
|
859
|
+
}
|
|
860
|
+
for (let i = nextLen; i < prevLen; i++) slots[i].dispose();
|
|
861
|
+
if (nextLen < prevLen) slots = slots.slice(0, nextLen);
|
|
862
|
+
const survive = Math.min(prevLen, nextLen);
|
|
863
|
+
for (let i = 0; i < survive; i++) slots[i].setItem(next[i]);
|
|
864
|
+
return slots.map((s) => s.rendered);
|
|
865
|
+
});
|
|
866
|
+
}, void 0, { name: "indexArray" });
|
|
867
|
+
}
|
|
868
|
+
|
|
869
|
+
// src/lib/signal/graph/detect.ts
|
|
870
|
+
var __BROWSER_PROD__ = typeof window === "undefined" ? false : window.__FLUIXI_PROD__ === true;
|
|
871
|
+
var __DEV__ = typeof process === "undefined" ? __BROWSER_PROD__ : false;
|
|
872
|
+
var $SIGNAL2 = /* @__PURE__ */ Symbol.for("signal");
|
|
873
|
+
var $MEMO2 = /* @__PURE__ */ Symbol.for("memo");
|
|
874
|
+
var $RESOURCE = /* @__PURE__ */ Symbol.for("resource");
|
|
875
|
+
function isSignal(value) {
|
|
876
|
+
return typeof value === "function" && value[$SIGNAL2] === true;
|
|
877
|
+
}
|
|
878
|
+
function isMemo(value) {
|
|
879
|
+
return typeof value === "function" && value[$MEMO2] === true;
|
|
880
|
+
}
|
|
881
|
+
function isResource(value) {
|
|
882
|
+
return typeof value === "function" && value[$RESOURCE] === true;
|
|
883
|
+
}
|
|
884
|
+
function isComponent(value) {
|
|
885
|
+
return typeof value === "function" && value[/* @__PURE__ */ Symbol.for("fluixi-component")] === true;
|
|
886
|
+
}
|
|
887
|
+
function isSuspense(value) {
|
|
888
|
+
return typeof value === "function" && value[/* @__PURE__ */ Symbol.for("fluixi-suspense")] === true;
|
|
889
|
+
}
|
|
890
|
+
function isProvider(value) {
|
|
891
|
+
return typeof value === "function" && value[/* @__PURE__ */ Symbol.for("fluixi-provider")] === true;
|
|
892
|
+
}
|
|
893
|
+
function makeArrayFlat(values) {
|
|
894
|
+
if (!Array.isArray(values)) return values;
|
|
895
|
+
if (values.length === 2 && values[1] === " ") {
|
|
896
|
+
if (Array.isArray(values[0])) return makeArrayFlat(values[0]);
|
|
897
|
+
if (typeof values[0] === "function") return values[0];
|
|
898
|
+
return values[0];
|
|
899
|
+
}
|
|
900
|
+
if (values.length === 1 && typeof values[0] === "function") return values[0];
|
|
901
|
+
return values;
|
|
902
|
+
}
|
|
903
|
+
|
|
904
|
+
// src/lib/signal/graph/ssr-hooks.ts
|
|
905
|
+
var _resourceTracker = null;
|
|
906
|
+
function setResourceTracker(fn) {
|
|
907
|
+
_resourceTracker = fn;
|
|
908
|
+
}
|
|
909
|
+
function trackResourcePromise(p) {
|
|
910
|
+
if (_resourceTracker) _resourceTracker(p);
|
|
911
|
+
}
|
|
912
|
+
var _serverDataGetter = null;
|
|
913
|
+
function setServerDataGetter(fn) {
|
|
914
|
+
_serverDataGetter = fn;
|
|
915
|
+
}
|
|
916
|
+
function getServerData(id) {
|
|
917
|
+
return _serverDataGetter ? _serverDataGetter(id) : void 0;
|
|
918
|
+
}
|
|
919
|
+
var _resourceIdSource = null;
|
|
920
|
+
function setResourceIdSource(fn) {
|
|
921
|
+
_resourceIdSource = fn;
|
|
922
|
+
}
|
|
923
|
+
function nextResourceId() {
|
|
924
|
+
return _resourceIdSource ? _resourceIdSource() : void 0;
|
|
925
|
+
}
|
|
926
|
+
var _resourceDataSink = null;
|
|
927
|
+
function setResourceDataSink(fn) {
|
|
928
|
+
_resourceDataSink = fn;
|
|
929
|
+
}
|
|
930
|
+
function reportResourceData(id, value) {
|
|
931
|
+
if (_resourceDataSink) _resourceDataSink(id, value);
|
|
932
|
+
}
|
|
933
|
+
|
|
934
|
+
// src/lib/signal/graph/derived.ts
|
|
935
|
+
function createSelector(source, fn = (k, v) => k === v) {
|
|
936
|
+
const map = /* @__PURE__ */ new Map();
|
|
937
|
+
createEffect(() => {
|
|
938
|
+
const value = source();
|
|
939
|
+
for (const [key, signal2] of map) {
|
|
940
|
+
const [get, set] = signal2;
|
|
941
|
+
const match = fn(key, value);
|
|
942
|
+
if (get() !== match) set(match);
|
|
943
|
+
}
|
|
944
|
+
});
|
|
945
|
+
return (key) => {
|
|
946
|
+
let signal2 = map.get(key);
|
|
947
|
+
if (!signal2) {
|
|
948
|
+
const [get, set] = createSignal(false);
|
|
949
|
+
signal2 = [get, set];
|
|
950
|
+
map.set(key, signal2);
|
|
951
|
+
const value = source();
|
|
952
|
+
set(fn(key, value));
|
|
953
|
+
}
|
|
954
|
+
return signal2[0]();
|
|
955
|
+
};
|
|
956
|
+
}
|
|
957
|
+
function createDeferred(source, options) {
|
|
958
|
+
const [delayed, setDelayed] = createSignal(source(), options);
|
|
959
|
+
createEffect(() => {
|
|
960
|
+
const v = source();
|
|
961
|
+
if (options?.timeoutMs) setTimeout(() => setDelayed(() => v), options.timeoutMs);
|
|
962
|
+
else if (typeof requestIdleCallback === "function")
|
|
963
|
+
requestIdleCallback(() => setDelayed(() => v));
|
|
964
|
+
else Promise.resolve().then(() => setDelayed(() => v));
|
|
965
|
+
});
|
|
966
|
+
return delayed;
|
|
967
|
+
}
|
|
968
|
+
function createDebounce(fn, delay) {
|
|
969
|
+
let timer;
|
|
970
|
+
const debounced = (...args) => {
|
|
971
|
+
if (timer !== void 0) clearTimeout(timer);
|
|
972
|
+
timer = setTimeout(() => {
|
|
973
|
+
timer = void 0;
|
|
974
|
+
fn(...args);
|
|
975
|
+
}, delay);
|
|
976
|
+
};
|
|
977
|
+
onCleanup(() => {
|
|
978
|
+
if (timer !== void 0) clearTimeout(timer);
|
|
979
|
+
});
|
|
980
|
+
return debounced;
|
|
981
|
+
}
|
|
982
|
+
|
|
983
|
+
// src/lib/signal/graph/resource.ts
|
|
984
|
+
function isPromise(v) {
|
|
985
|
+
return !!v && typeof v.then === "function";
|
|
986
|
+
}
|
|
987
|
+
var UNSET = /* @__PURE__ */ Symbol();
|
|
988
|
+
function createResource(source, fetcherFn, options = {}) {
|
|
989
|
+
let s;
|
|
990
|
+
let fetcher;
|
|
991
|
+
if (typeof fetcherFn === "function") {
|
|
992
|
+
s = typeof source === "function" ? source : () => source;
|
|
993
|
+
fetcher = fetcherFn;
|
|
994
|
+
} else {
|
|
995
|
+
s = () => true;
|
|
996
|
+
fetcher = source;
|
|
997
|
+
if (fetcherFn && typeof fetcherFn === "object") options = fetcherFn;
|
|
998
|
+
}
|
|
999
|
+
const ssrId = options.transport === false ? void 0 : nextResourceId();
|
|
1000
|
+
const seed = ssrId !== void 0 ? getServerData(ssrId) : void 0;
|
|
1001
|
+
let skipFirstFetch = seed !== void 0;
|
|
1002
|
+
const [value, setValue] = createSignal(
|
|
1003
|
+
seed !== void 0 ? seed.value : options.initialValue,
|
|
1004
|
+
{ equals: false }
|
|
1005
|
+
);
|
|
1006
|
+
const [error, setError] = createSignal(void 0, { equals: false });
|
|
1007
|
+
const [state, setState] = createSignal(
|
|
1008
|
+
seed !== void 0 || options.initialValue !== void 0 ? "ready" : "unresolved",
|
|
1009
|
+
{ equals: false }
|
|
1010
|
+
);
|
|
1011
|
+
const [promise, setPromise] = createSignal(void 0, { equals: false });
|
|
1012
|
+
const [track, trigger] = createSignal(void 0, { equals: false });
|
|
1013
|
+
let prevKey = UNSET;
|
|
1014
|
+
let manualRefetch = false;
|
|
1015
|
+
createEffect(() => {
|
|
1016
|
+
const val = s();
|
|
1017
|
+
track();
|
|
1018
|
+
if (val === false || val === null || val === void 0) {
|
|
1019
|
+
prevKey = UNSET;
|
|
1020
|
+
batch2(() => {
|
|
1021
|
+
setState("unresolved");
|
|
1022
|
+
setPromise(void 0);
|
|
1023
|
+
setError(void 0);
|
|
1024
|
+
});
|
|
1025
|
+
return;
|
|
1026
|
+
}
|
|
1027
|
+
const isManual = manualRefetch;
|
|
1028
|
+
manualRefetch = false;
|
|
1029
|
+
if (prevKey !== UNSET && val === prevKey && !isManual) return;
|
|
1030
|
+
prevKey = val;
|
|
1031
|
+
if (skipFirstFetch) {
|
|
1032
|
+
skipFirstFetch = false;
|
|
1033
|
+
return;
|
|
1034
|
+
}
|
|
1035
|
+
let cancelled = false;
|
|
1036
|
+
onCleanup(() => cancelled = true);
|
|
1037
|
+
const currentState = untrack2(state);
|
|
1038
|
+
const currentValue = untrack2(value);
|
|
1039
|
+
const isRefreshing = currentState === "ready" || currentState === "refreshing";
|
|
1040
|
+
batch2(() => {
|
|
1041
|
+
setState(isRefreshing ? "refreshing" : "pending");
|
|
1042
|
+
setError(void 0);
|
|
1043
|
+
});
|
|
1044
|
+
try {
|
|
1045
|
+
const res = fetcher(val, { value: currentValue, refetching: isRefreshing });
|
|
1046
|
+
if (isPromise(res)) {
|
|
1047
|
+
setPromise(res);
|
|
1048
|
+
trackResourcePromise(res);
|
|
1049
|
+
res.then(
|
|
1050
|
+
(v) => {
|
|
1051
|
+
if (cancelled) return;
|
|
1052
|
+
if (ssrId !== void 0) reportResourceData(ssrId, v);
|
|
1053
|
+
batch2(() => {
|
|
1054
|
+
setValue(() => v);
|
|
1055
|
+
setState("ready");
|
|
1056
|
+
setPromise(void 0);
|
|
1057
|
+
});
|
|
1058
|
+
},
|
|
1059
|
+
(e) => {
|
|
1060
|
+
if (cancelled) return;
|
|
1061
|
+
batch2(() => {
|
|
1062
|
+
setError(e);
|
|
1063
|
+
setState("errored");
|
|
1064
|
+
setPromise(void 0);
|
|
1065
|
+
});
|
|
1066
|
+
}
|
|
1067
|
+
);
|
|
1068
|
+
} else {
|
|
1069
|
+
batch2(() => {
|
|
1070
|
+
setValue(() => res);
|
|
1071
|
+
setState("ready");
|
|
1072
|
+
setPromise(void 0);
|
|
1073
|
+
});
|
|
1074
|
+
}
|
|
1075
|
+
} catch (e) {
|
|
1076
|
+
if (cancelled) return;
|
|
1077
|
+
batch2(() => {
|
|
1078
|
+
setError(e);
|
|
1079
|
+
setState("errored");
|
|
1080
|
+
setPromise(void 0);
|
|
1081
|
+
});
|
|
1082
|
+
}
|
|
1083
|
+
});
|
|
1084
|
+
const loading = () => {
|
|
1085
|
+
const st = state();
|
|
1086
|
+
return st === "pending" || st === "refreshing";
|
|
1087
|
+
};
|
|
1088
|
+
const resource2 = (() => {
|
|
1089
|
+
const e = error();
|
|
1090
|
+
if (e) throw e;
|
|
1091
|
+
if (loading()) {
|
|
1092
|
+
const p = promise();
|
|
1093
|
+
if (p) throw p;
|
|
1094
|
+
}
|
|
1095
|
+
return value();
|
|
1096
|
+
});
|
|
1097
|
+
Object.defineProperties(resource2, {
|
|
1098
|
+
state: { get: state },
|
|
1099
|
+
loading: { get: loading },
|
|
1100
|
+
error: { get: error },
|
|
1101
|
+
latest: { get: value }
|
|
1102
|
+
});
|
|
1103
|
+
Object.defineProperty(resource2, /* @__PURE__ */ Symbol.for("resource"), { value: true, enumerable: true });
|
|
1104
|
+
Object.defineProperty(resource2, /* @__PURE__ */ Symbol.for("signal"), { value: true, enumerable: true });
|
|
1105
|
+
return [
|
|
1106
|
+
resource2,
|
|
1107
|
+
{
|
|
1108
|
+
mutate: setValue,
|
|
1109
|
+
refetch: () => {
|
|
1110
|
+
manualRefetch = true;
|
|
1111
|
+
trigger(void 0);
|
|
1112
|
+
}
|
|
1113
|
+
}
|
|
1114
|
+
];
|
|
1115
|
+
}
|
|
1116
|
+
|
|
1117
|
+
// src/lib/signal/graph/debounced.ts
|
|
1118
|
+
function createDebouncedSignal(initial, delay = 300) {
|
|
1119
|
+
const [immediate, setImmediate] = createSignal(initial);
|
|
1120
|
+
const [settled, setSettled] = createSignal(initial);
|
|
1121
|
+
const [pending, setPending] = createSignal(false);
|
|
1122
|
+
let timer;
|
|
1123
|
+
const clear = () => {
|
|
1124
|
+
if (timer === void 0) return;
|
|
1125
|
+
clearTimeout(timer);
|
|
1126
|
+
timer = void 0;
|
|
1127
|
+
};
|
|
1128
|
+
const settle = () => {
|
|
1129
|
+
clear();
|
|
1130
|
+
const value = untrack2(immediate);
|
|
1131
|
+
setSettled(() => value);
|
|
1132
|
+
setPending(false);
|
|
1133
|
+
return value;
|
|
1134
|
+
};
|
|
1135
|
+
const set = ((value) => {
|
|
1136
|
+
const next = typeof value === "function" ? value(untrack2(immediate)) : value;
|
|
1137
|
+
setImmediate(() => next);
|
|
1138
|
+
setPending(true);
|
|
1139
|
+
clear();
|
|
1140
|
+
timer = setTimeout(settle, delay);
|
|
1141
|
+
return next;
|
|
1142
|
+
});
|
|
1143
|
+
onCleanup(clear);
|
|
1144
|
+
return [settled, set, { immediate, pending, flush: settle, cancel: () => {
|
|
1145
|
+
clear();
|
|
1146
|
+
setPending(false);
|
|
1147
|
+
} }];
|
|
1148
|
+
}
|
|
1149
|
+
function meaningful(query) {
|
|
1150
|
+
return query !== void 0 && query !== null && query !== "";
|
|
1151
|
+
}
|
|
1152
|
+
function createDebouncedResource(initial, fetcher, options = {}) {
|
|
1153
|
+
const { delay = 300, initialValue, shouldFetch = meaningful } = options;
|
|
1154
|
+
const [query, setQuery, controls] = createDebouncedSignal(initial, delay);
|
|
1155
|
+
const source = () => shouldFetch(query()) ? query() : false;
|
|
1156
|
+
const [resource2, { refetch }] = createResource(
|
|
1157
|
+
source,
|
|
1158
|
+
fetcher,
|
|
1159
|
+
initialValue === void 0 ? {} : { initialValue }
|
|
1160
|
+
);
|
|
1161
|
+
return [resource2, { ...controls, query, setQuery, refetch }];
|
|
1162
|
+
}
|
|
1163
|
+
|
|
1164
|
+
// src/lib/signal/graph/children.ts
|
|
1165
|
+
function resolveChildrenValue(children) {
|
|
1166
|
+
if (typeof children === "function" && !children.length) {
|
|
1167
|
+
const result = children();
|
|
1168
|
+
if (isSignal(result)) return result;
|
|
1169
|
+
return resolveChildrenValue(result);
|
|
1170
|
+
}
|
|
1171
|
+
if (Array.isArray(children)) {
|
|
1172
|
+
const results = [];
|
|
1173
|
+
for (let i = 0; i < children.length; i++) {
|
|
1174
|
+
const result = resolveChildrenValue(children[i]);
|
|
1175
|
+
Array.isArray(result) ? results.push.apply(results, result) : results.push(result);
|
|
1176
|
+
}
|
|
1177
|
+
return results;
|
|
1178
|
+
}
|
|
1179
|
+
return children;
|
|
1180
|
+
}
|
|
1181
|
+
function readChildren(fn) {
|
|
1182
|
+
const children = createMemo(fn);
|
|
1183
|
+
return __DEV__ ? createMemo(() => resolveChildrenValue(children()), void 0, { name: "children" }) : createMemo(() => resolveChildrenValue(children()));
|
|
1184
|
+
}
|
|
1185
|
+
|
|
1186
|
+
// src/lib/signal/graph/suspense.ts
|
|
1187
|
+
var SuspenseContext = createContext();
|
|
1188
|
+
setSuspendHandler((promise, owner) => {
|
|
1189
|
+
const boundary = readContextFrom(owner, SuspenseContext);
|
|
1190
|
+
if (!boundary) return;
|
|
1191
|
+
boundary.increment();
|
|
1192
|
+
promise.finally(() => boundary.decrement());
|
|
1193
|
+
});
|
|
1194
|
+
function createSuspenseBoundary() {
|
|
1195
|
+
const [pending, setPending] = createSignal(0);
|
|
1196
|
+
let count = 0;
|
|
1197
|
+
return {
|
|
1198
|
+
increment: () => setPending(count += 1),
|
|
1199
|
+
decrement: () => setPending(count -= 1),
|
|
1200
|
+
inFallback: () => pending() > 0
|
|
1201
|
+
};
|
|
1202
|
+
}
|
|
1203
|
+
function provideSuspense(boundary, fn) {
|
|
1204
|
+
return provide(SuspenseContext, boundary, fn);
|
|
1205
|
+
}
|
|
1206
|
+
|
|
1207
|
+
// src/lib/signal/graph/error-boundary.ts
|
|
1208
|
+
var ErrorContext = createContext();
|
|
1209
|
+
setErrorHandler((error, owner) => {
|
|
1210
|
+
const boundary = readContextFrom(owner, ErrorContext);
|
|
1211
|
+
if (!boundary) return false;
|
|
1212
|
+
boundary.setError(error);
|
|
1213
|
+
return true;
|
|
1214
|
+
});
|
|
1215
|
+
function createErrorBoundary() {
|
|
1216
|
+
const [error, setError] = createSignal(void 0, { equals: false });
|
|
1217
|
+
const boundary = {
|
|
1218
|
+
error,
|
|
1219
|
+
reset: () => setError(() => void 0),
|
|
1220
|
+
setError: (e) => setError(() => e)
|
|
1221
|
+
};
|
|
1222
|
+
return boundary;
|
|
1223
|
+
}
|
|
1224
|
+
function provideErrorBoundary(boundary, fn) {
|
|
1225
|
+
return provide(ErrorContext, boundary, fn);
|
|
1226
|
+
}
|
|
1227
|
+
|
|
1228
|
+
// src/lib/signal/graph/index.ts
|
|
1229
|
+
var Signal = {
|
|
1230
|
+
State,
|
|
1231
|
+
Computed,
|
|
1232
|
+
subtle: {
|
|
1233
|
+
Watcher,
|
|
1234
|
+
untrack,
|
|
1235
|
+
currentComputed,
|
|
1236
|
+
hasSinks
|
|
1237
|
+
}
|
|
1238
|
+
};
|
|
1239
|
+
|
|
1240
|
+
// src/lib/signal/graph/signal-next.ts
|
|
1241
|
+
var $SIGNAL3 = /* @__PURE__ */ Symbol.for("signal");
|
|
1242
|
+
var $PROXY = /* @__PURE__ */ Symbol.for("fluixi-proxy");
|
|
1243
|
+
|
|
1244
|
+
// src/lib/signal/api.ts
|
|
1245
|
+
function signal(value, options) {
|
|
1246
|
+
const [read, write] = createSignal(value, options);
|
|
1247
|
+
return Object.assign(read, { set: write });
|
|
1248
|
+
}
|
|
1249
|
+
function memo(fn, value, options) {
|
|
1250
|
+
return createMemo(fn, value, options);
|
|
1251
|
+
}
|
|
1252
|
+
function effect2(fn, value) {
|
|
1253
|
+
return createEffect(fn, value);
|
|
1254
|
+
}
|
|
1255
|
+
function root(fn) {
|
|
1256
|
+
return createRoot(fn);
|
|
1257
|
+
}
|
|
1258
|
+
function renderEffect(fn, value) {
|
|
1259
|
+
return createRenderEffect(fn, value);
|
|
1260
|
+
}
|
|
1261
|
+
function computed(fn, value) {
|
|
1262
|
+
createComputed(fn, value);
|
|
1263
|
+
}
|
|
1264
|
+
function context(defaultValue, name) {
|
|
1265
|
+
return createContext(defaultValue, name);
|
|
1266
|
+
}
|
|
1267
|
+
function childOwner(parent) {
|
|
1268
|
+
return createChildOwner(parent);
|
|
1269
|
+
}
|
|
1270
|
+
|
|
1271
|
+
// src/lib/signal/resource-api.ts
|
|
1272
|
+
function resource(...args) {
|
|
1273
|
+
const [read, actions] = createResource(...args);
|
|
1274
|
+
return Object.assign(read, actions);
|
|
1275
|
+
}
|