@uuxxx/fsm 1.1.0 → 1.2.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/dist/index.d.ts +16 -7
- package/dist/index.js +1 -1
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -4,6 +4,7 @@ type Rec<T = unknown> = Record<string, T>;
|
|
|
4
4
|
type Key = string | number | symbol;
|
|
5
5
|
type Vdx<T> = T | void;
|
|
6
6
|
type KeyOf<T extends Rec> = keyof T;
|
|
7
|
+
type EmptyArray = [];
|
|
7
8
|
type Entries<T extends Rec> = { [K in KeyOf<T>]: [K, T[K]] }[KeyOf<T>];
|
|
8
9
|
type Label = string;
|
|
9
10
|
type Transition<TState extends Label> = {
|
|
@@ -22,29 +23,37 @@ type LifecycleMethods<TState extends Label, TTransitions extends Rec<Transition<
|
|
|
22
23
|
onBeforeTransition?: CancelableLifecycleMethod<TState, TTransitions>;
|
|
23
24
|
onAfterTransition?: LifecycleMethod<TState, TTransitions>;
|
|
24
25
|
};
|
|
26
|
+
type StateMethods<TState extends Label> = {
|
|
27
|
+
state: () => TState;
|
|
28
|
+
allStates: () => TState[];
|
|
29
|
+
};
|
|
25
30
|
type ApiForPlugin<TState extends Label, TTransitions extends Rec<Transition<TState>>> = {
|
|
26
31
|
init: (listener: (state: TState) => void) => void;
|
|
27
|
-
} & { [K in KeyOf<LifecycleMethods<TState, TTransitions>>]-?: (listener: LifecycleMethods<TState, TTransitions>[K]) => Noop };
|
|
32
|
+
} & StateMethods<TState> & { [K in KeyOf<LifecycleMethods<TState, TTransitions>>]-?: (listener: LifecycleMethods<TState, TTransitions>[K]) => Noop };
|
|
28
33
|
type PluginApi = {
|
|
29
34
|
name: string;
|
|
30
35
|
api: Rec<AnyFn>;
|
|
31
36
|
};
|
|
32
37
|
type Plugin<TState extends Label = Label, TTransitions extends Rec<Transition<TState>> = Rec<Transition<TState>>> = (api: ApiForPlugin<TState, TTransitions>) => PluginApi;
|
|
33
|
-
type Config<TState extends Label, TTransitions extends Rec<Transition<TState>>, TPlugins extends Array<Plugin<TState, TTransitions>> =
|
|
38
|
+
type Config<TState extends Label, TTransitions extends Rec<Transition<TState>>, TPlugins extends Array<Plugin<TState, TTransitions>> = EmptyArray> = {
|
|
34
39
|
init: TState;
|
|
35
40
|
states: TState[];
|
|
36
41
|
transitions: TTransitions;
|
|
37
42
|
methods?: LifecycleMethods<TState, TTransitions>;
|
|
38
43
|
plugins?: TPlugins;
|
|
39
44
|
};
|
|
40
|
-
type StateMethods<TState extends Label> = {
|
|
41
|
-
state: () => TState;
|
|
42
|
-
allStates: () => TState[];
|
|
43
|
-
};
|
|
44
45
|
type TransitionMethods<TTransitions extends Rec<Transition<Label>>> = { [K in KeyOf<TTransitions>]: TTransitions[K]['to'] extends Label ? () => TTransitions[K]['to'] : TTransitions[K]['to'] };
|
|
45
46
|
type PluginsMethods<TState extends Label, TTransitions extends Rec<Transition<TState>>, TPlugins extends Array<Plugin<TState, TTransitions>>> = { [K in ReturnType<TPlugins[number]>['name']]: Extract<ReturnType<TPlugins[number]>, {
|
|
46
47
|
name: K;
|
|
47
48
|
}>['api'] };
|
|
48
49
|
type Methods<TState extends Label, TTransitions extends Rec<Transition<TState>>, TPlugins extends Array<Plugin<TState, TTransitions>>> = TransitionMethods<TTransitions> & StateMethods<TState> & PluginsMethods<TState, TTransitions, TPlugins>;
|
|
49
50
|
declare const makeFsm: <TState extends Label, TTransitions extends Rec<Transition<TState>>, TPlugins extends Array<Plugin<TState, TTransitions>>>(config: Config<TState, TTransitions, TPlugins>) => Methods<TState, TTransitions, TPlugins>;
|
|
50
|
-
|
|
51
|
+
declare const historyPlugin: <TState extends Label, TTransitions extends Rec<Transition<TState>>>() => (api: ApiForPlugin<TState, TTransitions>) => {
|
|
52
|
+
name: "history";
|
|
53
|
+
api: {
|
|
54
|
+
get(): Label[];
|
|
55
|
+
back(steps: number): Label;
|
|
56
|
+
forward(steps: number): Label;
|
|
57
|
+
};
|
|
58
|
+
};
|
|
59
|
+
export { type Config as FsmConfig, type Label as FsmLabel, type Plugin as FsmPlugin, type Transition as FsmTransition, historyPlugin as fsmHistoryPlugin, makeFsm };
|
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
let t={nlx:t=>null===t,ulx:t=>void 0===t,nil:e=>t.nlx(e)||t.ulx(e),not:{nlx:t=>null!==t,ulx:t=>void 0!==t,nil:e=>t.not.nlx(e)&&t.not.ulx(e)},array:t=>Array.isArray(t),string:t=>"string"==typeof t,function:t=>"function"==typeof t,promise:t=>t instanceof Promise,boolean:t=>"boolean"==typeof t,false:t=>!1===t,true:t=>!0===t};function e(t){return(e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}function r(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),r.push.apply(r,n)}return r}function n(t){for(var n=1;n<arguments.length;n++){var i=null!=arguments[n]?arguments[n]:{};n%2?r(Object(i),!0).forEach(function(r){!function(t,r,n){var i;(i=function(t,r){if("object"!=e(t)||!t)return t;var n=t[Symbol.toPrimitive];if(void 0!==n){var i=n.call(t,r||"default");if("object"!=e(i))return i;throw TypeError("@@toPrimitive must return a primitive value.")}return("string"===r?String:Number)(t)}(r,"string"),(r="symbol"==e(i)?i:i+"")in t)?Object.defineProperty(t,r,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[r]=n}(t,r,i[r])}):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(i)):r(Object(i)).forEach(function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(i,e))})}return t}let i=e=>{var r,i,o,l;let s,a,u,f,c,
|
|
1
|
+
let t={nlx:t=>null===t,ulx:t=>void 0===t,nil:e=>t.nlx(e)||t.ulx(e),not:{nlx:t=>null!==t,ulx:t=>void 0!==t,nil:e=>t.not.nlx(e)&&t.not.ulx(e)},array:t=>Array.isArray(t),string:t=>"string"==typeof t,function:t=>"function"==typeof t,promise:t=>t instanceof Promise,boolean:t=>"boolean"==typeof t,false:t=>!1===t,true:t=>!0===t};function e(t){return(e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}function r(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),r.push.apply(r,n)}return r}function n(t){for(var n=1;n<arguments.length;n++){var i=null!=arguments[n]?arguments[n]:{};n%2?r(Object(i),!0).forEach(function(r){!function(t,r,n){var i;(i=function(t,r){if("object"!=e(t)||!t)return t;var n=t[Symbol.toPrimitive];if(void 0!==n){var i=n.call(t,r||"default");if("object"!=e(i))return i;throw TypeError("@@toPrimitive must return a primitive value.")}return("string"===r?String:Number)(t)}(r,"string"),(r="symbol"==e(i)?i:i+"")in t)?Object.defineProperty(t,r,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[r]=n}(t,r,i[r])}):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(i)):r(Object(i)).forEach(function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(i,e))})}return t}let i=e=>{var r,i,o,l;let s,a,u,f,m,c,p,y,b,g=e.init,h=(s=new Map,{listen(t,e){var r;return s.has(t)||s.set(t,[]),null==(r=s.get(t))||r.push(e),()=>{this.unlisten(t,e)}},unlisten(t,e){let r=s.get(t);if(!r)return;let n=r.filter(t=>t!==e);n.length?s.set(t,n):s.delete(t)},emit(e,...r){var n,i;return null!=(n=null==(i=s.get(e))?void 0:i.map(t=>t(...r)).filter(t.not.ulx))?n:[]},unlistenAll(t){s.delete(t)}});Object.entries(null!=(r=e.methods)?r:{}).forEach(([t,e])=>{h.listen(t,e)}),h.listen("onAfterTransition",({to:t})=>{g=t}),h.listen("error",t=>{throw Error(`[FSM]: ${t}`)});let v={state:()=>g,allStates:()=>[...e.states]},O=(i=e.transitions,o=v.state,u={},m=f={register(e,r){let n=e=>{h.emit("onBeforeTransition",e).filter(t.boolean).every(t.true)&&h.emit("onAfterTransition",e)};return u[e]=(...i)=>{if(t.array(r.from)?!r.from.includes(o()):"*"!==r.from&&r.from!==o())return h.emit("error",`Transition: ${e} is forbidden`),o();if(a)return h.emit("error",`Transition: ${e} can't be made. Has pending transtion: ${a}`),o();if(!t.function(r.to))return n({transition:e,from:o(),to:r.to}),o();let l=r.to(...i);return t.promise(l)?(a=e,l.then(t=>(a=void 0,n({transition:e,from:o(),to:t,args:i}),o()))):(n({transition:e,from:o(),to:l,args:i}),o())},f},make:()=>u},Object.entries(i).forEach(([t,e])=>m.register(t,e)),m.make()),d=(l=e.plugins,c={},p=n({init(t){h.listen("init",t)},onBeforeTransition:t=>h.listen("onBeforeTransition",t),onAfterTransition:t=>h.listen("onAfterTransition",t)},v),b=y={register(t){let{name:e,api:r}=t(p);return e in c&&h.emit("error",`There are at least two plugins with the same name: ${e}`),c[e]=r,y},make:()=>c},(null!=l?l:[]).forEach(b.register),b.make());return h.emit("init",g),n(n(n({},v),d),O)},o=()=>t=>{let e=[],r=0;return t.init(t=>e.push(t)),t.onAfterTransition(({to:t})=>{r++,e.splice(r,e.length-r,t)}),{name:"history",api:{get:()=>e,back:t=>e[r=Math.max(0,r-t)],forward:t=>(r=Math.min(e.length-1,r+t),e[r])}}};export{o as fsmHistoryPlugin,i as makeFsm};
|