xstate 5.0.0-beta.27 → 5.0.0-beta.28

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.
Files changed (59) hide show
  1. package/README.md +9 -7
  2. package/actions/dist/xstate-actions.cjs.js +11 -17
  3. package/actions/dist/xstate-actions.cjs.mjs +0 -8
  4. package/actions/dist/xstate-actions.development.cjs.js +11 -17
  5. package/actions/dist/xstate-actions.development.cjs.mjs +0 -8
  6. package/actions/dist/xstate-actions.development.esm.js +3 -1
  7. package/actions/dist/xstate-actions.esm.js +3 -1
  8. package/actions/dist/xstate-actions.umd.min.js +1 -1
  9. package/actions/dist/xstate-actions.umd.min.js.map +1 -1
  10. package/actors/dist/xstate-actors.cjs.js +413 -11
  11. package/actors/dist/xstate-actors.development.cjs.js +413 -11
  12. package/actors/dist/xstate-actors.development.esm.js +405 -4
  13. package/actors/dist/xstate-actors.esm.js +405 -4
  14. package/actors/dist/xstate-actors.umd.min.js +1 -1
  15. package/actors/dist/xstate-actors.umd.min.js.map +1 -1
  16. package/dist/declarations/src/StateNode.d.ts +3 -3
  17. package/dist/declarations/src/actions/assign.d.ts +8 -3
  18. package/dist/declarations/src/actions/choose.d.ts +4 -3
  19. package/dist/declarations/src/actions/pure.d.ts +5 -4
  20. package/dist/declarations/src/actions.d.ts +8 -44
  21. package/dist/declarations/src/actors/index.d.ts +2 -2
  22. package/dist/declarations/src/constants.d.ts +1 -0
  23. package/dist/declarations/src/index.d.ts +9 -16
  24. package/dist/declarations/src/spawn.d.ts +25 -0
  25. package/dist/declarations/src/stateUtils.d.ts +1 -1
  26. package/dist/declarations/src/typegenTypes.d.ts +4 -4
  27. package/dist/declarations/src/types.d.ts +72 -94
  28. package/dist/declarations/src/utils.d.ts +2 -2
  29. package/dist/interpreter-672794ae.cjs.js +792 -0
  30. package/dist/interpreter-a1432c7d.development.cjs.js +800 -0
  31. package/dist/interpreter-a77bb0ec.development.esm.js +765 -0
  32. package/dist/interpreter-b5203bcb.esm.js +757 -0
  33. package/dist/{actions-9754d2ca.development.esm.js → raise-436a57a2.cjs.js} +130 -1307
  34. package/dist/{actions-ca622922.development.cjs.js → raise-74b72ca5.development.cjs.js} +101 -1306
  35. package/dist/{actions-020463e9.esm.js → raise-a60c9290.development.esm.js} +109 -1203
  36. package/dist/{actions-d1dba4ac.cjs.js → raise-b9c9a234.esm.js} +65 -1267
  37. package/dist/send-35e1a689.cjs.js +349 -0
  38. package/dist/send-4192e7bc.esm.js +339 -0
  39. package/dist/send-e63b7b83.development.esm.js +364 -0
  40. package/dist/send-e8b55d00.development.cjs.js +374 -0
  41. package/dist/xstate.cjs.js +110 -106
  42. package/dist/xstate.cjs.mjs +4 -2
  43. package/dist/xstate.development.cjs.js +110 -106
  44. package/dist/xstate.development.cjs.mjs +4 -2
  45. package/dist/xstate.development.esm.js +72 -68
  46. package/dist/xstate.esm.js +72 -68
  47. package/dist/xstate.umd.min.js +1 -1
  48. package/dist/xstate.umd.min.js.map +1 -1
  49. package/guards/dist/xstate-guards.cjs.js +2 -1
  50. package/guards/dist/xstate-guards.development.cjs.js +2 -1
  51. package/guards/dist/xstate-guards.development.esm.js +2 -1
  52. package/guards/dist/xstate-guards.esm.js +2 -1
  53. package/guards/dist/xstate-guards.umd.min.js.map +1 -1
  54. package/package.json +1 -1
  55. package/dist/declarations/src/constantPrefixes.d.ts +0 -6
  56. package/dist/promise-2ad94e3b.development.esm.js +0 -406
  57. package/dist/promise-3b7e3357.development.cjs.js +0 -412
  58. package/dist/promise-5b07c38e.esm.js +0 -406
  59. package/dist/promise-7a8c1768.cjs.js +0 -412
@@ -2,10 +2,412 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
- var guards_dist_xstateGuards = require('../../dist/actions-d1dba4ac.cjs.js');
6
- var promise = require('../../dist/promise-7a8c1768.cjs.js');
5
+ var interpreter = require('../../dist/interpreter-672794ae.cjs.js');
7
6
  require('../../dev/dist/xstate-dev.cjs.js');
8
7
 
8
+ /**
9
+ * Returns actor logic from a transition function and its initial state.
10
+ *
11
+ * A transition function is a function that takes the current state and an event and returns the next state.
12
+ *
13
+ * @param transition The transition function that returns the next state given the current state and event.
14
+ * @param initialState The initial state of the transition function.
15
+ * @returns Actor logic
16
+ */
17
+ function fromTransition(transition, initialState) {
18
+ return {
19
+ config: transition,
20
+ transition: (state, event, actorContext) => {
21
+ return transition(state, event, actorContext);
22
+ },
23
+ getInitialState: (_, input) => {
24
+ return typeof initialState === 'function' ? initialState({
25
+ input
26
+ }) : initialState;
27
+ },
28
+ getSnapshot: state => state,
29
+ getPersistedState: state => state,
30
+ restoreState: state => state
31
+ };
32
+ }
33
+
34
+ function fromCallback(invokeCallback) {
35
+ return {
36
+ config: invokeCallback,
37
+ start: (_state, {
38
+ self
39
+ }) => {
40
+ self.send({
41
+ type: interpreter.XSTATE_INIT
42
+ });
43
+ },
44
+ transition: (state, event, {
45
+ self,
46
+ id,
47
+ system
48
+ }) => {
49
+ if (event.type === interpreter.XSTATE_INIT) {
50
+ const sendBack = eventForParent => {
51
+ if (state.canceled) {
52
+ return;
53
+ }
54
+ self._parent?.send(eventForParent);
55
+ };
56
+ const receive = newListener => {
57
+ state.receivers.add(newListener);
58
+ };
59
+ state.dispose = invokeCallback({
60
+ input: state.input,
61
+ system,
62
+ self: self,
63
+ sendBack,
64
+ receive
65
+ });
66
+ if (interpreter.isPromiseLike(state.dispose)) {
67
+ state.dispose.then(resolved => {
68
+ self._parent?.send(interpreter.createDoneActorEvent(id, resolved));
69
+ state.canceled = true;
70
+ }, errorData => {
71
+ state.canceled = true;
72
+ self._parent?.send(interpreter.createErrorActorEvent(id, errorData));
73
+ });
74
+ }
75
+ return state;
76
+ }
77
+ if (event.type === interpreter.XSTATE_STOP) {
78
+ state.canceled = true;
79
+ if (typeof state.dispose === 'function') {
80
+ state.dispose();
81
+ }
82
+ return state;
83
+ }
84
+ state.receivers.forEach(receiver => receiver(event));
85
+ return state;
86
+ },
87
+ getInitialState: (_, input) => {
88
+ return {
89
+ canceled: false,
90
+ receivers: new Set(),
91
+ dispose: undefined,
92
+ input
93
+ };
94
+ },
95
+ getSnapshot: () => undefined,
96
+ getPersistedState: ({
97
+ input,
98
+ canceled
99
+ }) => ({
100
+ input,
101
+ canceled
102
+ })
103
+ };
104
+ }
105
+
106
+ function fromObservable(observableCreator) {
107
+ const nextEventType = '$$xstate.next';
108
+ const errorEventType = '$$xstate.error';
109
+ const completeEventType = '$$xstate.complete';
110
+ return {
111
+ config: observableCreator,
112
+ transition: (state, event, {
113
+ self,
114
+ id,
115
+ defer
116
+ }) => {
117
+ if (state.status !== 'active') {
118
+ return state;
119
+ }
120
+ switch (event.type) {
121
+ case nextEventType:
122
+ // match the exact timing of events sent by machines
123
+ // send actions are not executed immediately
124
+ defer(() => {
125
+ self._parent?.send({
126
+ type: `xstate.snapshot.${id}`,
127
+ data: event.data
128
+ });
129
+ });
130
+ return {
131
+ ...state,
132
+ data: event.data
133
+ };
134
+ case errorEventType:
135
+ return {
136
+ ...state,
137
+ status: 'error',
138
+ input: undefined,
139
+ data: event.data,
140
+ // TODO: if we keep this as `data` we should reflect this in the type
141
+ subscription: undefined
142
+ };
143
+ case completeEventType:
144
+ return {
145
+ ...state,
146
+ status: 'done',
147
+ input: undefined,
148
+ subscription: undefined
149
+ };
150
+ case interpreter.XSTATE_STOP:
151
+ state.subscription.unsubscribe();
152
+ return {
153
+ ...state,
154
+ status: 'canceled',
155
+ input: undefined,
156
+ subscription: undefined
157
+ };
158
+ default:
159
+ return state;
160
+ }
161
+ },
162
+ getInitialState: (_, input) => {
163
+ return {
164
+ subscription: undefined,
165
+ status: 'active',
166
+ data: undefined,
167
+ input
168
+ };
169
+ },
170
+ start: (state, {
171
+ self,
172
+ system
173
+ }) => {
174
+ if (state.status === 'done') {
175
+ // Do not restart a completed observable
176
+ return;
177
+ }
178
+ state.subscription = observableCreator({
179
+ input: state.input,
180
+ system,
181
+ self
182
+ }).subscribe({
183
+ next: value => {
184
+ self.send({
185
+ type: nextEventType,
186
+ data: value
187
+ });
188
+ },
189
+ error: err => {
190
+ self.send({
191
+ type: errorEventType,
192
+ data: err
193
+ });
194
+ },
195
+ complete: () => {
196
+ self.send({
197
+ type: completeEventType
198
+ });
199
+ }
200
+ });
201
+ },
202
+ getSnapshot: state => state.data,
203
+ getPersistedState: ({
204
+ status,
205
+ data,
206
+ input
207
+ }) => ({
208
+ status,
209
+ data,
210
+ input
211
+ }),
212
+ getStatus: state => state,
213
+ restoreState: state => ({
214
+ ...state,
215
+ subscription: undefined
216
+ })
217
+ };
218
+ }
219
+
220
+ /**
221
+ * Creates event observable logic that listens to an observable
222
+ * that delivers event objects.
223
+ *
224
+ *
225
+ * @param lazyObservable A function that creates an observable
226
+ * @returns Event observable logic
227
+ */
228
+
229
+ function fromEventObservable(lazyObservable) {
230
+ const errorEventType = '$$xstate.error';
231
+ const completeEventType = '$$xstate.complete';
232
+
233
+ // TODO: event types
234
+ return {
235
+ config: lazyObservable,
236
+ transition: (state, event) => {
237
+ if (state.status !== 'active') {
238
+ return state;
239
+ }
240
+ switch (event.type) {
241
+ case errorEventType:
242
+ return {
243
+ ...state,
244
+ status: 'error',
245
+ input: undefined,
246
+ data: event.data,
247
+ // TODO: if we keep this as `data` we should reflect this in the type
248
+ subscription: undefined
249
+ };
250
+ case completeEventType:
251
+ return {
252
+ ...state,
253
+ status: 'done',
254
+ input: undefined,
255
+ subscription: undefined
256
+ };
257
+ case interpreter.XSTATE_STOP:
258
+ state.subscription.unsubscribe();
259
+ return {
260
+ ...state,
261
+ status: 'canceled',
262
+ input: undefined,
263
+ subscription: undefined
264
+ };
265
+ default:
266
+ return state;
267
+ }
268
+ },
269
+ getInitialState: (_, input) => {
270
+ return {
271
+ subscription: undefined,
272
+ status: 'active',
273
+ data: undefined,
274
+ input
275
+ };
276
+ },
277
+ start: (state, {
278
+ self,
279
+ system
280
+ }) => {
281
+ if (state.status === 'done') {
282
+ // Do not restart a completed observable
283
+ return;
284
+ }
285
+ state.subscription = lazyObservable({
286
+ input: state.input,
287
+ system,
288
+ self
289
+ }).subscribe({
290
+ next: value => {
291
+ self._parent?.send(value);
292
+ },
293
+ error: err => {
294
+ self.send({
295
+ type: errorEventType,
296
+ data: err
297
+ });
298
+ },
299
+ complete: () => {
300
+ self.send({
301
+ type: completeEventType
302
+ });
303
+ }
304
+ });
305
+ },
306
+ getSnapshot: _ => undefined,
307
+ getPersistedState: ({
308
+ status,
309
+ data,
310
+ input
311
+ }) => ({
312
+ status,
313
+ data,
314
+ input
315
+ }),
316
+ getStatus: state => state,
317
+ restoreState: state => ({
318
+ ...state,
319
+ subscription: undefined
320
+ })
321
+ };
322
+ }
323
+
324
+ const resolveEventType = '$$xstate.resolve';
325
+ const rejectEventType = '$$xstate.reject';
326
+ function fromPromise(
327
+ // TODO: add types
328
+ promiseCreator) {
329
+ // TODO: add event types
330
+ const logic = {
331
+ config: promiseCreator,
332
+ transition: (state, event) => {
333
+ if (state.status !== 'active') {
334
+ return state;
335
+ }
336
+ switch (event.type) {
337
+ case resolveEventType:
338
+ return {
339
+ ...state,
340
+ status: 'done',
341
+ data: event.data,
342
+ input: undefined
343
+ };
344
+ case rejectEventType:
345
+ return {
346
+ ...state,
347
+ status: 'error',
348
+ data: event.data,
349
+ // TODO: if we keep this as `data` we should reflect this in the type
350
+ input: undefined
351
+ };
352
+ case interpreter.XSTATE_STOP:
353
+ return {
354
+ ...state,
355
+ status: 'canceled',
356
+ input: undefined
357
+ };
358
+ default:
359
+ return state;
360
+ }
361
+ },
362
+ start: (state, {
363
+ self,
364
+ system
365
+ }) => {
366
+ // TODO: determine how to allow customizing this so that promises
367
+ // can be restarted if necessary
368
+ if (state.status !== 'active') {
369
+ return;
370
+ }
371
+ const resolvedPromise = Promise.resolve(promiseCreator({
372
+ input: state.input,
373
+ system,
374
+ self
375
+ }));
376
+ resolvedPromise.then(response => {
377
+ // TODO: remove this condition once dead letter queue lands
378
+ if (self._state.status !== 'active') {
379
+ return;
380
+ }
381
+ self.send({
382
+ type: resolveEventType,
383
+ data: response
384
+ });
385
+ }, errorData => {
386
+ // TODO: remove this condition once dead letter queue lands
387
+ if (self._state.status !== 'active') {
388
+ return;
389
+ }
390
+ self.send({
391
+ type: rejectEventType,
392
+ data: errorData
393
+ });
394
+ });
395
+ },
396
+ getInitialState: (_, input) => {
397
+ return {
398
+ status: 'active',
399
+ data: undefined,
400
+ input
401
+ };
402
+ },
403
+ getSnapshot: state => state.data,
404
+ getStatus: state => state,
405
+ getPersistedState: state => state,
406
+ restoreState: state => state
407
+ };
408
+ return logic;
409
+ }
410
+
9
411
  function isActorRef(item) {
10
412
  return !!item && typeof item === 'object' && typeof item.send === 'function';
11
413
  }
@@ -22,24 +424,24 @@ function toActorRef(actorRefLike) {
22
424
  sessionId: '',
23
425
  getSnapshot: () => undefined,
24
426
  // TODO: this isn't safe
25
- [guards_dist_xstateGuards.symbolObservable]: function () {
427
+ [interpreter.symbolObservable]: function () {
26
428
  return this;
27
429
  },
28
- status: guards_dist_xstateGuards.ActorStatus.Running,
430
+ status: interpreter.ActorStatus.Running,
29
431
  stop: () => void 0,
30
432
  ...actorRefLike
31
433
  };
32
434
  }
33
- const emptyLogic = promise.fromTransition(_ => undefined, undefined);
435
+ const emptyLogic = fromTransition(_ => undefined, undefined);
34
436
  function createEmptyActor() {
35
- return guards_dist_xstateGuards.createActor(emptyLogic);
437
+ return interpreter.createActor(emptyLogic);
36
438
  }
37
439
 
38
- exports.fromCallback = promise.fromCallback;
39
- exports.fromEventObservable = promise.fromEventObservable;
40
- exports.fromObservable = promise.fromObservable;
41
- exports.fromPromise = promise.fromPromise;
42
- exports.fromTransition = promise.fromTransition;
43
440
  exports.createEmptyActor = createEmptyActor;
441
+ exports.fromCallback = fromCallback;
442
+ exports.fromEventObservable = fromEventObservable;
443
+ exports.fromObservable = fromObservable;
444
+ exports.fromPromise = fromPromise;
445
+ exports.fromTransition = fromTransition;
44
446
  exports.isActorRef = isActorRef;
45
447
  exports.toActorRef = toActorRef;