UNPKG

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