Skip to content

Commit

Permalink
Remove the ability to define delayed transitions using an array (#4216)
Browse files Browse the repository at this point in the history
* Remove the ability to define delayed transitions using an array

* Add a changeset
  • Loading branch information
Andarist committed Oct 16, 2023
1 parent 0ca1b86 commit 04cad53
Show file tree
Hide file tree
Showing 6 changed files with 73 additions and 109 deletions.
20 changes: 20 additions & 0 deletions .changeset/modern-moles-greet.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
---
'xstate': major
---

Removed the ability to define delayed transitions using an array. Only object variant is supported now:

```ts
createMachine({
initial: 'a',
states: {
a: {
after: {
10000: 'b',
noon: 'c'
}
}
// ...
}
});
```
33 changes: 14 additions & 19 deletions packages/core/src/stateUtils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -326,25 +326,20 @@ export function getDelayedTransitions(
return eventType;
};

const delayedTransitions = isArray(afterConfig)
? afterConfig.map((transition, i) => {
const eventType = mutateEntryExit(transition.delay, i);
return { ...transition, event: eventType };
})
: Object.keys(afterConfig).flatMap((delay, i) => {
const configTransition = afterConfig[delay];
const resolvedTransition =
typeof configTransition === 'string'
? { target: configTransition }
: configTransition;
const resolvedDelay = !isNaN(+delay) ? +delay : delay;
const eventType = mutateEntryExit(resolvedDelay, i);
return toArray(resolvedTransition).map((transition) => ({
...transition,
event: eventType,
delay: resolvedDelay
}));
});
const delayedTransitions = Object.keys(afterConfig).flatMap((delay, i) => {
const configTransition = afterConfig[delay];
const resolvedTransition =
typeof configTransition === 'string'
? { target: configTransition }
: configTransition;
const resolvedDelay = !isNaN(+delay) ? +delay : delay;
const eventType = mutateEntryExit(resolvedDelay, i);
return toArray(resolvedTransition).map((transition) => ({
...transition,
event: eventType,
delay: resolvedDelay
}));
});
return delayedTransitions.map((delayedTransition) => {
const { delay } = delayedTransition;
return {
Expand Down
17 changes: 1 addition & 16 deletions packages/core/src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -442,22 +442,7 @@ export type DelayedTransitions<
TDelay
>
>;
}
| Array<
TransitionConfig<
TContext,
TEvent,
TEvent,
TActor,
TAction,
TGuard,
TDelay
> & {
delay:
| Delay<TDelay>
| ((args: UnifiedArg<TContext, TEvent, TEvent>) => Delay<TDelay>);
}
>;
};

export type StateTypes =
| 'atomic'
Expand Down
49 changes: 25 additions & 24 deletions packages/core/test/after.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,9 @@ const lightMachine = createMachine({
}
},
red: {
after: [{ delay: 1000, target: 'green' }]
after: {
1000: 'green'
}
}
}
});
Expand Down Expand Up @@ -229,24 +231,26 @@ describe('delayed transitions', () => {
const context = {
delay: 500
};
const machine = createMachine({
initial: 'inactive',
context,
states: {
inactive: {
after: [
{
delay: ({ context }) => {
spy(context);
return context.delay;
},
target: 'active'
}
]
},
active: {}
const machine = createMachine(
{
initial: 'inactive',
context,
states: {
inactive: {
after: { myDelay: 'active' }
},
active: {}
}
},
{
delays: {
myDelay: ({ context }) => {
spy(context);
return context.delay;
}
}
}
});
);

const actor = createActor(machine).start();

Expand All @@ -273,12 +277,9 @@ describe('delayed transitions', () => {
}
},
active: {
after: [
{
delay: 'someDelay',
target: 'inactive'
}
]
after: {
someDelay: 'inactive'
}
}
}
},
Expand Down
33 changes: 13 additions & 20 deletions packages/core/test/interpreter.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -382,19 +382,19 @@ describe('interpreter', () => {
const clock = new SimulatedClock();
const letterMachine = createMachine(
{
types: {} as {
events: { type: 'FIRE_DELAY'; value: number };
},
id: 'letter',
context: {
delay: 100
},
initial: 'a',
states: {
a: {
after: [
{
delay: ({ context }) => context.delay,
target: 'b'
}
]
after: {
delayA: 'b'
}
},
b: {
after: {
Expand All @@ -408,21 +408,12 @@ describe('interpreter', () => {
}
},
d: {
after: [
{
delay: ({ context, event }) =>
context.delay + (event as any).value,
target: 'e'
}
]
after: {
delayD: 'e'
}
},
e: {
after: [
{
delay: 'someDelay',
target: 'f'
}
]
after: { someDelay: 'f' }
},
f: {
type: 'final'
Expand All @@ -433,7 +424,9 @@ describe('interpreter', () => {
delays: {
someDelay: ({ context }) => {
return context.delay + 50;
}
},
delayA: ({ context }) => context.delay,
delayD: ({ context, event }) => context.delay + (event as any).value
}
}
);
Expand Down
30 changes: 0 additions & 30 deletions packages/core/test/smoke.test.ts

This file was deleted.

0 comments on commit 04cad53

Please sign in to comment.