@systemfsoftware/xstate-store 0.0.0-bootstrap.0 → 5.0.0-beta.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,755 @@
1
+ import { t as isStoreValidationError } from "./validationError-Ndy-qk0W.mjs";
2
+ // src/alien.ts
3
+ function createReactiveSystem({ update, notify, unwatched }) {
4
+ return {
5
+ link,
6
+ unlink,
7
+ propagate,
8
+ checkDirty,
9
+ shallowPropagate
10
+ };
11
+ function link(dep, sub, version) {
12
+ const prevDep = sub.depsTail;
13
+ if (prevDep !== void 0 && prevDep.dep === dep) return;
14
+ const nextDep = prevDep !== void 0 ? prevDep.nextDep : sub.deps;
15
+ if (nextDep !== void 0 && nextDep.dep === dep) {
16
+ nextDep.version = version;
17
+ sub.depsTail = nextDep;
18
+ return;
19
+ }
20
+ const prevSub = dep.subsTail;
21
+ if (prevSub !== void 0 && prevSub.version === version && prevSub.sub === sub) return;
22
+ const newLink = sub.depsTail = dep.subsTail = {
23
+ version,
24
+ dep,
25
+ sub,
26
+ prevDep,
27
+ nextDep,
28
+ prevSub,
29
+ nextSub: void 0
30
+ };
31
+ if (nextDep !== void 0) nextDep.prevDep = newLink;
32
+ if (prevDep !== void 0) prevDep.nextDep = newLink;
33
+ else sub.deps = newLink;
34
+ if (prevSub !== void 0) prevSub.nextSub = newLink;
35
+ else dep.subs = newLink;
36
+ }
37
+ function unlink(link, sub = link.sub) {
38
+ const dep = link.dep;
39
+ const prevDep = link.prevDep;
40
+ const nextDep = link.nextDep;
41
+ const nextSub = link.nextSub;
42
+ const prevSub = link.prevSub;
43
+ if (nextDep !== void 0) nextDep.prevDep = prevDep;
44
+ else sub.depsTail = prevDep;
45
+ if (prevDep !== void 0) prevDep.nextDep = nextDep;
46
+ else sub.deps = nextDep;
47
+ if (nextSub !== void 0) nextSub.prevSub = prevSub;
48
+ else dep.subsTail = prevSub;
49
+ if (prevSub !== void 0) prevSub.nextSub = nextSub;
50
+ else if ((dep.subs = nextSub) === void 0) unwatched(dep);
51
+ return nextDep;
52
+ }
53
+ function propagate(link) {
54
+ let next = link.nextSub;
55
+ let stack;
56
+ top: do {
57
+ const sub = link.sub;
58
+ let flags = sub.flags;
59
+ if (!(flags & 60)) sub.flags = flags | 32;
60
+ else if (!(flags & 12)) flags = 0;
61
+ else if (!(flags & 4)) sub.flags = flags & -9 | 32;
62
+ else if (!(flags & 48) && isValidLink(link, sub)) {
63
+ sub.flags = flags | 40;
64
+ flags &= 1;
65
+ } else flags = 0;
66
+ if (flags & 2) notify(sub);
67
+ if (flags & 1) {
68
+ const subSubs = sub.subs;
69
+ if (subSubs !== void 0) {
70
+ const nextSub = (link = subSubs).nextSub;
71
+ if (nextSub !== void 0) {
72
+ stack = {
73
+ value: next,
74
+ prev: stack
75
+ };
76
+ next = nextSub;
77
+ }
78
+ continue;
79
+ }
80
+ }
81
+ if ((link = next) !== void 0) {
82
+ next = link.nextSub;
83
+ continue;
84
+ }
85
+ while (stack !== void 0) {
86
+ link = stack.value;
87
+ stack = stack.prev;
88
+ if (link !== void 0) {
89
+ next = link.nextSub;
90
+ continue top;
91
+ }
92
+ }
93
+ break;
94
+ } while (true);
95
+ }
96
+ function checkDirty(link, sub) {
97
+ let stack;
98
+ let checkDepth = 0;
99
+ let dirty = false;
100
+ top: do {
101
+ const dep = link.dep;
102
+ const flags = dep.flags;
103
+ if (sub.flags & 16) dirty = true;
104
+ else if ((flags & 17) === 17) {
105
+ if (update(dep)) {
106
+ const subs = dep.subs;
107
+ if (subs.nextSub !== void 0) shallowPropagate(subs);
108
+ dirty = true;
109
+ }
110
+ } else if ((flags & 33) === 33) {
111
+ if (link.nextSub !== void 0 || link.prevSub !== void 0) stack = {
112
+ value: link,
113
+ prev: stack
114
+ };
115
+ link = dep.deps;
116
+ sub = dep;
117
+ ++checkDepth;
118
+ continue;
119
+ }
120
+ if (!dirty) {
121
+ const nextDep = link.nextDep;
122
+ if (nextDep !== void 0) {
123
+ link = nextDep;
124
+ continue;
125
+ }
126
+ }
127
+ while (checkDepth--) {
128
+ const firstSub = sub.subs;
129
+ const hasMultipleSubs = firstSub.nextSub !== void 0;
130
+ if (hasMultipleSubs) {
131
+ link = stack.value;
132
+ stack = stack.prev;
133
+ } else link = firstSub;
134
+ if (dirty) {
135
+ if (update(sub)) {
136
+ if (hasMultipleSubs) shallowPropagate(firstSub);
137
+ sub = link.sub;
138
+ continue;
139
+ }
140
+ dirty = false;
141
+ } else sub.flags &= -33;
142
+ sub = link.sub;
143
+ const nextDep = link.nextDep;
144
+ if (nextDep !== void 0) {
145
+ link = nextDep;
146
+ continue top;
147
+ }
148
+ }
149
+ return dirty;
150
+ } while (true);
151
+ }
152
+ function shallowPropagate(link) {
153
+ do {
154
+ const sub = link.sub;
155
+ const flags = sub.flags;
156
+ if ((flags & 48) === 32) {
157
+ sub.flags = flags | 16;
158
+ if ((flags & 6) === 2) notify(sub);
159
+ }
160
+ } while ((link = link.nextSub) !== void 0);
161
+ }
162
+ function isValidLink(checkLink, sub) {
163
+ let link = sub.depsTail;
164
+ while (link !== void 0) {
165
+ if (link === checkLink) return true;
166
+ link = link.prevDep;
167
+ }
168
+ return false;
169
+ }
170
+ }
171
+ let cycle$1 = 0;
172
+ let queuedLength = 0;
173
+ let activeSub$1;
174
+ const queued = [];
175
+ const { link: link$1, unlink: unlink$1, propagate: propagate$1, checkDirty: checkDirty$1, shallowPropagate: shallowPropagate$1 } = createReactiveSystem({
176
+ update(node) {
177
+ if (node.depsTail !== void 0) return updateComputed(node);
178
+ else return updateSignal(node);
179
+ },
180
+ notify(effect) {
181
+ let insertIndex = queuedLength;
182
+ let firstInsertedIndex = insertIndex;
183
+ do {
184
+ queued[insertIndex++] = effect;
185
+ effect.flags &= -3;
186
+ effect = effect.subs?.sub;
187
+ if (effect === void 0 || !(effect.flags & 2)) break;
188
+ } while (true);
189
+ queuedLength = insertIndex;
190
+ while (firstInsertedIndex < --insertIndex) {
191
+ const left = queued[firstInsertedIndex];
192
+ queued[firstInsertedIndex++] = queued[insertIndex];
193
+ queued[insertIndex] = left;
194
+ }
195
+ },
196
+ unwatched(node) {
197
+ if (!(node.flags & 1)) effectScopeOper.call(node);
198
+ else if (node.depsTail !== void 0) {
199
+ node.depsTail = void 0;
200
+ node.flags = 17;
201
+ purgeDeps$1(node);
202
+ }
203
+ }
204
+ });
205
+ function setActiveSub(sub) {
206
+ const prevSub = activeSub$1;
207
+ activeSub$1 = sub;
208
+ return prevSub;
209
+ }
210
+ function updateComputed(c) {
211
+ ++cycle$1;
212
+ c.depsTail = void 0;
213
+ c.flags = 5;
214
+ const prevSub = setActiveSub(c);
215
+ try {
216
+ const oldValue = c.value;
217
+ return oldValue !== (c.value = c.getter(oldValue));
218
+ } finally {
219
+ activeSub$1 = prevSub;
220
+ c.flags &= -5;
221
+ purgeDeps$1(c);
222
+ }
223
+ }
224
+ function updateSignal(s) {
225
+ s.flags = 1;
226
+ return s.currentValue !== (s.currentValue = s.pendingValue);
227
+ }
228
+ function effectScopeOper() {
229
+ this.depsTail = void 0;
230
+ this.flags = 0;
231
+ purgeDeps$1(this);
232
+ const sub = this.subs;
233
+ if (sub !== void 0) unlink$1(sub);
234
+ }
235
+ function purgeDeps$1(sub) {
236
+ const depsTail = sub.depsTail;
237
+ let dep = depsTail !== void 0 ? depsTail.nextDep : sub.deps;
238
+ while (dep !== void 0) dep = unlink$1(dep, sub);
239
+ }
240
+ // src/atom.ts
241
+ /** Returns `true` if `value` is an atom (has `get` and `subscribe` methods). */
242
+ function isAtom(value) {
243
+ return typeof value === "object" && value !== null && typeof value.get === "function" && typeof value.subscribe === "function";
244
+ }
245
+ const queuedEffects = [];
246
+ let cycle = 0;
247
+ const { link, unlink, propagate, checkDirty, shallowPropagate } = createReactiveSystem({
248
+ update(atom) {
249
+ return atom._update();
250
+ },
251
+ notify(effect) {
252
+ queuedEffects[queuedEffectsLength++] = effect;
253
+ effect.flags &= -3;
254
+ },
255
+ unwatched(atom) {
256
+ if (atom.depsTail !== void 0) {
257
+ atom.depsTail = void 0;
258
+ atom.flags = 17;
259
+ purgeDeps(atom);
260
+ }
261
+ }
262
+ });
263
+ let notifyIndex = 0;
264
+ let queuedEffectsLength = 0;
265
+ let activeSub;
266
+ function purgeDeps(sub) {
267
+ const depsTail = sub.depsTail;
268
+ let dep = depsTail !== void 0 ? depsTail.nextDep : sub.deps;
269
+ while (dep !== void 0) dep = unlink(dep, sub);
270
+ }
271
+ function flush() {
272
+ let didThrow = false;
273
+ let firstError;
274
+ try {
275
+ while (notifyIndex < queuedEffectsLength) {
276
+ const effect = queuedEffects[notifyIndex];
277
+ queuedEffects[notifyIndex++] = void 0;
278
+ try {
279
+ effect.notify();
280
+ } catch (error) {
281
+ effect.flags |= 10;
282
+ if (!didThrow) {
283
+ didThrow = true;
284
+ firstError = error;
285
+ }
286
+ }
287
+ }
288
+ } finally {
289
+ notifyIndex = 0;
290
+ queuedEffectsLength = 0;
291
+ }
292
+ if (didThrow) throw firstError;
293
+ }
294
+ function updateAsyncAtom(atom, nextValue, compare = Object.is) {
295
+ if (!compare(atom._snapshot, nextValue)) {
296
+ atom._snapshot = nextValue;
297
+ const subs = atom.subs;
298
+ if (subs !== void 0) {
299
+ propagate(subs);
300
+ shallowPropagate(subs);
301
+ flush();
302
+ }
303
+ }
304
+ }
305
+ /**
306
+ * Creates a read-only atom whose value is loaded from an async getter.
307
+ *
308
+ * The getter receives an `AbortSignal`; when the async atom recomputes, the
309
+ * previous signal is aborted and stale resolutions are ignored.
310
+ */
311
+ function createAsyncAtom(getValue, options) {
312
+ const ref = {};
313
+ let currentController;
314
+ let currentRunId = 0;
315
+ const atom = createAtom(() => {
316
+ currentController?.abort();
317
+ const controller = new AbortController();
318
+ const runId = ++currentRunId;
319
+ currentController = controller;
320
+ getValue({ signal: controller.signal }).then((data) => {
321
+ if (runId !== currentRunId || controller.signal.aborted) return;
322
+ updateAsyncAtom(ref.current, {
323
+ status: "done",
324
+ data
325
+ }, options?.compare);
326
+ }, (error) => {
327
+ if (runId !== currentRunId || controller.signal.aborted) return;
328
+ updateAsyncAtom(ref.current, {
329
+ status: "error",
330
+ error
331
+ }, options?.compare);
332
+ });
333
+ return { status: "pending" };
334
+ }, options);
335
+ ref.current = atom;
336
+ return atom;
337
+ }
338
+ function createAtom(valueOrFn, optionsOrInput) {
339
+ const isComputed = typeof valueOrFn === "function";
340
+ const getter = valueOrFn;
341
+ const atom = {
342
+ _snapshot: isComputed ? void 0 : valueOrFn,
343
+ subs: void 0,
344
+ subsTail: void 0,
345
+ deps: void 0,
346
+ depsTail: void 0,
347
+ flags: isComputed ? 0 : 1,
348
+ get() {
349
+ if (activeSub !== void 0) link(atom, activeSub, cycle);
350
+ return atom._snapshot;
351
+ },
352
+ subscribe(observerOrFn) {
353
+ const observer = typeof observerOrFn === "function" ? { next: observerOrFn } : observerOrFn;
354
+ const observed = { current: false };
355
+ const e = effect(() => {
356
+ atom.get();
357
+ if (!observed.current) observed.current = true;
358
+ else {
359
+ const prevSub = activeSub;
360
+ activeSub = void 0;
361
+ try {
362
+ observer.next?.(atom._snapshot);
363
+ } finally {
364
+ activeSub = prevSub;
365
+ }
366
+ atom.get();
367
+ }
368
+ });
369
+ return { unsubscribe: () => {
370
+ e.stop();
371
+ } };
372
+ },
373
+ _update(getValue) {
374
+ const prevSub = activeSub;
375
+ const compare = optionsOrInput?.compare ?? Object.is;
376
+ activeSub = isComputed ? atom : void 0;
377
+ ++cycle;
378
+ atom.depsTail = void 0;
379
+ if (isComputed) atom.flags = 5;
380
+ try {
381
+ const oldValue = atom._snapshot;
382
+ const newValue = typeof getValue === "function" ? getValue(oldValue) : getValue === void 0 && isComputed ? getter(oldValue) : getValue;
383
+ if (oldValue === void 0 || !compare(oldValue, newValue)) {
384
+ atom._snapshot = newValue;
385
+ return true;
386
+ }
387
+ return false;
388
+ } finally {
389
+ activeSub = prevSub;
390
+ if (isComputed) atom.flags &= -5;
391
+ purgeDeps(atom);
392
+ }
393
+ }
394
+ };
395
+ if (isComputed) {
396
+ atom.flags = 17;
397
+ atom.get = function() {
398
+ const flags = atom.flags;
399
+ if (flags & 16 || flags & 32 && checkDirty(atom.deps, atom)) {
400
+ if (atom._update()) {
401
+ const subs = atom.subs;
402
+ if (subs !== void 0) shallowPropagate(subs);
403
+ }
404
+ } else if (flags & 32) atom.flags = flags & -33;
405
+ if (activeSub !== void 0) link(atom, activeSub, cycle);
406
+ return atom._snapshot;
407
+ };
408
+ } else atom.set = function(valueOrFn) {
409
+ if (atom._update(valueOrFn)) {
410
+ const subs = atom.subs;
411
+ if (subs !== void 0) {
412
+ propagate(subs);
413
+ shallowPropagate(subs);
414
+ flush();
415
+ }
416
+ }
417
+ };
418
+ return atom;
419
+ }
420
+ function createAtomConfig(initialValueOrFn, options) {
421
+ return { createAtom(input) {
422
+ return createAtom(typeof initialValueOrFn === "function" ? initialValueOrFn(input) : initialValueOrFn, options);
423
+ } };
424
+ }
425
+ /** Creates an atom whose updates are handled by a reducer function. */
426
+ function createReducerAtom(initialValue, reducer, options) {
427
+ const atom = createAtom(initialValue, options);
428
+ return {
429
+ get: atom.get.bind(atom),
430
+ subscribe: atom.subscribe.bind(atom),
431
+ send(event) {
432
+ const prevSub = activeSub;
433
+ activeSub = void 0;
434
+ let nextState;
435
+ try {
436
+ nextState = reducer(atom.get(), event);
437
+ } finally {
438
+ activeSub = prevSub;
439
+ }
440
+ atom.set(nextState);
441
+ }
442
+ };
443
+ }
444
+ function effect(fn) {
445
+ const run = () => {
446
+ const prevSub = activeSub;
447
+ activeSub = effectObj;
448
+ ++cycle;
449
+ effectObj.depsTail = void 0;
450
+ effectObj.flags = 6;
451
+ try {
452
+ return fn();
453
+ } finally {
454
+ activeSub = prevSub;
455
+ effectObj.flags &= -5;
456
+ purgeDeps(effectObj);
457
+ }
458
+ };
459
+ const effectObj = {
460
+ deps: void 0,
461
+ depsTail: void 0,
462
+ subs: void 0,
463
+ subsTail: void 0,
464
+ flags: 6,
465
+ notify() {
466
+ const flags = this.flags;
467
+ if (flags & 16 || flags & 32 && checkDirty(this.deps, this)) run();
468
+ else this.flags = 2;
469
+ },
470
+ stop() {
471
+ this.flags = 0;
472
+ this.depsTail = void 0;
473
+ purgeDeps(this);
474
+ }
475
+ };
476
+ run();
477
+ return effectObj;
478
+ }
479
+ // src/store.ts
480
+ const symbolObservable = (() => typeof Symbol === "function" && Symbol.observable || "@@observable")();
481
+ const isDevelopment = globalThis.process?.env?.NODE_ENV !== "production";
482
+ const UNSUPPORTED_ASYNC_TRANSITION_ERROR = "Async transition unsupported here";
483
+ function isPromiseLike(value) {
484
+ return !!value && typeof value.then === "function";
485
+ }
486
+ function ignorePromiseRejection(value) {
487
+ Promise.resolve(value).catch(() => {});
488
+ }
489
+ function createTransitionResult(snapshot, effects, allowed) {
490
+ const result = [snapshot, effects];
491
+ if (allowed !== void 0) result._allowed = allowed;
492
+ return result;
493
+ }
494
+ function toEvent(eventType, payload) {
495
+ return payload === void 0 ? { type: eventType } : {
496
+ ...payload,
497
+ type: eventType
498
+ };
499
+ }
500
+ function createEnqueueObject(effects, trigger) {
501
+ return {
502
+ emit: new Proxy({}, { get: (_, eventType) => {
503
+ return (payload) => {
504
+ effects.push(toEvent(eventType, payload));
505
+ };
506
+ } }),
507
+ trigger: new Proxy({}, { get: (_, eventType) => {
508
+ return (payload) => {
509
+ trigger?.(toEvent(eventType, payload));
510
+ };
511
+ } }),
512
+ effect: (fn) => {
513
+ effects.push(fn);
514
+ }
515
+ };
516
+ }
517
+ function getDistinctEventTypes(eventTypes) {
518
+ return [...new Set(eventTypes)];
519
+ }
520
+ function assertNoInternalEventTypeCollisions(existingEventTypes, internalEventTypes, extensionName) {
521
+ if (!isDevelopment || !existingEventTypes?.length) return;
522
+ const existingEventTypeSet = new Set(existingEventTypes);
523
+ const collisions = getDistinctEventTypes(internalEventTypes.filter((eventType) => existingEventTypeSet.has(eventType)));
524
+ if (collisions.length === 0) return;
525
+ throw new Error(`The "${extensionName}" store extension uses reserved event type(s): ${collisions.map((eventType) => `"${eventType}"`).join(", ")}. Rename the conflicting store event(s) before applying the extension.`);
526
+ }
527
+ function appendInternalEventTypes(existingEventTypes, internalEventTypes, extensionName) {
528
+ assertNoInternalEventTypeCollisions(existingEventTypes, internalEventTypes, extensionName);
529
+ return getDistinctEventTypes([...existingEventTypes ?? [], ...internalEventTypes]);
530
+ }
531
+ function createConcreteTrigger(eventTypes, send) {
532
+ const trigger = {};
533
+ for (const eventType of eventTypes) trigger[eventType] = ((payload) => {
534
+ send(toEvent(eventType, payload));
535
+ });
536
+ return trigger;
537
+ }
538
+ function createConcreteCan(eventTypes, can) {
539
+ const canObject = {};
540
+ for (const eventType of eventTypes) canObject[eventType] = ((payload) => {
541
+ return can(toEvent(eventType, payload));
542
+ });
543
+ return canObject;
544
+ }
545
+ function attachSelectors(store, selectorsConfig) {
546
+ const selectors = {};
547
+ for (const [key, selector] of Object.entries(selectorsConfig)) selectors[key] = store.select(selector);
548
+ const originalWith = store.with;
549
+ const storeWithSelectors = store;
550
+ storeWithSelectors.selectors = selectors;
551
+ storeWithSelectors.with = ((extension) => attachSelectors(originalWith(extension), selectorsConfig));
552
+ return storeWithSelectors;
553
+ }
554
+ function createStoreCore(logic) {
555
+ let listeners;
556
+ let inspectionObservers;
557
+ const initialSnapshot = logic.getInitialSnapshot();
558
+ let currentSnapshot = initialSnapshot;
559
+ const atom = createAtom(currentSnapshot);
560
+ const eventTypes = logic.eventTypes;
561
+ const schemas = logic.schemas;
562
+ const emit = (ev) => {
563
+ listeners?.get(ev.type)?.forEach((listener) => listener(ev));
564
+ listeners?.get("*")?.forEach((listener) => listener(ev));
565
+ };
566
+ const transition = logic.transition;
567
+ const notifyInspection = (event, snapshot) => {
568
+ inspectionObservers?.forEach((observer) => {
569
+ observer.next?.({
570
+ type: "@xstate.transition",
571
+ event,
572
+ snapshot,
573
+ actorRef: store,
574
+ rootId: store.sessionId
575
+ });
576
+ });
577
+ };
578
+ const send = (event) => {
579
+ receive(event);
580
+ };
581
+ function receive(event) {
582
+ const [nextSnapshot, effects] = transition(currentSnapshot, event);
583
+ currentSnapshot = nextSnapshot;
584
+ atom.set(nextSnapshot);
585
+ notifyInspection(event, nextSnapshot);
586
+ let committed = false;
587
+ const effectEnqueue = {
588
+ trigger,
589
+ send,
590
+ getSnapshot: () => committed ? currentSnapshot : nextSnapshot
591
+ };
592
+ for (const effect of effects) if (typeof effect === "function") effect(effectEnqueue);
593
+ else emit(effect);
594
+ committed = true;
595
+ }
596
+ const trigger = eventTypes && eventTypes.length > 0 ? createConcreteTrigger(eventTypes, (event) => store.send(event)) : new Proxy({}, { get: (_, eventType) => {
597
+ return (payload) => {
598
+ send(toEvent(eventType, payload));
599
+ };
600
+ } });
601
+ const can = eventTypes && eventTypes.length > 0 ? createConcreteCan(eventTypes, (event) => canTransition(event)) : new Proxy({}, { get: (_, eventType) => {
602
+ return (payload) => {
603
+ return canTransition(toEvent(eventType, payload));
604
+ };
605
+ } });
606
+ function canTransition(event) {
607
+ const snapshot = currentSnapshot;
608
+ try {
609
+ const result = transition(snapshot, event);
610
+ return result._allowed ?? (result[0] !== snapshot || result[1].length > 0);
611
+ } catch (error) {
612
+ if (isStoreValidationError(error)) return false;
613
+ throw error;
614
+ }
615
+ }
616
+ const store = {
617
+ on(emittedEventType, handler) {
618
+ if (!listeners) listeners = /* @__PURE__ */ new Map();
619
+ let eventListeners = listeners.get(emittedEventType);
620
+ if (!eventListeners) {
621
+ eventListeners = /* @__PURE__ */ new Set();
622
+ listeners.set(emittedEventType, eventListeners);
623
+ }
624
+ eventListeners.add(handler);
625
+ return { unsubscribe() {
626
+ eventListeners.delete(handler);
627
+ } };
628
+ },
629
+ transition(state, event) {
630
+ return transition(state, event);
631
+ },
632
+ schemas,
633
+ sessionId: uniqueId(),
634
+ send,
635
+ getSnapshot() {
636
+ return currentSnapshot;
637
+ },
638
+ get() {
639
+ return atom.get();
640
+ },
641
+ getInitialSnapshot() {
642
+ return initialSnapshot;
643
+ },
644
+ subscribe: atom.subscribe.bind(atom),
645
+ [symbolObservable]() {
646
+ return this;
647
+ },
648
+ inspect: (observerOrFn) => {
649
+ const observer = typeof observerOrFn === "function" ? { next: observerOrFn } : observerOrFn;
650
+ (inspectionObservers ??= /* @__PURE__ */ new Set()).add(observer);
651
+ observer.next?.({
652
+ type: "@xstate.transition",
653
+ event: { type: "@xstate.init" },
654
+ snapshot: currentSnapshot,
655
+ actorRef: store,
656
+ rootId: store.sessionId
657
+ });
658
+ return { unsubscribe() {
659
+ return inspectionObservers?.delete(observer);
660
+ } };
661
+ },
662
+ trigger,
663
+ can,
664
+ select(selector, equalityFn = Object.is) {
665
+ return createAtom(() => selector(store.get().context), { compare: equalityFn });
666
+ },
667
+ with(extension) {
668
+ return createStoreCore(extension(logic));
669
+ }
670
+ };
671
+ return store;
672
+ }
673
+ function createStore(definitionOrLogic) {
674
+ if ("transition" in definitionOrLogic) return createStoreCore(definitionOrLogic);
675
+ const transition = createStoreTransition(definitionOrLogic.on);
676
+ return createStoreCore({
677
+ eventTypes: definitionOrLogic.schemas?.events ? Object.keys(definitionOrLogic.schemas.events) : Object.keys(definitionOrLogic.on),
678
+ schemas: definitionOrLogic.schemas,
679
+ warn: definitionOrLogic.warn,
680
+ getInitialSnapshot: () => ({
681
+ status: "active",
682
+ context: definitionOrLogic.context,
683
+ output: void 0,
684
+ error: void 0
685
+ }),
686
+ transition
687
+ });
688
+ }
689
+ function _createStoreConfig(definition) {
690
+ return definition;
691
+ }
692
+ const createStoreConfig = _createStoreConfig;
693
+ function createStoreLogic(config) {
694
+ return { createStore(input) {
695
+ const context = typeof config.context === "function" ? config.context(input) : config.context;
696
+ const store = createStore({
697
+ ...config,
698
+ context
699
+ });
700
+ return config.selectors ? attachSelectors(store, config.selectors) : store;
701
+ } };
702
+ }
703
+ /**
704
+ * Creates a store transition function that handles state updates based on
705
+ * events.
706
+ *
707
+ * @param transitions - An object mapping event types to transition functions
708
+ * @param producer - Optional producer function (e.g., Immer's produce) for
709
+ * immutable updates
710
+ * @returns A transition function that takes a snapshot and event and returns a
711
+ * new snapshot with effects
712
+ */
713
+ function createStoreTransition(transitions, producer) {
714
+ const storeTransition = (snapshot, event) => {
715
+ let currentSnapshot = snapshot;
716
+ const effects = [];
717
+ const pendingEvents = [event];
718
+ let allowed = false;
719
+ for (let index = 0; index < pendingEvents.length; index++) {
720
+ const currentEvent = pendingEvents[index];
721
+ if (currentEvent === void 0) continue;
722
+ const currentContext = currentSnapshot.context;
723
+ const assigner = transitions?.[currentEvent.type];
724
+ let producerAssignerResult;
725
+ let assignerResult = void 0;
726
+ const effectsLength = effects.length;
727
+ if (!assigner) continue;
728
+ const enqueue = createEnqueueObject(effects, (triggeredEvent) => {
729
+ allowed = true;
730
+ pendingEvents.push(triggeredEvent);
731
+ });
732
+ const nextContext = producer ? producer(currentContext, (draftContext) => producerAssignerResult = assigner(draftContext, currentEvent, enqueue)) : (assignerResult = assigner(currentContext, currentEvent, enqueue)) === void 0 ? currentContext : assignerResult;
733
+ if (isPromiseLike(producer ? producerAssignerResult : nextContext)) {
734
+ ignorePromiseRejection(producer ? producerAssignerResult : nextContext);
735
+ throw new Error(UNSUPPORTED_ASYNC_TRANSITION_ERROR);
736
+ }
737
+ allowed ||= producer ? nextContext !== currentContext || effects.length > effectsLength : assignerResult !== void 0 || effects.length > effectsLength;
738
+ if (nextContext !== currentContext) currentSnapshot = {
739
+ ...currentSnapshot,
740
+ context: nextContext
741
+ };
742
+ }
743
+ return createTransitionResult(currentSnapshot, effects, allowed);
744
+ };
745
+ return storeTransition;
746
+ }
747
+ /**
748
+ * Generates a unique 6-character identifier.
749
+ *
750
+ * @returns A random string identifier
751
+ */
752
+ function uniqueId() {
753
+ return Math.random().toString(36).slice(6);
754
+ }
755
+ export { createStoreConfig as a, createAsyncAtom as c, createReducerAtom as d, isAtom as f, createStore as i, createAtom as l, assertNoInternalEventTypeCollisions as n, createStoreLogic as o, createEnqueueObject as r, createStoreTransition as s, appendInternalEventTypes as t, createAtomConfig as u };