UNPKG

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