1 | (function (global, factory) {
|
2 | typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
|
3 | typeof define === 'function' && define.amd ? define(['exports'], factory) :
|
4 | (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.jotaiVanilla = {}));
|
5 | })(this, (function (exports) { 'use strict';
|
6 |
|
7 | var keyCount = 0;
|
8 | function atom(read, write) {
|
9 | var key = "atom" + ++keyCount;
|
10 | var config = {
|
11 | toString: function toString() {
|
12 | return key;
|
13 | }
|
14 | };
|
15 | if (typeof read === 'function') {
|
16 | config.read = read;
|
17 | } else {
|
18 | config.init = read;
|
19 | config.read = defaultRead;
|
20 | config.write = defaultWrite;
|
21 | }
|
22 | if (write) {
|
23 | config.write = write;
|
24 | }
|
25 | return config;
|
26 | }
|
27 | function defaultRead(get) {
|
28 | return get(this);
|
29 | }
|
30 | function defaultWrite(get, set, arg) {
|
31 | return set(this, typeof arg === 'function' ? arg(get(this)) : arg);
|
32 | }
|
33 |
|
34 | function _unsupportedIterableToArray(o, minLen) {
|
35 | if (!o) return;
|
36 | if (typeof o === "string") return _arrayLikeToArray(o, minLen);
|
37 | var n = Object.prototype.toString.call(o).slice(8, -1);
|
38 | if (n === "Object" && o.constructor) n = o.constructor.name;
|
39 | if (n === "Map" || n === "Set") return Array.from(o);
|
40 | if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
|
41 | }
|
42 | function _arrayLikeToArray(arr, len) {
|
43 | if (len == null || len > arr.length) len = arr.length;
|
44 | for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];
|
45 | return arr2;
|
46 | }
|
47 | function _createForOfIteratorHelperLoose(o, allowArrayLike) {
|
48 | var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"];
|
49 | if (it) return (it = it.call(o)).next.bind(it);
|
50 | if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") {
|
51 | if (it) o = it;
|
52 | var i = 0;
|
53 | return function () {
|
54 | if (i >= o.length) return {
|
55 | done: true
|
56 | };
|
57 | return {
|
58 | done: false,
|
59 | value: o[i++]
|
60 | };
|
61 | };
|
62 | }
|
63 | throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
|
64 | }
|
65 |
|
66 | var isSelfAtom = function isSelfAtom(atom, a) {
|
67 | return atom.unstable_is ? atom.unstable_is(a) : a === atom;
|
68 | };
|
69 | var hasInitialValue = function hasInitialValue(atom) {
|
70 | return 'init' in atom;
|
71 | };
|
72 | var isActuallyWritableAtom = function isActuallyWritableAtom(atom) {
|
73 | return !!atom.write;
|
74 | };
|
75 | var cancelPromiseMap = new WeakMap();
|
76 | var registerCancelPromise = function registerCancelPromise(promise, cancel) {
|
77 | cancelPromiseMap.set(promise, cancel);
|
78 | promise.catch(function () {}).finally(function () {
|
79 | return cancelPromiseMap.delete(promise);
|
80 | });
|
81 | };
|
82 | var cancelPromise = function cancelPromise(promise, next) {
|
83 | var cancel = cancelPromiseMap.get(promise);
|
84 | if (cancel) {
|
85 | cancelPromiseMap.delete(promise);
|
86 | cancel(next);
|
87 | }
|
88 | };
|
89 | var resolvePromise = function resolvePromise(promise, value) {
|
90 | promise.status = 'fulfilled';
|
91 | promise.value = value;
|
92 | };
|
93 | var rejectPromise = function rejectPromise(promise, e) {
|
94 | promise.status = 'rejected';
|
95 | promise.reason = e;
|
96 | };
|
97 | var isPromiseLike = function isPromiseLike(x) {
|
98 | return typeof (x == null ? void 0 : x.then) === 'function';
|
99 | };
|
100 | var isEqualAtomValue = function isEqualAtomValue(a, b) {
|
101 | return !!a && 'v' in a && 'v' in b && Object.is(a.v, b.v);
|
102 | };
|
103 | var isEqualAtomError = function isEqualAtomError(a, b) {
|
104 | return !!a && 'e' in a && 'e' in b && Object.is(a.e, b.e);
|
105 | };
|
106 | var hasPromiseAtomValue = function hasPromiseAtomValue(a) {
|
107 | return !!a && 'v' in a && a.v instanceof Promise;
|
108 | };
|
109 | var isEqualPromiseAtomValue = function isEqualPromiseAtomValue(a, b) {
|
110 | return 'v' in a && 'v' in b && a.v.orig && a.v.orig === b.v.orig;
|
111 | };
|
112 | var returnAtomValue = function returnAtomValue(atomState) {
|
113 | if ('e' in atomState) {
|
114 | throw atomState.e;
|
115 | }
|
116 | return atomState.v;
|
117 | };
|
118 | var createStore$1 = function createStore() {
|
119 | var atomStateMap = new WeakMap();
|
120 | var mountedMap = new WeakMap();
|
121 | var pendingStack = [];
|
122 | var pendingMap = new WeakMap();
|
123 | var devListenersRev2;
|
124 | var mountedAtoms;
|
125 | {
|
126 | devListenersRev2 = new Set();
|
127 | mountedAtoms = new Set();
|
128 | }
|
129 | var getAtomState = function getAtomState(atom) {
|
130 | return atomStateMap.get(atom);
|
131 | };
|
132 | var addPendingDependent = function addPendingDependent(atom, atomState) {
|
133 | atomState.d.forEach(function (_, a) {
|
134 | if (!pendingMap.has(a)) {
|
135 | var _pendingStack;
|
136 | var aState = getAtomState(a);
|
137 | (_pendingStack = pendingStack[pendingStack.length - 1]) == null || _pendingStack.add(a);
|
138 | pendingMap.set(a, [aState, new Set()]);
|
139 | if (aState) {
|
140 | addPendingDependent(a, aState);
|
141 | }
|
142 | }
|
143 | pendingMap.get(a)[1].add(atom);
|
144 | });
|
145 | };
|
146 | var setAtomState = function setAtomState(atom, atomState) {
|
147 | {
|
148 | Object.freeze(atomState);
|
149 | }
|
150 | var prevAtomState = getAtomState(atom);
|
151 | atomStateMap.set(atom, atomState);
|
152 | if (!pendingMap.has(atom)) {
|
153 | var _pendingStack2;
|
154 | (_pendingStack2 = pendingStack[pendingStack.length - 1]) == null || _pendingStack2.add(atom);
|
155 | pendingMap.set(atom, [prevAtomState, new Set()]);
|
156 | addPendingDependent(atom, atomState);
|
157 | }
|
158 | if (hasPromiseAtomValue(prevAtomState)) {
|
159 | var _next = 'v' in atomState ? atomState.v instanceof Promise ? atomState.v : Promise.resolve(atomState.v) : Promise.reject(atomState.e);
|
160 | if (prevAtomState.v !== _next) {
|
161 | cancelPromise(prevAtomState.v, _next);
|
162 | }
|
163 | }
|
164 | };
|
165 | var updateDependencies = function updateDependencies(atom, nextAtomState, nextDependencies, keepPreviousDependencies) {
|
166 | var dependencies = new Map(keepPreviousDependencies ? nextAtomState.d : null);
|
167 | var changed = false;
|
168 | nextDependencies.forEach(function (aState, a) {
|
169 | if (!aState && isSelfAtom(atom, a)) {
|
170 | aState = nextAtomState;
|
171 | }
|
172 | if (aState) {
|
173 | dependencies.set(a, aState);
|
174 | if (nextAtomState.d.get(a) !== aState) {
|
175 | changed = true;
|
176 | }
|
177 | } else {
|
178 | console.warn('[Bug] atom state not found');
|
179 | }
|
180 | });
|
181 | if (changed || nextAtomState.d.size !== dependencies.size) {
|
182 | nextAtomState.d = dependencies;
|
183 | }
|
184 | };
|
185 | var setAtomValue = function setAtomValue(atom, value, nextDependencies, keepPreviousDependencies) {
|
186 | var prevAtomState = getAtomState(atom);
|
187 | var nextAtomState = {
|
188 | d: (prevAtomState == null ? void 0 : prevAtomState.d) || new Map(),
|
189 | v: value
|
190 | };
|
191 | if (nextDependencies) {
|
192 | updateDependencies(atom, nextAtomState, nextDependencies, keepPreviousDependencies);
|
193 | }
|
194 | if (isEqualAtomValue(prevAtomState, nextAtomState) && prevAtomState.d === nextAtomState.d) {
|
195 | return prevAtomState;
|
196 | }
|
197 | if (hasPromiseAtomValue(prevAtomState) && hasPromiseAtomValue(nextAtomState) && isEqualPromiseAtomValue(prevAtomState, nextAtomState)) {
|
198 | if (prevAtomState.d === nextAtomState.d) {
|
199 | return prevAtomState;
|
200 | } else {
|
201 | nextAtomState.v = prevAtomState.v;
|
202 | }
|
203 | }
|
204 | setAtomState(atom, nextAtomState);
|
205 | return nextAtomState;
|
206 | };
|
207 | var setAtomValueOrPromise = function setAtomValueOrPromise(atom, valueOrPromise, nextDependencies, abortPromise) {
|
208 | if (isPromiseLike(valueOrPromise)) {
|
209 | var continuePromise;
|
210 | var updatePromiseDependencies = function updatePromiseDependencies() {
|
211 | var prevAtomState = getAtomState(atom);
|
212 | if (!hasPromiseAtomValue(prevAtomState) || prevAtomState.v !== promise) {
|
213 | return;
|
214 | }
|
215 | var nextAtomState = setAtomValue(atom, promise, nextDependencies);
|
216 | if (mountedMap.has(atom) && prevAtomState.d !== nextAtomState.d) {
|
217 | mountDependencies(atom, nextAtomState, prevAtomState.d);
|
218 | }
|
219 | };
|
220 | var promise = new Promise(function (resolve, reject) {
|
221 | var settled = false;
|
222 | valueOrPromise.then(function (v) {
|
223 | if (!settled) {
|
224 | settled = true;
|
225 | resolvePromise(promise, v);
|
226 | resolve(v);
|
227 | updatePromiseDependencies();
|
228 | }
|
229 | }, function (e) {
|
230 | if (!settled) {
|
231 | settled = true;
|
232 | rejectPromise(promise, e);
|
233 | reject(e);
|
234 | updatePromiseDependencies();
|
235 | }
|
236 | });
|
237 | continuePromise = function continuePromise(next) {
|
238 | if (!settled) {
|
239 | settled = true;
|
240 | next.then(function (v) {
|
241 | return resolvePromise(promise, v);
|
242 | }, function (e) {
|
243 | return rejectPromise(promise, e);
|
244 | });
|
245 | resolve(next);
|
246 | }
|
247 | };
|
248 | });
|
249 | promise.orig = valueOrPromise;
|
250 | promise.status = 'pending';
|
251 | registerCancelPromise(promise, function (next) {
|
252 | if (next) {
|
253 | continuePromise(next);
|
254 | }
|
255 | abortPromise == null || abortPromise();
|
256 | });
|
257 | return setAtomValue(atom, promise, nextDependencies, true);
|
258 | }
|
259 | return setAtomValue(atom, valueOrPromise, nextDependencies);
|
260 | };
|
261 | var setAtomError = function setAtomError(atom, error, nextDependencies) {
|
262 | var prevAtomState = getAtomState(atom);
|
263 | var nextAtomState = {
|
264 | d: (prevAtomState == null ? void 0 : prevAtomState.d) || new Map(),
|
265 | e: error
|
266 | };
|
267 | if (nextDependencies) {
|
268 | updateDependencies(atom, nextAtomState, nextDependencies);
|
269 | }
|
270 | if (isEqualAtomError(prevAtomState, nextAtomState) && prevAtomState.d === nextAtomState.d) {
|
271 | return prevAtomState;
|
272 | }
|
273 | setAtomState(atom, nextAtomState);
|
274 | return nextAtomState;
|
275 | };
|
276 | var readAtomState = function readAtomState(atom, force) {
|
277 | var atomState = getAtomState(atom);
|
278 | if (!force && atomState) {
|
279 | if (mountedMap.has(atom)) {
|
280 | return atomState;
|
281 | }
|
282 | if (Array.from(atomState.d).every(function (_ref) {
|
283 | var a = _ref[0],
|
284 | s = _ref[1];
|
285 | if (a === atom) {
|
286 | return true;
|
287 | }
|
288 | var aState = readAtomState(a);
|
289 | return aState === s || isEqualAtomValue(aState, s);
|
290 | })) {
|
291 | return atomState;
|
292 | }
|
293 | }
|
294 | var nextDependencies = new Map();
|
295 | var isSync = true;
|
296 | var getter = function getter(a) {
|
297 | if (isSelfAtom(atom, a)) {
|
298 | var _aState = getAtomState(a);
|
299 | if (_aState) {
|
300 | nextDependencies.set(a, _aState);
|
301 | return returnAtomValue(_aState);
|
302 | }
|
303 | if (hasInitialValue(a)) {
|
304 | nextDependencies.set(a, undefined);
|
305 | return a.init;
|
306 | }
|
307 | throw new Error('no atom init');
|
308 | }
|
309 | var aState = readAtomState(a);
|
310 | nextDependencies.set(a, aState);
|
311 | return returnAtomValue(aState);
|
312 | };
|
313 | var controller;
|
314 | var setSelf;
|
315 | var options = {
|
316 | get signal() {
|
317 | if (!controller) {
|
318 | controller = new AbortController();
|
319 | }
|
320 | return controller.signal;
|
321 | },
|
322 | get setSelf() {
|
323 | if (!isActuallyWritableAtom(atom)) {
|
324 | console.warn('setSelf function cannot be used with read-only atom');
|
325 | }
|
326 | if (!setSelf && isActuallyWritableAtom(atom)) {
|
327 | setSelf = function setSelf() {
|
328 | if (isSync) {
|
329 | console.warn('setSelf function cannot be called in sync');
|
330 | }
|
331 | if (!isSync) {
|
332 | for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
|
333 | args[_key] = arguments[_key];
|
334 | }
|
335 | return writeAtom.apply(void 0, [atom].concat(args));
|
336 | }
|
337 | };
|
338 | }
|
339 | return setSelf;
|
340 | }
|
341 | };
|
342 | try {
|
343 | var valueOrPromise = atom.read(getter, options);
|
344 | return setAtomValueOrPromise(atom, valueOrPromise, nextDependencies, function () {
|
345 | var _controller;
|
346 | return (_controller = controller) == null ? void 0 : _controller.abort();
|
347 | });
|
348 | } catch (error) {
|
349 | return setAtomError(atom, error, nextDependencies);
|
350 | } finally {
|
351 | isSync = false;
|
352 | }
|
353 | };
|
354 | var readAtom = function readAtom(atom) {
|
355 | return returnAtomValue(readAtomState(atom));
|
356 | };
|
357 | var recomputeDependents = function recomputeDependents(atom) {
|
358 | var getDependents = function getDependents(a) {
|
359 | var _mountedMap$get, _pendingMap$get;
|
360 | var dependents = new Set((_mountedMap$get = mountedMap.get(a)) == null ? void 0 : _mountedMap$get.t);
|
361 | (_pendingMap$get = pendingMap.get(a)) == null || _pendingMap$get[1].forEach(function (dependent) {
|
362 | dependents.add(dependent);
|
363 | });
|
364 | return dependents;
|
365 | };
|
366 | var topsortedAtoms = new Array();
|
367 | var markedAtoms = new Set();
|
368 | var visit = function visit(n) {
|
369 | if (markedAtoms.has(n)) {
|
370 | return;
|
371 | }
|
372 | markedAtoms.add(n);
|
373 | for (var _iterator = _createForOfIteratorHelperLoose(getDependents(n)), _step; !(_step = _iterator()).done;) {
|
374 | var m = _step.value;
|
375 | if (n !== m) {
|
376 | visit(m);
|
377 | }
|
378 | }
|
379 | topsortedAtoms.push(n);
|
380 | };
|
381 | visit(atom);
|
382 | var changedAtoms = new Set([atom]);
|
383 | for (var i = topsortedAtoms.length - 1; i >= 0; --i) {
|
384 | var _a = topsortedAtoms[i];
|
385 | var _prevAtomState = getAtomState(_a);
|
386 | if (!_prevAtomState) {
|
387 | continue;
|
388 | }
|
389 | var hasChangedDeps = false;
|
390 | for (var _iterator2 = _createForOfIteratorHelperLoose(_prevAtomState.d.keys()), _step2; !(_step2 = _iterator2()).done;) {
|
391 | var dep = _step2.value;
|
392 | if (dep !== _a && changedAtoms.has(dep)) {
|
393 | hasChangedDeps = true;
|
394 | break;
|
395 | }
|
396 | }
|
397 | if (hasChangedDeps) {
|
398 | var nextAtomState = readAtomState(_a, true);
|
399 | if (!isEqualAtomValue(_prevAtomState, nextAtomState)) {
|
400 | changedAtoms.add(_a);
|
401 | }
|
402 | }
|
403 | }
|
404 | };
|
405 | var writeAtomState = function writeAtomState(atom) {
|
406 | var getter = function getter(a) {
|
407 | return returnAtomValue(readAtomState(a));
|
408 | };
|
409 | var setter = function setter(a) {
|
410 | var isSync = pendingStack.length > 0;
|
411 | if (!isSync) {
|
412 | pendingStack.push(new Set([a]));
|
413 | }
|
414 | var r;
|
415 | for (var _len3 = arguments.length, args = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) {
|
416 | args[_key3 - 1] = arguments[_key3];
|
417 | }
|
418 | if (isSelfAtom(atom, a)) {
|
419 | if (!hasInitialValue(a)) {
|
420 | throw new Error('atom not writable');
|
421 | }
|
422 | var _prevAtomState2 = getAtomState(a);
|
423 | var nextAtomState = setAtomValueOrPromise(a, args[0]);
|
424 | if (!isEqualAtomValue(_prevAtomState2, nextAtomState)) {
|
425 | recomputeDependents(a);
|
426 | }
|
427 | } else {
|
428 | r = writeAtomState.apply(void 0, [a].concat(args));
|
429 | }
|
430 | if (!isSync) {
|
431 | var flushed = flushPending(pendingStack.pop());
|
432 | {
|
433 | devListenersRev2.forEach(function (l) {
|
434 | return l({
|
435 | type: 'async-write',
|
436 | flushed: flushed
|
437 | });
|
438 | });
|
439 | }
|
440 | }
|
441 | return r;
|
442 | };
|
443 | for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
|
444 | args[_key2 - 1] = arguments[_key2];
|
445 | }
|
446 | var result = atom.write.apply(atom, [getter, setter].concat(args));
|
447 | return result;
|
448 | };
|
449 | var writeAtom = function writeAtom(atom) {
|
450 | pendingStack.push(new Set([atom]));
|
451 | for (var _len4 = arguments.length, args = new Array(_len4 > 1 ? _len4 - 1 : 0), _key4 = 1; _key4 < _len4; _key4++) {
|
452 | args[_key4 - 1] = arguments[_key4];
|
453 | }
|
454 | var result = writeAtomState.apply(void 0, [atom].concat(args));
|
455 | var flushed = flushPending(pendingStack.pop());
|
456 | {
|
457 | devListenersRev2.forEach(function (l) {
|
458 | return l({
|
459 | type: 'write',
|
460 | flushed: flushed
|
461 | });
|
462 | });
|
463 | }
|
464 | return result;
|
465 | };
|
466 | var mountAtom = function mountAtom(atom, initialDependent, onMountQueue) {
|
467 | var _getAtomState;
|
468 | var existingMount = mountedMap.get(atom);
|
469 | if (existingMount) {
|
470 | if (initialDependent) {
|
471 | existingMount.t.add(initialDependent);
|
472 | }
|
473 | return existingMount;
|
474 | }
|
475 | var queue = onMountQueue || [];
|
476 | (_getAtomState = getAtomState(atom)) == null || _getAtomState.d.forEach(function (_, a) {
|
477 | if (a !== atom) {
|
478 | mountAtom(a, atom, queue);
|
479 | }
|
480 | });
|
481 | readAtomState(atom);
|
482 | var mounted = {
|
483 | t: new Set(initialDependent && [initialDependent]),
|
484 | l: new Set()
|
485 | };
|
486 | mountedMap.set(atom, mounted);
|
487 | {
|
488 | mountedAtoms.add(atom);
|
489 | }
|
490 | if (isActuallyWritableAtom(atom) && atom.onMount) {
|
491 | var onMount = atom.onMount;
|
492 | queue.push(function () {
|
493 | var onUnmount = onMount(function () {
|
494 | for (var _len5 = arguments.length, args = new Array(_len5), _key5 = 0; _key5 < _len5; _key5++) {
|
495 | args[_key5] = arguments[_key5];
|
496 | }
|
497 | return writeAtom.apply(void 0, [atom].concat(args));
|
498 | });
|
499 | if (onUnmount) {
|
500 | mounted.u = onUnmount;
|
501 | }
|
502 | });
|
503 | }
|
504 | if (!onMountQueue) {
|
505 | queue.forEach(function (f) {
|
506 | return f();
|
507 | });
|
508 | }
|
509 | return mounted;
|
510 | };
|
511 | var canUnmountAtom = function canUnmountAtom(atom, mounted) {
|
512 | return !mounted.l.size && (!mounted.t.size || mounted.t.size === 1 && mounted.t.has(atom));
|
513 | };
|
514 | var tryUnmountAtom = function tryUnmountAtom(atom, mounted) {
|
515 | if (!canUnmountAtom(atom, mounted)) {
|
516 | return;
|
517 | }
|
518 | var onUnmount = mounted.u;
|
519 | if (onUnmount) {
|
520 | onUnmount();
|
521 | }
|
522 | mountedMap.delete(atom);
|
523 | {
|
524 | mountedAtoms.delete(atom);
|
525 | }
|
526 | var atomState = getAtomState(atom);
|
527 | if (atomState) {
|
528 | if (hasPromiseAtomValue(atomState)) {
|
529 | cancelPromise(atomState.v);
|
530 | }
|
531 | atomState.d.forEach(function (_, a) {
|
532 | if (a !== atom) {
|
533 | var mountedDep = mountedMap.get(a);
|
534 | if (mountedDep) {
|
535 | mountedDep.t.delete(atom);
|
536 | tryUnmountAtom(a, mountedDep);
|
537 | }
|
538 | }
|
539 | });
|
540 | } else {
|
541 | console.warn('[Bug] could not find atom state to unmount', atom);
|
542 | }
|
543 | };
|
544 | var mountDependencies = function mountDependencies(atom, atomState, prevDependencies) {
|
545 | var depSet = new Set(atomState.d.keys());
|
546 | var maybeUnmountAtomSet = new Set();
|
547 | prevDependencies == null || prevDependencies.forEach(function (_, a) {
|
548 | if (depSet.has(a)) {
|
549 | depSet.delete(a);
|
550 | return;
|
551 | }
|
552 | maybeUnmountAtomSet.add(a);
|
553 | var mounted = mountedMap.get(a);
|
554 | if (mounted) {
|
555 | mounted.t.delete(atom);
|
556 | }
|
557 | });
|
558 | depSet.forEach(function (a) {
|
559 | mountAtom(a, atom);
|
560 | });
|
561 | maybeUnmountAtomSet.forEach(function (a) {
|
562 | var mounted = mountedMap.get(a);
|
563 | if (mounted) {
|
564 | tryUnmountAtom(a, mounted);
|
565 | }
|
566 | });
|
567 | };
|
568 | var flushPending = function flushPending(pendingAtoms) {
|
569 | var flushed;
|
570 | {
|
571 | flushed = new Set();
|
572 | }
|
573 | var pending = [];
|
574 | var collectPending = function collectPending(pendingAtom) {
|
575 | var _getAtomState2;
|
576 | if (!pendingMap.has(pendingAtom)) {
|
577 | return;
|
578 | }
|
579 | var _ref2 = pendingMap.get(pendingAtom),
|
580 | prevAtomState = _ref2[0],
|
581 | dependents = _ref2[1];
|
582 | pendingMap.delete(pendingAtom);
|
583 | pending.push([pendingAtom, prevAtomState]);
|
584 | dependents.forEach(collectPending);
|
585 | (_getAtomState2 = getAtomState(pendingAtom)) == null || _getAtomState2.d.forEach(function (_, a) {
|
586 | return collectPending(a);
|
587 | });
|
588 | };
|
589 | pendingAtoms.forEach(collectPending);
|
590 | pending.forEach(function (_ref3) {
|
591 | var atom = _ref3[0],
|
592 | prevAtomState = _ref3[1];
|
593 | var atomState = getAtomState(atom);
|
594 | if (!atomState) {
|
595 | {
|
596 | console.warn('[Bug] no atom state to flush');
|
597 | }
|
598 | return;
|
599 | }
|
600 | if (atomState !== prevAtomState) {
|
601 | var mounted = mountedMap.get(atom);
|
602 | if (mounted && atomState.d !== (prevAtomState == null ? void 0 : prevAtomState.d)) {
|
603 | mountDependencies(atom, atomState, prevAtomState == null ? void 0 : prevAtomState.d);
|
604 | }
|
605 | if (mounted && !(!hasPromiseAtomValue(prevAtomState) && (isEqualAtomValue(prevAtomState, atomState) || isEqualAtomError(prevAtomState, atomState)))) {
|
606 | mounted.l.forEach(function (listener) {
|
607 | return listener();
|
608 | });
|
609 | {
|
610 | flushed.add(atom);
|
611 | }
|
612 | }
|
613 | }
|
614 | });
|
615 | {
|
616 | return flushed;
|
617 | }
|
618 | };
|
619 | var subscribeAtom = function subscribeAtom(atom, listener) {
|
620 | var mounted = mountAtom(atom);
|
621 | var flushed = flushPending([atom]);
|
622 | var listeners = mounted.l;
|
623 | listeners.add(listener);
|
624 | {
|
625 | devListenersRev2.forEach(function (l) {
|
626 | return l({
|
627 | type: 'sub',
|
628 | flushed: flushed
|
629 | });
|
630 | });
|
631 | }
|
632 | return function () {
|
633 | listeners.delete(listener);
|
634 | tryUnmountAtom(atom, mounted);
|
635 | {
|
636 | devListenersRev2.forEach(function (l) {
|
637 | return l({
|
638 | type: 'unsub'
|
639 | });
|
640 | });
|
641 | }
|
642 | };
|
643 | };
|
644 | {
|
645 | return {
|
646 | get: readAtom,
|
647 | set: writeAtom,
|
648 | sub: subscribeAtom,
|
649 | dev_subscribe_store: function dev_subscribe_store(l) {
|
650 | devListenersRev2.add(l);
|
651 | return function () {
|
652 | devListenersRev2.delete(l);
|
653 | };
|
654 | },
|
655 | dev_get_mounted_atoms: function dev_get_mounted_atoms() {
|
656 | return mountedAtoms.values();
|
657 | },
|
658 | dev_get_atom_state: function dev_get_atom_state(a) {
|
659 | return atomStateMap.get(a);
|
660 | },
|
661 | dev_get_mounted: function dev_get_mounted(a) {
|
662 | return mountedMap.get(a);
|
663 | },
|
664 | dev_restore_atoms: function dev_restore_atoms(values) {
|
665 | pendingStack.push(new Set());
|
666 | for (var _iterator3 = _createForOfIteratorHelperLoose(values), _step3; !(_step3 = _iterator3()).done;) {
|
667 | var _step3$value = _step3.value,
|
668 | _atom = _step3$value[0],
|
669 | valueOrPromise = _step3$value[1];
|
670 | if (hasInitialValue(_atom)) {
|
671 | setAtomValueOrPromise(_atom, valueOrPromise);
|
672 | recomputeDependents(_atom);
|
673 | }
|
674 | }
|
675 | var flushed = flushPending(pendingStack.pop());
|
676 | devListenersRev2.forEach(function (l) {
|
677 | return l({
|
678 | type: 'restore',
|
679 | flushed: flushed
|
680 | });
|
681 | });
|
682 | }
|
683 | };
|
684 | }
|
685 | };
|
686 | var defaultStore;
|
687 | var getDefaultStore$1 = function getDefaultStore() {
|
688 | if (!defaultStore) {
|
689 | defaultStore = createStore$1();
|
690 | {
|
691 | var _ref4;
|
692 | (_ref4 = globalThis).__JOTAI_DEFAULT_STORE__ || (_ref4.__JOTAI_DEFAULT_STORE__ = defaultStore);
|
693 | if (globalThis.__JOTAI_DEFAULT_STORE__ !== defaultStore) {
|
694 | console.warn('Detected multiple Jotai instances. It may cause unexpected behavior with the default store. https://github.com/pmndrs/jotai/discussions/2044');
|
695 | }
|
696 | }
|
697 | }
|
698 | return defaultStore;
|
699 | };
|
700 |
|
701 | var createStore = createStore$1;
|
702 | var getDefaultStore = getDefaultStore$1;
|
703 |
|
704 | exports.atom = atom;
|
705 | exports.createStore = createStore;
|
706 | exports.getDefaultStore = getDefaultStore;
|
707 |
|
708 | }));
|