xstate 5.0.0-beta.27 → 5.0.0-beta.29

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