Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Microsteps #1045

Merged
merged 57 commits into from
Apr 3, 2020
Merged
Changes from 1 commit
Commits
Show all changes
57 commits
Select commit Hold shift + click to select a range
432451e
Simplify action resolution
davidkpiano Feb 23, 2020
b296d6f
Refactor WIP
davidkpiano Feb 23, 2020
d60392d
Refactor WIP
davidkpiano Feb 23, 2020
95c44db
Refactor WIP
davidkpiano Feb 23, 2020
d1cd145
Refactor: macrostep
davidkpiano Feb 29, 2020
3a14357
Refactor WIP
davidkpiano Feb 29, 2020
38ad340
Refactor initial state WIP
davidkpiano Feb 29, 2020
5dc98cd
State.initial now represents initial transition
davidkpiano Feb 29, 2020
3e6ea2d
Update snapshots and @xstate/scxml
davidkpiano Feb 29, 2020
1523559
Add tests for initial entry
davidkpiano Feb 29, 2020
44f4632
Merge branch 'next' into v5/microstep
davidkpiano Mar 1, 2020
9ce3e76
Fixing schema WIP
davidkpiano Mar 2, 2020
1a5ed0e
Add microstep tests
davidkpiano Mar 2, 2020
f678258
Cleanup unused code
davidkpiano Mar 2, 2020
60eed33
Export macrostep
davidkpiano Mar 2, 2020
ba9557e
Renaming
davidkpiano Mar 4, 2020
4d7e497
Renaming + re-enabling tests
davidkpiano Mar 4, 2020
d76ba72
Some renaming
davidkpiano Mar 4, 2020
242db33
Merge branch 'next' into v5/microstep
davidkpiano Mar 4, 2020
93e4edd
Use microstep in machine.transition()
davidkpiano Mar 4, 2020
ddeabbb
Remove unused functions
davidkpiano Mar 4, 2020
b8eac4f
Cleanup
davidkpiano Mar 4, 2020
8c6db35
Remove unkonwn property
davidkpiano Mar 4, 2020
d17c341
Macrostep WIP
davidkpiano Mar 6, 2020
ec83279
Macrostep WIP
davidkpiano Mar 7, 2020
8a4ad12
Microstep refactor WIP
davidkpiano Mar 7, 2020
2ff485b
WIP
davidkpiano Mar 7, 2020
443616c
Merge branch 'next' into v5/microstep
davidkpiano Mar 7, 2020
1075373
Macrostep working!
davidkpiano Mar 8, 2020
83e1391
Refactoring
davidkpiano Mar 8, 2020
fa11bd4
Deletions
davidkpiano Mar 8, 2020
fecfd39
Remove unused import
davidkpiano Mar 8, 2020
1aaafea
Merge branch 'next' into v5/microstep
davidkpiano Mar 8, 2020
2f2bb4d
Make (most) tests pass
davidkpiano Mar 9, 2020
7aa9d04
Merge branch 'next' into v5/microstep
Mar 10, 2020
8fc64fc
Add initial state transition type, ignore failing test
Mar 10, 2020
283d30c
Merge branch 'next' into v5/microstep
davidkpiano Mar 14, 2020
88159f1
Fix typing issues
davidkpiano Mar 15, 2020
ce292eb
Typing fixes
davidkpiano Mar 15, 2020
907eb96
Update snapshots
davidkpiano Mar 15, 2020
10a6820
Re-enable JSON tests
davidkpiano Mar 15, 2020
63805e1
Clean up internalQueue resolution
davidkpiano Mar 15, 2020
50340f2
Remove state.events
davidkpiano Mar 15, 2020
34cdbd4
Update tests
davidkpiano Mar 15, 2020
25028b9
Refactor selectEventlessTransitions algorithm
davidkpiano Mar 22, 2020
2c0fa49
Push rather than shift internalQueue
davidkpiano Mar 22, 2020
06621db
Do not filter actions
davidkpiano Mar 22, 2020
2ce0aaf
Remove doneData from grandparent done event
davidkpiano Mar 22, 2020
5ded8ab
Use previous raised event instead of initial event for overwriting nu…
davidkpiano Mar 22, 2020
018a058
Add strictPropertyInitialization
davidkpiano Mar 22, 2020
bdb2d27
Remove todo
davidkpiano Mar 22, 2020
3b67aea
Remove unused type
davidkpiano Mar 22, 2020
ff37181
Remove isTransient
davidkpiano Mar 22, 2020
c17e50d
Remove unused constnat
davidkpiano Mar 22, 2020
b19bcff
Rephrase transient test
davidkpiano Apr 3, 2020
9f8010a
Change reason for test210.txml failing
davidkpiano Apr 3, 2020
7f3b848
Add changeset
davidkpiano Apr 3, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
State.initial now represents initial transition
davidkpiano committed Feb 29, 2020
commit 5dc98cd9ca7cdc941701b23b9d8ab15ab2e08819
25 changes: 5 additions & 20 deletions packages/core/src/StateNode.ts
Original file line number Diff line number Diff line change
@@ -227,21 +227,10 @@ export class StateNode<
: undefined;
}

/**
* The initial state node key.
*/
public get initial(): keyof TStateSchema['states'] | undefined {
const init = this._initial;

return init
? (init.target[0].key as keyof TStateSchema['states'])
: undefined;
}

/**
* The initial state node transition.
*/
public get _initial():
public get initial():
| InitialTransitionDefinition<TContext, TEvent>
| undefined {
return this.config.initial
@@ -436,16 +425,12 @@ export class StateNode<
stateNode => !(stateNode.type === 'history')
);
} else if (this.initial !== undefined) {
if (!this.states[this.initial]) {
throw new Error(
`Initial state '${this.initial}' not found on '${this.key}'`
);
}
const [initialTargetNode] = this.initial.target;

initialStateValue = (isLeafNode(this.states[this.initial])
? this.initial
initialStateValue = (isLeafNode(initialTargetNode)
? initialTargetNode.key
: {
[this.initial]: this.states[this.initial].initialStateValue
[initialTargetNode.key]: initialTargetNode.initialStateValue
}) as StateValue;
}

10 changes: 4 additions & 6 deletions packages/core/src/stateUtils.ts
Original file line number Diff line number Diff line change
@@ -742,12 +742,10 @@ export function getStateNodes<TContext, TEvent extends EventObject>(
: toStateValue(state, stateNode.machine.delimiter);

if (isString(stateValue)) {
const initialStateValue = getStateNode(stateNode, stateValue).initial;
const { initial } = getStateNode(stateNode, stateValue);

return initialStateValue !== undefined
? getStateNodes(stateNode, {
[stateValue]: initialStateValue
} as StateValue)
return initial !== undefined
? initial.target!
: [stateNode.states[stateValue]];
}

@@ -1330,7 +1328,7 @@ function addDescendentStatesToEnter<TContext, TEvent extends EventObject>(
mutStatesToEnter.add(stateNode);
if (stateNode.type === 'compound') {
mutStatesForDefaultEntry.add(stateNode);
const initialStateNode = stateNode.states[stateNode.initial as string];
const initialStateNode = stateNode.initial!.target[0];
addDescendentStatesToEnter(
initialStateNode,
state,
7 changes: 3 additions & 4 deletions packages/core/src/types.ts
Original file line number Diff line number Diff line change
@@ -371,10 +371,9 @@ export interface StateNodeConfig<
*/
key?: string;
/**
* The initial state node key.
* The initial state transition.
*/
initial?: keyof TStateSchema['states'] | undefined;
_initial?: InitialTransitionConfig<TContext, TEvent> | string | undefined;
initial?: InitialTransitionConfig<TContext, TEvent> | string | undefined;
/**
* The type of this state node:
*
@@ -470,7 +469,7 @@ export interface StateNodeDefinition<
version?: string | undefined;
key: string;
type: 'atomic' | 'compound' | 'parallel' | 'final' | 'history';
initial: StateNodeConfig<TContext, TStateSchema, TEvent>['initial'];
initial: InitialTransitionDefinition<TContext, TEvent> | undefined;
history: boolean | 'shallow' | 'deep' | undefined;
states: StatesDefinition<TContext, TStateSchema, TEvent>;
on: TransitionDefinitionMap<TContext, TEvent>;
8 changes: 3 additions & 5 deletions packages/core/test/interpreter.test.ts
Original file line number Diff line number Diff line change
@@ -615,11 +615,9 @@ describe('interpreter', () => {
deferEvents: false
});

expect(() => service.send('SOME_EVENT'))
.toThrowErrorMatchingInlineSnapshot(`
"Event \\"SOME_EVENT\\" was sent to uninitialized service \\"light\\". Make sure .start() is called for this service, or set { deferEvents: true } in the service options.
Event: {\\"type\\":\\"SOME_EVENT\\"}"
`);
expect(() => service.send('SOME_EVENT')).toThrowError(
/Event \"SOME_EVENT\" was sent to uninitialized service \"light\"/
);

service.start();

2 changes: 1 addition & 1 deletion packages/xstate-scxml/src/index.ts
Original file line number Diff line number Diff line change
@@ -149,7 +149,7 @@ function stateNodeToSCXML(stateNode: StateNode<any, any, any>): XMLElement {
: 'state',
attributes: {
id: stateNode.id,
initial: stateNode.initial as string
initial: stateNode.initial ? `${stateNode.initial.target[0]}` : undefined
},
elements
};