UNPKG

31.8 kBJavaScriptView Raw
1System.register(['react', 'jotai/vanilla'], (function (exports) {
2 'use strict';
3 var createContext, useState, useEffect, useRef, createElement, useContext, useReducer, useDebugValue, useCallback, atom$1;
4 return {
5 setters: [function (module) {
6 createContext = module.createContext;
7 useState = module.useState;
8 useEffect = module.useEffect;
9 useRef = module.useRef;
10 createElement = module.createElement;
11 useContext = module.useContext;
12 useReducer = module.useReducer;
13 useDebugValue = module.useDebugValue;
14 useCallback = module.useCallback;
15 }, function (module) {
16 atom$1 = module.atom;
17 }],
18 execute: (function () {
19
20 exports({
21 atom: atom,
22 useAtom: useAtom,
23 useAtomValue: useAtomValue,
24 useSetAtom: useSetAtom
25 });
26
27 const SUSPENSE_PROMISE = Symbol();
28 const isSuspensePromise = (promise) => !!promise[SUSPENSE_PROMISE];
29 const isSuspensePromiseAlreadyCancelled = (suspensePromise) => !suspensePromise[SUSPENSE_PROMISE].c;
30 const cancelSuspensePromise = (suspensePromise) => {
31 var _a;
32 const { b: basePromise, c: cancelPromise } = suspensePromise[SUSPENSE_PROMISE];
33 if (cancelPromise) {
34 cancelPromise();
35 (_a = promiseAbortMap.get(basePromise)) == null ? void 0 : _a();
36 }
37 };
38 const isEqualSuspensePromise = (oldSuspensePromise, newSuspensePromise) => {
39 const oldOriginalPromise = oldSuspensePromise[SUSPENSE_PROMISE].o;
40 const newOriginalPromise = newSuspensePromise[SUSPENSE_PROMISE].o;
41 return oldOriginalPromise === newOriginalPromise || oldSuspensePromise === newOriginalPromise || isSuspensePromise(oldOriginalPromise) && isEqualSuspensePromise(oldOriginalPromise, newSuspensePromise);
42 };
43 const createSuspensePromise = (basePromise, promise) => {
44 const suspensePromiseExtra = {
45 b: basePromise,
46 o: promise,
47 c: null
48 };
49 const suspensePromise = new Promise((resolve) => {
50 suspensePromiseExtra.c = () => {
51 suspensePromiseExtra.c = null;
52 resolve();
53 };
54 promise.finally(suspensePromiseExtra.c);
55 });
56 suspensePromise[SUSPENSE_PROMISE] = suspensePromiseExtra;
57 return suspensePromise;
58 };
59 const copySuspensePromise = (suspensePromise) => createSuspensePromise(
60 suspensePromise[SUSPENSE_PROMISE].b,
61 suspensePromise[SUSPENSE_PROMISE].o
62 );
63 const promiseAbortMap = /* @__PURE__ */ new WeakMap();
64 const registerPromiseAbort = exports('SECRET_INTERNAL_registerPromiseAbort', (basePromise, abort) => {
65 promiseAbortMap.set(basePromise, abort);
66 });
67
68 const hasInitialValue = (atom) => "init" in atom;
69 const READ_ATOM = "r";
70 const WRITE_ATOM = "w";
71 const COMMIT_ATOM = "c";
72 const SUBSCRIBE_ATOM = "s";
73 const RESTORE_ATOMS = "h";
74 const DEV_SUBSCRIBE_STATE = "n";
75 const DEV_GET_MOUNTED_ATOMS = "l";
76 const DEV_GET_ATOM_STATE = "a";
77 const DEV_GET_MOUNTED = "m";
78 const createStore = (initialValues) => {
79 const committedAtomStateMap = /* @__PURE__ */ new WeakMap();
80 const mountedMap = /* @__PURE__ */ new WeakMap();
81 const pendingMap = /* @__PURE__ */ new Map();
82 let stateListeners;
83 let mountedAtoms;
84 {
85 stateListeners = /* @__PURE__ */ new Set();
86 mountedAtoms = /* @__PURE__ */ new Set();
87 }
88 if (initialValues) {
89 for (const [atom, value] of initialValues) {
90 const atomState = {
91 v: value,
92 r: 0,
93 y: true,
94 d: /* @__PURE__ */ new Map()
95 };
96 {
97 Object.freeze(atomState);
98 if (!hasInitialValue(atom)) {
99 console.warn(
100 "Found initial value for derived atom which can cause unexpected behavior",
101 atom
102 );
103 }
104 }
105 committedAtomStateMap.set(atom, atomState);
106 }
107 }
108 const suspensePromiseCacheMap = /* @__PURE__ */ new WeakMap();
109 const addSuspensePromiseToCache = (version, atom, suspensePromise) => {
110 let cache = suspensePromiseCacheMap.get(atom);
111 if (!cache) {
112 cache = /* @__PURE__ */ new Map();
113 suspensePromiseCacheMap.set(atom, cache);
114 }
115 suspensePromise.then(() => {
116 if (cache.get(version) === suspensePromise) {
117 cache.delete(version);
118 if (!cache.size) {
119 suspensePromiseCacheMap.delete(atom);
120 }
121 }
122 });
123 cache.set(version, suspensePromise);
124 };
125 const cancelAllSuspensePromiseInCache = (atom) => {
126 const versionSet = /* @__PURE__ */ new Set();
127 const cache = suspensePromiseCacheMap.get(atom);
128 if (cache) {
129 suspensePromiseCacheMap.delete(atom);
130 cache.forEach((suspensePromise, version) => {
131 cancelSuspensePromise(suspensePromise);
132 versionSet.add(version);
133 });
134 }
135 return versionSet;
136 };
137 const versionedAtomStateMapMap = /* @__PURE__ */ new WeakMap();
138 const getVersionedAtomStateMap = (version) => {
139 let versionedAtomStateMap = versionedAtomStateMapMap.get(version);
140 if (!versionedAtomStateMap) {
141 versionedAtomStateMap = /* @__PURE__ */ new Map();
142 versionedAtomStateMapMap.set(version, versionedAtomStateMap);
143 }
144 return versionedAtomStateMap;
145 };
146 const getAtomState = (version, atom) => {
147 if (version) {
148 const versionedAtomStateMap = getVersionedAtomStateMap(version);
149 let atomState = versionedAtomStateMap.get(atom);
150 if (!atomState) {
151 atomState = getAtomState(version.p, atom);
152 if (atomState && "p" in atomState && isSuspensePromiseAlreadyCancelled(atomState.p)) {
153 atomState = void 0;
154 }
155 if (atomState) {
156 versionedAtomStateMap.set(atom, atomState);
157 }
158 }
159 return atomState;
160 }
161 return committedAtomStateMap.get(atom);
162 };
163 const setAtomState = (version, atom, atomState) => {
164 {
165 Object.freeze(atomState);
166 }
167 if (version) {
168 const versionedAtomStateMap = getVersionedAtomStateMap(version);
169 versionedAtomStateMap.set(atom, atomState);
170 } else {
171 const prevAtomState = committedAtomStateMap.get(atom);
172 committedAtomStateMap.set(atom, atomState);
173 if (!pendingMap.has(atom)) {
174 pendingMap.set(atom, prevAtomState);
175 }
176 }
177 };
178 const createReadDependencies = (version, prevReadDependencies = /* @__PURE__ */ new Map(), dependencies) => {
179 if (!dependencies) {
180 return prevReadDependencies;
181 }
182 const readDependencies = /* @__PURE__ */ new Map();
183 let changed = false;
184 dependencies.forEach((atom) => {
185 var _a;
186 const revision = ((_a = getAtomState(version, atom)) == null ? void 0 : _a.r) || 0;
187 readDependencies.set(atom, revision);
188 if (prevReadDependencies.get(atom) !== revision) {
189 changed = true;
190 }
191 });
192 if (prevReadDependencies.size === readDependencies.size && !changed) {
193 return prevReadDependencies;
194 }
195 return readDependencies;
196 };
197 const setAtomValue = (version, atom, value, dependencies, suspensePromise) => {
198 const atomState = getAtomState(version, atom);
199 if (atomState) {
200 if (suspensePromise && (!("p" in atomState) || !isEqualSuspensePromise(atomState.p, suspensePromise))) {
201 return atomState;
202 }
203 if ("p" in atomState) {
204 cancelSuspensePromise(atomState.p);
205 }
206 }
207 const nextAtomState = {
208 v: value,
209 r: (atomState == null ? void 0 : atomState.r) || 0,
210 y: true,
211 d: createReadDependencies(version, atomState == null ? void 0 : atomState.d, dependencies)
212 };
213 let changed = !(atomState == null ? void 0 : atomState.y);
214 if (!atomState || !("v" in atomState) || !Object.is(atomState.v, value)) {
215 changed = true;
216 ++nextAtomState.r;
217 if (nextAtomState.d.has(atom)) {
218 nextAtomState.d = new Map(nextAtomState.d).set(atom, nextAtomState.r);
219 }
220 } else if (nextAtomState.d !== atomState.d && (nextAtomState.d.size !== atomState.d.size || !Array.from(nextAtomState.d.keys()).every((a) => atomState.d.has(a)))) {
221 changed = true;
222 Promise.resolve().then(() => {
223 flushPending(version);
224 });
225 }
226 if (atomState && !changed) {
227 return atomState;
228 }
229 setAtomState(version, atom, nextAtomState);
230 return nextAtomState;
231 };
232 const setAtomReadError = (version, atom, error, dependencies, suspensePromise) => {
233 const atomState = getAtomState(version, atom);
234 if (atomState) {
235 if (suspensePromise && (!("p" in atomState) || !isEqualSuspensePromise(atomState.p, suspensePromise))) {
236 return atomState;
237 }
238 if ("p" in atomState) {
239 cancelSuspensePromise(atomState.p);
240 }
241 }
242 const nextAtomState = {
243 e: error,
244 r: ((atomState == null ? void 0 : atomState.r) || 0) + 1,
245 y: true,
246 d: createReadDependencies(version, atomState == null ? void 0 : atomState.d, dependencies)
247 };
248 setAtomState(version, atom, nextAtomState);
249 return nextAtomState;
250 };
251 const setAtomSuspensePromise = (version, atom, suspensePromise, dependencies) => {
252 const atomState = getAtomState(version, atom);
253 if (atomState && "p" in atomState) {
254 if (isEqualSuspensePromise(atomState.p, suspensePromise) && !isSuspensePromiseAlreadyCancelled(atomState.p)) {
255 if (!atomState.y) {
256 return { ...atomState, y: true };
257 }
258 return atomState;
259 }
260 cancelSuspensePromise(atomState.p);
261 }
262 addSuspensePromiseToCache(version, atom, suspensePromise);
263 const nextAtomState = {
264 p: suspensePromise,
265 r: ((atomState == null ? void 0 : atomState.r) || 0) + 1,
266 y: true,
267 d: createReadDependencies(version, atomState == null ? void 0 : atomState.d, dependencies)
268 };
269 setAtomState(version, atom, nextAtomState);
270 return nextAtomState;
271 };
272 const setAtomPromiseOrValue = (version, atom, promiseOrValue, dependencies) => {
273 if (promiseOrValue instanceof Promise) {
274 const suspensePromise = createSuspensePromise(
275 promiseOrValue,
276 promiseOrValue.then((value) => {
277 setAtomValue(version, atom, value, dependencies, suspensePromise);
278 }).catch((e) => {
279 if (e instanceof Promise) {
280 if (isSuspensePromise(e)) {
281 return e.then(() => {
282 readAtomState(version, atom, true);
283 });
284 }
285 return e;
286 }
287 setAtomReadError(version, atom, e, dependencies, suspensePromise);
288 })
289 );
290 return setAtomSuspensePromise(
291 version,
292 atom,
293 suspensePromise,
294 dependencies
295 );
296 }
297 return setAtomValue(
298 version,
299 atom,
300 promiseOrValue,
301 dependencies
302 );
303 };
304 const setAtomInvalidated = (version, atom) => {
305 const atomState = getAtomState(version, atom);
306 if (atomState) {
307 const nextAtomState = {
308 ...atomState,
309 y: false
310 };
311 setAtomState(version, atom, nextAtomState);
312 } else {
313 console.warn("[Bug] could not invalidate non existing atom", atom);
314 }
315 };
316 const readAtomState = (version, atom, force) => {
317 if (!force) {
318 const atomState = getAtomState(version, atom);
319 if (atomState) {
320 if (atomState.y && "p" in atomState && !isSuspensePromiseAlreadyCancelled(atomState.p)) {
321 return atomState;
322 }
323 atomState.d.forEach((_, a) => {
324 if (a !== atom) {
325 if (!mountedMap.has(a)) {
326 readAtomState(version, a);
327 } else {
328 const aState = getAtomState(version, a);
329 if (aState && !aState.y) {
330 readAtomState(version, a);
331 }
332 }
333 }
334 });
335 if (Array.from(atomState.d).every(([a, r]) => {
336 const aState = getAtomState(version, a);
337 return aState && !("p" in aState) && aState.r === r;
338 })) {
339 if (!atomState.y) {
340 return { ...atomState, y: true };
341 }
342 return atomState;
343 }
344 }
345 }
346 const dependencies = /* @__PURE__ */ new Set();
347 try {
348 const promiseOrValue = atom.read((a) => {
349 dependencies.add(a);
350 const aState = a === atom ? getAtomState(version, a) : readAtomState(version, a);
351 if (aState) {
352 if ("e" in aState) {
353 throw aState.e;
354 }
355 if ("p" in aState) {
356 throw aState.p;
357 }
358 return aState.v;
359 }
360 if (hasInitialValue(a)) {
361 return a.init;
362 }
363 throw new Error("no atom init");
364 });
365 return setAtomPromiseOrValue(version, atom, promiseOrValue, dependencies);
366 } catch (errorOrPromise) {
367 if (errorOrPromise instanceof Promise) {
368 const suspensePromise = isSuspensePromise(errorOrPromise) && isSuspensePromiseAlreadyCancelled(errorOrPromise) ? copySuspensePromise(errorOrPromise) : createSuspensePromise(errorOrPromise, errorOrPromise);
369 return setAtomSuspensePromise(
370 version,
371 atom,
372 suspensePromise,
373 dependencies
374 );
375 }
376 return setAtomReadError(version, atom, errorOrPromise, dependencies);
377 }
378 };
379 const readAtom = (readingAtom, version) => {
380 const atomState = readAtomState(version, readingAtom);
381 return atomState;
382 };
383 const addAtom = (version, addingAtom) => {
384 let mounted = mountedMap.get(addingAtom);
385 if (!mounted) {
386 mounted = mountAtom(version, addingAtom);
387 }
388 return mounted;
389 };
390 const canUnmountAtom = (atom, mounted) => !mounted.l.size && (!mounted.t.size || mounted.t.size === 1 && mounted.t.has(atom));
391 const delAtom = (version, deletingAtom) => {
392 const mounted = mountedMap.get(deletingAtom);
393 if (mounted && canUnmountAtom(deletingAtom, mounted)) {
394 unmountAtom(version, deletingAtom);
395 }
396 };
397 const invalidateDependents = (version, atom) => {
398 const mounted = mountedMap.get(atom);
399 mounted == null ? void 0 : mounted.t.forEach((dependent) => {
400 if (dependent !== atom) {
401 setAtomInvalidated(version, dependent);
402 invalidateDependents(version, dependent);
403 }
404 });
405 };
406 const writeAtomState = (version, atom, update) => {
407 let isSync = true;
408 const writeGetter = (a, options) => {
409 const aState = readAtomState(version, a);
410 if ("e" in aState) {
411 throw aState.e;
412 }
413 if ("p" in aState) {
414 if (options == null ? void 0 : options.unstable_promise) {
415 return aState.p.then(() => {
416 const s = getAtomState(version, a);
417 if (s && "p" in s && s.p === aState.p) {
418 return new Promise((resolve) => setTimeout(resolve)).then(
419 () => writeGetter(a, options)
420 );
421 }
422 return writeGetter(a, options);
423 });
424 }
425 {
426 console.info(
427 "Reading pending atom state in write operation. We throw a promise for now.",
428 a
429 );
430 }
431 throw aState.p;
432 }
433 if ("v" in aState) {
434 return aState.v;
435 }
436 {
437 console.warn(
438 "[Bug] no value found while reading atom in write operation. This is probably a bug.",
439 a
440 );
441 }
442 throw new Error("no value found");
443 };
444 const setter = (a, v) => {
445 let promiseOrVoid2;
446 if (a === atom) {
447 if (!hasInitialValue(a)) {
448 throw new Error("atom not writable");
449 }
450 const versionSet = cancelAllSuspensePromiseInCache(a);
451 versionSet.forEach((cancelledVersion) => {
452 if (cancelledVersion !== version) {
453 setAtomPromiseOrValue(cancelledVersion, a, v);
454 }
455 });
456 const prevAtomState = getAtomState(version, a);
457 const nextAtomState = setAtomPromiseOrValue(version, a, v);
458 if (prevAtomState !== nextAtomState) {
459 invalidateDependents(version, a);
460 }
461 } else {
462 promiseOrVoid2 = writeAtomState(version, a, v);
463 }
464 if (!isSync) {
465 flushPending(version);
466 }
467 return promiseOrVoid2;
468 };
469 const promiseOrVoid = atom.write(writeGetter, setter, update);
470 isSync = false;
471 return promiseOrVoid;
472 };
473 const writeAtom = (writingAtom, update, version) => {
474 const promiseOrVoid = writeAtomState(version, writingAtom, update);
475 flushPending(version);
476 return promiseOrVoid;
477 };
478 const isActuallyWritableAtom = (atom) => !!atom.write;
479 const mountAtom = (version, atom, initialDependent) => {
480 const mounted = {
481 t: new Set(initialDependent && [initialDependent]),
482 l: /* @__PURE__ */ new Set()
483 };
484 mountedMap.set(atom, mounted);
485 {
486 mountedAtoms.add(atom);
487 }
488 const atomState = readAtomState(void 0, atom);
489 atomState.d.forEach((_, a) => {
490 const aMounted = mountedMap.get(a);
491 if (aMounted) {
492 aMounted.t.add(atom);
493 } else {
494 if (a !== atom) {
495 mountAtom(version, a, atom);
496 }
497 }
498 });
499 if (isActuallyWritableAtom(atom) && atom.onMount) {
500 const setAtom = (update) => writeAtom(atom, update, version);
501 const onUnmount = atom.onMount(setAtom);
502 version = void 0;
503 if (onUnmount) {
504 mounted.u = onUnmount;
505 }
506 }
507 return mounted;
508 };
509 const unmountAtom = (version, atom) => {
510 var _a;
511 const onUnmount = (_a = mountedMap.get(atom)) == null ? void 0 : _a.u;
512 if (onUnmount) {
513 onUnmount();
514 }
515 mountedMap.delete(atom);
516 {
517 mountedAtoms.delete(atom);
518 }
519 const atomState = getAtomState(version, atom);
520 if (atomState) {
521 if ("p" in atomState) {
522 cancelSuspensePromise(atomState.p);
523 }
524 atomState.d.forEach((_, a) => {
525 if (a !== atom) {
526 const mounted = mountedMap.get(a);
527 if (mounted) {
528 mounted.t.delete(atom);
529 if (canUnmountAtom(a, mounted)) {
530 unmountAtom(version, a);
531 }
532 }
533 }
534 });
535 } else {
536 console.warn("[Bug] could not find atom state to unmount", atom);
537 }
538 };
539 const mountDependencies = (version, atom, atomState, prevReadDependencies) => {
540 const dependencies = new Set(atomState.d.keys());
541 prevReadDependencies == null ? void 0 : prevReadDependencies.forEach((_, a) => {
542 if (dependencies.has(a)) {
543 dependencies.delete(a);
544 return;
545 }
546 const mounted = mountedMap.get(a);
547 if (mounted) {
548 mounted.t.delete(atom);
549 if (canUnmountAtom(a, mounted)) {
550 unmountAtom(version, a);
551 }
552 }
553 });
554 dependencies.forEach((a) => {
555 const mounted = mountedMap.get(a);
556 if (mounted) {
557 mounted.t.add(atom);
558 } else if (mountedMap.has(atom)) {
559 mountAtom(version, a, atom);
560 }
561 });
562 };
563 const flushPending = (version) => {
564 if (version) {
565 const versionedAtomStateMap = getVersionedAtomStateMap(version);
566 versionedAtomStateMap.forEach((atomState, atom) => {
567 const committedAtomState = committedAtomStateMap.get(atom);
568 if (atomState !== committedAtomState) {
569 const mounted = mountedMap.get(atom);
570 mounted == null ? void 0 : mounted.l.forEach((listener) => listener(version));
571 }
572 });
573 return;
574 }
575 while (pendingMap.size) {
576 const pending = Array.from(pendingMap);
577 pendingMap.clear();
578 pending.forEach(([atom, prevAtomState]) => {
579 const atomState = getAtomState(void 0, atom);
580 if (atomState && atomState.d !== (prevAtomState == null ? void 0 : prevAtomState.d)) {
581 mountDependencies(void 0, atom, atomState, prevAtomState == null ? void 0 : prevAtomState.d);
582 }
583 if (prevAtomState && !prevAtomState.y && (atomState == null ? void 0 : atomState.y)) {
584 return;
585 }
586 const mounted = mountedMap.get(atom);
587 mounted == null ? void 0 : mounted.l.forEach((listener) => listener());
588 });
589 }
590 {
591 stateListeners.forEach((l) => l());
592 }
593 };
594 const commitVersionedAtomStateMap = (version) => {
595 const versionedAtomStateMap = getVersionedAtomStateMap(version);
596 versionedAtomStateMap.forEach((atomState, atom) => {
597 const prevAtomState = committedAtomStateMap.get(atom);
598 if (!prevAtomState || atomState.r > prevAtomState.r || atomState.y !== prevAtomState.y || atomState.r === prevAtomState.r && atomState.d !== prevAtomState.d) {
599 committedAtomStateMap.set(atom, atomState);
600 if (atomState.d !== (prevAtomState == null ? void 0 : prevAtomState.d)) {
601 mountDependencies(version, atom, atomState, prevAtomState == null ? void 0 : prevAtomState.d);
602 }
603 }
604 });
605 };
606 const commitAtom = (_atom, version) => {
607 if (version) {
608 commitVersionedAtomStateMap(version);
609 }
610 flushPending(void 0);
611 };
612 const subscribeAtom = (atom, callback, version) => {
613 const mounted = addAtom(version, atom);
614 const listeners = mounted.l;
615 listeners.add(callback);
616 return () => {
617 listeners.delete(callback);
618 delAtom(version, atom);
619 };
620 };
621 const restoreAtoms = (values, version) => {
622 for (const [atom, value] of values) {
623 if (hasInitialValue(atom)) {
624 setAtomPromiseOrValue(version, atom, value);
625 invalidateDependents(version, atom);
626 }
627 }
628 flushPending(version);
629 };
630 {
631 return {
632 [READ_ATOM]: readAtom,
633 [WRITE_ATOM]: writeAtom,
634 [COMMIT_ATOM]: commitAtom,
635 [SUBSCRIBE_ATOM]: subscribeAtom,
636 [RESTORE_ATOMS]: restoreAtoms,
637 [DEV_SUBSCRIBE_STATE]: (l) => {
638 stateListeners.add(l);
639 return () => {
640 stateListeners.delete(l);
641 };
642 },
643 [DEV_GET_MOUNTED_ATOMS]: () => mountedAtoms.values(),
644 [DEV_GET_ATOM_STATE]: (a) => committedAtomStateMap.get(a),
645 [DEV_GET_MOUNTED]: (a) => mountedMap.get(a)
646 };
647 }
648 };
649 const createStoreForExport = exports('unstable_createStore', (initialValues) => {
650 const store = createStore(initialValues);
651 const get = (atom) => {
652 const atomState = store[READ_ATOM](atom);
653 if ("e" in atomState) {
654 throw atomState.e;
655 }
656 if ("p" in atomState) {
657 return void 0;
658 }
659 return atomState.v;
660 };
661 const asyncGet = (atom) => new Promise((resolve, reject) => {
662 const atomState = store[READ_ATOM](atom);
663 if ("e" in atomState) {
664 reject(atomState.e);
665 } else if ("p" in atomState) {
666 resolve(atomState.p.then(() => asyncGet(atom)));
667 } else {
668 resolve(atomState.v);
669 }
670 });
671 const set = (atom, update) => store[WRITE_ATOM](atom, update);
672 const sub = (atom, callback) => store[SUBSCRIBE_ATOM](atom, callback);
673 return {
674 get,
675 asyncGet,
676 set,
677 sub,
678 SECRET_INTERNAL_store: store
679 };
680 });
681
682 const createScopeContainer = (initialValues, unstable_createStore) => {
683 const store = unstable_createStore ? unstable_createStore(initialValues).SECRET_INTERNAL_store : createStore(initialValues);
684 return { s: store };
685 };
686 const ScopeContextMap = /* @__PURE__ */ new Map();
687 const getScopeContext = exports('SECRET_INTERNAL_getScopeContext', (scope) => {
688 if (!ScopeContextMap.has(scope)) {
689 ScopeContextMap.set(scope, createContext(createScopeContainer()));
690 }
691 return ScopeContextMap.get(scope);
692 });
693
694 const Provider = exports('Provider', ({
695 children,
696 initialValues,
697 scope,
698 unstable_createStore,
699 unstable_enableVersionedWrite
700 }) => {
701 const [version, setVersion] = useState({});
702 useEffect(() => {
703 const scopeContainer = scopeContainerRef.current;
704 if (scopeContainer.w) {
705 scopeContainer.s[COMMIT_ATOM](null, version);
706 delete version.p;
707 scopeContainer.v = version;
708 }
709 }, [version]);
710 const scopeContainerRef = useRef();
711 if (!scopeContainerRef.current) {
712 const scopeContainer = createScopeContainer(
713 initialValues,
714 unstable_createStore
715 );
716 if (unstable_enableVersionedWrite) {
717 let retrying = 0;
718 scopeContainer.w = (write) => {
719 setVersion((parentVersion) => {
720 const nextVersion = retrying ? parentVersion : { p: parentVersion };
721 write(nextVersion);
722 return nextVersion;
723 });
724 };
725 scopeContainer.v = version;
726 scopeContainer.r = (fn) => {
727 ++retrying;
728 fn();
729 --retrying;
730 };
731 }
732 scopeContainerRef.current = scopeContainer;
733 }
734 const ScopeContainerContext = getScopeContext(scope);
735 return createElement(
736 ScopeContainerContext.Provider,
737 {
738 value: scopeContainerRef.current
739 },
740 children
741 );
742 });
743
744 function atom(read, write) {
745 return atom$1(read, write);
746 }
747
748 function useAtomValue(atom, scope) {
749 const ScopeContext = getScopeContext(scope);
750 const scopeContainer = useContext(ScopeContext);
751 const { s: store, v: versionFromProvider } = scopeContainer;
752 const getAtomValue = (version2) => {
753 const atomState = store[READ_ATOM](atom, version2);
754 if (!atomState.y) {
755 throw new Error("should not be invalidated");
756 }
757 if ("e" in atomState) {
758 throw atomState.e;
759 }
760 if ("p" in atomState) {
761 throw atomState.p;
762 }
763 if ("v" in atomState) {
764 return atomState.v;
765 }
766 throw new Error("no atom value");
767 };
768 const [[version, valueFromReducer, atomFromReducer], rerenderIfChanged] = useReducer(
769 (prev, nextVersion) => {
770 const nextValue = getAtomValue(nextVersion);
771 if (Object.is(prev[1], nextValue) && prev[2] === atom) {
772 return prev;
773 }
774 return [nextVersion, nextValue, atom];
775 },
776 versionFromProvider,
777 (initialVersion) => {
778 const initialValue = getAtomValue(initialVersion);
779 return [initialVersion, initialValue, atom];
780 }
781 );
782 let value = valueFromReducer;
783 if (atomFromReducer !== atom) {
784 rerenderIfChanged(version);
785 value = getAtomValue(version);
786 }
787 useEffect(() => {
788 const { v: versionFromProvider2 } = scopeContainer;
789 if (versionFromProvider2) {
790 store[COMMIT_ATOM](atom, versionFromProvider2);
791 }
792 const unsubscribe = store[SUBSCRIBE_ATOM](
793 atom,
794 rerenderIfChanged,
795 versionFromProvider2
796 );
797 rerenderIfChanged(versionFromProvider2);
798 return unsubscribe;
799 }, [store, atom, scopeContainer]);
800 useEffect(() => {
801 store[COMMIT_ATOM](atom, version);
802 });
803 useDebugValue(value);
804 return value;
805 }
806
807 function useSetAtom(atom, scope) {
808 const ScopeContext = getScopeContext(scope);
809 const { s: store, w: versionedWrite } = useContext(ScopeContext);
810 const setAtom = useCallback(
811 (update) => {
812 if (!("write" in atom)) {
813 throw new Error("not writable atom");
814 }
815 const write = (version) => store[WRITE_ATOM](atom, update, version);
816 return versionedWrite ? versionedWrite(write) : write();
817 },
818 [store, versionedWrite, atom]
819 );
820 return setAtom;
821 }
822
823 function useAtom(atom, scope) {
824 if ("scope" in atom) {
825 console.warn(
826 "atom.scope is deprecated. Please do useAtom(atom, scope) instead."
827 );
828 scope = atom.scope;
829 }
830 return [
831 useAtomValue(atom, scope),
832 useSetAtom(atom, scope)
833 ];
834 }
835
836 })
837 };
838}));