UNPKG

32.3 kBJavaScriptView Raw
1(function (global, factory) {
2 typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('react')) :
3 typeof define === 'function' && define.amd ? define(['exports', 'react'], factory) :
4 (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.jotai = {}, global.React));
5})(this, (function (exports, react) { 'use strict';
6
7 function _extends() {
8 _extends = Object.assign || function (target) {
9 for (var i = 1; i < arguments.length; i++) {
10 var source = arguments[i];
11
12 for (var key in source) {
13 if (Object.prototype.hasOwnProperty.call(source, key)) {
14 target[key] = source[key];
15 }
16 }
17 }
18
19 return target;
20 };
21
22 return _extends.apply(this, arguments);
23 }
24
25 function _unsupportedIterableToArray(o, minLen) {
26 if (!o) return;
27 if (typeof o === "string") return _arrayLikeToArray(o, minLen);
28 var n = Object.prototype.toString.call(o).slice(8, -1);
29 if (n === "Object" && o.constructor) n = o.constructor.name;
30 if (n === "Map" || n === "Set") return Array.from(o);
31 if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
32 }
33
34 function _arrayLikeToArray(arr, len) {
35 if (len == null || len > arr.length) len = arr.length;
36
37 for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];
38
39 return arr2;
40 }
41
42 function _createForOfIteratorHelperLoose(o, allowArrayLike) {
43 var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"];
44 if (it) return (it = it.call(o)).next.bind(it);
45
46 if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") {
47 if (it) o = it;
48 var i = 0;
49 return function () {
50 if (i >= o.length) return {
51 done: true
52 };
53 return {
54 done: false,
55 value: o[i++]
56 };
57 };
58 }
59
60 throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
61 }
62
63 var SUSPENSE_PROMISE = Symbol();
64 var isSuspensePromise = function isSuspensePromise(promise) {
65 return !!promise[SUSPENSE_PROMISE];
66 };
67 var isSuspensePromiseAlreadyCancelled = function isSuspensePromiseAlreadyCancelled(suspensePromise) {
68 return !suspensePromise[SUSPENSE_PROMISE].c;
69 };
70 var cancelSuspensePromise = function cancelSuspensePromise(suspensePromise) {
71 var _suspensePromise$SUSP, _suspensePromise$SUSP2;
72
73 (_suspensePromise$SUSP = (_suspensePromise$SUSP2 = suspensePromise[SUSPENSE_PROMISE]).c) == null ? void 0 : _suspensePromise$SUSP.call(_suspensePromise$SUSP2);
74 };
75 var isEqualSuspensePromise = function isEqualSuspensePromise(oldSuspensePromise, newSuspensePromise) {
76 var oldOriginalPromise = oldSuspensePromise[SUSPENSE_PROMISE].o;
77 var newOriginalPromise = newSuspensePromise[SUSPENSE_PROMISE].o;
78 return oldOriginalPromise === newOriginalPromise || oldSuspensePromise === newOriginalPromise || isSuspensePromise(oldOriginalPromise) && isEqualSuspensePromise(oldOriginalPromise, newSuspensePromise);
79 };
80 var createSuspensePromise = function createSuspensePromise(promise) {
81 var objectToAttach = {
82 o: promise,
83 c: null
84 };
85 var suspensePromise = new Promise(function (resolve) {
86 objectToAttach.c = function () {
87 objectToAttach.c = null;
88 resolve();
89 };
90
91 promise.then(objectToAttach.c, objectToAttach.c);
92 });
93 suspensePromise[SUSPENSE_PROMISE] = objectToAttach;
94 return suspensePromise;
95 };
96
97 var hasInitialValue = function hasInitialValue(atom) {
98 return 'init' in atom;
99 };
100
101 var READ_ATOM = 'r';
102 var WRITE_ATOM = 'w';
103 var COMMIT_ATOM = 'c';
104 var SUBSCRIBE_ATOM = 's';
105 var RESTORE_ATOMS = 'h';
106 var DEV_SUBSCRIBE_STATE = 'n';
107 var DEV_GET_MOUNTED_ATOMS = 'l';
108 var DEV_GET_ATOM_STATE = 'a';
109 var DEV_GET_MOUNTED = 'm';
110 var createStore = function createStore(initialValues) {
111
112 var committedAtomStateMap = new WeakMap();
113 var mountedMap = new WeakMap();
114 var pendingMap = new Map();
115 var stateListeners;
116 var mountedAtoms;
117
118 {
119 stateListeners = new Set();
120 mountedAtoms = new Set();
121 }
122
123 if (initialValues) {
124 for (var _iterator = _createForOfIteratorHelperLoose(initialValues), _step; !(_step = _iterator()).done;) {
125 var _step$value = _step.value,
126 atom = _step$value[0],
127 value = _step$value[1];
128 var atomState = {
129 v: value,
130 r: 0,
131 d: new Map()
132 };
133
134 {
135 Object.freeze(atomState);
136
137 if (!hasInitialValue(atom)) {
138 console.warn('Found initial value for derived atom which can cause unexpected behavior', atom);
139 }
140 }
141
142 committedAtomStateMap.set(atom, atomState);
143 }
144 }
145
146 var suspensePromiseCacheMap = new WeakMap();
147
148 var addSuspensePromiseToCache = function addSuspensePromiseToCache(version, atom, suspensePromise) {
149 var cache = suspensePromiseCacheMap.get(atom);
150
151 if (!cache) {
152 cache = new Map();
153 suspensePromiseCacheMap.set(atom, cache);
154 }
155
156 suspensePromise.then(function () {
157 if (cache.get(version) === suspensePromise) {
158 cache.delete(version);
159
160 if (!cache.size) {
161 suspensePromiseCacheMap.delete(atom);
162 }
163 }
164 });
165 cache.set(version, suspensePromise);
166 };
167
168 var cancelAllSuspensePromiseInCache = function cancelAllSuspensePromiseInCache(atom) {
169 var versionSet = new Set();
170 var cache = suspensePromiseCacheMap.get(atom);
171
172 if (cache) {
173 suspensePromiseCacheMap.delete(atom);
174 cache.forEach(function (suspensePromise, version) {
175 cancelSuspensePromise(suspensePromise);
176 versionSet.add(version);
177 });
178 }
179
180 return versionSet;
181 };
182
183 var versionedAtomStateMapMap = new WeakMap();
184
185 var getVersionedAtomStateMap = function getVersionedAtomStateMap(version) {
186 var versionedAtomStateMap = versionedAtomStateMapMap.get(version);
187
188 if (!versionedAtomStateMap) {
189 versionedAtomStateMap = new Map();
190 versionedAtomStateMapMap.set(version, versionedAtomStateMap);
191 }
192
193 return versionedAtomStateMap;
194 };
195
196 var getAtomState = function getAtomState(version, atom) {
197 if (version) {
198 var versionedAtomStateMap = getVersionedAtomStateMap(version);
199
200 var _atomState = versionedAtomStateMap.get(atom);
201
202 if (!_atomState) {
203 _atomState = getAtomState(version.p, atom);
204
205 if (_atomState) {
206 if ('p' in _atomState) {
207 _atomState.p.then(function () {
208 return versionedAtomStateMap.delete(atom);
209 });
210 }
211
212 versionedAtomStateMap.set(atom, _atomState);
213 }
214 }
215
216 return _atomState;
217 }
218
219 return committedAtomStateMap.get(atom);
220 };
221
222 var setAtomState = function setAtomState(version, atom, atomState) {
223 {
224 Object.freeze(atomState);
225 }
226
227 if (version) {
228 var versionedAtomStateMap = getVersionedAtomStateMap(version);
229 versionedAtomStateMap.set(atom, atomState);
230 } else {
231 var prevAtomState = committedAtomStateMap.get(atom);
232 committedAtomStateMap.set(atom, atomState);
233
234 if (!pendingMap.has(atom)) {
235 pendingMap.set(atom, prevAtomState);
236 }
237 }
238 };
239
240 var createReadDependencies = function createReadDependencies(version, prevReadDependencies, dependencies) {
241 if (prevReadDependencies === void 0) {
242 prevReadDependencies = new Map();
243 }
244
245 if (!dependencies) {
246 return prevReadDependencies;
247 }
248
249 var readDependencies = new Map();
250 var changed = false;
251 dependencies.forEach(function (atom) {
252 var _getAtomState;
253
254 var revision = ((_getAtomState = getAtomState(version, atom)) == null ? void 0 : _getAtomState.r) || 0;
255 readDependencies.set(atom, revision);
256
257 if (prevReadDependencies.get(atom) !== revision) {
258 changed = true;
259 }
260 });
261
262 if (prevReadDependencies.size === readDependencies.size && !changed) {
263 return prevReadDependencies;
264 }
265
266 return readDependencies;
267 };
268
269 var setAtomValue = function setAtomValue(version, atom, value, dependencies, suspensePromise) {
270 var atomState = getAtomState(version, atom);
271
272 if (atomState) {
273 if (suspensePromise && (!('p' in atomState) || !isEqualSuspensePromise(atomState.p, suspensePromise))) {
274 return atomState;
275 }
276
277 if ('p' in atomState) {
278 cancelSuspensePromise(atomState.p);
279 }
280 }
281
282 var nextAtomState = {
283 v: value,
284 r: (atomState == null ? void 0 : atomState.r) || 0,
285 d: createReadDependencies(version, atomState == null ? void 0 : atomState.d, dependencies)
286 };
287
288 if (!atomState || !('v' in atomState) || !Object.is(atomState.v, value)) {
289 ++nextAtomState.r;
290
291 if (nextAtomState.d.has(atom)) {
292 nextAtomState.d = new Map(nextAtomState.d).set(atom, nextAtomState.r);
293 }
294 } else if (nextAtomState.d !== atomState.d && (nextAtomState.d.size !== atomState.d.size || !Array.from(nextAtomState.d.keys()).every(function (a) {
295 return atomState.d.has(a);
296 }))) {
297 Promise.resolve().then(function () {
298 flushPending(version);
299 });
300 }
301
302 setAtomState(version, atom, nextAtomState);
303 return nextAtomState;
304 };
305
306 var setAtomReadError = function setAtomReadError(version, atom, error, dependencies, suspensePromise) {
307 var atomState = getAtomState(version, atom);
308
309 if (atomState) {
310 if (suspensePromise && (!('p' in atomState) || !isEqualSuspensePromise(atomState.p, suspensePromise))) {
311 return atomState;
312 }
313
314 if ('p' in atomState) {
315 cancelSuspensePromise(atomState.p);
316 }
317 }
318
319 var nextAtomState = {
320 e: error,
321 r: (atomState == null ? void 0 : atomState.r) || 0,
322 d: createReadDependencies(version, atomState == null ? void 0 : atomState.d, dependencies)
323 };
324 setAtomState(version, atom, nextAtomState);
325 return nextAtomState;
326 };
327
328 var setAtomSuspensePromise = function setAtomSuspensePromise(version, atom, suspensePromise, dependencies) {
329 var atomState = getAtomState(version, atom);
330
331 if (atomState && 'p' in atomState) {
332 if (isEqualSuspensePromise(atomState.p, suspensePromise)) {
333 return atomState;
334 }
335
336 cancelSuspensePromise(atomState.p);
337 }
338
339 addSuspensePromiseToCache(version, atom, suspensePromise);
340 var nextAtomState = {
341 p: suspensePromise,
342 r: (atomState == null ? void 0 : atomState.r) || 0,
343 d: createReadDependencies(version, atomState == null ? void 0 : atomState.d, dependencies)
344 };
345 setAtomState(version, atom, nextAtomState);
346 return nextAtomState;
347 };
348
349 var setAtomPromiseOrValue = function setAtomPromiseOrValue(version, atom, promiseOrValue, dependencies) {
350 if (promiseOrValue instanceof Promise) {
351 var suspensePromise = createSuspensePromise(promiseOrValue.then(function (value) {
352 setAtomValue(version, atom, value, dependencies, suspensePromise);
353 flushPending(version);
354 }).catch(function (e) {
355 if (e instanceof Promise) {
356 if (isSuspensePromise(e)) {
357 return e.then(function () {
358 readAtomState(version, atom, true);
359 });
360 }
361
362 return e;
363 }
364
365 setAtomReadError(version, atom, e, dependencies, suspensePromise);
366 flushPending(version);
367 }));
368 return setAtomSuspensePromise(version, atom, suspensePromise, dependencies);
369 }
370
371 return setAtomValue(version, atom, promiseOrValue, dependencies);
372 };
373
374 var setAtomInvalidated = function setAtomInvalidated(version, atom) {
375 var atomState = getAtomState(version, atom);
376
377 if (atomState) {
378 if ('p' in atomState) {
379 cancelSuspensePromise(atomState.p);
380 }
381
382 var nextAtomState = _extends({}, atomState, {
383 i: atomState.r
384 });
385
386 setAtomState(version, atom, nextAtomState);
387 } else {
388 console.warn('[Bug] could not invalidate non existing atom', atom);
389 }
390 };
391
392 var readAtomState = function readAtomState(version, atom, force) {
393 if (!force) {
394 var _atomState2 = getAtomState(version, atom);
395
396 if (_atomState2) {
397 if (_atomState2.r !== _atomState2.i && 'p' in _atomState2 && !isSuspensePromiseAlreadyCancelled(_atomState2.p)) {
398 return _atomState2;
399 }
400
401 _atomState2.d.forEach(function (_, a) {
402 if (a !== atom) {
403 if (!mountedMap.has(a)) {
404 readAtomState(version, a);
405 } else {
406 var aState = getAtomState(version, a);
407
408 if (aState && aState.r === aState.i) {
409 readAtomState(version, a);
410 }
411 }
412 }
413 });
414
415 if (Array.from(_atomState2.d).every(function (_ref) {
416 var a = _ref[0],
417 r = _ref[1];
418 var aState = getAtomState(version, a);
419 return aState && 'v' in aState && aState.r === r;
420 })) {
421 return _atomState2;
422 }
423 }
424 }
425
426 var dependencies = new Set();
427
428 try {
429 var promiseOrValue = atom.read(function (a) {
430 dependencies.add(a);
431 var aState = a === atom ? getAtomState(version, a) : readAtomState(version, a);
432
433 if (aState) {
434 if ('e' in aState) {
435 throw aState.e;
436 }
437
438 if ('p' in aState) {
439 throw aState.p;
440 }
441
442 return aState.v;
443 }
444
445 if (hasInitialValue(a)) {
446 return a.init;
447 }
448
449 throw new Error('no atom init');
450 });
451 return setAtomPromiseOrValue(version, atom, promiseOrValue, dependencies);
452 } catch (errorOrPromise) {
453 if (errorOrPromise instanceof Promise) {
454 var suspensePromise = createSuspensePromise(errorOrPromise);
455 return setAtomSuspensePromise(version, atom, suspensePromise, dependencies);
456 }
457
458 return setAtomReadError(version, atom, errorOrPromise, dependencies);
459 }
460 };
461
462 var readAtom = function readAtom(readingAtom, version) {
463 var atomState = readAtomState(version, readingAtom);
464 return atomState;
465 };
466
467 var addAtom = function addAtom(addingAtom) {
468 var mounted = mountedMap.get(addingAtom);
469
470 if (!mounted) {
471 mounted = mountAtom(addingAtom);
472 }
473
474 return mounted;
475 };
476
477 var canUnmountAtom = function canUnmountAtom(atom, mounted) {
478 return !mounted.l.size && (!mounted.t.size || mounted.t.size === 1 && mounted.t.has(atom));
479 };
480
481 var delAtom = function delAtom(deletingAtom) {
482 var mounted = mountedMap.get(deletingAtom);
483
484 if (mounted && canUnmountAtom(deletingAtom, mounted)) {
485 unmountAtom(deletingAtom);
486 }
487 };
488
489 var invalidateDependents = function invalidateDependents(version, atom) {
490 var mounted = mountedMap.get(atom);
491 mounted == null ? void 0 : mounted.t.forEach(function (dependent) {
492 if (dependent !== atom) {
493 setAtomInvalidated(version, dependent);
494 invalidateDependents(version, dependent);
495 }
496 });
497 };
498
499 var writeAtomState = function writeAtomState(version, atom, update) {
500 var isSync = true;
501
502 var writeGetter = function writeGetter(a, options) {
503 var aState = readAtomState(version, a);
504
505 if ('e' in aState) {
506 throw aState.e;
507 }
508
509 if ('p' in aState) {
510 if (options != null && options.unstable_promise) {
511 return aState.p.then(function () {
512 return writeGetter(a, options);
513 });
514 }
515
516 {
517 console.info('Reading pending atom state in write operation. We throw a promise for now.', a);
518 }
519
520 throw aState.p;
521 }
522
523 if ('v' in aState) {
524 return aState.v;
525 }
526
527 {
528 console.warn('[Bug] no value found while reading atom in write operation. This is probably a bug.', a);
529 }
530
531 throw new Error('no value found');
532 };
533
534 var setter = function setter(a, v) {
535 var promiseOrVoid;
536
537 if (a === atom) {
538 if (!hasInitialValue(a)) {
539 throw new Error('atom not writable');
540 }
541
542 var versionSet = cancelAllSuspensePromiseInCache(a);
543 versionSet.forEach(function (cancelledVersion) {
544 if (cancelledVersion !== version) {
545 setAtomPromiseOrValue(cancelledVersion, a, v);
546 }
547 });
548 setAtomPromiseOrValue(version, a, v);
549 invalidateDependents(version, a);
550 } else {
551 promiseOrVoid = writeAtomState(version, a, v);
552 }
553
554 if (!isSync) {
555 flushPending(version);
556 }
557
558 return promiseOrVoid;
559 };
560
561 var promiseOrVoid = atom.write(writeGetter, setter, update);
562 isSync = false;
563 version = undefined;
564 return promiseOrVoid;
565 };
566
567 var writeAtom = function writeAtom(writingAtom, update, version) {
568 var promiseOrVoid = writeAtomState(version, writingAtom, update);
569 flushPending(version);
570 return promiseOrVoid;
571 };
572
573 var isActuallyWritableAtom = function isActuallyWritableAtom(atom) {
574 return !!atom.write;
575 };
576
577 var mountAtom = function mountAtom(atom, initialDependent) {
578 var mounted = {
579 t: new Set(initialDependent && [initialDependent]),
580 l: new Set()
581 };
582 mountedMap.set(atom, mounted);
583
584 {
585 mountedAtoms.add(atom);
586 }
587
588 var atomState = readAtomState(undefined, atom);
589 atomState.d.forEach(function (_, a) {
590 var aMounted = mountedMap.get(a);
591
592 if (aMounted) {
593 aMounted.t.add(atom);
594 } else {
595 if (a !== atom) {
596 mountAtom(a, atom);
597 }
598 }
599 });
600
601 if (isActuallyWritableAtom(atom) && atom.onMount) {
602 var setAtom = function setAtom(update) {
603 return writeAtom(atom, update);
604 };
605
606 var onUnmount = atom.onMount(setAtom);
607
608 if (onUnmount) {
609 mounted.u = onUnmount;
610 }
611 }
612
613 return mounted;
614 };
615
616 var unmountAtom = function unmountAtom(atom) {
617 var _mountedMap$get;
618
619 var onUnmount = (_mountedMap$get = mountedMap.get(atom)) == null ? void 0 : _mountedMap$get.u;
620
621 if (onUnmount) {
622 onUnmount();
623 }
624
625 mountedMap.delete(atom);
626
627 {
628 mountedAtoms.delete(atom);
629 }
630
631 var atomState = getAtomState(undefined, atom);
632
633 if (atomState) {
634 atomState.d.forEach(function (_, a) {
635 if (a !== atom) {
636 var mounted = mountedMap.get(a);
637
638 if (mounted) {
639 mounted.t.delete(atom);
640
641 if (canUnmountAtom(a, mounted)) {
642 unmountAtom(a);
643 }
644 }
645 }
646 });
647 } else {
648 console.warn('[Bug] could not find atom state to unmount', atom);
649 }
650 };
651
652 var mountDependencies = function mountDependencies(atom, atomState, prevReadDependencies) {
653 var dependencies = new Set(atomState.d.keys());
654 prevReadDependencies == null ? void 0 : prevReadDependencies.forEach(function (_, a) {
655 if (dependencies.has(a)) {
656 dependencies.delete(a);
657 return;
658 }
659
660 var mounted = mountedMap.get(a);
661
662 if (mounted) {
663 mounted.t.delete(atom);
664
665 if (canUnmountAtom(a, mounted)) {
666 unmountAtom(a);
667 }
668 }
669 });
670 dependencies.forEach(function (a) {
671 var mounted = mountedMap.get(a);
672
673 if (mounted) {
674 mounted.t.add(atom);
675 } else if (mountedMap.has(atom)) {
676 mountAtom(a, atom);
677 }
678 });
679 };
680
681 var flushPending = function flushPending(version) {
682 if (version) {
683 var versionedAtomStateMap = getVersionedAtomStateMap(version);
684 versionedAtomStateMap.forEach(function (atomState, atom) {
685 if (atomState !== committedAtomStateMap.get(atom)) {
686 var mounted = mountedMap.get(atom);
687 mounted == null ? void 0 : mounted.l.forEach(function (listener) {
688 return listener(version);
689 });
690 }
691 });
692 return;
693 }
694
695 while (pendingMap.size) {
696 var pending = Array.from(pendingMap);
697 pendingMap.clear();
698 pending.forEach(function (_ref2) {
699 var atom = _ref2[0],
700 prevAtomState = _ref2[1];
701 var atomState = getAtomState(undefined, atom);
702
703 if (atomState && atomState.d !== (prevAtomState == null ? void 0 : prevAtomState.d)) {
704 mountDependencies(atom, atomState, prevAtomState == null ? void 0 : prevAtomState.d);
705 }
706
707 var mounted = mountedMap.get(atom);
708 mounted == null ? void 0 : mounted.l.forEach(function (listener) {
709 return listener();
710 });
711 });
712 }
713
714 {
715 stateListeners.forEach(function (l) {
716 return l();
717 });
718 }
719 };
720
721 var commitVersionedAtomStateMap = function commitVersionedAtomStateMap(version) {
722 var versionedAtomStateMap = getVersionedAtomStateMap(version);
723 versionedAtomStateMap.forEach(function (atomState, atom) {
724 var prevAtomState = committedAtomStateMap.get(atom);
725
726 if (atomState.r > ((prevAtomState == null ? void 0 : prevAtomState.r) || 0) || 'v' in atomState && atomState.r === (prevAtomState == null ? void 0 : prevAtomState.r) && atomState.d !== (prevAtomState == null ? void 0 : prevAtomState.d)) {
727 committedAtomStateMap.set(atom, atomState);
728
729 if (atomState.d !== (prevAtomState == null ? void 0 : prevAtomState.d)) {
730 mountDependencies(atom, atomState, prevAtomState == null ? void 0 : prevAtomState.d);
731 }
732 }
733 });
734 };
735
736 var commitAtom = function commitAtom(_atom, version) {
737 if (version) {
738 commitVersionedAtomStateMap(version);
739 }
740
741 flushPending(undefined);
742 };
743
744 var subscribeAtom = function subscribeAtom(atom, callback) {
745 var mounted = addAtom(atom);
746 var listeners = mounted.l;
747 listeners.add(callback);
748 return function () {
749 listeners.delete(callback);
750 delAtom(atom);
751 };
752 };
753
754 var restoreAtoms = function restoreAtoms(values, version) {
755 for (var _iterator2 = _createForOfIteratorHelperLoose(values), _step2; !(_step2 = _iterator2()).done;) {
756 var _step2$value = _step2.value,
757 _atom2 = _step2$value[0],
758 _value = _step2$value[1];
759
760 if (hasInitialValue(_atom2)) {
761 setAtomPromiseOrValue(version, _atom2, _value);
762 invalidateDependents(version, _atom2);
763 }
764 }
765
766 flushPending(version);
767 };
768
769 {
770 var _ref3;
771
772 return _ref3 = {}, _ref3[READ_ATOM] = readAtom, _ref3[WRITE_ATOM] = writeAtom, _ref3[COMMIT_ATOM] = commitAtom, _ref3[SUBSCRIBE_ATOM] = subscribeAtom, _ref3[RESTORE_ATOMS] = restoreAtoms, _ref3[DEV_SUBSCRIBE_STATE] = function (l) {
773 stateListeners.add(l);
774 return function () {
775 stateListeners.delete(l);
776 };
777 }, _ref3[DEV_GET_MOUNTED_ATOMS] = function () {
778 return mountedAtoms.values();
779 }, _ref3[DEV_GET_ATOM_STATE] = function (a) {
780 return committedAtomStateMap.get(a);
781 }, _ref3[DEV_GET_MOUNTED] = function (a) {
782 return mountedMap.get(a);
783 }, _ref3;
784 }
785 };
786 var createStoreForExport = function createStoreForExport(initialValues) {
787 var store = createStore(initialValues);
788
789 var get = function get(atom) {
790 var atomState = store[READ_ATOM](atom);
791
792 if ('e' in atomState) {
793 throw atomState.e;
794 }
795
796 if ('p' in atomState) {
797 return undefined;
798 }
799
800 return atomState.v;
801 };
802
803 var asyncGet = function asyncGet(atom) {
804 return new Promise(function (resolve, reject) {
805 var atomState = store[READ_ATOM](atom);
806
807 if ('e' in atomState) {
808 reject(atomState.e);
809 } else if ('p' in atomState) {
810 resolve(atomState.p.then(function () {
811 return asyncGet(atom);
812 }));
813 } else {
814 resolve(atomState.v);
815 }
816 });
817 };
818
819 var set = function set(atom, update) {
820 return store[WRITE_ATOM](atom, update);
821 };
822
823 var sub = function sub(atom, callback) {
824 return store[SUBSCRIBE_ATOM](atom, callback);
825 };
826
827 return {
828 get: get,
829 asyncGet: asyncGet,
830 set: set,
831 sub: sub,
832 SECRET_INTERNAL_store: store
833 };
834 };
835
836 var createScopeContainer = function createScopeContainer(initialValues, unstable_createStore) {
837 var store = unstable_createStore ? unstable_createStore(initialValues).SECRET_INTERNAL_store : createStore(initialValues);
838 return {
839 s: store
840 };
841 };
842 var ScopeContextMap = new Map();
843 var getScopeContext = function getScopeContext(scope) {
844 if (!ScopeContextMap.has(scope)) {
845 ScopeContextMap.set(scope, react.createContext(createScopeContainer()));
846 }
847
848 return ScopeContextMap.get(scope);
849 };
850
851 var atomToPrintable = function atomToPrintable(atom) {
852 return atom.debugLabel || atom.toString();
853 };
854
855 var stateToPrintable = function stateToPrintable(_ref) {
856 var store = _ref[0],
857 atoms = _ref[1];
858 return Object.fromEntries(atoms.flatMap(function (atom) {
859 var _store$DEV_GET_MOUNTE, _store$DEV_GET_ATOM_S;
860
861 var mounted = (_store$DEV_GET_MOUNTE = store[DEV_GET_MOUNTED]) == null ? void 0 : _store$DEV_GET_MOUNTE.call(store, atom);
862
863 if (!mounted) {
864 return [];
865 }
866
867 var dependents = mounted.t;
868 var atomState = ((_store$DEV_GET_ATOM_S = store[DEV_GET_ATOM_STATE]) == null ? void 0 : _store$DEV_GET_ATOM_S.call(store, atom)) || {};
869 return [[atomToPrintable(atom), _extends({}, 'e' in atomState && {
870 error: atomState.e
871 }, 'p' in atomState && {
872 promise: atomState.p
873 }, 'v' in atomState && {
874 value: atomState.v
875 }, {
876 dependents: Array.from(dependents).map(atomToPrintable)
877 })]];
878 }));
879 };
880
881 var useDebugState = function useDebugState(scopeContainer) {
882 var store = scopeContainer.s;
883
884 var _useState = react.useState([]),
885 atoms = _useState[0],
886 setAtoms = _useState[1];
887
888 react.useEffect(function () {
889 var _store$DEV_SUBSCRIBE_;
890
891 var callback = function callback() {
892 var _store$DEV_GET_MOUNTE2;
893
894 setAtoms(Array.from(((_store$DEV_GET_MOUNTE2 = store[DEV_GET_MOUNTED_ATOMS]) == null ? void 0 : _store$DEV_GET_MOUNTE2.call(store)) || []));
895 };
896
897 var unsubscribe = (_store$DEV_SUBSCRIBE_ = store[DEV_SUBSCRIBE_STATE]) == null ? void 0 : _store$DEV_SUBSCRIBE_.call(store, callback);
898 callback();
899 return unsubscribe;
900 }, [store]);
901 react.useDebugValue([store, atoms], stateToPrintable);
902 };
903
904 var Provider = function Provider(_ref) {
905 var children = _ref.children,
906 initialValues = _ref.initialValues,
907 scope = _ref.scope,
908 unstable_createStore = _ref.unstable_createStore,
909 unstable_enableVersionedWrite = _ref.unstable_enableVersionedWrite;
910
911 var _useState = react.useState(),
912 version = _useState[0],
913 setVersion = _useState[1];
914
915 react.useEffect(function () {
916 if (version) {
917 scopeContainerRef.current.s[COMMIT_ATOM](null, version);
918 delete version.p;
919 }
920 }, [version]);
921 var scopeContainerRef = react.useRef();
922
923 if (!scopeContainerRef.current) {
924 scopeContainerRef.current = createScopeContainer(initialValues, unstable_createStore);
925
926 if (unstable_enableVersionedWrite) {
927 scopeContainerRef.current.w = function (write) {
928 setVersion(function (parentVersion) {
929 var nextVersion = parentVersion ? {
930 p: parentVersion
931 } : {};
932 write(nextVersion);
933 return nextVersion;
934 });
935 };
936 }
937 }
938
939 if (!unstable_enableVersionedWrite) {
940 useDebugState(scopeContainerRef.current);
941 }
942
943 var ScopeContainerContext = getScopeContext(scope);
944 return react.createElement(ScopeContainerContext.Provider, {
945 value: scopeContainerRef.current
946 }, children);
947 };
948
949 var keyCount = 0;
950 function atom(read, write) {
951 var key = "atom" + ++keyCount;
952 var config = {
953 toString: function toString() {
954 return key;
955 }
956 };
957
958 if (typeof read === 'function') {
959 config.read = read;
960 } else {
961 config.init = read;
962
963 config.read = function (get) {
964 return get(config);
965 };
966
967 config.write = function (get, set, update) {
968 return set(config, typeof update === 'function' ? update(get(config)) : update);
969 };
970 }
971
972 if (write) {
973 config.write = write;
974 }
975
976 return config;
977 }
978
979 function useAtomValue(atom, scope) {
980 var ScopeContext = getScopeContext(scope);
981
982 var _useContext = react.useContext(ScopeContext),
983 store = _useContext.s;
984
985 var getAtomValue = react.useCallback(function (version) {
986 var atomState = store[READ_ATOM](atom, version);
987
988 if ('e' in atomState) {
989 throw atomState.e;
990 }
991
992 if ('p' in atomState) {
993 throw atomState.p;
994 }
995
996 if ('v' in atomState) {
997 return atomState.v;
998 }
999
1000 throw new Error('no atom value');
1001 }, [store, atom]);
1002
1003 var _useReducer = react.useReducer(react.useCallback(function (prev, nextVersion) {
1004 var nextValue = getAtomValue(nextVersion);
1005
1006 if (Object.is(prev[1], nextValue) && prev[2] === atom) {
1007 return prev;
1008 }
1009
1010 return [nextVersion, nextValue, atom];
1011 }, [getAtomValue, atom]), undefined, function () {
1012 var initialVersion = undefined;
1013 var initialValue = getAtomValue(initialVersion);
1014 return [initialVersion, initialValue, atom];
1015 }),
1016 _useReducer$ = _useReducer[0],
1017 version = _useReducer$[0],
1018 value = _useReducer$[1],
1019 atomFromUseReducer = _useReducer$[2],
1020 rerenderIfChanged = _useReducer[1];
1021
1022 if (atomFromUseReducer !== atom) {
1023 rerenderIfChanged(undefined);
1024 }
1025
1026 react.useEffect(function () {
1027 var unsubscribe = store[SUBSCRIBE_ATOM](atom, rerenderIfChanged);
1028 rerenderIfChanged(undefined);
1029 return unsubscribe;
1030 }, [store, atom]);
1031 react.useEffect(function () {
1032 store[COMMIT_ATOM](atom, version);
1033 });
1034 react.useDebugValue(value);
1035 return value;
1036 }
1037
1038 function useSetAtom(atom, scope) {
1039 var ScopeContext = getScopeContext(scope);
1040
1041 var _useContext = react.useContext(ScopeContext),
1042 store = _useContext.s,
1043 versionedWrite = _useContext.w;
1044
1045 var setAtom = react.useCallback(function (update) {
1046 if (!('write' in atom)) {
1047 throw new Error('not writable atom');
1048 }
1049
1050 var write = function write(version) {
1051 return store[WRITE_ATOM](atom, update, version);
1052 };
1053
1054 return versionedWrite ? versionedWrite(write) : write();
1055 }, [store, versionedWrite, atom]);
1056 return setAtom;
1057 }
1058
1059 function useAtom(atom, scope) {
1060 if ('scope' in atom) {
1061 console.warn('atom.scope is deprecated. Please do useAtom(atom, scope) instead.');
1062 scope = atom.scope;
1063 }
1064
1065 return [useAtomValue(atom, scope), useSetAtom(atom, scope)];
1066 }
1067
1068 exports.Provider = Provider;
1069 exports.SECRET_INTERNAL_getScopeContext = getScopeContext;
1070 exports.atom = atom;
1071 exports.unstable_createStore = createStoreForExport;
1072 exports.useAtom = useAtom;
1073 exports.useAtomValue = useAtomValue;
1074 exports.useSetAtom = useSetAtom;
1075
1076 Object.defineProperty(exports, '__esModule', { value: true });
1077
1078}));