@but212/atom-effect 0.14.0 → 0.15.0
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/README.md +7 -7
- package/dist/atom-effect.min.js +1 -1
- package/dist/atom-effect.min.js.map +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +11 -34
- package/dist/index.mjs +399 -366
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const ce={ONE_SECOND_MS:1e3},P={IDLE:"idle",PENDING:"pending",RESOLVED:"resolved",REJECTED:"rejected"},S={DISPOSED:1,HAS_FN_SUBS:2,HAS_OBJ_SUBS:4},d={...S,EXECUTING:8},u={...S,DIRTY:8,IDLE:16,PENDING:32,RESOLVED:64,REJECTED:128,RECOMPUTING:256,HAS_ERROR:512},C={...S,SYNC:8,NOTIFICATION_SCHEDULED:16},he={MAX_SIZE:1e3,WARMUP_SIZE:100},T={MAX_EXECUTIONS_PER_SECOND:1e3,CLEANUP_THRESHOLD:1e3,MAX_EXECUTIONS_PER_EFFECT:100,MAX_EXECUTIONS_PER_FLUSH:1e4,MAX_FLUSH_ITERATIONS:1e3,MIN_FLUSH_ITERATIONS:10,BATCH_QUEUE_SHRINK_THRESHOLD:1e3},z={MAX_DEPENDENCIES:1e3,WARN_INFINITE_LOOP:!0},I=1073741823,ue=20,H=1<<ue-1,b=typeof process<"u"&&process.env&&process.env.NODE_ENV!=="production",_e=Object.freeze([]);class D extends Error{constructor(e,t=null,s=!0){super(e),this.name="AtomError",this.cause=t,this.recoverable=s,this.timestamp=new Date}}class N extends D{constructor(e,t=null){super(e,t,!0),this.name="ComputedError"}}class A extends D{constructor(e,t=null){super(e,t,!1),this.name="EffectError"}}class v extends D{constructor(e,t=null){super(e,t,!1),this.name="SchedulerError"}}const l={COMPUTED_MUST_BE_FUNCTION:"Computed function must be a function",COMPUTED_ASYNC_PENDING_NO_DEFAULT:"Async computation is pending. No default value provided",COMPUTED_COMPUTATION_FAILED:"Computed computation failed",COMPUTED_ASYNC_COMPUTATION_FAILED:"Async computed computation failed",ATOM_SUBSCRIBER_MUST_BE_FUNCTION:"Subscription listener must be a function or Subscriber object",ATOM_INDIVIDUAL_SUBSCRIBER_FAILED:"Error during individual atom subscriber execution",EFFECT_MUST_BE_FUNCTION:"Effect function must be a function",EFFECT_EXECUTION_FAILED:"Effect execution failed",EFFECT_CLEANUP_FAILED:"Effect cleanup function execution failed",CALLBACK_ERROR_IN_ERROR_HANDLER:"Error occurred during onError callback execution"},w=Symbol("debugName"),le=Symbol("id"),B=Symbol("type"),Q=Symbol("noDefaultValue");function ae(n){return"dependencies"in n&&Array.isArray(n.dependencies)}let Y=0;function K(n,e,t){if(n._visitedEpoch!==t){if(n._visitedEpoch=t,n===e)throw new N("Indirect circular dependency detected");if(ae(n)){const s=n.dependencies;for(let i=0;i<s.length;i++){const r=s[i];r&&K(r,e,t)}}}}const g={enabled:typeof process<"u"&&process.env?.NODE_ENV==="development",maxDependencies:z.MAX_DEPENDENCIES,warnInfiniteLoop:z.WARN_INFINITE_LOOP,warn(n,e){this.enabled&&n&&console.warn(`[Atom Effect] ${e}`)},checkCircular(n,e){if(n===e)throw new N("Direct circular dependency detected");this.enabled&&(Y++,K(n,e,Y))},attachDebugInfo(n,e,t){if(!this.enabled)return;const s=n;s[w]=`${e}_${t}`,s[le]=t,s[B]=e},getDebugName(n){if(n!=null&&w in n)return n[w]},getDebugType(n){if(n!=null&&B in n)return n[B]}};let fe=1;const Ee=()=>fe++;class W{constructor(){this.flags=0,this.version=0,this._lastSeenEpoch=-1,this._modifiedAtEpoch=-1,this._visitedEpoch=-1,this.id=Ee()&I,this._tempUnsub=void 0}getShift(e){return this.version-e&I}}class Z extends W{subscribe(e){if(typeof e=="function")return this._addSubscriber(this._fnSubs,e,S.HAS_FN_SUBS);if(e!==null&&typeof e=="object"&&"execute"in e)return this._addSubscriber(this._objSubs,e,S.HAS_OBJ_SUBS);throw new D(l.ATOM_SUBSCRIBER_MUST_BE_FUNCTION)}subscriberCount(){return this._fnSubs.length+this._objSubs.length}_addSubscriber(e,t,s){if(e.indexOf(t)!==-1)return()=>{};e.push(t),this.flags|=s;let r=!1;return()=>{if(r)return;r=!0;const o=e.indexOf(t);if(o!==-1){const c=e.pop();o<e.length&&(e[o]=c),this.flags&=~(e.length===0?s:0)}}}_notifySubscribers(e,t){const s=this.flags,i=S.HAS_FN_SUBS|S.HAS_OBJ_SUBS;if(s&i){if(s&S.HAS_FN_SUBS){const r=this._fnSubs;for(let o=0,c=r.length;o<c;o++){const h=r[o];if(h)try{h(e,t)}catch(_){console.error(new D(l.ATOM_INDIVIDUAL_SUBSCRIBER_FAILED,_))}}}if(s&S.HAS_OBJ_SUBS){const r=this._objSubs;for(let o=0,c=r.length;o<c;o++){const h=r[o];if(h)try{h.execute()}catch(_){console.error(new D(l.ATOM_INDIVIDUAL_SUBSCRIBER_FAILED,_))}}}}}}class de{constructor(){this.acquired=0,this.released=0,this.rejected=new pe}}class pe{constructor(){this.frozen=0,this.tooLarge=0,this.poolFull=0}}class G{constructor(){this.pool=[],this.maxPoolSize=50,this.maxReusableCapacity=256,this.stats=b?new de:null}acquire(){const e=this.stats;return b&&e&&e.acquired++,this.pool.pop()??[]}release(e,t){if(t&&e===t||Object.isFrozen(e)){const c=this.stats;b&&c&&e!==t&&c.rejected.frozen++;return}const s=e.length,i=this.pool,r=i.length;if(s>this.maxReusableCapacity||r>=this.maxPoolSize){const c=this.stats;b&&c&&(s>this.maxReusableCapacity?c.rejected.tooLarge++:c.rejected.poolFull++);return}e.length=0,i.push(e);const o=this.stats;b&&o&&o.released++}getStats(){const e=this.stats;if(!b||!e)return null;const{acquired:t,released:s,rejected:i}=e,r=i.frozen+i.tooLarge+i.poolFull;return{acquired:t,released:s,rejected:{frozen:i.frozen,tooLarge:i.tooLarge,poolFull:i.poolFull},leaked:t-s-r,poolSize:this.pool.length}}reset(){this.pool.length=0;const e=this.stats;b&&e&&(e.acquired=0,e.released=0,e.rejected.frozen=0,e.rejected.tooLarge=0,e.rejected.poolFull=0)}}const f=Object.freeze([]),R=Object.freeze([]),p=Object.freeze([]),x=new G,m=new G,y=new G;function O(n,e,t,s){if(e!=null){if((typeof e=="object"||typeof e=="function")&&typeof e.addDependency=="function"){e.addDependency(n);return}if(typeof e=="function"){const i=e;t.indexOf(i)===-1&&(t.push(i),n.flags|=S.HAS_FN_SUBS);return}typeof e=="object"&&typeof e.execute=="function"&&s.indexOf(e)===-1&&(s.push(e),n.flags|=S.HAS_OBJ_SUBS)}}function q(n,e,t,s){const i=n.length,r=e.length,o=e!==f&&r>0;if(o)for(let h=0;h<r;h++){const _=e[h];_&&(_._tempUnsub=t[h])}const c=m.acquire();c.length=i;for(let h=0;h<i;h++){const _=n[h];if(!_)continue;const E=_._tempUnsub;E?(c[h]=E,_._tempUnsub=void 0):(g.checkCircular(_,s),c[h]=_.subscribe(s))}if(o)for(let h=0;h<r;h++){const _=e[h];if(_){const E=_._tempUnsub;E&&(E(),_._tempUnsub=void 0)}}return t!==R&&m.release(t),c}let L=0;function ee(){return L=L+1&I||1,L}function Se(){return L}let k=0,j=0,M=!1;function J(){return M?(b&&console.warn("Warning: startFlush() called during flush - ignored to prevent infinite loop detection bypass"),!1):(M=!0,k=k+1&I,j=0,!0)}function $(){M=!1}function ge(){return M?++j:0}class be{constructor(){this._queueBuffers=[[[],[]],[[],[]]],this._bufferIndices=new Uint8Array(2),this._sizes=new Uint32Array(2),this._activeQueues=[this._queueBuffers[0][0],this._queueBuffers[1][0]],this._epoch=0,this.isProcessing=!1,this.isBatching=!1,this.batchDepth=0,this.batchQueue=[],this.batchQueueSize=0,this.isFlushingSync=!1,this.maxFlushIterations=T.MAX_FLUSH_ITERATIONS}get phase(){return this.isProcessing||this.isFlushingSync?2:this.isBatching?1:0}get queueSize(){return this._sizes[0]}get urgentQueueSize(){return this._sizes[1]}schedule(e,t){if(typeof e!="function")throw new v("Scheduler callback must be a function");const s=this._epoch;if(e._nextEpoch===s)return;if(e._nextEpoch=s,this.isBatching||this.isFlushingSync){this.batchQueue[this.batchQueueSize++]=e;return}const i=this._calculateUrgency(e,t);this._activeQueues[i][this._sizes[i]++]=e,this.isProcessing||this.flush()}_calculateUrgency(e,t){if(!t||e._cachedVersion===void 0)return 0;const s=t.getShift(e._cachedVersion);return H-1-s>>>31&1}flush(){this.isProcessing||this._sizes[0]===0&&this._sizes[1]===0||(this.isProcessing=!0,queueMicrotask(()=>{try{if(this._sizes[0]===0&&this._sizes[1]===0)return;const e=J();this._drainQueue(),e&&$()}finally{this.isProcessing=!1,(this._sizes[0]>0||this._sizes[1]>0)&&!this.isBatching&&this.flush()}}))}flushSync(){this.isFlushingSync=!0;const e=J();try{this._mergeBatchQueue(),this._drainQueue()}finally{this.isFlushingSync=!1,e&&$()}}_mergeBatchQueue(){const e=this.batchQueueSize;if(e===0)return;const t=++this._epoch,s=this.batchQueue,i=this._activeQueues[0];let r=this._sizes[0];for(let o=0;o<e;o++){const c=s[o];c._nextEpoch!==t&&(c._nextEpoch=t,i[r++]=c)}this._sizes[0]=r,this.batchQueueSize=0,s.length>T.BATCH_QUEUE_SHRINK_THRESHOLD&&(s.length=0)}_drainQueue(){let e=0;const t=this.maxFlushIterations;for(;this._sizes[1]>0||this._sizes[0]>0;){if(++e>t){this._handleFlushOverflow();return}this._sizes[1]>0&&this._processQueue(1),this._sizes[0]>0&&this._processQueue(0),this._mergeBatchQueue()}}_processQueue(e){const t=this._queueBuffers[e],s=this._bufferIndices[e],i=t[s],r=this._sizes[e],o=s^1;this._bufferIndices[e]=o,this._activeQueues[e]=t[o],this._sizes[e]=0,this._epoch++,this._processJobs(i,r)}_handleFlushOverflow(){console.error(new v(`Maximum flush iterations (${this.maxFlushIterations}) exceeded. Possible infinite loop.`)),this._sizes[0]=0,this._activeQueues[0].length=0,this._sizes[1]=0,this._activeQueues[1].length=0,this.batchQueueSize=0}_processJobs(e,t){for(let s=0;s<t;s++)try{e[s]()}catch(i){console.error(new v("Error occurred during scheduler execution",i))}e.length=0}startBatch(){this.batchDepth++,this.isBatching=!0}endBatch(){this.batchDepth=Math.max(0,this.batchDepth-1),this.batchDepth===0&&(this.flushSync(),this.isBatching=!1)}setMaxFlushIterations(e){if(e<T.MIN_FLUSH_ITERATIONS)throw new v(`Max flush iterations must be at least ${T.MIN_FLUSH_ITERATIONS}`);this.maxFlushIterations=e}}const U=new be;class Ie{constructor(){this.current=null}run(e,t){const s=this.current;this.current=e;try{return t()}finally{this.current=s}}getCurrent(){return this.current}}const a=new Ie;function te(n){if(typeof n!="function")throw new D("Untracked callback must be a function");const e=a.current;a.current=null;try{return n()}finally{a.current=e}}class De extends Z{constructor(e,t){super(),this._value=e,this._pendingOldValue=void 0,this._notifyTask=void 0,this._fnSubs=[],this._objSubs=[],t&&(this.flags|=C.SYNC),g.attachDebugInfo(this,"atom",this.id)}get value(){const e=a.current;return e&&O(this,e,this._fnSubs,this._objSubs),this._value}set value(e){const t=this._value;if(Object.is(t,e))return;this._value=e,this.version=this.version+1&I;const s=this.flags,i=C.HAS_FN_SUBS|C.HAS_OBJ_SUBS;s&i&&this._scheduleNotification(t)}_scheduleNotification(e){let t=this.flags;if(t&C.NOTIFICATION_SCHEDULED||(this._pendingOldValue=e,this.flags=t|=C.NOTIFICATION_SCHEDULED),t&C.SYNC&&!U.isBatching){this._flushNotifications();return}let s=this._notifyTask;s||(s=this._notifyTask=()=>this._flushNotifications()),U.schedule(s)}_flushNotifications(){if(!(this.flags&C.NOTIFICATION_SCHEDULED))return;const e=this._pendingOldValue,t=this._value;this._pendingOldValue=void 0,this.flags&=-17,this._notifySubscribers(t,e)}peek(){return this._value}dispose(){this.flags&C.DISPOSED||(this._fnSubs=[],this._objSubs=[],this.flags|=C.DISPOSED,this._value=void 0,this._pendingOldValue=void 0,this._notifyTask=void 0)}}function Ce(n,e={}){return new De(n,e.sync??!1)}function F(n,e,t){if(n instanceof TypeError)return new e(`Type error (${t}): ${n.message}`,n);if(n instanceof ReferenceError)return new e(`Reference error (${t}): ${n.message}`,n);if(n instanceof D)return n;const s=n instanceof Error?n.message:String(n),i=n instanceof Error?n:null;return new e(`Unexpected error (${t}): ${s}`,i)}function se(n){return n!==null&&typeof n=="object"&&"value"in n&&"subscribe"in n&&typeof n.subscribe=="function"}function ye(n){if(g.enabled&&(n==null||typeof n=="object")){const e=g.getDebugType(n);if(e)return e==="computed"}return se(n)&&"invalidate"in n&&typeof n.invalidate=="function"}function Te(n){return n!==null&&typeof n=="object"&&"dispose"in n&&"run"in n&&typeof n.dispose=="function"&&typeof n.run=="function"}function ie(n){return n!=null&&typeof n.then=="function"}const ne=u.RESOLVED|u.PENDING|u.REJECTED,V=Array(ne+1).fill(P.IDLE);V[u.RESOLVED]=P.RESOLVED;V[u.PENDING]=P.PENDING;V[u.REJECTED]=P.REJECTED;class Oe{constructor(e){this._owner=e,this._epoch=-1,this._nextDeps=f,this._nextVersions=p,this._depCount=0}execute(){this._owner._markDirty()}addDependency(e){if(e._lastSeenEpoch===this._epoch)return;e._lastSeenEpoch=this._epoch;const t=this._depCount,s=this._nextDeps,i=this._nextVersions;t<s.length?(s[t]=e,i[t]=e.version):(s.push(e),i.push(e.version)),this._depCount=t+1}reset(){this._epoch=-1,this._nextDeps=f,this._nextVersions=p,this._depCount=0}}class re extends Z{constructor(e,t={}){if(typeof e!="function")throw new N(l.COMPUTED_MUST_BE_FUNCTION);if(super(),this.MAX_ASYNC_RETRIES=3,this._value=void 0,this.flags=u.DIRTY|u.IDLE,this._error=null,this._promiseId=0,this._equal=t.equal??Object.is,this._fn=e,this._defaultValue="defaultValue"in t?t.defaultValue:Q,this._hasDefaultValue=this._defaultValue!==Q,this._onError=t.onError??null,this.MAX_PROMISE_ID=Number.MAX_SAFE_INTEGER-1,this._fnSubs=[],this._objSubs=[],this._dependencies=f,this._dependencyVersions=p,this._unsubscribes=R,this._cachedErrors=null,this._errorCacheEpoch=-1,this._asyncStartAggregateVersion=0,this._asyncRetryCount=0,this._trackable=new Oe(this),g.attachDebugInfo(this,"computed",this.id),g.enabled){const s=this;s.subscriberCount=this.subscriberCount.bind(this),s.isDirty=()=>(this.flags&u.DIRTY)!==0,s.dependencies=this._dependencies,s.stateFlags=""}if(t.lazy===!1)try{this._recompute()}catch{}}get value(){const e=a.current;e&&O(this,e,this._fnSubs,this._objSubs);const t=this.flags;if(t&u.RECOMPUTING)return this._value;t&(u.DIRTY|u.IDLE)&&this._recompute();const s=this.flags;return s&u.PENDING?this._handlePending():s&u.REJECTED?this._handleRejected():this._value}peek(){return this._value}get state(){const e=a.current;return e&&O(this,e,this._fnSubs,this._objSubs),V[this.flags&ne]}get hasError(){const e=a.current;if(e&&O(this,e,this._fnSubs,this._objSubs),this.flags&(u.REJECTED|u.HAS_ERROR))return!0;const s=this._dependencies;for(let i=0,r=s.length;i<r;i++){const o=s[i];if(o&&o.flags&u.HAS_ERROR)return!0}return!1}get isValid(){return!this.hasError}get errors(){const e=a.current;if(e&&O(this,e,this._fnSubs,this._objSubs),!this.hasError)return _e;const t=Se();if(this._errorCacheEpoch===t&&this._cachedErrors!==null)return this._cachedErrors;const s=new Set;this._error&&s.add(this._error);const i=this._dependencies;for(let o=0,c=i.length;o<c;o++){const h=i[o];if(h&&"errors"in h){const _=h.errors;for(let E=0,oe=_.length;E<oe;E++){const X=_[E];X&&s.add(X)}}}const r=Object.freeze([...s]);return this._cachedErrors=r,this._errorCacheEpoch=t,r}get lastError(){const e=a.current;return e&&O(this,e,this._fnSubs,this._objSubs),this._error}get isPending(){const e=a.current;return e&&O(this,e,this._fnSubs,this._objSubs),(this.flags&u.PENDING)!==0}get isResolved(){const e=a.current;return e&&O(this,e,this._fnSubs,this._objSubs),(this.flags&u.RESOLVED)!==0}invalidate(){this._markDirty();const e=this._dependencyVersions;e!==p&&(y.release(e),this._dependencyVersions=p),this._errorCacheEpoch=-1,this._cachedErrors=null}dispose(){const e=this._unsubscribes;if(e!==R){for(let i=0,r=e.length;i<r;i++){const o=e[i];o&&o()}m.release(e),this._unsubscribes=R}const t=this._dependencies;t!==f&&(x.release(t),this._dependencies=f);const s=this._dependencyVersions;s!==p&&(y.release(s),this._dependencyVersions=p),this._fnSubs=[],this._objSubs=[],this.flags=u.DISPOSED|u.DIRTY|u.IDLE,this._error=null,this._value=void 0,this._promiseId=(this._promiseId+1)%this.MAX_PROMISE_ID,this._cachedErrors=null,this._errorCacheEpoch=-1}_clearDirty(){this.flags&=-9}_setPending(){this.flags=(this.flags|u.PENDING)&-209}_isResolved(){return(this.flags&u.RESOLVED)!==0}_setResolved(){this.flags=(this.flags|u.RESOLVED)&-689}_isRejected(){return(this.flags&u.REJECTED)!==0}_setRejected(){this.flags=this.flags&-113|(u.REJECTED|u.HAS_ERROR)}_setRecomputing(e){const t=u.RECOMPUTING;this.flags=this.flags&~t|(e?-1:0)&t}_recompute(){if(this.flags&u.RECOMPUTING)return;this._setRecomputing(!0);const e=this._trackable,t=this._dependencies,s=this._dependencyVersions;e._epoch=ee(),e._nextDeps=x.acquire(),e._nextVersions=y.acquire(),e._depCount=0;let i=!1;try{const r=a.run(e,this._fn),o=e._nextDeps,c=e._nextVersions,h=e._depCount;o.length=h,c.length=h,this._unsubscribes=q(o,t,this._unsubscribes,this),this._dependencies=o,this._dependencyVersions=c,i=!0,ie(r)?this._handleAsyncComputation(r):this._finalizeResolution(r)}catch(r){let o=r;if(!i)try{const c=e._nextDeps,h=e._nextVersions,_=e._depCount;c.length=_,h.length=_,this._unsubscribes=q(c,t,this._unsubscribes,this),this._dependencies=c,this._dependencyVersions=h,i=!0}catch(c){o=c}this._handleComputationError(o)}finally{i?(t!==f&&x.release(t),s!==p&&y.release(s)):(x.release(e._nextDeps),y.release(e._nextVersions)),e.reset(),this._setRecomputing(!1)}}_getAggregateShift(){let e=0;const t=this._dependencies,s=this._dependencyVersions;for(let i=0,r=t.length;i<r;i++){const o=t[i],c=s[i];o&&c!==void 0&&(e=e+o.getShift(c)&I)}return e}isUrgent(){return this._getAggregateShift()>=H}_handleAsyncComputation(e){this._setPending(),this._clearDirty(),this._notifySubscribers(void 0,void 0),this._asyncStartAggregateVersion=this._captureVersionSnapshot(),this._asyncRetryCount=0,this._promiseId=(this._promiseId+1)%this.MAX_PROMISE_ID;const t=this._promiseId;e.then(s=>{if(t!==this._promiseId)return;const r=this._captureVersionSnapshot()-this._asyncStartAggregateVersion&I;if(H-1-r>>>31&1){if(this._asyncRetryCount<this.MAX_ASYNC_RETRIES){this._asyncRetryCount++,this._markDirty();return}const c=new N(`Async drift exceeded threshold after ${this.MAX_ASYNC_RETRIES} retries.`);this._handleAsyncRejection(c);return}this._finalizeResolution(s),this._notifySubscribers(s,void 0)}).catch(s=>{t===this._promiseId&&this._handleAsyncRejection(s)})}_captureVersionSnapshot(){let e=0;const t=this._dependencies;for(let s=0,i=t.length;s<i;s++){const r=t[s];r&&(e=e+r.version&I)}return e}_handleAsyncRejection(e){const t=F(e,N,l.COMPUTED_ASYNC_COMPUTATION_FAILED);this.flags&u.REJECTED||(this.version=this.version+1&I),this._error=t,this._setRejected(),this._clearDirty(),this._setRecomputing(!1);const s=this._onError;if(s)try{s(t)}catch(i){console.error(l.CALLBACK_ERROR_IN_ERROR_HANDLER,i)}this._notifySubscribers(void 0,void 0)}_finalizeResolution(e){(!(this.flags&u.RESOLVED)||!this._equal(this._value,e))&&(this.version=this.version+1&I),this._value=e,this._clearDirty(),this._setResolved(),this._error=null,this._setRecomputing(!1),this._cachedErrors=null,this._errorCacheEpoch=-1}_handleComputationError(e){const t=F(e,N,l.COMPUTED_COMPUTATION_FAILED);this._error=t,this._setRejected(),this._clearDirty(),this._setRecomputing(!1);const s=this._onError;if(s)try{s(t)}catch(i){console.error(l.CALLBACK_ERROR_IN_ERROR_HANDLER,i)}throw t}_handlePending(){if(this._hasDefaultValue)return this._defaultValue;throw new N(l.COMPUTED_ASYNC_PENDING_NO_DEFAULT)}_handleRejected(){const e=this._error;if(e?.recoverable&&this._hasDefaultValue)return this._defaultValue;throw e}execute(){this._markDirty()}_markDirty(){const e=this.flags;e&(u.RECOMPUTING|u.DIRTY)||(this.flags=e|u.DIRTY,this._notifySubscribers(void 0,void 0))}}Object.freeze(re.prototype);function Ae(n,e={}){return new re(n,e)}class Ne extends W{constructor(e,t={}){super(),this._cleanup=null,this._dependencies=f,this._dependencyVersions=p,this._unsubscribes=R,this._nextDeps=null,this._nextVersions=null,this._nextUnsubs=null,this._executeTask=void 0,this._onError=t.onError??null,this._currentEpoch=-1,this._lastFlushEpoch=-1,this._executionsInEpoch=0,this._fn=e,this._sync=t.sync??!1,this._maxExecutions=t.maxExecutionsPerSecond??T.MAX_EXECUTIONS_PER_SECOND,this._maxExecutionsPerFlush=t.maxExecutionsPerFlush??T.MAX_EXECUTIONS_PER_EFFECT,this._trackModifications=t.trackModifications??!1,this._executionCount=0,this._historyPtr=0;const s=Number.isFinite(this._maxExecutions),i=s?Math.min(this._maxExecutions+1,T.MAX_EXECUTIONS_PER_SECOND+1):0;this._historyCapacity=i,this._history=b&&s&&i>0?new Array(i).fill(0):null,g.attachDebugInfo(this,"effect",this.id)}run(){if(this.flags&d.DISPOSED)throw new A(l.EFFECT_MUST_BE_FUNCTION);this.execute(!0)}dispose(){const e=this.flags;if(e&d.DISPOSED)return;this.flags=e|d.DISPOSED,this._safeCleanup();const t=this._unsubscribes;if(t!==R){for(let r=0,o=t.length;r<o;r++){const c=t[r];c&&c()}m.release(t),this._unsubscribes=R}const s=this._dependencies;s!==f&&(x.release(s),this._dependencies=f);const i=this._dependencyVersions;i!==p&&(y.release(i),this._dependencyVersions=p),this._executeTask=void 0}addDependency(e){if(!(this.flags&d.EXECUTING))return;const s=this._currentEpoch;if(e._lastSeenEpoch===s)return;e._lastSeenEpoch=s;const i=this._nextDeps,r=this._nextVersions,o=this._nextUnsubs;if(!i||!r||!o)return;i.push(e),r.push(e.version);const c=e._tempUnsub;c?(o.push(c),e._tempUnsub=void 0):this._subscribeTo(e)}execute(e=!1){if(this.flags&(d.DISPOSED|d.EXECUTING)||!e&&!this._shouldExecute())return;this._checkInfiniteLoop(),this._setExecuting(!0),this._safeCleanup();const s=this._prepareEffectExecutionContext();let i=!1;try{const r=a.run(this,this._fn),o=s.nextDeps.length;s.nextDeps.length=o,s.nextVersions.length=o,this._dependencies=s.nextDeps,this._dependencyVersions=s.nextVersions,this._unsubscribes=s.nextUnsubs,i=!0,this._checkLoopWarnings(),ie(r)?r.then(c=>{!(this.flags&d.DISPOSED)&&typeof c=="function"&&(this._cleanup=c)}).catch(c=>this._handleExecutionError(c)):this._cleanup=typeof r=="function"?r:null}catch(r){i=!0,this._handleExecutionError(r),this._cleanup=null}finally{this._cleanupEffect(s,i),this._setExecuting(!1)}}_prepareEffectExecutionContext(){const e=this._dependencies,t=this._dependencyVersions,s=this._unsubscribes,i=x.acquire(),r=y.acquire(),o=m.acquire(),c=ee();if(e!==f)for(let h=0,_=e.length;h<_;h++){const E=e[h];E&&(E._tempUnsub=s[h])}return this._nextDeps=i,this._nextVersions=r,this._nextUnsubs=o,this._currentEpoch=c,{prevDeps:e,prevVersions:t,prevUnsubs:s,nextDeps:i,nextVersions:r,nextUnsubs:o}}_cleanupEffect(e,t){this._nextDeps=null,this._nextVersions=null,this._nextUnsubs=null;const s=e.prevDeps;if(t){if(s!==f){for(let i=0,r=s.length;i<r;i++){const o=s[i],c=o?o._tempUnsub:void 0;c&&(c(),o&&(o._tempUnsub=void 0))}x.release(s)}e.prevUnsubs!==R&&m.release(e.prevUnsubs),e.prevVersions!==p&&y.release(e.prevVersions)}else{x.release(e.nextDeps),y.release(e.nextVersions);const i=e.nextUnsubs;for(let r=0,o=i.length;r<o;r++)i[r]?.();if(m.release(i),s!==f)for(let r=0,o=s.length;r<o;r++){const c=s[r];c&&(c._tempUnsub=void 0)}}}_subscribeTo(e){try{const t=e.subscribe(()=>{if(this._trackModifications&&this.flags&d.EXECUTING&&(e._modifiedAtEpoch=this._currentEpoch),this._sync){this.execute();return}let i=this._executeTask;i||(i=this._executeTask=()=>this.execute()),U.schedule(i)}),s=this._nextUnsubs;s&&s.push(t)}catch(t){console.error(F(t,A,l.EFFECT_EXECUTION_FAILED));const s=this._nextUnsubs;s&&s.push(()=>{})}}get isDisposed(){return(this.flags&d.DISPOSED)!==0}get executionCount(){return this._executionCount}get isExecuting(){return(this.flags&d.EXECUTING)!==0}_setDisposed(){this.flags|=d.DISPOSED}_setExecuting(e){const t=d.EXECUTING;this.flags=this.flags&~t|(e?-1:0)&t}_safeCleanup(){const e=this._cleanup;if(e){try{e()}catch(t){console.error(F(t,A,l.EFFECT_CLEANUP_FAILED))}this._cleanup=null}}_checkInfiniteLoop(){const e=k;this._lastFlushEpoch!==e&&(this._lastFlushEpoch=e,this._executionsInEpoch=0),++this._executionsInEpoch>this._maxExecutionsPerFlush&&this._throwInfiniteLoopError("per-effect"),ge()>T.MAX_EXECUTIONS_PER_FLUSH&&this._throwInfiniteLoopError("global"),this._executionCount++;const s=this._history;if(s){const i=Date.now(),r=this._historyPtr,o=this._historyCapacity;s[r]=i;const c=(r+1)%o;this._historyPtr=c;const h=s[c]??0;if(h>0&&i-h<ce.ONE_SECOND_MS){const _=new A(`Effect executed ${o} times within 1 second. Infinite loop suspected`);if(this.dispose(),console.error(_),this._onError&&this._onError(_),b)throw _}}}_throwInfiniteLoopError(e){const t=new A(`Infinite loop detected (${e}): effect executed ${this._executionsInEpoch} times in current flush. Total executions in flush: ${j}`);throw this.dispose(),console.error(t),t}_shouldExecute(){const e=this._dependencies;if(e.length===0)return!0;const t=this._dependencyVersions;for(let s=0,i=e.length;s<i;s++){const r=e[s];if(r){if(r.version!==t[s])return!0;if("value"in r)try{te(()=>r.value)}catch{return!0}}}return!1}_handleExecutionError(e){const t=F(e,A,l.EFFECT_EXECUTION_FAILED);console.error(t);const s=this._onError;s&&s(t)}_checkLoopWarnings(){if(this._trackModifications&&g.enabled){const e=this._dependencies,t=this._currentEpoch;for(let s=0,i=e.length;s<i;s++){const r=e[s];r&&r._modifiedAtEpoch===t&&g.warn(!0,`Effect is reading a dependency (${g.getDebugName(r)||"unknown"}) that it just modified. Infinite loop may occur`)}}}}function Re(n,e={}){if(typeof n!="function")throw new A(l.EFFECT_MUST_BE_FUNCTION);const t=new Ne(n,e);return t.execute(),t}function xe(n){if(typeof n!="function")throw new D("Batch callback must be a function");U.startBatch();try{return n()}finally{U.endBatch()}}exports.AsyncState=P;exports.AtomError=D;exports.ComputedError=N;exports.DEBUG_CONFIG=z;exports.DEBUG_RUNTIME=g;exports.EffectError=A;exports.POOL_CONFIG=he;exports.SCHEDULER_CONFIG=T;exports.SchedulerError=v;exports.atom=Ce;exports.batch=xe;exports.computed=Ae;exports.effect=Re;exports.isAtom=se;exports.isComputed=ye;exports.isEffect=Te;exports.scheduler=U;exports.untracked=te;
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const oe={ONE_SECOND_MS:1e3},v={IDLE:"idle",PENDING:"pending",RESOLVED:"resolved",REJECTED:"rejected"},g={DISPOSED:1,HAS_FN_SUBS:2,HAS_OBJ_SUBS:4},S={...g,EXECUTING:8},u={...g,DIRTY:8,IDLE:16,PENDING:32,RESOLVED:64,REJECTED:128,RECOMPUTING:256,HAS_ERROR:512},I={...g,SYNC:8,NOTIFICATION_SCHEDULED:16},ce={MAX_SIZE:1e3,WARMUP_SIZE:100},R={MAX_EXECUTIONS_PER_SECOND:1e3,CLEANUP_THRESHOLD:1e3,MAX_EXECUTIONS_PER_EFFECT:100,MAX_EXECUTIONS_PER_FLUSH:1e4,MAX_FLUSH_ITERATIONS:1e3,MIN_FLUSH_ITERATIONS:10,BATCH_QUEUE_SHRINK_THRESHOLD:1e3},H={MAX_DEPENDENCIES:1e3,WARN_INFINITE_LOOP:!0},x=1073741823,E=typeof process<"u"&&process.env&&process.env.NODE_ENV!=="production",he=Object.freeze([]);class D extends Error{constructor(e,t=null,s=!0){super(e),this.name="AtomError",this.cause=t,this.recoverable=s,this.timestamp=new Date}}class C extends D{constructor(e,t=null){super(e,t,!0),this.name="ComputedError"}}class T extends D{constructor(e,t=null){super(e,t,!1),this.name="EffectError"}}class F extends D{constructor(e,t=null){super(e,t,!1),this.name="SchedulerError"}}const l={COMPUTED_MUST_BE_FUNCTION:"Computed function must be a function",COMPUTED_SUBSCRIBER_MUST_BE_FUNCTION:"Subscriber listener must be a function or Subscriber object",COMPUTED_ASYNC_PENDING_NO_DEFAULT:"Async computation is pending. No default value provided",COMPUTED_COMPUTATION_FAILED:"Computed computation failed",COMPUTED_ASYNC_COMPUTATION_FAILED:"Async computed computation failed",COMPUTED_CIRCULAR_DEPENDENCY:"Circular dependency detected during computation",COMPUTED_DEPENDENCY_SUBSCRIPTION_FAILED:"Failed to subscribe to dependency",ATOM_SUBSCRIBER_MUST_BE_FUNCTION:"Subscription listener must be a function or Subscriber object",ATOM_SUBSCRIBER_EXECUTION_FAILED:"Error occurred while executing atom subscribers",ATOM_INDIVIDUAL_SUBSCRIBER_FAILED:"Error during individual atom subscriber execution",EFFECT_MUST_BE_FUNCTION:"Effect function must be a function",EFFECT_EXECUTION_FAILED:"Effect execution failed",EFFECT_CLEANUP_FAILED:"Effect cleanup function execution failed",EFFECT_DISPOSED:"Cannot run a disposed effect",LARGE_DEPENDENCY_GRAPH:i=>`Large dependency graph detected: ${i} dependencies`,UNSUBSCRIBE_NON_EXISTENT:"Attempted to unsubscribe a non-existent listener",CALLBACK_ERROR_IN_ERROR_HANDLER:"Error occurred during onError callback execution"},w=Symbol("debugName"),ue=Symbol("id"),k=Symbol("type"),Y=Symbol("noDefaultValue");function _e(i){return"dependencies"in i&&Array.isArray(i.dependencies)}let q=0;function K(i,e,t){if(i._visitedEpoch!==t){if(i._visitedEpoch=t,i===e)throw new C("Indirect circular dependency detected");if(_e(i)){const s=i.dependencies;for(let n=0;n<s.length;n++){const r=s[n];r&&K(r,e,t)}}}}const b={enabled:typeof process<"u"&&process.env?.NODE_ENV==="development",maxDependencies:H.MAX_DEPENDENCIES,warnInfiniteLoop:H.WARN_INFINITE_LOOP,warn(i,e){this.enabled&&i&&console.warn(`[Atom Effect] ${e}`)},checkCircular(i,e){if(i===e)throw new C("Direct circular dependency detected");this.enabled&&(q++,K(i,e,q))},attachDebugInfo(i,e,t){if(!this.enabled)return;const s=i;s[w]=`${e}_${t}`,s[ue]=t,s[k]=e},getDebugName(i){if(i!=null&&w in i)return i[w]},getDebugType(i){if(i!=null&&k in i)return i[k]}};let le=1;const ae=()=>le++;class W{constructor(){this.flags=0,this.version=0,this._lastSeenEpoch=-1,this._modifiedAtEpoch=-1,this._visitedEpoch=-1,this.id=ae()&x,this._tempUnsub=void 0}getShift(e){return this.version-e&x}}class Z extends W{subscribe(e){if(typeof e=="function")return this._addSubscriber(this._fnSubs,e,g.HAS_FN_SUBS);if(e!==null&&typeof e=="object"&&"execute"in e)return this._addSubscriber(this._objSubs,e,g.HAS_OBJ_SUBS);throw new D(l.ATOM_SUBSCRIBER_MUST_BE_FUNCTION)}subscriberCount(){return this._fnSubs.length+this._objSubs.length}_addSubscriber(e,t,s){if(e.indexOf(t)!==-1)return E&&console.warn("Attempted to subscribe the same listener twice. Ignoring duplicate subscription."),()=>{};e.push(t),this.flags|=s;let r=!1;return()=>{if(r)return;r=!0;const o=e.indexOf(t);if(o!==-1){const c=e.pop();o<e.length&&(e[o]=c),this.flags&=~(e.length===0?s:0)}}}_notifySubscribers(e,t){const s=this.flags,n=g.HAS_FN_SUBS|g.HAS_OBJ_SUBS;if(s&n){if(s&g.HAS_FN_SUBS){const r=this._fnSubs;for(let o=0,c=r.length;o<c;o++){const h=r[o];if(h)try{h(e,t)}catch(_){console.error(new D(l.ATOM_INDIVIDUAL_SUBSCRIBER_FAILED,_))}}}if(s&g.HAS_OBJ_SUBS){const r=this._objSubs;for(let o=0,c=r.length;o<c;o++){const h=r[o];if(h)try{h.execute()}catch(_){console.error(new D(l.ATOM_INDIVIDUAL_SUBSCRIBER_FAILED,_))}}}}}}class fe{constructor(){this.acquired=0,this.released=0,this.rejected=new Ee}}class Ee{constructor(){this.frozen=0,this.tooLarge=0,this.poolFull=0}}class j{constructor(){this.pool=[],this.maxPoolSize=50,this.maxReusableCapacity=256,this.stats=E?new fe:null}acquire(){const e=this.stats;return E&&e&&e.acquired++,this.pool.pop()??[]}release(e,t){if(t&&e===t||Object.isFrozen(e)){const c=this.stats;E&&c&&e!==t&&c.rejected.frozen++;return}const s=e.length,n=this.pool,r=n.length;if(s>this.maxReusableCapacity||r>=this.maxPoolSize){const c=this.stats;E&&c&&(s>this.maxReusableCapacity?c.rejected.tooLarge++:c.rejected.poolFull++);return}e.length=0,n.push(e);const o=this.stats;E&&o&&o.released++}getStats(){const e=this.stats;if(!E||!e)return null;const{acquired:t,released:s,rejected:n}=e,r=n.frozen+n.tooLarge+n.poolFull;return{acquired:t,released:s,rejected:{frozen:n.frozen,tooLarge:n.tooLarge,poolFull:n.poolFull},leaked:t-s-r,poolSize:this.pool.length}}reset(){this.pool.length=0;const e=this.stats;E&&e&&(e.acquired=0,e.released=0,e.rejected.frozen=0,e.rejected.tooLarge=0,e.rejected.poolFull=0)}}const d=Object.freeze([]),A=Object.freeze([]),p=Object.freeze([]),y=new j,m=new j,N=new j;function O(i,e,t,s){if(e!=null){if((typeof e=="object"||typeof e=="function")&&typeof e.addDependency=="function"){e.addDependency(i);return}if(typeof e=="function"){const n=e;t.indexOf(n)===-1&&(t.push(n),i.flags|=g.HAS_FN_SUBS);return}typeof e=="object"&&typeof e.execute=="function"&&s.indexOf(e)===-1&&(s.push(e),i.flags|=g.HAS_OBJ_SUBS)}}function Q(i,e,t,s){const n=i.length,r=e.length,o=e!==d&&r>0;if(o)for(let h=0;h<r;h++){const _=e[h];_&&(_._tempUnsub=t[h])}const c=m.acquire();c.length=n;for(let h=0;h<n;h++){const _=i[h];if(!_)continue;const a=_._tempUnsub;a?(c[h]=a,_._tempUnsub=void 0):(b.checkCircular(_,s),c[h]=_.subscribe(s))}if(o)for(let h=0;h<r;h++){const _=e[h];if(_){const a=_._tempUnsub;a&&(a(),_._tempUnsub=void 0)}}return t!==A&&m.release(t),c}let L=0;function ee(){return L=L+1&x||1,L}function de(){return L}let G=0,z=0,M=!1;function J(){return M?(E&&console.warn("Warning: startFlush() called during flush - ignored to prevent infinite loop detection bypass"),!1):(M=!0,G=G+1&x||1,z=0,!0)}function $(){M=!1}function pe(){return M?++z:0}class Se{constructor(){this._queueBuffer=[[],[]],this._bufferIndex=0,this._size=0,this._epoch=0,this.isProcessing=!1,this.isBatching=!1,this.batchDepth=0,this.batchQueue=[],this.batchQueueSize=0,this.isFlushingSync=!1,this.maxFlushIterations=R.MAX_FLUSH_ITERATIONS}get phase(){return this.isProcessing||this.isFlushingSync?2:this.isBatching?1:0}get queueSize(){return this._size}schedule(e){if(E&&typeof e!="function")throw new F("Scheduler callback must be a function");const t=this._epoch;if(e._nextEpoch!==t){if(e._nextEpoch=t,this.isBatching||this.isFlushingSync){this.batchQueue[this.batchQueueSize++]=e;return}this._queueBuffer[this._bufferIndex][this._size++]=e,this.isProcessing||this.flush()}}flush(){this.isProcessing||this._size===0||(this.isProcessing=!0,queueMicrotask(()=>{try{if(this._size===0)return;const e=J();this._drainQueue(),e&&$()}finally{this.isProcessing=!1,this._size>0&&!this.isBatching&&this.flush()}}))}flushSync(){this.isFlushingSync=!0;const e=J();try{this._mergeBatchQueue(),this._drainQueue()}finally{this.isFlushingSync=!1,e&&$()}}_mergeBatchQueue(){const e=this.batchQueueSize;if(e===0)return;const t=++this._epoch,s=this.batchQueue,n=this._queueBuffer[this._bufferIndex];let r=this._size;for(let o=0;o<e;o++){const c=s[o];c._nextEpoch!==t&&(c._nextEpoch=t,n[r++]=c)}this._size=r,this.batchQueueSize=0,s.length>R.BATCH_QUEUE_SHRINK_THRESHOLD&&(s.length=0)}_drainQueue(){let e=0;const t=this.maxFlushIterations;for(;this._size>0;){if(++e>t){this._handleFlushOverflow();return}this._processQueue(),this._mergeBatchQueue()}}_processQueue(){const e=this._bufferIndex,t=this._queueBuffer[e],s=this._size,n=e^1;this._bufferIndex=n,this._size=0,this._epoch++,this._processJobs(t,s)}_handleFlushOverflow(){console.error(new F(`Maximum flush iterations (${this.maxFlushIterations}) exceeded. Possible infinite loop.`)),this._size=0,this._queueBuffer[this._bufferIndex].length=0,this.batchQueueSize=0}_processJobs(e,t){for(let s=0;s<t;s++)try{e[s]()}catch(n){console.error(new F("Error occurred during scheduler execution",n))}e.length=0}startBatch(){this.batchDepth++,this.isBatching=!0}endBatch(){if(this.batchDepth===0){E&&console.warn("endBatch() called without matching startBatch(). Ignoring.");return}this.batchDepth--,this.batchDepth===0&&(this.flushSync(),this.isBatching=!1)}setMaxFlushIterations(e){if(e<R.MIN_FLUSH_ITERATIONS)throw new F(`Max flush iterations must be at least ${R.MIN_FLUSH_ITERATIONS}`);this.maxFlushIterations=e}}const U=new Se;class ge{constructor(){this.current=null}run(e,t){const s=this.current;this.current=e;try{return t()}finally{this.current=s}}getCurrent(){return this.current}}const f=new ge;function te(i){if(typeof i!="function")throw new D("Untracked callback must be a function");const e=f.current;f.current=null;try{return i()}finally{f.current=e}}class be extends Z{constructor(e,t){super(),this._value=e,this._pendingOldValue=void 0,this._notifyTask=void 0,this._fnSubs=[],this._objSubs=[],t&&(this.flags|=I.SYNC),b.attachDebugInfo(this,"atom",this.id)}get value(){const e=f.current;return e&&O(this,e,this._fnSubs,this._objSubs),this._value}set value(e){const t=this._value;if(Object.is(t,e))return;this._value=e,this.version=this.version+1&x;const s=this.flags,n=I.HAS_FN_SUBS|I.HAS_OBJ_SUBS;s&n&&this._scheduleNotification(t)}_scheduleNotification(e){let t=this.flags;if(t&I.NOTIFICATION_SCHEDULED||(this._pendingOldValue=e,this.flags=t|=I.NOTIFICATION_SCHEDULED),t&I.SYNC&&!U.isBatching){this._flushNotifications();return}let s=this._notifyTask;s||(s=this._notifyTask=()=>this._flushNotifications()),U.schedule(s)}_flushNotifications(){const e=this.flags;if(!(e&I.NOTIFICATION_SCHEDULED)||e&I.DISPOSED)return;const t=this._pendingOldValue,s=this._value;this._pendingOldValue=void 0,this.flags&=-17,this._notifySubscribers(s,t)}peek(){return this._value}dispose(){this.flags&I.DISPOSED||(this._fnSubs=[],this._objSubs=[],this.flags|=I.DISPOSED,this._value=void 0,this._pendingOldValue=void 0,this._notifyTask=void 0)}}function Ie(i,e={}){return new be(i,e.sync??!1)}function P(i,e,t){if(i instanceof TypeError)return new e(`Type error (${t}): ${i.message}`,i);if(i instanceof ReferenceError)return new e(`Reference error (${t}): ${i.message}`,i);if(i instanceof D)return i;const s=i instanceof Error?i.message:String(i),n=i instanceof Error?i:null;return new e(`Unexpected error (${t}): ${s}`,n)}function se(i){return i!==null&&typeof i=="object"&&"value"in i&&"subscribe"in i&&typeof i.subscribe=="function"}function De(i){if(b.enabled&&i!=null&&typeof i=="object"){const e=b.getDebugType(i);if(e)return e==="computed"}return se(i)&&"invalidate"in i&&typeof i.invalidate=="function"}function Ce(i){return i!==null&&typeof i=="object"&&"dispose"in i&&"run"in i&&typeof i.dispose=="function"&&typeof i.run=="function"}function ie(i){return i!=null&&typeof i.then=="function"}const ne=u.RESOLVED|u.PENDING|u.REJECTED,V=Array(ne+1).fill(v.IDLE);V[u.RESOLVED]=v.RESOLVED;V[u.PENDING]=v.PENDING;V[u.REJECTED]=v.REJECTED;class Ne{constructor(e){this._owner=e,this._epoch=-1,this._nextDeps=d,this._nextVersions=p,this._depCount=0}execute(){this._owner._markDirty()}addDependency(e){if(e._lastSeenEpoch===this._epoch)return;e._lastSeenEpoch=this._epoch;const t=this._depCount,s=this._nextDeps,n=this._nextVersions;t<s.length?(s[t]=e,n[t]=e.version):(s.push(e),n.push(e.version)),this._depCount=t+1}reset(){this._epoch=-1,this._nextDeps=d,this._nextVersions=p,this._depCount=0}}class re extends Z{constructor(e,t={}){if(typeof e!="function")throw new C(l.COMPUTED_MUST_BE_FUNCTION);if(super(),this.MAX_ASYNC_RETRIES=3,this._value=void 0,this.flags=u.DIRTY|u.IDLE,this._error=null,this._promiseId=0,this._equal=t.equal??Object.is,this._fn=e,this._defaultValue="defaultValue"in t?t.defaultValue:Y,this._hasDefaultValue=this._defaultValue!==Y,this._onError=t.onError??null,this.MAX_PROMISE_ID=Number.MAX_SAFE_INTEGER-1,this._fnSubs=[],this._objSubs=[],this._dependencies=d,this._dependencyVersions=p,this._unsubscribes=A,this._cachedErrors=null,this._errorCacheEpoch=-1,this._asyncStartAggregateVersion=0,this._asyncRetryCount=0,this._trackable=new Ne(this),b.attachDebugInfo(this,"computed",this.id),b.enabled){const s=this;s.subscriberCount=this.subscriberCount.bind(this),s.isDirty=()=>(this.flags&u.DIRTY)!==0,s.dependencies=this._dependencies,s.stateFlags=""}if(t.lazy===!1)try{this._recompute()}catch{}}get value(){const e=f.current;e&&O(this,e,this._fnSubs,this._objSubs);const t=this.flags;if(t&u.RECOMPUTING){if(this._hasDefaultValue)return this._defaultValue;throw new C(l.COMPUTED_CIRCULAR_DEPENDENCY)}t&(u.DIRTY|u.IDLE)&&this._recompute();const s=this.flags;return s&u.PENDING?this._handlePending():s&u.REJECTED?this._handleRejected():this._value}peek(){return this._value}get state(){const e=f.current;return e&&O(this,e,this._fnSubs,this._objSubs),V[this.flags&ne]}get hasError(){const e=f.current;if(e&&O(this,e,this._fnSubs,this._objSubs),this.flags&(u.REJECTED|u.HAS_ERROR))return!0;const s=this._dependencies;for(let n=0,r=s.length;n<r;n++){const o=s[n];if(o&&o.flags&u.HAS_ERROR)return!0}return!1}get isValid(){return!this.hasError}get errors(){const e=f.current;if(e&&O(this,e,this._fnSubs,this._objSubs),!this.hasError)return he;const t=de();if(this._errorCacheEpoch===t&&this._cachedErrors!==null)return this._cachedErrors;const s=new Set;this._error&&s.add(this._error);const n=this._dependencies;for(let o=0,c=n.length;o<c;o++){const h=n[o];if(h&&"errors"in h){const _=h.errors;for(let a=0,B=_.length;a<B;a++){const X=_[a];X&&s.add(X)}}}const r=Object.freeze([...s]);return this._cachedErrors=r,this._errorCacheEpoch=t,r}get lastError(){const e=f.current;return e&&O(this,e,this._fnSubs,this._objSubs),this._error}get isPending(){const e=f.current;return e&&O(this,e,this._fnSubs,this._objSubs),(this.flags&u.PENDING)!==0}get isResolved(){const e=f.current;return e&&O(this,e,this._fnSubs,this._objSubs),(this.flags&u.RESOLVED)!==0}invalidate(){this._markDirty();const e=this._dependencyVersions;e!==p&&(N.release(e),this._dependencyVersions=p),this._errorCacheEpoch=-1,this._cachedErrors=null}dispose(){const e=this._unsubscribes;if(e!==A){for(let n=0,r=e.length;n<r;n++){const o=e[n];o&&o()}m.release(e),this._unsubscribes=A}const t=this._dependencies;t!==d&&(y.release(t),this._dependencies=d);const s=this._dependencyVersions;s!==p&&(N.release(s),this._dependencyVersions=p),this._fnSubs=[],this._objSubs=[],this.flags=u.DISPOSED|u.DIRTY|u.IDLE,this._error=null,this._value=void 0,this._promiseId=(this._promiseId+1)%this.MAX_PROMISE_ID,this._cachedErrors=null,this._errorCacheEpoch=-1}_clearDirty(){this.flags&=-9}_setPending(){this.flags=(this.flags|u.PENDING)&-209}_isResolved(){return(this.flags&u.RESOLVED)!==0}_setResolved(){this.flags=(this.flags|u.RESOLVED)&-689}_isRejected(){return(this.flags&u.REJECTED)!==0}_setRejected(){this.flags=this.flags&-113|(u.REJECTED|u.HAS_ERROR)}_setRecomputing(e){const t=u.RECOMPUTING;this.flags=this.flags&~t|(e?-1:0)&t}_recompute(){if(this.flags&u.RECOMPUTING)return;this._setRecomputing(!0);const e=this._trackable,t=this._dependencies,s=this._dependencyVersions;e._epoch=ee(),e._nextDeps=y.acquire(),e._nextVersions=N.acquire(),e._depCount=0;let n=!1;try{const r=f.run(e,this._fn),o=e._nextDeps,c=e._nextVersions,h=e._depCount;o.length=h,c.length=h,this._unsubscribes=Q(o,t,this._unsubscribes,this),this._dependencies=o,this._dependencyVersions=c,n=!0,ie(r)?this._handleAsyncComputation(r):this._finalizeResolution(r)}catch(r){let o=r;if(!n)try{const c=e._nextDeps,h=e._nextVersions,_=e._depCount;c.length=_,h.length=_,this._unsubscribes=Q(c,t,this._unsubscribes,this),this._dependencies=c,this._dependencyVersions=h,n=!0}catch(c){o=c}this._handleComputationError(o)}finally{n?(t!==d&&y.release(t),s!==p&&N.release(s)):(y.release(e._nextDeps),N.release(e._nextVersions)),e.reset(),this._setRecomputing(!1)}}_handleAsyncComputation(e){this._setPending(),this._clearDirty(),this._notifySubscribers(void 0,void 0),this._asyncStartAggregateVersion=this._captureVersionSnapshot(),this._asyncRetryCount=0,this._promiseId=(this._promiseId+1)%this.MAX_PROMISE_ID;const t=this._promiseId;e.then(s=>{if(t!==this._promiseId)return;if(this._captureVersionSnapshot()!==this._asyncStartAggregateVersion){if(this._asyncRetryCount<this.MAX_ASYNC_RETRIES){this._asyncRetryCount++,this._markDirty();return}const o=new C(`Async drift exceeded threshold after ${this.MAX_ASYNC_RETRIES} retries.`);this._handleAsyncRejection(o);return}this._finalizeResolution(s),this._notifySubscribers(s,void 0)}).catch(s=>{t===this._promiseId&&this._handleAsyncRejection(s)})}_captureVersionSnapshot(){let e=0;const t=this._dependencies;for(let s=0,n=t.length;s<n;s++){const r=t[s];if(r){const o=r.version;e=((e<<5)-e|0)+o&x}}return e}_handleAsyncRejection(e){const t=P(e,C,l.COMPUTED_ASYNC_COMPUTATION_FAILED);this.flags&u.REJECTED||(this.version=this.version+1&x),this._error=t,this._setRejected(),this._clearDirty();const s=this._onError;if(s)try{s(t)}catch(n){console.error(l.CALLBACK_ERROR_IN_ERROR_HANDLER,n)}this._notifySubscribers(void 0,void 0)}_finalizeResolution(e){(!(this.flags&u.RESOLVED)||!this._equal(this._value,e))&&(this.version=this.version+1&x),this._value=e,this._clearDirty(),this._setResolved(),this._error=null,this._setRecomputing(!1),this._cachedErrors=null,this._errorCacheEpoch=-1}_handleComputationError(e){const t=P(e,C,l.COMPUTED_COMPUTATION_FAILED);this._error=t,this._setRejected(),this._clearDirty(),this._setRecomputing(!1);const s=this._onError;if(s)try{s(t)}catch(n){console.error(l.CALLBACK_ERROR_IN_ERROR_HANDLER,n)}throw t}_handlePending(){if(this._hasDefaultValue)return this._defaultValue;throw new C(l.COMPUTED_ASYNC_PENDING_NO_DEFAULT)}_handleRejected(){const e=this._error;if(e?.recoverable&&this._hasDefaultValue)return this._defaultValue;throw e}execute(){this._markDirty()}_markDirty(){const e=this.flags;e&(u.RECOMPUTING|u.DIRTY)||(this.flags=e|u.DIRTY,this._notifySubscribers(void 0,void 0))}}Object.freeze(re.prototype);function Re(i,e={}){return new re(i,e)}class Oe extends W{constructor(e,t={}){super(),this._cleanup=null,this._dependencies=d,this._dependencyVersions=p,this._unsubscribes=A,this._nextDeps=null,this._nextVersions=null,this._nextUnsubs=null,this._executeTask=void 0,this._onError=t.onError??null,this._currentEpoch=-1,this._lastFlushEpoch=-1,this._executionsInEpoch=0,this._fn=e,this._sync=t.sync??!1,this._maxExecutions=t.maxExecutionsPerSecond??R.MAX_EXECUTIONS_PER_SECOND,this._maxExecutionsPerFlush=t.maxExecutionsPerFlush??R.MAX_EXECUTIONS_PER_EFFECT,this._trackModifications=t.trackModifications??!1,this._executionCount=0,this._historyPtr=0;const s=Number.isFinite(this._maxExecutions),n=s?Math.min(this._maxExecutions+1,R.MAX_EXECUTIONS_PER_SECOND+1):0;this._historyCapacity=n,this._history=E&&s&&n>0?new Array(n).fill(0):null,this._execId=0,b.attachDebugInfo(this,"effect",this.id)}run(){if(this.flags&S.DISPOSED)throw new T(l.EFFECT_DISPOSED);this.execute(!0)}dispose(){const e=this.flags;if(e&S.DISPOSED)return;this.flags=e|S.DISPOSED,this._safeCleanup();const t=this._unsubscribes;if(t!==A){for(let r=0,o=t.length;r<o;r++){const c=t[r];c&&c()}m.release(t),this._unsubscribes=A}const s=this._dependencies;s!==d&&(y.release(s),this._dependencies=d);const n=this._dependencyVersions;n!==p&&(N.release(n),this._dependencyVersions=p),this._executeTask=void 0}addDependency(e){if(!(this.flags&S.EXECUTING))return;const s=this._currentEpoch;if(e._lastSeenEpoch===s)return;e._lastSeenEpoch=s;const n=this._nextDeps,r=this._nextVersions,o=this._nextUnsubs;if(!n||!r||!o)return;n.push(e),r.push(e.version);const c=e._tempUnsub;c?(o.push(c),e._tempUnsub=void 0):this._subscribeTo(e)}execute(e=!1){if(this.flags&(S.DISPOSED|S.EXECUTING)||!e&&!this._shouldExecute())return;this._checkInfiniteLoop(),this._setExecuting(!0),this._safeCleanup();const s=this._prepareEffectExecutionContext();let n=!1;try{const r=f.run(this,this._fn),o=s.nextDeps.length;s.nextDeps.length=o,s.nextVersions.length=o,this._dependencies=s.nextDeps,this._dependencyVersions=s.nextVersions,this._unsubscribes=s.nextUnsubs,n=!0,this._checkLoopWarnings();const c=++this._execId;ie(r)?r.then(h=>{const _=c!==this._execId,a=this.flags&S.DISPOSED;if(_||a){if(typeof h=="function")try{h()}catch(B){this._handleExecutionError(B,l.EFFECT_CLEANUP_FAILED)}return}typeof h=="function"&&(this._cleanup=h)}).catch(h=>{c===this._execId&&this._handleExecutionError(h)}):this._cleanup=typeof r=="function"?r:null}catch(r){n=!0,this._handleExecutionError(r),this._cleanup=null}finally{this._cleanupEffect(s,n),this._setExecuting(!1)}}_prepareEffectExecutionContext(){const e=this._dependencies,t=this._dependencyVersions,s=this._unsubscribes,n=y.acquire(),r=N.acquire(),o=m.acquire(),c=ee();if(e!==d)for(let h=0,_=e.length;h<_;h++){const a=e[h];a&&(a._tempUnsub=s[h])}return this._nextDeps=n,this._nextVersions=r,this._nextUnsubs=o,this._currentEpoch=c,{prevDeps:e,prevVersions:t,prevUnsubs:s,nextDeps:n,nextVersions:r,nextUnsubs:o}}_cleanupEffect(e,t){this._nextDeps=null,this._nextVersions=null,this._nextUnsubs=null;const s=e.prevDeps;if(t){if(s!==d){for(let n=0,r=s.length;n<r;n++){const o=s[n],c=o?o._tempUnsub:void 0;c&&(c(),o&&(o._tempUnsub=void 0))}y.release(s)}e.prevUnsubs!==A&&m.release(e.prevUnsubs),e.prevVersions!==p&&N.release(e.prevVersions)}else{y.release(e.nextDeps),N.release(e.nextVersions);const n=e.nextUnsubs;for(let r=0,o=n.length;r<o;r++)n[r]?.();if(m.release(n),s!==d)for(let r=0,o=s.length;r<o;r++){const c=s[r];c&&(c._tempUnsub=void 0)}}}_subscribeTo(e){try{const t=e.subscribe(()=>{if(this._trackModifications&&this.flags&S.EXECUTING&&(e._modifiedAtEpoch=this._currentEpoch),this._sync){this.execute();return}let n=this._executeTask;n||(n=this._executeTask=()=>this.execute()),U.schedule(n)}),s=this._nextUnsubs;s&&s.push(t)}catch(t){console.error(P(t,T,l.EFFECT_EXECUTION_FAILED));const s=this._nextUnsubs;s&&s.push(()=>{})}}get isDisposed(){return(this.flags&S.DISPOSED)!==0}get executionCount(){return this._executionCount}get isExecuting(){return(this.flags&S.EXECUTING)!==0}_setExecuting(e){const t=S.EXECUTING;this.flags=this.flags&~t|(e?-1:0)&t}_safeCleanup(){const e=this._cleanup;if(e){try{e()}catch(t){this._handleExecutionError(t,l.EFFECT_CLEANUP_FAILED)}this._cleanup=null}}_checkInfiniteLoop(){const e=G;this._lastFlushEpoch!==e&&(this._lastFlushEpoch=e,this._executionsInEpoch=0),++this._executionsInEpoch>this._maxExecutionsPerFlush&&this._throwInfiniteLoopError("per-effect"),pe()>R.MAX_EXECUTIONS_PER_FLUSH&&this._throwInfiniteLoopError("global"),this._executionCount++;const s=this._history;if(s){const n=Date.now(),r=this._historyPtr,o=this._historyCapacity;s[r]=n;const c=(r+1)%o;this._historyPtr=c;const h=s[c]??0;if(h>0&&n-h<oe.ONE_SECOND_MS){const _=new T(`Effect executed ${o} times within 1 second. Infinite loop suspected`);if(this.dispose(),console.error(_),this._onError&&this._onError(_),E)throw _;return}}}_throwInfiniteLoopError(e){const t=new T(`Infinite loop detected (${e}): effect executed ${this._executionsInEpoch} times in current flush. Total executions in flush: ${z}`);throw this.dispose(),console.error(t),t}_shouldExecute(){const e=this._dependencies;if(e.length===0)return!0;const t=this._dependencyVersions;for(let s=0,n=e.length;s<n;s++){const r=e[s];if(r){if(r.version!==t[s])return!0;if("value"in r)try{te(()=>r.value)}catch{return!0}}}return!1}_handleExecutionError(e,t=l.EFFECT_EXECUTION_FAILED){const s=P(e,T,t);console.error(s);const n=this._onError;if(n)try{n(s)}catch(r){console.error(P(r,T,l.CALLBACK_ERROR_IN_ERROR_HANDLER))}}_checkLoopWarnings(){if(this._trackModifications&&b.enabled){const e=this._dependencies,t=this._currentEpoch;for(let s=0,n=e.length;s<n;s++){const r=e[s];r&&r._modifiedAtEpoch===t&&b.warn(!0,`Effect is reading a dependency (${b.getDebugName(r)||"unknown"}) that it just modified. Infinite loop may occur`)}}}}function Te(i,e={}){if(typeof i!="function")throw new T(l.EFFECT_MUST_BE_FUNCTION);const t=new Oe(i,e);return t.execute(),t}function Ae(i){if(typeof i!="function")throw new D("Batch callback must be a function");U.startBatch();try{return i()}finally{U.endBatch()}}exports.AsyncState=v;exports.AtomError=D;exports.ComputedError=C;exports.DEBUG_CONFIG=H;exports.DEBUG_RUNTIME=b;exports.EffectError=T;exports.POOL_CONFIG=ce;exports.SCHEDULER_CONFIG=R;exports.SchedulerError=F;exports.atom=Ie;exports.batch=Ae;exports.computed=Re;exports.effect=Te;exports.isAtom=se;exports.isComputed=De;exports.isEffect=Ce;exports.scheduler=U;exports.untracked=te;
|
|
2
2
|
//# sourceMappingURL=index.cjs.map
|