@camcima/finita 1.0.0 → 2.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.
Files changed (298) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +39 -3
  3. package/dist/index.cjs +1422 -0
  4. package/dist/index.cjs.map +1 -0
  5. package/dist/index.d.cts +525 -0
  6. package/dist/index.d.ts +525 -22
  7. package/dist/index.js +1356 -26
  8. package/dist/index.js.map +1 -1
  9. package/package.json +22 -5
  10. package/dist/Dispatcher.d.ts +0 -11
  11. package/dist/Dispatcher.d.ts.map +0 -1
  12. package/dist/Dispatcher.js +0 -30
  13. package/dist/Dispatcher.js.map +0 -1
  14. package/dist/Event.d.ts +0 -22
  15. package/dist/Event.d.ts.map +0 -1
  16. package/dist/Event.js +0 -54
  17. package/dist/Event.js.map +0 -1
  18. package/dist/MaybePromise.d.ts +0 -2
  19. package/dist/MaybePromise.d.ts.map +0 -1
  20. package/dist/MaybePromise.js +0 -2
  21. package/dist/MaybePromise.js.map +0 -1
  22. package/dist/Process.d.ts +0 -15
  23. package/dist/Process.d.ts.map +0 -1
  24. package/dist/Process.js +0 -43
  25. package/dist/Process.js.map +0 -1
  26. package/dist/State.d.ts +0 -22
  27. package/dist/State.d.ts.map +0 -1
  28. package/dist/State.js +0 -65
  29. package/dist/State.js.map +0 -1
  30. package/dist/StateCollection.d.ts +0 -14
  31. package/dist/StateCollection.d.ts.map +0 -1
  32. package/dist/StateCollection.js +0 -37
  33. package/dist/StateCollection.js.map +0 -1
  34. package/dist/Statemachine.d.ts +0 -45
  35. package/dist/Statemachine.d.ts.map +0 -1
  36. package/dist/Statemachine.js +0 -206
  37. package/dist/Statemachine.js.map +0 -1
  38. package/dist/Transition.d.ts +0 -19
  39. package/dist/Transition.d.ts.map +0 -1
  40. package/dist/Transition.js +0 -46
  41. package/dist/Transition.js.map +0 -1
  42. package/dist/condition/AndComposite.d.ts +0 -9
  43. package/dist/condition/AndComposite.d.ts.map +0 -1
  44. package/dist/condition/AndComposite.js +0 -23
  45. package/dist/condition/AndComposite.js.map +0 -1
  46. package/dist/condition/CallbackCondition.d.ts +0 -11
  47. package/dist/condition/CallbackCondition.d.ts.map +0 -1
  48. package/dist/condition/CallbackCondition.js +0 -15
  49. package/dist/condition/CallbackCondition.js.map +0 -1
  50. package/dist/condition/Contradiction.d.ts +0 -8
  51. package/dist/condition/Contradiction.d.ts.map +0 -1
  52. package/dist/condition/Contradiction.js +0 -13
  53. package/dist/condition/Contradiction.js.map +0 -1
  54. package/dist/condition/Not.d.ts +0 -8
  55. package/dist/condition/Not.d.ts.map +0 -1
  56. package/dist/condition/Not.js +0 -13
  57. package/dist/condition/Not.js.map +0 -1
  58. package/dist/condition/OrComposite.d.ts +0 -9
  59. package/dist/condition/OrComposite.d.ts.map +0 -1
  60. package/dist/condition/OrComposite.js +0 -23
  61. package/dist/condition/OrComposite.js.map +0 -1
  62. package/dist/condition/Tautology.d.ts +0 -8
  63. package/dist/condition/Tautology.d.ts.map +0 -1
  64. package/dist/condition/Tautology.js +0 -13
  65. package/dist/condition/Tautology.js.map +0 -1
  66. package/dist/condition/Timeout.d.ts +0 -10
  67. package/dist/condition/Timeout.d.ts.map +0 -1
  68. package/dist/condition/Timeout.js +0 -30
  69. package/dist/condition/Timeout.js.map +0 -1
  70. package/dist/condition/index.d.ts +0 -9
  71. package/dist/condition/index.d.ts.map +0 -1
  72. package/dist/condition/index.js +0 -8
  73. package/dist/condition/index.js.map +0 -1
  74. package/dist/error/DuplicateStateError.d.ts +0 -5
  75. package/dist/error/DuplicateStateError.d.ts.map +0 -1
  76. package/dist/error/DuplicateStateError.js +0 -9
  77. package/dist/error/DuplicateStateError.js.map +0 -1
  78. package/dist/error/LockCanNotBeAcquiredError.d.ts +0 -4
  79. package/dist/error/LockCanNotBeAcquiredError.d.ts.map +0 -1
  80. package/dist/error/LockCanNotBeAcquiredError.js +0 -7
  81. package/dist/error/LockCanNotBeAcquiredError.js.map +0 -1
  82. package/dist/error/WrongEventForStateError.d.ts +0 -6
  83. package/dist/error/WrongEventForStateError.d.ts.map +0 -1
  84. package/dist/error/WrongEventForStateError.js +0 -11
  85. package/dist/error/WrongEventForStateError.js.map +0 -1
  86. package/dist/error/index.d.ts +0 -4
  87. package/dist/error/index.d.ts.map +0 -1
  88. package/dist/error/index.js +0 -4
  89. package/dist/error/index.js.map +0 -1
  90. package/dist/factory/AbstractNamedProcessDetector.d.ts +0 -10
  91. package/dist/factory/AbstractNamedProcessDetector.d.ts.map +0 -1
  92. package/dist/factory/AbstractNamedProcessDetector.js +0 -18
  93. package/dist/factory/AbstractNamedProcessDetector.js.map +0 -1
  94. package/dist/factory/Factory.d.ts +0 -22
  95. package/dist/factory/Factory.d.ts.map +0 -1
  96. package/dist/factory/Factory.js +0 -42
  97. package/dist/factory/Factory.js.map +0 -1
  98. package/dist/factory/SingleProcessDetector.d.ts +0 -8
  99. package/dist/factory/SingleProcessDetector.d.ts.map +0 -1
  100. package/dist/factory/SingleProcessDetector.js +0 -10
  101. package/dist/factory/SingleProcessDetector.js.map +0 -1
  102. package/dist/factory/StatefulStateNameDetector.d.ts +0 -5
  103. package/dist/factory/StatefulStateNameDetector.d.ts.map +0 -1
  104. package/dist/factory/StatefulStateNameDetector.js +0 -15
  105. package/dist/factory/StatefulStateNameDetector.js.map +0 -1
  106. package/dist/factory/index.d.ts +0 -5
  107. package/dist/factory/index.d.ts.map +0 -1
  108. package/dist/factory/index.js +0 -5
  109. package/dist/factory/index.js.map +0 -1
  110. package/dist/filter/ActiveTransitionFilter.d.ts +0 -6
  111. package/dist/filter/ActiveTransitionFilter.d.ts.map +0 -1
  112. package/dist/filter/ActiveTransitionFilter.js +0 -12
  113. package/dist/filter/ActiveTransitionFilter.js.map +0 -1
  114. package/dist/filter/FilterStateByEvent.d.ts +0 -5
  115. package/dist/filter/FilterStateByEvent.d.ts.map +0 -1
  116. package/dist/filter/FilterStateByEvent.js +0 -10
  117. package/dist/filter/FilterStateByEvent.js.map +0 -1
  118. package/dist/filter/FilterStateByFinalState.d.ts +0 -5
  119. package/dist/filter/FilterStateByFinalState.d.ts.map +0 -1
  120. package/dist/filter/FilterStateByFinalState.js +0 -15
  121. package/dist/filter/FilterStateByFinalState.js.map +0 -1
  122. package/dist/filter/FilterStateByTransition.d.ts +0 -8
  123. package/dist/filter/FilterStateByTransition.d.ts.map +0 -1
  124. package/dist/filter/FilterStateByTransition.js +0 -16
  125. package/dist/filter/FilterStateByTransition.js.map +0 -1
  126. package/dist/filter/FilterTransitionByEvent.d.ts +0 -5
  127. package/dist/filter/FilterTransitionByEvent.d.ts.map +0 -1
  128. package/dist/filter/FilterTransitionByEvent.js +0 -10
  129. package/dist/filter/FilterTransitionByEvent.js.map +0 -1
  130. package/dist/filter/index.d.ts +0 -6
  131. package/dist/filter/index.d.ts.map +0 -1
  132. package/dist/filter/index.js +0 -6
  133. package/dist/filter/index.js.map +0 -1
  134. package/dist/graph/GraphBuilder.d.ts +0 -37
  135. package/dist/graph/GraphBuilder.d.ts.map +0 -1
  136. package/dist/graph/GraphBuilder.js +0 -132
  137. package/dist/graph/GraphBuilder.js.map +0 -1
  138. package/dist/graph/index.d.ts +0 -3
  139. package/dist/graph/index.d.ts.map +0 -1
  140. package/dist/graph/index.js +0 -2
  141. package/dist/graph/index.js.map +0 -1
  142. package/dist/index.d.ts.map +0 -1
  143. package/dist/interfaces/ConditionInterface.d.ts +0 -6
  144. package/dist/interfaces/ConditionInterface.d.ts.map +0 -1
  145. package/dist/interfaces/ConditionInterface.js +0 -2
  146. package/dist/interfaces/ConditionInterface.js.map +0 -1
  147. package/dist/interfaces/DispatcherInterface.d.ts +0 -11
  148. package/dist/interfaces/DispatcherInterface.d.ts.map +0 -1
  149. package/dist/interfaces/DispatcherInterface.js +0 -2
  150. package/dist/interfaces/DispatcherInterface.js.map +0 -1
  151. package/dist/interfaces/EventInterface.d.ts +0 -12
  152. package/dist/interfaces/EventInterface.d.ts.map +0 -1
  153. package/dist/interfaces/EventInterface.js +0 -2
  154. package/dist/interfaces/EventInterface.js.map +0 -1
  155. package/dist/interfaces/FactoryInterface.d.ts +0 -13
  156. package/dist/interfaces/FactoryInterface.d.ts.map +0 -1
  157. package/dist/interfaces/FactoryInterface.js +0 -2
  158. package/dist/interfaces/FactoryInterface.js.map +0 -1
  159. package/dist/interfaces/LastStateHasChangedDateInterface.d.ts +0 -4
  160. package/dist/interfaces/LastStateHasChangedDateInterface.d.ts.map +0 -1
  161. package/dist/interfaces/LastStateHasChangedDateInterface.js +0 -2
  162. package/dist/interfaces/LastStateHasChangedDateInterface.js.map +0 -1
  163. package/dist/interfaces/LockAdapterInterface.d.ts +0 -7
  164. package/dist/interfaces/LockAdapterInterface.d.ts.map +0 -1
  165. package/dist/interfaces/LockAdapterInterface.js +0 -2
  166. package/dist/interfaces/LockAdapterInterface.js.map +0 -1
  167. package/dist/interfaces/LoggerInterface.d.ts +0 -4
  168. package/dist/interfaces/LoggerInterface.d.ts.map +0 -1
  169. package/dist/interfaces/LoggerInterface.js +0 -2
  170. package/dist/interfaces/LoggerInterface.js.map +0 -1
  171. package/dist/interfaces/Metadata.d.ts +0 -4
  172. package/dist/interfaces/Metadata.d.ts.map +0 -1
  173. package/dist/interfaces/Metadata.js +0 -2
  174. package/dist/interfaces/Metadata.js.map +0 -1
  175. package/dist/interfaces/MutexFactoryInterface.d.ts +0 -6
  176. package/dist/interfaces/MutexFactoryInterface.d.ts.map +0 -1
  177. package/dist/interfaces/MutexFactoryInterface.js +0 -2
  178. package/dist/interfaces/MutexFactoryInterface.js.map +0 -1
  179. package/dist/interfaces/MutexInterface.d.ts +0 -8
  180. package/dist/interfaces/MutexInterface.d.ts.map +0 -1
  181. package/dist/interfaces/MutexInterface.js +0 -2
  182. package/dist/interfaces/MutexInterface.js.map +0 -1
  183. package/dist/interfaces/Named.d.ts +0 -4
  184. package/dist/interfaces/Named.d.ts.map +0 -1
  185. package/dist/interfaces/Named.js +0 -2
  186. package/dist/interfaces/Named.js.map +0 -1
  187. package/dist/interfaces/Observer.d.ts +0 -11
  188. package/dist/interfaces/Observer.d.ts.map +0 -1
  189. package/dist/interfaces/Observer.js +0 -2
  190. package/dist/interfaces/Observer.js.map +0 -1
  191. package/dist/interfaces/ProcessDetectorInterface.d.ts +0 -5
  192. package/dist/interfaces/ProcessDetectorInterface.d.ts.map +0 -1
  193. package/dist/interfaces/ProcessDetectorInterface.js +0 -2
  194. package/dist/interfaces/ProcessDetectorInterface.js.map +0 -1
  195. package/dist/interfaces/ProcessInterface.d.ts +0 -7
  196. package/dist/interfaces/ProcessInterface.d.ts.map +0 -1
  197. package/dist/interfaces/ProcessInterface.js +0 -2
  198. package/dist/interfaces/ProcessInterface.js.map +0 -1
  199. package/dist/interfaces/StateCollectionInterface.d.ts +0 -7
  200. package/dist/interfaces/StateCollectionInterface.d.ts.map +0 -1
  201. package/dist/interfaces/StateCollectionInterface.js +0 -2
  202. package/dist/interfaces/StateCollectionInterface.js.map +0 -1
  203. package/dist/interfaces/StateInterface.d.ts +0 -16
  204. package/dist/interfaces/StateInterface.d.ts.map +0 -1
  205. package/dist/interfaces/StateInterface.js +0 -2
  206. package/dist/interfaces/StateInterface.js.map +0 -1
  207. package/dist/interfaces/StateNameDetectorInterface.d.ts +0 -4
  208. package/dist/interfaces/StateNameDetectorInterface.d.ts.map +0 -1
  209. package/dist/interfaces/StateNameDetectorInterface.js +0 -2
  210. package/dist/interfaces/StateNameDetectorInterface.js.map +0 -1
  211. package/dist/interfaces/StatefulInterface.d.ts +0 -5
  212. package/dist/interfaces/StatefulInterface.d.ts.map +0 -1
  213. package/dist/interfaces/StatefulInterface.js +0 -2
  214. package/dist/interfaces/StatefulInterface.js.map +0 -1
  215. package/dist/interfaces/StatemachineInterface.d.ts +0 -20
  216. package/dist/interfaces/StatemachineInterface.d.ts.map +0 -1
  217. package/dist/interfaces/StatemachineInterface.js +0 -2
  218. package/dist/interfaces/StatemachineInterface.js.map +0 -1
  219. package/dist/interfaces/TransitionInterface.d.ts +0 -12
  220. package/dist/interfaces/TransitionInterface.d.ts.map +0 -1
  221. package/dist/interfaces/TransitionInterface.js +0 -2
  222. package/dist/interfaces/TransitionInterface.js.map +0 -1
  223. package/dist/interfaces/TransitionSelectorInterface.d.ts +0 -5
  224. package/dist/interfaces/TransitionSelectorInterface.d.ts.map +0 -1
  225. package/dist/interfaces/TransitionSelectorInterface.js +0 -2
  226. package/dist/interfaces/TransitionSelectorInterface.js.map +0 -1
  227. package/dist/interfaces/Weighted.d.ts +0 -4
  228. package/dist/interfaces/Weighted.d.ts.map +0 -1
  229. package/dist/interfaces/Weighted.js +0 -2
  230. package/dist/interfaces/Weighted.js.map +0 -1
  231. package/dist/interfaces/index.d.ts +0 -24
  232. package/dist/interfaces/index.d.ts.map +0 -1
  233. package/dist/interfaces/index.js +0 -2
  234. package/dist/interfaces/index.js.map +0 -1
  235. package/dist/mutex/LockAdapterMutex.d.ts +0 -13
  236. package/dist/mutex/LockAdapterMutex.d.ts.map +0 -1
  237. package/dist/mutex/LockAdapterMutex.js +0 -32
  238. package/dist/mutex/LockAdapterMutex.js.map +0 -1
  239. package/dist/mutex/MutexFactory.d.ts +0 -11
  240. package/dist/mutex/MutexFactory.d.ts.map +0 -1
  241. package/dist/mutex/MutexFactory.js +0 -13
  242. package/dist/mutex/MutexFactory.js.map +0 -1
  243. package/dist/mutex/NullMutex.d.ts +0 -9
  244. package/dist/mutex/NullMutex.d.ts.map +0 -1
  245. package/dist/mutex/NullMutex.js +0 -18
  246. package/dist/mutex/NullMutex.js.map +0 -1
  247. package/dist/mutex/index.d.ts +0 -5
  248. package/dist/mutex/index.d.ts.map +0 -1
  249. package/dist/mutex/index.js +0 -4
  250. package/dist/mutex/index.js.map +0 -1
  251. package/dist/observer/CallbackObserver.d.ts +0 -8
  252. package/dist/observer/CallbackObserver.d.ts.map +0 -1
  253. package/dist/observer/CallbackObserver.js +0 -14
  254. package/dist/observer/CallbackObserver.js.map +0 -1
  255. package/dist/observer/OnEnterObserver.d.ts +0 -8
  256. package/dist/observer/OnEnterObserver.d.ts.map +0 -1
  257. package/dist/observer/OnEnterObserver.js +0 -28
  258. package/dist/observer/OnEnterObserver.js.map +0 -1
  259. package/dist/observer/StatefulStatusChanger.d.ts +0 -5
  260. package/dist/observer/StatefulStatusChanger.d.ts.map +0 -1
  261. package/dist/observer/StatefulStatusChanger.js +0 -24
  262. package/dist/observer/StatefulStatusChanger.js.map +0 -1
  263. package/dist/observer/TransitionLogger.d.ts +0 -9
  264. package/dist/observer/TransitionLogger.d.ts.map +0 -1
  265. package/dist/observer/TransitionLogger.js +0 -62
  266. package/dist/observer/TransitionLogger.js.map +0 -1
  267. package/dist/observer/index.d.ts +0 -5
  268. package/dist/observer/index.d.ts.map +0 -1
  269. package/dist/observer/index.js +0 -5
  270. package/dist/observer/index.js.map +0 -1
  271. package/dist/selector/OneOrNoneActiveTransition.d.ts +0 -6
  272. package/dist/selector/OneOrNoneActiveTransition.d.ts.map +0 -1
  273. package/dist/selector/OneOrNoneActiveTransition.js +0 -14
  274. package/dist/selector/OneOrNoneActiveTransition.js.map +0 -1
  275. package/dist/selector/ScoreTransition.d.ts +0 -9
  276. package/dist/selector/ScoreTransition.d.ts.map +0 -1
  277. package/dist/selector/ScoreTransition.js +0 -33
  278. package/dist/selector/ScoreTransition.js.map +0 -1
  279. package/dist/selector/WeightTransition.d.ts +0 -9
  280. package/dist/selector/WeightTransition.d.ts.map +0 -1
  281. package/dist/selector/WeightTransition.js +0 -26
  282. package/dist/selector/WeightTransition.js.map +0 -1
  283. package/dist/selector/index.d.ts +0 -4
  284. package/dist/selector/index.d.ts.map +0 -1
  285. package/dist/selector/index.js +0 -4
  286. package/dist/selector/index.js.map +0 -1
  287. package/dist/util/SetupHelper.d.ts +0 -17
  288. package/dist/util/SetupHelper.d.ts.map +0 -1
  289. package/dist/util/SetupHelper.js +0 -48
  290. package/dist/util/SetupHelper.js.map +0 -1
  291. package/dist/util/StateCollectionMerger.d.ts +0 -23
  292. package/dist/util/StateCollectionMerger.d.ts.map +0 -1
  293. package/dist/util/StateCollectionMerger.js +0 -83
  294. package/dist/util/StateCollectionMerger.js.map +0 -1
  295. package/dist/util/index.d.ts +0 -3
  296. package/dist/util/index.d.ts.map +0 -1
  297. package/dist/util/index.js +0 -3
  298. package/dist/util/index.js.map +0 -1
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,eAAe;AACf,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AA8B7C,aAAa;AACb,OAAO,EACL,SAAS,EACT,aAAa,EACb,iBAAiB,EACjB,OAAO,EACP,YAAY,EACZ,WAAW,EACX,GAAG,GACJ,MAAM,sBAAsB,CAAC;AAG9B,YAAY;AACZ,OAAO,EACL,gBAAgB,EAChB,qBAAqB,EACrB,eAAe,EACf,gBAAgB,GACjB,MAAM,qBAAqB,CAAC;AAE7B,UAAU;AACV,OAAO,EACL,sBAAsB,EACtB,kBAAkB,EAClB,uBAAuB,EACvB,uBAAuB,EACvB,uBAAuB,GACxB,MAAM,mBAAmB,CAAC;AAE3B,YAAY;AACZ,OAAO,EACL,yBAAyB,EACzB,eAAe,EACf,gBAAgB,GACjB,MAAM,qBAAqB,CAAC;AAE7B,QAAQ;AACR,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAG7E,UAAU;AACV,OAAO,EACL,OAAO,EACP,qBAAqB,EACrB,4BAA4B,EAC5B,yBAAyB,GAC1B,MAAM,oBAAoB,CAAC;AAE5B,QAAQ;AACR,OAAO,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAErE,QAAQ;AACR,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAShD,SAAS;AACT,OAAO,EACL,uBAAuB,EACvB,yBAAyB,EACzB,mBAAmB,GACpB,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"sources":["../src/Event.ts","../src/State.ts","../src/Transition.ts","../src/util/StateCollectionMerger.ts","../src/error/DuplicateStateError.ts","../src/StateCollection.ts","../src/Process.ts","../src/selector/OneOrNoneActiveTransition.ts","../src/mutex/NullMutex.ts","../src/Dispatcher.ts","../src/filter/ActiveTransitionFilter.ts","../src/error/WrongEventForStateError.ts","../src/error/LockCanNotBeAcquiredError.ts","../src/Statemachine.ts","../src/condition/Tautology.ts","../src/condition/Contradiction.ts","../src/condition/CallbackCondition.ts","../src/condition/Timeout.ts","../src/condition/AndComposite.ts","../src/condition/OrComposite.ts","../src/condition/Not.ts","../src/observer/CallbackObserver.ts","../src/observer/StatefulStatusChanger.ts","../src/observer/OnEnterObserver.ts","../src/observer/TransitionLogger.ts","../src/filter/FilterStateByEvent.ts","../src/filter/FilterStateByTransition.ts","../src/filter/FilterStateByFinalState.ts","../src/filter/FilterTransitionByEvent.ts","../src/selector/ScoreTransition.ts","../src/selector/WeightTransition.ts","../src/mutex/LockAdapterMutex.ts","../src/mutex/MutexFactory.ts","../src/factory/Factory.ts","../src/factory/SingleProcessDetector.ts","../src/factory/AbstractNamedProcessDetector.ts","../src/factory/StatefulStateNameDetector.ts","../src/util/SetupHelper.ts","../src/graph/GraphBuilder.ts"],"sourcesContent":["import type { EventInterface } from \"./interfaces/EventInterface.js\";\nimport type { Observer } from \"./interfaces/Observer.js\";\n\nexport class Event implements EventInterface {\n private readonly name: string;\n private readonly observers: Set<Observer> = new Set();\n private readonly metadata: Map<string, unknown> = new Map();\n private invokeArgs: unknown[] = [];\n\n constructor(name: string) {\n this.name = name;\n }\n\n getName(): string {\n return this.name;\n }\n\n getInvokeArgs(): unknown[] {\n return this.invokeArgs;\n }\n\n async invoke(...args: unknown[]): Promise<void> {\n this.invokeArgs = args;\n try {\n await this.notify();\n } finally {\n this.invokeArgs = [];\n }\n }\n\n attach(observer: Observer): void {\n this.observers.add(observer);\n }\n\n detach(observer: Observer): void {\n this.observers.delete(observer);\n }\n\n async notify(): Promise<void> {\n for (const observer of this.observers) {\n await observer.update(this);\n }\n }\n\n getObservers(): Iterable<Observer> {\n return this.observers;\n }\n\n getMetadata(): Record<string, unknown> {\n return Object.fromEntries(this.metadata);\n }\n\n getMetadataValue(key: string): unknown {\n return this.metadata.get(key);\n }\n\n setMetadataValue(key: string, value: unknown): void {\n this.metadata.set(key, value);\n }\n\n hasMetadataValue(key: string): boolean {\n return this.metadata.has(key);\n }\n\n deleteMetadataValue(key: string): void {\n this.metadata.delete(key);\n }\n}\n","import type { StateInterface } from \"./interfaces/StateInterface.js\";\nimport type { TransitionInterface } from \"./interfaces/TransitionInterface.js\";\nimport type { EventInterface } from \"./interfaces/EventInterface.js\";\nimport { Event } from \"./Event.js\";\n\nexport class State implements StateInterface {\n private readonly name: string;\n private readonly transitions: Set<TransitionInterface> = new Set();\n private readonly events: Map<string, EventInterface> = new Map();\n private readonly metadata: Map<string, unknown> = new Map();\n\n constructor(name: string) {\n this.name = name;\n }\n\n getName(): string {\n return this.name;\n }\n\n getTransitions(): Iterable<TransitionInterface> {\n return this.transitions;\n }\n\n addTransition(transition: TransitionInterface): void {\n if (this.transitions.has(transition)) {\n return;\n }\n const targetName = transition.getTargetState().getName();\n const eventName = transition.getEventName();\n const conditionName = transition.getConditionName();\n for (const existing of this.transitions) {\n if (\n existing.getTargetState().getName() === targetName &&\n existing.getEventName() === eventName &&\n existing.getConditionName() === conditionName\n ) {\n return;\n }\n }\n this.transitions.add(transition);\n if (eventName) {\n this.getEvent(eventName);\n }\n }\n\n getEventNames(): string[] {\n return Array.from(this.events.keys());\n }\n\n hasEvent(name: string): boolean {\n return this.events.has(name);\n }\n\n getEvent(name: string): EventInterface {\n let event = this.events.get(name);\n if (!event) {\n event = new Event(name);\n this.events.set(name, event);\n }\n return event;\n }\n\n getMetadata(): Record<string, unknown> {\n return Object.fromEntries(this.metadata);\n }\n\n getMetadataValue(key: string): unknown {\n return this.metadata.get(key);\n }\n\n setMetadataValue(key: string, value: unknown): void {\n this.metadata.set(key, value);\n }\n\n hasMetadataValue(key: string): boolean {\n return this.metadata.has(key);\n }\n\n deleteMetadataValue(key: string): void {\n this.metadata.delete(key);\n }\n}\n","import type { TransitionInterface } from \"./interfaces/TransitionInterface.js\";\nimport type { StateInterface } from \"./interfaces/StateInterface.js\";\nimport type { EventInterface } from \"./interfaces/EventInterface.js\";\nimport type { ConditionInterface } from \"./interfaces/ConditionInterface.js\";\n\nexport class Transition<\n TSubject = unknown,\n> implements TransitionInterface<TSubject> {\n private readonly targetState: StateInterface;\n private readonly eventName: string | null;\n private readonly condition: ConditionInterface<TSubject> | null;\n private weight: number = 1;\n\n constructor(\n targetState: StateInterface,\n eventName: string | null = null,\n condition: ConditionInterface<TSubject> | null = null,\n ) {\n this.targetState = targetState;\n this.eventName = eventName;\n this.condition = condition;\n }\n\n getTargetState(): StateInterface {\n return this.targetState;\n }\n\n getEventName(): string | null {\n return this.eventName;\n }\n\n getConditionName(): string | null {\n if (this.condition) {\n return this.condition.getName();\n }\n return null;\n }\n\n getCondition(): ConditionInterface<TSubject> | null {\n return this.condition;\n }\n\n async isActive(\n subject: TSubject,\n context: Map<string, unknown>,\n event?: EventInterface,\n ): Promise<boolean> {\n let result: boolean;\n if (event) {\n result = event.getName() === this.eventName;\n } else {\n result = this.eventName === null;\n }\n if (this.condition && result) {\n result = await this.condition.checkCondition(subject, context);\n }\n return result;\n }\n\n getWeight(): number {\n return this.weight;\n }\n\n setWeight(weight: number): void {\n this.weight = weight;\n }\n}\n","import type { StateCollectionInterface } from \"../interfaces/StateCollectionInterface.js\";\nimport type { StateInterface } from \"../interfaces/StateInterface.js\";\nimport type { TransitionInterface } from \"../interfaces/TransitionInterface.js\";\nimport type { ConditionInterface } from \"../interfaces/ConditionInterface.js\";\nimport { State } from \"../State.js\";\nimport { Transition } from \"../Transition.js\";\nimport { StateCollection } from \"../StateCollection.js\";\n\nexport class StateCollectionMerger {\n private readonly targetCollection: StateCollection;\n private stateNamePrefix = \"\";\n\n constructor(targetCollection: StateCollection) {\n this.targetCollection = targetCollection;\n }\n\n getStateNamePrefix(): string {\n return this.stateNamePrefix;\n }\n\n setStateNamePrefix(prefix: string): void {\n this.stateNamePrefix = prefix;\n }\n\n getTargetCollection(): StateCollection {\n return this.targetCollection;\n }\n\n protected createState(name: string): StateInterface {\n return new State(name);\n }\n\n protected findOrCreateState(name: string): StateInterface {\n const prefixedName = this.stateNamePrefix + name;\n if (this.targetCollection.hasState(prefixedName)) {\n return this.targetCollection.getState(prefixedName);\n }\n const state = this.createState(prefixedName);\n this.targetCollection.addState(state);\n return state;\n }\n\n protected createCondition(\n sourceTransition: TransitionInterface,\n ): ConditionInterface | null {\n return sourceTransition.getCondition();\n }\n\n protected createTransition(\n sourceTransition: TransitionInterface,\n ): Transition {\n const targetStateName = sourceTransition.getTargetState().getName();\n const targetState = this.findOrCreateState(targetStateName);\n this.mergeMetadata(sourceTransition.getTargetState(), targetState);\n const eventName = sourceTransition.getEventName();\n const condition = this.createCondition(sourceTransition);\n const transition = new Transition(targetState, eventName, condition);\n transition.setWeight(sourceTransition.getWeight());\n return transition;\n }\n\n protected mergeMetadata(\n source: StateInterface,\n target: StateInterface,\n ): void {\n const metadata = source.getMetadata();\n for (const [key, value] of Object.entries(metadata)) {\n target.setMetadataValue(key, value);\n }\n }\n\n protected mergeEvent(\n source: StateInterface,\n target: StateInterface,\n eventName: string,\n ): void {\n const sourceEvent = source.getEvent(eventName);\n const targetEvent = target.getEvent(eventName);\n\n const sourceMetadata = sourceEvent.getMetadata();\n for (const [key, value] of Object.entries(sourceMetadata)) {\n targetEvent.setMetadataValue(key, value);\n }\n\n for (const observer of sourceEvent.getObservers()) {\n targetEvent.attach(observer);\n }\n }\n\n protected mergeState(sourceState: StateInterface): void {\n const targetState = this.findOrCreateState(sourceState.getName());\n this.mergeMetadata(sourceState, targetState);\n\n for (const sourceTransition of sourceState.getTransitions()) {\n const targetTransition = this.createTransition(sourceTransition);\n targetState.addTransition(targetTransition);\n }\n\n for (const eventName of sourceState.getEventNames()) {\n this.mergeEvent(sourceState, targetState, eventName);\n }\n }\n\n merge(source: StateCollectionInterface | StateInterface): void {\n if (\"getStates\" in source && typeof source.getStates === \"function\") {\n const collection = source as StateCollectionInterface;\n for (const state of collection.getStates()) {\n this.mergeState(state);\n }\n } else {\n this.mergeState(source as StateInterface);\n }\n }\n}\n","export class DuplicateStateError extends Error {\n readonly stateName: string;\n\n constructor(stateName: string) {\n super(\n `There is already a different state with name \"${stateName}\" in this collection`,\n );\n this.name = \"DuplicateStateError\";\n this.stateName = stateName;\n }\n}\n","import type { StateCollectionInterface } from \"./interfaces/StateCollectionInterface.js\";\nimport type { StateInterface } from \"./interfaces/StateInterface.js\";\nimport { StateCollectionMerger } from \"./util/StateCollectionMerger.js\";\nimport { DuplicateStateError } from \"./error/DuplicateStateError.js\";\n\nexport class StateCollection implements StateCollectionInterface {\n private readonly states: Map<string, StateInterface> = new Map();\n private stateCollectionMerger: StateCollectionMerger | null = null;\n\n getState(name: string): StateInterface {\n const state = this.states.get(name);\n if (!state) {\n throw new Error(`State \"${name}\" not found`);\n }\n return state;\n }\n\n getStates(): Iterable<StateInterface> {\n return this.states.values();\n }\n\n hasState(name: string): boolean {\n return this.states.has(name);\n }\n\n addState(state: StateInterface): void {\n const existing = this.states.get(state.getName());\n if (existing && existing !== state) {\n throw new DuplicateStateError(state.getName());\n }\n this.states.set(state.getName(), state);\n }\n\n getStateCollectionMerger(): StateCollectionMerger {\n if (!this.stateCollectionMerger) {\n this.stateCollectionMerger = new StateCollectionMerger(this);\n }\n return this.stateCollectionMerger;\n }\n\n merge(source: StateCollectionInterface): void {\n const merger = this.getStateCollectionMerger();\n merger.merge(source);\n }\n}\n","import type { ProcessInterface } from \"./interfaces/ProcessInterface.js\";\nimport type { StateInterface } from \"./interfaces/StateInterface.js\";\nimport type { TransitionInterface } from \"./interfaces/TransitionInterface.js\";\nimport { StateCollection } from \"./StateCollection.js\";\nimport { DuplicateStateError } from \"./error/DuplicateStateError.js\";\n\nexport class Process implements ProcessInterface {\n private readonly name: string;\n private readonly initialState: StateInterface;\n private readonly states: StateCollection;\n\n constructor(name: string, initialState: StateInterface) {\n this.name = name;\n this.initialState = initialState;\n this.states = new StateCollection();\n this.registerState(initialState);\n }\n\n private registerState(state: StateInterface): void {\n const name = state.getName();\n if (this.states.hasState(name)) {\n if (this.states.getState(name) !== state) {\n throw new DuplicateStateError(name);\n }\n return;\n }\n this.states.addState(state);\n for (const transition of state.getTransitions()) {\n const targetState = (transition as TransitionInterface).getTargetState();\n this.registerState(targetState);\n }\n }\n\n getName(): string {\n return this.name;\n }\n\n getInitialState(): StateInterface {\n return this.initialState;\n }\n\n getStates(): Iterable<StateInterface> {\n return this.states.getStates();\n }\n\n getState(name: string): StateInterface {\n return this.states.getState(name);\n }\n\n hasState(name: string): boolean {\n return this.states.hasState(name);\n }\n}\n","import type { TransitionSelectorInterface } from \"../interfaces/TransitionSelectorInterface.js\";\nimport type { TransitionInterface } from \"../interfaces/TransitionInterface.js\";\n\nexport class OneOrNoneActiveTransition<\n TSubject = unknown,\n> implements TransitionSelectorInterface<TSubject> {\n selectTransition(\n transitions: Iterable<TransitionInterface<TSubject>>,\n ): TransitionInterface<TSubject> | null {\n const arr = Array.from(transitions);\n switch (arr.length) {\n case 0:\n return null;\n case 1:\n return arr[0];\n default:\n throw new Error(\"More than one transition is active!\");\n }\n }\n}\n","import type { MutexInterface } from \"../interfaces/MutexInterface.js\";\n\nexport class NullMutex implements MutexInterface {\n private acquired = false;\n\n acquireLock(): boolean {\n this.acquired = true;\n return true;\n }\n\n releaseLock(): boolean {\n this.acquired = false;\n return true;\n }\n\n isAcquired(): boolean {\n return this.acquired;\n }\n\n isLocked(): boolean {\n return false;\n }\n}\n","import type {\n DispatcherInterface,\n CallbackInterface,\n} from \"./interfaces/DispatcherInterface.js\";\nimport type { EventInterface } from \"./interfaces/EventInterface.js\";\n\nexport class Dispatcher implements DispatcherInterface {\n private commands: Array<{ event: EventInterface; args: unknown[] }> = [];\n private onReadyCallbacks: CallbackInterface[] = [];\n private ready = false;\n\n dispatch(\n event: EventInterface,\n args: unknown[] = [],\n onReadyCallback?: CallbackInterface,\n ): void {\n if (this.ready) {\n throw new Error(\"Was already invoked!\");\n }\n this.commands.push({ event, args });\n if (onReadyCallback) {\n this.onReadyCallbacks.push(onReadyCallback);\n }\n }\n\n async invoke(): Promise<void> {\n if (this.ready) {\n throw new Error(\"Was already invoked!\");\n }\n for (const { event, args } of this.commands) {\n await event.invoke(...args);\n }\n this.ready = true;\n for (const callback of this.onReadyCallbacks) {\n await callback.invoke();\n }\n }\n\n isReady(): boolean {\n return this.ready;\n }\n}\n","import type { TransitionInterface } from \"../interfaces/TransitionInterface.js\";\nimport type { EventInterface } from \"../interfaces/EventInterface.js\";\n\nexport class ActiveTransitionFilter {\n static async filter<TSubject = unknown>(\n transitions: Iterable<TransitionInterface<TSubject>>,\n subject: TSubject,\n context: Map<string, unknown>,\n event?: EventInterface,\n ): Promise<TransitionInterface<TSubject>[]> {\n const active: TransitionInterface<TSubject>[] = [];\n for (const transition of transitions) {\n if (await transition.isActive(subject, context, event)) {\n active.push(transition);\n }\n }\n return active;\n }\n}\n","export class WrongEventForStateError extends Error {\n readonly stateName: string;\n readonly eventName: string;\n\n constructor(stateName: string, eventName: string) {\n super(`Current state \"${stateName}\" doesn't have event \"${eventName}\"`);\n this.name = \"WrongEventForStateError\";\n this.stateName = stateName;\n this.eventName = eventName;\n }\n}\n","export class LockCanNotBeAcquiredError extends Error {\n constructor(message = \"Lock can not be acquired!\") {\n super(message);\n this.name = \"LockCanNotBeAcquiredError\";\n }\n}\n","import type { StatemachineInterface } from \"./interfaces/StatemachineInterface.js\";\nimport type { StateInterface } from \"./interfaces/StateInterface.js\";\nimport type { ProcessInterface } from \"./interfaces/ProcessInterface.js\";\nimport type { TransitionInterface } from \"./interfaces/TransitionInterface.js\";\nimport type { EventInterface } from \"./interfaces/EventInterface.js\";\nimport type { MutexInterface } from \"./interfaces/MutexInterface.js\";\nimport type { TransitionSelectorInterface } from \"./interfaces/TransitionSelectorInterface.js\";\nimport type { DispatcherInterface } from \"./interfaces/DispatcherInterface.js\";\nimport type { Observer } from \"./interfaces/Observer.js\";\nimport type { Named } from \"./interfaces/Named.js\";\nimport { OneOrNoneActiveTransition } from \"./selector/OneOrNoneActiveTransition.js\";\nimport { NullMutex } from \"./mutex/NullMutex.js\";\nimport { Dispatcher } from \"./Dispatcher.js\";\nimport { ActiveTransitionFilter } from \"./filter/ActiveTransitionFilter.js\";\nimport { WrongEventForStateError } from \"./error/WrongEventForStateError.js\";\nimport { LockCanNotBeAcquiredError } from \"./error/LockCanNotBeAcquiredError.js\";\n\nexport class Statemachine<\n TSubject = unknown,\n> implements StatemachineInterface<TSubject> {\n private readonly subject: TSubject;\n private currentState: StateInterface;\n private lastState: StateInterface | null = null;\n private readonly transitionSelector: TransitionSelectorInterface<TSubject>;\n private selectedTransition: TransitionInterface<TSubject> | null = null;\n private readonly process: ProcessInterface;\n private readonly mutex: MutexInterface;\n private autoreleaseLock = true;\n private dispatcher: DispatcherInterface | null = null;\n private currentEvent: EventInterface | null = null;\n private currentContext: Map<string, unknown> | null = null;\n private readonly observers: Set<Observer> = new Set();\n\n constructor(\n subject: TSubject,\n process: ProcessInterface,\n stateName?: string | null,\n transitionSelector?: TransitionSelectorInterface<TSubject> | null,\n mutex?: MutexInterface | null,\n ) {\n this.subject = subject;\n if (stateName) {\n this.currentState = process.getState(stateName);\n } else {\n this.currentState = process.getInitialState();\n }\n this.transitionSelector =\n transitionSelector ?? new OneOrNoneActiveTransition();\n this.process = process;\n this.mutex = mutex ?? new NullMutex();\n }\n\n getProcess(): ProcessInterface {\n return this.process;\n }\n\n getCurrentState(): StateInterface {\n return this.currentState;\n }\n\n getLastState(): StateInterface | null {\n return this.lastState;\n }\n\n getSubject(): TSubject {\n return this.subject;\n }\n\n getSelectedTransition(): TransitionInterface<TSubject> | null {\n return this.selectedTransition;\n }\n\n getCurrentContext(): Map<string, unknown> | null {\n return this.currentContext;\n }\n\n private async doCheckTransitions(\n context: Map<string, unknown>,\n event?: EventInterface,\n automaticVisited?: Set<StateInterface>,\n ): Promise<void> {\n try {\n const transitions = this.currentState.getTransitions();\n const activeTransitions = await ActiveTransitionFilter.filter(\n transitions,\n this.subject,\n context,\n event,\n );\n this.selectedTransition =\n this.transitionSelector.selectTransition(activeTransitions);\n if (this.selectedTransition) {\n const targetState = this.selectedTransition.getTargetState();\n if (this.selectedTransition.getEventName() === null) {\n if (!automaticVisited) {\n automaticVisited = new Set<StateInterface>();\n }\n automaticVisited.add(this.currentState);\n if (automaticVisited.has(targetState)) {\n throw new Error(\n `Automatic transition cycle detected: state \"${targetState.getName()}\" was already visited — this would cause infinite recursion`,\n );\n }\n }\n if (this.currentState !== targetState) {\n this.lastState = this.currentState;\n this.currentState = targetState;\n this.currentContext = context;\n this.currentEvent = event ?? null;\n try {\n await this.notify();\n } finally {\n this.currentContext = null;\n this.currentEvent = null;\n this.selectedTransition = null;\n this.lastState = null;\n }\n }\n await this.doCheckTransitions(context, undefined, automaticVisited);\n }\n } catch (error) {\n let message = `Exception was thrown when doing a transition from current state \"${this.currentState.getName()}\"`;\n if (this.currentEvent) {\n message += ` with event \"${this.currentEvent.getName()}\"`;\n }\n const named = this.subject as Named;\n if (named && typeof named.getName === \"function\") {\n message += ` for \"${named.getName()}\"`;\n }\n throw new Error(message, { cause: error });\n }\n }\n\n private async onDispatcherReady(): Promise<void> {\n if (this.dispatcher && this.dispatcher.isReady()) {\n const context = this.currentContext!;\n const event = this.currentEvent ?? undefined;\n this.dispatcher = null;\n this.currentContext = null;\n this.currentEvent = null;\n try {\n await this.doCheckTransitions(context, event);\n } finally {\n if (this.autoreleaseLock && this.isLockAcquired()) {\n await this.releaseLock();\n }\n }\n }\n }\n\n async dispatchEvent(\n dispatcher: DispatcherInterface,\n name: string,\n context?: Map<string, unknown>,\n ): Promise<void> {\n if (this.dispatcher) {\n throw new Error(\"Event dispatching is still running!\");\n }\n if (this.currentState.hasEvent(name)) {\n await this.acquireLockOrThrowException();\n try {\n this.dispatcher = dispatcher;\n this.currentContext = context ?? new Map();\n this.currentEvent = this.currentState.getEvent(name);\n dispatcher.dispatch(\n this.currentEvent,\n [this.subject, this.currentContext],\n { invoke: () => this.onDispatcherReady() },\n );\n } catch (error) {\n this.dispatcher = null;\n this.currentContext = null;\n this.currentEvent = null;\n if (this.autoreleaseLock) {\n await this.releaseLock();\n }\n throw error;\n }\n } else {\n throw new WrongEventForStateError(this.currentState.getName(), name);\n }\n }\n\n async triggerEvent(\n name: string,\n context?: Map<string, unknown>,\n ): Promise<void> {\n const dispatcher = new Dispatcher();\n try {\n await this.dispatchEvent(dispatcher, name, context);\n await dispatcher.invoke();\n } finally {\n this.dispatcher = null;\n this.currentContext = null;\n this.currentEvent = null;\n if (this.autoreleaseLock && this.isLockAcquired()) {\n await this.releaseLock();\n }\n }\n }\n\n async checkTransitions(context?: Map<string, unknown>): Promise<void> {\n await this.acquireLockOrThrowException();\n const ctx = context ?? new Map();\n try {\n await this.doCheckTransitions(ctx);\n } finally {\n if (this.autoreleaseLock && this.isLockAcquired()) {\n await this.releaseLock();\n }\n }\n }\n\n private async acquireLockOrThrowException(): Promise<void> {\n if (!(await this.acquireLock())) {\n throw new LockCanNotBeAcquiredError(\"Lock can not be acquired!\");\n }\n }\n\n isAutoreleaseLock(): boolean {\n return this.autoreleaseLock;\n }\n\n setAutoreleaseLock(autorelease: boolean): void {\n this.autoreleaseLock = autorelease;\n }\n\n async acquireLock(): Promise<boolean> {\n if (this.mutex.isAcquired()) {\n return true;\n }\n return this.mutex.acquireLock();\n }\n\n async releaseLock(): Promise<void> {\n await this.mutex.releaseLock();\n }\n\n isLockAcquired(): boolean {\n return this.mutex.isAcquired();\n }\n\n attach(observer: Observer): void {\n this.observers.add(observer);\n }\n\n detach(observer: Observer): void {\n this.observers.delete(observer);\n }\n\n async notify(): Promise<void> {\n for (const observer of this.observers) {\n await observer.update(this);\n }\n }\n\n getObservers(): Iterable<Observer> {\n return this.observers;\n }\n}\n","import type { ConditionInterface } from \"../interfaces/ConditionInterface.js\";\n\nexport class Tautology implements ConditionInterface {\n private readonly name: string;\n\n constructor(name = \"Tautology\") {\n this.name = name;\n }\n\n getName(): string {\n return this.name;\n }\n\n checkCondition(_subject: unknown, _context: Map<string, unknown>): boolean {\n return true;\n }\n}\n","import type { ConditionInterface } from \"../interfaces/ConditionInterface.js\";\n\nexport class Contradiction implements ConditionInterface {\n private readonly name: string;\n\n constructor(name = \"Contradiction\") {\n this.name = name;\n }\n\n getName(): string {\n return this.name;\n }\n\n checkCondition(_subject: unknown, _context: Map<string, unknown>): boolean {\n return false;\n }\n}\n","import type { ConditionInterface } from \"../interfaces/ConditionInterface.js\";\nimport type { MaybePromise } from \"../MaybePromise.js\";\n\nexport type ConditionCallbackFn<TSubject = unknown> = (\n subject: TSubject,\n context: Map<string, unknown>,\n) => MaybePromise<boolean>;\n\nexport class CallbackCondition<\n TSubject = unknown,\n> implements ConditionInterface<TSubject> {\n private readonly name: string;\n private readonly callable: ConditionCallbackFn<TSubject>;\n\n constructor(name: string, callable: ConditionCallbackFn<TSubject>) {\n this.name = name;\n this.callable = callable;\n }\n\n getName(): string {\n return this.name;\n }\n\n checkCondition(\n subject: TSubject,\n context: Map<string, unknown>,\n ): MaybePromise<boolean> {\n return this.callable(subject, context);\n }\n}\n","import type { ConditionInterface } from \"../interfaces/ConditionInterface.js\";\nimport type { LastStateHasChangedDateInterface } from \"../interfaces/LastStateHasChangedDateInterface.js\";\n\nfunction isLastStateHasChangedDate(\n obj: unknown,\n): obj is LastStateHasChangedDateInterface {\n return (\n typeof obj === \"object\" &&\n obj !== null &&\n \"getLastStateHasChangedDate\" in obj &&\n typeof (obj as LastStateHasChangedDateInterface)\n .getLastStateHasChangedDate === \"function\"\n );\n}\n\nexport class Timeout implements ConditionInterface {\n private readonly timeoutMs: number;\n private readonly label: string;\n\n constructor(timeoutMs: number, label?: string) {\n this.timeoutMs = timeoutMs;\n this.label = label ?? `${timeoutMs}ms`;\n }\n\n getName(): string {\n return `Timeout: ${this.label}`;\n }\n\n protected getLastStateHasChangedDate(\n subject: unknown,\n _context: Map<string, unknown>,\n ): Date {\n if (isLastStateHasChangedDate(subject)) {\n return subject.getLastStateHasChangedDate();\n }\n throw new Error(\"Subject must implement LastStateHasChangedDateInterface\");\n }\n\n checkCondition(subject: unknown, context: Map<string, unknown>): boolean {\n const date = new Date(\n this.getLastStateHasChangedDate(subject, context).getTime(),\n );\n date.setTime(date.getTime() + this.timeoutMs);\n return date <= new Date();\n }\n}\n","import type { ConditionInterface } from \"../interfaces/ConditionInterface.js\";\n\nexport class AndComposite<\n TSubject = unknown,\n> implements ConditionInterface<TSubject> {\n private readonly conditions: ConditionInterface<TSubject>[] = [];\n\n constructor(condition: ConditionInterface<TSubject>) {\n this.conditions.push(condition);\n }\n\n addAnd(condition: ConditionInterface<TSubject>): this {\n this.conditions.push(condition);\n return this;\n }\n\n getName(): string {\n const names = this.conditions.map((c) => c.getName());\n return `(${names.join(\" and \")})`;\n }\n\n async checkCondition(\n subject: TSubject,\n context: Map<string, unknown>,\n ): Promise<boolean> {\n for (const condition of this.conditions) {\n if (!(await condition.checkCondition(subject, context))) {\n return false;\n }\n }\n return true;\n }\n}\n","import type { ConditionInterface } from \"../interfaces/ConditionInterface.js\";\n\nexport class OrComposite<\n TSubject = unknown,\n> implements ConditionInterface<TSubject> {\n private readonly conditions: ConditionInterface<TSubject>[] = [];\n\n constructor(condition: ConditionInterface<TSubject>) {\n this.conditions.push(condition);\n }\n\n addOr(condition: ConditionInterface<TSubject>): this {\n this.conditions.push(condition);\n return this;\n }\n\n getName(): string {\n const names = this.conditions.map((c) => c.getName());\n return `(${names.join(\" or \")})`;\n }\n\n async checkCondition(\n subject: TSubject,\n context: Map<string, unknown>,\n ): Promise<boolean> {\n for (const condition of this.conditions) {\n if (await condition.checkCondition(subject, context)) {\n return true;\n }\n }\n return false;\n }\n}\n","import type { ConditionInterface } from \"../interfaces/ConditionInterface.js\";\n\nexport class Not<TSubject = unknown> implements ConditionInterface<TSubject> {\n private readonly condition: ConditionInterface<TSubject>;\n\n constructor(condition: ConditionInterface<TSubject>) {\n this.condition = condition;\n }\n\n getName(): string {\n return `not ( ${this.condition.getName()} )`;\n }\n\n async checkCondition(\n subject: TSubject,\n context: Map<string, unknown>,\n ): Promise<boolean> {\n return !(await this.condition.checkCondition(subject, context));\n }\n}\n","import type { Observer, ObservableSubject } from \"../interfaces/Observer.js\";\nimport type { EventInterface } from \"../interfaces/EventInterface.js\";\nimport type { MaybePromise } from \"../MaybePromise.js\";\n\nexport class CallbackObserver implements Observer {\n private readonly callback: (...args: unknown[]) => MaybePromise<void>;\n\n constructor(callback: (...args: unknown[]) => MaybePromise<void>) {\n this.callback = callback;\n }\n\n update(subject: ObservableSubject): MaybePromise<void> {\n const event = subject as EventInterface;\n if (typeof event.getInvokeArgs === \"function\") {\n return this.callback(...event.getInvokeArgs());\n }\n return this.callback(subject);\n }\n}\n","import type { Observer, ObservableSubject } from \"../interfaces/Observer.js\";\nimport type { StatemachineInterface } from \"../interfaces/StatemachineInterface.js\";\nimport type { StatefulInterface } from \"../interfaces/StatefulInterface.js\";\n\nfunction isStatemachine(obj: unknown): obj is StatemachineInterface {\n return (\n typeof obj === \"object\" &&\n obj !== null &&\n \"getCurrentState\" in obj &&\n \"getSubject\" in obj\n );\n}\n\nfunction isStateful(obj: unknown): obj is StatefulInterface {\n return (\n typeof obj === \"object\" &&\n obj !== null &&\n \"setCurrentStateName\" in obj &&\n typeof (obj as StatefulInterface).setCurrentStateName === \"function\"\n );\n}\n\nexport class StatefulStatusChanger implements Observer {\n update(subject: ObservableSubject): void {\n if (isStatemachine(subject)) {\n const subjectObj = subject.getSubject();\n if (isStateful(subjectObj)) {\n const stateName = subject.getCurrentState().getName();\n subjectObj.setCurrentStateName(stateName);\n }\n }\n }\n}\n","import type { Observer, ObservableSubject } from \"../interfaces/Observer.js\";\nimport type { StatemachineInterface } from \"../interfaces/StatemachineInterface.js\";\n\nfunction isStatemachine(obj: unknown): obj is StatemachineInterface {\n return (\n typeof obj === \"object\" &&\n obj !== null &&\n \"getCurrentState\" in obj &&\n \"triggerEvent\" in obj\n );\n}\n\nexport class OnEnterObserver implements Observer {\n static readonly DEFAULT_EVENT_NAME = \"onEnter\";\n\n private readonly eventName: string;\n\n constructor(eventName = OnEnterObserver.DEFAULT_EVENT_NAME) {\n this.eventName = eventName;\n }\n\n async update(subject: ObservableSubject): Promise<void> {\n if (\n isStatemachine(subject) &&\n subject.getCurrentState().hasEvent(this.eventName)\n ) {\n const sm = subject as StatemachineInterface;\n const autorelease = sm.isAutoreleaseLock();\n sm.setAutoreleaseLock(false);\n try {\n await sm.triggerEvent(\n this.eventName,\n sm.getCurrentContext() ?? undefined,\n );\n } finally {\n sm.setAutoreleaseLock(autorelease);\n }\n }\n }\n}\n","import type { Observer, ObservableSubject } from \"../interfaces/Observer.js\";\nimport type { StatemachineInterface } from \"../interfaces/StatemachineInterface.js\";\nimport type { LoggerInterface } from \"../interfaces/LoggerInterface.js\";\nimport type { Named } from \"../interfaces/Named.js\";\n\nfunction isStatemachine(obj: unknown): obj is StatemachineInterface {\n return (\n typeof obj === \"object\" &&\n obj !== null &&\n \"getCurrentState\" in obj &&\n \"getSubject\" in obj\n );\n}\n\nfunction isNamed(obj: unknown): obj is Named {\n return (\n typeof obj === \"object\" &&\n obj !== null &&\n \"getName\" in obj &&\n typeof (obj as Named).getName === \"function\"\n );\n}\n\nfunction convertToString(obj: unknown): string {\n if (isNamed(obj)) {\n return obj.getName();\n }\n return String(obj);\n}\n\nexport class TransitionLogger implements Observer {\n private readonly logger: LoggerInterface;\n private readonly loggerLevel: string;\n\n constructor(logger: LoggerInterface, loggerLevel = \"info\") {\n this.logger = logger;\n this.loggerLevel = loggerLevel;\n }\n\n update(subject: ObservableSubject): void {\n if (!isStatemachine(subject)) {\n return;\n }\n\n const context: Record<string, unknown> = {};\n context[\"subject\"] = subject.getSubject();\n context[\"currentState\"] = subject.getCurrentState();\n context[\"lastState\"] = subject.getLastState();\n context[\"transition\"] = subject.getSelectedTransition();\n\n let message = \"Transition\";\n\n if (context[\"subject\"] != null) {\n message += ` for \"${convertToString(context[\"subject\"])}\"`;\n }\n\n if (context[\"lastState\"] != null) {\n message += ` from \"${convertToString(context[\"lastState\"])}\"`;\n }\n\n if (context[\"currentState\"] != null) {\n message += ` to \"${convertToString(context[\"currentState\"])}\"`;\n }\n\n const transition = context[\"transition\"] as {\n getEventName?: () => string | null;\n getConditionName?: () => string | null;\n } | null;\n if (transition && typeof transition.getEventName === \"function\") {\n const eventName = transition.getEventName();\n const condition = transition.getConditionName?.();\n if (eventName || condition) {\n message += \" with\";\n if (eventName) {\n message += ` event \"${eventName}\"`;\n }\n if (condition) {\n message += ` condition \"${condition}\"`;\n }\n }\n }\n\n this.logger.log(this.loggerLevel, message, context);\n }\n}\n","import type { StateInterface } from \"../interfaces/StateInterface.js\";\n\nexport class FilterStateByEvent {\n static *filter(\n states: Iterable<StateInterface>,\n eventName: string,\n ): Iterable<StateInterface> {\n for (const state of states) {\n if (state.hasEvent(eventName)) {\n yield state;\n }\n }\n }\n}\n","import type { StateInterface } from \"../interfaces/StateInterface.js\";\n\n/**\n * Filters states that have at least one automatic transition (no event name).\n */\nexport class FilterStateByTransition {\n static *filter(states: Iterable<StateInterface>): Iterable<StateInterface> {\n for (const state of states) {\n for (const transition of state.getTransitions()) {\n if (!transition.getEventName()) {\n yield state;\n break;\n }\n }\n }\n }\n}\n","import type { StateInterface } from \"../interfaces/StateInterface.js\";\n\nexport class FilterStateByFinalState {\n static *filter(states: Iterable<StateInterface>): Iterable<StateInterface> {\n for (const state of states) {\n let count = 0;\n for (const _transition of state.getTransitions()) {\n count++;\n break;\n }\n if (count === 0) {\n yield state;\n }\n }\n }\n}\n","import type { TransitionInterface } from \"../interfaces/TransitionInterface.js\";\n\nexport class FilterTransitionByEvent {\n static *filter(\n transitions: Iterable<TransitionInterface>,\n eventName: string,\n ): Iterable<TransitionInterface> {\n for (const transition of transitions) {\n if (transition.getEventName() === eventName) {\n yield transition;\n }\n }\n }\n}\n","import type { TransitionSelectorInterface } from \"../interfaces/TransitionSelectorInterface.js\";\nimport type { TransitionInterface } from \"../interfaces/TransitionInterface.js\";\nimport { OneOrNoneActiveTransition } from \"./OneOrNoneActiveTransition.js\";\n\nexport class ScoreTransition<\n TSubject = unknown,\n> implements TransitionSelectorInterface<TSubject> {\n private readonly innerSelector: TransitionSelectorInterface<TSubject>;\n\n constructor(innerSelector?: TransitionSelectorInterface<TSubject>) {\n this.innerSelector =\n innerSelector ?? new OneOrNoneActiveTransition<TSubject>();\n }\n\n protected calculateScore(transition: TransitionInterface<TSubject>): number {\n let score = 0;\n if (transition.getEventName()) {\n score += 2;\n }\n if (transition.getConditionName()) {\n score += 1;\n }\n return score;\n }\n\n selectTransition(\n transitions: Iterable<TransitionInterface<TSubject>>,\n ): TransitionInterface<TSubject> | null {\n let bestTransitions: TransitionInterface<TSubject>[] = [];\n let bestScore = -1;\n for (const transition of transitions) {\n const score = this.calculateScore(transition);\n if (score > bestScore) {\n bestScore = score;\n bestTransitions = [transition];\n } else if (score === bestScore) {\n bestTransitions.push(transition);\n }\n }\n return this.innerSelector.selectTransition(bestTransitions);\n }\n}\n","import type { TransitionSelectorInterface } from \"../interfaces/TransitionSelectorInterface.js\";\nimport type { TransitionInterface } from \"../interfaces/TransitionInterface.js\";\nimport { OneOrNoneActiveTransition } from \"./OneOrNoneActiveTransition.js\";\n\nexport class WeightTransition<\n TSubject = unknown,\n> implements TransitionSelectorInterface<TSubject> {\n private readonly innerSelector: TransitionSelectorInterface<TSubject>;\n private readonly epsilon: number;\n\n constructor(\n innerSelector?: TransitionSelectorInterface<TSubject>,\n epsilon = 0.001,\n ) {\n this.innerSelector =\n innerSelector ?? new OneOrNoneActiveTransition<TSubject>();\n this.epsilon = epsilon;\n }\n\n selectTransition(\n transitions: Iterable<TransitionInterface<TSubject>>,\n ): TransitionInterface<TSubject> | null {\n let bestTransitions: TransitionInterface<TSubject>[] = [];\n let bestWeight: number | null = null;\n for (const transition of transitions) {\n const weight = transition.getWeight();\n const diff = weight - (bestWeight ?? 0);\n if (bestWeight === null || diff >= this.epsilon) {\n bestWeight = weight;\n bestTransitions = [transition];\n } else if (Math.abs(diff) < this.epsilon) {\n bestTransitions.push(transition);\n }\n }\n return this.innerSelector.selectTransition(bestTransitions);\n }\n}\n","import type { MutexInterface } from \"../interfaces/MutexInterface.js\";\nimport type { LockAdapterInterface } from \"../interfaces/LockAdapterInterface.js\";\n\nexport class LockAdapterMutex implements MutexInterface {\n private readonly lockAdapter: LockAdapterInterface;\n private readonly resourceName: string;\n private acquired = false;\n\n constructor(lockAdapter: LockAdapterInterface, resourceName: string) {\n this.lockAdapter = lockAdapter;\n this.resourceName = resourceName;\n }\n\n async acquireLock(): Promise<boolean> {\n if (!this.acquired) {\n this.acquired = await this.lockAdapter.acquireLock(this.resourceName);\n }\n return this.acquired;\n }\n\n async releaseLock(): Promise<boolean> {\n if (this.acquired) {\n const result = await this.lockAdapter.releaseLock(this.resourceName);\n if (result) {\n this.acquired = false;\n }\n return result;\n }\n return false;\n }\n\n isAcquired(): boolean {\n return this.acquired;\n }\n\n async isLocked(): Promise<boolean> {\n return this.lockAdapter.isLocked(this.resourceName);\n }\n}\n","import type { MutexFactoryInterface } from \"../interfaces/MutexFactoryInterface.js\";\nimport type { MutexInterface } from \"../interfaces/MutexInterface.js\";\nimport type { LockAdapterInterface } from \"../interfaces/LockAdapterInterface.js\";\nimport { LockAdapterMutex } from \"./LockAdapterMutex.js\";\n\nexport type StringConverter<TSubject = unknown> = (subject: TSubject) => string;\n\nexport class MutexFactory<\n TSubject = unknown,\n> implements MutexFactoryInterface<TSubject> {\n private readonly lockAdapter: LockAdapterInterface;\n private readonly stringConverter: StringConverter<TSubject>;\n\n constructor(\n lockAdapter: LockAdapterInterface,\n stringConverter: StringConverter<TSubject>,\n ) {\n this.lockAdapter = lockAdapter;\n this.stringConverter = stringConverter;\n }\n\n createMutex(subject: TSubject): MutexInterface {\n return new LockAdapterMutex(\n this.lockAdapter,\n this.stringConverter(subject),\n );\n }\n}\n","import type { FactoryInterface } from \"../interfaces/FactoryInterface.js\";\nimport type { ProcessDetectorInterface } from \"../interfaces/ProcessDetectorInterface.js\";\nimport type { StateNameDetectorInterface } from \"../interfaces/StateNameDetectorInterface.js\";\nimport type { TransitionSelectorInterface } from \"../interfaces/TransitionSelectorInterface.js\";\nimport type { MutexFactoryInterface } from \"../interfaces/MutexFactoryInterface.js\";\nimport type { StatemachineInterface } from \"../interfaces/StatemachineInterface.js\";\nimport type { Observer } from \"../interfaces/Observer.js\";\nimport { Statemachine } from \"../Statemachine.js\";\n\nexport class Factory<TSubject = unknown> implements FactoryInterface<TSubject> {\n private readonly processDetector: ProcessDetectorInterface<TSubject>;\n private readonly stateNameDetector: StateNameDetectorInterface<TSubject> | null;\n private readonly statemachineObservers: Set<Observer> = new Set();\n private transitionSelector: TransitionSelectorInterface<TSubject> | null =\n null;\n private mutexFactory: MutexFactoryInterface<TSubject> | null = null;\n\n constructor(\n processDetector: ProcessDetectorInterface<TSubject>,\n stateNameDetector?: StateNameDetectorInterface<TSubject> | null,\n ) {\n this.processDetector = processDetector;\n this.stateNameDetector = stateNameDetector ?? null;\n }\n\n setMutexFactory(factory: MutexFactoryInterface<TSubject> | null): void {\n this.mutexFactory = factory;\n }\n\n setTransitionSelector(selector: TransitionSelectorInterface<TSubject>): void {\n this.transitionSelector = selector;\n }\n\n attachStatemachineObserver(observer: Observer): void {\n this.statemachineObservers.add(observer);\n }\n\n detachStatemachineObserver(observer: Observer): void {\n this.statemachineObservers.delete(observer);\n }\n\n getStatemachineObservers(): Iterable<Observer> {\n return this.statemachineObservers;\n }\n\n async createStatemachine(\n subject: TSubject,\n ): Promise<StatemachineInterface<TSubject>> {\n const process = this.processDetector.detectProcess(subject);\n\n const stateName = this.stateNameDetector\n ? this.stateNameDetector.detectCurrentStateName(subject)\n : null;\n\n const mutex = this.mutexFactory\n ? await this.mutexFactory.createMutex(subject)\n : null;\n\n const statemachine = new Statemachine(\n subject,\n process,\n stateName,\n this.transitionSelector,\n mutex,\n );\n\n for (const observer of this.statemachineObservers) {\n statemachine.attach(observer);\n }\n\n return statemachine;\n }\n}\n","import type { ProcessDetectorInterface } from \"../interfaces/ProcessDetectorInterface.js\";\nimport type { ProcessInterface } from \"../interfaces/ProcessInterface.js\";\n\nexport class SingleProcessDetector<\n TSubject = unknown,\n> implements ProcessDetectorInterface<TSubject> {\n private readonly process: ProcessInterface;\n\n constructor(process: ProcessInterface) {\n this.process = process;\n }\n\n detectProcess(_subject: TSubject): ProcessInterface {\n return this.process;\n }\n}\n","import type { ProcessDetectorInterface } from \"../interfaces/ProcessDetectorInterface.js\";\nimport type { ProcessInterface } from \"../interfaces/ProcessInterface.js\";\n\nexport abstract class AbstractNamedProcessDetector<\n TSubject = unknown,\n> implements ProcessDetectorInterface<TSubject> {\n private readonly processes: Map<string, ProcessInterface> = new Map();\n\n protected abstract detectProcessName(subject: TSubject): string;\n\n addProcess(process: ProcessInterface): void {\n this.processes.set(process.getName(), process);\n }\n\n hasProcess(name: string): boolean {\n return this.processes.has(name);\n }\n\n detectProcess(subject: TSubject): ProcessInterface {\n const name = this.detectProcessName(subject);\n const process = this.processes.get(name);\n if (!process) {\n throw new Error(`Process \"${name}\" not found`);\n }\n return process;\n }\n}\n","import type { StateNameDetectorInterface } from \"../interfaces/StateNameDetectorInterface.js\";\nimport type { StatefulInterface } from \"../interfaces/StatefulInterface.js\";\n\nfunction isStateful(obj: unknown): obj is StatefulInterface {\n return (\n typeof obj === \"object\" &&\n obj !== null &&\n \"getCurrentStateName\" in obj &&\n typeof (obj as StatefulInterface).getCurrentStateName === \"function\"\n );\n}\n\nexport class StatefulStateNameDetector implements StateNameDetectorInterface<StatefulInterface> {\n detectCurrentStateName(subject: StatefulInterface): string | null {\n if (isStateful(subject)) {\n return subject.getCurrentStateName();\n }\n throw new Error(\"Subject has to implement the StatefulInterface!\");\n }\n}\n","import type { StateInterface } from \"../interfaces/StateInterface.js\";\nimport type { TransitionInterface } from \"../interfaces/TransitionInterface.js\";\nimport type { ConditionInterface } from \"../interfaces/ConditionInterface.js\";\nimport type { EventInterface } from \"../interfaces/EventInterface.js\";\nimport type { Observer } from \"../interfaces/Observer.js\";\nimport { State } from \"../State.js\";\nimport { Transition } from \"../Transition.js\";\nimport { StateCollection } from \"../StateCollection.js\";\n\nexport class SetupHelper {\n protected readonly stateCollection: StateCollection;\n\n constructor(stateCollection: StateCollection) {\n this.stateCollection = stateCollection;\n }\n\n findOrCreateState(name: string): StateInterface {\n if (!this.stateCollection.hasState(name)) {\n this.stateCollection.addState(new State(name));\n }\n return this.stateCollection.getState(name);\n }\n\n protected findTransition(\n sourceState: StateInterface,\n targetState: StateInterface,\n eventName: string | null = null,\n condition: ConditionInterface | null = null,\n ): TransitionInterface | null {\n const conditionName = condition ? condition.getName() : null;\n for (const transition of sourceState.getTransitions()) {\n const hasSameTargetState = transition.getTargetState() === targetState;\n const hasSameCondition = transition.getConditionName() === conditionName;\n const hasSameEvent = transition.getEventName() === eventName;\n if (hasSameTargetState && hasSameCondition && hasSameEvent) {\n return transition;\n }\n }\n return null;\n }\n\n findOrCreateTransition(\n sourceStateName: string,\n targetStateName: string,\n eventName: string | null = null,\n condition: ConditionInterface | null = null,\n ): TransitionInterface {\n const sourceState = this.findOrCreateState(sourceStateName);\n const targetState = this.findOrCreateState(targetStateName);\n let transition = this.findTransition(\n sourceState,\n targetState,\n eventName,\n condition,\n );\n if (!transition) {\n transition = new Transition(targetState, eventName, condition);\n sourceState.addTransition(transition);\n }\n return transition;\n }\n\n findOrCreateEvent(\n sourceStateName: string,\n eventName: string,\n ): EventInterface {\n const sourceState = this.findOrCreateState(sourceStateName);\n return sourceState.getEvent(eventName);\n }\n\n addCommand(\n sourceStateName: string,\n eventName: string,\n command: Observer,\n ): void {\n this.findOrCreateEvent(sourceStateName, eventName).attach(command);\n }\n\n addCommandAndSelfTransition(\n sourceStateName: string,\n eventName: string,\n command: Observer,\n ): void {\n this.addCommand(sourceStateName, eventName, command);\n this.findOrCreateTransition(sourceStateName, sourceStateName, eventName);\n }\n}\n","import type { StateInterface } from \"../interfaces/StateInterface.js\";\nimport type { TransitionInterface } from \"../interfaces/TransitionInterface.js\";\nimport type { StateCollectionInterface } from \"../interfaces/StateCollectionInterface.js\";\nimport type { Named } from \"../interfaces/Named.js\";\n\nexport interface GraphNode {\n id: string;\n label: string;\n metadata: Record<string, unknown>;\n}\n\nexport interface GraphEdge {\n source: string;\n target: string;\n label: string;\n metadata: Record<string, unknown>;\n}\n\nexport interface Graph {\n nodes: GraphNode[];\n edges: GraphEdge[];\n}\n\nfunction isNamed(obj: unknown): obj is Named {\n return (\n typeof obj === \"object\" &&\n obj !== null &&\n \"getName\" in obj &&\n typeof (obj as Named).getName === \"function\"\n );\n}\n\nfunction escapeDoubleQuotes(str: string): string {\n return str.replace(/\"/g, '\\\\\"');\n}\n\nfunction toMermaidId(name: string): string {\n return (\n \"s_\" +\n name.replace(\n /[^a-zA-Z0-9]/g,\n (ch) => `_${ch.charCodeAt(0).toString(16).padStart(4, \"0\")}`,\n )\n );\n}\n\nfunction escapeMermaidLabel(str: string): string {\n return str.replace(/\"/g, \"#quot;\");\n}\n\nfunction convertToString(obj: unknown): string {\n if (isNamed(obj)) {\n return obj.getName();\n }\n return String(obj);\n}\n\nexport interface DotOptions {\n rankdir?: string;\n}\n\nexport interface MermaidOptions {\n direction?: string;\n}\n\nexport class GraphBuilder {\n private readonly nodes: Map<string, GraphNode> = new Map();\n private readonly edges: GraphEdge[] = [];\n\n private getOrCreateNode(state: StateInterface): GraphNode {\n const name = state.getName();\n let node = this.nodes.get(name);\n if (!node) {\n node = { id: name, label: name, metadata: state.getMetadata() };\n this.nodes.set(name, node);\n }\n return node;\n }\n\n protected getTransitionLabel(\n state: StateInterface,\n transition: TransitionInterface,\n ): string {\n const parts: string[] = [];\n const eventName = transition.getEventName();\n if (eventName) {\n parts.push(`E: ${eventName}`);\n const event = state.getEvent(eventName);\n const observerNames: string[] = [];\n for (const observer of event.getObservers()) {\n observerNames.push(convertToString(observer));\n }\n if (observerNames.length > 0) {\n parts.push(`C: ${observerNames.join(\", \")}`);\n }\n }\n const conditionName = transition.getConditionName();\n if (conditionName) {\n parts.push(`IF: ${conditionName}`);\n }\n parts.push(`W: ${transition.getWeight()}`);\n return parts.join(\"\\n\");\n }\n\n addState(state: StateInterface): void {\n this.getOrCreateNode(state);\n for (const transition of state.getTransitions()) {\n const sourceNode = this.getOrCreateNode(state);\n const targetNode = this.getOrCreateNode(transition.getTargetState());\n const label = this.getTransitionLabel(state, transition);\n const metadata: Record<string, unknown> = {};\n const eventName = transition.getEventName();\n if (eventName && state.hasEvent(eventName)) {\n Object.assign(metadata, state.getEvent(eventName).getMetadata());\n }\n this.edges.push({\n source: sourceNode.id,\n target: targetNode.id,\n label,\n metadata,\n });\n }\n }\n\n addStates(states: Iterable<StateInterface>): void {\n for (const state of states) {\n this.addState(state);\n }\n }\n\n addStateCollection(stateCollection: StateCollectionInterface): void {\n this.addStates(stateCollection.getStates());\n }\n\n getGraph(): Graph {\n return {\n nodes: Array.from(this.nodes.values()),\n edges: [...this.edges],\n };\n }\n\n toDot(options?: DotOptions): string {\n const graph = this.getGraph();\n const rankdir = options?.rankdir ?? \"LR\";\n const lines: string[] = [];\n lines.push(\"digraph {\");\n lines.push(` rankdir=${rankdir};`);\n for (const node of graph.nodes) {\n const label = escapeDoubleQuotes(node.label);\n lines.push(` \"${label}\" [label=\"${label}\"];`);\n }\n for (const edge of graph.edges) {\n const source = escapeDoubleQuotes(edge.source);\n const target = escapeDoubleQuotes(edge.target);\n const label = escapeDoubleQuotes(edge.label);\n lines.push(` \"${source}\" -> \"${target}\" [label=\"${label}\"];`);\n }\n lines.push(\"}\");\n return lines.join(\"\\n\");\n }\n\n toMermaid(options?: MermaidOptions): string {\n const graph = this.getGraph();\n const direction = options?.direction ?? \"LR\";\n const lines: string[] = [];\n lines.push(`stateDiagram-v2`);\n lines.push(` direction ${direction}`);\n const declared = new Set<string>();\n for (const node of graph.nodes) {\n const id = toMermaidId(node.id);\n if (!declared.has(id)) {\n declared.add(id);\n const label = escapeMermaidLabel(node.label);\n lines.push(` ${id} : \"${label}\"`);\n }\n }\n for (const edge of graph.edges) {\n const source = toMermaidId(edge.source);\n const target = toMermaidId(edge.target);\n const label = escapeMermaidLabel(edge.label.replace(/\\n/g, \" / \"));\n lines.push(` ${source} --> ${target} : ${label}`);\n }\n return lines.join(\"\\n\");\n }\n}\n"],"mappings":"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","names":["isStatemachine","isStatemachine","isStateful","isNamed","convertToString"]}
package/package.json CHANGED
@@ -1,22 +1,36 @@
1
1
  {
2
2
  "name": "@camcima/finita",
3
- "version": "1.0.0",
3
+ "version": "2.1.0",
4
4
  "description": "A full-featured finite state machine library for TypeScript",
5
5
  "type": "module",
6
- "main": "dist/index.js",
6
+ "main": "dist/index.cjs",
7
+ "module": "dist/index.js",
7
8
  "types": "dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "import": {
12
+ "types": "./dist/index.d.ts",
13
+ "default": "./dist/index.js"
14
+ },
15
+ "require": {
16
+ "types": "./dist/index.d.cts",
17
+ "default": "./dist/index.cjs"
18
+ }
19
+ }
20
+ },
8
21
  "files": [
9
22
  "dist"
10
23
  ],
11
24
  "scripts": {
12
- "build": "tsc",
25
+ "build": "tsup",
13
26
  "test": "vitest run",
14
27
  "test:coverage": "vitest run --coverage --reporter=default --reporter=junit --outputFile=test-report.junit.xml",
15
28
  "test:watch": "vitest",
16
- "lint": "tsc --noEmit && eslint src/ tests/",
29
+ "lint": "tsc --noEmit && tsc --project tsconfig.test.json && eslint src/ tests/",
17
30
  "format": "prettier --write .",
18
31
  "format:check": "prettier --check .",
19
- "release": "release-it"
32
+ "release": "release-it",
33
+ "prepare": "lefthook install"
20
34
  },
21
35
  "keywords": [
22
36
  "statemachine",
@@ -40,11 +54,14 @@
40
54
  "license": "MIT",
41
55
  "devDependencies": {
42
56
  "@eslint/js": "^10.0.1",
57
+ "@types/node": "^25.5.2",
43
58
  "@vitest/coverage-v8": "^3.2.4",
44
59
  "eslint": "^10.1.0",
45
60
  "eslint-config-prettier": "^10.1.8",
61
+ "lefthook": "^2.1.4",
46
62
  "prettier": "^3.8.1",
47
63
  "release-it": "^19.2.4",
64
+ "tsup": "^8.5.1",
48
65
  "typescript": "^5.7.0",
49
66
  "typescript-eslint": "^8.57.2",
50
67
  "vitest": "^3.0.0"
@@ -1,11 +0,0 @@
1
- import type { DispatcherInterface, CallbackInterface } from "./interfaces/DispatcherInterface.js";
2
- import type { EventInterface } from "./interfaces/EventInterface.js";
3
- export declare class Dispatcher implements DispatcherInterface {
4
- private commands;
5
- private onReadyCallbacks;
6
- private ready;
7
- dispatch(event: EventInterface, args?: unknown[], onReadyCallback?: CallbackInterface): void;
8
- invoke(): Promise<void>;
9
- isReady(): boolean;
10
- }
11
- //# sourceMappingURL=Dispatcher.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Dispatcher.d.ts","sourceRoot":"","sources":["../src/Dispatcher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,mBAAmB,EACnB,iBAAiB,EAClB,MAAM,qCAAqC,CAAC;AAC7C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAErE,qBAAa,UAAW,YAAW,mBAAmB;IACpD,OAAO,CAAC,QAAQ,CAAyD;IACzE,OAAO,CAAC,gBAAgB,CAA2B;IACnD,OAAO,CAAC,KAAK,CAAS;IAEtB,QAAQ,CACN,KAAK,EAAE,cAAc,EACrB,IAAI,GAAE,OAAO,EAAO,EACpB,eAAe,CAAC,EAAE,iBAAiB,GAClC,IAAI;IAUD,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAa7B,OAAO,IAAI,OAAO;CAGnB"}
@@ -1,30 +0,0 @@
1
- export class Dispatcher {
2
- commands = [];
3
- onReadyCallbacks = [];
4
- ready = false;
5
- dispatch(event, args = [], onReadyCallback) {
6
- if (this.ready) {
7
- throw new Error("Was already invoked!");
8
- }
9
- this.commands.push({ event, args });
10
- if (onReadyCallback) {
11
- this.onReadyCallbacks.push(onReadyCallback);
12
- }
13
- }
14
- async invoke() {
15
- if (this.ready) {
16
- throw new Error("Was already invoked!");
17
- }
18
- for (const { event, args } of this.commands) {
19
- await event.invoke(...args);
20
- }
21
- this.ready = true;
22
- for (const callback of this.onReadyCallbacks) {
23
- await callback.invoke();
24
- }
25
- }
26
- isReady() {
27
- return this.ready;
28
- }
29
- }
30
- //# sourceMappingURL=Dispatcher.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Dispatcher.js","sourceRoot":"","sources":["../src/Dispatcher.ts"],"names":[],"mappings":"AAMA,MAAM,OAAO,UAAU;IACb,QAAQ,GAAsD,EAAE,CAAC;IACjE,gBAAgB,GAAwB,EAAE,CAAC;IAC3C,KAAK,GAAG,KAAK,CAAC;IAEtB,QAAQ,CACN,KAAqB,EACrB,OAAkB,EAAE,EACpB,eAAmC;QAEnC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;QAC1C,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACpC,IAAI,eAAe,EAAE,CAAC;YACpB,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;IAED,KAAK,CAAC,MAAM;QACV,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;QAC1C,CAAC;QACD,KAAK,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC5C,MAAM,KAAK,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC;QAC9B,CAAC;QACD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC7C,MAAM,QAAQ,CAAC,MAAM,EAAE,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,OAAO;QACL,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;CACF"}
package/dist/Event.d.ts DELETED
@@ -1,22 +0,0 @@
1
- import type { EventInterface } from "./interfaces/EventInterface.js";
2
- import type { Observer } from "./interfaces/Observer.js";
3
- export declare class Event implements EventInterface {
4
- private readonly name;
5
- private readonly observers;
6
- private readonly metadata;
7
- private invokeArgs;
8
- constructor(name: string);
9
- getName(): string;
10
- getInvokeArgs(): unknown[];
11
- invoke(...args: unknown[]): Promise<void>;
12
- attach(observer: Observer): void;
13
- detach(observer: Observer): void;
14
- notify(): Promise<void>;
15
- getObservers(): Iterable<Observer>;
16
- getMetadata(): Record<string, unknown>;
17
- getMetadataValue(key: string): unknown;
18
- setMetadataValue(key: string, value: unknown): void;
19
- hasMetadataValue(key: string): boolean;
20
- deleteMetadataValue(key: string): void;
21
- }
22
- //# sourceMappingURL=Event.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Event.d.ts","sourceRoot":"","sources":["../src/Event.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAEzD,qBAAa,KAAM,YAAW,cAAc;IAC1C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA4B;IACtD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmC;IAC5D,OAAO,CAAC,UAAU,CAAiB;gBAEvB,IAAI,EAAE,MAAM;IAIxB,OAAO,IAAI,MAAM;IAIjB,aAAa,IAAI,OAAO,EAAE;IAIpB,MAAM,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAS/C,MAAM,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI;IAIhC,MAAM,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI;IAI1B,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAM7B,YAAY,IAAI,QAAQ,CAAC,QAAQ,CAAC;IAIlC,WAAW,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAItC,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAItC,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI;IAInD,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAItC,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;CAGvC"}
package/dist/Event.js DELETED
@@ -1,54 +0,0 @@
1
- export class Event {
2
- name;
3
- observers = new Set();
4
- metadata = new Map();
5
- invokeArgs = [];
6
- constructor(name) {
7
- this.name = name;
8
- }
9
- getName() {
10
- return this.name;
11
- }
12
- getInvokeArgs() {
13
- return this.invokeArgs;
14
- }
15
- async invoke(...args) {
16
- this.invokeArgs = args;
17
- try {
18
- await this.notify();
19
- }
20
- finally {
21
- this.invokeArgs = [];
22
- }
23
- }
24
- attach(observer) {
25
- this.observers.add(observer);
26
- }
27
- detach(observer) {
28
- this.observers.delete(observer);
29
- }
30
- async notify() {
31
- for (const observer of this.observers) {
32
- await observer.update(this);
33
- }
34
- }
35
- getObservers() {
36
- return this.observers;
37
- }
38
- getMetadata() {
39
- return Object.fromEntries(this.metadata);
40
- }
41
- getMetadataValue(key) {
42
- return this.metadata.get(key);
43
- }
44
- setMetadataValue(key, value) {
45
- this.metadata.set(key, value);
46
- }
47
- hasMetadataValue(key) {
48
- return this.metadata.has(key);
49
- }
50
- deleteMetadataValue(key) {
51
- this.metadata.delete(key);
52
- }
53
- }
54
- //# sourceMappingURL=Event.js.map
package/dist/Event.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"Event.js","sourceRoot":"","sources":["../src/Event.ts"],"names":[],"mappings":"AAGA,MAAM,OAAO,KAAK;IACC,IAAI,CAAS;IACb,SAAS,GAAkB,IAAI,GAAG,EAAE,CAAC;IACrC,QAAQ,GAAyB,IAAI,GAAG,EAAE,CAAC;IACpD,UAAU,GAAc,EAAE,CAAC;IAEnC,YAAY,IAAY;QACtB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAED,OAAO;QACL,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAED,aAAa;QACX,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAG,IAAe;QAC7B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;QACtB,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;QACvB,CAAC;IACH,CAAC;IAED,MAAM,CAAC,QAAkB;QACvB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC/B,CAAC;IAED,MAAM,CAAC,QAAkB;QACvB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAClC,CAAC;IAED,KAAK,CAAC,MAAM;QACV,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACtC,MAAM,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;IAED,YAAY;QACV,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED,WAAW;QACT,OAAO,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC3C,CAAC;IAED,gBAAgB,CAAC,GAAW;QAC1B,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAChC,CAAC;IAED,gBAAgB,CAAC,GAAW,EAAE,KAAc;QAC1C,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAChC,CAAC;IAED,gBAAgB,CAAC,GAAW;QAC1B,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAChC,CAAC;IAED,mBAAmB,CAAC,GAAW;QAC7B,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC5B,CAAC;CACF"}
@@ -1,2 +0,0 @@
1
- export type MaybePromise<T> = T | Promise<T>;
2
- //# sourceMappingURL=MaybePromise.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"MaybePromise.d.ts","sourceRoot":"","sources":["../src/MaybePromise.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=MaybePromise.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"MaybePromise.js","sourceRoot":"","sources":["../src/MaybePromise.ts"],"names":[],"mappings":""}
package/dist/Process.d.ts DELETED
@@ -1,15 +0,0 @@
1
- import type { ProcessInterface } from "./interfaces/ProcessInterface.js";
2
- import type { StateInterface } from "./interfaces/StateInterface.js";
3
- export declare class Process implements ProcessInterface {
4
- private readonly name;
5
- private readonly initialState;
6
- private readonly states;
7
- constructor(name: string, initialState: StateInterface);
8
- private registerState;
9
- getName(): string;
10
- getInitialState(): StateInterface;
11
- getStates(): Iterable<StateInterface>;
12
- getState(name: string): StateInterface;
13
- hasState(name: string): boolean;
14
- }
15
- //# sourceMappingURL=Process.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Process.d.ts","sourceRoot":"","sources":["../src/Process.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACzE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAKrE,qBAAa,OAAQ,YAAW,gBAAgB;IAC9C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAiB;IAC9C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;gBAE7B,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,cAAc;IAOtD,OAAO,CAAC,aAAa;IAerB,OAAO,IAAI,MAAM;IAIjB,eAAe,IAAI,cAAc;IAIjC,SAAS,IAAI,QAAQ,CAAC,cAAc,CAAC;IAIrC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc;IAItC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;CAGhC"}
package/dist/Process.js DELETED
@@ -1,43 +0,0 @@
1
- import { StateCollection } from "./StateCollection.js";
2
- import { DuplicateStateError } from "./error/DuplicateStateError.js";
3
- export class Process {
4
- name;
5
- initialState;
6
- states;
7
- constructor(name, initialState) {
8
- this.name = name;
9
- this.initialState = initialState;
10
- this.states = new StateCollection();
11
- this.registerState(initialState);
12
- }
13
- registerState(state) {
14
- const name = state.getName();
15
- if (this.states.hasState(name)) {
16
- if (this.states.getState(name) !== state) {
17
- throw new DuplicateStateError(name);
18
- }
19
- return;
20
- }
21
- this.states.addState(state);
22
- for (const transition of state.getTransitions()) {
23
- const targetState = transition.getTargetState();
24
- this.registerState(targetState);
25
- }
26
- }
27
- getName() {
28
- return this.name;
29
- }
30
- getInitialState() {
31
- return this.initialState;
32
- }
33
- getStates() {
34
- return this.states.getStates();
35
- }
36
- getState(name) {
37
- return this.states.getState(name);
38
- }
39
- hasState(name) {
40
- return this.states.hasState(name);
41
- }
42
- }
43
- //# sourceMappingURL=Process.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Process.js","sourceRoot":"","sources":["../src/Process.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAErE,MAAM,OAAO,OAAO;IACD,IAAI,CAAS;IACb,YAAY,CAAiB;IAC7B,MAAM,CAAkB;IAEzC,YAAY,IAAY,EAAE,YAA4B;QACpD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;QACjC,IAAI,CAAC,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;QACpC,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC;IACnC,CAAC;IAEO,aAAa,CAAC,KAAqB;QACzC,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC;QAC7B,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/B,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,KAAK,EAAE,CAAC;gBACzC,MAAM,IAAI,mBAAmB,CAAC,IAAI,CAAC,CAAC;YACtC,CAAC;YACD,OAAO;QACT,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC5B,KAAK,MAAM,UAAU,IAAI,KAAK,CAAC,cAAc,EAAE,EAAE,CAAC;YAChD,MAAM,WAAW,GAAI,UAAkC,CAAC,cAAc,EAAE,CAAC;YACzE,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IAED,OAAO;QACL,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAED,eAAe;QACb,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAED,SAAS;QACP,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;IACjC,CAAC;IAED,QAAQ,CAAC,IAAY;QACnB,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC;IAED,QAAQ,CAAC,IAAY;QACnB,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC;CACF"}
package/dist/State.d.ts DELETED
@@ -1,22 +0,0 @@
1
- import type { StateInterface } from "./interfaces/StateInterface.js";
2
- import type { TransitionInterface } from "./interfaces/TransitionInterface.js";
3
- import type { EventInterface } from "./interfaces/EventInterface.js";
4
- export declare class State implements StateInterface {
5
- private readonly name;
6
- private readonly transitions;
7
- private readonly events;
8
- private readonly metadata;
9
- constructor(name: string);
10
- getName(): string;
11
- getTransitions(): Iterable<TransitionInterface>;
12
- addTransition(transition: TransitionInterface): void;
13
- getEventNames(): string[];
14
- hasEvent(name: string): boolean;
15
- getEvent(name: string): EventInterface;
16
- getMetadata(): Record<string, unknown>;
17
- getMetadataValue(key: string): unknown;
18
- setMetadataValue(key: string, value: unknown): void;
19
- hasMetadataValue(key: string): boolean;
20
- deleteMetadataValue(key: string): void;
21
- }
22
- //# sourceMappingURL=State.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"State.d.ts","sourceRoot":"","sources":["../src/State.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAC/E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAGrE,qBAAa,KAAM,YAAW,cAAc;IAC1C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAuC;IACnE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA0C;IACjE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmC;gBAEhD,IAAI,EAAE,MAAM;IAIxB,OAAO,IAAI,MAAM;IAIjB,cAAc,IAAI,QAAQ,CAAC,mBAAmB,CAAC;IAI/C,aAAa,CAAC,UAAU,EAAE,mBAAmB,GAAG,IAAI;IAsBpD,aAAa,IAAI,MAAM,EAAE;IAIzB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI/B,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc;IAStC,WAAW,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAItC,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAItC,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI;IAInD,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAItC,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;CAGvC"}
package/dist/State.js DELETED
@@ -1,65 +0,0 @@
1
- import { Event } from "./Event.js";
2
- export class State {
3
- name;
4
- transitions = new Set();
5
- events = new Map();
6
- metadata = new Map();
7
- constructor(name) {
8
- this.name = name;
9
- }
10
- getName() {
11
- return this.name;
12
- }
13
- getTransitions() {
14
- return this.transitions;
15
- }
16
- addTransition(transition) {
17
- if (this.transitions.has(transition)) {
18
- return;
19
- }
20
- const targetName = transition.getTargetState().getName();
21
- const eventName = transition.getEventName();
22
- const conditionName = transition.getConditionName();
23
- for (const existing of this.transitions) {
24
- if (existing.getTargetState().getName() === targetName &&
25
- existing.getEventName() === eventName &&
26
- existing.getConditionName() === conditionName) {
27
- return;
28
- }
29
- }
30
- this.transitions.add(transition);
31
- if (eventName) {
32
- this.getEvent(eventName);
33
- }
34
- }
35
- getEventNames() {
36
- return Array.from(this.events.keys());
37
- }
38
- hasEvent(name) {
39
- return this.events.has(name);
40
- }
41
- getEvent(name) {
42
- let event = this.events.get(name);
43
- if (!event) {
44
- event = new Event(name);
45
- this.events.set(name, event);
46
- }
47
- return event;
48
- }
49
- getMetadata() {
50
- return Object.fromEntries(this.metadata);
51
- }
52
- getMetadataValue(key) {
53
- return this.metadata.get(key);
54
- }
55
- setMetadataValue(key, value) {
56
- this.metadata.set(key, value);
57
- }
58
- hasMetadataValue(key) {
59
- return this.metadata.has(key);
60
- }
61
- deleteMetadataValue(key) {
62
- this.metadata.delete(key);
63
- }
64
- }
65
- //# sourceMappingURL=State.js.map
package/dist/State.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"State.js","sourceRoot":"","sources":["../src/State.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,MAAM,OAAO,KAAK;IACC,IAAI,CAAS;IACb,WAAW,GAA6B,IAAI,GAAG,EAAE,CAAC;IAClD,MAAM,GAAgC,IAAI,GAAG,EAAE,CAAC;IAChD,QAAQ,GAAyB,IAAI,GAAG,EAAE,CAAC;IAE5D,YAAY,IAAY;QACtB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAED,OAAO;QACL,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAED,cAAc;QACZ,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED,aAAa,CAAC,UAA+B;QAC3C,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;YACrC,OAAO;QACT,CAAC;QACD,MAAM,UAAU,GAAG,UAAU,CAAC,cAAc,EAAE,CAAC,OAAO,EAAE,CAAC;QACzD,MAAM,SAAS,GAAG,UAAU,CAAC,YAAY,EAAE,CAAC;QAC5C,MAAM,aAAa,GAAG,UAAU,CAAC,gBAAgB,EAAE,CAAC;QACpD,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACxC,IACE,QAAQ,CAAC,cAAc,EAAE,CAAC,OAAO,EAAE,KAAK,UAAU;gBAClD,QAAQ,CAAC,YAAY,EAAE,KAAK,SAAS;gBACrC,QAAQ,CAAC,gBAAgB,EAAE,KAAK,aAAa,EAC7C,CAAC;gBACD,OAAO;YACT,CAAC;QACH,CAAC;QACD,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACjC,IAAI,SAAS,EAAE,CAAC;YACd,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,aAAa;QACX,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IACxC,CAAC;IAED,QAAQ,CAAC,IAAY;QACnB,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;IAED,QAAQ,CAAC,IAAY;QACnB,IAAI,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,KAAK,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC;YACxB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAC/B,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,WAAW;QACT,OAAO,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC3C,CAAC;IAED,gBAAgB,CAAC,GAAW;QAC1B,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAChC,CAAC;IAED,gBAAgB,CAAC,GAAW,EAAE,KAAc;QAC1C,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAChC,CAAC;IAED,gBAAgB,CAAC,GAAW;QAC1B,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAChC,CAAC;IAED,mBAAmB,CAAC,GAAW;QAC7B,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC5B,CAAC;CACF"}
@@ -1,14 +0,0 @@
1
- import type { StateCollectionInterface } from "./interfaces/StateCollectionInterface.js";
2
- import type { StateInterface } from "./interfaces/StateInterface.js";
3
- import { StateCollectionMerger } from "./util/StateCollectionMerger.js";
4
- export declare class StateCollection implements StateCollectionInterface {
5
- private readonly states;
6
- private stateCollectionMerger;
7
- getState(name: string): StateInterface;
8
- getStates(): Iterable<StateInterface>;
9
- hasState(name: string): boolean;
10
- addState(state: StateInterface): void;
11
- getStateCollectionMerger(): StateCollectionMerger;
12
- merge(source: StateCollectionInterface): void;
13
- }
14
- //# sourceMappingURL=StateCollection.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"StateCollection.d.ts","sourceRoot":"","sources":["../src/StateCollection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,0CAA0C,CAAC;AACzF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AAGxE,qBAAa,eAAgB,YAAW,wBAAwB;IAC9D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA0C;IACjE,OAAO,CAAC,qBAAqB,CAAsC;IAEnE,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc;IAQtC,SAAS,IAAI,QAAQ,CAAC,cAAc,CAAC;IAIrC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI/B,QAAQ,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI;IAQrC,wBAAwB,IAAI,qBAAqB;IAOjD,KAAK,CAAC,MAAM,EAAE,wBAAwB,GAAG,IAAI;CAI9C"}