jssm 5.59.1 → 5.60.0

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.
@@ -48,6 +48,7 @@ declare class Machine<mDT> {
48
48
  _exit_hooks: Map<string, Function>;
49
49
  _global_action_hooks: Map<string, Function>;
50
50
  _any_action_hook: HookHandler | undefined;
51
+ _standard_transition_hook: HookHandler | undefined;
51
52
  _any_transition_hook: HookHandler | undefined;
52
53
  constructor({ start_states, complete, transitions, machine_author, machine_comment, machine_contributor, machine_definition, machine_language, machine_license, machine_name, machine_version, state_declaration, fsl_version, dot_preamble, arrange_declaration, arrange_start_declaration, arrange_end_declaration, theme, flow, graph_layout }: JssmGenericConfig<mDT>);
53
54
  _new_state(state_config: JssmGenericState): StateType;
@@ -106,6 +107,7 @@ declare class Machine<mDT> {
106
107
  hook_any_transition(handler: HookHandler): Machine<mDT>;
107
108
  hook_entry(to: string, handler: HookHandler): Machine<mDT>;
108
109
  hook_exit(from: string, handler: HookHandler): Machine<mDT>;
110
+ edges_between(from: string, to: string): JssmTransition<mDT>[];
109
111
  transition_impl(newStateOrAction: StateType, newData: mDT | undefined, wasForced: boolean, wasAction: boolean): boolean;
110
112
  action(actionName: StateType, newData?: mDT): boolean;
111
113
  transition(newState: StateType, newData?: mDT): boolean;
package/dist/es6/jssm.js CHANGED
@@ -357,7 +357,9 @@ class Machine {
357
357
  this._exit_hooks = new Map();
358
358
  this._global_action_hooks = new Map();
359
359
  this._any_action_hook = undefined;
360
+ this._standard_transition_hook = undefined;
360
361
  this._any_transition_hook = undefined;
362
+ this._standard_transition_hook = undefined;
361
363
  if (state_declaration) {
362
364
  state_declaration.map((state_decl) => {
363
365
  if (this._state_declarations.has(state_decl.state)) { // no repeats
@@ -728,6 +730,10 @@ class Machine {
728
730
  this._any_action_hook = HookDesc.handler;
729
731
  this._has_hooks = true;
730
732
  break;
733
+ case 'standard transition':
734
+ this._standard_transition_hook = HookDesc.handler;
735
+ this._has_hooks = true;
736
+ break;
731
737
  case 'any transition':
732
738
  this._any_transition_hook = HookDesc.handler;
733
739
  this._has_hooks = true;
@@ -783,11 +789,17 @@ class Machine {
783
789
  // remove_hook(HookDesc: HookDescription) {
784
790
  // throw 'TODO: Should remove hook here';
785
791
  // }
792
+ edges_between(from, to) {
793
+ return this._edges.filter(edge => ((edge.from === from) && (edge.to === to)));
794
+ }
786
795
  transition_impl(newStateOrAction, newData, wasForced, wasAction) {
787
- let valid = false, newState;
796
+ // TODO the forced-ness behavior needs to be cleaned up a lot here
797
+ // TODO all the callbacks are wrong on forced, action, etc
798
+ let valid = false, trans_type, newState;
788
799
  if (wasForced) {
789
800
  if (this.valid_force_transition(newStateOrAction, newData)) {
790
801
  valid = true;
802
+ trans_type = 'forced';
791
803
  newState = newStateOrAction;
792
804
  }
793
805
  }
@@ -795,12 +807,14 @@ class Machine {
795
807
  if (this.valid_action(newStateOrAction, newData)) {
796
808
  const edge = this.current_action_edge_for(newStateOrAction);
797
809
  valid = true;
810
+ trans_type = edge.kind;
798
811
  newState = edge.to;
799
812
  }
800
813
  }
801
814
  else {
802
815
  if (this.valid_transition(newStateOrAction, newData)) {
803
816
  valid = true;
817
+ trans_type = this.edges_between(this._state, newStateOrAction)[0].kind; // TODO this won't do the right thing if various edges have different types
804
818
  newState = newStateOrAction;
805
819
  }
806
820
  }
@@ -853,6 +867,19 @@ class Machine {
853
867
  }
854
868
  }
855
869
  // 7. edge type hook
870
+ // 7a. standard transition hook
871
+ if (trans_type === 'legal') {
872
+ if (this._standard_transition_hook !== undefined) {
873
+ // todo handle actions
874
+ // todo handle forced
875
+ if (this._standard_transition_hook({ from: this._state, to: newState }) === false) {
876
+ return false;
877
+ }
878
+ }
879
+ }
880
+ // 7b. main type hook
881
+ // not yet implemented
882
+ // 7c. forced transition hook
856
883
  // not yet implemented
857
884
  // 8. entry hook
858
885
  const maybe_en_hook = this._entry_hooks.get(newState);
@@ -162,6 +162,12 @@ declare type HookDescriptionWithAction = {
162
162
  action: string;
163
163
  handler: HookHandler;
164
164
  };
165
+ declare type StandardTransitionHook = {
166
+ kind: 'standard transition';
167
+ from: string;
168
+ to: string;
169
+ handler: HookHandler;
170
+ };
165
171
  declare type AnyTransitionHook = {
166
172
  kind: 'any transition';
167
173
  handler: HookHandler;
@@ -185,5 +191,5 @@ declare type ExitHook = {
185
191
  from: string;
186
192
  handler: HookHandler;
187
193
  };
188
- declare type HookDescription = BasicHookDescription | HookDescriptionWithAction | GlobalActionHook | AnyActionHook | AnyTransitionHook | EntryHook | ExitHook;
194
+ declare type HookDescription = BasicHookDescription | HookDescriptionWithAction | GlobalActionHook | AnyActionHook | StandardTransitionHook | AnyTransitionHook | EntryHook | ExitHook;
189
195
  export { JssmColor, JssmTransition, JssmTransitions, JssmTransitionList, JssmTransitionRule, JssmArrow, JssmArrowKind, JssmArrowDirection, JssmGenericConfig, JssmGenericState, JssmGenericMachine, JssmParseTree, JssmCompileSe, JssmCompileSeStart, JssmCompileRule, JssmPermitted, JssmPermittedOpt, JssmResult, JssmStateDeclaration, JssmStateDeclarationRule, JssmLayout, JssmParseFunctionType, JssmMachineInternalState, FslDirection, FslTheme, HookDescription, HookHandler };
@@ -1,2 +1,2 @@
1
- const version = "5.59.1";
1
+ const version = "5.60.0";
2
2
  export { version };