atomirx 0.0.4 → 0.0.5

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.
@@ -220,6 +220,180 @@ describe("withReady", () => {
220
220
  });
221
221
  });
222
222
 
223
+ describe("ready() with function", () => {
224
+ it("should return value when function returns non-null value", () => {
225
+ const result = select((context) => {
226
+ const ctx = context.use(withReady());
227
+ return ctx.ready(() => 42);
228
+ });
229
+
230
+ expect(result.value).toBe(42);
231
+ expect(result.error).toBeUndefined();
232
+ expect(result.promise).toBeUndefined();
233
+ });
234
+
235
+ it("should return zero from function", () => {
236
+ const result = select((context) => {
237
+ const ctx = context.use(withReady());
238
+ return ctx.ready(() => 0);
239
+ });
240
+
241
+ expect(result.value).toBe(0);
242
+ });
243
+
244
+ it("should return false from function", () => {
245
+ const result = select((context) => {
246
+ const ctx = context.use(withReady());
247
+ return ctx.ready(() => false);
248
+ });
249
+
250
+ expect(result.value).toBe(false);
251
+ });
252
+
253
+ it("should return empty string from function", () => {
254
+ const result = select((context) => {
255
+ const ctx = context.use(withReady());
256
+ return ctx.ready(() => "");
257
+ });
258
+
259
+ expect(result.value).toBe("");
260
+ });
261
+
262
+ it("should return object from function", () => {
263
+ const result = select((context) => {
264
+ const ctx = context.use(withReady());
265
+ return ctx.ready(() => ({ name: "test" }));
266
+ });
267
+
268
+ expect(result.value).toEqual({ name: "test" });
269
+ });
270
+
271
+ it("should throw never-resolve promise when function returns null", () => {
272
+ const result = select((context) => {
273
+ const ctx = context.use(withReady());
274
+ return ctx.ready(() => null);
275
+ });
276
+
277
+ expect(result.value).toBeUndefined();
278
+ expect(result.error).toBeUndefined();
279
+ expect(result.promise).toBeInstanceOf(Promise);
280
+ });
281
+
282
+ it("should throw never-resolve promise when function returns undefined", () => {
283
+ const result = select((context) => {
284
+ const ctx = context.use(withReady());
285
+ return ctx.ready(() => undefined);
286
+ });
287
+
288
+ expect(result.value).toBeUndefined();
289
+ expect(result.error).toBeUndefined();
290
+ expect(result.promise).toBeInstanceOf(Promise);
291
+ });
292
+
293
+ it("should throw error when function returns a pending promise", () => {
294
+ const pendingPromise = new Promise<string>(() => {
295
+ // Never resolves - stays pending
296
+ });
297
+
298
+ const result = select((context) => {
299
+ const ctx = context.use(withReady());
300
+ return ctx.ready(() => pendingPromise);
301
+ });
302
+
303
+ expect(result.value).toBeUndefined();
304
+ expect(result.error).toBeInstanceOf(Error);
305
+ expect((result.error as Error).message).toBe(
306
+ "ready(callback) overload does not support async callbacks. Use ready(atom, selector?) instead."
307
+ );
308
+ });
309
+
310
+ it("should throw error when function returns a resolved promise", () => {
311
+ const resolvedPromise = Promise.resolve("async result");
312
+
313
+ const result = select((context) => {
314
+ const ctx = context.use(withReady());
315
+ return ctx.ready(() => resolvedPromise);
316
+ });
317
+
318
+ expect(result.value).toBeUndefined();
319
+ expect(result.error).toBeInstanceOf(Error);
320
+ expect((result.error as Error).message).toBe(
321
+ "ready(callback) overload does not support async callbacks. Use ready(atom, selector?) instead."
322
+ );
323
+ });
324
+
325
+ it("should throw error when function returns a rejected promise", () => {
326
+ const testError = new Error("async error");
327
+ const rejectedPromise = Promise.reject(testError);
328
+
329
+ // Prevent unhandled rejection warning
330
+ rejectedPromise.catch(() => {});
331
+
332
+ const result = select((context) => {
333
+ const ctx = context.use(withReady());
334
+ return ctx.ready(() => rejectedPromise);
335
+ });
336
+
337
+ // Should throw the "async not supported" error, not the rejection error
338
+ expect(result.value).toBeUndefined();
339
+ expect(result.error).toBeInstanceOf(Error);
340
+ expect((result.error as Error).message).toBe(
341
+ "ready(callback) overload does not support async callbacks. Use ready(atom, selector?) instead."
342
+ );
343
+ });
344
+
345
+ it("should throw error when function returns a promise-like object", () => {
346
+ // Custom thenable (promise-like)
347
+ const thenable = {
348
+ then(resolve: (value: string) => void) {
349
+ resolve("thenable result");
350
+ },
351
+ };
352
+
353
+ const result = select((context) => {
354
+ const ctx = context.use(withReady());
355
+ return ctx.ready(() => thenable);
356
+ });
357
+
358
+ expect(result.value).toBeUndefined();
359
+ expect(result.error).toBeInstanceOf(Error);
360
+ expect((result.error as Error).message).toBe(
361
+ "ready(callback) overload does not support async callbacks. Use ready(atom, selector?) instead."
362
+ );
363
+ });
364
+
365
+ it("should propagate error when function throws synchronously", () => {
366
+ const testError = new Error("sync error");
367
+
368
+ const result = select((context) => {
369
+ const ctx = context.use(withReady());
370
+ return ctx.ready(() => {
371
+ throw testError;
372
+ });
373
+ });
374
+
375
+ expect(result.value).toBeUndefined();
376
+ expect(result.error).toBe(testError);
377
+ expect(result.promise).toBeUndefined();
378
+ });
379
+
380
+ it("should work with function that reads atoms", () => {
381
+ const count$ = atom(10);
382
+ const multiplier$ = atom(2);
383
+
384
+ const result = select((context) => {
385
+ const ctx = context.use(withReady());
386
+ return ctx.ready(() => {
387
+ const count = ctx.read(count$);
388
+ const mult = ctx.read(multiplier$);
389
+ return count * mult;
390
+ });
391
+ });
392
+
393
+ expect(result.value).toBe(20);
394
+ });
395
+ });
396
+
223
397
  describe("ready() with async selector", () => {
224
398
  it("should suspend when selector returns a pending promise", () => {
225
399
  const data$ = atom({ id: 1 });
@@ -1,7 +1,7 @@
1
1
  import { isPromiseLike } from "./isPromiseLike";
2
2
  import { trackPromise } from "./promiseCache";
3
3
  import { SelectContext } from "./select";
4
- import { Atom } from "./types";
4
+ import { AnyFunc, Atom } from "./types";
5
5
 
6
6
  /**
7
7
  * Extension interface that adds `ready()` method to SelectContext.
@@ -58,15 +58,90 @@ export interface WithReadySelectContext {
58
58
  atom: Atom<T>,
59
59
  selector: (current: Awaited<T>) => R
60
60
  ): R extends PromiseLike<any> ? never : Exclude<R, null | undefined>;
61
+
62
+ /**
63
+ * Execute a function and wait for its result to be non-null/non-undefined.
64
+ *
65
+ * If the function returns null/undefined, the computation suspends until
66
+ * re-executed with a non-null result.
67
+ *
68
+ * **IMPORTANT: Only use in `derived()` or `effect()` context**
69
+ *
70
+ * **NOTE:** This overload is designed for use with async combinators like
71
+ * `all()`, `race()`, `any()`, `settled()` where promises come from stable
72
+ * atom sources. It does NOT support dynamic promise creation (returning a
73
+ * new Promise from the callback). For async selectors that return promises,
74
+ * use `ready(atom$, selector?)` instead.
75
+ *
76
+ * @param fn - Synchronous function to execute and wait for
77
+ * @returns The non-null result (excludes null | undefined)
78
+ * @throws {Error} If the callback returns a Promise
79
+ *
80
+ * @example
81
+ * ```ts
82
+ * // Wait for a computed value to be ready
83
+ * const result$ = derived(({ ready, read }) => {
84
+ * const value = ready(() => computeExpensiveValue(read(input$)));
85
+ * return `Result: ${value}`;
86
+ * });
87
+ * ```
88
+ *
89
+ * @example
90
+ * ```ts
91
+ * // Use with async combinators (all, race, any, settled)
92
+ * const combined$ = derived(({ ready, all }) => {
93
+ * const [user, posts] = ready(() => all(user$, posts$));
94
+ * return { user, posts };
95
+ * });
96
+ * ```
97
+ *
98
+ * @example
99
+ * ```ts
100
+ * // For async selectors, use ready(atom$, selector?) instead:
101
+ * const data$ = derived(({ ready }) => {
102
+ * const data = ready(source$, (val) => fetchData(val.id));
103
+ * return data;
104
+ * });
105
+ * ```
106
+ */
107
+ ready<T>(
108
+ fn: () => T
109
+ ): T extends PromiseLike<any> ? never : Exclude<Awaited<T>, null | undefined>;
61
110
  }
62
111
 
63
112
  /**
64
113
  * Internal helper that suspends computation if value is null/undefined.
65
114
  */
66
- function waitForValue<T>(value: T): Exclude<T, null | undefined> {
115
+ function waitForValue<T>(value: T): any {
67
116
  if (value === undefined || value === null) {
68
117
  throw new Promise(() => {});
69
118
  }
119
+
120
+ // Handle async selectors: when the selector returns a Promise,
121
+ // we track its state and handle suspension/resolution accordingly
122
+ if (isPromiseLike(value)) {
123
+ const p = trackPromise(value);
124
+
125
+ // Promise is still pending - suspend computation by throwing
126
+ // the tracked promise. This enables React Suspense integration.
127
+ if (p.status === "pending") {
128
+ throw p.promise;
129
+ }
130
+
131
+ // Promise resolved successfully - return the resolved value.
132
+ // Note: This bypasses null/undefined checking for async results,
133
+ // allowing async selectors to return any value including null.
134
+ if (p.status === "fulfilled") {
135
+ return p.value;
136
+ }
137
+
138
+ // Promise rejected - propagate the error
139
+ throw p.error;
140
+ }
141
+
142
+ // For sync values (no selector, or selector returned sync value),
143
+ // check for null/undefined and suspend if not ready
144
+
70
145
  return value as Exclude<T, null | undefined>;
71
146
  }
72
147
 
@@ -92,34 +167,23 @@ export function withReady() {
92
167
  ): TContext & WithReadySelectContext => {
93
168
  return {
94
169
  ...context,
95
- ready: (atom: Atom<any>, selector?: (current: any) => any): any => {
96
- const value = context.read(atom);
97
- // we allow selector to return a promise, and wait for that promise if it is not resolved yet
98
- const selected = selector ? selector(value) : value;
99
- // Handle async selectors: when the selector returns a Promise,
100
- // we track its state and handle suspension/resolution accordingly
101
- if (isPromiseLike(selected)) {
102
- const p = trackPromise(selected);
103
-
104
- // Promise is still pending - suspend computation by throwing
105
- // the tracked promise. This enables React Suspense integration.
106
- if (p.status === "pending") {
107
- throw p.promise;
170
+ ready: (
171
+ atomOrFn: Atom<any> | AnyFunc,
172
+ selector?: (current: any) => any
173
+ ): any => {
174
+ if (typeof atomOrFn === "function") {
175
+ const value = atomOrFn();
176
+ if (isPromiseLike(value)) {
177
+ throw new Error(
178
+ "ready(callback) overload does not support async callbacks. Use ready(atom, selector?) instead."
179
+ );
108
180
  }
109
-
110
- // Promise resolved successfully - return the resolved value.
111
- // Note: This bypasses null/undefined checking for async results,
112
- // allowing async selectors to return any value including null.
113
- if (p.status === "fulfilled") {
114
- return p.value;
115
- }
116
-
117
- // Promise rejected - propagate the error
118
- throw p.error;
181
+ return waitForValue(value);
119
182
  }
183
+ const value = context.read(atomOrFn);
184
+ // we allow selector to return a promise, and wait for that promise if it is not resolved yet
185
+ const selected = selector ? selector(value) : value;
120
186
 
121
- // For sync values (no selector, or selector returned sync value),
122
- // check for null/undefined and suspend if not ready
123
187
  return waitForValue(selected);
124
188
  },
125
189
  };
package/src/index.ts CHANGED
@@ -42,7 +42,16 @@ export type {
42
42
  } from "./core/types";
43
43
 
44
44
  export { onCreateHook } from "./core/onCreateHook";
45
- export type { AtomCreateInfo, ModuleCreateInfo } from "./core/onCreateHook";
45
+ export type {
46
+ CreateInfo,
47
+ MutableInfo,
48
+ DerivedInfo,
49
+ EffectInfo,
50
+ ModuleInfo,
51
+ } from "./core/onCreateHook";
52
+
53
+ export { onErrorHook } from "./core/onErrorHook";
54
+ export type { ErrorInfo } from "./core/onErrorHook";
46
55
 
47
56
  export type {
48
57
  SelectContext,
@@ -1 +0,0 @@
1
- "use strict";var yt=Object.defineProperty;var _t=(e,t,r)=>t in e?yt(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r;var m=(e,t,r)=>_t(e,typeof t!="symbol"?t+"":t,r);function bt(e){const t=Object.assign(r=>()=>{const a=t.current;return t.current=r(a),()=>{t.current=a}},{current:e,override:r=>{t.current=r(t.current)},reset:()=>{t.current=e}});return t}function $t(e,t){const r=[];for(const a of e)r.push(a());try{return t()}finally{for(const a of r.reverse())a()}}const Y=Object.assign(bt,{use:$t}),j=Y(),mt=()=>{};class At{constructor(t){m(this,"_listeners");m(this,"_settledPayload");m(this,"_isSettled",!1);m(this,"size",()=>this._listeners.size);m(this,"settled",()=>this._isSettled);m(this,"forEach",t=>{this._listeners.forEach(t)});m(this,"on",(t,r)=>{let a;if(r===void 0)a=Array.isArray(t)?t:[t];else{const n=t,u=Array.isArray(r)?r:[r];a=[i=>{const f=n(i);if(f)for(let l=0;l<u.length;l++)u[l](f.value)}]}if(this._isSettled){const n=this._settledPayload;for(let u=0;u<a.length;u++)a[u](n);return mt}const s=this._listeners;for(let n=0;n<a.length;n++)s.add(a[n]);return()=>{for(let n=0;n<a.length;n++)s.delete(a[n])}});m(this,"emit",t=>{this._isSettled||this._doEmit(t,!1,!1)});m(this,"emitLifo",t=>{this._isSettled||this._doEmit(t,!1,!0)});m(this,"clear",()=>{this._listeners.clear()});m(this,"emitAndClear",t=>{this._isSettled||this._doEmit(t,!0,!1)});m(this,"emitAndClearLifo",t=>{this._isSettled||this._doEmit(t,!0,!0)});m(this,"settle",t=>{this._isSettled||(this._settledPayload=t,this._isSettled=!0,this._doEmit(t,!0,!1))});m(this,"_doEmit",(t,r,a)=>{const s=this._listeners,n=s.size;if(n===0)return;const u=Array.from(s);if(r&&s.clear(),a)for(let i=n-1;i>=0;i--)u[i](t);else for(let i=0;i<n;i++)u[i](t)});this._listeners=new Set(t)}}function B(e){return new At(e)}var K=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function wt(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}function Tt(){this.__data__=[],this.size=0}var St=Tt;function jt(e,t){return e===t||e!==e&&t!==t}var Xe=jt,Ct=Xe;function Et(e,t){for(var r=e.length;r--;)if(Ct(e[r][0],t))return r;return-1}var re=Et,Ot=re,Pt=Array.prototype,Dt=Pt.splice;function It(e){var t=this.__data__,r=Ot(t,e);if(r<0)return!1;var a=t.length-1;return r==a?t.pop():Dt.call(t,r,1),--this.size,!0}var Lt=It,xt=re;function Mt(e){var t=this.__data__,r=xt(t,e);return r<0?void 0:t[r][1]}var Ft=Mt,Gt=re;function Rt(e){return Gt(this.__data__,e)>-1}var qt=Rt,Ht=re;function Nt(e,t){var r=this.__data__,a=Ht(r,e);return a<0?(++this.size,r.push([e,t])):r[a][1]=t,this}var zt=Nt,Bt=St,Ut=Lt,kt=Ft,Kt=qt,Vt=zt;function F(e){var t=-1,r=e==null?0:e.length;for(this.clear();++t<r;){var a=e[t];this.set(a[0],a[1])}}F.prototype.clear=Bt;F.prototype.delete=Ut;F.prototype.get=kt;F.prototype.has=Kt;F.prototype.set=Vt;var ae=F,Wt=ae;function Jt(){this.__data__=new Wt,this.size=0}var Yt=Jt;function Xt(e){var t=this.__data__,r=t.delete(e);return this.size=t.size,r}var Zt=Xt;function Qt(e){return this.__data__.get(e)}var er=Qt;function tr(e){return this.__data__.has(e)}var rr=tr,ar=typeof K=="object"&&K&&K.Object===Object&&K,Ze=ar,nr=Ze,sr=typeof self=="object"&&self&&self.Object===Object&&self,ir=nr||sr||Function("return this")(),P=ir,or=P,ur=or.Symbol,_e=ur,we=_e,Qe=Object.prototype,cr=Qe.hasOwnProperty,lr=Qe.toString,z=we?we.toStringTag:void 0;function fr(e){var t=cr.call(e,z),r=e[z];try{e[z]=void 0;var a=!0}catch{}var s=lr.call(e);return a&&(t?e[z]=r:delete e[z]),s}var dr=fr,vr=Object.prototype,hr=vr.toString;function gr(e){return hr.call(e)}var pr=gr,Te=_e,yr=dr,_r=pr,br="[object Null]",$r="[object Undefined]",Se=Te?Te.toStringTag:void 0;function mr(e){return e==null?e===void 0?$r:br:Se&&Se in Object(e)?yr(e):_r(e)}var ne=mr;function Ar(e){var t=typeof e;return e!=null&&(t=="object"||t=="function")}var et=Ar,wr=ne,Tr=et,Sr="[object AsyncFunction]",jr="[object Function]",Cr="[object GeneratorFunction]",Er="[object Proxy]";function Or(e){if(!Tr(e))return!1;var t=wr(e);return t==jr||t==Cr||t==Sr||t==Er}var tt=Or,Pr=P,Dr=Pr["__core-js_shared__"],Ir=Dr,ue=Ir,je=function(){var e=/[^.]+$/.exec(ue&&ue.keys&&ue.keys.IE_PROTO||"");return e?"Symbol(src)_1."+e:""}();function Lr(e){return!!je&&je in e}var xr=Lr,Mr=Function.prototype,Fr=Mr.toString;function Gr(e){if(e!=null){try{return Fr.call(e)}catch{}try{return e+""}catch{}}return""}var rt=Gr,Rr=tt,qr=xr,Hr=et,Nr=rt,zr=/[\\^$.*+?()[\]{}|]/g,Br=/^\[object .+?Constructor\]$/,Ur=Function.prototype,kr=Object.prototype,Kr=Ur.toString,Vr=kr.hasOwnProperty,Wr=RegExp("^"+Kr.call(Vr).replace(zr,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");function Jr(e){if(!Hr(e)||qr(e))return!1;var t=Rr(e)?Wr:Br;return t.test(Nr(e))}var Yr=Jr;function Xr(e,t){return e==null?void 0:e[t]}var Zr=Xr,Qr=Yr,ea=Zr;function ta(e,t){var r=ea(e,t);return Qr(r)?r:void 0}var G=ta,ra=G,aa=P,na=ra(aa,"Map"),be=na,sa=G,ia=sa(Object,"create"),se=ia,Ce=se;function oa(){this.__data__=Ce?Ce(null):{},this.size=0}var ua=oa;function ca(e){var t=this.has(e)&&delete this.__data__[e];return this.size-=t?1:0,t}var la=ca,fa=se,da="__lodash_hash_undefined__",va=Object.prototype,ha=va.hasOwnProperty;function ga(e){var t=this.__data__;if(fa){var r=t[e];return r===da?void 0:r}return ha.call(t,e)?t[e]:void 0}var pa=ga,ya=se,_a=Object.prototype,ba=_a.hasOwnProperty;function $a(e){var t=this.__data__;return ya?t[e]!==void 0:ba.call(t,e)}var ma=$a,Aa=se,wa="__lodash_hash_undefined__";function Ta(e,t){var r=this.__data__;return this.size+=this.has(e)?0:1,r[e]=Aa&&t===void 0?wa:t,this}var Sa=Ta,ja=ua,Ca=la,Ea=pa,Oa=ma,Pa=Sa;function R(e){var t=-1,r=e==null?0:e.length;for(this.clear();++t<r;){var a=e[t];this.set(a[0],a[1])}}R.prototype.clear=ja;R.prototype.delete=Ca;R.prototype.get=Ea;R.prototype.has=Oa;R.prototype.set=Pa;var Da=R,Ee=Da,Ia=ae,La=be;function xa(){this.size=0,this.__data__={hash:new Ee,map:new(La||Ia),string:new Ee}}var Ma=xa;function Fa(e){var t=typeof e;return t=="string"||t=="number"||t=="symbol"||t=="boolean"?e!=="__proto__":e===null}var Ga=Fa,Ra=Ga;function qa(e,t){var r=e.__data__;return Ra(t)?r[typeof t=="string"?"string":"hash"]:r.map}var ie=qa,Ha=ie;function Na(e){var t=Ha(this,e).delete(e);return this.size-=t?1:0,t}var za=Na,Ba=ie;function Ua(e){return Ba(this,e).get(e)}var ka=Ua,Ka=ie;function Va(e){return Ka(this,e).has(e)}var Wa=Va,Ja=ie;function Ya(e,t){var r=Ja(this,e),a=r.size;return r.set(e,t),this.size+=r.size==a?0:1,this}var Xa=Ya,Za=Ma,Qa=za,en=ka,tn=Wa,rn=Xa;function q(e){var t=-1,r=e==null?0:e.length;for(this.clear();++t<r;){var a=e[t];this.set(a[0],a[1])}}q.prototype.clear=Za;q.prototype.delete=Qa;q.prototype.get=en;q.prototype.has=tn;q.prototype.set=rn;var at=q,an=ae,nn=be,sn=at,on=200;function un(e,t){var r=this.__data__;if(r instanceof an){var a=r.__data__;if(!nn||a.length<on-1)return a.push([e,t]),this.size=++r.size,this;r=this.__data__=new sn(a)}return r.set(e,t),this.size=r.size,this}var cn=un,ln=ae,fn=Yt,dn=Zt,vn=er,hn=rr,gn=cn;function H(e){var t=this.__data__=new ln(e);this.size=t.size}H.prototype.clear=fn;H.prototype.delete=dn;H.prototype.get=vn;H.prototype.has=hn;H.prototype.set=gn;var pn=H,yn="__lodash_hash_undefined__";function _n(e){return this.__data__.set(e,yn),this}var bn=_n;function $n(e){return this.__data__.has(e)}var mn=$n,An=at,wn=bn,Tn=mn;function X(e){var t=-1,r=e==null?0:e.length;for(this.__data__=new An;++t<r;)this.add(e[t])}X.prototype.add=X.prototype.push=wn;X.prototype.has=Tn;var Sn=X;function jn(e,t){for(var r=-1,a=e==null?0:e.length;++r<a;)if(t(e[r],r,e))return!0;return!1}var Cn=jn;function En(e,t){return e.has(t)}var On=En,Pn=Sn,Dn=Cn,In=On,Ln=1,xn=2;function Mn(e,t,r,a,s,n){var u=r&Ln,i=e.length,f=t.length;if(i!=f&&!(u&&f>i))return!1;var l=n.get(e),v=n.get(t);if(l&&v)return l==t&&v==e;var y=-1,o=!0,c=r&xn?new Pn:void 0;for(n.set(e,t),n.set(t,e);++y<i;){var d=e[y],h=t[y];if(a)var g=u?a(h,d,y,t,e,n):a(d,h,y,e,t,n);if(g!==void 0){if(g)continue;o=!1;break}if(c){if(!Dn(t,function(_,b){if(!In(c,b)&&(d===_||s(d,_,r,a,n)))return c.push(b)})){o=!1;break}}else if(!(d===h||s(d,h,r,a,n))){o=!1;break}}return n.delete(e),n.delete(t),o}var nt=Mn,Fn=P,Gn=Fn.Uint8Array,Rn=Gn;function qn(e){var t=-1,r=Array(e.size);return e.forEach(function(a,s){r[++t]=[s,a]}),r}var Hn=qn;function Nn(e){var t=-1,r=Array(e.size);return e.forEach(function(a){r[++t]=a}),r}var zn=Nn,Oe=_e,Pe=Rn,Bn=Xe,Un=nt,kn=Hn,Kn=zn,Vn=1,Wn=2,Jn="[object Boolean]",Yn="[object Date]",Xn="[object Error]",Zn="[object Map]",Qn="[object Number]",es="[object RegExp]",ts="[object Set]",rs="[object String]",as="[object Symbol]",ns="[object ArrayBuffer]",ss="[object DataView]",De=Oe?Oe.prototype:void 0,ce=De?De.valueOf:void 0;function is(e,t,r,a,s,n,u){switch(r){case ss:if(e.byteLength!=t.byteLength||e.byteOffset!=t.byteOffset)return!1;e=e.buffer,t=t.buffer;case ns:return!(e.byteLength!=t.byteLength||!n(new Pe(e),new Pe(t)));case Jn:case Yn:case Qn:return Bn(+e,+t);case Xn:return e.name==t.name&&e.message==t.message;case es:case rs:return e==t+"";case Zn:var i=kn;case ts:var f=a&Vn;if(i||(i=Kn),e.size!=t.size&&!f)return!1;var l=u.get(e);if(l)return l==t;a|=Wn,u.set(e,t);var v=Un(i(e),i(t),a,s,n,u);return u.delete(e),v;case as:if(ce)return ce.call(e)==ce.call(t)}return!1}var os=is;function us(e,t){for(var r=-1,a=t.length,s=e.length;++r<a;)e[s+r]=t[r];return e}var cs=us,ls=Array.isArray,$e=ls,fs=cs,ds=$e;function vs(e,t,r){var a=t(e);return ds(e)?a:fs(a,r(e))}var hs=vs;function gs(e,t){for(var r=-1,a=e==null?0:e.length,s=0,n=[];++r<a;){var u=e[r];t(u,r,e)&&(n[s++]=u)}return n}var ps=gs;function ys(){return[]}var _s=ys,bs=ps,$s=_s,ms=Object.prototype,As=ms.propertyIsEnumerable,Ie=Object.getOwnPropertySymbols,ws=Ie?function(e){return e==null?[]:(e=Object(e),bs(Ie(e),function(t){return As.call(e,t)}))}:$s,Ts=ws;function Ss(e,t){for(var r=-1,a=Array(e);++r<e;)a[r]=t(r);return a}var js=Ss;function Cs(e){return e!=null&&typeof e=="object"}var oe=Cs,Es=ne,Os=oe,Ps="[object Arguments]";function Ds(e){return Os(e)&&Es(e)==Ps}var Is=Ds,Le=Is,Ls=oe,st=Object.prototype,xs=st.hasOwnProperty,Ms=st.propertyIsEnumerable,Fs=Le(function(){return arguments}())?Le:function(e){return Ls(e)&&xs.call(e,"callee")&&!Ms.call(e,"callee")},Gs=Fs,Z={exports:{}};function Rs(){return!1}var qs=Rs;Z.exports;(function(e,t){var r=P,a=qs,s=t&&!t.nodeType&&t,n=s&&!0&&e&&!e.nodeType&&e,u=n&&n.exports===s,i=u?r.Buffer:void 0,f=i?i.isBuffer:void 0,l=f||a;e.exports=l})(Z,Z.exports);var it=Z.exports,Hs=9007199254740991,Ns=/^(?:0|[1-9]\d*)$/;function zs(e,t){var r=typeof e;return t=t??Hs,!!t&&(r=="number"||r!="symbol"&&Ns.test(e))&&e>-1&&e%1==0&&e<t}var Bs=zs,Us=9007199254740991;function ks(e){return typeof e=="number"&&e>-1&&e%1==0&&e<=Us}var ot=ks,Ks=ne,Vs=ot,Ws=oe,Js="[object Arguments]",Ys="[object Array]",Xs="[object Boolean]",Zs="[object Date]",Qs="[object Error]",ei="[object Function]",ti="[object Map]",ri="[object Number]",ai="[object Object]",ni="[object RegExp]",si="[object Set]",ii="[object String]",oi="[object WeakMap]",ui="[object ArrayBuffer]",ci="[object DataView]",li="[object Float32Array]",fi="[object Float64Array]",di="[object Int8Array]",vi="[object Int16Array]",hi="[object Int32Array]",gi="[object Uint8Array]",pi="[object Uint8ClampedArray]",yi="[object Uint16Array]",_i="[object Uint32Array]",p={};p[li]=p[fi]=p[di]=p[vi]=p[hi]=p[gi]=p[pi]=p[yi]=p[_i]=!0;p[Js]=p[Ys]=p[ui]=p[Xs]=p[ci]=p[Zs]=p[Qs]=p[ei]=p[ti]=p[ri]=p[ai]=p[ni]=p[si]=p[ii]=p[oi]=!1;function bi(e){return Ws(e)&&Vs(e.length)&&!!p[Ks(e)]}var $i=bi;function mi(e){return function(t){return e(t)}}var Ai=mi,Q={exports:{}};Q.exports;(function(e,t){var r=Ze,a=t&&!t.nodeType&&t,s=a&&!0&&e&&!e.nodeType&&e,n=s&&s.exports===a,u=n&&r.process,i=function(){try{var f=s&&s.require&&s.require("util").types;return f||u&&u.binding&&u.binding("util")}catch{}}();e.exports=i})(Q,Q.exports);var wi=Q.exports,Ti=$i,Si=Ai,xe=wi,Me=xe&&xe.isTypedArray,ji=Me?Si(Me):Ti,ut=ji,Ci=js,Ei=Gs,Oi=$e,Pi=it,Di=Bs,Ii=ut,Li=Object.prototype,xi=Li.hasOwnProperty;function Mi(e,t){var r=Oi(e),a=!r&&Ei(e),s=!r&&!a&&Pi(e),n=!r&&!a&&!s&&Ii(e),u=r||a||s||n,i=u?Ci(e.length,String):[],f=i.length;for(var l in e)(t||xi.call(e,l))&&!(u&&(l=="length"||s&&(l=="offset"||l=="parent")||n&&(l=="buffer"||l=="byteLength"||l=="byteOffset")||Di(l,f)))&&i.push(l);return i}var Fi=Mi,Gi=Object.prototype;function Ri(e){var t=e&&e.constructor,r=typeof t=="function"&&t.prototype||Gi;return e===r}var qi=Ri;function Hi(e,t){return function(r){return e(t(r))}}var Ni=Hi,zi=Ni,Bi=zi(Object.keys,Object),Ui=Bi,ki=qi,Ki=Ui,Vi=Object.prototype,Wi=Vi.hasOwnProperty;function Ji(e){if(!ki(e))return Ki(e);var t=[];for(var r in Object(e))Wi.call(e,r)&&r!="constructor"&&t.push(r);return t}var Yi=Ji,Xi=tt,Zi=ot;function Qi(e){return e!=null&&Zi(e.length)&&!Xi(e)}var eo=Qi,to=Fi,ro=Yi,ao=eo;function no(e){return ao(e)?to(e):ro(e)}var so=no,io=hs,oo=Ts,uo=so;function co(e){return io(e,uo,oo)}var lo=co,Fe=lo,fo=1,vo=Object.prototype,ho=vo.hasOwnProperty;function go(e,t,r,a,s,n){var u=r&fo,i=Fe(e),f=i.length,l=Fe(t),v=l.length;if(f!=v&&!u)return!1;for(var y=f;y--;){var o=i[y];if(!(u?o in t:ho.call(t,o)))return!1}var c=n.get(e),d=n.get(t);if(c&&d)return c==t&&d==e;var h=!0;n.set(e,t),n.set(t,e);for(var g=u;++y<f;){o=i[y];var _=e[o],b=t[o];if(a)var $=u?a(b,_,o,t,e,n):a(_,b,o,e,t,n);if(!($===void 0?_===b||s(_,b,r,a,n):$)){h=!1;break}g||(g=o=="constructor")}if(h&&!g){var A=e.constructor,D=t.constructor;A!=D&&"constructor"in e&&"constructor"in t&&!(typeof A=="function"&&A instanceof A&&typeof D=="function"&&D instanceof D)&&(h=!1)}return n.delete(e),n.delete(t),h}var po=go,yo=G,_o=P,bo=yo(_o,"DataView"),$o=bo,mo=G,Ao=P,wo=mo(Ao,"Promise"),To=wo,So=G,jo=P,Co=So(jo,"Set"),Eo=Co,Oo=G,Po=P,Do=Oo(Po,"WeakMap"),Io=Do,fe=$o,de=be,ve=To,he=Eo,ge=Io,ct=ne,N=rt,Ge="[object Map]",Lo="[object Object]",Re="[object Promise]",qe="[object Set]",He="[object WeakMap]",Ne="[object DataView]",xo=N(fe),Mo=N(de),Fo=N(ve),Go=N(he),Ro=N(ge),I=ct;(fe&&I(new fe(new ArrayBuffer(1)))!=Ne||de&&I(new de)!=Ge||ve&&I(ve.resolve())!=Re||he&&I(new he)!=qe||ge&&I(new ge)!=He)&&(I=function(e){var t=ct(e),r=t==Lo?e.constructor:void 0,a=r?N(r):"";if(a)switch(a){case xo:return Ne;case Mo:return Ge;case Fo:return Re;case Go:return qe;case Ro:return He}return t});var qo=I,le=pn,Ho=nt,No=os,zo=po,ze=qo,Be=$e,Ue=it,Bo=ut,Uo=1,ke="[object Arguments]",Ke="[object Array]",V="[object Object]",ko=Object.prototype,Ve=ko.hasOwnProperty;function Ko(e,t,r,a,s,n){var u=Be(e),i=Be(t),f=u?Ke:ze(e),l=i?Ke:ze(t);f=f==ke?V:f,l=l==ke?V:l;var v=f==V,y=l==V,o=f==l;if(o&&Ue(e)){if(!Ue(t))return!1;u=!0,v=!1}if(o&&!v)return n||(n=new le),u||Bo(e)?Ho(e,t,r,a,s,n):No(e,t,f,r,a,s,n);if(!(r&Uo)){var c=v&&Ve.call(e,"__wrapped__"),d=y&&Ve.call(t,"__wrapped__");if(c||d){var h=c?e.value():e,g=d?t.value():t;return n||(n=new le),s(h,g,r,a,n)}}return o?(n||(n=new le),zo(e,t,r,a,s,n)):!1}var Vo=Ko,Wo=Vo,We=oe;function lt(e,t,r,a,s){return e===t?!0:e==null||t==null||!We(e)&&!We(t)?e!==e&&t!==t:Wo(e,t,r,a,lt,s)}var Jo=lt,Yo=Jo;function Xo(e,t){return Yo(e,t)}var Zo=Xo;const Qo=wt(Zo);function eu(e,t){return Object.is(e,t)}function U(e,t,r=Object.is){if(Object.is(e,t))return!0;if(typeof e!="object"||e===null||typeof t!="object"||t===null)return!1;const a=Object.keys(e),s=Object.keys(t);if(a.length!==s.length)return!1;for(const n of a)if(!Object.prototype.hasOwnProperty.call(t,n)||!r(e[n],t[n]))return!1;return!0}function me(e,t){return U(e,t,U)}function tu(e,t){return U(e,t,me)}const ru=Qo;function Ae(e){return!e||e==="strict"?eu:e==="shallow"?U:e==="shallow2"?me:e==="shallow3"?tu:e==="deep"?ru:e}function Je(e){const t=e;let r=e;return Object.assign((...a)=>r(...a),{getOriginal:()=>t,getCurrent:()=>r,setCurrent(a){r=a}})}function au(e){return typeof e=="function"&&"getOriginal"in e&&"getCurrent"in e&&"setCurrent"in e}function nu(e,t,r){return e?typeof t=="function"?au(e.value)?(e.value.setCurrent(t),[e.value,!0]):[Je(t),!1]:t&&t instanceof Date?e.value&&e.value instanceof Date&&t.getTime()===e.value.getTime()?[e.value,!0]:[t,!1]:r(e.value,t)?[e.value,!0]:[t,!1]:typeof t=="function"?[Je(t),!1]:[t,!1]}const ee=Y(e=>e()),te=Symbol.for("atomirx.atom"),pe=Symbol.for("atomirx.derived");function k(e){return Object.assign(e,{use(t){const r=t(e);return r?typeof r=="object"||typeof r=="function"?"use"in r?r:k(r):r:e}})}function w(e){return e!==null&&typeof e=="object"&&"then"in e&&typeof e.then=="function"}const ye=new WeakMap;function Ye(e){return ye.get(e)}function W(e,t){if(t.length===1){if(e==="allSettled"){const a=Promise.allSettled(t).then(()=>{});return ye.set(a,{type:e,promises:t}),a}return t[0]}const r=Promise[e](t);return r.catch(()=>{}),ye.set(r,{type:e,promises:t}),r}function su(e,t){if(e===t)return!0;if(!e||!t)return!1;const r=Ye(e),a=Ye(t);return!!r&&!!a&&me(r,a)}const M=new WeakMap;function C(e){const t=M.get(e);if(t)return t;const r={status:"pending",promise:e};return M.set(e,r),e.then(a=>{const s=M.get(e);(s==null?void 0:s.status)==="pending"&&M.set(e,{status:"fulfilled",value:a})},a=>{const s=M.get(e);(s==null?void 0:s.status)==="pending"&&M.set(e,{status:"rejected",error:a})}),r}function iu(e){if(!w(e))return e;const r=C(e);switch(r.status){case"pending":throw r.promise;case"rejected":throw r.error;case"fulfilled":return r.value}}function ou(e){return w(e)?C(e).status==="pending":!1}function uu(e){return w(e)?C(e).status==="fulfilled":!1}function cu(e){return w(e)?C(e).status==="rejected":!1}function lu(e,t={}){var _,b;const r=B(),a=Ae(t.equals);let s=null;const n=B(),u=$=>{s&&(s.abort($),s=null),n.emitAndClear()},i=()=>(s=new AbortController,k({signal:s.signal,onCleanup:n.on})),f=typeof e=="function";let v=f?e(i()):e,y=!1;w(v)&&C(v);const o=()=>{r.forEach($=>{ee.current($)})},c=$=>{let A;typeof $=="function"?A=$(v):A=$,!a(A,v)&&(u("value changed"),v=A,y=!0,w(v)&&C(v),o())},d=()=>{u("reset");const $=f?e(i()):e;w($)&&C($);const A=!a($,v);v=$,y=!1,A&&o()},h=()=>y,g=k({[te]:!0,meta:t.meta,get(){return v},use:void 0,set:c,reset:d,dirty:h,on:r.on});return(b=j.current)==null||b.call(j,{type:"mutable",key:(_=t.meta)==null?void 0:_.key,meta:t.meta,atom:g}),g}function fu(e){return e}let J=0;function ft(e){if(J++,J===1){let t=new Set;const r=a=>{t.add(a)};try{return Y.use([ee(()=>r)],e)}finally{J--,Y.use([ee(()=>r)],()=>{for(;t.size>0;){const a=t;t=new Set;for(const s of a)s()}})}}try{return e()}finally{J--}}function du(e,t){let r,a;const s=i=>{i&&typeof i=="object"&&"dispose"in i&&typeof i.dispose=="function"&&i.dispose()},n=()=>{s(r),r=void 0};return Object.assign(()=>{var i;return r||(a?r=a(e):r=e(),(i=j.current)==null||i.call(j,{type:"module",key:t==null?void 0:t.key,meta:t==null?void 0:t.meta,module:r})),r},{key:t==null?void 0:t.key,override:i=>{if(r!==void 0)throw new Error("Cannot override after initialization. Call override() before accessing the service.");a=i},reset:()=>{a=void 0,n()},invalidate:()=>{a=void 0,n()},isOverridden:()=>a!==void 0,isInitialized:()=>r!==void 0})}function dt(e){return e!==null&&typeof e=="object"&&te in e&&e[te]===!0}function vt(e){return e!==null&&typeof e=="object"&&pe in e&&e[pe]===!0}function L(e){if(vt(e))return e.state();const t=e.get();if(!w(t))return{status:"ready",value:t};const r=C(t);switch(r.status){case"fulfilled":return{status:"ready",value:r.value};case"rejected":return{status:"error",error:r.error};case"pending":return{status:"loading",promise:r.promise}}}const vu=typeof AggregateError<"u"?AggregateError:class extends Error{constructor(r,a){super(a);m(this,"errors");this.name="AggregateError",this.errors=r}};class hu extends Error{constructor(r,a="All atoms rejected"){super(a);m(this,"errors");this.name="AllAtomsRejectedError",this.errors=r}}function ht(e){const t=new Set;let r=!0;const a=o=>{if(!r)throw new Error(`${o}() was called outside of the selection context. This usually happens when calling context methods in async callbacks (setTimeout, Promise.then, etc.). All atom reads must happen synchronously during selector execution. For async access, use atom.get() directly (e.g., myMutableAtom$.get() or await myDerivedAtom$.get()).`)},s=o=>{a("read"),t.add(o);const c=L(o);switch(c.status){case"ready":return c.value;case"error":throw c.error;case"loading":throw c.promise}},n=o=>{a("all");const c=[],d=[];for(const h of o){t.add(h);const g=L(h);switch(g.status){case"ready":c.push(g.value);break;case"error":throw g.error;case"loading":d.push(g.promise);break}}if(d.length>0)throw W("all",d);return c},u=o=>{a("race");const c=[],d=Object.entries(o);for(const[h,g]of d){t.add(g);const _=L(g);switch(_.status){case"ready":return{key:h,value:_.value};case"error":throw _.error;case"loading":c.push(_.promise);break}}throw c.length>0?W("race",c):new Error("race() called with no atoms")},i=o=>{a("any");const c=[],d=[],h=Object.entries(o);for(const[g,_]of h){t.add(_);const b=L(_);switch(b.status){case"ready":return{key:g,value:b.value};case"error":c.push(b.error);break;case"loading":d.push(b.promise);break}}throw d.length>0?W("race",d):new vu(c,"All atoms rejected")},f=o=>{a("settled");const c=[],d=[];for(const h of o){t.add(h);const g=L(h);switch(g.status){case"ready":c.push({status:"ready",value:g.value});break;case"error":c.push({status:"error",error:g.error});break;case"loading":d.push(g.promise);break}}if(d.length>0)throw W("allSettled",d);return c},l=o=>{a("safe");try{return[void 0,o()]}catch(c){if(w(c))throw c;return[c,void 0]}};function v(o){if(a("state"),dt(o)){t.add(o);const c=L(o);switch(c.status){case"ready":return{status:"ready",value:c.value,error:void 0};case"error":return{status:"error",value:void 0,error:c.error};case"loading":return{status:"loading",value:void 0,error:void 0}}}try{return{status:"ready",value:o(),error:void 0}}catch(c){return w(c)?{status:"loading",value:void 0,error:void 0}:{status:"error",value:void 0,error:c}}}const y=k({read:s,all:n,any:i,race:u,settled:f,safe:l,state:v});try{const o=e(y);if(w(o))throw new Error("select() selector must return a synchronous value, not a Promise. For async data, create an async atom with atom(Promise) and use get() to read it.");return{value:o,error:void 0,promise:void 0,dependencies:t}}catch(o){return w(o)?{value:void 0,error:void 0,promise:o,dependencies:t}:{value:void 0,error:o,promise:void 0,dependencies:t}}finally{r=!1}}function gu(e){if(e==null)throw new Promise(()=>{});return e}function pu(){return e=>({...e,ready:(t,r)=>{const a=e.read(t),s=r?r(a):a;if(w(s)){const n=C(s);if(n.status==="pending")throw n.promise;if(n.status==="fulfilled")return n.value;throw n.error}return gu(s)}})}function gt(e,t={}){var A,D;const r=B(),a=Ae(t.equals),s="fallback"in t,n=t.fallback;let u,i,f=null,l=!1,v=!1,y=0,o=null,c=null;const d=new Map,h=()=>{r.forEach(T=>{ee.current(T)})},g=T=>{for(const[E,x]of d)T.has(E)||(x(),d.delete(E));for(const E of T)if(!d.has(E)){const x=E.on(()=>{_()});d.set(E,x)}},_=(T=!1)=>{const E=++y;v=!0,i=void 0,o||(f=new Promise((O,S)=>{o=O,c=S}));const x=()=>{const O=ht(S=>e(S.use(pu())));if(g(O.dependencies),O.promise)T||h(),O.promise.then(()=>{y===E&&x()},S=>{y===E&&(v=!1,i=S,c==null||c(S),o=null,c=null,h())});else if(O.error!==void 0)v=!1,i=O.error,c==null||c(O.error),o=null,c=null,T||h();else{const S=O.value,pt=!u;v=!1,i=void 0,(!u||!a(S,u.value))&&(u={value:S},(pt||!T)&&h()),o==null||o(S),o=null,c=null}};return x(),f},b=()=>{l||(l=!0,_(!0))},$={[te]:!0,[pe]:!0,meta:t.meta,get(){return b(),f},get staleValue(){if(b(),u)return u.value;if(s)return n},state(){return b(),v?{status:"loading",promise:f}:i!==void 0?{status:"error",error:i}:u?{status:"ready",value:u.value}:{status:"loading",promise:f}},refresh(){l?_():b()},on(T){return b(),r.on(T)}};return(D=j.current)==null||D.call(j,{type:"derived",key:(A=t.meta)==null?void 0:A.key,meta:t.meta,atom:$}),$}function yu(e,t){let r=!1;const a=B();return gt(n=>{if(a.emitAndClear(),r)return;const u={...n,something:!0,onCleanup:a.on};ft(()=>e(u))}).get().catch(()=>{}),()=>{r||(r=!0,a.emitAndClear())}}exports.AllAtomsRejectedError=hu;exports.atom=lu;exports.batch=ft;exports.define=du;exports.derived=gt;exports.effect=yu;exports.emitter=B;exports.getAtomState=L;exports.isAtom=dt;exports.isDerived=vt;exports.isFulfilled=uu;exports.isPending=ou;exports.isPromiseLike=w;exports.isRejected=cu;exports.onCreateHook=j;exports.promisesEqual=su;exports.readonly=fu;exports.resolveEquality=Ae;exports.select=ht;exports.shallowEqual=U;exports.trackPromise=C;exports.tryStabilize=nu;exports.unwrap=iu;exports.withUse=k;