@alwatr/fsm 1.0.1 → 1.1.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.
package/CHANGELOG.md CHANGED
@@ -3,9 +3,56 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
- ## [1.0.1](https://github.com/AliMD/alwatr/compare/v1.0.0...v1.0.1) (2023-06-21)
6
+ # 1.1.0 (2023-09-12)
7
7
 
8
- **Note:** Version bump only for package @alwatr/fsm
8
+ # 1.0.0 (2023-06-14)
9
+
10
+ # 0.32.0 (2023-05-27)
11
+
12
+ # 0.31.0 (2023-05-08)
13
+
14
+ ### Bug Fixes
15
+
16
+ * **fms:** import path ([f6770a0](https://github.com/AliMD/alwatr/commit/f6770a07fdf6855ccd63a85822d44d5ef9c72dee))
17
+ * **fsm:** action maybe async ([50efffa](https://github.com/AliMD/alwatr/commit/50efffa34a2ea5a3515561d7425da0c109631f36))
18
+ * **fsm:** autoSignalUnsubscribe type ([f7db30b](https://github.com/AliMD/alwatr/commit/f7db30bf5a90ff3d163f036b313a412a5149ff2b))
19
+ * **fsm:** call render states function in there own this ([a950478](https://github.com/AliMD/alwatr/commit/a95047811366e375785b2cd8fb176b1176638cab))
20
+ * **fsm:** fix order of `initFsmInstance` args ([3b60138](https://github.com/AliMD/alwatr/commit/3b60138ecebcbcb4d732e4d1a3e79f5b8661ae47))
21
+ * **fsm:** initial exec actions ([e7dd5c8](https://github.com/AliMD/alwatr/commit/e7dd5c8aaf9760c9856e4392cc899020f7e796d9))
22
+ * **fsm:** last reported bugs in set state ([e7435c8](https://github.com/AliMD/alwatr/commit/e7435c870a054b0ec3e4004f13c6db7610610be0))
23
+ * **fsm:** review reset process ([af6e81c](https://github.com/AliMD/alwatr/commit/af6e81c068b467d8b3aa96f2431e13ac479f018c))
24
+ * **fsm:** run init entry actions ([777ae45](https://github.com/AliMD/alwatr/commit/777ae459f2b77f79696daf3a0ca355d6d78e57d3))
25
+ * new logger api ([9d83a7d](https://github.com/AliMD/alwatr/commit/9d83a7dc5c103bc3bb4282dacfd85fa998915300))
26
+
27
+ ### Features
28
+
29
+ * **fsm:** add `signalRecord` to config ([1a35291](https://github.com/AliMD/alwatr/commit/1a352915fba978da141513517655d1e07350c3ec))
30
+ * **fsm:** add unsubscribe ([85ed3c3](https://github.com/AliMD/alwatr/commit/85ed3c3439e1f40c2760f6011df112242f10be06))
31
+ * **fsm:** callback in provider signals ([772818b](https://github.com/AliMD/alwatr/commit/772818baa7953b6fbb4d4128fcee76733f42cc2d))
32
+ * **fsm:** custom signal callback ([47c22e9](https://github.com/AliMD/alwatr/commit/47c22e92a8a8085148b44b316d649b695ff8071a))
33
+ * **fsm:** destroy and expire api ([e1a1c15](https://github.com/AliMD/alwatr/commit/e1a1c150d81f4428718bd18f039235c7fce9caf2))
34
+ * **fsm:** new types ([2866e3b](https://github.com/AliMD/alwatr/commit/2866e3bd5ff56fd2b5bddcaed3673a5868bae4bb))
35
+ * **fsm:** rewrite state machine ([7f24695](https://github.com/AliMD/alwatr/commit/7f246959e5a80b21c1c4b21e895e75f8fbe56798))
36
+ * **fsm:** subscribe ([2af4f44](https://github.com/AliMD/alwatr/commit/2af4f44f0e8a2dee39cde10dcaa3281075632e6a))
37
+
38
+ # 0.30.0 (2023-03-06)
39
+
40
+ ### Bug Fixes
41
+
42
+ * **fsm:** every signal mather ([0dc504d](https://github.com/AliMD/alwatr/commit/0dc504dacbb1ec68f154244619d644ff8e43cc04))
43
+ * **fsm:** remove additional import ([231337b](https://github.com/AliMD/alwatr/commit/231337b95ee7b046fe35429f50931ddf85be291f))
44
+ * **fsm:** update context in transition bug ([28a21d0](https://github.com/AliMD/alwatr/commit/28a21d00d903b6189d814303c72ba6e784852f33))
45
+
46
+ ### Features
47
+
48
+ * Alwatr Finite State Machines ([d5900b4](https://github.com/AliMD/alwatr/commit/d5900b4ee8685b120188888871405853f5a69417))
49
+ * **fsm:** $all and $self state ([69adf41](https://github.com/AliMD/alwatr/commit/69adf41064ca0f55497484c50e298ebc26c42dcc))
50
+ * **fsm:** enhance types ([3b13046](https://github.com/AliMD/alwatr/commit/3b130463a102f59c38603b0de470be5c87ee88c9))
51
+ * **fsm:** make simple state machine ([ff9ae1c](https://github.com/AliMD/alwatr/commit/ff9ae1ca04156e8b811899ff0f62480e1c37af72))
52
+ * **fsm:** new state context type with {to, from, by} ([11423e6](https://github.com/AliMD/alwatr/commit/11423e6a89159b92e82cfd1e774ad37983581090))
53
+ * **fsm:** rewrite with signal power ([01a1651](https://github.com/AliMD/alwatr/commit/01a1651e231a817d5eebb54cf84d51d620bfd6e8))
54
+ * **fsm:** share state events ([de42522](https://github.com/AliMD/alwatr/commit/de42522a97fdf6be8bee73d91a35820e2a5e6efb))
55
+ * **fsm:** transition with partial context set ([823377e](https://github.com/AliMD/alwatr/commit/823377e65028ea3e713f060ae678776c609c1661))
9
56
 
10
57
  # [1.0.0](https://github.com/AliMD/alwatr/compare/v0.32.0...v1.0.0) (2023-06-14)
11
58
 
package/core.d.ts CHANGED
@@ -51,7 +51,7 @@ export declare const initFsmInstance: (instanceId: string, constructorId: string
51
51
  /**
52
52
  * Subscribe to all defined signals for finite state machine instance.
53
53
  */
54
- export declare const subscribeSignals: (instanceId: string, signalList: Array<SignalConfig>, subscribeConstructorSignals?: boolean) => Array<ListenerSpec>;
54
+ export declare const subscribeSignals: (instanceId: string, signalList: SignalConfig[], subscribeConstructorSignals?: boolean) => ListenerSpec[];
55
55
  /**
56
56
  * Define signals for finite state machine constructor.
57
57
  */
@@ -69,7 +69,7 @@ export declare const defineInstanceSignals: <T extends Readonly<{
69
69
  TEventId: string;
70
70
  TActionName: string;
71
71
  TContext: StringifyableRecord;
72
- }>>(instanceId: string, signalList: SignalConfig<T>[], subscribeConstructorSignals?: boolean) => Array<ListenerSpec>;
72
+ }>>(instanceId: string, signalList: SignalConfig<T>[], subscribeConstructorSignals?: boolean) => ListenerSpec[];
73
73
  /**
74
74
  * Render helper for use finite state machine instance in UI.
75
75
  *
package/core.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"core.d.ts","sourceRoot":"","sources":["src/core.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,YAAY,EAAmC,MAAM,gBAAgB,CAAC;AAE9E,OAAO,EAAC,gBAAgB,EAAC,MAAM,wBAAwB,CAAC;AAExD,OAAO,KAAK,EACV,YAAY,EACZ,cAAc,EACd,oBAAoB,EACpB,oBAAoB,EACpB,WAAW,EACX,QAAQ,EAER,YAAY,EACb,MAAM,WAAW,CAAC;AACnB,OAAO,KAAK,EAAC,YAAY,EAAkB,aAAa,EAAE,mBAAmB,EAAC,MAAM,cAAc,CAAC;AAcnG,eAAO,MAAM,iBAAiB,0KAMtB,MAAM,yIAYb,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,cAAc,6IAKX,MAAM,4CAMrB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,iBAAiB,kBAAmB,MAAM,KAAG,cAKzD,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,QAAQ,iFACP,MAAM,+BAInB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,UAAU,2EACT,MAAM,aAInB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,UAAU,2EACT,MAAM,uCAET,OAAO,KACf,IAWF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,UAAU,6GAIP,MAAM,+DAGjB,IAgDJ,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,aAAa;;;;;mBAA4C,MAAM,oCAAkC,IAO7G,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,eAAe,gBACX,cAAc,SACpB,QAAQ,qBACI,oBAAoB,KACxC,IA0BF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,WAAW,gBACP,cAAc,eACd,cAAc,MAAM,CAAC,GAAG,SAAS,sBAC1B,oBAAoB,KACzC,OAAO,GAAG,aAAa,IAAI,CA4B7B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,eAAe,eAAgB,MAAM,iBAAiB,MAAM,KAAG,IAgB3E,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,gBAAgB,eACb,MAAM,cACN,MAAM,YAAY,CAAC,4CAEhC,MAAM,YAAY,CAmCpB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,wBAAwB;;;;;mBACpB,MAAM,oCAEpB,IAIF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,qBAAqB;;;;;gBACpB,MAAM,2EAGjB,MAAM,YAAY,CAGpB,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,MAAM,+CACL,MAAM,2CACa,OAAO,gBAC7B,OAAO,KACf,OAcF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,SAAS,eACN,MAAM,YACR,MAAM,IAAI,YACV,QAAQ,gBAAgB,CAAC,KACpC,YAGF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,OAAO,eAAgB,MAAM,KAAG,IAG5C,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,KAAK,eAAgB,MAAM,KAAG,IAK1C,CAAC;AAEF;;;GAGG;AAEH,eAAO,MAAM,0BAA0B;;;;;gEACzB,MAAM,wBACI,MAAM;IAc1B;;OAEG;;IAGH;;OAEG;;IAGH;;OAEG;2DAjF0B,OAAO;IAoFpC;;OAEG;yCA/Da,IAAI;IAkEpB;;OAEG;;IAGH;;OAEG;;IAGH;;OAEG;;IAGH;;OAEG;;IAGH;;OAEG;;IAGH;;OAEG;;IAGH;;OAEG;;IAGH;;OAEG;;CAGN,CAAC"}
1
+ {"version":3,"file":"core.d.ts","sourceRoot":"","sources":["src/core.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,YAAY,EAAmC,MAAM,gBAAgB,CAAC;AAE9E,OAAO,EAAC,gBAAgB,EAAC,MAAM,wBAAwB,CAAC;AAExD,OAAO,KAAK,EACV,YAAY,EACZ,cAAc,EACd,oBAAoB,EACpB,oBAAoB,EACpB,WAAW,EACX,QAAQ,EAER,YAAY,EACb,MAAM,WAAW,CAAC;AACnB,OAAO,KAAK,EAAC,YAAY,EAAkB,aAAa,EAAE,mBAAmB,EAAC,MAAM,cAAc,CAAC;AAcnG,eAAO,MAAM,iBAAiB,0KAMtB,MAAM,yIAYb,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,cAAc,6IAKX,MAAM,4CAMrB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,iBAAiB,kBAAmB,MAAM,KAAG,cAKzD,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,QAAQ,iFACP,MAAM,+BAInB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,UAAU,2EACT,MAAM,aAInB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,UAAU,2EACT,MAAM,uCAET,OAAO,KACf,IAWF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,UAAU,6GAIP,MAAM,+DAGjB,IAgDJ,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,aAAa;;;;;mBAA4C,MAAM,oCAAkC,IAO7G,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,eAAe,gBACX,cAAc,SACpB,QAAQ,qBACI,oBAAoB,KACxC,IA0BF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,WAAW,gBACP,cAAc,eACd,cAAc,MAAM,CAAC,GAAG,SAAS,sBAC1B,oBAAoB,KACzC,OAAO,GAAG,aAAa,IAAI,CA4B7B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,eAAe,eAAgB,MAAM,iBAAiB,MAAM,KAAG,IAgB3E,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,gBAAgB,eACb,MAAM,cACN,YAAY,EAAE,4CAE3B,YAAY,EAmCd,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,wBAAwB;;;;;mBACpB,MAAM,oCAEpB,IAIF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,qBAAqB;;;;;gBACpB,MAAM,2EAGjB,YAAY,EAGd,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,MAAM,+CACL,MAAM,2CACa,OAAO,gBAC7B,OAAO,KACf,OAcF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,SAAS,eACN,MAAM,YACR,MAAM,IAAI,YACV,QAAQ,gBAAgB,CAAC,KACpC,YAGF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,OAAO,eAAgB,MAAM,KAAG,IAG5C,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,KAAK,eAAgB,MAAM,KAAG,IAK1C,CAAC;AAEF;;;GAGG;AAEH,eAAO,MAAM,0BAA0B;;;;;gEACzB,MAAM,wBACI,MAAM;IAc1B;;OAEG;;IAGH;;OAEG;;IAGH;;OAEG;2DAjF0B,OAAO;IAoFpC;;OAEG;yCA/Da,IAAI;IAkEpB;;OAEG;;IAGH;;OAEG;;IAGH;;OAEG;;IAGH;;OAEG;;IAGH;;OAEG;;IAGH;;OAEG;;IAGH;;OAEG;;IAGH;;OAEG;;CAGN,CAAC"}
package/core.js CHANGED
@@ -11,8 +11,7 @@ const logger = createLogger(`alwatr/fsm`);
11
11
  */
12
12
  const fsmConstructorStorage = {};
13
13
  export const defineConstructor = (id, config) => {
14
- var _a;
15
- (_a = logger.logMethodArgs) === null || _a === void 0 ? void 0 : _a.call(logger, 'defineConstructor', { id, config });
14
+ logger.logMethodArgs?.('defineConstructor', { id, config });
16
15
  if (fsmConstructorStorage[id] != null)
17
16
  throw new Error('fsm_exist', { cause: { id } });
18
17
  fsmConstructorStorage[id] = {
@@ -27,8 +26,7 @@ export const defineConstructor = (id, config) => {
27
26
  * Get finite state machine instance by id.
28
27
  */
29
28
  export const getFsmInstance = (instanceId) => {
30
- var _a;
31
- (_a = logger.logMethodArgs) === null || _a === void 0 ? void 0 : _a.call(logger, '_getFsmInstance', instanceId);
29
+ logger.logMethodArgs?.('_getFsmInstance', instanceId);
32
30
  const fsmInstance = contextConsumer.getValue(instanceId);
33
31
  if (fsmInstance == null)
34
32
  throw new Error('fsm_undefined', { cause: { instanceId } });
@@ -38,8 +36,7 @@ export const getFsmInstance = (instanceId) => {
38
36
  * Get finite state machine constructor by id.
39
37
  */
40
38
  export const getFsmConstructor = (constructorId) => {
41
- var _a;
42
- (_a = logger.logMethodArgs) === null || _a === void 0 ? void 0 : _a.call(logger, '_getFsmConstructor', constructorId);
39
+ logger.logMethodArgs?.('_getFsmConstructor', constructorId);
43
40
  const fsmConstructor = fsmConstructorStorage[constructorId];
44
41
  if (fsmConstructor == null)
45
42
  throw new Error('fsm_undefined', { cause: { constructorId: constructorId } });
@@ -49,24 +46,21 @@ export const getFsmConstructor = (constructorId) => {
49
46
  * Get current state of finite state machine instance.
50
47
  */
51
48
  export const getState = (instanceId) => {
52
- var _a;
53
- (_a = logger.logMethodArgs) === null || _a === void 0 ? void 0 : _a.call(logger, 'getState', instanceId);
49
+ logger.logMethodArgs?.('getState', instanceId);
54
50
  return getFsmInstance(instanceId).state;
55
51
  };
56
52
  /**
57
53
  * Get current context of finite state machine instance.
58
54
  */
59
55
  export const getContext = (instanceId) => {
60
- var _a;
61
- (_a = logger.logMethodArgs) === null || _a === void 0 ? void 0 : _a.call(logger, 'getContext', instanceId);
56
+ logger.logMethodArgs?.('getContext', instanceId);
62
57
  return getFsmInstance(instanceId).context;
63
58
  };
64
59
  /**
65
60
  * Set context of finite state machine instance.
66
61
  */
67
62
  export const setContext = (instanceId, context, notify) => {
68
- var _a;
69
- (_a = logger.logMethodArgs) === null || _a === void 0 ? void 0 : _a.call(logger, 'setContext', { instanceId, context });
63
+ logger.logMethodArgs?.('setContext', { instanceId, context });
70
64
  const fsmInstance = getFsmInstance(instanceId);
71
65
  fsmInstance.context = {
72
66
  ...fsmInstance.context,
@@ -80,13 +74,12 @@ export const setContext = (instanceId, context, notify) => {
80
74
  * Transition finite state machine instance to new state.
81
75
  */
82
76
  export const transition = (instanceId, event, context) => {
83
- var _a, _b, _c, _d, _e, _f, _g;
84
77
  const fsmInstance = getFsmInstance(instanceId);
85
78
  const fsmConstructor = getFsmConstructor(fsmInstance.constructorId);
86
79
  const fromState = fsmInstance.state.target;
87
80
  const stateRecord = fsmConstructor.config.stateRecord;
88
- const transitionConfig = (_b = (_a = stateRecord[fromState]) === null || _a === void 0 ? void 0 : _a.on[event]) !== null && _b !== void 0 ? _b : stateRecord.$all.on[event];
89
- (_c = logger.logMethodArgs) === null || _c === void 0 ? void 0 : _c.call(logger, 'transition', { instanceId, fromState, event, context, target: transitionConfig === null || transitionConfig === void 0 ? void 0 : transitionConfig.target });
81
+ const transitionConfig = stateRecord[fromState]?.on[event] ?? stateRecord.$all.on[event];
82
+ logger.logMethodArgs?.('transition', { instanceId, fromState, event, context, target: transitionConfig?.target });
90
83
  if (context !== undefined) {
91
84
  fsmInstance.context = {
92
85
  ...fsmInstance.context,
@@ -94,12 +87,12 @@ export const transition = (instanceId, event, context) => {
94
87
  };
95
88
  }
96
89
  if (transitionConfig == null) {
97
- (_d = logger.incident) === null || _d === void 0 ? void 0 : _d.call(logger, 'transition', 'invalid_target_state', 'Defined target state for this event not found in state config', {
90
+ logger.incident?.('transition', 'invalid_target_state', 'Defined target state for this event not found in state config', {
98
91
  fromState,
99
92
  event,
100
93
  events: {
101
- ...(_e = stateRecord.$all) === null || _e === void 0 ? void 0 : _e.on,
102
- ...(_f = stateRecord[fromState]) === null || _f === void 0 ? void 0 : _f.on,
94
+ ...stateRecord.$all?.on,
95
+ ...stateRecord[fromState]?.on,
103
96
  },
104
97
  });
105
98
  return;
@@ -110,7 +103,7 @@ export const transition = (instanceId, event, context) => {
110
103
  return;
111
104
  }
112
105
  fsmInstance.state = {
113
- target: (_g = transitionConfig.target) !== null && _g !== void 0 ? _g : fromState,
106
+ target: transitionConfig.target ?? fromState,
114
107
  from: fromState,
115
108
  by: event,
116
109
  };
@@ -121,8 +114,7 @@ export const transition = (instanceId, event, context) => {
121
114
  * Define actions for finite state machine constructor.
122
115
  */
123
116
  export const defineActions = (constructorId, actionRecord) => {
124
- var _a;
125
- (_a = logger.logMethodArgs) === null || _a === void 0 ? void 0 : _a.call(logger, 'defineActions', { constructorId, actionRecord });
117
+ logger.logMethodArgs?.('defineActions', { constructorId, actionRecord });
126
118
  const fmsConstructor = getFsmConstructor(constructorId);
127
119
  fmsConstructor.actionRecord = {
128
120
  ...fmsConstructor.actionRecord,
@@ -133,33 +125,31 @@ export const defineActions = (constructorId, actionRecord) => {
133
125
  * Execute all actions for current state.
134
126
  */
135
127
  export const _execAllActions = (constructor, state, consumerInterface) => {
136
- var _a, _b, _c, _d, _e, _f, _g;
137
- (_a = logger.logMethodArgs) === null || _a === void 0 ? void 0 : _a.call(logger, '_execAllActions', consumerInterface.id);
128
+ logger.logMethodArgs?.('_execAllActions', consumerInterface.id);
138
129
  const stateRecord = constructor.config.stateRecord;
139
130
  if (state.by === 'INIT') {
140
131
  _execAction(constructor, stateRecord.$all.entry, consumerInterface);
141
- _execAction(constructor, (_b = stateRecord[state.target]) === null || _b === void 0 ? void 0 : _b.entry, consumerInterface);
132
+ _execAction(constructor, stateRecord[state.target]?.entry, consumerInterface);
142
133
  return;
143
134
  }
144
135
  // else
145
136
  if (state.from !== state.target) {
146
137
  _execAction(constructor, stateRecord.$all.exit, consumerInterface);
147
- _execAction(constructor, (_c = stateRecord[state.from]) === null || _c === void 0 ? void 0 : _c.exit, consumerInterface);
138
+ _execAction(constructor, stateRecord[state.from]?.exit, consumerInterface);
148
139
  _execAction(constructor, stateRecord.$all.entry, consumerInterface);
149
- _execAction(constructor, (_d = stateRecord[state.target]) === null || _d === void 0 ? void 0 : _d.entry, consumerInterface);
140
+ _execAction(constructor, stateRecord[state.target]?.entry, consumerInterface);
150
141
  }
151
- _execAction(constructor, ((_e = stateRecord[state.from]) === null || _e === void 0 ? void 0 : _e.on[state.by]) != null
152
- ? (_f = stateRecord[state.from].on[state.by]) === null || _f === void 0 ? void 0 : _f.actions
153
- : (_g = stateRecord.$all.on[state.by]) === null || _g === void 0 ? void 0 : _g.actions, consumerInterface);
142
+ _execAction(constructor, stateRecord[state.from]?.on[state.by] != null
143
+ ? stateRecord[state.from].on[state.by]?.actions
144
+ : stateRecord.$all.on[state.by]?.actions, consumerInterface);
154
145
  };
155
146
  /**
156
147
  * Execute single action.
157
148
  */
158
149
  export const _execAction = (constructor, actionNames, finiteStateMachine) => {
159
- var _a;
160
150
  if (actionNames == null)
161
151
  return;
162
- (_a = logger.logMethodArgs) === null || _a === void 0 ? void 0 : _a.call(logger, 'execAction', { constructorId: constructor.id, actionNames });
152
+ logger.logMethodArgs?.('execAction', { constructorId: constructor.id, actionNames });
163
153
  if (Array.isArray(actionNames)) {
164
154
  return actionNames
165
155
  .map((actionName) => _execAction(constructor, actionName, finiteStateMachine))
@@ -188,8 +178,7 @@ export const _execAction = (constructor, actionNames, finiteStateMachine) => {
188
178
  * Initialize new finite state machine instance.
189
179
  */
190
180
  export const initFsmInstance = (instanceId, constructorId) => {
191
- var _a;
192
- (_a = logger.logMethodArgs) === null || _a === void 0 ? void 0 : _a.call(logger, 'initializeMachine', { constructorId, instanceId });
181
+ logger.logMethodArgs?.('initializeMachine', { constructorId, instanceId });
193
182
  const constructor = getFsmConstructor(constructorId);
194
183
  const { initial, context } = constructor.config;
195
184
  const newInstance = {
@@ -208,17 +197,15 @@ export const initFsmInstance = (instanceId, constructorId) => {
208
197
  * Subscribe to all defined signals for finite state machine instance.
209
198
  */
210
199
  export const subscribeSignals = (instanceId, signalList, subscribeConstructorSignals = true) => {
211
- var _a, _b, _c;
212
- (_a = logger.logMethodArgs) === null || _a === void 0 ? void 0 : _a.call(logger, 'subscribeSignals', { instanceId, signalList });
200
+ logger.logMethodArgs?.('subscribeSignals', { instanceId, signalList });
213
201
  const listenerList = [];
214
202
  if (subscribeConstructorSignals) {
215
203
  signalList = signalList.concat(getFsmConstructor(getFsmInstance(instanceId).constructorId).signalList);
216
204
  }
217
205
  for (const signalConfig of signalList) {
218
- (_b = signalConfig.signalId) !== null && _b !== void 0 ? _b : (signalConfig.signalId = instanceId);
206
+ signalConfig.signalId ?? (signalConfig.signalId = instanceId);
219
207
  listenerList.push(contextConsumer.subscribe(signalConfig.signalId, (signalDetail) => {
220
- var _a;
221
- (_a = logger.logMethodArgs) === null || _a === void 0 ? void 0 : _a.call(logger, 'execSignalCallback', { instanceId, signalId: signalConfig.signalId, signalDetail });
208
+ logger.logMethodArgs?.('execSignalCallback', { instanceId, signalId: signalConfig.signalId, signalDetail });
222
209
  if (signalConfig.callback) {
223
210
  signalConfig.callback(signalDetail, finiteStateMachineConsumer(instanceId));
224
211
  }
@@ -228,7 +215,7 @@ export const subscribeSignals = (instanceId, signalList, subscribeConstructorSig
228
215
  [signalConfig.contextName]: signalDetail,
229
216
  });
230
217
  }
231
- }, { receivePrevious: (_c = signalConfig.receivePrevious) !== null && _c !== void 0 ? _c : 'No' }));
218
+ }, { receivePrevious: signalConfig.receivePrevious ?? 'No' }));
232
219
  }
233
220
  return listenerList;
234
221
  };
@@ -236,8 +223,7 @@ export const subscribeSignals = (instanceId, signalList, subscribeConstructorSig
236
223
  * Define signals for finite state machine constructor.
237
224
  */
238
225
  export const defineConstructorSignals = (constructorId, signalList) => {
239
- var _a;
240
- (_a = logger.logMethodArgs) === null || _a === void 0 ? void 0 : _a.call(logger, 'defineSignals', { constructorId, signalList: signalList });
226
+ logger.logMethodArgs?.('defineSignals', { constructorId, signalList: signalList });
241
227
  const fsmConstructor = getFsmConstructor(constructorId);
242
228
  fsmConstructor.signalList = fsmConstructor.signalList.concat(signalList);
243
229
  };
@@ -245,8 +231,7 @@ export const defineConstructorSignals = (constructorId, signalList) => {
245
231
  * Define signals for finite state machine instance.
246
232
  */
247
233
  export const defineInstanceSignals = (instanceId, signalList, subscribeConstructorSignals = true) => {
248
- var _a;
249
- (_a = logger.logMethodArgs) === null || _a === void 0 ? void 0 : _a.call(logger, 'defineSignals', { instanceId, signals: signalList });
234
+ logger.logMethodArgs?.('defineSignals', { instanceId, signals: signalList });
250
235
  return subscribeSignals(instanceId, signalList, subscribeConstructorSignals);
251
236
  };
252
237
  /**
@@ -263,9 +248,8 @@ export const defineInstanceSignals = (instanceId, signalList, subscribeConstruct
263
248
  * ```
264
249
  */
265
250
  export const render = (instanceId, states, thisArg = null) => {
266
- var _a;
267
251
  const state = getFsmInstance(instanceId).state;
268
- (_a = logger.logMethodArgs) === null || _a === void 0 ? void 0 : _a.call(logger, 'render', { instanceId, state: state.target });
252
+ logger.logMethodArgs?.('render', { instanceId, state: state.target });
269
253
  let renderFn = states[state.target];
270
254
  if (typeof renderFn === 'string') {
271
255
  renderFn = states[renderFn];
@@ -279,24 +263,21 @@ export const render = (instanceId, states, thisArg = null) => {
279
263
  * Subscribe to finite state machine instance state changes.
280
264
  */
281
265
  export const subscribe = (instanceId, callback, options) => {
282
- var _a;
283
- (_a = logger.logMethodArgs) === null || _a === void 0 ? void 0 : _a.call(logger, 'subscribe', instanceId);
266
+ logger.logMethodArgs?.('subscribe', instanceId);
284
267
  return contextConsumer.subscribe(instanceId, callback, options);
285
268
  };
286
269
  /**
287
270
  * Destroy finite state machine instance object to clear memory.
288
271
  */
289
272
  export const destroy = (instanceId) => {
290
- var _a;
291
- (_a = logger.logMethodArgs) === null || _a === void 0 ? void 0 : _a.call(logger, 'destroy', instanceId);
273
+ logger.logMethodArgs?.('destroy', instanceId);
292
274
  destroySignal(instanceId);
293
275
  };
294
276
  /**
295
277
  * Reset finite state machine instance to initial state and context.
296
278
  */
297
279
  export const reset = (instanceId) => {
298
- var _a;
299
- (_a = logger.logMethodArgs) === null || _a === void 0 ? void 0 : _a.call(logger, 'reset', instanceId);
280
+ logger.logMethodArgs?.('reset', instanceId);
300
281
  const constructorId = getFsmInstance(instanceId).constructorId;
301
282
  // contextProvider.expire(instanceId);
302
283
  initFsmInstance(instanceId, constructorId);
@@ -307,8 +288,7 @@ export const reset = (instanceId) => {
307
288
  */
308
289
  // eslint-disable-next-line @typescript-eslint/explicit-function-return-type
309
290
  export const finiteStateMachineConsumer = (instanceId, makeFromConstructor) => {
310
- var _a, _b;
311
- (_a = logger.logMethodArgs) === null || _a === void 0 ? void 0 : _a.call(logger, 'stateMachineLookup', instanceId);
291
+ logger.logMethodArgs?.('stateMachineLookup', instanceId);
312
292
  const machineInstance = contextConsumer.getValue(instanceId);
313
293
  if (machineInstance == null) {
314
294
  // instance not initialized.
@@ -325,7 +305,7 @@ export const finiteStateMachineConsumer = (instanceId, makeFromConstructor) => {
325
305
  /**
326
306
  * Finite state machine constructor id.
327
307
  */
328
- constructorId: (_b = machineInstance === null || machineInstance === void 0 ? void 0 : machineInstance.constructorId) !== null && _b !== void 0 ? _b : makeFromConstructor,
308
+ constructorId: machineInstance?.constructorId ?? makeFromConstructor,
329
309
  /**
330
310
  * Render helper for use finite state machine instance in UI.
331
311
  */
package/core.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"core.js","sourceRoot":"","sources":["src/core.ts"],"names":[],"mappings":"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","sourcesContent":["import {createLogger, globalAlwatr} from '@alwatr/logger';\nimport {ListenerSpec, contextProvider, contextConsumer} from '@alwatr/signal';\nimport {destroySignal, unsubscribe} from '@alwatr/signal/core.js';\nimport {SubscribeOptions} from '@alwatr/signal/type.js';\n\nimport type {\n ActionRecord,\n FsmConstructor,\n FsmConstructorConfig,\n FsmConsumerInterface,\n FsmInstance,\n FsmState,\n FsmTypeHelper,\n SignalConfig,\n} from './type.js';\nimport type {MaybePromise, OmitFirstParam, SingleOrArray, StringifyableRecord} from '@alwatr/type';\n\nglobalAlwatr.registeredList.push({\n name: '@alwatr/fsm',\n version: _ALWATR_VERSION_,\n});\n\nconst logger = createLogger(`alwatr/fsm`);\n\n/**\n * Finite state machine constructor storage.\n */\nconst fsmConstructorStorage: Record<string, FsmConstructor | undefined> = {};\n\nexport const defineConstructor = <\n TState extends string = string,\n TEventId extends string = string,\n TActionName extends string = string,\n TContext extends StringifyableRecord = StringifyableRecord\n>(\n id: string,\n config: FsmConstructorConfig<TState, TEventId, TActionName, TContext>,\n ): FsmConstructorConfig<TState, TEventId, TActionName, TContext> => {\n logger.logMethodArgs?.('defineConstructor', {id, config});\n if (fsmConstructorStorage[id] != null) throw new Error('fsm_exist', {cause: {id}});\n fsmConstructorStorage[id] = {\n id,\n config,\n actionRecord: {},\n signalList: [],\n };\n return config;\n};\n\n/**\n * Get finite state machine instance by id.\n */\nexport const getFsmInstance = <\n TState extends string = string,\n TEventId extends string = string,\n TContext extends StringifyableRecord = StringifyableRecord\n>(\n instanceId: string,\n ): FsmInstance<TState, TEventId, TContext> => {\n logger.logMethodArgs?.('_getFsmInstance', instanceId);\n const fsmInstance = contextConsumer.getValue<FsmInstance<TState, TEventId, TContext>>(instanceId);\n if (fsmInstance == null) throw new Error('fsm_undefined', {cause: {instanceId}});\n return fsmInstance;\n};\n\n/**\n * Get finite state machine constructor by id.\n */\nexport const getFsmConstructor = (constructorId: string): FsmConstructor => {\n logger.logMethodArgs?.('_getFsmConstructor', constructorId);\n const fsmConstructor = fsmConstructorStorage[constructorId];\n if (fsmConstructor == null) throw new Error('fsm_undefined', {cause: {constructorId: constructorId}});\n return fsmConstructor;\n};\n\n/**\n * Get current state of finite state machine instance.\n */\nexport const getState = <TState extends string = string, TEventId extends string = string>(\n instanceId: string,\n): FsmState<TState, TEventId> => {\n logger.logMethodArgs?.('getState', instanceId);\n return getFsmInstance<TState, TEventId>(instanceId).state;\n};\n\n/**\n * Get current context of finite state machine instance.\n */\nexport const getContext = <TContext extends StringifyableRecord = StringifyableRecord>(\n instanceId: string,\n): TContext => {\n logger.logMethodArgs?.('getContext', instanceId);\n return getFsmInstance<string, string, TContext>(instanceId).context;\n};\n\n/**\n * Set context of finite state machine instance.\n */\nexport const setContext = <TContext extends StringifyableRecord = StringifyableRecord>(\n instanceId: string,\n context: Partial<TContext>,\n notify?: boolean,\n): void => {\n logger.logMethodArgs?.('setContext', {instanceId, context});\n const fsmInstance = getFsmInstance(instanceId);\n fsmInstance.context = {\n ...fsmInstance.context,\n ...context,\n };\n\n if (notify) {\n contextProvider.setValue(instanceId, fsmInstance, {debounce: 'Timeout'});\n }\n};\n\n/**\n * Transition finite state machine instance to new state.\n */\nexport const transition = <\n TEventId extends string = string,\n TContext extends StringifyableRecord = StringifyableRecord\n>(\n instanceId: string,\n event: TEventId,\n context?: Partial<TContext>,\n ): void => {\n const fsmInstance = getFsmInstance(instanceId);\n const fsmConstructor = getFsmConstructor(fsmInstance.constructorId);\n const fromState = fsmInstance.state.target;\n const stateRecord = fsmConstructor.config.stateRecord;\n const transitionConfig = stateRecord[fromState]?.on[event] ?? stateRecord.$all.on[event];\n\n logger.logMethodArgs?.('transition', {instanceId, fromState, event, context, target: transitionConfig?.target});\n\n if (context !== undefined) {\n fsmInstance.context = {\n ...fsmInstance.context,\n ...context,\n };\n }\n\n if (transitionConfig == null) {\n logger.incident?.(\n 'transition',\n 'invalid_target_state',\n 'Defined target state for this event not found in state config',\n {\n fromState,\n event,\n events: {\n ...stateRecord.$all?.on,\n ...stateRecord[fromState]?.on,\n },\n },\n );\n return;\n }\n\n const consumerInterface = finiteStateMachineConsumer(instanceId);\n\n if (transitionConfig.condition) {\n if (_execAction(fsmConstructor, transitionConfig.condition, consumerInterface) === false) return;\n }\n\n fsmInstance.state = {\n target: transitionConfig.target ?? fromState,\n from: fromState,\n by: event,\n };\n\n contextProvider.setValue(instanceId, fsmInstance, {debounce: 'Timeout'});\n\n _execAllActions(fsmConstructor, fsmInstance.state, consumerInterface);\n};\n\n/**\n * Define actions for finite state machine constructor.\n */\nexport const defineActions = <T extends FsmTypeHelper>(constructorId: string, actionRecord: ActionRecord<T>): void => {\n logger.logMethodArgs?.('defineActions', {constructorId, actionRecord});\n const fmsConstructor = getFsmConstructor(constructorId);\n fmsConstructor.actionRecord = {\n ...fmsConstructor.actionRecord,\n ...actionRecord,\n };\n};\n\n/**\n * Execute all actions for current state.\n */\nexport const _execAllActions = (\n constructor: FsmConstructor,\n state: FsmState,\n consumerInterface: FsmConsumerInterface,\n): void => {\n logger.logMethodArgs?.('_execAllActions', consumerInterface.id);\n\n const stateRecord = constructor.config.stateRecord;\n\n if (state.by === 'INIT') {\n _execAction(constructor, stateRecord.$all.entry, consumerInterface);\n _execAction(constructor, stateRecord[state.target]?.entry, consumerInterface);\n return;\n }\n\n // else\n if (state.from !== state.target) {\n _execAction(constructor, stateRecord.$all.exit, consumerInterface);\n _execAction(constructor, stateRecord[state.from]?.exit, consumerInterface);\n _execAction(constructor, stateRecord.$all.entry, consumerInterface);\n _execAction(constructor, stateRecord[state.target]?.entry, consumerInterface);\n }\n\n _execAction(\n constructor,\n stateRecord[state.from]?.on[state.by] != null\n ? stateRecord[state.from].on[state.by]?.actions\n : stateRecord.$all.on[state.by]?.actions,\n consumerInterface,\n );\n};\n\n/**\n * Execute single action.\n */\nexport const _execAction = (\n constructor: FsmConstructor,\n actionNames: SingleOrArray<string> | undefined,\n finiteStateMachine: FsmConsumerInterface,\n): boolean | MaybePromise<void> => {\n if (actionNames == null) return;\n logger.logMethodArgs?.('execAction', {constructorId: constructor.id, actionNames});\n\n if (Array.isArray(actionNames)) {\n return actionNames\n .map((actionName) => _execAction(constructor, actionName, finiteStateMachine))\n .every((r) => r === true);\n }\n\n try {\n const actionFn = constructor.actionRecord[actionNames];\n if (actionFn == null) {\n return logger.error('execAction', 'action_not_found', {\n actionNames,\n constructorId: constructor.id,\n instanceId: finiteStateMachine.id,\n });\n }\n return actionFn(finiteStateMachine);\n }\n catch (error) {\n return logger.error('execAction', 'action_error', error, {\n actionNames,\n constructorId: constructor.id,\n instanceId: finiteStateMachine.id,\n });\n }\n};\n\n/**\n * Initialize new finite state machine instance.\n */\nexport const initFsmInstance = (instanceId: string, constructorId: string): void => {\n logger.logMethodArgs?.('initializeMachine', {constructorId, instanceId});\n const constructor = getFsmConstructor(constructorId);\n const {initial, context} = constructor.config;\n const newInstance: FsmInstance = {\n constructorId,\n state: {\n target: initial,\n from: initial,\n by: 'INIT',\n },\n context,\n };\n contextProvider.setValue<FsmInstance>(instanceId, newInstance, {debounce: 'NextCycle'});\n\n _execAllActions(constructor, newInstance.state, finiteStateMachineConsumer(instanceId));\n};\n\n/**\n * Subscribe to all defined signals for finite state machine instance.\n */\nexport const subscribeSignals = (\n instanceId: string,\n signalList: Array<SignalConfig>,\n subscribeConstructorSignals = true,\n): Array<ListenerSpec> => {\n logger.logMethodArgs?.('subscribeSignals', {instanceId, signalList});\n const listenerList: Array<ListenerSpec> = [];\n\n if (subscribeConstructorSignals) {\n signalList = signalList.concat(getFsmConstructor(getFsmInstance(instanceId).constructorId).signalList);\n }\n\n for (const signalConfig of signalList) {\n signalConfig.signalId ??= instanceId;\n listenerList.push(\n contextConsumer.subscribe(\n signalConfig.signalId,\n (signalDetail: StringifyableRecord): void => {\n logger.logMethodArgs?.('execSignalCallback', {instanceId, signalId: signalConfig.signalId, signalDetail});\n if (signalConfig.callback) {\n signalConfig.callback(signalDetail, finiteStateMachineConsumer(instanceId));\n }\n else {\n // prettier-ignore\n transition(\n instanceId,\n signalConfig.transition,\n signalConfig.contextName == null ? undefined : {\n [signalConfig.contextName]: signalDetail,\n },\n );\n }\n },\n {receivePrevious: signalConfig.receivePrevious ?? 'No'},\n ),\n );\n }\n\n return listenerList;\n};\n\n/**\n * Define signals for finite state machine constructor.\n */\nexport const defineConstructorSignals = <T extends FsmTypeHelper>(\n constructorId: string,\n signalList: Array<SignalConfig<T>>,\n): void => {\n logger.logMethodArgs?.('defineSignals', {constructorId, signalList: signalList});\n const fsmConstructor = getFsmConstructor(constructorId);\n fsmConstructor.signalList = fsmConstructor.signalList.concat(signalList as Array<SignalConfig>);\n};\n\n/**\n * Define signals for finite state machine instance.\n */\nexport const defineInstanceSignals = <T extends FsmTypeHelper>(\n instanceId: string,\n signalList: Array<SignalConfig<T>>,\n subscribeConstructorSignals = true,\n): Array<ListenerSpec> => {\n logger.logMethodArgs?.('defineSignals', {instanceId, signals: signalList});\n return subscribeSignals(instanceId, signalList as Array<SignalConfig>, subscribeConstructorSignals);\n};\n\n/**\n * Render helper for use finite state machine instance in UI.\n *\n * Example:\n *\n * ```ts\n * render('myFsm', {\n * state1: () => html`<div>State 1 Render...</div>`,\n * state2: () => html`<div>State 2 Render...</div>`,\n * state3: 'state1',\n * });\n * ```\n */\nexport const render = <TState extends string = string>(\n instanceId: string,\n states: {[P in TState]: (() => unknown) | TState},\n thisArg: unknown = null,\n): unknown => {\n const state = getFsmInstance(instanceId).state;\n logger.logMethodArgs?.('render', {instanceId, state: state.target});\n let renderFn = states[state.target as TState];\n\n if (typeof renderFn === 'string') {\n renderFn = states[renderFn as TState];\n }\n\n if (typeof renderFn === 'function') {\n return renderFn.call(thisArg);\n }\n\n return;\n};\n\n/**\n * Subscribe to finite state machine instance state changes.\n */\nexport const subscribe = (\n instanceId: string,\n callback: () => void,\n options?: Partial<SubscribeOptions>,\n): ListenerSpec => {\n logger.logMethodArgs?.('subscribe', instanceId);\n return contextConsumer.subscribe(instanceId, callback, options);\n};\n\n/**\n * Destroy finite state machine instance object to clear memory.\n */\nexport const destroy = (instanceId: string): void => {\n logger.logMethodArgs?.('destroy', instanceId);\n destroySignal(instanceId);\n};\n\n/**\n * Reset finite state machine instance to initial state and context.\n */\nexport const reset = (instanceId: string): void => {\n logger.logMethodArgs?.('reset', instanceId);\n const constructorId = getFsmInstance(instanceId).constructorId;\n // contextProvider.expire(instanceId);\n initFsmInstance(instanceId, constructorId);\n};\n\n/**\n * Finite state machine instance consumer.\n * Lookup current finite state machine instance or initialize new one and return consumer object .\n */\n// eslint-disable-next-line @typescript-eslint/explicit-function-return-type\nexport const finiteStateMachineConsumer = <T extends FsmTypeHelper, TContext extends T['TContext'] = T['TContext']>(\n instanceId: string,\n makeFromConstructor?: string,\n) => {\n logger.logMethodArgs?.('stateMachineLookup', instanceId);\n\n const machineInstance = contextConsumer.getValue<FsmInstance>(instanceId);\n if (machineInstance == null) {\n // instance not initialized.\n if (makeFromConstructor == null) {\n throw new Error('fsm_undefined', {cause: {instanceId}});\n }\n initFsmInstance(instanceId, makeFromConstructor);\n }\n\n return {\n /**\n * Finite state machine instance id.\n */\n id: instanceId,\n\n /**\n * Finite state machine constructor id.\n */\n constructorId: <string>machineInstance?.constructorId ?? makeFromConstructor,\n\n /**\n * Render helper for use finite state machine instance in UI.\n */\n render: render.bind(null, instanceId) as OmitFirstParam<typeof render<T['TState']>>,\n\n /**\n * Subscribe to finite state machine instance state changes.\n */\n subscribe: subscribe.bind(null, instanceId) as OmitFirstParam<typeof subscribe>,\n\n /**\n * Unsubscribe from finite state machine instance state changes.\n */\n unsubscribe: unsubscribe,\n\n /**\n * Get current state of finite state machine instance.\n */\n getState: getState.bind(null, instanceId) as OmitFirstParam<typeof getState<T['TState'], T['TEventId']>>,\n\n /**\n * Get current context of finite state machine instance.\n */\n getContext: getContext.bind(null, instanceId) as OmitFirstParam<typeof getContext<TContext>>,\n\n /**\n * Set context of finite state machine instance.\n */\n setContext: setContext.bind(null, instanceId) as OmitFirstParam<typeof setContext<TContext>>,\n\n /**\n * Transition finite state machine instance to new state.\n */\n transition: transition.bind(null, instanceId) as OmitFirstParam<typeof transition<T['TEventId'], TContext>>,\n\n /**\n * Define signals for finite state machine instance.\n */\n defineSignals: defineInstanceSignals.bind(null, instanceId) as OmitFirstParam<typeof defineInstanceSignals<T>>,\n\n /**\n * Reset finite state machine instance to initial state and context.\n */\n reset: reset.bind(null, instanceId) as OmitFirstParam<typeof reset>,\n\n /**\n * Destroy finite state machine instance object to clear memory.\n */\n destroy: destroy.bind(null, instanceId) as OmitFirstParam<typeof destroy>,\n } as const;\n};\n"]}
1
+ {"version":3,"file":"core.js","sourceRoot":"","sources":["src/core.ts"],"names":[],"mappings":"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","sourcesContent":["import {createLogger, globalAlwatr} from '@alwatr/logger';\nimport {ListenerSpec, contextProvider, contextConsumer} from '@alwatr/signal';\nimport {destroySignal, unsubscribe} from '@alwatr/signal/core.js';\nimport {SubscribeOptions} from '@alwatr/signal/type.js';\n\nimport type {\n ActionRecord,\n FsmConstructor,\n FsmConstructorConfig,\n FsmConsumerInterface,\n FsmInstance,\n FsmState,\n FsmTypeHelper,\n SignalConfig,\n} from './type.js';\nimport type {MaybePromise, OmitFirstParam, SingleOrArray, StringifyableRecord} from '@alwatr/type';\n\nglobalAlwatr.registeredList.push({\n name: '@alwatr/fsm',\n version: _ALWATR_VERSION_,\n});\n\nconst logger = createLogger(`alwatr/fsm`);\n\n/**\n * Finite state machine constructor storage.\n */\nconst fsmConstructorStorage: Record<string, FsmConstructor | undefined> = {};\n\nexport const defineConstructor = <\n TState extends string = string,\n TEventId extends string = string,\n TActionName extends string = string,\n TContext extends StringifyableRecord = StringifyableRecord\n>(\n id: string,\n config: FsmConstructorConfig<TState, TEventId, TActionName, TContext>,\n ): FsmConstructorConfig<TState, TEventId, TActionName, TContext> => {\n logger.logMethodArgs?.('defineConstructor', {id, config});\n if (fsmConstructorStorage[id] != null) throw new Error('fsm_exist', {cause: {id}});\n fsmConstructorStorage[id] = {\n id,\n config,\n actionRecord: {},\n signalList: [],\n };\n return config;\n};\n\n/**\n * Get finite state machine instance by id.\n */\nexport const getFsmInstance = <\n TState extends string = string,\n TEventId extends string = string,\n TContext extends StringifyableRecord = StringifyableRecord\n>(\n instanceId: string,\n ): FsmInstance<TState, TEventId, TContext> => {\n logger.logMethodArgs?.('_getFsmInstance', instanceId);\n const fsmInstance = contextConsumer.getValue<FsmInstance<TState, TEventId, TContext>>(instanceId);\n if (fsmInstance == null) throw new Error('fsm_undefined', {cause: {instanceId}});\n return fsmInstance;\n};\n\n/**\n * Get finite state machine constructor by id.\n */\nexport const getFsmConstructor = (constructorId: string): FsmConstructor => {\n logger.logMethodArgs?.('_getFsmConstructor', constructorId);\n const fsmConstructor = fsmConstructorStorage[constructorId];\n if (fsmConstructor == null) throw new Error('fsm_undefined', {cause: {constructorId: constructorId}});\n return fsmConstructor;\n};\n\n/**\n * Get current state of finite state machine instance.\n */\nexport const getState = <TState extends string = string, TEventId extends string = string>(\n instanceId: string,\n): FsmState<TState, TEventId> => {\n logger.logMethodArgs?.('getState', instanceId);\n return getFsmInstance<TState, TEventId>(instanceId).state;\n};\n\n/**\n * Get current context of finite state machine instance.\n */\nexport const getContext = <TContext extends StringifyableRecord = StringifyableRecord>(\n instanceId: string,\n): TContext => {\n logger.logMethodArgs?.('getContext', instanceId);\n return getFsmInstance<string, string, TContext>(instanceId).context;\n};\n\n/**\n * Set context of finite state machine instance.\n */\nexport const setContext = <TContext extends StringifyableRecord = StringifyableRecord>(\n instanceId: string,\n context: Partial<TContext>,\n notify?: boolean,\n): void => {\n logger.logMethodArgs?.('setContext', {instanceId, context});\n const fsmInstance = getFsmInstance(instanceId);\n fsmInstance.context = {\n ...fsmInstance.context,\n ...context,\n };\n\n if (notify) {\n contextProvider.setValue(instanceId, fsmInstance, {debounce: 'Timeout'});\n }\n};\n\n/**\n * Transition finite state machine instance to new state.\n */\nexport const transition = <\n TEventId extends string = string,\n TContext extends StringifyableRecord = StringifyableRecord\n>(\n instanceId: string,\n event: TEventId,\n context?: Partial<TContext>,\n ): void => {\n const fsmInstance = getFsmInstance(instanceId);\n const fsmConstructor = getFsmConstructor(fsmInstance.constructorId);\n const fromState = fsmInstance.state.target;\n const stateRecord = fsmConstructor.config.stateRecord;\n const transitionConfig = stateRecord[fromState]?.on[event] ?? stateRecord.$all.on[event];\n\n logger.logMethodArgs?.('transition', {instanceId, fromState, event, context, target: transitionConfig?.target});\n\n if (context !== undefined) {\n fsmInstance.context = {\n ...fsmInstance.context,\n ...context,\n };\n }\n\n if (transitionConfig == null) {\n logger.incident?.(\n 'transition',\n 'invalid_target_state',\n 'Defined target state for this event not found in state config',\n {\n fromState,\n event,\n events: {\n ...stateRecord.$all?.on,\n ...stateRecord[fromState]?.on,\n },\n },\n );\n return;\n }\n\n const consumerInterface = finiteStateMachineConsumer(instanceId);\n\n if (transitionConfig.condition) {\n if (_execAction(fsmConstructor, transitionConfig.condition, consumerInterface) === false) return;\n }\n\n fsmInstance.state = {\n target: transitionConfig.target ?? fromState,\n from: fromState,\n by: event,\n };\n\n contextProvider.setValue(instanceId, fsmInstance, {debounce: 'Timeout'});\n\n _execAllActions(fsmConstructor, fsmInstance.state, consumerInterface);\n};\n\n/**\n * Define actions for finite state machine constructor.\n */\nexport const defineActions = <T extends FsmTypeHelper>(constructorId: string, actionRecord: ActionRecord<T>): void => {\n logger.logMethodArgs?.('defineActions', {constructorId, actionRecord});\n const fmsConstructor = getFsmConstructor(constructorId);\n fmsConstructor.actionRecord = {\n ...fmsConstructor.actionRecord,\n ...actionRecord,\n };\n};\n\n/**\n * Execute all actions for current state.\n */\nexport const _execAllActions = (\n constructor: FsmConstructor,\n state: FsmState,\n consumerInterface: FsmConsumerInterface,\n): void => {\n logger.logMethodArgs?.('_execAllActions', consumerInterface.id);\n\n const stateRecord = constructor.config.stateRecord;\n\n if (state.by === 'INIT') {\n _execAction(constructor, stateRecord.$all.entry, consumerInterface);\n _execAction(constructor, stateRecord[state.target]?.entry, consumerInterface);\n return;\n }\n\n // else\n if (state.from !== state.target) {\n _execAction(constructor, stateRecord.$all.exit, consumerInterface);\n _execAction(constructor, stateRecord[state.from]?.exit, consumerInterface);\n _execAction(constructor, stateRecord.$all.entry, consumerInterface);\n _execAction(constructor, stateRecord[state.target]?.entry, consumerInterface);\n }\n\n _execAction(\n constructor,\n stateRecord[state.from]?.on[state.by] != null\n ? stateRecord[state.from].on[state.by]?.actions\n : stateRecord.$all.on[state.by]?.actions,\n consumerInterface,\n );\n};\n\n/**\n * Execute single action.\n */\nexport const _execAction = (\n constructor: FsmConstructor,\n actionNames: SingleOrArray<string> | undefined,\n finiteStateMachine: FsmConsumerInterface,\n): boolean | MaybePromise<void> => {\n if (actionNames == null) return;\n logger.logMethodArgs?.('execAction', {constructorId: constructor.id, actionNames});\n\n if (Array.isArray(actionNames)) {\n return actionNames\n .map((actionName) => _execAction(constructor, actionName, finiteStateMachine))\n .every((r) => r === true);\n }\n\n try {\n const actionFn = constructor.actionRecord[actionNames];\n if (actionFn == null) {\n return logger.error('execAction', 'action_not_found', {\n actionNames,\n constructorId: constructor.id,\n instanceId: finiteStateMachine.id,\n });\n }\n return actionFn(finiteStateMachine);\n }\n catch (error) {\n return logger.error('execAction', 'action_error', error, {\n actionNames,\n constructorId: constructor.id,\n instanceId: finiteStateMachine.id,\n });\n }\n};\n\n/**\n * Initialize new finite state machine instance.\n */\nexport const initFsmInstance = (instanceId: string, constructorId: string): void => {\n logger.logMethodArgs?.('initializeMachine', {constructorId, instanceId});\n const constructor = getFsmConstructor(constructorId);\n const {initial, context} = constructor.config;\n const newInstance: FsmInstance = {\n constructorId,\n state: {\n target: initial,\n from: initial,\n by: 'INIT',\n },\n context,\n };\n contextProvider.setValue<FsmInstance>(instanceId, newInstance, {debounce: 'NextCycle'});\n\n _execAllActions(constructor, newInstance.state, finiteStateMachineConsumer(instanceId));\n};\n\n/**\n * Subscribe to all defined signals for finite state machine instance.\n */\nexport const subscribeSignals = (\n instanceId: string,\n signalList: SignalConfig[],\n subscribeConstructorSignals = true,\n): ListenerSpec[] => {\n logger.logMethodArgs?.('subscribeSignals', {instanceId, signalList});\n const listenerList: ListenerSpec[] = [];\n\n if (subscribeConstructorSignals) {\n signalList = signalList.concat(getFsmConstructor(getFsmInstance(instanceId).constructorId).signalList);\n }\n\n for (const signalConfig of signalList) {\n signalConfig.signalId ??= instanceId;\n listenerList.push(\n contextConsumer.subscribe(\n signalConfig.signalId,\n (signalDetail: StringifyableRecord): void => {\n logger.logMethodArgs?.('execSignalCallback', {instanceId, signalId: signalConfig.signalId, signalDetail});\n if (signalConfig.callback) {\n signalConfig.callback(signalDetail, finiteStateMachineConsumer(instanceId));\n }\n else {\n // prettier-ignore\n transition(\n instanceId,\n signalConfig.transition,\n signalConfig.contextName == null ? undefined : {\n [signalConfig.contextName]: signalDetail,\n },\n );\n }\n },\n {receivePrevious: signalConfig.receivePrevious ?? 'No'},\n ),\n );\n }\n\n return listenerList;\n};\n\n/**\n * Define signals for finite state machine constructor.\n */\nexport const defineConstructorSignals = <T extends FsmTypeHelper>(\n constructorId: string,\n signalList: SignalConfig<T>[],\n): void => {\n logger.logMethodArgs?.('defineSignals', {constructorId, signalList: signalList});\n const fsmConstructor = getFsmConstructor(constructorId);\n fsmConstructor.signalList = fsmConstructor.signalList.concat(signalList as SignalConfig[]);\n};\n\n/**\n * Define signals for finite state machine instance.\n */\nexport const defineInstanceSignals = <T extends FsmTypeHelper>(\n instanceId: string,\n signalList: SignalConfig<T>[],\n subscribeConstructorSignals = true,\n): ListenerSpec[] => {\n logger.logMethodArgs?.('defineSignals', {instanceId, signals: signalList});\n return subscribeSignals(instanceId, signalList as SignalConfig[], subscribeConstructorSignals);\n};\n\n/**\n * Render helper for use finite state machine instance in UI.\n *\n * Example:\n *\n * ```ts\n * render('myFsm', {\n * state1: () => html`<div>State 1 Render...</div>`,\n * state2: () => html`<div>State 2 Render...</div>`,\n * state3: 'state1',\n * });\n * ```\n */\nexport const render = <TState extends string = string>(\n instanceId: string,\n states: {[P in TState]: (() => unknown) | TState},\n thisArg: unknown = null,\n): unknown => {\n const state = getFsmInstance(instanceId).state;\n logger.logMethodArgs?.('render', {instanceId, state: state.target});\n let renderFn = states[state.target as TState];\n\n if (typeof renderFn === 'string') {\n renderFn = states[renderFn as TState];\n }\n\n if (typeof renderFn === 'function') {\n return renderFn.call(thisArg);\n }\n\n return;\n};\n\n/**\n * Subscribe to finite state machine instance state changes.\n */\nexport const subscribe = (\n instanceId: string,\n callback: () => void,\n options?: Partial<SubscribeOptions>,\n): ListenerSpec => {\n logger.logMethodArgs?.('subscribe', instanceId);\n return contextConsumer.subscribe(instanceId, callback, options);\n};\n\n/**\n * Destroy finite state machine instance object to clear memory.\n */\nexport const destroy = (instanceId: string): void => {\n logger.logMethodArgs?.('destroy', instanceId);\n destroySignal(instanceId);\n};\n\n/**\n * Reset finite state machine instance to initial state and context.\n */\nexport const reset = (instanceId: string): void => {\n logger.logMethodArgs?.('reset', instanceId);\n const constructorId = getFsmInstance(instanceId).constructorId;\n // contextProvider.expire(instanceId);\n initFsmInstance(instanceId, constructorId);\n};\n\n/**\n * Finite state machine instance consumer.\n * Lookup current finite state machine instance or initialize new one and return consumer object .\n */\n// eslint-disable-next-line @typescript-eslint/explicit-function-return-type\nexport const finiteStateMachineConsumer = <T extends FsmTypeHelper, TContext extends T['TContext'] = T['TContext']>(\n instanceId: string,\n makeFromConstructor?: string,\n) => {\n logger.logMethodArgs?.('stateMachineLookup', instanceId);\n\n const machineInstance = contextConsumer.getValue<FsmInstance>(instanceId);\n if (machineInstance == null) {\n // instance not initialized.\n if (makeFromConstructor == null) {\n throw new Error('fsm_undefined', {cause: {instanceId}});\n }\n initFsmInstance(instanceId, makeFromConstructor);\n }\n\n return {\n /**\n * Finite state machine instance id.\n */\n id: instanceId,\n\n /**\n * Finite state machine constructor id.\n */\n constructorId: machineInstance?.constructorId as string ?? makeFromConstructor,\n\n /**\n * Render helper for use finite state machine instance in UI.\n */\n render: render.bind(null, instanceId) as OmitFirstParam<typeof render<T['TState']>>,\n\n /**\n * Subscribe to finite state machine instance state changes.\n */\n subscribe: subscribe.bind(null, instanceId) as OmitFirstParam<typeof subscribe>,\n\n /**\n * Unsubscribe from finite state machine instance state changes.\n */\n unsubscribe: unsubscribe,\n\n /**\n * Get current state of finite state machine instance.\n */\n getState: getState.bind(null, instanceId) as OmitFirstParam<typeof getState<T['TState'], T['TEventId']>>,\n\n /**\n * Get current context of finite state machine instance.\n */\n getContext: getContext.bind(null, instanceId) as OmitFirstParam<typeof getContext<TContext>>,\n\n /**\n * Set context of finite state machine instance.\n */\n setContext: setContext.bind(null, instanceId) as OmitFirstParam<typeof setContext<TContext>>,\n\n /**\n * Transition finite state machine instance to new state.\n */\n transition: transition.bind(null, instanceId) as OmitFirstParam<typeof transition<T['TEventId'], TContext>>,\n\n /**\n * Define signals for finite state machine instance.\n */\n defineSignals: defineInstanceSignals.bind(null, instanceId) as OmitFirstParam<typeof defineInstanceSignals<T>>,\n\n /**\n * Reset finite state machine instance to initial state and context.\n */\n reset: reset.bind(null, instanceId) as OmitFirstParam<typeof reset>,\n\n /**\n * Destroy finite state machine instance object to clear memory.\n */\n destroy: destroy.bind(null, instanceId) as OmitFirstParam<typeof destroy>,\n } as const;\n};\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@alwatr/fsm",
3
- "version": "1.0.1",
3
+ "version": "1.1.0",
4
4
  "description": "Managing invocations finite-state machines for lit-element written in tiny TypeScript module.",
5
5
  "keywords": [
6
6
  "state",
@@ -34,10 +34,10 @@
34
34
  "url": "https://github.com/AliMD/alwatr/issues"
35
35
  },
36
36
  "dependencies": {
37
- "@alwatr/logger": "^1.0.1",
38
- "@alwatr/signal": "^1.0.1",
39
- "@alwatr/type": "^1.0.1",
40
- "tslib": "^2.5.3"
37
+ "@alwatr/logger": "^1.1.0",
38
+ "@alwatr/signal": "^1.1.0",
39
+ "@alwatr/type": "^1.1.0",
40
+ "tslib": "^2.6.2"
41
41
  },
42
- "gitHead": "10b9734389e27538ba4fa4ac7871ec0354ca9285"
42
+ "gitHead": "e5c3bcb9d4f391a5a94d1469c5d31cbcd102c90b"
43
43
  }
package/type.d.ts CHANGED
@@ -8,7 +8,7 @@ export interface FsmConstructor {
8
8
  readonly id: string;
9
9
  readonly config: FsmConstructorConfig;
10
10
  actionRecord: ActionRecord;
11
- signalList: Array<SignalConfig>;
11
+ signalList: SignalConfig[];
12
12
  }
13
13
  export interface FsmConstructorConfig<TState extends string = string, TEventId extends string = string, TActionName extends string = string, TContext extends StringifyableRecord = StringifyableRecord> extends StringifyableRecord {
14
14
  /**
package/type.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"type.d.ts","sourceRoot":"","sources":["src/type.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"type.d.ts","sourceRoot":"","sources":["src/type.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,0BAA0B,EAAC,MAAM,WAAW,CAAC;AAC1D,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,gBAAgB,CAAC;AACjD,OAAO,KAAK,EAAC,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,mBAAmB,EAAC,MAAM,cAAc,CAAC;AAE/F,MAAM,WAAW,cAAc;IAC7B;;OAEG;IACH,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,MAAM,EAAE,oBAAoB,CAAC;IACtC,YAAY,EAAE,YAAY,CAAC;IAC3B,UAAU,EAAE,YAAY,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,oBAAoB,CACnC,MAAM,SAAS,MAAM,GAAG,MAAM,EAC9B,QAAQ,SAAS,MAAM,GAAG,MAAM,EAChC,WAAW,SAAS,MAAM,GAAG,MAAM,EACnC,QAAQ,SAAS,mBAAmB,GAAG,mBAAmB,CAC1D,SAAQ,mBAAmB;IAC3B;;OAEG;IACH,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC;IAE3B;;OAEG;IACH,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAEzB;;OAEG;IACH,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC,MAAM,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;CAClE;AAED,MAAM,MAAM,WAAW,CACrB,MAAM,SAAS,MAAM,GAAG,MAAM,EAC9B,QAAQ,SAAS,MAAM,GAAG,MAAM,EAChC,WAAW,SAAS,MAAM,GAAG,MAAM,IACjC;IACF,QAAQ,EAAE,CAAC,IAAI,MAAM,GAAG,MAAM,GAAG;QAC/B;;WAEG;QACH,QAAQ,CAAC,IAAI,CAAC,EAAE,aAAa,CAAC,WAAW,CAAC,CAAC;QAE3C;;WAEG;QACH,QAAQ,CAAC,KAAK,CAAC,EAAE,aAAa,CAAC,WAAW,CAAC,CAAC;QAE5C;;;;;;;;;;;;;;;;WAgBG;QACH,QAAQ,CAAC,EAAE,EAAE;YACX,QAAQ,EAAE,CAAC,IAAI,QAAQ,CAAC,CAAC,EAAE,gBAAgB,CAAC,MAAM,EAAE,WAAW,CAAC,GAAG,SAAS;SAC7E,CAAC;KACH;CACF,CAAC;AAEF,MAAM,WAAW,QAAQ,CAAC,MAAM,SAAS,MAAM,GAAG,MAAM,EAAE,QAAQ,SAAS,MAAM,GAAG,MAAM,CACxF,SAAQ,mBAAmB;IAC3B;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC;IACf;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IACb;;OAEG;IACH,EAAE,EAAE,QAAQ,GAAG,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,gBAAgB,CAAC,MAAM,SAAS,MAAM,GAAG,MAAM,EAAE,WAAW,SAAS,MAAM,GAAG,MAAM,CACnG,SAAQ,mBAAmB;IAC3B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,CAAC,EAAE,WAAW,CAAC;IACjC,QAAQ,CAAC,OAAO,CAAC,EAAE,aAAa,CAAC,WAAW,CAAC,CAAC;CAC/C;AAED,MAAM,WAAW,WAAW,CAC1B,MAAM,SAAS,MAAM,GAAG,MAAM,EAC9B,QAAQ,SAAS,MAAM,GAAG,MAAM,EAChC,QAAQ,SAAS,mBAAmB,GAAG,mBAAmB,CAC1D,SAAQ,mBAAmB;IAC3B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,KAAK,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAClC,OAAO,EAAE,QAAQ,CAAC;CACnB;AAED,MAAM,MAAM,YAAY,CAAC,CAAC,SAAS,aAAa,GAAG,aAAa,IAAI;IAClE,QAAQ,EAAE,CAAC,IAAI,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,kBAAkB,EAAE,oBAAoB,CAAC,CAAC,CAAC,KAAK,YAAY,CAAC,IAAI,CAAC,GAAG,OAAO;CACjH,CAAC;AAEF,MAAM,MAAM,YAAY,CAAC,CAAC,SAAS,aAAa,GAAG,aAAa,IAAI;IAClE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;OAEG;IACH,eAAe,CAAC,EAAE,YAAY,CAAC;CAChC,GAAG,CACA;IACE,UAAU,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC,CAAC,UAAU,CAAC,CAAC;IAClC,QAAQ,CAAC,EAAE,KAAK,CAAC;CAClB,GACD;IAEE,QAAQ,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,oBAAoB,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;IACtE,UAAU,CAAC,EAAE,KAAK,CAAC;CACpB,CACJ,CAAC;AAGF,MAAM,MAAM,aAAa,CAAC,CAAC,SAAS,oBAAoB,GAAG,oBAAoB,IAAI,QAAQ,CAAC;IAC1F,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC,CAAC;IAChD,QAAQ,EAAE,MAAM,CAAC,CAAC,aAAa,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACnE,WAAW,EAAE,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAC5F,QAAQ,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC;CACxB,CAAC,CAAC;AAEH,MAAM,MAAM,oBAAoB,CAC9B,CAAC,SAAS,aAAa,GAAG,aAAa,EACvC,QAAQ,SAAS,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC,IAC5C,UAAU,CAAC,OAAO,0BAA0B,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC"}
package/type.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"type.js","sourceRoot":"","sources":["src/type.ts"],"names":[],"mappings":"","sourcesContent":["import type {finiteStateMachineConsumer} from './core.js';\nimport type {DebounceType} from '@alwatr/signal';\nimport type {ArrayItems, MaybePromise, SingleOrArray, StringifyableRecord} from '@alwatr/type';\n\nexport interface FsmConstructor {\n /**\n * Constructor id.\n */\n readonly id: string;\n readonly config: FsmConstructorConfig;\n actionRecord: ActionRecord;\n signalList: Array<SignalConfig>;\n}\n\nexport interface FsmConstructorConfig<\n TState extends string = string,\n TEventId extends string = string,\n TActionName extends string = string,\n TContext extends StringifyableRecord = StringifyableRecord\n> extends StringifyableRecord {\n /**\n * Initial context.\n */\n readonly context: TContext;\n\n /**\n * Initial state.\n */\n readonly initial: TState;\n\n /**\n * Define state list\n */\n readonly stateRecord: StateRecord<TState, TEventId, TActionName>;\n}\n\nexport type StateRecord<\n TState extends string = string,\n TEventId extends string = string,\n TActionName extends string = string\n> = {\n readonly [S in TState | '$all']: {\n /**\n * On state exit actions\n */\n readonly exit?: SingleOrArray<TActionName>;\n\n /**\n * On state entry actions\n */\n readonly entry?: SingleOrArray<TActionName>;\n\n /**\n * An object mapping eventId to state.\n *\n * Example:\n *\n * ```ts\n * stateRecord: {\n * on: {\n * TIMER: {\n * target: 'green',\n * condition: () => car.gas > 0,\n * actions: () => car.go(),\n * }\n * }\n * }\n * ```\n */\n readonly on: {\n readonly [E in TEventId]?: TransitionConfig<TState, TActionName> | undefined;\n };\n };\n};\n\nexport interface FsmState<TState extends string = string, TEventId extends string = string>\n extends StringifyableRecord {\n /**\n * Current state\n */\n target: TState;\n /**\n * Last state\n */\n from: TState;\n /**\n * Transition event\n */\n by: TEventId | 'INIT';\n}\n\nexport interface TransitionConfig<TState extends string = string, TActionName extends string = string>\n extends StringifyableRecord {\n readonly target?: TState;\n readonly condition?: TActionName;\n readonly actions?: SingleOrArray<TActionName>;\n}\n\nexport interface FsmInstance<\n TState extends string = string,\n TEventId extends string = string,\n TContext extends StringifyableRecord = StringifyableRecord\n> extends StringifyableRecord {\n readonly constructorId: string;\n state: FsmState<TState, TEventId>;\n context: TContext;\n}\n\nexport type ActionRecord<T extends FsmTypeHelper = FsmTypeHelper> = {\n readonly [P in T['TActionName']]?: (finiteStateMachine: FsmConsumerInterface<T>) => MaybePromise<void> | boolean;\n};\n\nexport type SignalConfig<T extends FsmTypeHelper = FsmTypeHelper> = {\n signalId?: string;\n /**\n * @default `No`\n */\n receivePrevious?: DebounceType;\n} & (\n | {\n transition: T['TEventId'];\n contextName?: keyof T['TContext'];\n callback?: never;\n }\n | {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n callback: (detail: any, fsmInstance: FsmConsumerInterface<T>) => void;\n transition?: never;\n }\n);\n\n// type helper\nexport type FsmTypeHelper<T extends FsmConstructorConfig = FsmConstructorConfig> = Readonly<{\n TState: Exclude<keyof T['stateRecord'], '$all'>;\n TEventId: keyof T['stateRecord'][FsmTypeHelper<T>['TState']]['on'];\n TActionName: NonNullable<ArrayItems<T['stateRecord'][FsmTypeHelper<T>['TState']]['entry']>>;\n TContext: T['context'];\n}>;\n\nexport type FsmConsumerInterface<\n T extends FsmTypeHelper = FsmTypeHelper,\n TContext extends T['TContext'] = T['TContext']\n> = ReturnType<typeof finiteStateMachineConsumer<T, TContext>>;\n"]}
1
+ {"version":3,"file":"type.js","sourceRoot":"","sources":["src/type.ts"],"names":[],"mappings":"","sourcesContent":["import type {finiteStateMachineConsumer} from './core.js';\nimport type {DebounceType} from '@alwatr/signal';\nimport type {ArrayItems, MaybePromise, SingleOrArray, StringifyableRecord} from '@alwatr/type';\n\nexport interface FsmConstructor {\n /**\n * Constructor id.\n */\n readonly id: string;\n readonly config: FsmConstructorConfig;\n actionRecord: ActionRecord;\n signalList: SignalConfig[];\n}\n\nexport interface FsmConstructorConfig<\n TState extends string = string,\n TEventId extends string = string,\n TActionName extends string = string,\n TContext extends StringifyableRecord = StringifyableRecord\n> extends StringifyableRecord {\n /**\n * Initial context.\n */\n readonly context: TContext;\n\n /**\n * Initial state.\n */\n readonly initial: TState;\n\n /**\n * Define state list\n */\n readonly stateRecord: StateRecord<TState, TEventId, TActionName>;\n}\n\nexport type StateRecord<\n TState extends string = string,\n TEventId extends string = string,\n TActionName extends string = string\n> = {\n readonly [S in TState | '$all']: {\n /**\n * On state exit actions\n */\n readonly exit?: SingleOrArray<TActionName>;\n\n /**\n * On state entry actions\n */\n readonly entry?: SingleOrArray<TActionName>;\n\n /**\n * An object mapping eventId to state.\n *\n * Example:\n *\n * ```ts\n * stateRecord: {\n * on: {\n * TIMER: {\n * target: 'green',\n * condition: () => car.gas > 0,\n * actions: () => car.go(),\n * }\n * }\n * }\n * ```\n */\n readonly on: {\n readonly [E in TEventId]?: TransitionConfig<TState, TActionName> | undefined;\n };\n };\n};\n\nexport interface FsmState<TState extends string = string, TEventId extends string = string>\n extends StringifyableRecord {\n /**\n * Current state\n */\n target: TState;\n /**\n * Last state\n */\n from: TState;\n /**\n * Transition event\n */\n by: TEventId | 'INIT';\n}\n\nexport interface TransitionConfig<TState extends string = string, TActionName extends string = string>\n extends StringifyableRecord {\n readonly target?: TState;\n readonly condition?: TActionName;\n readonly actions?: SingleOrArray<TActionName>;\n}\n\nexport interface FsmInstance<\n TState extends string = string,\n TEventId extends string = string,\n TContext extends StringifyableRecord = StringifyableRecord\n> extends StringifyableRecord {\n readonly constructorId: string;\n state: FsmState<TState, TEventId>;\n context: TContext;\n}\n\nexport type ActionRecord<T extends FsmTypeHelper = FsmTypeHelper> = {\n readonly [P in T['TActionName']]?: (finiteStateMachine: FsmConsumerInterface<T>) => MaybePromise<void> | boolean;\n};\n\nexport type SignalConfig<T extends FsmTypeHelper = FsmTypeHelper> = {\n signalId?: string;\n /**\n * @default `No`\n */\n receivePrevious?: DebounceType;\n} & (\n | {\n transition: T['TEventId'];\n contextName?: keyof T['TContext'];\n callback?: never;\n }\n | {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n callback: (detail: any, fsmInstance: FsmConsumerInterface<T>) => void;\n transition?: never;\n }\n);\n\n// type helper\nexport type FsmTypeHelper<T extends FsmConstructorConfig = FsmConstructorConfig> = Readonly<{\n TState: Exclude<keyof T['stateRecord'], '$all'>;\n TEventId: keyof T['stateRecord'][FsmTypeHelper<T>['TState']]['on'];\n TActionName: NonNullable<ArrayItems<T['stateRecord'][FsmTypeHelper<T>['TState']]['entry']>>;\n TContext: T['context'];\n}>;\n\nexport type FsmConsumerInterface<\n T extends FsmTypeHelper = FsmTypeHelper,\n TContext extends T['TContext'] = T['TContext']\n> = ReturnType<typeof finiteStateMachineConsumer<T, TContext>>;\n"]}