@alwatr/fsm 4.0.4 → 4.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 +24 -0
- package/LICENSE +373 -661
- package/README.md +0 -4
- package/dist/base.d.ts +1 -1
- package/dist/base.d.ts.map +1 -1
- package/dist/main.cjs +3 -3
- package/dist/main.cjs.map +2 -2
- package/dist/main.mjs +3 -3
- package/dist/main.mjs.map +2 -2
- package/dist/type.d.ts +1 -1
- package/dist/type.d.ts.map +1 -1
- package/package.json +39 -41
package/README.md
CHANGED
|
@@ -89,12 +89,8 @@ class MyStateMachine extends FluxStateMachineBase<MyState, MyEvent> {
|
|
|
89
89
|
|
|
90
90
|
The following companies, organizations, and individuals support flux ongoing maintenance and development. Become a Sponsor to get your logo on our README and website.
|
|
91
91
|
|
|
92
|
-
[](https://exirstudio.com)
|
|
93
92
|
|
|
94
93
|
### Contributing
|
|
95
94
|
|
|
96
95
|
Contributions are welcome! Please read our [contribution guidelines](https://github.com/Alwatr/.github/blob/next/CONTRIBUTING.md) before submitting a pull request.
|
|
97
96
|
|
|
98
|
-
### License
|
|
99
|
-
|
|
100
|
-
This project is licensed under the [AGPL-3.0 License](LICENSE).
|
package/dist/base.d.ts
CHANGED
|
@@ -30,7 +30,7 @@ export declare abstract class AlwatrFluxStateMachineBase<S extends string, E ext
|
|
|
30
30
|
/**
|
|
31
31
|
* Transition condition.
|
|
32
32
|
*/
|
|
33
|
-
protected shouldTransition_(_eventDetail: StateEventDetail<S, E>):
|
|
33
|
+
protected shouldTransition_(_eventDetail: StateEventDetail<S, E>): Awaitable<boolean>;
|
|
34
34
|
/**
|
|
35
35
|
* Transition flux state machine instance to new state.
|
|
36
36
|
*/
|
package/dist/base.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../src/base.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,gBAAgB,EAAE,KAAK,sBAAsB,EAAC,MAAM,oBAAoB,CAAC;AAEjF,OAAO,KAAK,EAAa,YAAY,EAAE,gBAAgB,EAAE,WAAW,EAAC,MAAM,WAAW,CAAC;AAIvF,MAAM,WAAW,4BAA4B,CAAC,CAAC,SAAS,MAAM,CAAE,SAAQ,sBAAsB;IAC5F,YAAY,EAAE,CAAC,CAAC;CACjB;AAED;;GAEG;AACH,8BAAsB,0BAA0B,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,MAAM,CAAE,SAAQ,gBAAgB,CAAC;IAAC,KAAK,EAAE,CAAC,CAAA;CAAC,CAAC;IACvH;;OAEG;IACH,SAAS,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAAM;IAE/C;;OAEG;IACH,SAAS,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,CAAM;IAEjD,SAAS,CAAC,aAAa,EAAE,CAAC,CAAC;IAE3B,UAAmB,QAAQ,EAAE;QAAC,KAAK,EAAE,CAAC,CAAA;KAAC,CAAC;gBAE5B,MAAM,EAAE,4BAA4B,CAAC,CAAC,CAAC;IASnD,OAAO,CAAC,0BAA0B,CAAQ;IAC1C;;OAEG;IACH,SAAS,CAAC,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC;IAe/C;;OAEG;IACH,SAAS,CAAC,iBAAiB,CAAC,YAAY,EAAE,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,
|
|
1
|
+
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../src/base.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,gBAAgB,EAAE,KAAK,sBAAsB,EAAC,MAAM,oBAAoB,CAAC;AAEjF,OAAO,KAAK,EAAa,YAAY,EAAE,gBAAgB,EAAE,WAAW,EAAC,MAAM,WAAW,CAAC;AAIvF,MAAM,WAAW,4BAA4B,CAAC,CAAC,SAAS,MAAM,CAAE,SAAQ,sBAAsB;IAC5F,YAAY,EAAE,CAAC,CAAC;CACjB;AAED;;GAEG;AACH,8BAAsB,0BAA0B,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,MAAM,CAAE,SAAQ,gBAAgB,CAAC;IAAC,KAAK,EAAE,CAAC,CAAA;CAAC,CAAC;IACvH;;OAEG;IACH,SAAS,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAAM;IAE/C;;OAEG;IACH,SAAS,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,CAAM;IAEjD,SAAS,CAAC,aAAa,EAAE,CAAC,CAAC;IAE3B,UAAmB,QAAQ,EAAE;QAAC,KAAK,EAAE,CAAC,CAAA;KAAC,CAAC;gBAE5B,MAAM,EAAE,4BAA4B,CAAC,CAAC,CAAC;IASnD,OAAO,CAAC,0BAA0B,CAAQ;IAC1C;;OAEG;IACH,SAAS,CAAC,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC;IAe/C;;OAEG;IACH,SAAS,CAAC,iBAAiB,CAAC,YAAY,EAAE,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,SAAS,CAAC,OAAO,CAAC;IAKrF;;OAEG;cACa,WAAW,CAAC,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAuBpD;;OAEG;YACW,gBAAgB;IAe9B;;OAEG;IACH,OAAO,CAAC,YAAY;CAOrB"}
|
package/dist/main.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/* @alwatr/fsm v4.0
|
|
1
|
+
/* @alwatr/fsm v4.1.0 */
|
|
2
2
|
"use strict";
|
|
3
3
|
var __defProp = Object.defineProperty;
|
|
4
4
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
@@ -29,10 +29,10 @@ module.exports = __toCommonJS(main_exports);
|
|
|
29
29
|
// src/base.ts
|
|
30
30
|
var import_nanolib = require("@alwatr/nanolib");
|
|
31
31
|
var import_observable = require("@alwatr/observable");
|
|
32
|
-
__dev_mode__: import_nanolib.packageTracer.add("@alwatr/fsm", "4.0
|
|
32
|
+
__dev_mode__: import_nanolib.packageTracer.add("@alwatr/fsm", "4.1.0");
|
|
33
33
|
var AlwatrFluxStateMachineBase = class extends import_observable.AlwatrObservable {
|
|
34
34
|
constructor(config) {
|
|
35
|
-
config.loggerPrefix
|
|
35
|
+
config.loggerPrefix ??= "flux-state-machine";
|
|
36
36
|
super(config);
|
|
37
37
|
/**
|
|
38
38
|
* States and transitions config.
|
package/dist/main.cjs.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/main.ts", "../src/base.ts", "../src/fsm.ts"],
|
|
4
|
-
"sourcesContent": ["export * from './base.js';\nexport * from './fsm.js';\nexport * from './type.js';\n", "import {packageTracer} from '@alwatr/nanolib';\nimport {AlwatrObservable, type AlwatrObservableConfig} from '@alwatr/observable';\n\nimport type {ActionName, ActionRecord, StateEventDetail, StateRecord} from './type.js';\n\n__dev_mode__: packageTracer.add(__package_name__, __package_version__);\n\nexport interface AlwatrFluxStateMachineConfig<S extends string> extends AlwatrObservableConfig {\n initialState: S;\n}\n\n/**\n * Flux (Finite) State Machine Base Class\n */\nexport abstract class AlwatrFluxStateMachineBase<S extends string, E extends string> extends AlwatrObservable<{state: S}> {\n /**\n * States and transitions config.\n */\n protected stateRecord_: StateRecord<S, E> = {};\n\n /**\n * Bind actions name to class methods\n */\n protected actionRecord_: ActionRecord<S, E> = {};\n\n protected initialState_: S;\n\n protected override message_: {state: S};\n\n constructor(config: AlwatrFluxStateMachineConfig<S>) {\n config.loggerPrefix ??= 'flux-state-machine';\n super(config);\n\n this.initialState_ = config.initialState;\n this.message_ = {state: this.initialState_};\n setTimeout(this.resetToInitialState_.bind(this), 0);\n }\n\n private firstResetToInitialState__ = true;\n /**\n * Reset machine to initial state without notify.\n */\n protected resetToInitialState_(): Promise<void> {\n this.logger_.logMethod?.('resetToInitialState_');\n if (this.firstResetToInitialState__) {\n this.firstResetToInitialState__ = false;\n const eventDetail: StateEventDetail<S, E> = {from: this.initialState_, event: 'reset', to: this.initialState_};\n this.execAction__(`on_state_${this.initialState_}_enter`, eventDetail);\n return this.postTransition__(eventDetail);\n }\n // else {\n const from = this.message_.state;\n this.message_ = {state: this.initialState_};\n const eventDetail: StateEventDetail<S, E> = {from, event: 'reset', to: this.initialState_};\n return this.postTransition__(eventDetail);\n }\n\n /**\n * Transition condition.\n */\n protected shouldTransition_(_eventDetail: StateEventDetail<S, E>):
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,qBAA4B;AAC5B,wBAA4D;AAI5D,aAAc,8BAAc,IAAI,eAAkB,OAAmB;AAS9D,IAAe,6BAAf,cAAsF,mCAA6B;AAAA,EAexH,YAAY,QAAyC;AACnD,WAAO,
|
|
4
|
+
"sourcesContent": ["export * from './base.js';\nexport * from './fsm.js';\nexport * from './type.js';\n", "import {packageTracer} from '@alwatr/nanolib';\nimport {AlwatrObservable, type AlwatrObservableConfig} from '@alwatr/observable';\n\nimport type {ActionName, ActionRecord, StateEventDetail, StateRecord} from './type.js';\n\n__dev_mode__: packageTracer.add(__package_name__, __package_version__);\n\nexport interface AlwatrFluxStateMachineConfig<S extends string> extends AlwatrObservableConfig {\n initialState: S;\n}\n\n/**\n * Flux (Finite) State Machine Base Class\n */\nexport abstract class AlwatrFluxStateMachineBase<S extends string, E extends string> extends AlwatrObservable<{state: S}> {\n /**\n * States and transitions config.\n */\n protected stateRecord_: StateRecord<S, E> = {};\n\n /**\n * Bind actions name to class methods\n */\n protected actionRecord_: ActionRecord<S, E> = {};\n\n protected initialState_: S;\n\n protected override message_: {state: S};\n\n constructor(config: AlwatrFluxStateMachineConfig<S>) {\n config.loggerPrefix ??= 'flux-state-machine';\n super(config);\n\n this.initialState_ = config.initialState;\n this.message_ = {state: this.initialState_};\n setTimeout(this.resetToInitialState_.bind(this), 0);\n }\n\n private firstResetToInitialState__ = true;\n /**\n * Reset machine to initial state without notify.\n */\n protected resetToInitialState_(): Promise<void> {\n this.logger_.logMethod?.('resetToInitialState_');\n if (this.firstResetToInitialState__) {\n this.firstResetToInitialState__ = false;\n const eventDetail: StateEventDetail<S, E> = {from: this.initialState_, event: 'reset', to: this.initialState_};\n this.execAction__(`on_state_${this.initialState_}_enter`, eventDetail);\n return this.postTransition__(eventDetail);\n }\n // else {\n const from = this.message_.state;\n this.message_ = {state: this.initialState_};\n const eventDetail: StateEventDetail<S, E> = {from, event: 'reset', to: this.initialState_};\n return this.postTransition__(eventDetail);\n }\n\n /**\n * Transition condition.\n */\n protected shouldTransition_(_eventDetail: StateEventDetail<S, E>): Awaitable<boolean> {\n this.logger_.logMethodFull?.('shouldTransition_', _eventDetail, true);\n return true;\n }\n\n /**\n * Transition flux state machine instance to new state.\n */\n protected async transition_(event: E): Promise<void> {\n const fromState = this.message_.state;\n const toState = this.stateRecord_[fromState]?.[event];\n\n this.logger_.logMethodArgs?.('transition_', {fromState, event, toState});\n\n if (toState == null) {\n this.logger_.incident?.('transition', 'invalid_target_state', {\n fromState,\n event,\n });\n return;\n }\n\n const eventDetail: StateEventDetail<S, E> = {from: fromState, event, to: toState};\n\n if ((await this.shouldTransition_(eventDetail)) !== true) return;\n\n this.notify_({state: toState}); // message update but notify event delayed after execActions.\n\n this.postTransition__(eventDetail);\n }\n\n /**\n * Execute all actions for current state.\n */\n private async postTransition__(eventDetail: StateEventDetail<S, E>): Promise<void> {\n this.logger_.logMethodArgs?.('postTransition__', eventDetail);\n\n await this.execAction__(`on_event_${eventDetail.event}`, eventDetail);\n\n if (eventDetail.from !== eventDetail.to) {\n await this.execAction__(`on_any_state_exit`, eventDetail);\n await this.execAction__(`on_state_${eventDetail.from}_exit`, eventDetail);\n await this.execAction__(`on_any_state_enter`, eventDetail);\n await this.execAction__(`on_state_${eventDetail.to}_enter`, eventDetail);\n }\n\n this.execAction__(`on_state_${eventDetail.from}_event_${eventDetail.event}`, eventDetail);\n }\n\n /**\n * Execute action name if defined in _actionRecord.\n */\n private execAction__(name: ActionName<S, E | 'reset'>, eventDetail: StateEventDetail<S, E>): Awaitable<void> {\n const actionFn = this.actionRecord_[name];\n if (typeof actionFn === 'function') {\n this.logger_.logMethodArgs?.('execAction__', name);\n return actionFn.call(this, eventDetail);\n }\n }\n}\n", "import {AlwatrFluxStateMachineBase} from './base.js';\n\n/**\n * Flux (Finite) State Machine Base Class\n */\nexport abstract class AlwatrFluxStateMachine<S extends string, E extends string> extends AlwatrFluxStateMachineBase<S, E> {\n /**\n * Current state.\n */\n get state(): S {\n return this.message_.state;\n }\n\n /**\n * Transition flux state machine instance to new state.\n */\n transition(event: E): void {\n this.transition_(event);\n }\n\n /**\n * Reset machine to initial state without notify.\n */\n resetToInitialState(): void {\n this.resetToInitialState_();\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["eventDetail"]
|
|
7
7
|
}
|
package/dist/main.mjs
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
/* @alwatr/fsm v4.0
|
|
1
|
+
/* @alwatr/fsm v4.1.0 */
|
|
2
2
|
|
|
3
3
|
// src/base.ts
|
|
4
4
|
import { packageTracer } from "@alwatr/nanolib";
|
|
5
5
|
import { AlwatrObservable } from "@alwatr/observable";
|
|
6
|
-
__dev_mode__: packageTracer.add("@alwatr/fsm", "4.0
|
|
6
|
+
__dev_mode__: packageTracer.add("@alwatr/fsm", "4.1.0");
|
|
7
7
|
var AlwatrFluxStateMachineBase = class extends AlwatrObservable {
|
|
8
8
|
constructor(config) {
|
|
9
|
-
config.loggerPrefix
|
|
9
|
+
config.loggerPrefix ??= "flux-state-machine";
|
|
10
10
|
super(config);
|
|
11
11
|
/**
|
|
12
12
|
* States and transitions config.
|
package/dist/main.mjs.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/base.ts", "../src/fsm.ts"],
|
|
4
|
-
"sourcesContent": ["import {packageTracer} from '@alwatr/nanolib';\nimport {AlwatrObservable, type AlwatrObservableConfig} from '@alwatr/observable';\n\nimport type {ActionName, ActionRecord, StateEventDetail, StateRecord} from './type.js';\n\n__dev_mode__: packageTracer.add(__package_name__, __package_version__);\n\nexport interface AlwatrFluxStateMachineConfig<S extends string> extends AlwatrObservableConfig {\n initialState: S;\n}\n\n/**\n * Flux (Finite) State Machine Base Class\n */\nexport abstract class AlwatrFluxStateMachineBase<S extends string, E extends string> extends AlwatrObservable<{state: S}> {\n /**\n * States and transitions config.\n */\n protected stateRecord_: StateRecord<S, E> = {};\n\n /**\n * Bind actions name to class methods\n */\n protected actionRecord_: ActionRecord<S, E> = {};\n\n protected initialState_: S;\n\n protected override message_: {state: S};\n\n constructor(config: AlwatrFluxStateMachineConfig<S>) {\n config.loggerPrefix ??= 'flux-state-machine';\n super(config);\n\n this.initialState_ = config.initialState;\n this.message_ = {state: this.initialState_};\n setTimeout(this.resetToInitialState_.bind(this), 0);\n }\n\n private firstResetToInitialState__ = true;\n /**\n * Reset machine to initial state without notify.\n */\n protected resetToInitialState_(): Promise<void> {\n this.logger_.logMethod?.('resetToInitialState_');\n if (this.firstResetToInitialState__) {\n this.firstResetToInitialState__ = false;\n const eventDetail: StateEventDetail<S, E> = {from: this.initialState_, event: 'reset', to: this.initialState_};\n this.execAction__(`on_state_${this.initialState_}_enter`, eventDetail);\n return this.postTransition__(eventDetail);\n }\n // else {\n const from = this.message_.state;\n this.message_ = {state: this.initialState_};\n const eventDetail: StateEventDetail<S, E> = {from, event: 'reset', to: this.initialState_};\n return this.postTransition__(eventDetail);\n }\n\n /**\n * Transition condition.\n */\n protected shouldTransition_(_eventDetail: StateEventDetail<S, E>):
|
|
5
|
-
"mappings": ";;;AAAA,SAAQ,qBAAoB;AAC5B,SAAQ,wBAAoD;AAI5D,aAAc,eAAc,IAAI,eAAkB,OAAmB;AAS9D,IAAe,6BAAf,cAAsF,iBAA6B;AAAA,EAexH,YAAY,QAAyC;AACnD,WAAO,
|
|
4
|
+
"sourcesContent": ["import {packageTracer} from '@alwatr/nanolib';\nimport {AlwatrObservable, type AlwatrObservableConfig} from '@alwatr/observable';\n\nimport type {ActionName, ActionRecord, StateEventDetail, StateRecord} from './type.js';\n\n__dev_mode__: packageTracer.add(__package_name__, __package_version__);\n\nexport interface AlwatrFluxStateMachineConfig<S extends string> extends AlwatrObservableConfig {\n initialState: S;\n}\n\n/**\n * Flux (Finite) State Machine Base Class\n */\nexport abstract class AlwatrFluxStateMachineBase<S extends string, E extends string> extends AlwatrObservable<{state: S}> {\n /**\n * States and transitions config.\n */\n protected stateRecord_: StateRecord<S, E> = {};\n\n /**\n * Bind actions name to class methods\n */\n protected actionRecord_: ActionRecord<S, E> = {};\n\n protected initialState_: S;\n\n protected override message_: {state: S};\n\n constructor(config: AlwatrFluxStateMachineConfig<S>) {\n config.loggerPrefix ??= 'flux-state-machine';\n super(config);\n\n this.initialState_ = config.initialState;\n this.message_ = {state: this.initialState_};\n setTimeout(this.resetToInitialState_.bind(this), 0);\n }\n\n private firstResetToInitialState__ = true;\n /**\n * Reset machine to initial state without notify.\n */\n protected resetToInitialState_(): Promise<void> {\n this.logger_.logMethod?.('resetToInitialState_');\n if (this.firstResetToInitialState__) {\n this.firstResetToInitialState__ = false;\n const eventDetail: StateEventDetail<S, E> = {from: this.initialState_, event: 'reset', to: this.initialState_};\n this.execAction__(`on_state_${this.initialState_}_enter`, eventDetail);\n return this.postTransition__(eventDetail);\n }\n // else {\n const from = this.message_.state;\n this.message_ = {state: this.initialState_};\n const eventDetail: StateEventDetail<S, E> = {from, event: 'reset', to: this.initialState_};\n return this.postTransition__(eventDetail);\n }\n\n /**\n * Transition condition.\n */\n protected shouldTransition_(_eventDetail: StateEventDetail<S, E>): Awaitable<boolean> {\n this.logger_.logMethodFull?.('shouldTransition_', _eventDetail, true);\n return true;\n }\n\n /**\n * Transition flux state machine instance to new state.\n */\n protected async transition_(event: E): Promise<void> {\n const fromState = this.message_.state;\n const toState = this.stateRecord_[fromState]?.[event];\n\n this.logger_.logMethodArgs?.('transition_', {fromState, event, toState});\n\n if (toState == null) {\n this.logger_.incident?.('transition', 'invalid_target_state', {\n fromState,\n event,\n });\n return;\n }\n\n const eventDetail: StateEventDetail<S, E> = {from: fromState, event, to: toState};\n\n if ((await this.shouldTransition_(eventDetail)) !== true) return;\n\n this.notify_({state: toState}); // message update but notify event delayed after execActions.\n\n this.postTransition__(eventDetail);\n }\n\n /**\n * Execute all actions for current state.\n */\n private async postTransition__(eventDetail: StateEventDetail<S, E>): Promise<void> {\n this.logger_.logMethodArgs?.('postTransition__', eventDetail);\n\n await this.execAction__(`on_event_${eventDetail.event}`, eventDetail);\n\n if (eventDetail.from !== eventDetail.to) {\n await this.execAction__(`on_any_state_exit`, eventDetail);\n await this.execAction__(`on_state_${eventDetail.from}_exit`, eventDetail);\n await this.execAction__(`on_any_state_enter`, eventDetail);\n await this.execAction__(`on_state_${eventDetail.to}_enter`, eventDetail);\n }\n\n this.execAction__(`on_state_${eventDetail.from}_event_${eventDetail.event}`, eventDetail);\n }\n\n /**\n * Execute action name if defined in _actionRecord.\n */\n private execAction__(name: ActionName<S, E | 'reset'>, eventDetail: StateEventDetail<S, E>): Awaitable<void> {\n const actionFn = this.actionRecord_[name];\n if (typeof actionFn === 'function') {\n this.logger_.logMethodArgs?.('execAction__', name);\n return actionFn.call(this, eventDetail);\n }\n }\n}\n", "import {AlwatrFluxStateMachineBase} from './base.js';\n\n/**\n * Flux (Finite) State Machine Base Class\n */\nexport abstract class AlwatrFluxStateMachine<S extends string, E extends string> extends AlwatrFluxStateMachineBase<S, E> {\n /**\n * Current state.\n */\n get state(): S {\n return this.message_.state;\n }\n\n /**\n * Transition flux state machine instance to new state.\n */\n transition(event: E): void {\n this.transition_(event);\n }\n\n /**\n * Reset machine to initial state without notify.\n */\n resetToInitialState(): void {\n this.resetToInitialState_();\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["eventDetail"]
|
|
7
7
|
}
|
package/dist/type.d.ts
CHANGED
|
@@ -4,7 +4,7 @@ export interface StateEventDetail<S extends string, E extends string> {
|
|
|
4
4
|
to: S;
|
|
5
5
|
}
|
|
6
6
|
export type StateRecord<S extends string, E extends string> = Partial<Record<S, Partial<Record<E | 'reset', S>>>>;
|
|
7
|
-
export type Action<S extends string, E extends string> = (eventDetail?: StateEventDetail<S, E | 'reset'>) =>
|
|
7
|
+
export type Action<S extends string, E extends string> = (eventDetail?: StateEventDetail<S, E | 'reset'>) => Awaitable<void>;
|
|
8
8
|
export type ActionName<S extends string, E extends string> = `on_event_${E}` | `on_any_state_exit` | `on_any_state_enter` | `on_state_${S}_exit` | `on_state_${S}_enter` | `on_state_${S}_event_${E}`;
|
|
9
9
|
export type ActionRecord<S extends string, E extends string> = Partial<Record<ActionName<S, E | 'reset'>, Action<S, E | 'reset'>>>;
|
|
10
10
|
//# sourceMappingURL=type.d.ts.map
|
package/dist/type.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"type.d.ts","sourceRoot":"","sources":["../src/type.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,gBAAgB,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,MAAM;IAClE,IAAI,EAAE,CAAC,CAAC;IACR,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC;IACnB,EAAE,EAAE,CAAC,CAAC;CACP;AAED,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAElH,MAAM,MAAM,MAAM,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,MAAM,IAAI,CAAC,WAAW,CAAC,EAAE,gBAAgB,CAAC,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,KAAK,
|
|
1
|
+
{"version":3,"file":"type.d.ts","sourceRoot":"","sources":["../src/type.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,gBAAgB,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,MAAM;IAClE,IAAI,EAAE,CAAC,CAAC;IACR,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC;IACnB,EAAE,EAAE,CAAC,CAAC;CACP;AAED,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAElH,MAAM,MAAM,MAAM,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,MAAM,IAAI,CAAC,WAAW,CAAC,EAAE,gBAAgB,CAAC,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,KAAK,SAAS,CAAC,IAAI,CAAC,CAAC;AAE7H,MAAM,MAAM,UAAU,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,MAAM,IACrD,YAAY,CAAC,EAAE,GACf,mBAAmB,GACnB,oBAAoB,GACpB,YAAY,CAAC,OAAO,GACpB,YAAY,CAAC,QAAQ,GACrB,YAAY,CAAC,UAAU,CAAC,EAAE,CAAC;AAE/B,MAAM,MAAM,YAAY,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,21 +1,22 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@alwatr/fsm",
|
|
3
|
-
"version": "4.0.4",
|
|
4
3
|
"description": "A robust TypeScript library for implementing Flux (Finite) State Machines, enabling clear and organized management of application state and transitions.",
|
|
4
|
+
"version": "4.1.0",
|
|
5
5
|
"author": "S. Ali Mihandoost <ali.mihandoost@gmail.com> (https://ali.mihandoost.com)",
|
|
6
|
-
"
|
|
7
|
-
|
|
8
|
-
"
|
|
9
|
-
"
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
"
|
|
13
|
-
"alwatr"
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
6
|
+
"bugs": "https://github.com/Alwatr/flux/issues",
|
|
7
|
+
"dependencies": {
|
|
8
|
+
"@alwatr/nanolib": "^6.0.1",
|
|
9
|
+
"@alwatr/observable": "^4.1.0"
|
|
10
|
+
},
|
|
11
|
+
"devDependencies": {
|
|
12
|
+
"@alwatr/nano-build": "^6.1.0",
|
|
13
|
+
"@alwatr/prettier-config": "^5.0.2",
|
|
14
|
+
"@alwatr/tsconfig-base": "^6.0.0",
|
|
15
|
+
"@alwatr/type-helper": "^6.0.0",
|
|
16
|
+
"@types/node": "^22.18.1",
|
|
17
|
+
"jest": "^30.1.3",
|
|
18
|
+
"typescript": "^5.9.2"
|
|
19
|
+
},
|
|
19
20
|
"exports": {
|
|
20
21
|
".": {
|
|
21
22
|
"types": "./dist/main.d.ts",
|
|
@@ -23,11 +24,24 @@
|
|
|
23
24
|
"require": "./dist/main.cjs"
|
|
24
25
|
}
|
|
25
26
|
},
|
|
26
|
-
"license": "AGPL-3.0-only",
|
|
27
27
|
"files": [
|
|
28
28
|
"**/*.{js,mjs,cjs,map,d.ts,html,md}",
|
|
29
29
|
"!demo/**/*"
|
|
30
30
|
],
|
|
31
|
+
"homepage": "https://github.com/Alwatr/flux/tree/next/packages/fsm#readme",
|
|
32
|
+
"keywords": [
|
|
33
|
+
"alwatr",
|
|
34
|
+
"esm",
|
|
35
|
+
"finite",
|
|
36
|
+
"flux",
|
|
37
|
+
"machine",
|
|
38
|
+
"state",
|
|
39
|
+
"typescript"
|
|
40
|
+
],
|
|
41
|
+
"license": "MPL-2.0",
|
|
42
|
+
"main": "./dist/main.cjs",
|
|
43
|
+
"module": "./dist/main.mjs",
|
|
44
|
+
"prettier": "@alwatr/prettier-config",
|
|
31
45
|
"publishConfig": {
|
|
32
46
|
"access": "public"
|
|
33
47
|
},
|
|
@@ -36,39 +50,23 @@
|
|
|
36
50
|
"url": "https://github.com/Alwatr/flux",
|
|
37
51
|
"directory": "packages/fsm"
|
|
38
52
|
},
|
|
39
|
-
"homepage": "https://github.com/Alwatr/flux/tree/next/packages/fsm#readme",
|
|
40
|
-
"bugs": {
|
|
41
|
-
"url": "https://github.com/Alwatr/flux/issues"
|
|
42
|
-
},
|
|
43
|
-
"prettier": "@alwatr/prettier-config",
|
|
44
53
|
"scripts": {
|
|
45
54
|
"b": "yarn run build",
|
|
46
|
-
"t": "yarn run test",
|
|
47
|
-
"w": "yarn run watch",
|
|
48
|
-
"c": "yarn run clean",
|
|
49
|
-
"cb": "yarn run clean && yarn run build",
|
|
50
|
-
"d": "yarn run build:es && yarn node --enable-source-maps --trace-warnings",
|
|
51
55
|
"build": "yarn run build:ts & yarn run build:es",
|
|
52
56
|
"build:es": "nano-build --preset=module",
|
|
53
57
|
"build:ts": "tsc --build",
|
|
58
|
+
"c": "yarn run clean",
|
|
59
|
+
"cb": "yarn run clean && yarn run build",
|
|
60
|
+
"clean": "rm -rfv dist *.tsbuildinfo",
|
|
61
|
+
"d": "yarn run build:es && yarn node --enable-source-maps --trace-warnings",
|
|
62
|
+
"t": "yarn run test",
|
|
54
63
|
"test": "NODE_OPTIONS=\"$NODE_OPTIONS --enable-source-maps --experimental-vm-modules\" jest",
|
|
64
|
+
"w": "yarn run watch",
|
|
55
65
|
"watch": "yarn run watch:ts & yarn run watch:es",
|
|
56
66
|
"watch:es": "yarn run build:es --watch",
|
|
57
|
-
"watch:ts": "yarn run build:ts --watch --preserveWatchOutput"
|
|
58
|
-
"clean": "rm -rfv dist *.tsbuildinfo"
|
|
67
|
+
"watch:ts": "yarn run build:ts --watch --preserveWatchOutput"
|
|
59
68
|
},
|
|
60
|
-
"
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
},
|
|
64
|
-
"devDependencies": {
|
|
65
|
-
"@alwatr/nano-build": "^5.5.0",
|
|
66
|
-
"@alwatr/prettier-config": "^5.0.0",
|
|
67
|
-
"@alwatr/tsconfig-base": "^5.0.0",
|
|
68
|
-
"@alwatr/type-helper": "^5.4.0",
|
|
69
|
-
"@types/node": "^22.13.9",
|
|
70
|
-
"jest": "^29.7.0",
|
|
71
|
-
"typescript": "^5.8.2"
|
|
72
|
-
},
|
|
73
|
-
"gitHead": "d6f693f97c837142a92a8b83dc0a9a608c2af01e"
|
|
69
|
+
"type": "module",
|
|
70
|
+
"types": "./dist/main.d.ts",
|
|
71
|
+
"gitHead": "200dcb5e63a3330a3060b51778dd920963b20763"
|
|
74
72
|
}
|