UNPKG

28.8 kBJavaScriptView Raw
1(function (global, factory) {
2 typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('jotai'), require('react')) :
3 typeof define === 'function' && define.amd ? define(['exports', 'jotai', 'react'], factory) :
4 (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.jotaiUtils = {}, global.jotai, global.React));
5})(this, (function (exports, jotai, react) { 'use strict';
6
7 var RESET = Symbol();
8
9 function atomWithReset(initialValue) {
10 var anAtom = jotai.atom(initialValue, function (get, set, update) {
11 if (update === RESET) {
12 set(anAtom, initialValue);
13 } else {
14 set(anAtom, typeof update === 'function' ? update(get(anAtom)) : update);
15 }
16 });
17 return anAtom;
18 }
19
20 function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
21 try {
22 var info = gen[key](arg);
23 var value = info.value;
24 } catch (error) {
25 reject(error);
26 return;
27 }
28
29 if (info.done) {
30 resolve(value);
31 } else {
32 Promise.resolve(value).then(_next, _throw);
33 }
34 }
35
36 function _asyncToGenerator(fn) {
37 return function () {
38 var self = this,
39 args = arguments;
40 return new Promise(function (resolve, reject) {
41 var gen = fn.apply(self, args);
42
43 function _next(value) {
44 asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
45 }
46
47 function _throw(err) {
48 asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
49 }
50
51 _next(undefined);
52 });
53 };
54 }
55
56 function _extends() {
57 _extends = Object.assign || function (target) {
58 for (var i = 1; i < arguments.length; i++) {
59 var source = arguments[i];
60
61 for (var key in source) {
62 if (Object.prototype.hasOwnProperty.call(source, key)) {
63 target[key] = source[key];
64 }
65 }
66 }
67
68 return target;
69 };
70
71 return _extends.apply(this, arguments);
72 }
73
74 function _unsupportedIterableToArray(o, minLen) {
75 if (!o) return;
76 if (typeof o === "string") return _arrayLikeToArray(o, minLen);
77 var n = Object.prototype.toString.call(o).slice(8, -1);
78 if (n === "Object" && o.constructor) n = o.constructor.name;
79 if (n === "Map" || n === "Set") return Array.from(o);
80 if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
81 }
82
83 function _arrayLikeToArray(arr, len) {
84 if (len == null || len > arr.length) len = arr.length;
85
86 for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];
87
88 return arr2;
89 }
90
91 function _createForOfIteratorHelperLoose(o, allowArrayLike) {
92 var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"];
93 if (it) return (it = it.call(o)).next.bind(it);
94
95 if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") {
96 if (it) o = it;
97 var i = 0;
98 return function () {
99 if (i >= o.length) return {
100 done: true
101 };
102 return {
103 done: false,
104 value: o[i++]
105 };
106 };
107 }
108
109 throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
110 }
111
112 var WRITE_ATOM = 'w';
113 var RESTORE_ATOMS = 'h';
114
115 function useResetAtom(anAtom, scope) {
116 var ScopeContext = jotai.SECRET_INTERNAL_getScopeContext(scope);
117 var store = react.useContext(ScopeContext).s;
118 var setAtom = react.useCallback(function () {
119 return store[WRITE_ATOM](anAtom, RESET);
120 }, [store, anAtom]);
121 return setAtom;
122 }
123
124 function useReducerAtom(anAtom, reducer, scope) {
125 var _useAtom = jotai.useAtom(anAtom, scope),
126 state = _useAtom[0],
127 setState = _useAtom[1];
128
129 var dispatch = react.useCallback(function (action) {
130 setState(function (prev) {
131 return reducer(prev, action);
132 });
133 }, [setState, reducer]);
134 return [state, dispatch];
135 }
136
137 function atomWithReducer(initialValue, reducer) {
138 var anAtom = jotai.atom(initialValue, function (get, set, action) {
139 return set(anAtom, reducer(get(anAtom), action));
140 });
141 return anAtom;
142 }
143
144 function atomFamily(initializeAtom, areEqual) {
145 var shouldRemove = null;
146 var atoms = new Map();
147
148 var createAtom = function createAtom(param) {
149 var item;
150
151 if (areEqual === undefined) {
152 item = atoms.get(param);
153 } else {
154 for (var _iterator = _createForOfIteratorHelperLoose(atoms), _step; !(_step = _iterator()).done;) {
155 var _step$value = _step.value,
156 key = _step$value[0],
157 value = _step$value[1];
158
159 if (areEqual(key, param)) {
160 item = value;
161 break;
162 }
163 }
164 }
165
166 if (item !== undefined) {
167 if (shouldRemove != null && shouldRemove(item[1], param)) {
168 atoms.delete(param);
169 } else {
170 return item[0];
171 }
172 }
173
174 var newAtom = initializeAtom(param);
175 atoms.set(param, [newAtom, Date.now()]);
176 return newAtom;
177 };
178
179 createAtom.remove = function (param) {
180 if (areEqual === undefined) {
181 atoms.delete(param);
182 } else {
183 for (var _iterator2 = _createForOfIteratorHelperLoose(atoms), _step2; !(_step2 = _iterator2()).done;) {
184 var _step2$value = _step2.value,
185 key = _step2$value[0];
186
187 if (areEqual(key, param)) {
188 atoms.delete(key);
189 break;
190 }
191 }
192 }
193 };
194
195 createAtom.setShouldRemove = function (fn) {
196 shouldRemove = fn;
197 if (!shouldRemove) return;
198
199 for (var _iterator3 = _createForOfIteratorHelperLoose(atoms), _step3; !(_step3 = _iterator3()).done;) {
200 var _step3$value = _step3.value,
201 key = _step3$value[0],
202 value = _step3$value[1];
203
204 if (shouldRemove(value[1], key)) {
205 atoms.delete(key);
206 }
207 }
208 };
209
210 return createAtom;
211 }
212
213 var getWeakCacheItem = function getWeakCacheItem(cache, deps) {
214 do {
215 var _deps = deps,
216 dep = _deps[0],
217 rest = _deps.slice(1);
218
219 var entry = cache.get(dep);
220
221 if (!entry) {
222 return;
223 }
224
225 if (!rest.length) {
226 return entry[1];
227 }
228
229 cache = entry[0];
230 deps = rest;
231 } while (deps.length);
232 };
233
234 var setWeakCacheItem = function setWeakCacheItem(cache, deps, item) {
235 do {
236 var _deps2 = deps,
237 dep = _deps2[0],
238 rest = _deps2.slice(1);
239
240 var entry = cache.get(dep);
241
242 if (!entry) {
243 entry = [new WeakMap()];
244 cache.set(dep, entry);
245 }
246
247 if (!rest.length) {
248 entry[1] = item;
249 return;
250 }
251
252 cache = entry[0];
253 deps = rest;
254 } while (deps.length);
255 };
256
257 var createMemoizeAtom = function createMemoizeAtom() {
258 var cache = new WeakMap();
259
260 var memoizeAtom = function memoizeAtom(createAtom, deps) {
261 var cachedAtom = getWeakCacheItem(cache, deps);
262
263 if (cachedAtom) {
264 return cachedAtom;
265 }
266
267 var createdAtom = createAtom();
268 setWeakCacheItem(cache, deps, createdAtom);
269 return createdAtom;
270 };
271
272 return memoizeAtom;
273 };
274
275 var memoizeAtom$4 = createMemoizeAtom();
276 function selectAtom(anAtom, selector, equalityFn) {
277 if (equalityFn === void 0) {
278 equalityFn = Object.is;
279 }
280
281 return memoizeAtom$4(function () {
282 var refAtom = jotai.atom(function () {
283 return {};
284 });
285 var derivedAtom = jotai.atom(function (get) {
286 var slice = selector(get(anAtom));
287 var ref = get(refAtom);
288
289 if ('prev' in ref && equalityFn(ref.prev, slice)) {
290 return ref.prev;
291 }
292
293 ref.prev = slice;
294 return slice;
295 });
296 return derivedAtom;
297 }, [anAtom, selector, equalityFn]);
298 }
299
300 function useAtomCallback(callback, scope) {
301 var anAtom = react.useMemo(function () {
302 return jotai.atom(null, function (get, set, _ref) {
303 var arg = _ref[0],
304 resolve = _ref[1],
305 reject = _ref[2];
306
307 try {
308 resolve(callback(get, set, arg));
309 } catch (e) {
310 reject(e);
311 }
312 });
313 }, [callback]);
314 var invoke = jotai.useSetAtom(anAtom, scope);
315 return react.useCallback(function (arg) {
316 var isSync = true;
317 var settled = {};
318 var promise = new Promise(function (resolve, reject) {
319 invoke([arg, function (v) {
320 if (isSync) {
321 settled = {
322 v: v
323 };
324 } else {
325 resolve(v);
326 }
327 }, function (e) {
328 if (isSync) {
329 settled = {
330 e: e
331 };
332 } else {
333 reject(e);
334 }
335 }]);
336 });
337 isSync = false;
338
339 if ('e' in settled) {
340 throw settled.e;
341 }
342
343 if ('v' in settled) {
344 return settled.v;
345 }
346
347 return promise;
348 }, [invoke]);
349 }
350
351 var memoizeAtom$3 = createMemoizeAtom();
352
353 var deepFreeze = function deepFreeze(obj) {
354 if (typeof obj !== 'object' || obj === null) return;
355 Object.freeze(obj);
356 var propNames = Object.getOwnPropertyNames(obj);
357
358 for (var _iterator = _createForOfIteratorHelperLoose(propNames), _step; !(_step = _iterator()).done;) {
359 var name = _step.value;
360 var value = obj[name];
361 deepFreeze(value);
362 }
363
364 return obj;
365 };
366
367 function freezeAtom(anAtom) {
368 return memoizeAtom$3(function () {
369 var frozenAtom = jotai.atom(function (get) {
370 return deepFreeze(get(anAtom));
371 }, function (_get, set, arg) {
372 return set(anAtom, arg);
373 });
374 return frozenAtom;
375 }, [anAtom]);
376 }
377 function freezeAtomCreator(createAtom) {
378 return function () {
379 var anAtom = createAtom.apply(void 0, arguments);
380 var origRead = anAtom.read;
381
382 anAtom.read = function (get) {
383 return deepFreeze(origRead(get));
384 };
385
386 return anAtom;
387 };
388 }
389
390 var memoizeAtom$2 = createMemoizeAtom();
391
392 var isWritable = function isWritable(atom) {
393 return !!atom.write;
394 };
395
396 var isFunction = function isFunction(x) {
397 return typeof x === 'function';
398 };
399
400 function splitAtom(arrAtom, keyExtractor) {
401 return memoizeAtom$2(function () {
402 var mappingCache = new WeakMap();
403
404 var getMapping = function getMapping(arr, prev) {
405 var mapping = mappingCache.get(arr);
406
407 if (mapping) {
408 return mapping;
409 }
410
411 var prevMapping = prev && mappingCache.get(prev);
412 var atomList = [];
413 var keyList = [];
414 arr.forEach(function (item, index) {
415 var key = keyExtractor ? keyExtractor(item) : index;
416 keyList[index] = key;
417 var cachedAtom = prevMapping && prevMapping.atomList[prevMapping.keyList.indexOf(key)];
418
419 if (cachedAtom) {
420 atomList[index] = cachedAtom;
421 return;
422 }
423
424 var read = function read(get) {
425 var ref = get(refAtom);
426 var currArr = get(arrAtom);
427 var mapping = getMapping(currArr, ref.prev);
428 var index = mapping.keyList.indexOf(key);
429
430 if (index < 0 || index >= currArr.length) {
431 var prevItem = arr[getMapping(arr).keyList.indexOf(key)];
432
433 if (prevItem) {
434 return prevItem;
435 }
436
437 throw new Error('splitAtom: index out of bounds for read');
438 }
439
440 return currArr[index];
441 };
442
443 var write = function write(get, set, update) {
444 var ref = get(refAtom);
445 var arr = get(arrAtom);
446 var mapping = getMapping(arr, ref.prev);
447 var index = mapping.keyList.indexOf(key);
448
449 if (index < 0 || index >= arr.length) {
450 throw new Error('splitAtom: index out of bounds for write');
451 }
452
453 var nextItem = isFunction(update) ? update(arr[index]) : update;
454 set(arrAtom, [].concat(arr.slice(0, index), [nextItem], arr.slice(index + 1)));
455 };
456
457 atomList[index] = isWritable(arrAtom) ? jotai.atom(read, write) : jotai.atom(read);
458 });
459
460 if (prevMapping && prevMapping.keyList.length === keyList.length && prevMapping.keyList.every(function (x, i) {
461 return x === keyList[i];
462 })) {
463 mapping = prevMapping;
464 } else {
465 mapping = {
466 atomList: atomList,
467 keyList: keyList
468 };
469 }
470
471 mappingCache.set(arr, mapping);
472 return mapping;
473 };
474
475 var refAtom = jotai.atom(function () {
476 return {};
477 });
478
479 var read = function read(get) {
480 var ref = get(refAtom);
481 var arr = get(arrAtom);
482 var mapping = getMapping(arr, ref.prev);
483 ref.prev = arr;
484 return mapping.atomList;
485 };
486
487 var write = function write(get, set, action) {
488 if ('read' in action) {
489 console.warn('atomToRemove is deprecated. use action with type');
490 action = {
491 type: 'remove',
492 atom: action
493 };
494 }
495
496 switch (action.type) {
497 case 'remove':
498 {
499 var index = get(splittedAtom).indexOf(action.atom);
500
501 if (index >= 0) {
502 var arr = get(arrAtom);
503 set(arrAtom, [].concat(arr.slice(0, index), arr.slice(index + 1)));
504 }
505
506 break;
507 }
508
509 case 'insert':
510 {
511 var _index = action.before ? get(splittedAtom).indexOf(action.before) : get(splittedAtom).length;
512
513 if (_index >= 0) {
514 var _arr = get(arrAtom);
515
516 set(arrAtom, [].concat(_arr.slice(0, _index), [action.value], _arr.slice(_index)));
517 }
518
519 break;
520 }
521
522 case 'move':
523 {
524 var index1 = get(splittedAtom).indexOf(action.atom);
525 var index2 = action.before ? get(splittedAtom).indexOf(action.before) : get(splittedAtom).length;
526
527 if (index1 >= 0 && index2 >= 0) {
528 var _arr2 = get(arrAtom);
529
530 if (index1 < index2) {
531 set(arrAtom, [].concat(_arr2.slice(0, index1), _arr2.slice(index1 + 1, index2), [_arr2[index1]], _arr2.slice(index2)));
532 } else {
533 set(arrAtom, [].concat(_arr2.slice(0, index2), [_arr2[index1]], _arr2.slice(index2, index1), _arr2.slice(index1 + 1)));
534 }
535 }
536
537 break;
538 }
539 }
540 };
541
542 var splittedAtom = isWritable(arrAtom) ? jotai.atom(read, write) : jotai.atom(read);
543 return splittedAtom;
544 }, keyExtractor ? [arrAtom, keyExtractor] : [arrAtom]);
545 }
546
547 function atomWithDefault(getDefault) {
548 var EMPTY = Symbol();
549 var overwrittenAtom = jotai.atom(EMPTY);
550 var anAtom = jotai.atom(function (get) {
551 var overwritten = get(overwrittenAtom);
552
553 if (overwritten !== EMPTY) {
554 return overwritten;
555 }
556
557 return getDefault(get);
558 }, function (get, set, update) {
559 if (update === RESET) {
560 return set(overwrittenAtom, EMPTY);
561 }
562
563 return set(overwrittenAtom, typeof update === 'function' ? update(get(anAtom)) : update);
564 });
565 return anAtom;
566 }
567
568 var memoizeAtom$1 = createMemoizeAtom();
569 function waitForAll(atoms) {
570 var createAtom = function createAtom() {
571 var unwrappedAtoms = unwrapAtoms(atoms);
572 var derivedAtom = jotai.atom(function (get) {
573 var promises = [];
574 var values = unwrappedAtoms.map(function (anAtom, index) {
575 try {
576 return get(anAtom);
577 } catch (e) {
578 if (e instanceof Promise) {
579 promises[index] = e;
580 } else {
581 throw e;
582 }
583 }
584 });
585
586 if (promises.length) {
587 throw Promise.all(promises);
588 }
589
590 return wrapResults(atoms, values);
591 });
592 return derivedAtom;
593 };
594
595 if (Array.isArray(atoms)) {
596 return memoizeAtom$1(createAtom, atoms);
597 }
598
599 return createAtom();
600 }
601
602 var unwrapAtoms = function unwrapAtoms(atoms) {
603 return Array.isArray(atoms) ? atoms : Object.getOwnPropertyNames(atoms).map(function (key) {
604 return atoms[key];
605 });
606 };
607
608 var wrapResults = function wrapResults(atoms, results) {
609 return Array.isArray(atoms) ? results : Object.getOwnPropertyNames(atoms).reduce(function (out, key, idx) {
610 var _extends2;
611
612 return _extends({}, out, (_extends2 = {}, _extends2[key] = results[idx], _extends2));
613 }, {});
614 };
615
616 function createJSONStorage(getStringStorage) {
617 var lastStr;
618 var lastValue;
619 return {
620 getItem: function getItem(key) {
621 var parse = function parse(str) {
622 str = str || '';
623
624 if (lastStr !== str) {
625 lastValue = JSON.parse(str);
626 lastStr = str;
627 }
628
629 return lastValue;
630 };
631
632 var str = getStringStorage().getItem(key);
633
634 if (str instanceof Promise) {
635 return str.then(parse);
636 }
637
638 return parse(str);
639 },
640 setItem: function setItem(key, newValue) {
641 return getStringStorage().setItem(key, JSON.stringify(newValue));
642 },
643 removeItem: function removeItem(key) {
644 return getStringStorage().removeItem(key);
645 }
646 };
647 }
648 var defaultStorage = createJSONStorage(function () {
649 return localStorage;
650 });
651
652 defaultStorage.subscribe = function (key, callback) {
653 var storageEventCallback = function storageEventCallback(e) {
654 if (e.key === key && e.newValue) {
655 callback(JSON.parse(e.newValue));
656 }
657 };
658
659 window.addEventListener('storage', storageEventCallback);
660 return function () {
661 window.removeEventListener('storage', storageEventCallback);
662 };
663 };
664
665 function atomWithStorage(key, initialValue, storage) {
666 if (storage === void 0) {
667 storage = defaultStorage;
668 }
669
670 var getInitialValue = function getInitialValue() {
671 try {
672 var _value = storage.getItem(key);
673
674 if (_value instanceof Promise) {
675 return _value.catch(function () {
676 return initialValue;
677 });
678 }
679
680 return _value;
681 } catch (_unused) {
682 return initialValue;
683 }
684 };
685
686 var baseAtom = jotai.atom(storage.delayInit ? initialValue : getInitialValue());
687
688 baseAtom.onMount = function (setAtom) {
689 var unsub;
690
691 if (storage.subscribe) {
692 unsub = storage.subscribe(key, setAtom);
693 setAtom(getInitialValue());
694 }
695
696 if (storage.delayInit) {
697 var _value2 = getInitialValue();
698
699 if (_value2 instanceof Promise) {
700 _value2.then(setAtom);
701 } else {
702 setAtom(_value2);
703 }
704 }
705
706 return unsub;
707 };
708
709 var anAtom = jotai.atom(function (get) {
710 return get(baseAtom);
711 }, function (get, set, update) {
712 if (update === RESET) {
713 set(baseAtom, initialValue);
714 return storage.removeItem(key);
715 }
716
717 var newValue = typeof update === 'function' ? update(get(baseAtom)) : update;
718 set(baseAtom, newValue);
719 return storage.setItem(key, newValue);
720 });
721 return anAtom;
722 }
723 function atomWithHash(key, initialValue, options) {
724 var serialize = (options == null ? void 0 : options.serialize) || JSON.stringify;
725 var deserialize = (options == null ? void 0 : options.deserialize) || JSON.parse;
726
727 var _subscribe = (options == null ? void 0 : options.subscribe) || function (callback) {
728 window.addEventListener('hashchange', callback);
729 return function () {
730 window.removeEventListener('hashchange', callback);
731 };
732 };
733
734 var hashStorage = _extends({
735 getItem: function getItem(key) {
736 var searchParams = new URLSearchParams(location.hash.slice(1));
737 var storedValue = searchParams.get(key);
738
739 if (storedValue === null) {
740 throw new Error('no value stored');
741 }
742
743 return deserialize(storedValue);
744 },
745 setItem: function setItem(key, newValue) {
746 var searchParams = new URLSearchParams(location.hash.slice(1));
747 searchParams.set(key, serialize(newValue));
748
749 if (options != null && options.replaceState) {
750 history.replaceState(null, '', '#' + searchParams.toString());
751 } else {
752 location.hash = searchParams.toString();
753 }
754 },
755 removeItem: function removeItem(key) {
756 var searchParams = new URLSearchParams(location.hash.slice(1));
757 searchParams.delete(key);
758
759 if (options != null && options.replaceState) {
760 history.replaceState(null, '', '#' + searchParams.toString());
761 } else {
762 location.hash = searchParams.toString();
763 }
764 }
765 }, (options == null ? void 0 : options.delayInit) && {
766 delayInit: true
767 }, {
768 subscribe: function subscribe(key, setValue) {
769 var callback = function callback() {
770 var searchParams = new URLSearchParams(location.hash.slice(1));
771 var str = searchParams.get(key);
772
773 if (str !== null) {
774 setValue(deserialize(str));
775 } else {
776 setValue(initialValue);
777 }
778 };
779
780 return _subscribe(callback);
781 }
782 });
783
784 return atomWithStorage(key, initialValue, hashStorage);
785 }
786
787 function atomWithObservable(createObservable, options) {
788 var observableResultAtom = jotai.atom(function (get) {
789 var _observable$Symbol$ob, _observable;
790
791 var observable = createObservable(get);
792 var itself = (_observable$Symbol$ob = (_observable = observable)[Symbol.observable]) == null ? void 0 : _observable$Symbol$ob.call(_observable);
793
794 if (itself) {
795 observable = itself;
796 }
797
798 var dataAtom = jotai.atom(options != null && options.initialValue ? getInitialValue(options) : firstValueFrom(observable));
799
800 var setData = function setData() {
801 throw new Error('setting data without mount');
802 };
803
804 var dataListener = function dataListener(data) {
805 setData(data);
806 };
807
808 var errorListener = function errorListener(error) {
809 setData(Promise.reject(error));
810 };
811
812 var subscription = null;
813
814 dataAtom.onMount = function (update) {
815 setData = update;
816
817 if (!subscription) {
818 subscription = observable.subscribe(dataListener, errorListener);
819 }
820
821 return function () {
822 var _subscription;
823
824 (_subscription = subscription) == null ? void 0 : _subscription.unsubscribe();
825 subscription = null;
826 };
827 };
828
829 return {
830 dataAtom: dataAtom,
831 observable: observable
832 };
833 });
834 var observableAtom = jotai.atom(function (get) {
835 var _get = get(observableResultAtom),
836 dataAtom = _get.dataAtom;
837
838 return get(dataAtom);
839 }, function (get, _set, data) {
840 var _get2 = get(observableResultAtom),
841 observable = _get2.observable;
842
843 if ('next' in observable) {
844 observable.next(data);
845 } else {
846 throw new Error('observable is not subject');
847 }
848 });
849 return observableAtom;
850 }
851
852 function getInitialValue(options) {
853 var initialValue = options.initialValue;
854 return initialValue instanceof Function ? initialValue() : initialValue;
855 }
856
857 function firstValueFrom(source) {
858 return new Promise(function (resolve, reject) {
859 var resolved = false;
860 var subscription = source.subscribe({
861 next: function next(value) {
862 resolve(value);
863 resolved = true;
864
865 if (subscription) {
866 subscription.unsubscribe();
867 }
868 },
869 error: reject,
870 complete: function complete() {
871 reject();
872 }
873 });
874
875 if (resolved) {
876 subscription.unsubscribe();
877 }
878 });
879 }
880
881 var hydratedMap = new WeakMap();
882 function useHydrateAtoms(values, scope) {
883 var ScopeContext = jotai.SECRET_INTERNAL_getScopeContext(scope);
884 var scopeContainer = react.useContext(ScopeContext);
885 var store = scopeContainer.s;
886 var hydratedSet = getHydratedSet(scopeContainer);
887 var tuplesToRestore = [];
888
889 for (var _iterator = _createForOfIteratorHelperLoose(values), _step; !(_step = _iterator()).done;) {
890 var tuple = _step.value;
891 var atom = tuple[0];
892
893 if (!hydratedSet.has(atom)) {
894 hydratedSet.add(atom);
895 tuplesToRestore.push(tuple);
896 }
897 }
898
899 if (tuplesToRestore.length) {
900 store[RESTORE_ATOMS](tuplesToRestore);
901 }
902 }
903
904 function getHydratedSet(scopeContainer) {
905 var hydratedSet = hydratedMap.get(scopeContainer);
906
907 if (!hydratedSet) {
908 hydratedSet = new WeakSet();
909 hydratedMap.set(scopeContainer, hydratedSet);
910 }
911
912 return hydratedSet;
913 }
914
915 var memoizeAtom = createMemoizeAtom();
916 var LOADING = {
917 state: 'loading'
918 };
919 function loadable(anAtom) {
920 return memoizeAtom(function () {
921 var loadableAtomCache = new WeakMap();
922 var catchAtom = jotai.atom(function (get) {
923 var promise;
924
925 try {
926 var data = get(anAtom);
927
928 var _loadableAtom = jotai.atom({
929 state: 'hasData',
930 data: data
931 });
932
933 return _loadableAtom;
934 } catch (error) {
935 if (error instanceof Promise) {
936 promise = error;
937 } else {
938 var _loadableAtom2 = jotai.atom({
939 state: 'hasError',
940 error: error
941 });
942
943 return _loadableAtom2;
944 }
945 }
946
947 var cached = loadableAtomCache.get(promise);
948
949 if (cached) {
950 return cached;
951 }
952
953 var loadableAtom = jotai.atom(LOADING, function () {
954 var _ref = _asyncToGenerator(regeneratorRuntime.mark(function _callee(get, set) {
955 var _data;
956
957 return regeneratorRuntime.wrap(function _callee$(_context) {
958 while (1) {
959 switch (_context.prev = _context.next) {
960 case 0:
961 _context.prev = 0;
962 _context.next = 3;
963 return get(anAtom, {
964 unstable_promise: true
965 });
966
967 case 3:
968 _data = _context.sent;
969 set(loadableAtom, {
970 state: 'hasData',
971 data: _data
972 });
973 _context.next = 10;
974 break;
975
976 case 7:
977 _context.prev = 7;
978 _context.t0 = _context["catch"](0);
979 set(loadableAtom, {
980 state: 'hasError',
981 error: _context.t0
982 });
983
984 case 10:
985 case "end":
986 return _context.stop();
987 }
988 }
989 }, _callee, null, [[0, 7]]);
990 }));
991
992 return function (_x, _x2) {
993 return _ref.apply(this, arguments);
994 };
995 }());
996
997 loadableAtom.onMount = function (init) {
998 init();
999 };
1000
1001 loadableAtomCache.set(promise, loadableAtom);
1002 return loadableAtom;
1003 });
1004 var derivedAtom = jotai.atom(function (get) {
1005 var loadableAtom = get(catchAtom);
1006 return get(loadableAtom);
1007 });
1008 return derivedAtom;
1009 }, [anAtom]);
1010 }
1011
1012 Object.defineProperty(exports, 'useAtomValue', {
1013 enumerable: true,
1014 get: function () { return jotai.useAtomValue; }
1015 });
1016 Object.defineProperty(exports, 'useUpdateAtom', {
1017 enumerable: true,
1018 get: function () { return jotai.useSetAtom; }
1019 });
1020 exports.RESET = RESET;
1021 exports.atomFamily = atomFamily;
1022 exports.atomWithDefault = atomWithDefault;
1023 exports.atomWithHash = atomWithHash;
1024 exports.atomWithObservable = atomWithObservable;
1025 exports.atomWithReducer = atomWithReducer;
1026 exports.atomWithReset = atomWithReset;
1027 exports.atomWithStorage = atomWithStorage;
1028 exports.createJSONStorage = createJSONStorage;
1029 exports.freezeAtom = freezeAtom;
1030 exports.freezeAtomCreator = freezeAtomCreator;
1031 exports.loadable = loadable;
1032 exports.selectAtom = selectAtom;
1033 exports.splitAtom = splitAtom;
1034 exports.useAtomCallback = useAtomCallback;
1035 exports.useHydrateAtoms = useHydrateAtoms;
1036 exports.useReducerAtom = useReducerAtom;
1037 exports.useResetAtom = useResetAtom;
1038 exports.waitForAll = waitForAll;
1039
1040 Object.defineProperty(exports, '__esModule', { value: true });
1041
1042}));