UNPKG

46 kBJavaScriptView Raw
1(function (global, factory) {
2 typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('jotai'), require('jotai/vanilla/utils'), require('react')) :
3 typeof define === 'function' && define.amd ? define(['exports', 'jotai', 'jotai/vanilla/utils', 'react'], factory) :
4 (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.jotaiUtils = {}, global.Jotai, global.utils, global.React));
5})(this, (function (exports, Jotai, utils, react) { 'use strict';
6
7 function _interopNamespaceDefault(e) {
8 var n = Object.create(null);
9 if (e) {
10 Object.keys(e).forEach(function (k) {
11 if (k !== 'default') {
12 var d = Object.getOwnPropertyDescriptor(e, k);
13 Object.defineProperty(n, k, d.get ? d : {
14 enumerable: true,
15 get: function () { return e[k]; }
16 });
17 }
18 });
19 }
20 n.default = e;
21 return Object.freeze(n);
22 }
23
24 var Jotai__namespace = /*#__PURE__*/_interopNamespaceDefault(Jotai);
25
26 function atomWithReset(initialValue) {
27 var anAtom = Jotai.atom(initialValue, function (get, set, update) {
28 var nextValue = typeof update === 'function' ? update(get(anAtom)) : update;
29 set(anAtom, nextValue === utils.RESET ? initialValue : nextValue);
30 });
31 return anAtom;
32 }
33
34 function _regeneratorRuntime() {
35 _regeneratorRuntime = function () {
36 return exports;
37 };
38 var exports = {},
39 Op = Object.prototype,
40 hasOwn = Op.hasOwnProperty,
41 defineProperty = Object.defineProperty || function (obj, key, desc) {
42 obj[key] = desc.value;
43 },
44 $Symbol = "function" == typeof Symbol ? Symbol : {},
45 iteratorSymbol = $Symbol.iterator || "@@iterator",
46 asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator",
47 toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag";
48 function define(obj, key, value) {
49 return Object.defineProperty(obj, key, {
50 value: value,
51 enumerable: !0,
52 configurable: !0,
53 writable: !0
54 }), obj[key];
55 }
56 try {
57 define({}, "");
58 } catch (err) {
59 define = function (obj, key, value) {
60 return obj[key] = value;
61 };
62 }
63 function wrap(innerFn, outerFn, self, tryLocsList) {
64 var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator,
65 generator = Object.create(protoGenerator.prototype),
66 context = new Context(tryLocsList || []);
67 return defineProperty(generator, "_invoke", {
68 value: makeInvokeMethod(innerFn, self, context)
69 }), generator;
70 }
71 function tryCatch(fn, obj, arg) {
72 try {
73 return {
74 type: "normal",
75 arg: fn.call(obj, arg)
76 };
77 } catch (err) {
78 return {
79 type: "throw",
80 arg: err
81 };
82 }
83 }
84 exports.wrap = wrap;
85 var ContinueSentinel = {};
86 function Generator() {}
87 function GeneratorFunction() {}
88 function GeneratorFunctionPrototype() {}
89 var IteratorPrototype = {};
90 define(IteratorPrototype, iteratorSymbol, function () {
91 return this;
92 });
93 var getProto = Object.getPrototypeOf,
94 NativeIteratorPrototype = getProto && getProto(getProto(values([])));
95 NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol) && (IteratorPrototype = NativeIteratorPrototype);
96 var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype);
97 function defineIteratorMethods(prototype) {
98 ["next", "throw", "return"].forEach(function (method) {
99 define(prototype, method, function (arg) {
100 return this._invoke(method, arg);
101 });
102 });
103 }
104 function AsyncIterator(generator, PromiseImpl) {
105 function invoke(method, arg, resolve, reject) {
106 var record = tryCatch(generator[method], generator, arg);
107 if ("throw" !== record.type) {
108 var result = record.arg,
109 value = result.value;
110 return value && "object" == typeof value && hasOwn.call(value, "__await") ? PromiseImpl.resolve(value.__await).then(function (value) {
111 invoke("next", value, resolve, reject);
112 }, function (err) {
113 invoke("throw", err, resolve, reject);
114 }) : PromiseImpl.resolve(value).then(function (unwrapped) {
115 result.value = unwrapped, resolve(result);
116 }, function (error) {
117 return invoke("throw", error, resolve, reject);
118 });
119 }
120 reject(record.arg);
121 }
122 var previousPromise;
123 defineProperty(this, "_invoke", {
124 value: function (method, arg) {
125 function callInvokeWithMethodAndArg() {
126 return new PromiseImpl(function (resolve, reject) {
127 invoke(method, arg, resolve, reject);
128 });
129 }
130 return previousPromise = previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg();
131 }
132 });
133 }
134 function makeInvokeMethod(innerFn, self, context) {
135 var state = "suspendedStart";
136 return function (method, arg) {
137 if ("executing" === state) throw new Error("Generator is already running");
138 if ("completed" === state) {
139 if ("throw" === method) throw arg;
140 return doneResult();
141 }
142 for (context.method = method, context.arg = arg;;) {
143 var delegate = context.delegate;
144 if (delegate) {
145 var delegateResult = maybeInvokeDelegate(delegate, context);
146 if (delegateResult) {
147 if (delegateResult === ContinueSentinel) continue;
148 return delegateResult;
149 }
150 }
151 if ("next" === context.method) context.sent = context._sent = context.arg;else if ("throw" === context.method) {
152 if ("suspendedStart" === state) throw state = "completed", context.arg;
153 context.dispatchException(context.arg);
154 } else "return" === context.method && context.abrupt("return", context.arg);
155 state = "executing";
156 var record = tryCatch(innerFn, self, context);
157 if ("normal" === record.type) {
158 if (state = context.done ? "completed" : "suspendedYield", record.arg === ContinueSentinel) continue;
159 return {
160 value: record.arg,
161 done: context.done
162 };
163 }
164 "throw" === record.type && (state = "completed", context.method = "throw", context.arg = record.arg);
165 }
166 };
167 }
168 function maybeInvokeDelegate(delegate, context) {
169 var methodName = context.method,
170 method = delegate.iterator[methodName];
171 if (undefined === method) return context.delegate = null, "throw" === methodName && delegate.iterator.return && (context.method = "return", context.arg = undefined, maybeInvokeDelegate(delegate, context), "throw" === context.method) || "return" !== methodName && (context.method = "throw", context.arg = new TypeError("The iterator does not provide a '" + methodName + "' method")), ContinueSentinel;
172 var record = tryCatch(method, delegate.iterator, context.arg);
173 if ("throw" === record.type) return context.method = "throw", context.arg = record.arg, context.delegate = null, ContinueSentinel;
174 var info = record.arg;
175 return info ? info.done ? (context[delegate.resultName] = info.value, context.next = delegate.nextLoc, "return" !== context.method && (context.method = "next", context.arg = undefined), context.delegate = null, ContinueSentinel) : info : (context.method = "throw", context.arg = new TypeError("iterator result is not an object"), context.delegate = null, ContinueSentinel);
176 }
177 function pushTryEntry(locs) {
178 var entry = {
179 tryLoc: locs[0]
180 };
181 1 in locs && (entry.catchLoc = locs[1]), 2 in locs && (entry.finallyLoc = locs[2], entry.afterLoc = locs[3]), this.tryEntries.push(entry);
182 }
183 function resetTryEntry(entry) {
184 var record = entry.completion || {};
185 record.type = "normal", delete record.arg, entry.completion = record;
186 }
187 function Context(tryLocsList) {
188 this.tryEntries = [{
189 tryLoc: "root"
190 }], tryLocsList.forEach(pushTryEntry, this), this.reset(!0);
191 }
192 function values(iterable) {
193 if (iterable) {
194 var iteratorMethod = iterable[iteratorSymbol];
195 if (iteratorMethod) return iteratorMethod.call(iterable);
196 if ("function" == typeof iterable.next) return iterable;
197 if (!isNaN(iterable.length)) {
198 var i = -1,
199 next = function next() {
200 for (; ++i < iterable.length;) if (hasOwn.call(iterable, i)) return next.value = iterable[i], next.done = !1, next;
201 return next.value = undefined, next.done = !0, next;
202 };
203 return next.next = next;
204 }
205 }
206 return {
207 next: doneResult
208 };
209 }
210 function doneResult() {
211 return {
212 value: undefined,
213 done: !0
214 };
215 }
216 return GeneratorFunction.prototype = GeneratorFunctionPrototype, defineProperty(Gp, "constructor", {
217 value: GeneratorFunctionPrototype,
218 configurable: !0
219 }), defineProperty(GeneratorFunctionPrototype, "constructor", {
220 value: GeneratorFunction,
221 configurable: !0
222 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, toStringTagSymbol, "GeneratorFunction"), exports.isGeneratorFunction = function (genFun) {
223 var ctor = "function" == typeof genFun && genFun.constructor;
224 return !!ctor && (ctor === GeneratorFunction || "GeneratorFunction" === (ctor.displayName || ctor.name));
225 }, exports.mark = function (genFun) {
226 return Object.setPrototypeOf ? Object.setPrototypeOf(genFun, GeneratorFunctionPrototype) : (genFun.__proto__ = GeneratorFunctionPrototype, define(genFun, toStringTagSymbol, "GeneratorFunction")), genFun.prototype = Object.create(Gp), genFun;
227 }, exports.awrap = function (arg) {
228 return {
229 __await: arg
230 };
231 }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, asyncIteratorSymbol, function () {
232 return this;
233 }), exports.AsyncIterator = AsyncIterator, exports.async = function (innerFn, outerFn, self, tryLocsList, PromiseImpl) {
234 void 0 === PromiseImpl && (PromiseImpl = Promise);
235 var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList), PromiseImpl);
236 return exports.isGeneratorFunction(outerFn) ? iter : iter.next().then(function (result) {
237 return result.done ? result.value : iter.next();
238 });
239 }, defineIteratorMethods(Gp), define(Gp, toStringTagSymbol, "Generator"), define(Gp, iteratorSymbol, function () {
240 return this;
241 }), define(Gp, "toString", function () {
242 return "[object Generator]";
243 }), exports.keys = function (val) {
244 var object = Object(val),
245 keys = [];
246 for (var key in object) keys.push(key);
247 return keys.reverse(), function next() {
248 for (; keys.length;) {
249 var key = keys.pop();
250 if (key in object) return next.value = key, next.done = !1, next;
251 }
252 return next.done = !0, next;
253 };
254 }, exports.values = values, Context.prototype = {
255 constructor: Context,
256 reset: function (skipTempReset) {
257 if (this.prev = 0, this.next = 0, this.sent = this._sent = undefined, this.done = !1, this.delegate = null, this.method = "next", this.arg = undefined, this.tryEntries.forEach(resetTryEntry), !skipTempReset) for (var name in this) "t" === name.charAt(0) && hasOwn.call(this, name) && !isNaN(+name.slice(1)) && (this[name] = undefined);
258 },
259 stop: function () {
260 this.done = !0;
261 var rootRecord = this.tryEntries[0].completion;
262 if ("throw" === rootRecord.type) throw rootRecord.arg;
263 return this.rval;
264 },
265 dispatchException: function (exception) {
266 if (this.done) throw exception;
267 var context = this;
268 function handle(loc, caught) {
269 return record.type = "throw", record.arg = exception, context.next = loc, caught && (context.method = "next", context.arg = undefined), !!caught;
270 }
271 for (var i = this.tryEntries.length - 1; i >= 0; --i) {
272 var entry = this.tryEntries[i],
273 record = entry.completion;
274 if ("root" === entry.tryLoc) return handle("end");
275 if (entry.tryLoc <= this.prev) {
276 var hasCatch = hasOwn.call(entry, "catchLoc"),
277 hasFinally = hasOwn.call(entry, "finallyLoc");
278 if (hasCatch && hasFinally) {
279 if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0);
280 if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc);
281 } else if (hasCatch) {
282 if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0);
283 } else {
284 if (!hasFinally) throw new Error("try statement without catch or finally");
285 if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc);
286 }
287 }
288 }
289 },
290 abrupt: function (type, arg) {
291 for (var i = this.tryEntries.length - 1; i >= 0; --i) {
292 var entry = this.tryEntries[i];
293 if (entry.tryLoc <= this.prev && hasOwn.call(entry, "finallyLoc") && this.prev < entry.finallyLoc) {
294 var finallyEntry = entry;
295 break;
296 }
297 }
298 finallyEntry && ("break" === type || "continue" === type) && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc && (finallyEntry = null);
299 var record = finallyEntry ? finallyEntry.completion : {};
300 return record.type = type, record.arg = arg, finallyEntry ? (this.method = "next", this.next = finallyEntry.finallyLoc, ContinueSentinel) : this.complete(record);
301 },
302 complete: function (record, afterLoc) {
303 if ("throw" === record.type) throw record.arg;
304 return "break" === record.type || "continue" === record.type ? this.next = record.arg : "return" === record.type ? (this.rval = this.arg = record.arg, this.method = "return", this.next = "end") : "normal" === record.type && afterLoc && (this.next = afterLoc), ContinueSentinel;
305 },
306 finish: function (finallyLoc) {
307 for (var i = this.tryEntries.length - 1; i >= 0; --i) {
308 var entry = this.tryEntries[i];
309 if (entry.finallyLoc === finallyLoc) return this.complete(entry.completion, entry.afterLoc), resetTryEntry(entry), ContinueSentinel;
310 }
311 },
312 catch: function (tryLoc) {
313 for (var i = this.tryEntries.length - 1; i >= 0; --i) {
314 var entry = this.tryEntries[i];
315 if (entry.tryLoc === tryLoc) {
316 var record = entry.completion;
317 if ("throw" === record.type) {
318 var thrown = record.arg;
319 resetTryEntry(entry);
320 }
321 return thrown;
322 }
323 }
324 throw new Error("illegal catch attempt");
325 },
326 delegateYield: function (iterable, resultName, nextLoc) {
327 return this.delegate = {
328 iterator: values(iterable),
329 resultName: resultName,
330 nextLoc: nextLoc
331 }, "next" === this.method && (this.arg = undefined), ContinueSentinel;
332 }
333 }, exports;
334 }
335 function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
336 try {
337 var info = gen[key](arg);
338 var value = info.value;
339 } catch (error) {
340 reject(error);
341 return;
342 }
343 if (info.done) {
344 resolve(value);
345 } else {
346 Promise.resolve(value).then(_next, _throw);
347 }
348 }
349 function _asyncToGenerator(fn) {
350 return function () {
351 var self = this,
352 args = arguments;
353 return new Promise(function (resolve, reject) {
354 var gen = fn.apply(self, args);
355 function _next(value) {
356 asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
357 }
358 function _throw(err) {
359 asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
360 }
361 _next(undefined);
362 });
363 };
364 }
365 function _extends() {
366 _extends = Object.assign ? Object.assign.bind() : function (target) {
367 for (var i = 1; i < arguments.length; i++) {
368 var source = arguments[i];
369 for (var key in source) {
370 if (Object.prototype.hasOwnProperty.call(source, key)) {
371 target[key] = source[key];
372 }
373 }
374 }
375 return target;
376 };
377 return _extends.apply(this, arguments);
378 }
379 function _unsupportedIterableToArray(o, minLen) {
380 if (!o) return;
381 if (typeof o === "string") return _arrayLikeToArray(o, minLen);
382 var n = Object.prototype.toString.call(o).slice(8, -1);
383 if (n === "Object" && o.constructor) n = o.constructor.name;
384 if (n === "Map" || n === "Set") return Array.from(o);
385 if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
386 }
387 function _arrayLikeToArray(arr, len) {
388 if (len == null || len > arr.length) len = arr.length;
389 for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];
390 return arr2;
391 }
392 function _createForOfIteratorHelperLoose(o, allowArrayLike) {
393 var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"];
394 if (it) return (it = it.call(o)).next.bind(it);
395 if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") {
396 if (it) o = it;
397 var i = 0;
398 return function () {
399 if (i >= o.length) return {
400 done: true
401 };
402 return {
403 done: false,
404 value: o[i++]
405 };
406 };
407 }
408 throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
409 }
410
411 var WRITE_ATOM = 'w';
412 var RESTORE_ATOMS = 'h';
413
414 function useResetAtom(anAtom, scope) {
415 var ScopeContext = Jotai.SECRET_INTERNAL_getScopeContext(scope);
416 var store = react.useContext(ScopeContext).s;
417 var setAtom = react.useCallback(function () {
418 return store[WRITE_ATOM](anAtom, utils.RESET);
419 }, [store, anAtom]);
420 return setAtom;
421 }
422
423 function useReducerAtom(anAtom, reducer, scope) {
424 var _useAtom = Jotai.useAtom(anAtom, scope),
425 state = _useAtom[0],
426 setState = _useAtom[1];
427 var dispatch = react.useCallback(function (action) {
428 setState(function (prev) {
429 return reducer(prev, action);
430 });
431 }, [setState, reducer]);
432 return [state, dispatch];
433 }
434
435 function atomWithReducer(initialValue, reducer) {
436 var anAtom = Jotai.atom(initialValue, function (get, set, action) {
437 return set(anAtom, reducer(get(anAtom), action));
438 });
439 return anAtom;
440 }
441
442 function atomFamily(initializeAtom, areEqual) {
443 var shouldRemove = null;
444 var atoms = new Map();
445 var createAtom = function createAtom(param) {
446 var item;
447 if (areEqual === undefined) {
448 item = atoms.get(param);
449 } else {
450 for (var _iterator = _createForOfIteratorHelperLoose(atoms), _step; !(_step = _iterator()).done;) {
451 var _step$value = _step.value,
452 key = _step$value[0],
453 value = _step$value[1];
454 if (areEqual(key, param)) {
455 item = value;
456 break;
457 }
458 }
459 }
460 if (item !== undefined) {
461 if (shouldRemove != null && shouldRemove(item[1], param)) {
462 createAtom.remove(param);
463 } else {
464 return item[0];
465 }
466 }
467 var newAtom = initializeAtom(param);
468 atoms.set(param, [newAtom, Date.now()]);
469 return newAtom;
470 };
471 createAtom.remove = function (param) {
472 if (areEqual === undefined) {
473 atoms.delete(param);
474 } else {
475 for (var _iterator2 = _createForOfIteratorHelperLoose(atoms), _step2; !(_step2 = _iterator2()).done;) {
476 var _step2$value = _step2.value,
477 key = _step2$value[0];
478 if (areEqual(key, param)) {
479 atoms.delete(key);
480 break;
481 }
482 }
483 }
484 };
485 createAtom.setShouldRemove = function (fn) {
486 shouldRemove = fn;
487 if (!shouldRemove) return;
488 for (var _iterator3 = _createForOfIteratorHelperLoose(atoms), _step3; !(_step3 = _iterator3()).done;) {
489 var _step3$value = _step3.value,
490 key = _step3$value[0],
491 value = _step3$value[1];
492 if (shouldRemove(value[1], key)) {
493 atoms.delete(key);
494 }
495 }
496 };
497 return createAtom;
498 }
499
500 var getWeakCacheItem = function getWeakCacheItem(cache, deps) {
501 do {
502 var _deps = deps,
503 dep = _deps[0],
504 rest = _deps.slice(1);
505 var entry = cache.get(dep);
506 if (!entry) {
507 return;
508 }
509 if (!rest.length) {
510 return entry[1];
511 }
512 cache = entry[0];
513 deps = rest;
514 } while (deps.length);
515 };
516 var setWeakCacheItem = function setWeakCacheItem(cache, deps, item) {
517 do {
518 var _deps2 = deps,
519 dep = _deps2[0],
520 rest = _deps2.slice(1);
521 var entry = cache.get(dep);
522 if (!entry) {
523 entry = [new WeakMap()];
524 cache.set(dep, entry);
525 }
526 if (!rest.length) {
527 entry[1] = item;
528 return;
529 }
530 cache = entry[0];
531 deps = rest;
532 } while (deps.length);
533 };
534 var createMemoizeAtom = function createMemoizeAtom() {
535 var cache = new WeakMap();
536 var memoizeAtom = function memoizeAtom(createAtom, deps) {
537 var cachedAtom = getWeakCacheItem(cache, deps);
538 if (cachedAtom) {
539 return cachedAtom;
540 }
541 var createdAtom = createAtom();
542 setWeakCacheItem(cache, deps, createdAtom);
543 return createdAtom;
544 };
545 return memoizeAtom;
546 };
547
548 var memoizeAtom$4 = createMemoizeAtom();
549 function selectAtom(anAtom, selector, equalityFn) {
550 if (equalityFn === void 0) {
551 equalityFn = Object.is;
552 }
553 return memoizeAtom$4(function () {
554 var refAtom = Jotai.atom(function () {
555 return {};
556 });
557 var derivedAtom = Jotai.atom(function (get) {
558 var slice = selector(get(anAtom));
559 var ref = get(refAtom);
560 if ('prev' in ref && equalityFn(ref.prev, slice)) {
561 return ref.prev;
562 }
563 ref.prev = slice;
564 return slice;
565 });
566 return derivedAtom;
567 }, [anAtom, selector, equalityFn]);
568 }
569
570 function useAtomCallback(callback, scope) {
571 var anAtom = react.useMemo(function () {
572 return Jotai.atom(null, function (get, set, _ref) {
573 var arg = _ref[0],
574 resolve = _ref[1],
575 reject = _ref[2];
576 try {
577 resolve(callback(get, set, arg));
578 } catch (e) {
579 reject(e);
580 }
581 });
582 }, [callback]);
583 var invoke = Jotai.useSetAtom(anAtom, scope);
584 return react.useCallback(function (arg) {
585 var isSync = true;
586 var settled = {};
587 var promise = new Promise(function (resolve, reject) {
588 invoke([arg, function (v) {
589 if (isSync) {
590 settled = {
591 v: v
592 };
593 } else {
594 resolve(v);
595 }
596 }, function (e) {
597 if (isSync) {
598 settled = {
599 e: e
600 };
601 } else {
602 reject(e);
603 }
604 }]);
605 });
606 isSync = false;
607 if ('e' in settled) {
608 throw settled.e;
609 }
610 if ('v' in settled) {
611 return settled.v;
612 }
613 return promise;
614 }, [invoke]);
615 }
616
617 var memoizeAtom$3 = createMemoizeAtom();
618 var deepFreeze = function deepFreeze(obj) {
619 if (typeof obj !== 'object' || obj === null) return;
620 Object.freeze(obj);
621 var propNames = Object.getOwnPropertyNames(obj);
622 for (var _iterator = _createForOfIteratorHelperLoose(propNames), _step; !(_step = _iterator()).done;) {
623 var name = _step.value;
624 var value = obj[name];
625 deepFreeze(value);
626 }
627 return obj;
628 };
629 function freezeAtom(anAtom) {
630 return memoizeAtom$3(function () {
631 var frozenAtom = Jotai.atom(function (get) {
632 return deepFreeze(get(anAtom));
633 }, function (_get, set, arg) {
634 return set(anAtom, arg);
635 });
636 return frozenAtom;
637 }, [anAtom]);
638 }
639 function freezeAtomCreator(createAtom) {
640 return function () {
641 var anAtom = createAtom.apply(void 0, arguments);
642 var origRead = anAtom.read;
643 anAtom.read = function (get) {
644 return deepFreeze(origRead(get));
645 };
646 return anAtom;
647 };
648 }
649
650 var memoizeAtom$2 = createMemoizeAtom();
651 var isWritable = function isWritable(atom) {
652 return !!atom.write;
653 };
654 var isFunction = function isFunction(x) {
655 return typeof x === 'function';
656 };
657 function splitAtom(arrAtom, keyExtractor) {
658 return memoizeAtom$2(function () {
659 var mappingCache = new WeakMap();
660 var getMapping = function getMapping(arr, prev) {
661 var mapping = mappingCache.get(arr);
662 if (mapping) {
663 return mapping;
664 }
665 var prevMapping = prev && mappingCache.get(prev);
666 var atomList = [];
667 var keyList = [];
668 arr.forEach(function (item, index) {
669 var key = keyExtractor ? keyExtractor(item) : index;
670 keyList[index] = key;
671 var cachedAtom = prevMapping && prevMapping.atomList[prevMapping.keyList.indexOf(key)];
672 if (cachedAtom) {
673 atomList[index] = cachedAtom;
674 return;
675 }
676 var read = function read(get) {
677 var ref = get(refAtom);
678 var currArr = get(arrAtom);
679 var mapping = getMapping(currArr, ref.prev);
680 var index = mapping.keyList.indexOf(key);
681 if (index < 0 || index >= currArr.length) {
682 var prevItem = arr[getMapping(arr).keyList.indexOf(key)];
683 if (prevItem) {
684 return prevItem;
685 }
686 throw new Error('splitAtom: index out of bounds for read');
687 }
688 return currArr[index];
689 };
690 var write = function write(get, set, update) {
691 var ref = get(refAtom);
692 var arr = get(arrAtom);
693 var mapping = getMapping(arr, ref.prev);
694 var index = mapping.keyList.indexOf(key);
695 if (index < 0 || index >= arr.length) {
696 throw new Error('splitAtom: index out of bounds for write');
697 }
698 var nextItem = isFunction(update) ? update(arr[index]) : update;
699 set(arrAtom, [].concat(arr.slice(0, index), [nextItem], arr.slice(index + 1)));
700 };
701 atomList[index] = isWritable(arrAtom) ? Jotai.atom(read, write) : Jotai.atom(read);
702 });
703 if (prevMapping && prevMapping.keyList.length === keyList.length && prevMapping.keyList.every(function (x, i) {
704 return x === keyList[i];
705 })) {
706 mapping = prevMapping;
707 } else {
708 mapping = {
709 atomList: atomList,
710 keyList: keyList
711 };
712 }
713 mappingCache.set(arr, mapping);
714 return mapping;
715 };
716 var refAtom = Jotai.atom(function () {
717 return {};
718 });
719 var read = function read(get) {
720 var ref = get(refAtom);
721 var arr = get(arrAtom);
722 var mapping = getMapping(arr, ref.prev);
723 ref.prev = arr;
724 return mapping.atomList;
725 };
726 var write = function write(get, set, action) {
727 if ('read' in action) {
728 console.warn('atomToRemove is deprecated. use action with type');
729 action = {
730 type: 'remove',
731 atom: action
732 };
733 }
734 switch (action.type) {
735 case 'remove':
736 {
737 var index = get(splittedAtom).indexOf(action.atom);
738 if (index >= 0) {
739 var arr = get(arrAtom);
740 set(arrAtom, [].concat(arr.slice(0, index), arr.slice(index + 1)));
741 }
742 break;
743 }
744 case 'insert':
745 {
746 var _index = action.before ? get(splittedAtom).indexOf(action.before) : get(splittedAtom).length;
747 if (_index >= 0) {
748 var _arr = get(arrAtom);
749 set(arrAtom, [].concat(_arr.slice(0, _index), [action.value], _arr.slice(_index)));
750 }
751 break;
752 }
753 case 'move':
754 {
755 var index1 = get(splittedAtom).indexOf(action.atom);
756 var index2 = action.before ? get(splittedAtom).indexOf(action.before) : get(splittedAtom).length;
757 if (index1 >= 0 && index2 >= 0) {
758 var _arr2 = get(arrAtom);
759 if (index1 < index2) {
760 set(arrAtom, [].concat(_arr2.slice(0, index1), _arr2.slice(index1 + 1, index2), [_arr2[index1]], _arr2.slice(index2)));
761 } else {
762 set(arrAtom, [].concat(_arr2.slice(0, index2), [_arr2[index1]], _arr2.slice(index2, index1), _arr2.slice(index1 + 1)));
763 }
764 }
765 break;
766 }
767 }
768 };
769 var splittedAtom = isWritable(arrAtom) ? Jotai.atom(read, write) : Jotai.atom(read);
770 return splittedAtom;
771 }, keyExtractor ? [arrAtom, keyExtractor] : [arrAtom]);
772 }
773
774 function atomWithDefault(getDefault) {
775 var EMPTY = Symbol();
776 var overwrittenAtom = Jotai.atom(EMPTY);
777 var anAtom = Jotai.atom(function (get) {
778 var overwritten = get(overwrittenAtom);
779 if (overwritten !== EMPTY) {
780 return overwritten;
781 }
782 return getDefault(get);
783 }, function (get, set, update) {
784 if (update === utils.RESET) {
785 return set(overwrittenAtom, EMPTY);
786 }
787 return set(overwrittenAtom, typeof update === 'function' ? update(get(anAtom)) : update);
788 });
789 return anAtom;
790 }
791
792 var memoizeAtom$1 = createMemoizeAtom();
793 var emptyArrayAtom = Jotai.atom(function () {
794 return [];
795 });
796 function waitForAll(atoms) {
797 var createAtom = function createAtom() {
798 var unwrappedAtoms = unwrapAtoms(atoms);
799 var derivedAtom = Jotai.atom(function (get) {
800 var promises = [];
801 var values = unwrappedAtoms.map(function (anAtom, index) {
802 try {
803 return get(anAtom);
804 } catch (e) {
805 if (e instanceof Promise) {
806 promises[index] = e;
807 } else {
808 throw e;
809 }
810 }
811 });
812 if (promises.length) {
813 throw Promise.all(promises);
814 }
815 return wrapResults(atoms, values);
816 });
817 return derivedAtom;
818 };
819 if (Array.isArray(atoms)) {
820 if (atoms.length) {
821 return memoizeAtom$1(createAtom, atoms);
822 }
823 return emptyArrayAtom;
824 }
825 return createAtom();
826 }
827 var unwrapAtoms = function unwrapAtoms(atoms) {
828 return Array.isArray(atoms) ? atoms : Object.getOwnPropertyNames(atoms).map(function (key) {
829 return atoms[key];
830 });
831 };
832 var wrapResults = function wrapResults(atoms, results) {
833 return Array.isArray(atoms) ? results : Object.getOwnPropertyNames(atoms).reduce(function (out, key, idx) {
834 var _extends2;
835 return _extends({}, out, (_extends2 = {}, _extends2[key] = results[idx], _extends2));
836 }, {});
837 };
838
839 function createJSONStorage(getStringStorage) {
840 var lastStr;
841 var lastValue;
842 var storage = {
843 getItem: function getItem(key) {
844 var _getStringStorage$get, _getStringStorage;
845 var parse = function parse(str) {
846 str = str || '';
847 if (lastStr !== str) {
848 try {
849 lastValue = JSON.parse(str);
850 } catch (_unused) {
851 return utils.unstable_NO_STORAGE_VALUE;
852 }
853 lastStr = str;
854 }
855 return lastValue;
856 };
857 var str = (_getStringStorage$get = (_getStringStorage = getStringStorage()) == null ? void 0 : _getStringStorage.getItem(key)) != null ? _getStringStorage$get : null;
858 if (str instanceof Promise) {
859 return str.then(parse);
860 }
861 return parse(str);
862 },
863 setItem: function setItem(key, newValue) {
864 var _getStringStorage2;
865 return (_getStringStorage2 = getStringStorage()) == null ? void 0 : _getStringStorage2.setItem(key, JSON.stringify(newValue));
866 },
867 removeItem: function removeItem(key) {
868 var _getStringStorage3;
869 return (_getStringStorage3 = getStringStorage()) == null ? void 0 : _getStringStorage3.removeItem(key);
870 }
871 };
872 if (typeof window !== 'undefined' && typeof window.addEventListener === 'function') {
873 storage.subscribe = function (key, callback) {
874 var storageEventCallback = function storageEventCallback(e) {
875 if (e.key === key && e.newValue) {
876 callback(JSON.parse(e.newValue));
877 }
878 };
879 window.addEventListener('storage', storageEventCallback);
880 return function () {
881 window.removeEventListener('storage', storageEventCallback);
882 };
883 };
884 }
885 return storage;
886 }
887 var defaultStorage = createJSONStorage(function () {
888 return typeof window !== 'undefined' ? window.localStorage : undefined;
889 });
890 function atomWithStorage(key, initialValue, storage) {
891 if (storage === void 0) {
892 storage = defaultStorage;
893 }
894 var getInitialValue = function getInitialValue() {
895 var value = storage.getItem(key);
896 if (value instanceof Promise) {
897 return value.then(function (v) {
898 return v === utils.unstable_NO_STORAGE_VALUE ? initialValue : v;
899 });
900 }
901 return value === utils.unstable_NO_STORAGE_VALUE ? initialValue : value;
902 };
903 var baseAtom = Jotai.atom(storage.delayInit ? initialValue : getInitialValue());
904 baseAtom.onMount = function (setAtom) {
905 var unsub;
906 if (storage.subscribe) {
907 unsub = storage.subscribe(key, setAtom);
908 setAtom(getInitialValue());
909 }
910 if (storage.delayInit) {
911 var _value = getInitialValue();
912 if (_value instanceof Promise) {
913 _value.then(setAtom);
914 } else {
915 setAtom(_value);
916 }
917 }
918 return unsub;
919 };
920 var anAtom = Jotai.atom(function (get) {
921 return get(baseAtom);
922 }, function (get, set, update) {
923 var nextValue = typeof update === 'function' ? update(get(baseAtom)) : update;
924 if (nextValue === utils.RESET) {
925 set(baseAtom, initialValue);
926 return storage.removeItem(key);
927 }
928 set(baseAtom, nextValue);
929 return storage.setItem(key, nextValue);
930 });
931 return anAtom;
932 }
933 function atomWithHash(key, initialValue, options) {
934 var serialize = (options == null ? void 0 : options.serialize) || JSON.stringify;
935 var deserialize = (options == null ? void 0 : options.deserialize) || function (str) {
936 try {
937 return JSON.parse(str || '');
938 } catch (_unused2) {
939 return utils.unstable_NO_STORAGE_VALUE;
940 }
941 };
942 var _subscribe = (options == null ? void 0 : options.subscribe) || function (callback) {
943 window.addEventListener('hashchange', callback);
944 return function () {
945 window.removeEventListener('hashchange', callback);
946 };
947 };
948 var hashStorage = _extends({
949 getItem: function getItem(key) {
950 if (typeof location === 'undefined') {
951 return utils.unstable_NO_STORAGE_VALUE;
952 }
953 var searchParams = new URLSearchParams(location.hash.slice(1));
954 var storedValue = searchParams.get(key);
955 return deserialize(storedValue);
956 },
957 setItem: function setItem(key, newValue) {
958 var searchParams = new URLSearchParams(location.hash.slice(1));
959 searchParams.set(key, serialize(newValue));
960 if (options != null && options.replaceState) {
961 history.replaceState(null, '', location.pathname + location.search + '#' + searchParams.toString());
962 } else {
963 location.hash = searchParams.toString();
964 }
965 },
966 removeItem: function removeItem(key) {
967 var searchParams = new URLSearchParams(location.hash.slice(1));
968 searchParams.delete(key);
969 if (options != null && options.replaceState) {
970 history.replaceState(null, '', location.pathname + location.search + '#' + searchParams.toString());
971 } else {
972 location.hash = searchParams.toString();
973 }
974 }
975 }, (options == null ? void 0 : options.delayInit) && {
976 delayInit: true
977 }, {
978 subscribe: function subscribe(key, setValue) {
979 var callback = function callback() {
980 var searchParams = new URLSearchParams(location.hash.slice(1));
981 var str = searchParams.get(key);
982 if (str !== null) {
983 setValue(deserialize(str));
984 } else {
985 setValue(initialValue);
986 }
987 };
988 return _subscribe(callback);
989 }
990 });
991 return atomWithStorage(key, initialValue, hashStorage);
992 }
993
994 function atomWithObservable(getObservable, options) {
995 var observableResultAtom = Jotai.atom(function (get) {
996 var _observable$Symbol$ob, _observable;
997 var observable = getObservable(get);
998 var itself = (_observable$Symbol$ob = (_observable = observable)[Symbol.observable]) == null ? void 0 : _observable$Symbol$ob.call(_observable);
999 if (itself) {
1000 observable = itself;
1001 }
1002 var resolve;
1003 var makePending = function makePending() {
1004 return new Promise(function (r) {
1005 resolve = r;
1006 });
1007 };
1008 var initialResult = options && 'initialValue' in options ? {
1009 d: typeof options.initialValue === 'function' ? options.initialValue() : options.initialValue
1010 } : makePending();
1011 var setResult;
1012 var lastResult;
1013 var listener = function listener(result) {
1014 lastResult = result;
1015 resolve == null ? void 0 : resolve(result);
1016 setResult == null ? void 0 : setResult(result);
1017 };
1018 var subscription;
1019 var timer;
1020 var isNotMounted = function isNotMounted() {
1021 return !setResult;
1022 };
1023 var start = function start() {
1024 if (subscription) {
1025 clearTimeout(timer);
1026 subscription.unsubscribe();
1027 }
1028 subscription = observable.subscribe({
1029 next: function next(d) {
1030 return listener({
1031 d: d
1032 });
1033 },
1034 error: function error(e) {
1035 return listener({
1036 e: e
1037 });
1038 },
1039 complete: function complete() {}
1040 });
1041 if (isNotMounted() && options != null && options.unstable_timeout) {
1042 timer = setTimeout(function () {
1043 if (subscription) {
1044 subscription.unsubscribe();
1045 subscription = undefined;
1046 }
1047 }, options.unstable_timeout);
1048 }
1049 };
1050 start();
1051 var resultAtom = Jotai.atom(lastResult || initialResult);
1052 resultAtom.onMount = function (update) {
1053 setResult = update;
1054 if (lastResult) {
1055 update(lastResult);
1056 }
1057 if (subscription) {
1058 clearTimeout(timer);
1059 } else {
1060 start();
1061 }
1062 return function () {
1063 setResult = undefined;
1064 if (subscription) {
1065 subscription.unsubscribe();
1066 subscription = undefined;
1067 }
1068 };
1069 };
1070 return [resultAtom, observable, makePending, start, isNotMounted];
1071 });
1072 var observableAtom = Jotai.atom(function (get) {
1073 var _get = get(observableResultAtom),
1074 resultAtom = _get[0];
1075 var result = get(resultAtom);
1076 if ('e' in result) {
1077 throw result.e;
1078 }
1079 return result.d;
1080 }, function (get, set, data) {
1081 var _get2 = get(observableResultAtom),
1082 resultAtom = _get2[0],
1083 observable = _get2[1],
1084 makePending = _get2[2],
1085 start = _get2[3],
1086 isNotMounted = _get2[4];
1087 if ('next' in observable) {
1088 if (isNotMounted()) {
1089 set(resultAtom, makePending());
1090 start();
1091 }
1092 observable.next(data);
1093 } else {
1094 throw new Error('observable is not subject');
1095 }
1096 });
1097 return observableAtom;
1098 }
1099
1100 var hydratedMap = new WeakMap();
1101 function useHydrateAtoms(values, scope) {
1102 var ScopeContext = Jotai.SECRET_INTERNAL_getScopeContext(scope);
1103 var scopeContainer = react.useContext(ScopeContext);
1104 var store = scopeContainer.s;
1105 var hydratedSet = getHydratedSet(scopeContainer);
1106 var tuplesToRestore = [];
1107 for (var _iterator = _createForOfIteratorHelperLoose(values), _step; !(_step = _iterator()).done;) {
1108 var tuple = _step.value;
1109 var atom = tuple[0];
1110 if (!hydratedSet.has(atom)) {
1111 hydratedSet.add(atom);
1112 tuplesToRestore.push(tuple);
1113 }
1114 }
1115 if (tuplesToRestore.length) {
1116 store[RESTORE_ATOMS](tuplesToRestore);
1117 }
1118 }
1119 function getHydratedSet(scopeContainer) {
1120 var hydratedSet = hydratedMap.get(scopeContainer);
1121 if (!hydratedSet) {
1122 hydratedSet = new WeakSet();
1123 hydratedMap.set(scopeContainer, hydratedSet);
1124 }
1125 return hydratedSet;
1126 }
1127
1128 var memoizeAtom = createMemoizeAtom();
1129 var LOADING = {
1130 state: 'loading'
1131 };
1132 function loadable(anAtom) {
1133 return memoizeAtom(function () {
1134 var loadableAtomCache = new WeakMap();
1135 var catchAtom = Jotai.atom(function (get) {
1136 var promise;
1137 try {
1138 var data = get(anAtom);
1139 var _loadableAtom = Jotai.atom({
1140 state: 'hasData',
1141 data: data
1142 });
1143 return _loadableAtom;
1144 } catch (error) {
1145 if (error instanceof Promise) {
1146 promise = error;
1147 } else {
1148 var _loadableAtom2 = Jotai.atom({
1149 state: 'hasError',
1150 error: error
1151 });
1152 return _loadableAtom2;
1153 }
1154 }
1155 var cached = loadableAtomCache.get(promise);
1156 if (cached) {
1157 return cached;
1158 }
1159 var loadableAtom = Jotai.atom(LOADING, function () {
1160 var _ref = _asyncToGenerator(_regeneratorRuntime().mark(function _callee(get, set) {
1161 var _data;
1162 return _regeneratorRuntime().wrap(function _callee$(_context) {
1163 while (1) switch (_context.prev = _context.next) {
1164 case 0:
1165 _context.prev = 0;
1166 _context.next = 3;
1167 return get(anAtom, {
1168 unstable_promise: true
1169 });
1170 case 3:
1171 _data = _context.sent;
1172 set(loadableAtom, {
1173 state: 'hasData',
1174 data: _data
1175 });
1176 _context.next = 10;
1177 break;
1178 case 7:
1179 _context.prev = 7;
1180 _context.t0 = _context["catch"](0);
1181 set(loadableAtom, {
1182 state: 'hasError',
1183 error: _context.t0
1184 });
1185 case 10:
1186 case "end":
1187 return _context.stop();
1188 }
1189 }, _callee, null, [[0, 7]]);
1190 }));
1191 return function (_x, _x2) {
1192 return _ref.apply(this, arguments);
1193 };
1194 }());
1195 loadableAtom.onMount = function (init) {
1196 init();
1197 };
1198 loadableAtomCache.set(promise, loadableAtom);
1199 return loadableAtom;
1200 });
1201 var derivedAtom = Jotai.atom(function (get) {
1202 var loadableAtom = get(catchAtom);
1203 return get(loadableAtom);
1204 });
1205 return derivedAtom;
1206 }, [anAtom]);
1207 }
1208
1209 function abortableAtom(read, write) {
1210 return Jotai.atom(function (get) {
1211 var controller = new AbortController();
1212 var promise = read(get, {
1213 signal: controller.signal
1214 });
1215 if (promise instanceof Promise) {
1216 Jotai.SECRET_INTERNAL_registerPromiseAbort(promise, function () {
1217 return controller.abort();
1218 });
1219 }
1220 return promise;
1221 }, write);
1222 }
1223
1224 var useAtomValue = function useAtomValue() {
1225 console.warn('[DEPRECATED]: use `useAtomValue` from `jotai` instead.');
1226 return Jotai__namespace.useAtomValue.apply(Jotai__namespace, arguments);
1227 };
1228 var useUpdateAtom = function useUpdateAtom() {
1229 console.warn('[DEPRECATED]: use `useSetAtom` from `jotai` instead.');
1230 return Jotai__namespace.useSetAtom.apply(Jotai__namespace, arguments);
1231 };
1232
1233 Object.defineProperty(exports, 'RESET', {
1234 enumerable: true,
1235 get: function () { return utils.RESET; }
1236 });
1237 Object.defineProperty(exports, 'unstable_NO_STORAGE_VALUE', {
1238 enumerable: true,
1239 get: function () { return utils.unstable_NO_STORAGE_VALUE; }
1240 });
1241 exports.abortableAtom = abortableAtom;
1242 exports.atomFamily = atomFamily;
1243 exports.atomWithDefault = atomWithDefault;
1244 exports.atomWithHash = atomWithHash;
1245 exports.atomWithObservable = atomWithObservable;
1246 exports.atomWithReducer = atomWithReducer;
1247 exports.atomWithReset = atomWithReset;
1248 exports.atomWithStorage = atomWithStorage;
1249 exports.createJSONStorage = createJSONStorage;
1250 exports.freezeAtom = freezeAtom;
1251 exports.freezeAtomCreator = freezeAtomCreator;
1252 exports.loadable = loadable;
1253 exports.selectAtom = selectAtom;
1254 exports.splitAtom = splitAtom;
1255 exports.useAtomCallback = useAtomCallback;
1256 exports.useAtomValue = useAtomValue;
1257 exports.useHydrateAtoms = useHydrateAtoms;
1258 exports.useReducerAtom = useReducerAtom;
1259 exports.useResetAtom = useResetAtom;
1260 exports.useUpdateAtom = useUpdateAtom;
1261 exports.waitForAll = waitForAll;
1262
1263}));