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